175 lines
6.3 KiB
TypeScript
175 lines
6.3 KiB
TypeScript
import { DashboardLayout } from "@/components/layout/sidebar";
|
|
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
|
|
import { Activity, Calendar, CheckCircle2, Target, TrendingUp, Clock } from "lucide-react";
|
|
|
|
const kpiData = [
|
|
{
|
|
title: "Active Tasks",
|
|
value: "12",
|
|
change: "+3 today",
|
|
icon: CheckCircle2,
|
|
trend: "up",
|
|
},
|
|
{
|
|
title: "Goals Progress",
|
|
value: "64%",
|
|
change: "+8% this week",
|
|
icon: Target,
|
|
trend: "up",
|
|
},
|
|
{
|
|
title: "Apps Built",
|
|
value: "6",
|
|
change: "2 in App Store",
|
|
icon: TrendingUp,
|
|
trend: "up",
|
|
},
|
|
{
|
|
title: "Year Progress",
|
|
value: "14%",
|
|
change: "Day 51 of 365",
|
|
icon: Clock,
|
|
trend: "neutral",
|
|
},
|
|
];
|
|
|
|
const recentActivity = [
|
|
{ action: "Organized Downloads", time: "2 hours ago", type: "file" },
|
|
{ action: "Completed morning briefing", time: "5 hours ago", type: "system" },
|
|
{ action: "Created 5 new skills", time: "1 day ago", type: "tool" },
|
|
{ action: "Updated USER.md", time: "2 days ago", type: "doc" },
|
|
];
|
|
|
|
const upcomingEvents = [
|
|
{ title: "Yearly Anniversary", date: "Feb 23", type: "personal" },
|
|
{ title: "Grabbing Anderson's dogs", date: "Feb 26, 5:30 PM", type: "task" },
|
|
{ title: "Contract Renewal Check", date: "Mar 2026", type: "work" },
|
|
];
|
|
|
|
export default function DashboardPage() {
|
|
return (
|
|
<DashboardLayout>
|
|
<div className="space-y-8">
|
|
{/* Header */}
|
|
<div>
|
|
<h1 className="text-3xl font-bold tracking-tight">Dashboard</h1>
|
|
<p className="text-muted-foreground mt-1">
|
|
Welcome back, Matt. Here's your mission overview.
|
|
</p>
|
|
</div>
|
|
|
|
{/* KPI Cards */}
|
|
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4">
|
|
{kpiData.map((kpi) => {
|
|
const Icon = kpi.icon;
|
|
return (
|
|
<Card key={kpi.title}>
|
|
<CardHeader className="flex flex-row items-center justify-between pb-2">
|
|
<CardTitle className="text-sm font-medium text-muted-foreground">
|
|
{kpi.title}
|
|
</CardTitle>
|
|
<Icon className="w-4 h-4 text-muted-foreground" />
|
|
</CardHeader>
|
|
<CardContent>
|
|
<div className="text-2xl font-bold">{kpi.value}</div>
|
|
<p className="text-xs text-muted-foreground mt-1">{kpi.change}</p>
|
|
</CardContent>
|
|
</Card>
|
|
);
|
|
})}
|
|
</div>
|
|
|
|
{/* Two Column Layout */}
|
|
<div className="grid grid-cols-1 lg:grid-cols-2 gap-6">
|
|
{/* Recent Activity */}
|
|
<Card>
|
|
<CardHeader>
|
|
<CardTitle className="flex items-center gap-2">
|
|
<Activity className="w-5 h-5" />
|
|
Recent Activity
|
|
</CardTitle>
|
|
</CardHeader>
|
|
<CardContent>
|
|
<div className="space-y-4">
|
|
{recentActivity.map((item, i) => (
|
|
<div key={i} className="flex items-start gap-3 pb-3 border-b border-border last:border-0 last:pb-0">
|
|
<div className="w-2 h-2 rounded-full bg-primary mt-2" />
|
|
<div className="flex-1">
|
|
<p className="text-sm font-medium">{item.action}</p>
|
|
<p className="text-xs text-muted-foreground">{item.time}</p>
|
|
</div>
|
|
</div>
|
|
))}
|
|
</div>
|
|
</CardContent>
|
|
</Card>
|
|
|
|
{/* Upcoming Events */}
|
|
<Card>
|
|
<CardHeader>
|
|
<CardTitle className="flex items-center gap-2">
|
|
<Calendar className="w-5 h-5" />
|
|
Upcoming Events
|
|
</CardTitle>
|
|
</CardHeader>
|
|
<CardContent>
|
|
<div className="space-y-4">
|
|
{upcomingEvents.map((event, i) => (
|
|
<div key={i} className="flex items-start gap-3 pb-3 border-b border-border last:border-0 last:pb-0">
|
|
<div className="w-2 h-2 rounded-full bg-blue-500 mt-2" />
|
|
<div className="flex-1">
|
|
<p className="text-sm font-medium">{event.title}</p>
|
|
<p className="text-xs text-muted-foreground">{event.date}</p>
|
|
</div>
|
|
<span className="text-xs px-2 py-1 rounded-full bg-secondary text-secondary-foreground">
|
|
{event.type}
|
|
</span>
|
|
</div>
|
|
))}
|
|
</div>
|
|
</CardContent>
|
|
</Card>
|
|
</div>
|
|
|
|
{/* Mission Progress */}
|
|
<Card>
|
|
<CardHeader>
|
|
<CardTitle>Mission Progress</CardTitle>
|
|
</CardHeader>
|
|
<CardContent>
|
|
<div className="space-y-4">
|
|
<div>
|
|
<div className="flex justify-between text-sm mb-2">
|
|
<span>Retirement Goal</span>
|
|
<span className="text-muted-foreground">50% complete</span>
|
|
</div>
|
|
<div className="h-2 bg-secondary rounded-full overflow-hidden">
|
|
<div className="h-full w-1/2 bg-gradient-to-r from-blue-500 to-purple-500 rounded-full" />
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<div className="flex justify-between text-sm mb-2">
|
|
<span>iOS Apps Portfolio</span>
|
|
<span className="text-muted-foreground">6 apps built</span>
|
|
</div>
|
|
<div className="h-2 bg-secondary rounded-full overflow-hidden">
|
|
<div className="h-full w-3/4 bg-gradient-to-r from-green-500 to-emerald-500 rounded-full" />
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<div className="flex justify-between text-sm mb-2">
|
|
<span>Side Hustle Revenue</span>
|
|
<span className="text-muted-foreground">Just getting started</span>
|
|
</div>
|
|
<div className="h-2 bg-secondary rounded-full overflow-hidden">
|
|
<div className="h-full w-[5%] bg-gradient-to-r from-orange-500 to-red-500 rounded-full" />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</CardContent>
|
|
</Card>
|
|
</div>
|
|
</DashboardLayout>
|
|
);
|
|
}
|