fix: compact filter popover; feat: i18n (de/en)
Build & Push Docker Image / build (push) Successful in 2m31s

This commit is contained in:
opencode
2026-08-02 13:42:53 +02:00
parent 95bf49509c
commit 2f38889726
19 changed files with 662 additions and 160 deletions
+19 -17
View File
@@ -11,8 +11,10 @@ import { ToolCard } from "@/components/tool-card";
import { Star, Wrench, MessageSquare, ArrowRight } from "lucide-react";
import { Link } from "wouter";
import { Button } from "@/components/ui/button";
import { useTranslation } from "react-i18next";
export default function Home() {
const { t } = useTranslation();
const { data: summary, isLoading: loadingSummary } = useGetAnalyticsSummary();
const { data: topTools, isLoading: loadingTopTools } = useGetTopTools({ limit: 4, metric: GetTopToolsMetric.combined });
const { data: recentTools, isLoading: loadingRecent } = useListTools({ sort: "newest" });
@@ -21,8 +23,8 @@ export default function Home() {
<Layout>
<div className="space-y-8 pb-8">
<div>
<h1 className="text-3xl font-bold tracking-tight mb-2">Welcome to toolr</h1>
<p className="text-muted-foreground">The community hub where engineers honestly rate the tools they use daily.</p>
<h1 className="text-3xl font-bold tracking-tight mb-2">{t("home.welcome")}</h1>
<p className="text-muted-foreground">{t("home.tagline")}</p>
</div>
{/* Stats Banner */}
@@ -33,7 +35,7 @@ export default function Home() {
<Wrench className="w-6 h-6" />
</div>
<div>
<p className="text-sm font-medium text-muted-foreground mb-1">Total Tools</p>
<p className="text-sm font-medium text-muted-foreground mb-1">{t("home.totalTools")}</p>
{loadingSummary ? (
<Skeleton className="h-8 w-16" />
) : (
@@ -49,7 +51,7 @@ export default function Home() {
<MessageSquare className="w-6 h-6" />
</div>
<div>
<p className="text-sm font-medium text-muted-foreground mb-1">Total Ratings</p>
<p className="text-sm font-medium text-muted-foreground mb-1">{t("home.totalRatings")}</p>
{loadingSummary ? (
<Skeleton className="h-8 w-16" />
) : (
@@ -65,7 +67,7 @@ export default function Home() {
<Star className="w-6 h-6" />
</div>
<div>
<p className="text-sm font-medium text-muted-foreground mb-1">Avg Rating</p>
<p className="text-sm font-medium text-muted-foreground mb-1">{t("home.avgRating")}</p>
{loadingSummary ? (
<Skeleton className="h-8 w-16" />
) : (
@@ -80,12 +82,12 @@ export default function Home() {
<section>
<div className="flex justify-between items-end mb-4">
<div>
<h2 className="text-2xl font-bold tracking-tight mb-1">Top Rated Tools</h2>
<p className="text-muted-foreground text-sm">Highest combined usefulness and usability.</p>
<h2 className="text-2xl font-bold tracking-tight mb-1">{t("home.topRated")}</h2>
<p className="text-muted-foreground text-sm">{t("home.topRatedSub")}</p>
</div>
<Button variant="ghost" className="text-primary hidden sm:flex" asChild>
<Link href="/tools?sort=top_rated">
View all <ArrowRight className="w-4 h-4 ml-2" />
{t("common.viewAll")} <ArrowRight className="w-4 h-4 ml-2" />
</Link>
</Button>
</div>
@@ -106,10 +108,10 @@ export default function Home() {
<Card className="bg-muted/30 border-dashed">
<CardContent className="flex flex-col items-center justify-center p-12 text-center">
<Star className="w-12 h-12 text-muted-foreground/30 mb-4" />
<h3 className="text-lg font-medium">No ratings yet</h3>
<p className="text-muted-foreground max-w-sm mt-1 mb-4">Be the first to rate a tool and help the community.</p>
<h3 className="text-lg font-medium">{t("home.noRatingsYet")}</h3>
<p className="text-muted-foreground max-w-sm mt-1 mb-4">{t("home.noRatingsSub")}</p>
<Button asChild>
<Link href="/tools">Browse Tools</Link>
<Link href="/tools">{t("common.browseTools")}</Link>
</Button>
</CardContent>
</Card>
@@ -120,12 +122,12 @@ export default function Home() {
<section>
<div className="flex justify-between items-end mb-4">
<div>
<h2 className="text-2xl font-bold tracking-tight mb-1">Recently Added</h2>
<p className="text-muted-foreground text-sm">The latest additions to the catalog.</p>
<h2 className="text-2xl font-bold tracking-tight mb-1">{t("home.recentlyAdded")}</h2>
<p className="text-muted-foreground text-sm">{t("home.recentlyAddedSub")}</p>
</div>
<Button variant="ghost" className="text-primary hidden sm:flex" asChild>
<Link href="/tools?sort=newest">
View all <ArrowRight className="w-4 h-4 ml-2" />
{t("common.viewAll")} <ArrowRight className="w-4 h-4 ml-2" />
</Link>
</Button>
</div>
@@ -146,10 +148,10 @@ export default function Home() {
<Card className="bg-muted/30 border-dashed">
<CardContent className="flex flex-col items-center justify-center p-12 text-center">
<Wrench className="w-12 h-12 text-muted-foreground/30 mb-4" />
<h3 className="text-lg font-medium">No tools found</h3>
<p className="text-muted-foreground max-w-sm mt-1 mb-4">There are no tools in the database yet.</p>
<h3 className="text-lg font-medium">{t("home.noTools")}</h3>
<p className="text-muted-foreground max-w-sm mt-1 mb-4">{t("home.noToolsSub")}</p>
<Button asChild>
<Link href="/tools/new">Add a Tool</Link>
<Link href="/tools/new">{t("browse.addTool")}</Link>
</Button>
</CardContent>
</Card>