Files
chinese-family-tree-2/app/page.tsx
T
freedakgmail 33cf0c50d1 0.0.0.2
2025-11-22 20:08:07 +08:00

183 lines
9.0 KiB
TypeScript

import type React from "react"
import { Button } from "@/components/ui/button"
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
import { SiteHeader } from "@/components/site-header"
import { ScrollArea } from "@/components/ui/scroll-area"
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"
import { UserPlus, Network, Map, Calendar, Users, ArrowRight, Clock, Search, BookOpen } from "lucide-react"
export default function DashboardPage() {
return (
<div className="flex min-h-screen flex-col bg-background font-sans">
<SiteHeader />
<main className="flex-1 container mx-auto py-8 px-4 md:px-6">
<div className="flex flex-col md:flex-row items-start md:items-center justify-between gap-4 mb-8">
<div>
<h1 className="text-3xl font-serif font-bold text-foreground"></h1>
<p className="text-muted-foreground mt-1">西 · 24 </p>
</div>
<div className="flex gap-2">
<Button variant="outline" className="gap-2 bg-transparent">
<Network className="h-4 w-4" />
</Button>
<Button className="gap-2 bg-primary text-primary-foreground hover:bg-primary/90">
<UserPlus className="h-4 w-4" />
</Button>
</div>
</div>
<div className="grid grid-cols-1 md:grid-cols-3 gap-6 mb-8">
<StatCard title="家族成员" value="1,248" subtitle="较上月新增 12 人" icon={<Users className="h-4 w-4" />} />
<StatCard title="记录年代" value="642 年" subtitle="始于 明朝洪武年间" icon={<Clock className="h-4 w-4" />} />
<StatCard title="繁衍代数" value="24 代" subtitle="平均代差 26.5 年" icon={<Network className="h-4 w-4" />} />
</div>
<Tabs defaultValue="recent" className="w-full">
<div className="flex items-center justify-between mb-4">
<TabsList className="bg-muted/50">
<TabsTrigger value="recent"></TabsTrigger>
<TabsTrigger value="anniversaries"></TabsTrigger>
<TabsTrigger value="migration"></TabsTrigger>
</TabsList>
<Button variant="ghost" size="sm" className="text-muted-foreground gap-1">
<ArrowRight className="h-3 w-3" />
</Button>
</div>
<TabsContent value="recent" className="mt-0">
<div className="grid grid-cols-1 lg:grid-cols-3 gap-6">
<Card className="lg:col-span-2 border-none shadow-sm bg-card/50 backdrop-blur">
<CardHeader>
<CardTitle className="font-serif"></CardTitle>
<CardDescription></CardDescription>
</CardHeader>
<CardContent>
<ScrollArea className="h-[400px] pr-4">
<div className="space-y-6">
{[1, 2, 3, 4, 5].map((i) => (
<div key={i} className="flex gap-4 group">
<div className="relative flex flex-col items-center">
<div className="h-full w-px bg-border group-last:hidden"></div>
<div className="absolute top-2 h-2 w-2 rounded-full bg-primary ring-4 ring-background"></div>
</div>
<div className="pb-2">
<div className="flex items-center gap-2 mb-1">
<span className="font-medium"></span>
<span className="text-xs px-2 py-0.5 rounded-full bg-secondary/20 text-secondary-foreground">
22
</span>
<span className="text-xs text-muted-foreground">2</span>
</div>
<p className="text-sm text-muted-foreground">
<span className="text-foreground font-medium"></span>{" "}
</p>
</div>
</div>
))}
</div>
</ScrollArea>
</CardContent>
</Card>
<div className="space-y-6">
<Card className="border-none shadow-sm bg-primary/5">
<CardHeader>
<CardTitle className="flex items-center gap-2 text-primary font-serif">
<Calendar className="h-5 w-5" />
/
</CardTitle>
</CardHeader>
<CardContent className="grid gap-4">
<div className="flex items-center gap-4 p-3 rounded-lg bg-background/60 border border-border/50">
<div className="flex flex-col items-center justify-center w-12 h-12 rounded bg-primary/10 text-primary font-serif">
<span className="text-xs"></span>
<span className="font-bold text-lg"></span>
</div>
<div>
<p className="font-medium"> </p>
<p className="text-sm text-muted-foreground"> 18 · 120 </p>
</div>
</div>
<div className="flex items-center gap-4 p-3 rounded-lg bg-background/60 border border-border/50">
<div className="flex flex-col items-center justify-center w-12 h-12 rounded bg-primary/10 text-primary font-serif">
<span className="text-xs"></span>
<span className="font-bold text-lg">廿</span>
</div>
<div>
<p className="font-medium"></p>
<p className="text-sm text-muted-foreground"> · 西</p>
</div>
</div>
</CardContent>
</Card>
<Card className="border-none shadow-sm">
<CardHeader>
<CardTitle className="font-serif"></CardTitle>
</CardHeader>
<CardContent className="grid grid-cols-2 gap-3">
<Button
variant="outline"
className="h-auto py-4 flex flex-col gap-2 hover:border-primary hover:text-primary bg-transparent"
>
<Map className="h-5 w-5" />
<span className="text-xs"></span>
</Button>
<Button
variant="outline"
className="h-auto py-4 flex flex-col gap-2 hover:border-primary hover:text-primary bg-transparent"
>
<BookOpen className="h-5 w-5" />
<span className="text-xs"></span>
</Button>
<Button
variant="outline"
className="h-auto py-4 flex flex-col gap-2 hover:border-primary hover:text-primary bg-transparent"
>
<Search className="h-5 w-5" />
<span className="text-xs"></span>
</Button>
<Button
variant="outline"
className="h-auto py-4 flex flex-col gap-2 hover:border-primary hover:text-primary bg-transparent"
>
<Users className="h-5 w-5" />
<span className="text-xs"></span>
</Button>
</CardContent>
</Card>
</div>
</div>
</TabsContent>
</Tabs>
</main>
</div>
)
}
function StatCard({
title,
value,
subtitle,
icon,
}: { title: string; value: string; subtitle: string; icon: React.ReactNode }) {
return (
<Card className="border-none shadow-sm bg-card/50 backdrop-blur transition-all hover:bg-card hover:shadow-md">
<CardContent className="p-6">
<div className="flex items-center justify-between space-y-0 pb-2">
<p className="text-sm font-medium text-muted-foreground">{title}</p>
<div className="text-muted-foreground bg-muted p-2 rounded-full">{icon}</div>
</div>
<div className="flex flex-col mt-2">
<span className="text-3xl font-serif font-bold text-foreground">{value}</span>
<p className="text-xs text-muted-foreground mt-1">{subtitle}</p>
</div>
</CardContent>
</Card>
)
}