"use client";
import { TrendingDown, TrendingUp } from "lucide-react";
import type { ReactNode } from "react";
import { Sparkline } from "@/components/chat/sparkline";
import { Badge } from "@/components/ui/badge";
import { Card } from "@/components/ui/card";
import { cn } from "@/lib/utils";
// All figures here are mock/placeholder data — there is no analytics backend.
// They illustrate the dashboard layout (clinic profits, patient volume, etc.).
type Metric = {
label: string;
value: string;
// % change vs the previous period; sign drives the up/down badge.
delta?: number;
points?: number[];
// Tailwind text-color class tinting the sparkline (via currentColor).
tone?: string;
};
function DeltaBadge({ delta }: { delta: number }) {
const up = delta >= 0;
return (
{up ? (
) : (
)}
{up ? "+" : ""}
{delta}%
);
}
function StatCard({ label, value, delta, points, tone }: Metric) {
return (
{label}
{typeof delta === "number" && }
{value}
{points && (
)}
);
}
function Section({
title,
description,
children,
}: {
title: string;
description: string;
children: ReactNode;
}) {
return (
);
}
const revenue: Metric[] = [
{
label: "Revenue (this month)",
value: "$48.2k",
delta: 12,
points: [31, 34, 33, 38, 41, 44, 48.2],
tone: "text-emerald-500",
},
{
label: "Profit margin",
value: "32%",
delta: 4,
points: [24, 26, 25, 28, 30, 31, 32],
tone: "text-emerald-500",
},
{
label: "Outstanding balances",
value: "$6.4k",
delta: -8,
points: [9.1, 8.4, 8.8, 7.6, 7.0, 6.7, 6.4],
tone: "text-amber-500",
},
];
const volume: Metric[] = [
{
label: "New patients",
value: "38",
delta: 9,
points: [22, 27, 25, 30, 33, 35, 38],
tone: "text-sky-500",
},
{
label: "Returning patients",
value: "212",
delta: 3,
points: [188, 196, 201, 199, 205, 209, 212],
tone: "text-sky-500",
},
{
label: "Active patients",
value: "1,284",
delta: 2,
points: [1190, 1210, 1230, 1242, 1260, 1271, 1284],
tone: "text-sky-500",
},
];
const appointments: Metric[] = [
{
label: "Appointments this week",
value: "146",
delta: 6,
points: [120, 128, 131, 134, 139, 142, 146],
tone: "text-violet-500",
},
{ label: "No-show rate", value: "4.1%", delta: -2 },
{ label: "Schedule utilization", value: "87%", delta: 5 },
];
const operations: Metric[] = [
{
label: "Avg. wait time",
value: "14 min",
delta: -11,
points: [22, 21, 19, 18, 17, 15, 14],
tone: "text-amber-500",
},
{
label: "Prescriptions issued",
value: "318",
delta: 7,
points: [270, 281, 290, 297, 305, 312, 318],
tone: "text-primary",
},
{ label: "Top diagnosis", value: "Hypertension" },
];
export function AnalysisView() {
return (
Analysis
Clinic performance at a glance. Figures are sample data.
{revenue.map((m) => (
))}
{appointments.map((m) => (
))}
{operations.map((m) => (
))}
);
}