diff --git a/apps/example-dashboard/app/api/analytics/route.ts b/apps/example-dashboard/app/api/analytics/route.ts index 9bf1d4d..aba04d4 100644 --- a/apps/example-dashboard/app/api/analytics/route.ts +++ b/apps/example-dashboard/app/api/analytics/route.ts @@ -97,6 +97,21 @@ export async function GET(request: NextRequest) { case "segments": const segmentId = searchParams.get("segment") || "all"; return NextResponse.json(await query.getSegmentedMetrics(from, to, segmentId, projectId)); + case "skriuw-events": + return NextResponse.json(await query.getSkriuwEventCounts(projectFilter ?? "skriuw", from, to)); + case "skriuw-trend": + return NextResponse.json(await query.getSkriuwEventTrend(projectFilter ?? "skriuw", from, to)); + case "skriuw-notes": + return NextResponse.json(await query.getSkriuwNotesActivity(projectFilter ?? "skriuw", from, to)); + case "skriuw-journal": + return NextResponse.json(await query.getSkriuwJournalActivity(projectFilter ?? "skriuw", from, to)); + case "skriuw-auth": + return NextResponse.json(await query.getSkriuwAuthMetrics(projectFilter ?? "skriuw", from, to)); + case "skriuw-recent": + const skriuwLimit = parseInt(searchParams.get("limit") || "50"); + return NextResponse.json(await query.getSkriuwRecentEvents(projectFilter ?? "skriuw", skriuwLimit, from, to)); + case "skriuw-searches": + return NextResponse.json(await query.getSkriuwTopSearches(projectFilter ?? "skriuw", 20, from, to)); default: return NextResponse.json({ error: "Unknown metric" }, { status: 400 }); } diff --git a/apps/example-dashboard/app/globals.css b/apps/example-dashboard/app/globals.css index 72a3c19..f126176 100644 --- a/apps/example-dashboard/app/globals.css +++ b/apps/example-dashboard/app/globals.css @@ -138,30 +138,29 @@ } } -/* Dark themed scrollbars */ -* { - scrollbar-width: thin; - scrollbar-color: #3f3f46 #18181b; -} - -*::-webkit-scrollbar { - width: 8px; - height: 8px; +/* Custom tooltip styles for charts */ +.recharts-tooltip-wrapper { + outline: none !important; } -*::-webkit-scrollbar-track { - background: #18181b; +.recharts-default-tooltip { + background: var(--background) !important; + border: 1px solid var(--border) !important; + border-radius: calc(var(--radius)) !important; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3) !important; } -*::-webkit-scrollbar-thumb { - background: #3f3f46; - border-radius: 4px; +/* Scrollbar - light mode fallback */ +.light * { + scrollbar-width: thin; + scrollbar-color: #e5e5e5 #ffffff; } -*::-webkit-scrollbar-thumb:hover { - background: #52525b; +.light *::-webkit-scrollbar-track { + background: #ffffff; } -*::-webkit-scrollbar-corner { - background: #18181b; +.light *::-webkit-scrollbar-thumb { + background: #e5e5e5; + border-radius: 4px; } diff --git a/apps/example-dashboard/components/app-sidebar.tsx b/apps/example-dashboard/components/app-sidebar.tsx index 4bcc48e..22d4822 100644 --- a/apps/example-dashboard/components/app-sidebar.tsx +++ b/apps/example-dashboard/components/app-sidebar.tsx @@ -150,8 +150,8 @@ export function AppSidebar() { className="h-8 text-xs font-medium" > - - {item.label} + + {item.label} @@ -235,8 +235,8 @@ function TimeRangeSwitcher({ value, onChange }: TimeRangeProps) { variant="ghost" className="h-9 w-full justify-start gap-2 px-2 text-left group-data-[collapsible=icon]:justify-center group-data-[collapsible=icon]:px-0" > -
- +
+
{currentRange.label}
@@ -280,8 +280,8 @@ function ProjectSwitcher({ projects, selectedProject, onProjectChange }: Project variant="ghost" className="h-10 w-full justify-start gap-2 px-2 text-left group-data-[collapsible=icon]:justify-center group-data-[collapsible=icon]:px-0" > -
- +
+
{displayName}
diff --git a/apps/example-dashboard/components/dashboard-content.tsx b/apps/example-dashboard/components/dashboard-content.tsx index 31d852d..724dbc6 100644 --- a/apps/example-dashboard/components/dashboard-content.tsx +++ b/apps/example-dashboard/components/dashboard-content.tsx @@ -475,7 +475,7 @@ export function DashboardContent({
{!databaseReady && } - + {!databaseReady && }
@@ -745,10 +745,10 @@ function DatabaseNotice({ issue }: { issue?: "missing_database_url" | "query_fai sessionStorage.setItem("db-notice-dismissed", "true"); setDismissed(true); }} - className="group relative w-full rounded-md border border-amber-500/30 bg-amber-500/[0.07] px-3 py-2 text-left hover:bg-amber-500/[0.1] transition-colors" + className="group relative w-full rounded-md border border-border bg-muted/30 px-3 py-2 text-left hover:bg-muted/50 transition-colors" >
- + {detail}
@@ -758,6 +758,8 @@ function DatabaseNotice({ issue }: { issue?: "missing_database_url" | "query_fai function DemoDataNotice() { const [dismissed, setDismissed] = useState(false); + const isPersonalDashboard = typeof window !== "undefined" && + window.location.hostname === process.env.NEXT_PUBLIC_PERSONAL_DASHBOARD_HOSTNAME; useEffect(() => { if (sessionStorage.getItem("demo-notice-dismissed") === "true") { @@ -765,7 +767,7 @@ function DemoDataNotice() { } }, []); - if (dismissed) return null; + if (dismissed || isPersonalDashboard) return null; return (