'use client'; import { useMemo } from 'react'; import { ArrowDownIcon, ArrowUpIcon, MenuIcon } from 'lucide-react'; import { Line, LineChart, ResponsiveContainer, XAxis } from 'recharts'; import { Badge } from '@kit/ui/badge'; import { Card, CardContent, CardHeader, CardTitle } from '@kit/ui/card'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@kit/ui/table'; export default function DashboardDemo() { const mrr = useMemo(() => generateDemoData(), []); const visitors = useMemo(() => generateDemoData(), []); const returningVisitors = useMemo(() => generateDemoData(), []); const churn = useMemo(() => generateDemoData(), []); const netRevenue = useMemo(() => generateDemoData(), []); const fees = useMemo(() => generateDemoData(), []); const newCustomers = useMemo(() => generateDemoData(), []); const tickets = useMemo(() => generateDemoData(), []); const activeUsers = useMemo(() => generateDemoData(), []); return (
Monthly Recurring Revenue
{`$${mrr[1]}`}
20%
Revenue
{`$${netRevenue[1]}`}
12%
Fees
{`$${fees[1]}`}
9%
New Customers
{`${newCustomers[1]}`}
-25%
Visitors
{visitors[1]}
-4.3%
Returning Visitors
{returningVisitors[1]}
10%
Churn
{churn[1]}%
-10%
Support Tickets
{tickets[1]}
-30%
Active Users
{activeUsers[1]}
10%
Customers
); } function generateDemoData() { const today = new Date(); const formatter = new Intl.DateTimeFormat('en-us', { month: 'long', year: '2-digit', }); const data: { value: string; name: string }[] = []; for (let n = 8; n > 0; n -= 1) { const date = new Date(today.getFullYear(), today.getMonth() - n, 1); data.push({ name: formatter.format(date), value: (Math.random() * 10).toFixed(1), }); } return [data, data[data.length - 1].value] as [typeof data, string]; } function Chart( props: React.PropsWithChildren<{ data: { value: string; name: string }[] }>, ) { return (
); } function CustomersTable() { return ( Customer Plan MRR Logins Status Pippin Oddo Pro $100.2 920 Healthy Väinö Pánfilo Basic $40.6 300 Possible Churn Giorgos Quinten Pro $2004.3 1000 Healthy Adhelm Otis Basic $0 10 Churned
); } function BadgeWithTrend(props: React.PropsWithChildren<{ trend: string }>) { const className = useMemo(() => { switch (props.trend) { case 'up': return 'text-green-500'; case 'down': return 'text-destructive'; case 'stale': return 'text-orange-500'; } }, [props.trend]); return ( {props.children} ); } function Figure(props: React.PropsWithChildren) { return
{props.children}
; } function Trend( props: React.PropsWithChildren<{ trend: 'up' | 'down' | 'stale'; }>, ) { const Icon = useMemo(() => { switch (props.trend) { case 'up': return ; case 'down': return ; case 'stale': return ; } }, [props.trend]); return (
{Icon} {props.children}
); }