| | "use client"; |
| |
|
| | import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@hanzo/ui/primitives/card"; |
| | import { Button } from "@hanzo/ui/primitives/button"; |
| | import { Badge } from "@hanzo/ui/primitives/badge"; |
| | import { Tabs, TabsContent, TabsList, TabsTrigger } from "@hanzo/ui/primitives/tabs"; |
| | import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@hanzo/ui/primitives/select"; |
| | import { Progress } from "@hanzo/ui/primitives/progress"; |
| | import { |
| | TrendingUp, |
| | TrendingDown, |
| | Users, |
| | DollarSign, |
| | Activity, |
| | CreditCard, |
| | Download, |
| | Calendar |
| | } from "lucide-react"; |
| |
|
| | |
| | const metrics = [ |
| | { |
| | title: "Total Revenue", |
| | value: "$45,231.89", |
| | change: "+20.1%", |
| | trend: "up", |
| | icon: <DollarSign className="w-4 h-4" /> |
| | }, |
| | { |
| | title: "Active Users", |
| | value: "2,350", |
| | change: "+15.3%", |
| | trend: "up", |
| | icon: <Users className="w-4 h-4" /> |
| | }, |
| | { |
| | title: "Sales", |
| | value: "12,234", |
| | change: "+19%", |
| | trend: "up", |
| | icon: <CreditCard className="w-4 h-4" /> |
| | }, |
| | { |
| | title: "Active Now", |
| | value: "573", |
| | change: "-2.4%", |
| | trend: "down", |
| | icon: <Activity className="w-4 h-4" /> |
| | } |
| | ]; |
| |
|
| | |
| | const recentSales = [ |
| | { name: "Olivia Martin", email: "olivia@example.com", amount: "$1,999.00" }, |
| | { name: "Jackson Lee", email: "jackson@example.com", amount: "$39.00" }, |
| | { name: "Isabella Nguyen", email: "isabella@example.com", amount: "$299.00" }, |
| | { name: "William Kim", email: "will@example.com", amount: "$99.00" }, |
| | { name: "Sofia Davis", email: "sofia@example.com", amount: "$39.00" } |
| | ]; |
| |
|
| | export default function AnalyticsDashboard() { |
| | return ( |
| | <div className="min-h-screen bg-background p-6"> |
| | <div className="max-w-7xl mx-auto space-y-6"> |
| | {/* Header */} |
| | <div className="flex items-center justify-between"> |
| | <div> |
| | <h1 className="text-3xl font-bold">Analytics Dashboard</h1> |
| | <p className="text-muted-foreground">Built with @hanzo/ui components</p> |
| | </div> |
| | <div className="flex items-center gap-2"> |
| | <Select defaultValue="7d"> |
| | <SelectTrigger className="w-[180px]"> |
| | <SelectValue /> |
| | </SelectTrigger> |
| | <SelectContent> |
| | <SelectItem value="24h">Last 24 hours</SelectItem> |
| | <SelectItem value="7d">Last 7 days</SelectItem> |
| | <SelectItem value="30d">Last 30 days</SelectItem> |
| | <SelectItem value="90d">Last 90 days</SelectItem> |
| | </SelectContent> |
| | </Select> |
| | <Button variant="outline" className="gap-2"> |
| | <Calendar className="w-4 h-4" /> |
| | Pick Date |
| | </Button> |
| | <Button className="gap-2"> |
| | <Download className="w-4 h-4" /> |
| | Export |
| | </Button> |
| | </div> |
| | </div> |
| | |
| | {/* Metric Cards */} |
| | <div className="grid gap-4 md:grid-cols-2 lg:grid-cols-4"> |
| | {metrics.map((metric) => ( |
| | <Card key={metric.title}> |
| | <CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2"> |
| | <CardTitle className="text-sm font-medium"> |
| | {metric.title} |
| | </CardTitle> |
| | <div className="w-8 h-8 rounded-full bg-indigo-500/10 flex items-center justify-center text-indigo-500"> |
| | {metric.icon} |
| | </div> |
| | </CardHeader> |
| | <CardContent> |
| | <div className="text-2xl font-bold">{metric.value}</div> |
| | <div className="flex items-center gap-1 text-xs"> |
| | {metric.trend === "up" ? ( |
| | <TrendingUp className="w-3 h-3 text-green-600" /> |
| | ) : ( |
| | <TrendingDown className="w-3 h-3 text-red-600" /> |
| | )} |
| | <span className={metric.trend === "up" ? "text-green-600" : "text-red-600"}> |
| | {metric.change} |
| | </span> |
| | <span className="text-muted-foreground">from last month</span> |
| | </div> |
| | </CardContent> |
| | </Card> |
| | ))} |
| | </div> |
| | |
| | {/* Main Content Tabs */} |
| | <Tabs defaultValue="overview" className="space-y-4"> |
| | <TabsList> |
| | <TabsTrigger value="overview">Overview</TabsTrigger> |
| | <TabsTrigger value="analytics">Analytics</TabsTrigger> |
| | <TabsTrigger value="reports">Reports</TabsTrigger> |
| | <TabsTrigger value="notifications">Notifications</TabsTrigger> |
| | </TabsList> |
| | |
| | <TabsContent value="overview" className="space-y-4"> |
| | <div className="grid gap-4 md:grid-cols-2 lg:grid-cols-7"> |
| | {/* Chart Card */} |
| | <Card className="col-span-4"> |
| | <CardHeader> |
| | <CardTitle>Revenue Overview</CardTitle> |
| | <CardDescription>Monthly revenue for the current year</CardDescription> |
| | </CardHeader> |
| | <CardContent> |
| | <div className="h-[300px] flex items-center justify-center bg-muted rounded"> |
| | <p className="text-muted-foreground">Chart Component (@hanzo/ui)</p> |
| | </div> |
| | </CardContent> |
| | </Card> |
| | |
| | {/* Recent Sales */} |
| | <Card className="col-span-3"> |
| | <CardHeader> |
| | <CardTitle>Recent Sales</CardTitle> |
| | <CardDescription>You made 265 sales this month.</CardDescription> |
| | </CardHeader> |
| | <CardContent> |
| | <div className="space-y-4"> |
| | {recentSales.map((sale, i) => ( |
| | <div key={i} className="flex items-center"> |
| | <div className="w-9 h-9 rounded-full bg-indigo-500/10 flex items-center justify-center text-sm font-medium text-indigo-600"> |
| | {sale.name.split(" ").map(n => n[0]).join("")} |
| | </div> |
| | <div className="ml-4 space-y-1 flex-1"> |
| | <p className="text-sm font-medium">{sale.name}</p> |
| | <p className="text-sm text-muted-foreground">{sale.email}</p> |
| | </div> |
| | <div className="font-medium">{sale.amount}</div> |
| | </div> |
| | ))} |
| | </div> |
| | </CardContent> |
| | </Card> |
| | </div> |
| | |
| | {/* Additional Stats */} |
| | <div className="grid gap-4 md:grid-cols-3"> |
| | <Card> |
| | <CardHeader> |
| | <CardTitle>Conversion Rate</CardTitle> |
| | <CardDescription>Visitor to customer conversion</CardDescription> |
| | </CardHeader> |
| | <CardContent> |
| | <div className="space-y-2"> |
| | <div className="flex items-center justify-between"> |
| | <span className="text-sm">Rate</span> |
| | <span className="text-sm font-medium">3.2%</span> |
| | </div> |
| | <Progress value={32} className="h-2 [&>div]:bg-indigo-500" /> |
| | <p className="text-xs text-muted-foreground"> |
| | +0.5% from last month |
| | </p> |
| | </div> |
| | </CardContent> |
| | </Card> |
| | |
| | <Card> |
| | <CardHeader> |
| | <CardTitle>Avg. Order Value</CardTitle> |
| | <CardDescription>Average purchase amount</CardDescription> |
| | </CardHeader> |
| | <CardContent> |
| | <div className="space-y-2"> |
| | <div className="text-2xl font-bold">$89.42</div> |
| | <div className="flex items-center gap-2"> |
| | <Badge variant="outline" className="text-green-600 border-green-600"> |
| | <TrendingUp className="w-3 h-3 mr-1" /> |
| | 12% |
| | </Badge> |
| | <span className="text-xs text-muted-foreground">vs last month</span> |
| | </div> |
| | </div> |
| | </CardContent> |
| | </Card> |
| | |
| | <Card> |
| | <CardHeader> |
| | <CardTitle>Customer Satisfaction</CardTitle> |
| | <CardDescription>Based on reviews</CardDescription> |
| | </CardHeader> |
| | <CardContent> |
| | <div className="space-y-2"> |
| | <div className="text-2xl font-bold">4.8/5.0</div> |
| | <div className="flex items-center gap-1"> |
| | {[...Array(5)].map((_, i) => ( |
| | <div |
| | key={i} |
| | className={`w-4 h-4 rounded ${ |
| | i < 4 ? "bg-yellow-400" : "bg-muted" |
| | }`} |
| | /> |
| | ))} |
| | </div> |
| | <p className="text-xs text-muted-foreground"> |
| | Based on 1,234 reviews |
| | </p> |
| | </div> |
| | </CardContent> |
| | </Card> |
| | </div> |
| | </TabsContent> |
| | </Tabs> |
| | </div> |
| | </div> |
| | ); |
| | } |