# Medesk dashboard

A shadcn/ui block from the [@watermelon](https://ui.watermelon.sh) registry, listed on [shadcn.exchange](https://shadcn.exchange/r/watermelon/medesk-dashboard).

- Page, with a live preview: https://shadcn.exchange/r/watermelon/medesk-dashboard
- Screenshot: https://abzjhwgwpdpz7ua5.public.blob.vercel-storage.com/shots/watermelon/medesk-dashboard-light-c83d6bc642f5e4cb.png
- Registry item: https://registry.watermelon.sh/r/medesk-dashboard.json
- Listed: 2026-10-13, source last changed 2026-10-13

## Install

```bash
npx shadcn@latest add https://registry.watermelon.sh/r/medesk-dashboard.json
```

Run it in a project that has shadcn/ui set up. It adds the files below and installs what they depend on.

## Dependencies

- npm packages: `@fontsource/geist`, `@fontsource/geist-mono`, `@fontsource/instrument-serif`, `lucide-react`, `recharts`
- Registry items: `avatar`, `button`, `collapsible`, `dropdown-menu`, `input-group`, `sheet`, `sidebar`, `utils`

## Files

### `src/components/dashboards/medesk-dashboard/components/medesk/dashboard-content.tsx`

```tsx
import { useState } from "react";
import type { ComponentType, CSSProperties, ReactNode } from "react";
import {
  CheckCircle2Icon,
  CircleIcon,
  CircleDashedIcon,
  CircleCheckBigIcon,
  FileDownIcon,
  MessageCircleIcon,
  PencilIcon,
  PlusIcon,
  SlidersHorizontalIcon,
  TimerIcon,
  UserRoundIcon,
  XIcon,
} from "lucide-react";
import type { TooltipContentProps } from "recharts";
import {
  Area,
  AreaChart,
  Bar,
  BarChart,
  CartesianGrid,
  ResponsiveContainer,
  ReferenceLine,
  Tooltip,
  XAxis,
  YAxis,
} from "recharts";
import {
  ArrowUpRightIcon,
  CalendarDotsIcon,
  CaretDownIcon,
  ClockIcon,
  FileArrowUpIcon,
} from "./icons";
import { Button, buttonVariants } from "@/components/ui/button";
import {
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuLabel,
  DropdownMenuRadioGroup,
  DropdownMenuRadioItem,
  DropdownMenuSeparator,
  DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu";
import {
  dashboardAppointmentStatusFilters,
  dashboardTimelineData,
  dashboardTimelineRanges,
  filterDashboardAppointments,
  staffDetails,
} from "../../data";
import type {
  DashboardAppointmentStatus,
  DashboardAppointmentStatusFilter,
  DashboardTimelineRange,
} from "../../data";
import { cn } from "@/lib/utils";
import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar";
import {
  Sheet,
  SheetClose,
  SheetContent,
  SheetDescription,
  SheetTitle,
} from "@/components/ui/sheet";

const dashboardColors = {
  scheduled: "var(--dashboard-scheduled)",
  completed: "var(--dashboard-completed)",
  noShow: "var(--dashboard-no-show)",
  secondary: "var(--dashboard-secondary)",
  destructive: "var(--destructive)",
} as const;

const chartSeries = [
  { key: "scheduled", label: "Scheduled", color: dashboardColors.scheduled },
  { key: "completed", label: "Completed", color: dashboardColors.completed },
  { key: "noShow", label: "No-show", color: dashboardColors.noShow },
] as const;

const statusClassName: Record<DashboardAppointmentStatus, string> = {
  "In progress":
    "bg-[color-mix(in_oklch,var(--dashboard-scheduled)_14%,transparent)] text-[var(--dashboard-scheduled)]",
  Waiting:
    "bg-[color-mix(in_oklch,var(--dashboard-no-show)_14%,transparent)] text-[var(--dashboard-no-show)]",
  Confirmed:
    "bg-[color-mix(in_oklch,var(--dashboard-completed)_14%,transparent)] text-[var(--dashboard-completed)]",
  Done: "bg-[color-mix(in_oklch,var(--dashboard-completed)_14%,transparent)] text-[var(--dashboard-completed)]",
};

const filterStatusIcons: Record<
  DashboardAppointmentStatusFilter,
  ComponentType<{ className?: string }>
> = {
  all: SlidersHorizontalIcon,
  "In progress": TimerIcon,
  Waiting: CircleDashedIcon,
  Confirmed: CheckCircle2Icon,
  Done: CircleCheckBigIcon,
};

function DashboardCard({
  children,
  className,
}: {
  children: ReactNode;
  className?: string;
}) {
  return (
    <section
      className={cn(
        "min-w-0 rounded-xl bg-card p-4 text-card-foreground",
        className,
      )}
    >
      {children}
    </section>
  );
}

function CardHeader({
  title,
  action,
  className,
}: {
  title: ReactNode;
  action?: React.ReactNode;
  className?: string;
}) {
  return (
    <div className={cn("flex items-center justify-between gap-4", className)}>
      <h2 className="text-lg leading-6 font-medium text-foreground">{title}</h2>
      {action ? (
        <div className="flex shrink-0 items-center gap-2 text-sm font-medium text-foreground/80">
          {action}
        </div>
      ) : null}
    </div>
  );
}

function MetricBars({
  lastSixDays,
  className,
}: {
  lastSixDays: readonly number[];
  className: string;
}) {
  const maximum = Math.max(...lastSixDays, 1);

  return (
    <div className="flex h-7.5 w-10 shrink-0 items-end justify-between">
      {lastSixDays.map((value, index) => (
        <span
          key={`${value}-${index}`}
          className={cn("w-1.25 rounded-t-sm", className)}
          style={{ height: `${(value / maximum) * 100}%` }}
        />
      ))}
    </div>
  );
}

function ChartTooltip({
  active,
  payload,
  label,
}: Partial<TooltipContentProps>) {
  if (!active || !payload?.length) {
    return null;
  }

  return (
    <div className="rounded-lg border border-border bg-popover px-3 py-2 text-xs text-popover-foreground shadow-sm">
      <p className="mb-2 font-medium">{label}</p>
      <div className="flex flex-col gap-1.5">
        {payload.map((item, index) => (
          <div
            key={`${String(item.dataKey)}-${index}`}
            className="flex items-center justify-between gap-6"
          >
            <span className="flex items-center gap-2 text-muted-foreground">
              <span
                className="size-2 rounded-sm"
                style={{ backgroundColor: item.color }}
              />
              {item.name}
            </span>
            <span className="font-medium text-foreground">{item.value}</span>
          </div>
        ))}
      </div>
    </div>
  );
}

type DashboardTimelineData =
  (typeof dashboardTimelineData)[DashboardTimelineRange];
type AppointmentVolumeDatum = {
  week: string;
  scheduled: number;
  completed: number;
  noShow: number;
};

function AppointmentVolumeCard({ data }: { data: DashboardTimelineData }) {
  const appointmentVolume = [
    ...data.appointmentVolume,
  ] as AppointmentVolumeDatum[];

  return (
    <DashboardCard className="flex flex-col gap-4 pb-0">
      <CardHeader
        title="Appointment Volume"
        action={
          <a
            href="/analytics"
            className="flex items-center gap-2 rounded-md px-1 py-0.5 transition-colors hover:text-foreground hover:underline"
          >
            <span>View all</span>
            <ArrowUpRightIcon className="size-4.5" />
          </a>
        }
      />

      <div className="grid flex-1 gap-6 md:grid-cols-[6.5rem_minmax(0,1fr)]">
        <div className="grid grid-cols-3 gap-4 md:flex md:flex-col md:justify-center md:gap-8">
          {data.appointmentStats.map(([value, label]) => (
            <div key={label} className="flex min-w-0 flex-col gap-3">
              <p className="text-[1.75rem] leading-none font-medium text-foreground">
                {value}
              </p>
              <p className="text-sm leading-[1.4] text-muted-foreground">
                {label}
              </p>
            </div>
          ))}
        </div>

        <div className="min-h-0 min-w-0">
          <div className="mb-3 flex flex-wrap items-center justify-end gap-3">
            {chartSeries.map((series) => (
              <div
                key={series.key}
                className="flex items-center gap-2 text-sm font-medium text-foreground/80"
              >
                <span
                  className="size-3 rounded-sm"
                  style={{ backgroundColor: series.color }}
                />
                {series.label}
              </div>
            ))}
          </div>
          <div className="h-68 min-w-md md:min-w-0">
            <ResponsiveContainer width="100%" height="100%">
              <BarChart
                data={appointmentVolume}
                barGap={6}
                barCategoryGap="24%"
              >
                <CartesianGrid
                  vertical={false}
                  stroke="var(--border)"
                  strokeDasharray="3 3"
                  strokeOpacity={0.65}
                />
                <XAxis
                  dataKey="week"
                  axisLine={false}
                  tickLine={false}
                  tick={{ fill: "var(--muted-foreground)", fontSize: 12 }}
                  dy={8}
                />
                <YAxis
                  axisLine={false}
                  tickLine={false}
                  domain={[0, 250]}
                  ticks={[0, 50, 100, 150, 200, 250]}
                  tick={{ fill: "var(--muted-foreground)", fontSize: 12 }}
                  width={42}
                />
                <Tooltip
                  cursor={{ fill: "var(--muted)", opacity: 0.35 }}
                  content={(props) => <ChartTooltip {...props} />}
                />
                <Bar
                  dataKey="scheduled"
                  name="Scheduled"
                  fill={dashboardColors.scheduled}
                  radius={[4, 4, 0, 0]}
                />
                <Bar
                  dataKey="completed"
                  name="Completed"
                  fill={dashboardColors.completed}
                  radius={[4, 4, 0, 0]}
                />
                <Bar
                  dataKey="noShow"
                  name="No-show"
                  fill={dashboardColors.noShow}
                  radius={[4, 4, 0, 0]}
                />
              </BarChart>
            </ResponsiveContainer>
          </div>
        </div>
      </div>
    </DashboardCard>
  );
}

function DepartmentLoadCard({ data }: { data: DashboardTimelineData }) {
  const departmentTotal = data.departmentLoad.reduce(
    (total, department) => total + department.value,
    0,
  );

  return (
    <DashboardCard className="flex flex-col gap-4">
      <CardHeader
        title="Department Load"
        action={
          <a
            href="/departments"
            className="flex items-center gap-2 rounded-md px-1 py-0.5 transition-colors hover:text-foreground hover:underline"
          >
            <span>Details</span>
            <ArrowUpRightIcon className="size-4.5" />
          </a>
        }
      />

      <div className="flex flex-col gap-6">
        <div className="flex flex-col gap-5">
          <div className="flex items-center justify-between gap-4 text-sm">
            <span className="text-muted-foreground">Total Cases</span>
            <span className="font-semibold text-foreground">
              {departmentTotal}
            </span>
          </div>
          <div className="flex h-5.75 items-start gap-1 overflow-hidden rounded-md">
            {data.departmentLoad.map((department, index) => (
              <span
                key={department.label}
                className={cn(
                  "dashboard-load-segment h-full min-w-4 shrink-0 rounded-md",
                  department.color,
                )}
                style={
                  {
                    "--department-width": `${(department.value / departmentTotal) * 100}%`,
                    animationDelay: `${index * 90}ms`,
                  } as CSSProperties
                }
              />
            ))}
          </div>
        </div>

        <div className="flex flex-col gap-6">
          {data.departmentLoad.map((department) => (
            <div
              key={department.label}
              className="flex min-w-0 items-center gap-3 text-sm"
            >
              <div className="flex min-w-0 shrink-0 items-center gap-2">
                <span className={cn("size-4 rounded-sm", department.color)} />
                <span className="truncate font-medium text-foreground/80">
                  {department.label}
                </span>
              </div>
              <span className="min-w-0 flex-1 border-t border-dashed border-border" />
              <div className="flex shrink-0 items-center gap-2">
                <span className="w-6 text-right font-medium text-foreground/80">
                  {department.value}
                </span>
                <span className="w-12 text-right text-muted-foreground">
                  {department.percent}
                </span>
              </div>
            </div>
          ))}
        </div>
      </div>
    </DashboardCard>
  );
}

function AppointmentsTableCard({
  appointments,
  statusFilter,
  onStatusFilterChange,
}: {
  appointments: ReturnType<typeof filterDashboardAppointments>;
  statusFilter: DashboardAppointmentStatusFilter;
  onStatusFilterChange: (
    statusFilter: DashboardAppointmentStatusFilter,
  ) => void;
}) {
  return (
    <DashboardCard className="flex flex-col gap-4 px-0 pb-0">
      <CardHeader
        className="px-4"
        title={
          <>
            <span className="sm:hidden">Today</span>
            <span className="hidden sm:inline">Today's appointments</span>
          </>
        }
        action={
          <>
            <Button type="button" variant="ghost" className="h-8 gap-2 px-2">
              <FileDownIcon className="size-4.5" />
              Import
            </Button>
            <DropdownMenu>
              <DropdownMenuTrigger
                type="button"
                className={buttonVariants({
                  variant: "ghost",
                  className: "h-8 gap-2 px-2",
                })}
              >
                <SlidersHorizontalIcon className="size-4.5" />
                Filter
              </DropdownMenuTrigger>
              <DropdownMenuContent align="end" className="w-56">
                <DropdownMenuLabel>Status</DropdownMenuLabel>
                <DropdownMenuSeparator />
                <DropdownMenuRadioGroup
                  value={statusFilter}
                  onValueChange={(value) =>
                    onStatusFilterChange(
                      value as DashboardAppointmentStatusFilter,
                    )
                  }
                >
                  {dashboardAppointmentStatusFilters.map((filter) => (
                    <DropdownMenuRadioItem
                      key={filter.value}
                      value={filter.value}
                      className={cn(
                        "text-muted-foreground [&_svg]:text-muted-foreground",
                        statusFilter === filter.value &&
                          "font-medium text-foreground [&_svg]:text-foreground",
                      )}
                    >
                      {(() => {
                        const FilterIcon = filterStatusIcons[filter.value];
                        return <FilterIcon className="size-4" />;
                      })()}
                      {filter.label}
                    </DropdownMenuRadioItem>
                  ))}
                </DropdownMenuRadioGroup>
              </DropdownMenuContent>
            </DropdownMenu>
          </>
        }
      />

      <div className="overflow-x-auto no-scrollbar">
        <table className="w-full min-w-160 table-fixed text-left">
          <thead>
            <tr className="h-12 text-sm font-medium text-muted-foreground">
              <th className="w-[12%] px-4">Time</th>
              <th className="w-[24%] px-4">Patient</th>
              <th className="w-[22%] px-4">Type</th>
              <th className="w-[22%] px-4">Doctor</th>
              <th className="w-[20%] px-4">Status</th>
            </tr>
          </thead>
          <tbody>
            {appointments.map((appointment) => (
              <tr
                key={`${appointment.time}-${appointment.patient}`}
                className="h-17.5 border-t border-border/60 transition-colors hover:bg-foreground/5"
              >
                <td className="px-4 text-sm font-medium text-foreground">
                  {appointment.time}
                </td>
                <td className="px-4 text-sm font-medium text-foreground">
                  {appointment.patient}
                </td>
                <td className="truncate px-4 text-sm text-foreground/90">
                  {appointment.type}
                </td>
                <td className="px-4 text-sm text-foreground/90">
                  {appointment.doctor}
                </td>
                <td className="px-4">
                  <span
                    className={cn(
                      "inline-flex rounded-full px-3 py-1 text-sm leading-5",
                      statusClassName[appointment.status],
                    )}
                  >
                    {appointment.status}
                  </span>
                </td>
              </tr>
            ))}
          </tbody>
        </table>
      </div>
    </DashboardCard>
  );
}

type DashboardStaff = DashboardTimelineData["staffPerformance"][number];

function StaffDetailsSheet({
  staff,
  open,
  onOpenChange,
}: {
  staff: DashboardStaff | null;
  open: boolean;
  onOpenChange: (open: boolean) => void;
}) {
  const details = staff
    ? staffDetails[staff.name as keyof typeof staffDetails]
    : null;

  return (
    <Sheet open={open} onOpenChange={onOpenChange}>
      <SheetContent
        side="right"
        showCloseButton={false}
        className="w-full! max-w-full! overflow-hidden bg-transparent sm:p-3 shadow-none sm:w-130! sm:max-w-130! border-none"
      >
        <div className="flex h-full min-h-0 w-full flex-col overflow-hidden bg-background sm:rounded-2xl">
          <header className="flex h-19 shrink-0 items-center justify-between px-6">
            <SheetTitle className="text-xl">Staff Details</SheetTitle>

            <SheetClose asChild>
              <Button
                type="button"
                variant="ghost"
                size="icon-lg"
                aria-label="Close staff details"
                className="[&_svg]:size-5!"
              >
                <XIcon />
              </Button>
            </SheetClose>
          </header>

          {staff && details ? (
            <div className="min-h-0 flex-1 overflow-y-auto px-6 py-4 no-scrollbar">
              <SheetDescription className="sr-only">
                Details for {staff.name}
              </SheetDescription>

              <div className="flex flex-col gap-8">
                <section className="flex items-center gap-3">
                  <Avatar className="size-30 rounded-xl">
                    <AvatarImage
                      src={staff.avatar}
                      alt={staff.name}
                      className="rounded-xl"
                    />
                    <AvatarFallback>{staff.name.slice(0, 1)}</AvatarFallback>
                  </Avatar>

                  <div className="flex min-w-0 flex-col gap-1">
                    <h3 className="truncate text-2xl font-medium">
                      {staff.name}
                    </h3>

                    <p className="text-sm text-muted-foreground">
                      {details.specialty}
                    </p>

                    <div className="flex flex-wrap items-center gap-2 text-sm text-muted-foreground">
                      <span>{details.department}</span>
                      <CircleIcon className="size-1 fill-current" />
                      <span>{details.location}</span>
                    </div>

                    <div className="flex flex-wrap items-center gap-2 text-sm font-medium">
                      <CheckCircle2Icon className="size-3.5 text-[var(--dashboard-completed)]" />
                      <span className="text-[var(--dashboard-completed)]">
                        {details.status}
                      </span>
                      <span className="text-muted-foreground">-</span>
                      <span>{details.ward}</span>
                    </div>
                  </div>
                </section>

                <section className="border-b border-border">
                  <div className="flex items-center gap-6 text-lg">
                    <button
                      type="button"
                      className="border-b-2 border-foreground px-4 py-3 font-medium"
                    >
                      Overview
                    </button>

                    <button
                      type="button"
                      className="px-4 py-3 text-muted-foreground hover:text-foreground"
                    >
                      Skills
                    </button>

                    <button
                      type="button"
                      className="px-4 py-3 text-muted-foreground hover:text-foreground"
                    >
                      Activity
                    </button>
                  </div>
                </section>

                <section className="flex flex-col gap-3">
                  <h3 className="text-lg font-medium">Today&apos;s Metric</h3>

                  <div className="grid gap-3 md:grid-cols-3">
                    {details.metrics.map((metric) => (
                      <div
                        key={metric.label}
                        className="flex h-32 flex-col justify-between rounded-xl bg-card p-4"
                      >
                        <p className="text-sm text-muted-foreground">
                          {metric.label}
                        </p>

                        <div className="flex flex-col gap-2">
                          <p className="text-2xl font-medium">{metric.value}</p>

                          <p className="text-xs font-mono text-muted-foreground">
                            <span className="mr-1 text-[var(--dashboard-completed)]">
                              +
                            </span>
                            {metric.trend}
                          </p>
                        </div>
                      </div>
                    ))}
                  </div>
                </section>

                <section className="flex flex-col gap-3">
                  <h3 className="text-lg font-medium">Monthly Performance</h3>

                  <div className="relative h-72">
                    <div className="absolute top-0 right-2 z-10 flex items-center gap-4 bg-card px-2 py-1 text-sm text-muted-foreground">
                      <span className="flex items-center gap-1.5">
                        <span className="size-3 rounded-[3px] bg-[var(--dashboard-scheduled)]" />
                        {details.monthlyPerformance.patientSeenLabel}
                      </span>

                      <span className="flex items-center gap-1.5">
                        <span className="size-3 rounded-[3px] bg-[var(--dashboard-completed)]" />
                        {details.monthlyPerformance.targetLabel}
                      </span>
                    </div>

                    <ResponsiveContainer width="100%" height="100%">
                      <AreaChart
                        key={staff.name}
                        data={[...details.monthlyPerformance.points]}
                        margin={{ top: 36, right: 8, bottom: 0, left: 0 }}
                      >
                        <defs>
                          <linearGradient
                            id="staff-patients-seen-gradient"
                            x1="0"
                            x2="0"
                            y1="0"
                            y2="1"
                          >
                            <stop
                              offset="0%"
                              stopColor={dashboardColors.scheduled}
                              stopOpacity={0.35}
                            />
                            <stop
                              offset="100%"
                              stopColor={dashboardColors.scheduled}
                              stopOpacity={0}
                            />
                          </linearGradient>
                        </defs>

                        <CartesianGrid
                          vertical={false}
                          stroke="var(--border)"
                          strokeDasharray="3 3"
                        />

                        <XAxis
                          dataKey="month"
                          axisLine={false}
                          tickLine={false}
                          tick={{
                            fill: "var(--muted-foreground)",
                            fontSize: 12,
                          }}
                        />

                        <YAxis
                          axisLine={false}
                          tickLine={false}
                          tick={{
                            fill: "var(--muted-foreground)",
                            fontSize: 12,
                          }}
                          domain={[0, "dataMax + 100"]}
                          width={36}
                        />

                        <Tooltip
                          content={(props) => <ChartTooltip {...props} />}
                        />

                        <ReferenceLine
                          y={details.monthlyPerformance.target}
                          stroke={dashboardColors.completed}
                          strokeDasharray="3 3"
                          strokeWidth={2}
                        />

                        <Area
                          type="linear"
                          dataKey="patientsSeen"
                          name={details.monthlyPerformance.patientSeenLabel}
                          stroke={dashboardColors.scheduled}
                          fill="url(#staff-patients-seen-gradient)"
                          strokeWidth={2}
                          activeDot={{ r: 4, fill: "var(--card)" }}
                          dot={{ r: 4, fill: "var(--card)", strokeWidth: 3 }}
                        />
                      </AreaChart>
                    </ResponsiveContainer>
                  </div>
                </section>

                <section className="flex flex-col gap-3">
                  <h3 className="text-lg font-medium">Staff Information</h3>

                  <div className="grid gap-3 md:grid-cols-6">
                    {details.information.map(([label, value], index) => (
                      <div
                        key={label}
                        className={cn(
                          "flex min-w-0 flex-col gap-2 rounded-xl bg-card p-4 md:col-span-2",
                          details.information.length % 3 === 2 &&
                            index >= details.information.length - 2 &&
                            "md:col-span-3",
                        )}
                      >
                        <span className="text-sm text-muted-foreground">
                          {label}
                        </span>

                        <span className="truncate font-medium">{value}</span>
                      </div>
                    ))}
                  </div>
                </section>
              </div>
            </div>
          ) : null}

          <footer className="p-4 flex flex-col gap-3">
            <div className="flex items-center justify-center gap-3">
              <Button variant="secondary" className="h-12 flex-1">
                Edit Profile
                <PencilIcon />
              </Button>

              <Button variant="secondary" className="h-12 flex-1">
                Message
                <MessageCircleIcon />
              </Button>
            </div>

            <Button className="h-12 w-full">
              Assign Patient
              <UserRoundIcon />
            </Button>
          </footer>
        </div>
      </SheetContent>
    </Sheet>
  );
}

function StaffPerformanceCard({
  data,
  onStaffSelect,
}: {
  data: DashboardTimelineData;
  onStaffSelect: (staff: DashboardStaff) => void;
}) {
  return (
    <DashboardCard className="flex flex-col gap-4 px-0 pb-0">
      <CardHeader
        className="px-4"
        title="Staff performance"
        action={
          <a
            href="/staff"
            className="flex items-center gap-2 rounded-md px-1 py-0.5 transition-colors hover:text-foreground hover:underline"
          >
            <span>View all</span>
            <ArrowUpRightIcon className="size-4.5" />
          </a>
        }
      />

      <div className="flex flex-col">
        {data.staffPerformance.map((staff, index) => (
          <button
            type="button"
            key={staff.name}
            onClick={() => onStaffSelect(staff)}
            className={cn(
              "flex items-end justify-between gap-4 px-4 py-3 text-left transition-colors hover:bg-foreground/5",
              index > 0 && "border-t border-border/60",
            )}
          >
            <div className="flex min-w-0 items-center gap-3">
              <img
                src={staff.avatar}
                alt=""
                className="size-11.75 shrink-0 rounded-xl object-cover"
              />
              <div className="min-w-0">
                <p className="truncate text-sm font-medium text-foreground/80">
                  {staff.name}
                </p>
                <p className="mt-1 truncate text-sm text-muted-foreground">
                  {staff.role}
                </p>
              </div>
            </div>
            <div className="flex shrink-0 items-center gap-3 text-sm">
              <StatValue value={staff.points} label="pts today" />
              <StatValue value={staff.rating} label="rating" />
            </div>
          </button>
        ))}
      </div>
    </DashboardCard>
  );
}

function StatValue({
  value,
  label,
}: {
  value: string | number;
  label: string;
}) {
  return (
    <div className="flex flex-col items-end gap-0.5">
      <span className="font-medium text-foreground/80">{value}</span>
      <span className="text-muted-foreground">{label}</span>
    </div>
  );
}

function ResourceUsageCard({ data }: { data: DashboardTimelineData }) {
  return (
    <DashboardCard className="flex flex-col gap-6">
      <CardHeader
        title="Resource Usage"
        action={
          <a
            href="/resources"
            className="flex items-center gap-2 rounded-md px-1 py-0.5 transition-colors hover:text-foreground hover:underline"
          >
            <span>View all</span>
            <ArrowUpRightIcon className="size-4.5" />
          </a>
        }
      />

      <div className="flex flex-col gap-6">
        {data.resources.map((resource, index) => (
          <ResourceRow
            key={resource.label}
            {...resource}
            withDivider={index > 0}
          />
        ))}
      </div>
    </DashboardCard>
  );
}

function ResourceRow({
  label,
  value,
  unit,
  Icon,
  color,
  withDivider,
}: {
  label: string;
  value: number;
  unit: string;
  Icon: ComponentType<{ className?: string }>;
  color: string;
  withDivider: boolean;
}) {
  return (
    <div
      className={cn(
        "flex gap-4",
        withDivider && "border-t border-border/60 pt-6",
      )}
    >
      <div className="flex size-8 shrink-0 items-center justify-center rounded-lg bg-muted text-muted-foreground">
        <Icon className="size-4.5" />
      </div>
      <div className="min-w-0 flex-1">
        <div className="flex items-center justify-between gap-4 text-sm">
          <span className="truncate font-medium text-foreground">{label}</span>
          <span className="shrink-0 text-muted-foreground">
            <span className="font-medium text-foreground/80">{value}% </span>
            {unit}
          </span>
        </div>
        <div className="mt-2 h-2 overflow-hidden rounded-full bg-muted">
          <span
            className={cn(
              "dashboard-resource-progress block h-full rounded-full",
              color,
            )}
            style={{ width: `${value}%` }}
          />
        </div>
      </div>
    </div>
  );
}

export function DashboardPage() {
  const [selectedRange, setSelectedRange] =
    useState<DashboardTimelineRange>("aug-2026");
  const [appointmentStatusFilter, setAppointmentStatusFilter] =
    useState<DashboardAppointmentStatusFilter>("all");
  const [selectedStaff, setSelectedStaff] = useState<DashboardStaff | null>(
    null,
  );
  const selectedData = dashboardTimelineData[selectedRange];
  const selectedRangeMeta = dashboardTimelineRanges.find(
    (range) => range.value === selectedRange,
  );
  const visibleAppointments = filterDashboardAppointments(
    selectedData.appointments,
    appointmentStatusFilter,
  );

  return (
    <div className="flex flex-col gap-8 p-4 md:p-6">
      <section className="flex flex-col gap-5 md:flex-row md:items-end md:justify-between">
        <div className="flex flex-col gap-2">
          <h1 className="text-2xl leading-[1.4] font-normal">
            Good Morning Dr. Reyes
          </h1>
          <div className="flex items-center gap-1 text-sm text-muted-foreground">
            <CalendarDotsIcon />
            <span>Monday, Aug 04, 2025</span>
          </div>
        </div>

        <div className="flex flex-wrap items-center gap-3">
          <Button
            type="button"
            variant="secondary"
            className="h-10 rounded-md px-3.5"
          >
            <FileArrowUpIcon className="size-4.5" />
            Export
          </Button>
          <DropdownMenu>
            <DropdownMenuTrigger
              type="button"
              className={buttonVariants({
                variant: "secondary",
                className: "h-10 rounded-md px-3.5",
              })}
            >
              <CalendarDotsIcon className="size-4.5" />
              {selectedRangeMeta?.label}
              <CaretDownIcon className="size-4" />
            </DropdownMenuTrigger>
            <DropdownMenuContent align="end" className="w-56">
              <DropdownMenuRadioGroup
                value={selectedRange}
                onValueChange={(value) =>
                  setSelectedRange(value as DashboardTimelineRange)
                }
              >
                {dashboardTimelineRanges.map((range) => (
                  <DropdownMenuRadioItem
                    key={range.value}
                    value={range.value}
                    className={cn(
                      "text-muted-foreground",
                      selectedRange === range.value &&
                        "font-medium text-foreground",
                    )}
                  >
                    {range.label}
                  </DropdownMenuRadioItem>
                ))}
              </DropdownMenuRadioGroup>
            </DropdownMenuContent>
          </DropdownMenu>
          <Button type="button" className="h-10 rounded-md px-4 shadow-sm">
            <PlusIcon className="size-4.5" />
            Add New
          </Button>
        </div>
      </section>

      <section className="@container">
        <div className="grid grid-cols-1 gap-3 @min-[36rem]:grid-cols-2 @min-[72rem]:grid-cols-4">
          {selectedData.metrics.map((metric) => (
            <article
              key={metric.label}
              className="flex h-34.5 min-w-0 flex-col justify-between rounded-xl bg-card p-4 text-card-foreground"
            >
              <div className="flex items-start justify-between gap-3">
                <h2 className="text-sm leading-[1.4] font-medium text-muted-foreground">
                  {metric.label}
                </h2>
                <ClockIcon className="size-5 shrink-0 text-foreground" />
              </div>

              <div className="flex items-end gap-1.5">
                <div className="min-w-0 flex-1">
                  <p className="text-[1.75rem] leading-none font-medium text-foreground">
                    {metric.value}
                    {metric.suffix ? (
                      <span className="ml-1 text-lg text-foreground/70">
                        {metric.suffix}
                      </span>
                    ) : null}
                  </p>
                  <div className="mt-3 flex items-center gap-1 text-xs font-mono text-muted-foreground">
                    <ArrowUpRightIcon
                      className={cn("size-4", metric.trendColor)}
                    />
                    <span className="text-foreground">
                      {metric.trend.split(" ")[0]}
                    </span>
                    <span>
                      {metric.trend.substring(metric.trend.indexOf(" ") + 1)}
                    </span>
                  </div>
                </div>
                <MetricBars
                  lastSixDays={metric.lastSixDays}
                  className={metric.color}
                />
              </div>
            </article>
          ))}
        </div>
      </section>

      <section className="grid gap-3 xl:grid-cols-[minmax(0,1fr)_minmax(18rem,25rem)]">
        <div className="min-w-0 overflow-x-auto no-scrollbar">
          <AppointmentVolumeCard key={selectedRange} data={selectedData} />
        </div>
        <DepartmentLoadCard key={selectedRange} data={selectedData} />
      </section>

      <section className="grid items-start gap-3 xl:grid-cols-[minmax(0,1fr)_minmax(18rem,25rem)]">
        <AppointmentsTableCard
          appointments={visibleAppointments}
          statusFilter={appointmentStatusFilter}
          onStatusFilterChange={setAppointmentStatusFilter}
        />
        <div className="grid min-w-0 gap-6 self-start">
          <StaffPerformanceCard
            data={selectedData}
            onStaffSelect={setSelectedStaff}
          />
          <ResourceUsageCard key={selectedRange} data={selectedData} />
        </div>
      </section>
      <StaffDetailsSheet
        staff={selectedStaff}
        open={selectedStaff !== null}
        onOpenChange={(open) => {
          if (!open) {
            setSelectedStaff(null);
          }
        }}
      />
    </div>
  );
}
```

### `src/components/dashboards/medesk-dashboard/components/medesk/icons.tsx`

```tsx
import type { SVGProps } from "react";
import { cn } from "@/lib/utils";

type IconProps = SVGProps<SVGSVGElement>;

function Icon({ className, ...props }: IconProps) {
  return (
    <svg
      viewBox="0 0 20 20"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn("size-5", className)}
      {...props}
    />
  );
}

export function HomeIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <g id="House">
        <path
          id="Vector"
          d="M17.5 9.375V16.875C17.5 17.0408 17.4342 17.1997 17.3169 17.3169C17.1997 17.4342 17.0408 17.5 16.875 17.5H12.5C12.3342 17.5 12.1753 17.4342 12.0581 17.3169C11.9408 17.1997 11.875 17.0408 11.875 16.875V12.8125C11.875 12.7296 11.8421 12.6501 11.7835 12.5915C11.7249 12.5329 11.6454 12.5 11.5625 12.5H8.4375C8.35462 12.5 8.27513 12.5329 8.21653 12.5915C8.15792 12.6501 8.125 12.7296 8.125 12.8125V16.875C8.125 17.0408 8.05915 17.1997 7.94194 17.3169C7.82473 17.4342 7.66576 17.5 7.5 17.5H3.125C2.95924 17.5 2.80027 17.4342 2.68306 17.3169C2.56585 17.1997 2.5 17.0408 2.5 16.875V9.375C2.50015 9.04354 2.63195 8.72571 2.86641 8.49141L9.11641 2.24141C9.3508 2.00716 9.66862 1.87558 10 1.87558C10.3314 1.87558 10.6492 2.00716 10.8836 2.24141L17.1336 8.49141C17.368 8.72571 17.4998 9.04354 17.5 9.375Z"
          fill="currentColor"
        />
      </g>
    </Icon>
  );
}

export function ClockIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <path
        d="M10 1.875C8.39303 1.875 6.82214 2.35152 5.48599 3.24431C4.14984 4.1371 3.10844 5.40605 2.49348 6.8907C1.87852 8.37535 1.71761 10.009 2.03112 11.5851C2.34462 13.1612 3.11846 14.6089 4.25476 15.7452C5.39106 16.8815 6.8388 17.6554 8.41489 17.9689C9.99099 18.2824 11.6247 18.1215 13.1093 17.5065C14.594 16.8916 15.8629 15.8502 16.7557 14.514C17.6485 13.1779 18.125 11.607 18.125 10C18.1227 7.84581 17.266 5.78051 15.7427 4.25727C14.2195 2.73403 12.1542 1.87727 10 1.875ZM10 16.875C8.64025 16.875 7.31104 16.4718 6.18045 15.7164C5.04987 14.9609 4.16868 13.8872 3.64833 12.6309C3.12798 11.3747 2.99183 9.99237 3.2571 8.65875C3.52237 7.32513 4.17715 6.10013 5.13864 5.13864C6.10013 4.17715 7.32513 3.52237 8.65875 3.2571C9.99237 2.99183 11.3747 3.12798 12.6309 3.64833C13.8872 4.16868 14.9609 5.04987 15.7164 6.18045C16.4718 7.31104 16.875 8.64025 16.875 10C16.8729 11.8227 16.1479 13.5702 14.8591 14.8591C13.5702 16.1479 11.8227 16.8729 10 16.875ZM15 10C15 10.1658 14.9342 10.3247 14.8169 10.4419C14.6997 10.5592 14.5408 10.625 14.375 10.625H10C9.83424 10.625 9.67527 10.5592 9.55806 10.4419C9.44085 10.3247 9.375 10.1658 9.375 10V5.625C9.375 5.45924 9.44085 5.30027 9.55806 5.18306C9.67527 5.06585 9.83424 5 10 5C10.1658 5 10.3247 5.06585 10.4419 5.18306C10.5592 5.30027 10.625 5.45924 10.625 5.625V9.375H14.375C14.5408 9.375 14.6997 9.44085 14.8169 9.55806C14.9342 9.67527 15 9.83424 15 10Z"
        fill="currentColor"
      />
    </Icon>
  );
}

export function WarningIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <path
        d="M18.5 14.6945L11.668 2.82969C11.4972 2.539 11.2535 2.29798 10.9609 2.13052C10.6684 1.96305 10.3371 1.87495 10 1.87495C9.66289 1.87495 9.33163 1.96305 9.03906 2.13052C8.74648 2.29798 8.50276 2.539 8.33203 2.82969L1.5 14.6945C1.33573 14.9757 1.24916 15.2955 1.24916 15.6211C1.24916 15.9467 1.33573 16.2665 1.5 16.5477C1.66854 16.8401 1.91185 17.0824 2.20497 17.2498C2.49809 17.4171 2.83046 17.5035 3.16797 17.5H16.832C17.1693 17.5032 17.5013 17.4167 17.7941 17.2494C18.087 17.082 18.33 16.8399 18.4984 16.5477C18.6629 16.2666 18.7498 15.9469 18.7501 15.6213C18.7503 15.2957 18.664 14.9758 18.5 14.6945ZM17.4164 15.9219C17.3568 16.0235 17.2713 16.1074 17.1686 16.1651C17.066 16.2227 16.9498 16.252 16.832 16.25H3.16797C3.05022 16.252 2.93404 16.2227 2.83135 16.1651C2.72866 16.1074 2.64315 16.0235 2.58359 15.9219C2.52964 15.8305 2.50119 15.7264 2.50119 15.6203C2.50119 15.5142 2.52964 15.4101 2.58359 15.3187L9.41562 3.45391C9.47639 3.35279 9.56228 3.26912 9.66496 3.21103C9.76763 3.15295 9.88359 3.12242 10.0016 3.12242C10.1195 3.12242 10.2355 3.15295 10.3382 3.21103C10.4408 3.26912 10.5267 3.35279 10.5875 3.45391L17.4195 15.3187C17.473 15.4104 17.5009 15.5147 17.5004 15.6207C17.4998 15.7268 17.4708 15.8308 17.4164 15.9219ZM9.375 11.25V8.125C9.375 7.95924 9.44085 7.80027 9.55806 7.68306C9.67527 7.56585 9.83424 7.5 10 7.5C10.1658 7.5 10.3247 7.56585 10.4419 7.68306C10.5592 7.80027 10.625 7.95924 10.625 8.125V11.25C10.625 11.4158 10.5592 11.5747 10.4419 11.6919C10.3247 11.8092 10.1658 11.875 10 11.875C9.83424 11.875 9.67527 11.8092 9.55806 11.6919C9.44085 11.5747 9.375 11.4158 9.375 11.25ZM10.9375 14.0625C10.9375 14.2479 10.8825 14.4292 10.7795 14.5833C10.6765 14.7375 10.5301 14.8577 10.3588 14.9286C10.1875 14.9996 9.99896 15.0182 9.8171 14.982C9.63525 14.9458 9.4682 14.8565 9.33709 14.7254C9.20598 14.5943 9.11669 14.4273 9.08051 14.2454C9.04434 14.0635 9.06291 13.875 9.13386 13.7037C9.20482 13.5324 9.32498 13.386 9.47915 13.283C9.63332 13.18 9.81458 13.125 10 13.125C10.2486 13.125 10.4871 13.2238 10.6629 13.3996C10.8387 13.5754 10.9375 13.8139 10.9375 14.0625Z"
        fill="currentColor"
      />
    </Icon>
  );
}

export function FileIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <g id="File">
        <path
          id="Vector"
          d="M16.6922 6.43281L12.3172 2.05781C12.2591 1.99979 12.1902 1.95378 12.1143 1.92241C12.0384 1.89105 11.9571 1.87494 11.875 1.875H4.375C4.04348 1.875 3.72554 2.0067 3.49112 2.24112C3.2567 2.47554 3.125 2.79348 3.125 3.125V16.875C3.125 17.2065 3.2567 17.5245 3.49112 17.7589C3.72554 17.9933 4.04348 18.125 4.375 18.125H15.625C15.9565 18.125 16.2745 17.9933 16.5089 17.7589C16.7433 17.5245 16.875 17.2065 16.875 16.875V6.875C16.8751 6.7929 16.859 6.71159 16.8276 6.63572C16.7962 6.55985 16.7502 6.4909 16.6922 6.43281ZM12.5 4.00859L14.7414 6.25H12.5V4.00859ZM15.625 16.875H4.375V3.125H11.25V6.875C11.25 7.04076 11.3158 7.19973 11.4331 7.31694C11.5503 7.43415 11.7092 7.5 11.875 7.5H15.625V16.875Z"
          fill="currentColor"
        />
      </g>
    </Icon>
  );
}

export function ShieldCheckIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <g id="ShieldCheck">
        <path
          id="Vector"
          d="M16.25 3.125H3.75C3.41848 3.125 3.10054 3.2567 2.86612 3.49112C2.6317 3.72554 2.5 4.04348 2.5 4.375V8.75C2.5 12.8688 4.49375 15.3648 6.16641 16.7336C7.96797 18.207 9.76016 18.707 9.83828 18.7281C9.9457 18.7573 10.059 18.7573 10.1664 18.7281C10.2445 18.707 12.0344 18.207 13.8383 16.7336C15.5063 15.3648 17.5 12.8688 17.5 8.75V4.375C17.5 4.04348 17.3683 3.72554 17.1339 3.49112C16.8995 3.2567 16.5815 3.125 16.25 3.125ZM16.25 8.75C16.25 11.6461 15.1828 13.9969 13.0781 15.7359C12.1619 16.4904 11.12 17.0775 10 17.4703C8.89469 17.0843 7.86558 16.5077 6.95938 15.7664C4.82969 14.0242 3.75 11.6641 3.75 8.75V4.375H16.25V8.75ZM6.43281 11.0672C6.31554 10.9499 6.24965 10.7909 6.24965 10.625C6.24965 10.4591 6.31554 10.3001 6.43281 10.1828C6.55009 10.0655 6.70915 9.99965 6.875 9.99965C7.04085 9.99965 7.19991 10.0655 7.31719 10.1828L8.75 11.6164L12.6828 7.68281C12.7409 7.62474 12.8098 7.57868 12.8857 7.54725C12.9616 7.51583 13.0429 7.49965 13.125 7.49965C13.2071 7.49965 13.2884 7.51583 13.3643 7.54725C13.4402 7.57868 13.5091 7.62474 13.5672 7.68281C13.6253 7.74088 13.6713 7.80982 13.7027 7.88569C13.7342 7.96156 13.7503 8.04288 13.7503 8.125C13.7503 8.20712 13.7342 8.28844 13.7027 8.36431C13.6713 8.44018 13.6253 8.50912 13.5672 8.56719L9.19219 12.9422C9.13414 13.0003 9.06521 13.0464 8.98934 13.0779C8.91346 13.1093 8.83213 13.1255 8.75 13.1255C8.66787 13.1255 8.58654 13.1093 8.51066 13.0779C8.43479 13.0464 8.36586 13.0003 8.30781 12.9422L6.43281 11.0672Z"
          fill="currentColor"
        />
      </g>
    </Icon>
  );
}

export function PlayCircleIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <path
        d="M10 1.875C8.39303 1.875 6.82214 2.35152 5.48599 3.24431C4.14984 4.1371 3.10844 5.40605 2.49348 6.8907C1.87852 8.37535 1.71761 10.009 2.03112 11.5851C2.34462 13.1612 3.11846 14.6089 4.25476 15.7452C5.39106 16.8815 6.8388 17.6554 8.41489 17.9689C9.99099 18.2824 11.6247 18.1215 13.1093 17.5065C14.594 16.8916 15.8629 15.8502 16.7557 14.514C17.6485 13.1779 18.125 11.607 18.125 10C18.1227 7.84581 17.266 5.78051 15.7427 4.25727C14.2195 2.73403 12.1542 1.87727 10 1.875ZM10 16.875C8.64025 16.875 7.31104 16.4718 6.18045 15.7164C5.04987 14.9609 4.16868 13.8872 3.64833 12.6309C3.12798 11.3747 2.99183 9.99237 3.2571 8.65875C3.52237 7.32513 4.17715 6.10013 5.13864 5.13864C6.10013 4.17715 7.32513 3.52237 8.65875 3.2571C9.99237 2.99183 11.3747 3.12798 12.6309 3.64833C13.8872 4.16868 14.9609 5.04987 15.7164 6.18045C16.4718 7.31104 16.875 8.64025 16.875 10C16.8729 11.8227 16.1479 13.5702 14.8591 14.8591C13.5702 16.1479 11.8227 16.8729 10 16.875ZM13.7688 9.47031L8.76875 6.34531C8.67416 6.2862 8.56548 6.25347 8.45398 6.25053C8.34248 6.24759 8.23223 6.27454 8.13466 6.32858C8.03709 6.38263 7.95576 6.4618 7.89911 6.55789C7.84246 6.65397 7.81256 6.76346 7.8125 6.875V13.125C7.81256 13.2365 7.84246 13.346 7.89911 13.4421C7.95576 13.5382 8.03709 13.6174 8.13466 13.6714C8.23223 13.7255 8.34248 13.7524 8.45398 13.7495C8.56548 13.7465 8.67416 13.7138 8.76875 13.6547L13.7688 10.5297C13.8585 10.4735 13.9325 10.3954 13.9838 10.3027C14.0351 10.2101 14.062 10.1059 14.062 10C14.062 9.8941 14.0351 9.78993 13.9838 9.69728C13.9325 9.60462 13.8585 9.52653 13.7688 9.47031ZM9.0625 11.9977V8.00234L12.2586 10L9.0625 11.9977Z"
        fill="currentColor"
      />
    </Icon>
  );
}

export function FolderIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <path
        d="M16.875 5.625H10.2586L8.125 3.49141C8.00935 3.37483 7.87168 3.2824 7.71999 3.2195C7.5683 3.1566 7.40562 3.12448 7.24141 3.125H3.125C2.79348 3.125 2.47554 3.2567 2.24112 3.49112C2.0067 3.72554 1.875 4.04348 1.875 4.375V15.6734C1.87541 15.992 2.00214 16.2974 2.22739 16.5226C2.45263 16.7479 2.75802 16.8746 3.07656 16.875H16.9445C17.2575 16.8746 17.5575 16.7501 17.7788 16.5288C18.0001 16.3075 18.1246 16.0075 18.125 15.6945V6.875C18.125 6.54348 17.9933 6.22554 17.7589 5.99112C17.5245 5.7567 17.2065 5.625 16.875 5.625ZM3.125 4.375H7.24141L8.49141 5.625H3.125V4.375ZM16.875 15.625H3.125V6.875H16.875V15.625Z"
        fill="currentColor"
      />
    </Icon>
  );
}

export function LinkIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <path
        d="M18.75 6.89297C18.7186 7.98098 18.2713 9.01554 17.5 9.78359L14.7852 12.5C14.3898 12.8976 13.9194 13.2128 13.4014 13.4273C12.8833 13.6419 12.3279 13.7516 11.7672 13.75H11.7633C11.193 13.7496 10.6286 13.6349 10.1034 13.4127C9.57814 13.1905 9.10279 12.8653 8.70536 12.4563C8.30794 12.0473 7.99652 11.5628 7.78949 11.0314C7.58246 10.5 7.48403 9.93256 7.5 9.3625C7.50466 9.19674 7.57498 9.03962 7.69549 8.92571C7.81599 8.81179 7.97682 8.75042 8.14258 8.75508C8.30834 8.75974 8.46546 8.83006 8.57937 8.95057C8.69328 9.07107 8.75466 9.2319 8.75 9.39766C8.73862 9.80072 8.80815 10.202 8.95447 10.5777C9.1008 10.9535 9.32096 11.2961 9.60194 11.5853C9.88292 11.8745 10.219 12.1044 10.5904 12.2616C10.9617 12.4187 11.3608 12.4997 11.7641 12.5C12.1604 12.501 12.5531 12.4234 12.9193 12.2718C13.2855 12.1201 13.6181 11.8974 13.8977 11.6164L16.6125 8.90156C17.1726 8.33438 17.4856 7.56863 17.4831 6.77149C17.4806 5.97435 17.1629 5.21057 16.5992 4.64691C16.0355 4.08324 15.2717 3.76547 14.4746 3.76298C13.6775 3.76049 12.9117 4.07347 12.3445 4.63359L11.4852 5.49297C11.367 5.60523 11.2096 5.66689 11.0467 5.66481C10.8837 5.66272 10.728 5.59705 10.6127 5.4818C10.4975 5.36655 10.4318 5.21083 10.4297 5.04786C10.4276 4.88488 10.4893 4.72754 10.6016 4.60938L11.4609 3.75C11.8574 3.35338 12.3282 3.03876 12.8463 2.82411C13.3643 2.60945 13.9197 2.49897 14.4805 2.49897C15.0413 2.49897 15.5966 2.60945 16.1147 2.82411C16.6328 3.03876 17.1035 3.35338 17.5 3.75C17.9107 4.16169 18.2333 4.65263 18.4482 5.19296C18.6631 5.73329 18.7658 6.31169 18.75 6.89297ZM8.51562 14.5047L7.65625 15.3641C7.37596 15.6462 7.04237 15.8698 6.67488 16.0219C6.30739 16.174 5.91334 16.2516 5.51562 16.25C4.91899 16.2495 4.33588 16.0722 3.83997 15.7405C3.34407 15.4087 2.95762 14.9374 2.72946 14.3861C2.50131 13.8348 2.44167 13.2283 2.5581 12.6431C2.67453 12.0579 2.96179 11.5204 3.38359 11.0984L6.09375 8.38359C6.52061 7.95448 7.06665 7.66363 7.66093 7.54882C8.25521 7.43401 8.87029 7.50055 9.42627 7.73979C9.98226 7.97903 10.4535 8.37992 10.7787 8.8904C11.1039 9.40087 11.2681 9.99734 11.25 10.6023C11.2453 10.7681 11.3067 10.9289 11.4206 11.0494C11.5345 11.1699 11.6917 11.2403 11.8574 11.2449C12.0232 11.2496 12.184 11.1882 12.3045 11.0743C12.425 10.9604 12.4953 10.8033 12.5 10.6375C12.515 10.0571 12.4119 9.47977 12.1971 8.94043C11.9822 8.4011 11.66 7.91105 11.25 7.5C10.4494 6.69971 9.36367 6.25014 8.23164 6.25014C7.09961 6.25014 6.01392 6.69971 5.21328 7.5L2.5 10.2148C1.90331 10.8113 1.49681 11.5712 1.33188 12.3986C1.16696 13.2261 1.251 14.0838 1.5734 14.8634C1.8958 15.6431 2.44207 16.3097 3.1432 16.779C3.84432 17.2482 4.66882 17.4992 5.5125 17.5C6.07334 17.5016 6.62892 17.392 7.14709 17.1774C7.66527 16.9628 8.13573 16.6476 8.53125 16.25L9.39062 15.3906C9.49177 15.2715 9.54461 15.1188 9.53873 14.9626C9.53285 14.8064 9.46867 14.6581 9.35885 14.5469C9.24903 14.4357 9.10154 14.3697 8.94545 14.3619C8.78936 14.3541 8.63601 14.405 8.51562 14.5047Z"
        fill="currentColor"
      />
    </Icon>
  );
}

export function UsersIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <path
        d="M19.125 11.75C19.0593 11.7992 18.9846 11.8351 18.9051 11.8554C18.8256 11.8758 18.7429 11.8803 18.6616 11.8687C18.5804 11.8571 18.5022 11.8296 18.4316 11.7878C18.3609 11.746 18.2992 11.6907 18.25 11.625C17.8733 11.1186 17.383 10.7078 16.8185 10.4256C16.254 10.1433 15.6311 9.99755 15 10C14.8771 9.99999 14.7569 9.96374 14.6545 9.89579C14.5521 9.82784 14.472 9.73121 14.4242 9.61797C14.3918 9.54107 14.3751 9.45846 14.3751 9.375C14.3751 9.29154 14.3918 9.20893 14.4242 9.13203C14.472 9.0188 14.5521 8.92216 14.6545 8.85421C14.7569 8.78626 14.8771 8.75001 15 8.75C15.3507 8.74997 15.6943 8.65159 15.9919 8.46605C16.2895 8.2805 16.529 8.01522 16.6834 7.70034C16.8378 7.38547 16.9007 7.03361 16.8652 6.68474C16.8296 6.33586 16.6969 6.00397 16.4821 5.72674C16.2673 5.44951 15.9791 5.23806 15.6502 5.11642C15.3213 4.99477 14.9649 4.96781 14.6214 5.03858C14.278 5.10935 13.9612 5.27503 13.7072 5.51679C13.4532 5.75855 13.272 6.0667 13.1844 6.40625C13.1639 6.48576 13.1279 6.56045 13.0785 6.62606C13.0291 6.69167 12.9673 6.7469 12.8966 6.78862C12.8258 6.83033 12.7476 6.8577 12.6663 6.86917C12.5849 6.88064 12.5022 6.87599 12.4227 6.85547C12.3431 6.83495 12.2685 6.79897 12.2028 6.74959C12.1372 6.7002 12.082 6.63838 12.0403 6.56765C11.9986 6.49691 11.9712 6.41866 11.9597 6.33735C11.9483 6.25604 11.9529 6.17326 11.9734 6.09375C12.0951 5.6229 12.325 5.18695 12.6448 4.82059C12.9647 4.45422 13.3656 4.16756 13.8157 3.9834C14.2658 3.79924 14.7526 3.72267 15.2375 3.75979C15.7224 3.79691 16.192 3.94668 16.6088 4.1972C17.0256 4.44771 17.3782 4.79206 17.6386 5.20283C17.8989 5.6136 18.0598 6.07946 18.1084 6.56334C18.157 7.04722 18.092 7.53577 17.9186 7.99012C17.7451 8.44446 17.468 8.85205 17.1094 9.18047C17.9592 9.54844 18.698 10.1324 19.2523 10.8742C19.3016 10.94 19.3374 11.0149 19.3576 11.0946C19.3779 11.1743 19.3822 11.2572 19.3704 11.3385C19.3585 11.4199 19.3308 11.4981 19.2887 11.5687C19.2466 11.6393 19.1909 11.7009 19.125 11.75ZM14.9156 16.5625C14.9608 16.6336 14.9912 16.7132 15.0049 16.7964C15.0186 16.8795 15.0153 16.9646 14.9952 17.0465C14.9752 17.1284 14.9388 17.2053 14.8882 17.2728C14.8376 17.3402 14.7739 17.3967 14.701 17.4389C14.628 17.4811 14.5472 17.5081 14.4635 17.5182C14.3799 17.5284 14.295 17.5215 14.214 17.498C14.1331 17.4746 14.0577 17.4349 13.9925 17.3816C13.9272 17.3282 13.8734 17.2622 13.8344 17.1875C13.4407 16.5208 12.8799 15.9683 12.2075 15.5845C11.5351 15.2007 10.7742 14.9989 10 14.9989C9.22576 14.9989 8.46489 15.2007 7.79248 15.5845C7.12007 15.9683 6.55934 16.5208 6.16562 17.1875C6.12655 17.2622 6.07278 17.3282 6.00753 17.3816C5.94228 17.4349 5.86692 17.4746 5.78596 17.498C5.70501 17.5215 5.62014 17.5284 5.53646 17.5182C5.45278 17.5081 5.37202 17.4811 5.29904 17.4389C5.22607 17.3967 5.16237 17.3402 5.1118 17.2728C5.06123 17.2053 5.02482 17.1284 5.00477 17.0465C4.98471 16.9646 4.98143 16.8795 4.99511 16.7964C5.00879 16.7132 5.03915 16.6336 5.08437 16.5625C5.69031 15.5214 6.61421 14.7021 7.72031 14.225C7.09791 13.7485 6.64049 13.0889 6.41234 12.3389C6.1842 11.589 6.1968 10.7864 6.44837 10.044C6.69994 9.30158 7.17785 8.65666 7.8149 8.1999C8.45195 7.74314 9.21612 7.4975 10 7.4975C10.7839 7.4975 11.5481 7.74314 12.1851 8.1999C12.8222 8.65666 13.3001 9.30158 13.5516 10.044C13.8032 10.7864 13.8158 11.589 13.5877 12.3389C13.3595 13.0889 12.9021 13.7485 12.2797 14.225C13.3858 14.7021 14.3097 15.5214 14.9156 16.5625ZM10 13.75C10.4945 13.75 10.9778 13.6034 11.3889 13.3287C11.8 13.054 12.1205 12.6635 12.3097 12.2067C12.4989 11.7499 12.5484 11.2472 12.452 10.7623C12.3555 10.2773 12.1174 9.83186 11.7678 9.48223C11.4181 9.1326 10.9727 8.8945 10.4877 8.79804C10.0028 8.70157 9.50011 8.75108 9.04329 8.9403C8.58648 9.12952 8.19603 9.44995 7.92133 9.86107C7.64662 10.2722 7.5 10.7555 7.5 11.25C7.5 11.913 7.76339 12.5489 8.23223 13.0178C8.70107 13.4866 9.33696 13.75 10 13.75ZM5.625 9.375C5.625 9.20924 5.55915 9.05027 5.44194 8.93306C5.32473 8.81585 5.16576 8.75 5 8.75C4.64932 8.74997 4.30567 8.65159 4.0081 8.46605C3.71053 8.2805 3.47095 8.01522 3.31659 7.70034C3.16222 7.38547 3.09926 7.03361 3.13484 6.68474C3.17043 6.33586 3.30314 6.00397 3.5179 5.72674C3.73266 5.44951 4.02086 5.23806 4.34976 5.11642C4.67867 4.99477 5.0351 4.96781 5.37857 5.03858C5.72203 5.10935 6.03877 5.27503 6.29279 5.51679C6.54682 5.75855 6.72795 6.0667 6.81562 6.40625C6.85706 6.56683 6.9606 6.70437 7.10345 6.78862C7.2463 6.87286 7.41676 6.89691 7.57734 6.85547C7.73792 6.81403 7.87546 6.7105 7.95971 6.56765C8.04395 6.4248 8.068 6.25433 8.02656 6.09375C7.90488 5.6229 7.67498 5.18695 7.35516 4.82059C7.03535 4.45422 6.63444 4.16756 6.18434 3.9834C5.73424 3.79924 5.24737 3.72267 4.76247 3.75979C4.27757 3.79691 3.80802 3.94668 3.39119 4.1972C2.97436 4.44771 2.62175 4.79206 2.36142 5.20283C2.10109 5.6136 1.94022 6.07946 1.89162 6.56334C1.84301 7.04722 1.90801 7.53577 2.08144 7.99012C2.25487 8.44446 2.53195 8.85205 2.89062 9.18047C2.04163 9.54878 1.30368 10.1327 0.75 10.8742C0.65044 11.0068 0.607637 11.1736 0.631005 11.3377C0.654374 11.5019 0.742001 11.6501 0.874609 11.7496C1.00722 11.8492 1.17394 11.892 1.33811 11.8686C1.50228 11.8452 1.65044 11.7576 1.75 11.625C2.12671 11.1186 2.61704 10.7078 3.18153 10.4256C3.74602 10.1433 4.36889 9.99755 5 10C5.16576 10 5.32473 9.93415 5.44194 9.81694C5.55915 9.69973 5.625 9.54076 5.625 9.375Z"
        fill="currentColor"
      />
    </Icon>
  );
}

export function GearIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <g id="Gear">
        <path
          id="Vector"
          d="M10 6.25C9.25832 6.25 8.5333 6.46993 7.91661 6.88199C7.29993 7.29405 6.81928 7.87972 6.53545 8.56494C6.25162 9.25016 6.17736 10.0042 6.32206 10.7316C6.46675 11.459 6.8239 12.1272 7.34835 12.6517C7.8728 13.1761 8.54098 13.5333 9.26841 13.6779C9.99584 13.8226 10.7498 13.7484 11.4351 13.4645C12.1203 13.1807 12.706 12.7001 13.118 12.0834C13.5301 11.4667 13.75 10.7417 13.75 10C13.749 9.00576 13.3535 8.05253 12.6505 7.34949C11.9475 6.64646 10.9942 6.25103 10 6.25ZM10 12.5C9.50555 12.5 9.0222 12.3534 8.61108 12.0787C8.19995 11.804 7.87952 11.4135 7.6903 10.9567C7.50108 10.4999 7.45157 9.99723 7.54804 9.51228C7.6445 9.02732 7.8826 8.58187 8.23223 8.23223C8.58187 7.8826 9.02732 7.6445 9.51228 7.54804C9.99723 7.45157 10.4999 7.50108 10.9567 7.6903C11.4135 7.87952 11.804 8.19995 12.0787 8.61108C12.3534 9.0222 12.5 9.50555 12.5 10C12.5 10.663 12.2366 11.2989 11.7678 11.7678C11.2989 12.2366 10.663 12.5 10 12.5ZM16.875 10.1688C16.8781 10.0563 16.8781 9.94375 16.875 9.83125L18.0406 8.375C18.1017 8.29854 18.1441 8.20879 18.1641 8.11299C18.1842 8.01719 18.1815 7.91801 18.1563 7.82344C17.9652 7.10516 17.6793 6.41551 17.3063 5.77266C17.2574 5.68853 17.1896 5.61697 17.1082 5.56367C17.0268 5.51036 16.9341 5.47679 16.8375 5.46563L14.9844 5.25938C14.9073 5.17813 14.8292 5.1 14.75 5.025L14.5313 3.16719C14.52 3.07048 14.4863 2.97774 14.4329 2.89635C14.3794 2.81497 14.3077 2.7472 14.2234 2.69844C13.5803 2.32605 12.8908 2.0405 12.1727 1.84922C12.078 1.82406 11.9788 1.82149 11.883 1.84171C11.7872 1.86193 11.6975 1.90437 11.6211 1.96563L10.1688 3.125C10.0563 3.125 9.94375 3.125 9.83125 3.125L8.375 1.96172C8.29854 1.9006 8.20879 1.8583 8.11299 1.83821C8.01719 1.81813 7.91801 1.82083 7.82344 1.84609C7.10527 2.03752 6.41567 2.32335 5.77266 2.69609C5.68853 2.74494 5.61697 2.81275 5.56367 2.89413C5.51036 2.97551 5.47679 3.06821 5.46563 3.16484L5.25938 5.02109C5.17813 5.0987 5.1 5.17682 5.025 5.25547L3.16719 5.46875C3.07048 5.48 2.97774 5.51369 2.89635 5.56713C2.81497 5.62057 2.7472 5.69229 2.69844 5.77656C2.32605 6.41966 2.0405 7.10925 1.84922 7.82734C1.82406 7.92197 1.82149 8.02119 1.84171 8.11699C1.86193 8.2128 1.90437 8.30252 1.96563 8.37891L3.125 9.83125C3.125 9.94375 3.125 10.0563 3.125 10.1688L1.96172 11.625C1.9006 11.7015 1.8583 11.7912 1.83821 11.887C1.81813 11.9828 1.82083 12.082 1.84609 12.1766C2.03718 12.8948 2.32302 13.5845 2.69609 14.2273C2.74494 14.3115 2.81275 14.383 2.89413 14.4363C2.97551 14.4896 3.06821 14.5232 3.16484 14.5344L5.01797 14.7406C5.09557 14.8219 5.1737 14.9 5.25234 14.975L5.46875 16.8328C5.48 16.9295 5.51369 17.0223 5.56713 17.1036C5.62057 17.185 5.69229 17.2528 5.77656 17.3016C6.41966 17.674 7.10925 17.9595 7.82734 18.1508C7.92197 18.1759 8.02119 18.1785 8.11699 18.1583C8.2128 18.1381 8.30252 18.0956 8.37891 18.0344L9.83125 16.875C9.94375 16.8781 10.0563 16.8781 10.1688 16.875L11.625 18.0406C11.7015 18.1017 11.7912 18.1441 11.887 18.1641C11.9828 18.1842 12.082 18.1815 12.1766 18.1563C12.8948 17.9652 13.5845 17.6793 14.2273 17.3063C14.3115 17.2574 14.383 17.1896 14.4363 17.1082C14.4896 17.0268 14.5232 16.9341 14.5344 16.8375L14.7406 14.9844C14.8219 14.9073 14.9 14.8292 14.975 14.75L16.8328 14.5313C16.9295 14.52 17.0223 14.4863 17.1036 14.4329C17.185 14.3794 17.2528 14.3077 17.3016 14.2234C17.674 13.5803 17.9595 12.8908 18.1508 12.1727C18.1759 12.078 18.1785 11.9788 18.1583 11.883C18.1381 11.7872 18.0956 11.6975 18.0344 11.6211L16.875 10.1688ZM15.6172 9.66094C15.6305 9.88679 15.6305 10.1132 15.6172 10.3391C15.6079 10.4937 15.6563 10.6463 15.7531 10.7672L16.8617 12.1523C16.7345 12.5566 16.5716 12.9488 16.375 13.3242L14.6094 13.5242C14.4556 13.5413 14.3136 13.6148 14.2109 13.7305C14.0606 13.8996 13.9004 14.0598 13.7313 14.2102C13.6156 14.3129 13.5421 14.4548 13.525 14.6086L13.3289 16.3727C12.9535 16.5694 12.5613 16.7323 12.157 16.8594L10.7711 15.7508C10.6602 15.6622 10.5224 15.614 10.3805 15.6141H10.343C10.1171 15.6273 9.89069 15.6273 9.66484 15.6141C9.51022 15.6048 9.35765 15.6532 9.23672 15.75L7.84766 16.8594C7.44339 16.7322 7.05122 16.5693 6.67578 16.3727L6.47578 14.6094C6.45871 14.4556 6.38523 14.3136 6.26953 14.2109C6.1004 14.0606 5.94023 13.9004 5.78984 13.7313C5.68714 13.6156 5.54517 13.5421 5.39141 13.525L3.62734 13.3281C3.43062 12.9527 3.26774 12.5606 3.14063 12.1563L4.24922 10.7703C4.34602 10.6494 4.39446 10.4968 4.38516 10.3422C4.37188 10.1163 4.37188 9.88991 4.38516 9.66406C4.39446 9.50944 4.34602 9.35687 4.24922 9.23594L3.14063 7.84766C3.26783 7.44339 3.43071 7.05122 3.62734 6.67578L5.39063 6.47578C5.54439 6.45871 5.68635 6.38523 5.78906 6.26953C5.93945 6.1004 6.09962 5.94023 6.26875 5.78984C6.3849 5.68707 6.4587 5.54478 6.47578 5.39063L6.67188 3.62734C7.04727 3.43062 7.43944 3.26774 7.84375 3.14063L9.22969 4.24922C9.35062 4.34602 9.50319 4.39446 9.65781 4.38516C9.88366 4.37188 10.1101 4.37188 10.3359 4.38516C10.4906 4.39446 10.6431 4.34602 10.7641 4.24922L12.1523 3.14063C12.5566 3.26783 12.9488 3.43071 13.3242 3.62734L13.5242 5.39063C13.5413 5.54439 13.6148 5.68635 13.7305 5.78906C13.8996 5.93945 14.0598 6.09962 14.2102 6.26875C14.3129 6.38444 14.4548 6.45793 14.6086 6.475L16.3727 6.67109C16.5694 7.04649 16.7323 7.43866 16.8594 7.84297L15.7508 9.22891C15.653 9.35086 15.6045 9.505 15.6148 9.66094H15.6172Z"
          fill="currentColor"
        />
      </g>
    </Icon>
  );
}

export function QuestionIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <path
        d="M10.9375 14.0625C10.9375 14.2479 10.8825 14.4292 10.7795 14.5833C10.6765 14.7375 10.5301 14.8577 10.3588 14.9286C10.1875 14.9996 9.99896 15.0182 9.8171 14.982C9.63525 14.9458 9.4682 14.8565 9.33709 14.7254C9.20598 14.5943 9.11669 14.4273 9.08051 14.2454C9.04434 14.0635 9.06291 13.875 9.13386 13.7037C9.20482 13.5324 9.32498 13.386 9.47915 13.283C9.63332 13.18 9.81458 13.125 10 13.125C10.2486 13.125 10.4871 13.2238 10.6629 13.3996C10.8387 13.5754 10.9375 13.8139 10.9375 14.0625ZM10 5.625C8.27656 5.625 6.875 6.88672 6.875 8.4375V8.75C6.875 8.91576 6.94085 9.07473 7.05806 9.19194C7.17527 9.30915 7.33424 9.375 7.5 9.375C7.66576 9.375 7.82473 9.30915 7.94194 9.19194C8.05915 9.07473 8.125 8.91576 8.125 8.75V8.4375C8.125 7.57812 8.96641 6.875 10 6.875C11.0336 6.875 11.875 7.57812 11.875 8.4375C11.875 9.29688 11.0336 10 10 10C9.83424 10 9.67527 10.0658 9.55806 10.1831C9.44085 10.3003 9.375 10.4592 9.375 10.625V11.25C9.375 11.4158 9.44085 11.5747 9.55806 11.6919C9.67527 11.8092 9.83424 11.875 10 11.875C10.1658 11.875 10.3247 11.8092 10.4419 11.6919C10.5592 11.5747 10.625 11.4158 10.625 11.25V11.1937C12.05 10.932 13.125 9.79531 13.125 8.4375C13.125 6.88672 11.7234 5.625 10 5.625ZM18.125 10C18.125 11.607 17.6485 13.1779 16.7557 14.514C15.8629 15.8502 14.594 16.8916 13.1093 17.5065C11.6247 18.1215 9.99099 18.2824 8.41489 17.9689C6.8388 17.6554 5.39106 16.8815 4.25476 15.7452C3.11846 14.6089 2.34462 13.1612 2.03112 11.5851C1.71761 10.009 1.87852 8.37535 2.49348 6.8907C3.10844 5.40605 4.14984 4.1371 5.48599 3.24431C6.82214 2.35152 8.39303 1.875 10 1.875C12.1542 1.87727 14.2195 2.73403 15.7427 4.25727C17.266 5.78051 18.1227 7.84581 18.125 10ZM16.875 10C16.875 8.64025 16.4718 7.31104 15.7164 6.18045C14.9609 5.04987 13.8872 4.16868 12.6309 3.64833C11.3747 3.12798 9.99237 2.99183 8.65875 3.2571C7.32513 3.52237 6.10013 4.17715 5.13864 5.13864C4.17715 6.10013 3.52237 7.32513 3.2571 8.65875C2.99183 9.99237 3.12798 11.3747 3.64833 12.6309C4.16868 13.8872 5.04987 14.9609 6.18045 15.7164C7.31104 16.4718 8.64025 16.875 10 16.875C11.8227 16.8729 13.5702 16.1479 14.8591 14.8591C16.1479 13.5702 16.8729 11.8227 16.875 10Z"
        fill="currentColor"
      />
    </Icon>
  );
}

type ToggleIconProps = IconProps & {
  pressed?: boolean;
};

export function ToggleIcon({
  className,
  pressed = false,
  ...props
}: ToggleIconProps) {
  return (
    <Icon className={className} {...props}>
      <path
        fillRule="evenodd"
        clipRule="evenodd"
        d="M13.75 4.375H6.25C4.75816 4.375 3.32742 4.96763 2.27252 6.02252C1.21763 7.07742 0.625 8.50816 0.625 10C0.625 11.4918 1.21763 12.9226 2.27252 13.9775C3.32742 15.0324 4.75816 15.625 6.25 15.625H13.75C15.2418 15.625 16.6726 15.0324 17.7275 13.9775C18.7824 12.9226 19.375 11.4918 19.375 10C19.375 8.50816 18.7824 7.07742 17.7275 6.02252C16.6726 4.96763 15.2418 4.375 13.75 4.375ZM13.75 14.375H6.25C5.08968 14.375 3.97688 13.9141 3.15641 13.0936C2.33594 12.2731 1.875 11.1603 1.875 10C1.875 8.83968 2.33594 7.72688 3.15641 6.90641C3.97688 6.08594 5.08968 5.625 6.25 5.625H13.75C14.9103 5.625 16.0231 6.08594 16.8436 6.90641C17.6641 7.72688 18.125 8.83968 18.125 10C18.125 11.1603 17.6641 12.2731 16.8436 13.0936C16.0231 13.9141 14.9103 14.375 13.75 14.375Z"
        fill="currentColor"
      />
      <g
        className={cn(
          "origin-center transition-transform duration-200 ease-linear",
          pressed ? "translate-x-0" : "-translate-x-2",
        )}
      >
        <path
          d="M13.75 6.875C13.1319 6.875 12.5277 7.05828 12.0138 7.40166C11.4999 7.74504 11.0994 8.2331 10.8629 8.80411C10.6264 9.37513 10.5645 10.0035 10.685 10.6097C10.8056 11.2158 11.1033 11.7727 11.5403 12.2097C11.9773 12.6467 12.5342 12.9444 13.1403 13.065C13.7465 13.1855 14.3749 13.1236 14.9459 12.8871C15.5169 12.6506 16.005 12.2501 16.3483 11.7362C16.6917 11.2223 16.875 10.6181 16.875 10C16.875 9.1712 16.5458 8.37634 15.9597 7.79029C15.3737 7.20424 14.5788 6.875 13.75 6.875ZM13.75 11.875C13.3792 11.875 13.0166 11.765 12.7083 11.559C12.4 11.353 12.1596 11.0601 12.0177 10.7175C11.8758 10.3749 11.8387 9.99792 11.911 9.63421C11.9834 9.27049 12.162 8.9364 12.4242 8.67417C12.6864 8.41195 13.0205 8.23337 13.3842 8.16103C13.7479 8.08868 14.1249 8.12581 14.4675 8.26773C14.8101 8.40964 15.103 8.64996 15.309 8.95831C15.515 9.26665 15.625 9.62916 15.625 10C15.625 10.4973 15.4275 10.9742 15.0758 11.3258C14.7242 11.6775 14.2473 11.875 13.75 11.875Z"
          fill="currentColor"
        />
      </g>
    </Icon>
  );
}

export function UserIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <path
        d="M18.0406 16.5625C16.8508 14.5055 15.0172 13.0305 12.8773 12.3312C13.9358 11.7011 14.7582 10.741 15.2181 9.59828C15.6781 8.45556 15.7502 7.19344 15.4235 6.00575C15.0967 4.81806 14.3891 3.77046 13.4094 3.02385C12.4296 2.27723 11.2318 1.87287 10 1.87287C8.76818 1.87287 7.57041 2.27723 6.59064 3.02385C5.61088 3.77046 4.90328 4.81806 4.57652 6.00575C4.24975 7.19344 4.3219 8.45556 4.78186 9.59828C5.24183 10.741 6.06419 11.7011 7.12266 12.3312C4.98281 13.0297 3.14922 14.5047 1.95937 16.5625C1.91574 16.6336 1.8868 16.7128 1.87426 16.7953C1.86171 16.8778 1.86583 16.962 1.88635 17.0429C1.90687 17.1238 1.94339 17.1998 1.99374 17.2664C2.0441 17.3329 2.10728 17.3887 2.17955 17.4305C2.25182 17.4722 2.33172 17.499 2.41454 17.5094C2.49735 17.5198 2.5814 17.5135 2.66174 17.4908C2.74207 17.4682 2.81705 17.4297 2.88226 17.3776C2.94746 17.3255 3.00158 17.2608 3.04141 17.1875C4.51328 14.6438 7.11484 13.125 10 13.125C12.8852 13.125 15.4867 14.6438 16.9586 17.1875C16.9984 17.2608 17.0525 17.3255 17.1177 17.3776C17.183 17.4297 17.2579 17.4682 17.3383 17.4908C17.4186 17.5135 17.5026 17.5198 17.5855 17.5094C17.6683 17.499 17.7482 17.4722 17.8204 17.4305C17.8927 17.3887 17.9559 17.3329 18.0063 17.2664C18.0566 17.1998 18.0931 17.1238 18.1137 17.0429C18.1342 16.962 18.1383 16.8778 18.1257 16.7953C18.1132 16.7128 18.0843 16.6336 18.0406 16.5625ZM5.625 7.5C5.625 6.63471 5.88159 5.78885 6.36232 5.06938C6.84305 4.34992 7.52633 3.78916 8.32576 3.45803C9.12519 3.12689 10.0049 3.04025 10.8535 3.20906C11.7022 3.37787 12.4817 3.79455 13.0936 4.40641C13.7054 5.01826 14.1221 5.79781 14.2909 6.64648C14.4597 7.49515 14.3731 8.37481 14.042 9.17424C13.7108 9.97367 13.1501 10.6569 12.4306 11.1377C11.7112 11.6184 10.8653 11.875 10 11.875C8.84006 11.8738 7.72798 11.4124 6.90778 10.5922C6.08758 9.77202 5.62624 8.65994 5.625 7.5Z"
        fill="currentColor"
      />
    </Icon>
  );
}

export function SearchIcon({ className, ...props }: IconProps) {
  return (
    <svg
      viewBox="0 0 15 15"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn("size-3.5", className)}
      {...props}
    >
      <path
        d="M10.5376 10.5376C11.0716 10.0036 11.4953 9.36959 11.7843 8.67184C12.0733 7.9741 12.222 7.22626 12.222 6.47102C12.222 5.71579 12.0733 4.96795 11.7843 4.2702C11.4953 3.57245 11.0716 2.93847 10.5376 2.40444C10.0036 1.8704 9.36959 1.44679 8.67184 1.15777C7.9741 0.868754 7.22626 0.72 6.47102 0.72C5.71579 0.72 4.96795 0.868754 4.2702 1.15777C3.57245 1.44679 2.93847 1.8704 2.40443 2.40444C1.32591 3.48296 0.72 4.94576 0.72 6.47102C0.72 7.99629 1.32591 9.45908 2.40443 10.5376C3.48296 11.6161 4.94576 12.222 6.47102 12.222C7.99629 12.222 9.45908 11.6161 10.5376 10.5376ZM10.5376 10.5376L14.1599 14.1599"
        stroke="currentColor"
        strokeWidth="1.44"
        strokeLinecap="round"
        strokeLinejoin="round"
      />
    </svg>
  );
}

export function CommandIcon({ className, ...props }: IconProps) {
  return (
    <svg
      viewBox="0 0 11 11"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn("size-2.75", className)}
      {...props}
    >
      <path
        fillRule="evenodd"
        clipRule="evenodd"
        d="M2.27366 0C1.67065 0 1.09233 0.239546 0.66594 0.66594C0.239546 1.09233 0 1.67065 0 2.27366C0 2.87667 0.239546 3.45499 0.66594 3.88138C1.09233 4.30778 1.67065 4.54732 2.27366 4.54732H3.18312C3.30373 4.54732 3.41939 4.59523 3.50467 4.68051C3.58995 4.76579 3.63786 4.88145 3.63786 5.00205V5.91152C3.63786 6.03212 3.58995 6.14778 3.50467 6.23306C3.41939 6.31834 3.30373 6.36625 3.18312 6.36625H2.27366C1.67065 6.36625 1.09233 6.60579 0.66594 7.03219C0.239546 7.45858 0 8.0369 0 8.63991C0 9.24292 0.239546 9.82124 0.66594 10.2476C1.09233 10.674 1.67065 10.9136 2.27366 10.9136C2.57224 10.9136 2.8679 10.8548 3.14375 10.7405C3.41961 10.6262 3.67025 10.4588 3.88138 10.2476C4.09251 10.0365 4.25999 9.78586 4.37425 9.51C4.48851 9.23415 4.54732 8.93849 4.54732 8.63991V7.73045C4.54732 7.60984 4.59523 7.49418 4.68051 7.4089C4.76579 7.32362 4.88145 7.27571 5.00205 7.27571H5.91152C6.03212 7.27571 6.14778 7.32362 6.23306 7.4089C6.31834 7.49418 6.36625 7.60984 6.36625 7.73045V8.63991C6.36625 9.24292 6.60579 9.82124 7.03219 10.2476C7.45858 10.674 8.0369 10.9136 8.63991 10.9136C9.24292 10.9136 9.82124 10.674 10.2476 10.2476C10.674 9.82124 10.9136 9.24292 10.9136 8.63991C10.9136 8.0369 10.674 7.45858 10.2476 7.03219C9.82124 6.60579 9.24292 6.36625 8.63991 6.36625H7.73045C7.60984 6.36625 7.49418 6.31834 7.4089 6.23306C7.32362 6.14778 7.27571 6.03212 7.27571 5.91152V5.00205C7.27571 4.88145 7.32362 4.76579 7.4089 4.68051C7.49418 4.59523 7.60984 4.54732 7.73045 4.54732H8.63991C9.24292 4.54732 9.82124 4.30778 10.2476 3.88138C10.674 3.45499 10.9136 2.87667 10.9136 2.27366C10.9136 1.67065 10.674 1.09233 10.2476 0.66594C9.82124 0.239546 9.24292 0 8.63991 0C8.0369 0 7.45858 0.239546 7.03219 0.66594C6.60579 1.09233 6.36625 1.67065 6.36625 2.27366V3.18312C6.36625 3.30373 6.31834 3.41939 6.23306 3.50467C6.14778 3.58995 6.03212 3.63786 5.91152 3.63786H5.00205C4.88145 3.63786 4.76579 3.58995 4.68051 3.50467C4.59523 3.41939 4.54732 3.30373 4.54732 3.18312V2.27366C4.54732 1.97508 4.48851 1.67942 4.37425 1.40357C4.25999 1.12771 4.09251 0.877069 3.88138 0.66594C3.67025 0.454811 3.41961 0.287334 3.14375 0.173072C2.8679 0.05881 2.57224 0 2.27366 0ZM6.36625 5.00205C6.36625 4.88145 6.31834 4.76579 6.23306 4.68051C6.14778 4.59523 6.03212 4.54732 5.91152 4.54732H5.00205C4.88145 4.54732 4.76579 4.59523 4.68051 4.68051C4.59523 4.76579 4.54732 4.88145 4.54732 5.00205V5.91152C4.54732 6.03212 4.59523 6.14778 4.68051 6.23306C4.76579 6.31834 4.88145 6.36625 5.00205 6.36625H5.91152C6.03212 6.36625 6.14778 6.31834 6.23306 6.23306C6.31834 6.14778 6.36625 6.03212 6.36625 5.91152V5.00205ZM3.63786 2.27366V3.18312C3.63786 3.30373 3.58995 3.41939 3.50467 3.50467C3.41939 3.58995 3.30373 3.63786 3.18312 3.63786H2.27366C2.00385 3.63786 1.74009 3.55785 1.51575 3.40795C1.29141 3.25805 1.11656 3.04499 1.01331 2.79572C0.910055 2.54644 0.883039 2.27215 0.935677 2.00752C0.988315 1.74289 1.11824 1.49981 1.30903 1.30903C1.49981 1.11824 1.74289 0.988315 2.00752 0.935677C2.27215 0.883039 2.54644 0.910055 2.79572 1.01331C3.04499 1.11656 3.25805 1.29141 3.40795 1.51575C3.55785 1.74009 3.63786 2.00385 3.63786 2.27366ZM8.63991 3.63786H7.73045C7.60984 3.63786 7.49418 3.58995 7.4089 3.50467C7.32362 3.41939 7.27571 3.30373 7.27571 3.18312V2.27366C7.27571 2.00385 7.35572 1.74009 7.50562 1.51575C7.65552 1.29141 7.86858 1.11656 8.11785 1.01331C8.36713 0.910055 8.64142 0.883039 8.90605 0.935677C9.17068 0.988315 9.41376 1.11824 9.60454 1.30903C9.79533 1.49981 9.92526 1.74289 9.97789 2.00752C10.0305 2.27215 10.0035 2.54644 9.90026 2.79572C9.79701 3.04499 9.62216 3.25805 9.39782 3.40795C9.17348 3.55785 8.90972 3.63786 8.63991 3.63786ZM3.63786 8.63991V7.73045C3.63786 7.60984 3.58995 7.49418 3.50467 7.4089C3.41939 7.32362 3.30373 7.27571 3.18312 7.27571H2.27366C2.00385 7.27571 1.74009 7.35572 1.51575 7.50562C1.29141 7.65552 1.11656 7.86858 1.01331 8.11785C0.910055 8.36713 0.883039 8.64142 0.935677 8.90605C0.988315 9.17068 1.11824 9.41376 1.30903 9.60454C1.49981 9.79533 1.74289 9.92526 2.00752 9.97789C2.27215 10.0305 2.54644 10.0035 2.79572 9.90026C3.04499 9.79701 3.25805 9.62216 3.40795 9.39782C3.55785 9.17348 3.63786 8.90972 3.63786 8.63991ZM8.63991 7.27571H7.73045C7.60984 7.27571 7.49418 7.32362 7.4089 7.4089C7.32362 7.49418 7.27571 7.60984 7.27571 7.73045V8.63991C7.27571 8.90972 7.35572 9.17348 7.50562 9.39782C7.65552 9.62216 7.86858 9.79701 8.11785 9.90026C8.36713 10.0035 8.64142 10.0305 8.90605 9.97789C9.17068 9.92526 9.41376 9.79533 9.60454 9.60454C9.79533 9.41376 9.92526 9.17068 9.97789 8.90605C10.0305 8.64142 10.0035 8.36713 9.90026 8.11785C9.79701 7.86858 9.62216 7.65552 9.39782 7.50562C9.17348 7.35572 8.90972 7.27571 8.63991 7.27571Z"
        fill="currentColor"
      />
    </svg>
  );
}

export function BellIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <g transform="translate(2.503 1.875)">
        <path
          d="M1.87124 6.25C1.87124 4.75816 2.46387 3.32742 3.51876 2.27252C4.57366 1.21763 6.0044 0.625 7.49624 0.625C8.98808 0.625 10.4188 1.21763 11.4737 2.27252C12.5286 3.32742 13.1212 4.75816 13.1212 6.25C13.1212 9.04844 13.7697 11.2969 14.2853 12.1875C14.3401 12.2824 14.3689 12.3899 14.369 12.4995C14.3691 12.609 14.3404 12.7166 14.2859 12.8115C14.2313 12.9065 14.1527 12.9854 14.058 13.0404C13.9633 13.0955 13.8558 13.1246 13.7462 13.125H1.24624C1.13685 13.1243 1.02955 13.095 0.935058 13.0399C0.840569 12.9847 0.762204 12.9058 0.707793 12.8109C0.653383 12.716 0.624835 12.6085 0.625001 12.4991C0.625167 12.3897 0.654042 12.2822 0.70874 12.1875C1.22358 11.2969 1.87124 9.04766 1.87124 6.25Z"
          stroke="currentColor"
          strokeWidth="1.25"
          strokeLinecap="round"
          strokeLinejoin="round"
        />
      </g>
      <g transform="translate(6.875 15)">
        <path
          d="M0.625 0.625C0.625 1.28804 0.888392 1.92393 1.35723 2.39277C1.82607 2.86161 2.46196 3.125 3.125 3.125C3.78804 3.125 4.42393 2.86161 4.89277 2.39277C5.36161 1.92393 5.625 1.28804 5.625 0.625"
          stroke="currentColor"
          strokeWidth="1.25"
          strokeLinecap="round"
          strokeLinejoin="round"
        />
      </g>
    </Icon>
  );
}

export function CaretDownIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <g id="CaretDown">
        <path
          id="Vector"
          d="M16.6922 7.94219L10.4422 14.1922C10.3841 14.2503 10.3152 14.2964 10.2393 14.3279C10.1635 14.3593 10.0821 14.3755 10 14.3755C9.91787 14.3755 9.83654 14.3593 9.76066 14.3279C9.68479 14.2964 9.61586 14.2503 9.55781 14.1922L3.30781 7.94219C3.19054 7.82491 3.12465 7.66585 3.12465 7.5C3.12465 7.33415 3.19054 7.17509 3.30781 7.05781C3.42509 6.94054 3.58415 6.87465 3.75 6.87465C3.91585 6.87465 4.07491 6.94054 4.19219 7.05781L10 12.8664L15.8078 7.05781C15.8659 6.99974 15.9348 6.95368 16.0107 6.92225C16.0866 6.89083 16.1679 6.87465 16.25 6.87465C16.3321 6.87465 16.4134 6.89083 16.4893 6.92225C16.5652 6.95368 16.6341 6.99974 16.6922 7.05781C16.7503 7.11588 16.7963 7.18482 16.8277 7.26069C16.8592 7.33656 16.8753 7.41788 16.8753 7.5C16.8753 7.58212 16.8592 7.66344 16.8277 7.73931C16.7963 7.81518 16.7503 7.88412 16.6922 7.94219Z"
          fill="currentColor"
        />
      </g>
    </Icon>
  );
}

export function CloseIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <path
        d="M5 5L15 15M15 5L5 15"
        stroke="currentColor"
        strokeWidth="1.5"
        strokeLinecap="round"
      />
    </Icon>
  );
}

export function SidebarCollapseIcon({ className, ...props }: IconProps) {
  return (
    <svg
      width="16"
      height="16"
      viewBox="0 0 16 16"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn("size-4", className)}
      {...props}
    >
      <path
        d="M15.787 14.758a.727.727 0 1 1-1.03 1.029l-7.27-7.272a.727.727 0 0 1 0-1.03L14.758.213a.727.727 0 1 1 1.029 1.03L9.028 8zM1.756 8l6.759-6.758A.728.728 0 0 0 7.485.213L.214 7.485a.727.727 0 0 0 0 1.03l7.273 7.272a.726.726 0 0 0 1.186-.236.73.73 0 0 0-.157-.793z"
        fill="currentColor"
      />
    </svg>
  );
}

function SmallIcon({ className, ...props }: IconProps) {
  return (
    <svg
      viewBox="0 0 16 16"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn("size-4", className)}
      {...props}
    />
  );
}

export function PlayIcon({ className, ...props }: IconProps) {
  return (
    <SmallIcon className={className} {...props}>
      <path
        d="M14.525 7.15562L5.52 1.64688C5.36818 1.55391 5.19429 1.50316 5.0163 1.49986C4.83831 1.49656 4.66266 1.54084 4.5075 1.62812C4.35382 1.71405 4.2258 1.83936 4.1366 1.99117C4.04741 2.14298 4.00026 2.3158 4 2.49187V13.5081C4.00116 13.7722 4.10715 14.0251 4.29466 14.2111C4.48218 14.3971 4.73589 14.501 5 14.5C5.18435 14.4999 5.36511 14.4491 5.5225 14.3531L14.525 8.84437C14.6697 8.75617 14.7893 8.63224 14.8723 8.48448C14.9553 8.33672 14.9989 8.17009 14.9989 8.00062C14.9989 7.83116 14.9553 7.66453 14.8723 7.51677C14.7893 7.36901 14.6697 7.24508 14.525 7.15688V7.15562ZM5 13.4963V2.5L13.9894 8L5 13.4963Z"
        fill="currentColor"
      />
    </SmallIcon>
  );
}

export function PauseIcon({ className, ...props }: IconProps) {
  return (
    <SmallIcon className={className} {...props}>
      <path
        d="M12.5 2H10C9.73478 2 9.48043 2.10536 9.29289 2.29289C9.10536 2.48043 9 2.73478 9 3V13C9 13.2652 9.10536 13.5196 9.29289 13.7071C9.48043 13.8946 9.73478 14 10 14H12.5C12.7652 14 13.0196 13.8946 13.2071 13.7071C13.3946 13.5196 13.5 13.2652 13.5 13V3C13.5 2.73478 13.3946 2.48043 13.2071 2.29289C13.0196 2.10536 12.7652 2 12.5 2ZM12.5 13H10V3H12.5V13ZM6 2H3.5C3.23478 2 2.98043 2.10536 2.79289 2.29289C2.60536 2.48043 2.5 2.73478 2.5 3V13C2.5 13.2652 2.60536 13.5196 2.79289 13.7071C2.98043 13.8946 3.23478 14 3.5 14H6C6.26522 14 6.51957 13.8946 6.70711 13.7071C6.89464 13.5196 7 13.2652 7 13V3C7 2.73478 6.89464 2.48043 6.70711 2.29289C6.51957 2.10536 6.26522 2 6 2ZM6 13H3.5V3H6V13Z"
        fill="currentColor"
      />
    </SmallIcon>
  );
}

export function ArrowUpRightIcon({ className, ...props }: IconProps) {
  return (
    <SmallIcon className={cn("-rotate-90", className)} {...props}>
      <path
        d="M12.5 5.5V12C12.5 12.1326 12.4473 12.2598 12.3536 12.3536C12.2598 12.4473 12.1326 12.5 12 12.5H5.5C5.36739 12.5 5.24022 12.4473 5.14645 12.3536C5.05268 12.2598 5 12.1326 5 12C5 11.8674 5.05268 11.7402 5.14645 11.6464C5.24022 11.5527 5.36739 11.5 5.5 11.5H10.7931L3.64625 4.35375C3.55243 4.25993 3.49972 4.13268 3.49972 4C3.49972 3.86732 3.55243 3.74007 3.64625 3.64625C3.74007 3.55243 3.86732 3.49972 4 3.49972C4.13268 3.49972 4.25993 3.55243 4.35375 3.64625L11.5 10.7931V5.5C11.5 5.36739 11.5527 5.24022 11.6464 5.14645C11.7402 5.05268 11.8674 5 12 5C12.1326 5 12.2598 5.05268 12.3536 5.14645C12.4473 5.24022 12.5 5.36739 12.5 5.5Z"
        fill="currentColor"
      />
    </SmallIcon>
  );
}

export function SealCheckIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <path
        d="M17.6453 8.03281C17.3508 7.725 17.0461 7.40781 16.9313 7.12891C16.825 6.87344 16.8187 6.45 16.8125 6.03984C16.8008 5.27734 16.7883 4.41328 16.1875 3.8125C15.5867 3.21172 14.7227 3.19922 13.9602 3.1875C13.55 3.18125 13.1266 3.175 12.8711 3.06875C12.593 2.95391 12.275 2.64922 11.9672 2.35469C11.4281 1.83672 10.8156 1.25 10 1.25C9.18438 1.25 8.57266 1.83672 8.03281 2.35469C7.725 2.64922 7.40781 2.95391 7.12891 3.06875C6.875 3.175 6.45 3.18125 6.03984 3.1875C5.27734 3.19922 4.41328 3.21172 3.8125 3.8125C3.21172 4.41328 3.20312 5.27734 3.1875 6.03984C3.18125 6.45 3.175 6.87344 3.06875 7.12891C2.95391 7.40703 2.64922 7.725 2.35469 8.03281C1.83672 8.57187 1.25 9.18438 1.25 10C1.25 10.8156 1.83672 11.4273 2.35469 11.9672C2.64922 12.275 2.95391 12.5922 3.06875 12.8711C3.175 13.1266 3.18125 13.55 3.1875 13.9602C3.19922 14.7227 3.21172 15.5867 3.8125 16.1875C4.41328 16.7883 5.27734 16.8008 6.03984 16.8125C6.45 16.8187 6.87344 16.825 7.12891 16.9313C7.40703 17.0461 7.725 17.3508 8.03281 17.6453C8.57187 18.1633 9.18438 18.75 10 18.75C10.8156 18.75 11.4273 18.1633 11.9672 17.6453C12.275 17.3508 12.5922 17.0461 12.8711 16.9313C13.1266 16.825 13.55 16.8187 13.9602 16.8125C14.7227 16.8008 15.5867 16.7883 16.1875 16.1875C16.7883 15.5867 16.8008 14.7227 16.8125 13.9602C16.8187 13.55 16.825 13.1266 16.9313 12.8711C17.0461 12.593 17.3508 12.275 17.6453 11.9672C18.1633 11.4281 18.75 10.8156 18.75 10C18.75 9.18438 18.1633 8.57266 17.6453 8.03281ZM16.743 11.1023C16.3687 11.493 15.9812 11.8969 15.7758 12.393C15.5789 12.8695 15.5703 13.4141 15.5625 13.9414C15.5547 14.4883 15.5461 15.0609 15.3031 15.3031C15.0602 15.5453 14.4914 15.5547 13.9414 15.5625C13.4141 15.5703 12.8695 15.5789 12.393 15.7758C11.8969 15.9812 11.493 16.3687 11.1023 16.743C10.7117 17.1172 10.3125 17.5 10 17.5C9.6875 17.5 9.28516 17.1156 8.89766 16.743C8.51016 16.3703 8.10313 15.9812 7.60703 15.7758C7.13047 15.5789 6.58594 15.5703 6.05859 15.5625C5.51172 15.5547 4.93906 15.5461 4.69687 15.3031C4.45469 15.0602 4.44531 14.4914 4.4375 13.9414C4.42969 13.4141 4.42109 12.8695 4.22422 12.393C4.01875 11.8969 3.63125 11.493 3.25703 11.1023C2.88281 10.7117 2.5 10.3125 2.5 10C2.5 9.6875 2.88437 9.28516 3.25703 8.89766C3.62969 8.51016 4.01875 8.10313 4.22422 7.60703C4.42109 7.13047 4.42969 6.58594 4.4375 6.05859C4.44531 5.51172 4.45391 4.93906 4.69687 4.69687C4.93984 4.45469 5.50859 4.44531 6.05859 4.4375C6.58594 4.42969 7.13047 4.42109 7.60703 4.22422C8.10313 4.01875 8.50703 3.63125 8.89766 3.25703C9.28828 2.88281 9.6875 2.5 10 2.5C10.3125 2.5 10.7148 2.88437 11.1023 3.25703C11.4898 3.62969 11.8969 4.01875 12.393 4.22422C12.8695 4.42109 13.4141 4.42969 13.9414 4.4375C14.4883 4.44531 15.0609 4.45391 15.3031 4.69687C15.5453 4.93984 15.5547 5.50859 15.5625 6.05859C15.5703 6.58594 15.5789 7.13047 15.7758 7.60703C15.9812 8.10313 16.3687 8.50703 16.743 8.89766C17.1172 9.28828 17.5 9.6875 17.5 10C17.5 10.3125 17.1156 10.7148 16.743 11.1023ZM13.5672 7.68281C13.6253 7.74086 13.6714 7.80979 13.7029 7.88566C13.7343 7.96154 13.7505 8.04287 13.7505 8.125C13.7505 8.20713 13.7343 8.28846 13.7029 8.36434C13.6714 8.44021 13.6253 8.50914 13.5672 8.56719L9.19219 12.9422C9.13414 13.0003 9.06521 13.0464 8.98934 13.0779C8.91346 13.1093 8.83213 13.1255 8.75 13.1255C8.66787 13.1255 8.58654 13.1093 8.51066 13.0779C8.43479 13.0464 8.36586 13.0003 8.30781 12.9422L6.43281 11.0672C6.31554 10.9499 6.24965 10.7909 6.24965 10.625C6.24965 10.4591 6.31554 10.3001 6.43281 10.1828C6.55009 10.0655 6.70915 9.99965 6.875 9.99965C7.04085 9.99965 7.19991 10.0655 7.31719 10.1828L8.75 11.6164L12.6828 7.68281C12.7409 7.6247 12.8098 7.5786 12.8857 7.54715C12.9615 7.5157 13.0429 7.49951 13.125 7.49951C13.2071 7.49951 13.2885 7.5157 13.3643 7.54715C13.4402 7.5786 13.5091 7.6247 13.5672 7.68281Z"
        fill="currentColor"
      />
    </Icon>
  );
}

export function ArrowsCounterClockwiseIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <path
        d="M6.875 8.125H3.125C2.95924 8.125 2.80027 8.05915 2.68306 7.94194C2.56585 7.82473 2.5 7.66576 2.5 7.5V3.75C2.5 3.58424 2.56585 3.42527 2.68306 3.30806C2.80027 3.19085 2.95924 3.125 3.125 3.125C3.29076 3.125 3.44973 3.19085 3.56694 3.30806C3.68415 3.42527 3.75 3.58424 3.75 3.75V5.99141L4.89297 4.84844C6.28688 3.44751 8.18 2.65733 10.1562 2.65156H10.1977C12.1571 2.64651 14.0396 3.41362 15.4375 4.78672C15.5516 4.90349 15.6155 5.06028 15.6156 5.22357C15.6156 5.38685 15.5517 5.54365 15.4375 5.66043C15.3234 5.77721 15.1681 5.84469 15.0049 5.84844C14.8416 5.85218 14.6834 5.79189 14.5641 5.68047C13.3989 4.53678 11.8303 3.89774 10.1977 3.90156H10.1625C8.51577 3.90663 6.93834 4.56497 5.77656 5.73203L4.63359 6.875H6.875C7.04076 6.875 7.19973 6.94085 7.31694 7.05806C7.43415 7.17527 7.5 7.33424 7.5 7.5C7.5 7.66576 7.43415 7.82473 7.31694 7.94194C7.19973 8.05915 7.04076 8.125 6.875 8.125ZM16.875 11.875H13.125C12.9592 11.875 12.8003 11.9408 12.6831 12.0581C12.5658 12.1753 12.5 12.3342 12.5 12.5C12.5 12.6658 12.5658 12.8247 12.6831 12.9419C12.8003 13.0592 12.9592 13.125 13.125 13.125H15.3664L14.2234 14.268C13.0619 15.4348 11.4847 16.0932 9.83828 16.0984H9.80313C8.17045 16.1023 6.60189 15.4632 5.43672 14.3195C5.37851 14.26 5.30898 14.2127 5.23222 14.1804C5.15546 14.148 5.07302 14.1314 4.98974 14.1314C4.90646 14.1314 4.82402 14.1481 4.74727 14.1804C4.67051 14.2127 4.60099 14.26 4.54278 14.3196C4.48457 14.3791 4.43886 14.4497 4.40832 14.5272C4.37778 14.6047 4.36303 14.6875 4.36494 14.7707C4.36685 14.854 4.38538 14.936 4.41944 15.012C4.4535 15.088 4.5024 15.1565 4.56328 15.2133C5.96115 16.5864 7.84369 17.3535 9.80313 17.3484H9.84375C11.8197 17.3425 13.7125 16.5523 15.1063 15.1516L16.25 14.0086V16.25C16.25 16.4158 16.3158 16.5747 16.4331 16.6919C16.5503 16.8092 16.7092 16.875 16.875 16.875C17.0408 16.875 17.1997 16.8092 17.3169 16.6919C17.4342 16.5747 17.5 16.4158 17.5 16.25V12.5C17.5 12.3342 17.4342 12.1753 17.3169 12.0581C17.1997 11.9408 17.0408 11.875 16.875 11.875Z"
        fill="currentColor"
      />
    </Icon>
  );
}

export function SpinnerGapIcon({ className, ...props }: IconProps) {
  return (
    <SmallIcon className={className} {...props}>
      <path
        d="M8.5 2V4C8.5 4.13261 8.44732 4.25979 8.35355 4.35355C8.25979 4.44732 8.13261 4.5 8 4.5C7.86739 4.5 7.74021 4.44732 7.64645 4.35355C7.55268 4.25979 7.5 4.13261 7.5 4V2C7.5 1.86739 7.55268 1.74021 7.64645 1.64645C7.74021 1.55268 7.86739 1.5 8 1.5C8.13261 1.5 8.25979 1.55268 8.35355 1.64645C8.44732 1.74021 8.5 1.86739 8.5 2ZM14 7.5H12C11.8674 7.5 11.7402 7.55268 11.6464 7.64645C11.5527 7.74021 11.5 7.86739 11.5 8C11.5 8.13261 11.5527 8.25979 11.6464 8.35355C11.7402 8.44732 11.8674 8.5 12 8.5H14C14.1326 8.5 14.2598 8.44732 14.3536 8.35355C14.4473 8.25979 14.5 8.13261 14.5 8C14.5 7.86739 14.4473 7.74021 14.3536 7.64645C14.2598 7.55268 14.1326 7.5 14 7.5ZM11.1819 10.475C11.0873 10.3852 10.9615 10.3359 10.8311 10.3375C10.7007 10.3392 10.5761 10.3917 10.4839 10.4839C10.3917 10.5761 10.3392 10.7007 10.3375 10.8311C10.3359 10.9615 10.3852 11.0873 10.475 11.1819L11.8888 12.5962C11.9826 12.6901 12.1098 12.7428 12.2425 12.7428C12.3752 12.7428 12.5024 12.6901 12.5962 12.5962C12.6901 12.5024 12.7428 12.3752 12.7428 12.2425C12.7428 12.1098 12.6901 11.9826 12.5962 11.8888L11.1819 10.475ZM8 11.5C7.86739 11.5 7.74021 11.5527 7.64645 11.6464C7.55268 11.7402 7.5 11.8674 7.5 12V14C7.5 14.1326 7.55268 14.2598 7.64645 14.3536C7.74021 14.4473 7.86739 14.5 8 14.5C8.13261 14.5 8.25979 14.4473 8.35355 14.3536C8.44732 14.2598 8.5 14.1326 8.5 14V12C8.5 11.8674 8.44732 11.7402 8.35355 11.6464C8.25979 11.5527 8.13261 11.5 8 11.5ZM4.81812 10.475L3.40375 11.8888C3.30993 11.9826 3.25722 12.1098 3.25722 12.2425C3.25722 12.3752 3.30993 12.5024 3.40375 12.5962C3.49757 12.6901 3.62482 12.7428 3.7575 12.7428C3.89018 12.7428 4.01743 12.6901 4.11125 12.5962L5.525 11.1819C5.61481 11.0873 5.66414 10.9615 5.66247 10.8311C5.6608 10.7007 5.60826 10.5761 5.51606 10.4839C5.42386 10.3917 5.29929 10.3392 5.16891 10.3375C5.03853 10.3359 4.91266 10.3852 4.81812 10.475ZM4.5 8C4.5 7.86739 4.44732 7.74021 4.35355 7.64645C4.25979 7.55268 4.13261 7.5 4 7.5H2C1.86739 7.5 1.74021 7.55268 1.64645 7.64645C1.55268 7.74021 1.5 7.86739 1.5 8C1.5 8.13261 1.55268 8.25979 1.64645 8.35355C1.74021 8.44732 1.86739 8.5 2 8.5H4C4.13261 8.5 4.25979 8.44732 4.35355 8.35355C4.44732 8.25979 4.5 8.13261 4.5 8ZM4.11125 3.40375C4.01743 3.30993 3.89018 3.25722 3.7575 3.25722C3.62482 3.25722 3.49757 3.30993 3.40375 3.40375C3.30993 3.49757 3.25722 3.62482 3.25722 3.7575C3.25722 3.89018 3.30993 4.01743 3.40375 4.11125L4.81812 5.525C4.91266 5.61481 5.03853 5.66414 5.16891 5.66247C5.29929 5.6608 5.42386 5.60826 5.51606 5.51606C5.60826 5.42386 5.6608 5.29929 5.66247 5.16891C5.66414 5.03853 5.61481 4.91266 5.525 4.81812L4.11125 3.40375Z"
        fill="currentColor"
      />
    </SmallIcon>
  );
}

export function FadersHorizontalIcon({ className, ...props }: IconProps) {
  return (
    <SmallIcon className={className} {...props}>
      <path
        d="M11 5C11 4.86739 11.0527 4.74021 11.1464 4.64645C11.2402 4.55268 11.3674 4.5 11.5 4.5H13.5C13.6326 4.5 13.7598 4.55268 13.8536 4.64645C13.9473 4.74021 14 4.86739 14 5C14 5.13261 13.9473 5.25979 13.8536 5.35355C13.7598 5.44732 13.6326 5.5 13.5 5.5H11.5C11.3674 5.5 11.2402 5.44732 11.1464 5.35355C11.0527 5.25979 11 5.13261 11 5ZM2.5 5.5H9V6.5C9 6.63261 9.05268 6.75979 9.14645 6.85355C9.24021 6.94732 9.36739 7 9.5 7C9.63261 7 9.75979 6.94732 9.85355 6.85355C9.94732 6.75979 10 6.63261 10 6.5V3.5C10 3.36739 9.94732 3.24021 9.85355 3.14645C9.75979 3.05268 9.63261 3 9.5 3C9.36739 3 9.24021 3.05268 9.14645 3.14645C9.05268 3.24021 9 3.36739 9 3.5V4.5H2.5C2.36739 4.5 2.24021 4.55268 2.14645 4.64645C2.05268 4.74021 2 4.86739 2 5C2 5.13261 2.05268 5.25979 2.14645 5.35355C2.24021 5.44732 2.36739 5.5 2.5 5.5ZM13.5 10.5H7.5C7.36739 10.5 7.24021 10.5527 7.14645 10.6464C7.05268 10.7402 7 10.8674 7 11C7 11.1326 7.05268 11.2598 7.14645 11.3536C7.24021 11.4473 7.36739 11.5 7.5 11.5H13.5C13.6326 11.5 13.7598 11.4473 13.8536 11.3536C13.9473 11.2598 14 11.1326 14 11C14 10.8674 13.9473 10.7402 13.8536 10.6464C13.7598 10.5527 13.6326 10.5 13.5 10.5ZM5.5 9C5.36739 9 5.24021 9.05268 5.14645 9.14645C5.05268 9.24021 5 9.36739 5 9.5V10.5H2.5C2.36739 10.5 2.24021 10.5527 2.14645 10.6464C2.05268 10.7402 2 10.8674 2 11C2 11.1326 2.05268 11.2598 2.14645 11.3536C2.24021 11.4473 2.36739 11.5 2.5 11.5H5V12.5C5 12.6326 5.05268 12.7598 5.14645 12.8536C5.24021 12.9473 5.36739 13 5.5 13C5.63261 13 5.75979 12.9473 5.85355 12.8536C5.94732 12.7598 6 12.6326 6 12.5V9.5C6 9.36739 5.94732 9.24021 5.85355 9.14645C5.75979 9.05268 5.63261 9 5.5 9Z"
        fill="currentColor"
      />
    </SmallIcon>
  );
}

export function FileArrowUpIcon({ className, ...props }: IconProps) {
  return (
    <SmallIcon className={className} {...props}>
      <path
        d="M13.3538 5.14625L9.85375 1.64625C9.80728 1.59983 9.75212 1.56303 9.69143 1.53793C9.63073 1.51284 9.56568 1.49995 9.5 1.5H3.5C3.23478 1.5 2.98043 1.60536 2.79289 1.79289C2.60536 1.98043 2.5 2.23478 2.5 2.5V13.5C2.5 13.7652 2.60536 14.0196 2.79289 14.2071C2.98043 14.3946 3.23478 14.5 3.5 14.5H12.5C12.7652 14.5 13.0196 14.3946 13.2071 14.2071C13.3946 14.0196 13.5 13.7652 13.5 13.5V5.5C13.5001 5.43432 13.4872 5.36927 13.4621 5.30858C13.437 5.24788 13.4002 5.19272 13.3538 5.14625ZM10 3.20688L11.7931 5H10V3.20688ZM12.5 13.5H3.5V2.5H9V5.5C9 5.63261 9.05268 5.75978 9.14645 5.85355C9.24021 5.94732 9.36739 6 9.5 6H12.5V13.5ZM9.85375 8.64625C9.90021 8.6927 9.93706 8.74786 9.9622 8.80855C9.98734 8.86925 10.0003 8.9343 10.0003 9C10.0003 9.0657 9.98734 9.13075 9.9622 9.19145C9.93706 9.25214 9.90021 9.30729 9.85375 9.35375C9.8073 9.40021 9.75214 9.43705 9.69145 9.4622C9.63075 9.48734 9.5657 9.50028 9.5 9.50028C9.4343 9.50028 9.36925 9.48734 9.30855 9.4622C9.24786 9.43705 9.1927 9.40021 9.14625 9.35375L8.5 8.70687V11.5C8.5 11.6326 8.44732 11.7598 8.35355 11.8536C8.25979 11.9473 8.13261 12 8 12C7.86739 12 7.74021 11.9473 7.64645 11.8536C7.55268 11.7598 7.5 11.6326 7.5 11.5V8.70687L6.85375 9.35375C6.8073 9.40021 6.75214 9.43705 6.69145 9.4622C6.63075 9.48734 6.5657 9.50028 6.5 9.50028C6.4343 9.50028 6.36925 9.48734 6.30855 9.4622C6.24786 9.43705 6.1927 9.40021 6.14625 9.35375C6.09979 9.30729 6.06294 9.25214 6.0378 9.19145C6.01266 9.13075 5.99972 9.0657 5.99972 9C5.99972 8.9343 6.01266 8.86925 6.0378 8.80855C6.06294 8.74786 6.09979 8.6927 6.14625 8.64625L7.64625 7.14625C7.69269 7.09976 7.74783 7.06288 7.80853 7.03772C7.86923 7.01256 7.93429 6.99961 8 6.99961C8.06571 6.99961 8.13077 7.01256 8.19147 7.03772C8.25217 7.06288 8.30731 7.09976 8.35375 7.14625L9.85375 8.64625Z"
        fill="currentColor"
      />
    </SmallIcon>
  );
}

export function CheckCircleIcon({ className, ...props }: IconProps) {
  return (
    <SmallIcon className={className} {...props}>
      <path
        d="M10.8538 6.14625C10.9002 6.19269 10.9371 6.24783 10.9623 6.30853C10.9874 6.36923 11.0004 6.43429 11.0004 6.5C11.0004 6.56571 10.9874 6.63077 10.9623 6.69147C10.9371 6.75217 10.9002 6.80731 10.8538 6.85375L7.35375 10.3538C7.30731 10.4002 7.25217 10.4371 7.19147 10.4623C7.13077 10.4874 7.06571 10.5004 7 10.5004C6.93429 10.5004 6.86923 10.4874 6.80853 10.4623C6.74783 10.4371 6.69269 10.4002 6.64625 10.3538L5.14625 8.85375C5.05243 8.75993 4.99972 8.63268 4.99972 8.5C4.99972 8.36732 5.05243 8.24007 5.14625 8.14625C5.24007 8.05243 5.36732 7.99972 5.5 7.99972C5.63268 7.99972 5.75993 8.05243 5.85375 8.14625L7 9.29313L10.1462 6.14625C10.1927 6.09976 10.2478 6.06288 10.3085 6.03772C10.3692 6.01256 10.4343 5.99961 10.5 5.99961C10.5657 5.99961 10.6308 6.01256 10.6915 6.03772C10.7522 6.06288 10.8073 6.09976 10.8538 6.14625ZM14.5 8C14.5 9.28558 14.1188 10.5423 13.4046 11.6112C12.6903 12.6801 11.6752 13.5132 10.4874 14.0052C9.29972 14.4972 7.99279 14.6259 6.73191 14.3751C5.47104 14.1243 4.31285 13.5052 3.40381 12.5962C2.49476 11.6872 1.8757 10.529 1.6249 9.26809C1.37409 8.00721 1.50281 6.70028 1.99478 5.51256C2.48675 4.32484 3.31987 3.30968 4.38879 2.59545C5.45771 1.88122 6.71442 1.5 8 1.5C9.72335 1.50182 11.3756 2.18722 12.5942 3.40582C13.8128 4.62441 14.4982 6.27665 14.5 8ZM13.5 8C13.5 6.9122 13.1774 5.84883 12.5731 4.94436C11.9687 4.03989 11.1098 3.33494 10.1048 2.91866C9.09977 2.50238 7.9939 2.39346 6.927 2.60568C5.86011 2.8179 4.8801 3.34172 4.11091 4.11091C3.34172 4.8801 2.8179 5.86011 2.60568 6.927C2.39346 7.9939 2.50238 9.09977 2.91866 10.1048C3.33494 11.1098 4.03989 11.9687 4.94436 12.5731C5.84883 13.1774 6.9122 13.5 8 13.5C9.45818 13.4983 10.8562 12.9184 11.8873 11.8873C12.9184 10.8562 13.4983 9.45818 13.5 8Z"
        fill="currentColor"
      />
    </SmallIcon>
  );
}

export function TimelineCheckIcon({ className, ...props }: IconProps) {
  return (
    <svg
      viewBox="-1 -1 15 15"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn("size-4 shrink-0 overflow-visible", className)}
      {...props}
    >
      <path
        fillRule="evenodd"
        clipRule="evenodd"
        d="M6.5 0A6.5 6.5 0 1 0 13 6.5 6.507 6.507 0 0 0 6.5 0m2.854 5.354-3.5 3.5a.5.5 0 0 1-.708 0l-1.5-1.5a.5.5 0 1 1 .708-.708L5.5 7.793l3.146-3.147a.5.5 0 1 1 .708.708"
        fill="currentColor"
      />
    </svg>
  );
}

export function StatusWarningIcon({ className, ...props }: IconProps) {
  return (
    <SmallIcon className={className} {...props}>
      <path
        d="M14.8 11.7556L9.33438 2.26375C9.1978 2.0312 9.00281 1.83839 8.76875 1.70441C8.5347 1.57044 8.26969 1.49996 8 1.49996C7.73031 1.49996 7.4653 1.57044 7.23125 1.70441C6.99719 1.83839 6.80221 2.0312 6.66563 2.26375L1.2 11.7556C1.06859 11.9806 0.99933 12.2364 0.99933 12.4969C0.99933 12.7574 1.06859 13.0132 1.2 13.2381C1.33483 13.4721 1.52948 13.6659 1.76398 13.7998C1.99847 13.9337 2.26436 14.0028 2.53437 14H13.4656C13.7354 14.0026 14.0011 13.9334 14.2353 13.7995C14.4696 13.6656 14.664 13.4719 14.7987 13.2381C14.9304 13.0133 14.9998 12.7575 15 12.497C15.0003 12.2365 14.9312 11.9807 14.8 11.7556ZM13.9331 12.7375C13.8855 12.8188 13.8171 12.8859 13.7349 12.9321C13.6528 12.9782 13.5598 13.0016 13.4656 13H2.53437C2.44017 13.0016 2.34723 12.9782 2.26508 12.9321C2.18293 12.8859 2.11452 12.8188 2.06687 12.7375C2.02372 12.6644 2.00095 12.5811 2.00095 12.4963C2.00095 12.4114 2.02372 12.3281 2.06687 12.255L7.5325 2.76312C7.58111 2.68223 7.64983 2.6153 7.73197 2.56883C7.81411 2.52236 7.90688 2.49793 8.00125 2.49793C8.09562 2.49793 8.18839 2.52236 8.27053 2.56883C8.35267 2.6153 8.42139 2.68223 8.47 2.76312L13.9356 12.255C13.9784 12.3283 14.0007 12.4117 14.0003 12.4966C13.9999 12.5815 13.9767 12.6647 13.9331 12.7375ZM7.5 9V6.5C7.5 6.36739 7.55268 6.24021 7.64645 6.14645C7.74021 6.05268 7.86739 6 8 6C8.13261 6 8.25979 6.05268 8.35355 6.14645C8.44732 6.24021 8.5 6.36739 8.5 6.5V9C8.5 9.13261 8.44732 9.25979 8.35355 9.35355C8.25979 9.44732 8.13261 9.5 8 9.5C7.86739 9.5 7.74021 9.44732 7.64645 9.35355C7.55268 9.25979 7.5 9.13261 7.5 9ZM8.75 11.25C8.75 11.3983 8.70601 11.5433 8.6236 11.6667C8.54119 11.79 8.42406 11.8861 8.28701 11.9429C8.14997 11.9997 7.99917 12.0145 7.85368 11.9856C7.7082 11.9566 7.57456 11.8852 7.46967 11.7803C7.36478 11.6754 7.29335 11.5418 7.26441 11.3963C7.23547 11.2508 7.25032 11.1 7.30709 10.963C7.36386 10.8259 7.45999 10.7088 7.58332 10.6264C7.70666 10.544 7.85166 10.5 8 10.5C8.19891 10.5 8.38968 10.579 8.53033 10.7197C8.67098 10.8603 8.75 11.0511 8.75 11.25Z"
        fill="currentColor"
      />
    </SmallIcon>
  );
}

export function CalendarCheckIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <g id="CalendarCheck">
        <path
          id="Vector"
          d="M16.25 2.5H14.375V1.875C14.375 1.70924 14.3092 1.55027 14.1919 1.43306C14.0747 1.31585 13.9158 1.25 13.75 1.25C13.5842 1.25 13.4253 1.31585 13.3081 1.43306C13.1908 1.55027 13.125 1.70924 13.125 1.875V2.5H6.875V1.875C6.875 1.70924 6.80915 1.55027 6.69194 1.43306C6.57473 1.31585 6.41576 1.25 6.25 1.25C6.08424 1.25 5.92527 1.31585 5.80806 1.43306C5.69085 1.55027 5.625 1.70924 5.625 1.875V2.5H3.75C3.41848 2.5 3.10054 2.6317 2.86612 2.86612C2.6317 3.10054 2.5 3.41848 2.5 3.75V16.25C2.5 16.5815 2.6317 16.8995 2.86612 17.1339C3.10054 17.3683 3.41848 17.5 3.75 17.5H16.25C16.5815 17.5 16.8995 17.3683 17.1339 17.1339C17.3683 16.8995 17.5 16.5815 17.5 16.25V3.75C17.5 3.41848 17.3683 3.10054 17.1339 2.86612C16.8995 2.6317 16.5815 2.5 16.25 2.5ZM5.625 3.75V4.375C5.625 4.54076 5.69085 4.69973 5.80806 4.81694C5.92527 4.93415 6.08424 5 6.25 5C6.41576 5 6.57473 4.93415 6.69194 4.81694C6.80915 4.69973 6.875 4.54076 6.875 4.375V3.75H13.125V4.375C13.125 4.54076 13.1908 4.69973 13.3081 4.81694C13.4253 4.93415 13.5842 5 13.75 5C13.9158 5 14.0747 4.93415 14.1919 4.81694C14.3092 4.69973 14.375 4.54076 14.375 4.375V3.75H16.25V6.25H3.75V3.75H5.625ZM16.25 16.25H3.75V7.5H16.25V16.25ZM13.2547 9.55781C13.3128 9.61586 13.3589 9.68479 13.3904 9.76066C13.4218 9.83654 13.438 9.91787 13.438 10C13.438 10.0821 13.4218 10.1635 13.3904 10.2393C13.3589 10.3152 13.3128 10.3841 13.2547 10.4422L9.50469 14.1922C9.44664 14.2503 9.37771 14.2964 9.30184 14.3279C9.22596 14.3593 9.14463 14.3755 9.0625 14.3755C8.98037 14.3755 8.89904 14.3593 8.82316 14.3279C8.74729 14.2964 8.67836 14.2503 8.62031 14.1922L6.74531 12.3172C6.62804 12.1999 6.56215 12.0409 6.56215 11.875C6.56215 11.7091 6.62804 11.5501 6.74531 11.4328C6.86259 11.3155 7.02165 11.2497 7.1875 11.2497C7.35335 11.2497 7.51241 11.3155 7.62969 11.4328L9.0625 12.8664L12.3703 9.55781C12.4284 9.4997 12.4973 9.4536 12.5732 9.42215C12.649 9.3907 12.7304 9.37451 12.8125 9.37451C12.8946 9.37451 12.976 9.3907 13.0518 9.42215C13.1277 9.4536 13.1966 9.4997 13.2547 9.55781Z"
          fill="currentColor"
        />
      </g>
    </Icon>
  );
}

export function CalendarDotsIcon({ className, ...props }: IconProps) {
  return (
    <svg
      viewBox="0 0 16 16"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn("size-4", className)}
      {...props}
    >
      <path
        d="M13 2H11.5V1.5C11.5 1.36739 11.4473 1.24021 11.3536 1.14645C11.2598 1.05268 11.1326 1 11 1C10.8674 1 10.7402 1.05268 10.6464 1.14645C10.5527 1.24021 10.5 1.36739 10.5 1.5V2H5.5V1.5C5.5 1.36739 5.44732 1.24021 5.35355 1.14645C5.25979 1.05268 5.13261 1 5 1C4.86739 1 4.74021 1.05268 4.64645 1.14645C4.55268 1.24021 4.5 1.36739 4.5 1.5V2H3C2.73478 2 2.48043 2.10536 2.29289 2.29289C2.10536 2.48043 2 2.73478 2 3V13C2 13.2652 2.10536 13.5196 2.29289 13.7071C2.48043 13.8946 2.73478 14 3 14H13C13.2652 14 13.5196 13.8946 13.7071 13.7071C13.8946 13.5196 14 13.2652 14 13V3C14 2.73478 13.8946 2.48043 13.7071 2.29289C13.5196 2.10536 13.2652 2 13 2ZM4.5 3V3.5C4.5 3.63261 4.55268 3.75979 4.64645 3.85355C4.74021 3.94732 4.86739 4 5 4C5.13261 4 5.25979 3.94732 5.35355 3.85355C5.44732 3.75979 5.5 3.63261 5.5 3.5V3H10.5V3.5C10.5 3.63261 10.5527 3.75979 10.6464 3.85355C10.7402 3.94732 10.8674 4 11 4C11.1326 4 11.2598 3.94732 11.3536 3.85355C11.4473 3.75979 11.5 3.63261 11.5 3.5V3H13V5H3V3H4.5ZM13 13H3V6H13V13ZM8.75 8.25C8.75 8.39834 8.70601 8.54334 8.6236 8.66668C8.54119 8.79001 8.42406 8.88614 8.28701 8.94291C8.14997 8.99967 7.99917 9.01453 7.85368 8.98559C7.7082 8.95665 7.57456 8.88522 7.46967 8.78033C7.36478 8.67544 7.29335 8.5418 7.26441 8.39632C7.23547 8.25083 7.25032 8.10003 7.30709 7.96299C7.36386 7.82594 7.45999 7.70881 7.58332 7.6264C7.70666 7.54399 7.85166 7.5 8 7.5C8.19891 7.5 8.38968 7.57902 8.53033 7.71967C8.67098 7.86032 8.75 8.05109 8.75 8.25ZM11.5 8.25C11.5 8.39834 11.456 8.54334 11.3736 8.66668C11.2912 8.79001 11.1741 8.88614 11.037 8.94291C10.9 8.99967 10.7492 9.01453 10.6037 8.98559C10.4582 8.95665 10.3246 8.88522 10.2197 8.78033C10.1148 8.67544 10.0433 8.5418 10.0144 8.39632C9.98547 8.25083 10.0003 8.10003 10.0571 7.96299C10.1139 7.82594 10.21 7.70881 10.3333 7.6264C10.4567 7.54399 10.6017 7.5 10.75 7.5C10.9489 7.5 11.1397 7.57902 11.2803 7.71967C11.421 7.86032 11.5 8.05109 11.5 8.25ZM6 10.75C6 10.8983 5.95601 11.0433 5.8736 11.1667C5.79119 11.29 5.67406 11.3861 5.53701 11.4429C5.39997 11.4997 5.24917 11.5145 5.10368 11.4856C4.9582 11.4567 4.82456 11.3852 4.71967 11.2803C4.61478 11.1754 4.54335 11.0418 4.51441 10.8963C4.48547 10.7508 4.50032 10.6 4.55709 10.463C4.61386 10.3259 4.70999 10.2088 4.83332 10.1264C4.95666 10.044 5.10166 10 5.25 10C5.44891 10 5.63968 10.079 5.78033 10.2197C5.92098 10.3603 6 10.5511 6 10.75ZM8.75 10.75C8.75 10.8983 8.70601 11.0433 8.6236 11.1667C8.54119 11.29 8.42406 11.3861 8.28701 11.4429C8.14997 11.4997 7.99917 11.5145 7.85368 11.4856C7.7082 11.4567 7.57456 11.3852 7.46967 11.2803C7.36478 11.1754 7.29335 11.0418 7.26441 10.8963C7.23547 10.7508 7.25032 10.6 7.30709 10.463C7.36386 10.3259 7.45999 10.2088 7.58332 10.1264C7.70666 10.044 7.85166 10 8 10C8.19891 10 8.38968 10.079 8.53033 10.2197C8.67098 10.3603 8.75 10.5511 8.75 10.75ZM11.5 10.75C11.5 10.8983 11.456 11.0433 11.3736 11.1667C11.2912 11.29 11.1741 11.3861 11.037 11.4429C10.9 11.4997 10.7492 11.5145 10.6037 11.4856C10.4582 11.4567 10.3246 11.3852 10.2197 11.2803C10.1148 11.1754 10.0433 11.0418 10.0144 10.8963C9.98547 10.7508 10.0003 10.6 10.0571 10.463C10.1139 10.3259 10.21 10.2088 10.3333 10.1264C10.4567 10.044 10.6017 10 10.75 10C10.9489 10 11.1397 10.079 11.2803 10.2197C11.421 10.3603 11.5 10.5511 11.5 10.75Z"
        fill="currentColor"
      />
    </svg>
  );
}

export function IdentificationBadgeIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <g id="IdentificationBadge">
        <path
          id="Vector"
          d="M5.87422 15.5C5.9399 15.5494 6.01468 15.5853 6.09426 15.6057C6.17385 15.6262 6.25669 15.6307 6.33803 15.6191C6.41937 15.6075 6.49763 15.58 6.56832 15.5381C6.63901 15.4962 6.70075 15.4408 6.75 15.375C7.12841 14.8705 7.61909 14.4609 8.18319 14.1789C8.7473 13.8968 9.36932 13.75 10 13.75C10.6307 13.75 11.2527 13.8968 11.8168 14.1789C12.3809 14.4609 12.8716 14.8705 13.25 15.375C13.2992 15.4407 13.3609 15.496 13.4316 15.5378C13.5022 15.5796 13.5804 15.6071 13.6616 15.6187C13.7429 15.6303 13.8256 15.6258 13.9051 15.6054C13.9846 15.5851 14.0593 15.5492 14.125 15.5C14.1907 15.4508 14.246 15.3891 14.2878 15.3184C14.3296 15.2478 14.3571 15.1696 14.3687 15.0884C14.3803 15.0071 14.3758 14.9244 14.3554 14.8449C14.3351 14.7654 14.2992 14.6907 14.25 14.625C13.6966 13.883 12.9586 13.2988 12.1094 12.9305C12.5748 12.5056 12.9008 11.9499 13.0447 11.3364C13.1887 10.7229 13.1438 10.0802 12.9159 9.49267C12.688 8.90514 12.2879 8.40023 11.7679 8.0442C11.248 7.68816 10.6325 7.49765 10.0023 7.49765C9.37218 7.49765 8.75673 7.68816 8.23678 8.0442C7.71682 8.40023 7.31666 8.90514 7.08879 9.49267C6.86093 10.0802 6.81602 10.7229 6.95995 11.3364C7.10388 11.9499 7.42993 12.5056 7.89531 12.9305C7.0444 13.2981 6.30472 13.8824 5.75 14.625C5.65046 14.7575 5.60763 14.9241 5.63092 15.0882C5.65422 15.2523 5.74173 15.4004 5.87422 15.5ZM10 8.75C10.3708 8.75 10.7334 8.85997 11.0417 9.06599C11.35 9.27202 11.5904 9.56486 11.7323 9.90747C11.8742 10.2501 11.9113 10.6271 11.839 10.9908C11.7666 11.3545 11.588 11.6886 11.3258 11.9508C11.0636 12.213 10.7295 12.3916 10.3658 12.464C10.0021 12.5363 9.62508 12.4992 9.28247 12.3573C8.93986 12.2154 8.64702 11.975 8.44099 11.6667C8.23497 11.3584 8.125 10.9958 8.125 10.625C8.125 10.1277 8.32254 9.65081 8.67417 9.29917C9.02581 8.94754 9.50272 8.75 10 8.75ZM15.625 1.875H4.375C4.04348 1.875 3.72554 2.0067 3.49112 2.24112C3.2567 2.47554 3.125 2.79348 3.125 3.125V16.875C3.125 17.2065 3.2567 17.5245 3.49112 17.7589C3.72554 17.9933 4.04348 18.125 4.375 18.125H15.625C15.9565 18.125 16.2745 17.9933 16.5089 17.7589C16.7433 17.5245 16.875 17.2065 16.875 16.875V3.125C16.875 2.79348 16.7433 2.47554 16.5089 2.24112C16.2745 2.0067 15.9565 1.875 15.625 1.875ZM15.625 16.875H4.375V3.125H15.625V16.875ZM6.875 5C6.875 4.83424 6.94085 4.67527 7.05806 4.55806C7.17527 4.44085 7.33424 4.375 7.5 4.375H12.5C12.6658 4.375 12.8247 4.44085 12.9419 4.55806C13.0592 4.67527 13.125 4.83424 13.125 5C13.125 5.16576 13.0592 5.32473 12.9419 5.44194C12.8247 5.55915 12.6658 5.625 12.5 5.625H7.5C7.33424 5.625 7.17527 5.55915 7.05806 5.44194C6.94085 5.32473 6.875 5.16576 6.875 5Z"
          fill="currentColor"
        />
      </g>
    </Icon>
  );
}

export function HospitalIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <g id="Hospital">
        <path
          id="Vector"
          d="M19.375 16.25H18.75V10C18.75 9.66848 18.6183 9.35054 18.3839 9.11612C18.1495 8.8817 17.8315 8.75 17.5 8.75H13.125V3.75C13.125 3.41848 12.9933 3.10054 12.7589 2.86612C12.5245 2.6317 12.2065 2.5 11.875 2.5H4.375C4.04348 2.5 3.72554 2.6317 3.49112 2.86612C3.2567 3.10054 3.125 3.41848 3.125 3.75V16.25H2.5C2.33424 16.25 2.17527 16.3158 2.05806 16.4331C1.94085 16.5503 1.875 16.7092 1.875 16.875C1.875 17.0408 1.94085 17.1997 2.05806 17.3169C2.17527 17.4342 2.33424 17.5 2.5 17.5H19.375C19.5408 17.5 19.6997 17.4342 19.8169 17.3169C19.9342 17.1997 20 17.0408 20 16.875C20 16.7092 19.9342 16.5503 19.8169 16.4331C19.6997 16.3158 19.5408 16.25 19.375 16.25ZM17.5 10V16.25H13.125V10H17.5ZM4.375 3.75H11.875V16.25H10.625V12.5C10.625 12.3342 10.5592 12.1753 10.4419 12.0581C10.3247 11.9408 10.1658 11.875 10 11.875H6.25C6.08424 11.875 5.92527 11.9408 5.80806 12.0581C5.69085 12.1753 5.625 12.3342 5.625 12.5V16.25H4.375V3.75ZM9.375 16.25H6.875V13.125H9.375V16.25ZM5.625 7.5C5.625 7.33424 5.69085 7.17527 5.80806 7.05806C5.92527 6.94085 6.08424 6.875 6.25 6.875H7.5V5.625C7.5 5.45924 7.56585 5.30027 7.68306 5.18306C7.80027 5.06585 7.95924 5 8.125 5C8.29076 5 8.44973 5.06585 8.56694 5.18306C8.68415 5.30027 8.75 5.45924 8.75 5.625V6.875H10C10.1658 6.875 10.3247 6.94085 10.4419 7.05806C10.5592 7.17527 10.625 7.33424 10.625 7.5C10.625 7.66576 10.5592 7.82473 10.4419 7.94194C10.3247 8.05915 10.1658 8.125 10 8.125H8.75V9.375C8.75 9.54076 8.68415 9.69973 8.56694 9.81694C8.44973 9.93415 8.29076 10 8.125 10C7.95924 10 7.80027 9.93415 7.68306 9.81694C7.56585 9.69973 7.5 9.54076 7.5 9.375V8.125H6.25C6.08424 8.125 5.92527 8.05915 5.80806 7.94194C5.69085 7.82473 5.625 7.66576 5.625 7.5Z"
          fill="currentColor"
        />
      </g>
    </Icon>
  );
}

export function StackIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <g id="Stack">
        <path
          id="Vector"
          d="M18.0398 13.4375C18.1224 13.5808 18.1448 13.7509 18.1022 13.9106C18.0596 14.0704 17.9554 14.2067 17.8125 14.2898L10.3125 18.6648C10.2169 18.7206 10.1083 18.7499 9.99766 18.7499C9.88703 18.7499 9.77838 18.7206 9.68281 18.6648L2.18281 14.2898C2.04195 14.2052 1.94009 14.0685 1.8993 13.9093C1.8585 13.7501 1.88205 13.5812 1.96484 13.4393C2.04764 13.2973 2.18301 13.1937 2.34166 13.1508C2.50031 13.1079 2.66946 13.1292 2.8125 13.2102L10 17.4016L17.1875 13.2102C17.3308 13.1276 17.5009 13.1052 17.6606 13.1478C17.8204 13.1904 17.9567 13.2946 18.0398 13.4375ZM17.1875 9.46016L10 13.6516L2.8125 9.46016C2.67019 9.3893 2.50623 9.37534 2.35399 9.42111C2.20175 9.46688 2.07267 9.56894 1.99303 9.70653C1.91338 9.84411 1.88916 10.0069 1.92529 10.1617C1.96142 10.3165 2.05518 10.4517 2.1875 10.5398L9.6875 14.9148C9.78307 14.9706 9.89171 14.9999 10.0023 14.9999C10.113 14.9999 10.2216 14.9706 10.3172 14.9148L17.8172 10.5398C17.8892 10.4991 17.9524 10.4444 18.0032 10.379C18.0539 10.3137 18.0912 10.2388 18.1128 10.1589C18.1344 10.079 18.1399 9.99565 18.129 9.91361C18.1181 9.83156 18.091 9.7525 18.0493 9.681C18.0076 9.60951 17.9521 9.54701 17.8861 9.49713C17.82 9.44725 17.7447 9.41098 17.6646 9.39043C17.5844 9.36989 17.5009 9.36547 17.419 9.37744C17.3371 9.38941 17.2584 9.41753 17.1875 9.46016ZM1.875 6.25C1.87525 6.14053 1.90425 6.03305 1.95909 5.93831C2.01393 5.84357 2.0927 5.76489 2.1875 5.71016L9.6875 1.33516C9.78307 1.27943 9.89171 1.25006 10.0023 1.25006C10.113 1.25006 10.2216 1.27943 10.3172 1.33516L17.8172 5.71016C17.9115 5.7652 17.9898 5.84401 18.0442 5.93873C18.0986 6.03345 18.1272 6.14077 18.1272 6.25C18.1272 6.35923 18.0986 6.46655 18.0442 6.56127C17.9898 6.65599 17.9115 6.7348 17.8172 6.78984L10.3172 11.1648C10.2216 11.2206 10.113 11.2499 10.0023 11.2499C9.89171 11.2499 9.78307 11.2206 9.6875 11.1648L2.1875 6.78984C2.0927 6.73511 2.01393 6.65643 1.95909 6.56169C1.90425 6.46695 1.87525 6.35947 1.875 6.25ZM3.74063 6.25L10 9.90156L16.2594 6.25L10 2.59844L3.74063 6.25Z"
          fill="currentColor"
        />
      </g>
    </Icon>
  );
}

export function ChartBarIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <g id="ChartBar">
        <path
          id="Vector"
          d="M17.5 15.625H16.875V3.125C16.875 2.95924 16.8092 2.80027 16.6919 2.68306C16.5747 2.56585 16.4158 2.5 16.25 2.5H11.875C11.7092 2.5 11.5503 2.56585 11.4331 2.68306C11.3158 2.80027 11.25 2.95924 11.25 3.125V6.25H7.5C7.33424 6.25 7.17527 6.31585 7.05806 6.43306C6.94085 6.55027 6.875 6.70924 6.875 6.875V10H3.75C3.58424 10 3.42527 10.0658 3.30806 10.1831C3.19085 10.3003 3.125 10.4592 3.125 10.625V15.625H2.5C2.33424 15.625 2.17527 15.6908 2.05806 15.8081C1.94085 15.9253 1.875 16.0842 1.875 16.25C1.875 16.4158 1.94085 16.5747 2.05806 16.6919C2.17527 16.8092 2.33424 16.875 2.5 16.875H17.5C17.6658 16.875 17.8247 16.8092 17.9419 16.6919C18.0592 16.5747 18.125 16.4158 18.125 16.25C18.125 16.0842 18.0592 15.9253 17.9419 15.8081C17.8247 15.6908 17.6658 15.625 17.5 15.625ZM12.5 3.75H15.625V15.625H12.5V3.75ZM8.125 7.5H11.25V15.625H8.125V7.5ZM4.375 11.25H6.875V15.625H4.375V11.25Z"
          fill="currentColor"
        />
      </g>
    </Icon>
  );
}

export function TrendUpIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <g id="TrendUp">
        <path
          id="Vector"
          d="M18.75 4.375V9.375C18.75 9.54076 18.6842 9.69973 18.5669 9.81694C18.4497 9.93415 18.2908 10 18.125 10C17.9592 10 17.8003 9.93415 17.6831 9.81694C17.5658 9.69973 17.5 9.54076 17.5 9.375V5.88359L11.0672 12.3172C11.0091 12.3753 10.9402 12.4214 10.8643 12.4529C10.7885 12.4843 10.7071 12.5005 10.625 12.5005C10.5429 12.5005 10.4615 12.4843 10.3857 12.4529C10.3098 12.4214 10.2409 12.3753 10.1828 12.3172L7.5 9.63359L2.31719 14.8172C2.19991 14.9345 2.04085 15.0003 1.875 15.0003C1.70915 15.0003 1.55009 14.9345 1.43281 14.8172C1.31554 14.6999 1.24965 14.5409 1.24965 14.375C1.24965 14.2091 1.31554 14.0501 1.43281 13.9328L7.05781 8.30781C7.11586 8.2497 7.18479 8.2036 7.26066 8.17215C7.33654 8.1407 7.41786 8.12451 7.5 8.12451C7.58213 8.12451 7.66346 8.1407 7.73934 8.17215C7.81521 8.2036 7.88414 8.2497 7.94219 8.30781L10.625 10.9914L16.6164 5H13.125C12.9592 5 12.8003 4.93415 12.6831 4.81694C12.5658 4.69973 12.5 4.54076 12.5 4.375C12.5 4.20924 12.5658 4.05027 12.6831 3.93306C12.8003 3.81585 12.9592 3.75 13.125 3.75H18.125C18.2908 3.75 18.4497 3.81585 18.5669 3.93306C18.6842 4.05027 18.75 4.20924 18.75 4.375Z"
          fill="currentColor"
        />
      </g>
    </Icon>
  );
}

export function SparkleIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <g id="Sparkle">
        <path
          id="Vector"
          d="M15.4359 10.0828L11.4062 8.59375L9.92188 4.56094C9.83397 4.32213 9.67493 4.11604 9.46622 3.97046C9.2575 3.82488 9.00916 3.74682 8.75469 3.74682C8.50022 3.74682 8.25187 3.82488 8.04316 3.97046C7.83444 4.11604 7.6754 4.32213 7.5875 4.56094L6.09375 8.59375L2.06094 10.0781C1.82213 10.166 1.61604 10.3251 1.47046 10.5338C1.32488 10.7425 1.24682 10.9908 1.24682 11.2453C1.24682 11.4998 1.32488 11.7481 1.47046 11.9568C1.61604 12.1656 1.82213 12.3246 2.06094 12.4125L6.09375 13.9062L7.57813 17.9391C7.66603 18.1779 7.82507 18.384 8.03378 18.5295C8.2425 18.6751 8.49084 18.7532 8.74531 18.7532C8.99978 18.7532 9.24813 18.6751 9.45684 18.5295C9.66556 18.384 9.8246 18.1779 9.9125 17.9391L11.4062 13.9062L15.4391 12.4219C15.6779 12.334 15.884 12.1749 16.0295 11.9662C16.1751 11.7575 16.2532 11.5092 16.2532 11.2547C16.2532 11.0002 16.1751 10.7519 16.0295 10.5432C15.884 10.3344 15.6779 10.1754 15.4391 10.0875L15.4359 10.0828ZM10.7031 12.8297C10.6183 12.861 10.5412 12.9103 10.4773 12.9742C10.4134 13.0381 10.3641 13.1152 10.3328 13.2L8.75 17.4883L7.17031 13.2031C7.1391 13.1174 7.08949 13.0395 7.02498 12.975C6.96046 12.9105 6.88261 12.8609 6.79688 12.8297L2.51172 11.25L6.79688 9.67031C6.88261 9.6391 6.96046 9.58949 7.02498 9.52497C7.08949 9.46046 7.1391 9.38261 7.17031 9.29688L8.75 5.01172L10.3297 9.29688C10.361 9.38171 10.4103 9.45875 10.4742 9.52269C10.5381 9.58662 10.6152 9.63592 10.7 9.66719L14.9883 11.25L10.7031 12.8297ZM11.25 3.125C11.25 2.95924 11.3158 2.80027 11.4331 2.68306C11.5503 2.56585 11.7092 2.5 11.875 2.5H13.125V1.25C13.125 1.08424 13.1908 0.925268 13.3081 0.808058C13.4253 0.690848 13.5842 0.625 13.75 0.625C13.9158 0.625 14.0747 0.690848 14.1919 0.808058C14.3092 0.925268 14.375 1.08424 14.375 1.25V2.5H15.625C15.7908 2.5 15.9497 2.56585 16.0669 2.68306C16.1842 2.80027 16.25 2.95924 16.25 3.125C16.25 3.29076 16.1842 3.44973 16.0669 3.56694C15.9497 3.68415 15.7908 3.75 15.625 3.75H14.375V5C14.375 5.16576 14.3092 5.32473 14.1919 5.44194C14.0747 5.55915 13.9158 5.625 13.75 5.625C13.5842 5.625 13.4253 5.55915 13.3081 5.44194C13.1908 5.32473 13.125 5.16576 13.125 5V3.75H11.875C11.7092 3.75 11.5503 3.68415 11.4331 3.56694C11.3158 3.44973 11.25 3.29076 11.25 3.125ZM19.375 6.875C19.375 7.04076 19.3092 7.19973 19.1919 7.31694C19.0747 7.43415 18.9158 7.5 18.75 7.5H18.125V8.125C18.125 8.29076 18.0592 8.44973 17.9419 8.56694C17.8247 8.68415 17.6658 8.75 17.5 8.75C17.3342 8.75 17.1753 8.68415 17.0581 8.56694C16.9408 8.44973 16.875 8.29076 16.875 8.125V7.5H16.25C16.0842 7.5 15.9253 7.43415 15.8081 7.31694C15.6908 7.19973 15.625 7.04076 15.625 6.875C15.625 6.70924 15.6908 6.55027 15.8081 6.43306C15.9253 6.31585 16.0842 6.25 16.25 6.25H16.875V5.625C16.875 5.45924 16.9408 5.30027 17.0581 5.18306C17.1753 5.06585 17.3342 5 17.5 5C17.6658 5 17.8247 5.06585 17.9419 5.18306C18.0592 5.30027 18.125 5.45924 18.125 5.625V6.25H18.75C18.9158 6.25 19.0747 6.31585 19.1919 6.43306C19.3092 6.55027 19.375 6.70924 19.375 6.875Z"
          fill="currentColor"
        />
      </g>
    </Icon>
  );
}

export function SpinnerIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <g id="Spinner">
        <path
          id="Vector"
          d="M10.625 2.5V5C10.625 5.16576 10.5592 5.32473 10.4419 5.44194C10.3247 5.55915 10.1658 5.625 10 5.625C9.83424 5.625 9.67527 5.55915 9.55806 5.44194C9.44085 5.32473 9.375 5.16576 9.375 5V2.5C9.375 2.33424 9.44085 2.17527 9.55806 2.05806C9.67527 1.94085 9.83424 1.875 10 1.875C10.1658 1.875 10.3247 1.94085 10.4419 2.05806C10.5592 2.17527 10.625 2.33424 10.625 2.5ZM13.5352 7.08984C13.6173 7.08981 13.6987 7.07357 13.7745 7.04207C13.8504 7.01057 13.9193 6.96441 13.9773 6.90625L15.7453 5.13906C15.8626 5.02179 15.9285 4.86273 15.9285 4.69687C15.9285 4.53102 15.8626 4.37196 15.7453 4.25469C15.628 4.13741 15.469 4.07153 15.3031 4.07153C15.1373 4.07153 14.9782 4.13741 14.8609 4.25469L13.0938 6.02266C13.0063 6.11002 12.9467 6.22136 12.9225 6.34259C12.8983 6.46382 12.9107 6.58949 12.9579 6.70373C13.0051 6.81796 13.0852 6.91561 13.188 6.98434C13.2907 7.05307 13.4115 7.08979 13.5352 7.08984ZM17.5 9.375H15C14.8342 9.375 14.6753 9.44085 14.5581 9.55806C14.4408 9.67527 14.375 9.83424 14.375 10C14.375 10.1658 14.4408 10.3247 14.5581 10.4419C14.6753 10.5592 14.8342 10.625 15 10.625H17.5C17.6658 10.625 17.8247 10.5592 17.9419 10.4419C18.0592 10.3247 18.125 10.1658 18.125 10C18.125 9.83424 18.0592 9.67527 17.9419 9.55806C17.8247 9.44085 17.6658 9.375 17.5 9.375ZM13.9773 13.0938C13.8592 12.9815 13.7018 12.9198 13.5389 12.9219C13.3759 12.924 13.2202 12.9897 13.1049 13.1049C12.9897 13.2202 12.924 13.3759 12.9219 13.5389C12.9198 13.7018 12.9815 13.8592 13.0938 13.9773L14.8609 15.7453C14.9782 15.8626 15.1373 15.9285 15.3031 15.9285C15.469 15.9285 15.628 15.8626 15.7453 15.7453C15.8626 15.628 15.9285 15.469 15.9285 15.3031C15.9285 15.1373 15.8626 14.9782 15.7453 14.8609L13.9773 13.0938ZM10 14.375C9.83424 14.375 9.67527 14.4408 9.55806 14.5581C9.44085 14.6753 9.375 14.8342 9.375 15V17.5C9.375 17.6658 9.44085 17.8247 9.55806 17.9419C9.67527 18.0592 9.83424 18.125 10 18.125C10.1658 18.125 10.3247 18.0592 10.4419 17.9419C10.5592 17.8247 10.625 17.6658 10.625 17.5V15C10.625 14.8342 10.5592 14.6753 10.4419 14.5581C10.3247 14.4408 10.1658 14.375 10 14.375ZM6.02266 13.0938L4.25469 14.8609C4.13741 14.9782 4.07153 15.1373 4.07153 15.3031C4.07153 15.469 4.13741 15.628 4.25469 15.7453C4.37196 15.8626 4.53102 15.9285 4.69687 15.9285C4.86273 15.9285 5.02179 15.8626 5.13906 15.7453L6.90625 13.9773C7.01851 13.8592 7.08017 13.7018 7.07809 13.5389C7.076 13.3759 7.01033 13.2202 6.89508 13.1049C6.77983 12.9897 6.62412 12.924 6.46114 12.9219C6.29816 12.9198 6.14082 12.9815 6.02266 13.0938ZM5.625 10C5.625 9.83424 5.55915 9.67527 5.44194 9.55806C5.32473 9.44085 5.16576 9.375 5 9.375H2.5C2.33424 9.375 2.17527 9.44085 2.05806 9.55806C1.94085 9.67527 1.875 9.83424 1.875 10C1.875 10.1658 1.94085 10.3247 2.05806 10.4419C2.17527 10.5592 2.33424 10.625 2.5 10.625H5C5.16576 10.625 5.32473 10.5592 5.44194 10.4419C5.55915 10.3247 5.625 10.1658 5.625 10ZM5.13906 4.25469C5.02179 4.13741 4.86273 4.07153 4.69687 4.07153C4.53102 4.07153 4.37196 4.13741 4.25469 4.25469C4.13741 4.37196 4.07153 4.53102 4.07153 4.69687C4.07153 4.86273 4.13741 5.02179 4.25469 5.13906L6.02266 6.90625C6.14082 7.01851 6.29816 7.08017 6.46114 7.07809C6.62412 7.076 6.77983 7.01033 6.89508 6.89508C7.01033 6.77983 7.076 6.62412 7.07809 6.46114C7.08017 6.29816 7.01851 6.14082 6.90625 6.02266L5.13906 4.25469Z"
          fill="currentColor"
        />
      </g>
    </Icon>
  );
}

export function PlugsConnectedIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <g id="PlugsConnected">
        <path
          id="Vector"
          d="M18.5672 1.43281C18.5091 1.3747 18.4402 1.3286 18.3643 1.29715C18.2885 1.2657 18.2071 1.24951 18.125 1.24951C18.0429 1.24951 17.9615 1.2657 17.8857 1.29715C17.8098 1.3286 17.7409 1.3747 17.6828 1.43281L13.5891 5.52734L13.1695 5.10703C12.7002 4.63902 12.0644 4.37621 11.4016 4.37621C10.7387 4.37621 10.103 4.63902 9.63359 5.10703L7.8125 6.92891L7.31719 6.43281C7.19991 6.31554 7.04085 6.24965 6.875 6.24965C6.70915 6.24965 6.55009 6.31554 6.43281 6.43281C6.31554 6.55009 6.24965 6.70915 6.24965 6.875C6.24965 7.04085 6.31554 7.19991 6.43281 7.31719L6.92891 7.8125L5.10703 9.63359C4.87482 9.86575 4.69062 10.1414 4.56495 10.4447C4.43928 10.7481 4.3746 11.0732 4.3746 11.4016C4.3746 11.7299 4.43928 12.0551 4.56495 12.3584C4.69062 12.6618 4.87482 12.9374 5.10703 13.1695L5.52734 13.5891L1.43281 17.6828C1.37474 17.7409 1.32868 17.8098 1.29725 17.8857C1.26583 17.9616 1.24965 18.0429 1.24965 18.125C1.24965 18.2071 1.26583 18.2884 1.29725 18.3643C1.32868 18.4402 1.37474 18.5091 1.43281 18.5672C1.55009 18.6845 1.70915 18.7503 1.875 18.7503C1.95712 18.7503 2.03844 18.7342 2.11431 18.7027C2.19018 18.6713 2.25912 18.6253 2.31719 18.5672L6.41094 14.4727L6.83047 14.893C7.06262 15.1252 7.33825 15.3094 7.6416 15.435C7.94495 15.5607 8.27008 15.6254 8.59844 15.6254C8.92679 15.6254 9.25193 15.5607 9.55528 15.435C9.85863 15.3094 10.1343 15.1252 10.3664 14.893L12.1875 13.0711L12.6828 13.5672C12.7409 13.6253 12.8098 13.6713 12.8857 13.7027C12.9616 13.7342 13.0429 13.7503 13.125 13.7503C13.2071 13.7503 13.2884 13.7342 13.3643 13.7027C13.4402 13.6713 13.5091 13.6253 13.5672 13.5672C13.6253 13.5091 13.6713 13.4402 13.7027 13.3643C13.7342 13.2884 13.7503 13.2071 13.7503 13.125C13.7503 13.0429 13.7342 12.9616 13.7027 12.8857C13.6713 12.8098 13.6253 12.7409 13.5672 12.6828L13.0711 12.1875L14.893 10.3664C15.1252 10.1343 15.3094 9.85863 15.435 9.55528C15.5607 9.25193 15.6254 8.92679 15.6254 8.59844C15.6254 8.27008 15.5607 7.94495 15.435 7.6416C15.3094 7.33825 15.1252 7.06262 14.893 6.83047L14.4727 6.41094L18.5672 2.31719C18.6253 2.25914 18.6714 2.19021 18.7029 2.11434C18.7343 2.03846 18.7505 1.95713 18.7505 1.875C18.7505 1.79287 18.7343 1.71154 18.7029 1.63566C18.6714 1.55979 18.6253 1.49086 18.5672 1.43281ZM9.48203 14.0109C9.24763 14.2452 8.92982 14.3768 8.59844 14.3768C8.26706 14.3768 7.94924 14.2452 7.71484 14.0109L5.99141 12.2852C5.75716 12.0508 5.62558 11.7329 5.62558 11.4016C5.62558 11.0702 5.75716 10.7524 5.99141 10.518L7.8125 8.69609L11.3039 12.1875L9.48203 14.0109ZM14.0086 9.48438L12.1875 11.3039L8.69609 7.8125L10.518 5.99141C10.7524 5.75716 11.0702 5.62558 11.4016 5.62558C11.7329 5.62558 12.0508 5.75716 12.2852 5.99141L14.0086 7.71016C14.1253 7.8263 14.2179 7.96436 14.2811 8.1164C14.3442 8.26843 14.3768 8.43145 14.3768 8.59609C14.3768 8.76074 14.3442 8.92376 14.2811 9.07579C14.2179 9.22783 14.1253 9.36588 14.0086 9.48203V9.48438ZM6.91953 2.73438C6.85737 2.58043 6.85891 2.40809 6.92382 2.25527C6.98872 2.10246 7.11167 1.98169 7.26562 1.91953C7.41957 1.85737 7.59191 1.85891 7.74473 1.92382C7.89754 1.98872 8.01831 2.11168 8.08047 2.26563L8.70547 3.82813C8.73625 3.90435 8.75171 3.9859 8.75097 4.0681C8.75024 4.15031 8.73332 4.23156 8.70118 4.30723C8.66904 4.38289 8.62232 4.45148 8.56367 4.50909C8.50502 4.5667 8.4356 4.61219 8.35937 4.64297C8.28315 4.67375 8.2016 4.68921 8.1194 4.68847C8.03719 4.68774 7.95594 4.67082 7.88027 4.63868C7.80461 4.60654 7.73601 4.55982 7.67841 4.50117C7.6208 4.44252 7.57531 4.3731 7.54453 4.29688L6.91953 2.73438ZM1.91953 7.26563C1.9502 7.18931 1.99563 7.11981 2.05322 7.06109C2.1108 7.00237 2.17941 6.95559 2.25511 6.92344C2.33081 6.89128 2.41211 6.87439 2.49435 6.87372C2.5766 6.87305 2.65816 6.88862 2.73437 6.91953L4.29687 7.54453C4.3731 7.57531 4.44252 7.6208 4.50117 7.67841C4.55982 7.73602 4.60654 7.80461 4.63868 7.88027C4.67082 7.95594 4.68774 8.03719 4.68847 8.1194C4.68921 8.2016 4.67375 8.28315 4.64297 8.35938C4.61219 8.4356 4.5667 8.50502 4.50909 8.56367C4.45148 8.62232 4.38289 8.66904 4.30723 8.70118C4.23156 8.73332 4.15031 8.75024 4.0681 8.75097C3.9859 8.75171 3.90435 8.73625 3.82812 8.70547L2.26562 8.08047C2.18931 8.0498 2.11981 8.00437 2.06109 7.94678C2.00237 7.8892 1.95559 7.82059 1.92344 7.74489C1.89128 7.66919 1.87439 7.58789 1.87372 7.50565C1.87305 7.4234 1.88862 7.34184 1.91953 7.26563ZM18.0805 12.7344C18.05 12.8106 18.0048 12.8801 17.9475 12.9389C17.8902 12.9977 17.8219 13.0446 17.7464 13.0769C17.671 13.1093 17.5899 13.1264 17.5078 13.1275C17.4257 13.1285 17.3442 13.1133 17.268 13.0828L15.7055 12.4578C15.6291 12.4272 15.5595 12.3818 15.5006 12.3243C15.4418 12.2668 15.3948 12.1982 15.3625 12.1226C15.3301 12.0469 15.313 11.9656 15.3121 11.8833C15.3111 11.801 15.3264 11.7194 15.357 11.643C15.3877 11.5666 15.433 11.497 15.4905 11.4381C15.5481 11.3793 15.6166 11.3323 15.6923 11.3C15.768 11.2676 15.8493 11.2505 15.9315 11.2496C16.0138 11.2486 16.0955 11.2639 16.1719 11.2945L17.7344 11.9195C17.8107 11.9502 17.8802 11.9956 17.9389 12.0532C17.9976 12.1108 18.0444 12.1794 18.0766 12.2551C18.1087 12.3308 18.1256 12.4121 18.1263 12.4944C18.127 12.5766 18.1114 12.6582 18.0805 12.7344ZM13.0805 17.2703C13.1109 17.3465 13.1261 17.428 13.1251 17.5101C13.1241 17.5922 13.1069 17.6733 13.0745 17.7487C13.0422 17.8242 12.9953 17.8925 12.9365 17.9498C12.8777 18.0072 12.8083 18.0523 12.732 18.0828C12.6558 18.1133 12.5743 18.1284 12.4922 18.1274C12.4101 18.1264 12.3291 18.1092 12.2536 18.0769C12.1782 18.0445 12.1098 17.9976 12.0525 17.9388C11.9952 17.8801 11.95 17.8106 11.9195 17.7344L11.2945 16.1719C11.2324 16.0179 11.2339 15.8456 11.2988 15.6928C11.3637 15.54 11.4867 15.4192 11.6406 15.357C11.7946 15.2949 11.9669 15.2964 12.1197 15.3613C12.2725 15.4262 12.3933 15.5492 12.4555 15.7031L13.0805 17.2703Z"
          fill="currentColor"
        />
      </g>
    </Icon>
  );
}

export function AccordionChevronIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <path
        id="Vector"
        d="M11.4506 0.79888L6.12475 6.12475L0.79888 0.79888"
        stroke="currentColor"
        strokeWidth="1.59776"
        strokeLinecap="round"
        strokeLinejoin="round"
      />
    </Icon>
  );
}
```

### `src/components/dashboards/medesk-dashboard/components/medesk/logo.tsx`

```tsx
import type { SVGProps } from "react";
import { cn } from "@/lib/utils";

export function MedeskLogo({ className, ...props }: SVGProps<SVGSVGElement>) {
  return (
    <svg
      xmlns="http://www.w3.org/2000/svg"
      viewBox="0 0 40 40"
      fill="none"
      id="Logo"
      className={cn("size-8 text-primary", className)}
      {...props}
    >
      <g id="logomark">
        <path
          fillRule="evenodd"
          clipRule="evenodd"
          d="M10 0C15.5228 0 20 4.47715 20 10V0H30C35.5228 0 40 4.47715 40 10C40 15.5228 35.5228 20 30 20C35.5228 20 40 24.4772 40 30C40 32.7423 38.8961 35.2268 37.1085 37.0334L37.0711 37.0711L37.0379 37.1041C35.2309 38.8943 32.7446 40 30 40C27.2741 40 24.8029 38.9093 22.999 37.1405C22.9756 37.1175 22.9522 37.0943 22.9289 37.0711C22.907 37.0492 22.8852 37.0272 22.8635 37.0051C21.0924 35.2009 20 32.728 20 30C20 35.5228 15.5228 40 10 40C4.47715 40 0 35.5228 0 30V20H10C4.47715 20 0 15.5228 0 10C0 4.47715 4.47715 0 10 0ZM18 10C18 14.4183 14.4183 18 10 18V2C14.4183 2 18 5.58172 18 10ZM38 30C38 25.5817 34.4183 22 30 22C25.5817 22 22 25.5817 22 30H38ZM2 22V30C2 34.4183 5.58172 38 10 38C14.4183 38 18 34.4183 18 30V22H2ZM22 18V2H30C34.4183 2 38 5.58172 38 10C38 14.4183 34.4183 18 30 18H22Z"
          fill="var(--primary)"
        />
      </g>
    </svg>
  );
}
```

### `src/components/dashboards/medesk-dashboard/components/medesk/navigation.tsx`

```tsx
import {
  createContext,
  useContext,
  useMemo,
  useState,
  type AnchorHTMLAttributes,
  type MouseEvent,
  type ReactNode,
} from "react";

type DashboardNavigation = {
  pathname: string;
  navigate: (pathname: string) => void;
};

const DashboardNavigationContext = createContext<DashboardNavigation | null>(
  null,
);

export function DashboardNavigationProvider({
  children,
}: {
  children: ReactNode;
}) {
  const [pathname, setPathname] = useState("/");
  const value = useMemo(
    () => ({ pathname, navigate: setPathname }),
    [pathname],
  );

  return (
    <DashboardNavigationContext.Provider value={value}>
      {children}
    </DashboardNavigationContext.Provider>
  );
}

export function useDashboardNavigation() {
  const context = useContext(DashboardNavigationContext);

  if (!context) {
    throw new Error(
      "useDashboardNavigation must be used within DashboardNavigationProvider",
    );
  }

  return context;
}

export function DashboardLink({
  href,
  onClick,
  ...props
}: AnchorHTMLAttributes<HTMLAnchorElement> & { href: string }) {
  const { navigate } = useDashboardNavigation();

  function handleClick(event: MouseEvent<HTMLAnchorElement>) {
    onClick?.(event);

    if (
      event.defaultPrevented ||
      event.button !== 0 ||
      event.metaKey ||
      event.ctrlKey ||
      event.shiftKey ||
      event.altKey
    ) {
      return;
    }

    event.preventDefault();
    navigate(href);
  }

  return <a href={href} onClick={handleClick} {...props} />;
}
```

### `src/components/dashboards/medesk-dashboard/components/medesk/sidebar.tsx`

```tsx
import {
  BookOpenIcon,
  ChevronRight,
  LogOutIcon,
  MessageCircleIcon,
  MoonIcon,
  SunIcon,
} from "lucide-react";
import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar";
import { MedeskLogo } from "./logo";
import { SidebarCollapseIcon } from "./icons";
import { DashboardLink, useDashboardNavigation } from "./navigation";
import { useTheme } from "./theme-provider";
import { Button } from "@/components/ui/button";
import {
  Collapsible,
  CollapsibleContent,
  CollapsibleTrigger,
} from "@/components/ui/collapsible";
import {
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuGroup,
  DropdownMenuItem,
  DropdownMenuLabel,
  DropdownMenuSeparator,
  DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu";
import {
  Sidebar,
  SidebarContent,
  SidebarFooter,
  SidebarGroup,
  SidebarGroupContent,
  SidebarGroupLabel,
  SidebarHeader,
  SidebarMenu,
  SidebarMenuBadge,
  SidebarMenuButton,
  SidebarMenuItem,
  SidebarRail,
  useSidebar,
} from "@/components/ui/sidebar";
import { currentUser, navigationGroups, type NavigationItem } from "../../data";
import { cn } from "@/lib/utils";

const menuButtonClassName = cn(
  "h-12.5 gap-2.5 rounded-lg bg-transparent py-2.5 pl-3 pr-2 text-base font-normal text-muted-foreground transition-colors",
  "hover:!bg-transparent hover:text-foreground active:!bg-transparent",
  "aria-[current=page]:!bg-transparent aria-[current=page]:font-medium aria-[current=page]:text-foreground",
  "data-open:!bg-transparent data-open:hover:!bg-transparent data-open:text-foreground data-active:!bg-transparent",
  "[&_svg]:size-5! [&_svg]:shrink-0",
  "group-data-[collapsible=icon]:size-12.5! group-data-[collapsible=icon]:justify-center group-data-[collapsible=icon]:p-0! group-data-[collapsible=icon]:[&>span]:hidden",
);

const sidebarGroupLabelClassName =
  "h-auto px-0 py-1 text-[1.0625rem] font-normal text-foreground/70 transition-colors";

const dropdownTriggerClassName =
  "peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm ring-sidebar-ring outline-hidden transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0";

function NavItem({ item }: { item: NavigationItem }) {
  const { pathname } = useDashboardNavigation();
  const { isMobile, setOpenMobile } = useSidebar();
  const isActive =
    item.href === "/"
      ? pathname === "/"
      : pathname === item.href || pathname.startsWith(`${item.href}/`);

  return (
    <SidebarMenuButton
      asChild
      tooltip={item.name}
      className={menuButtonClassName}
    >
      <DashboardLink
        href={item.href}
        aria-current={isActive ? "page" : undefined}
        onClick={() => {
          if (isMobile) setOpenMobile(false);
        }}
      >
        <item.icon />
        <span>{item.name}</span>
        {item.badge ? <SidebarMenuBadge>{item.badge}</SidebarMenuBadge> : null}
      </DashboardLink>
    </SidebarMenuButton>
  );
}

export function DashboardSidebar() {
  const { resolvedTheme, setTheme } = useTheme();
  const { state, toggleSidebar } = useSidebar();
  const isDark = resolvedTheme === "dark";

  return (
    <Sidebar collapsible="icon" className="border-r-0!">
      <SidebarHeader className="relative h-20 flex-row items-center justify-between gap-3 px-4 group-data-[collapsible=icon]:justify-center group-data-[collapsible=icon]:px-0">
        <div className="flex min-w-0 items-center gap-3 transition-opacity group-data-[collapsible=icon]:hidden">
          <MedeskLogo className="size-7 shrink-0" />
          <span className="truncate text-xl font-medium tracking-tight">
            Medesk
          </span>
        </div>
        <Button
          variant="ghost"
          onClick={toggleSidebar}
          aria-label={
            state === "expanded" ? "Collapse sidebar" : "Expand sidebar"
          }
          className="size-10"
        >
          <SidebarCollapseIcon className="size-5 transition-transform group-data-[collapsible=icon]:rotate-180" />
        </Button>
      </SidebarHeader>

      <SidebarContent className="gap-3 px-4 py-3 group-data-[collapsible=icon]:overflow-auto!">
        {navigationGroups.map((group) => {
          const isCollapsible = group.collapsible ?? false;

          if (isCollapsible) {
            return (
              <Collapsible
                key={group.label}
                defaultOpen
                className="group/collapsible"
              >
                <SidebarGroup className="gap-1 p-0">
                  <SidebarGroupLabel
                    asChild
                    className={sidebarGroupLabelClassName}
                  >
                    <CollapsibleTrigger className="flex w-full items-center justify-between transition-colors hover:text-foreground">
                      <span>{group.label}</span>
                      <ChevronRight className="ml-auto size-4 transition-transform group-data-[state=open]/collapsible:rotate-90" />
                    </CollapsibleTrigger>
                  </SidebarGroupLabel>
                  <CollapsibleContent>
                    <SidebarGroupContent>
                      <SidebarMenu className="gap-0">
                        {group.items.map((item) => (
                          <SidebarMenuItem key={item.name}>
                            <NavItem item={item} />
                          </SidebarMenuItem>
                        ))}
                      </SidebarMenu>
                    </SidebarGroupContent>
                  </CollapsibleContent>
                </SidebarGroup>
              </Collapsible>
            );
          }

          return (
            <SidebarGroup key={group.label} className="gap-1 p-0">
              <SidebarGroupLabel className={sidebarGroupLabelClassName}>
                {group.label}
              </SidebarGroupLabel>
              <SidebarGroupContent>
                <SidebarMenu className="gap-0">
                  {group.items.map((item) => (
                    <SidebarMenuItem key={item.name}>
                      <NavItem item={item} />
                    </SidebarMenuItem>
                  ))}
                </SidebarMenu>
              </SidebarGroupContent>
            </SidebarGroup>
          );
        })}
      </SidebarContent>

      <SidebarFooter className="px-4 py-2">
        <SidebarGroup className="gap-0 p-0">
          <SidebarGroupLabel
            className={cn(
              sidebarGroupLabelClassName,
              "group-data-[collapsible=icon]:hidden",
            )}
          >
            Account
          </SidebarGroupLabel>
          <SidebarMenu className="gap-0">
            <SidebarMenuItem>
              <DropdownMenu>
                <DropdownMenuTrigger
                  type="button"
                  className={cn(
                    dropdownTriggerClassName,
                    menuButtonClassName,
                    "justify-start px-0!",
                  )}
                  aria-label={currentUser.name}
                >
                  <div className="flex items-center gap-2.5 min-w-0">
                    <Avatar size="sm" className="border border-border/50">
                      <AvatarImage
                        src={currentUser.avatar}
                        alt={currentUser.name}
                      />
                      <AvatarFallback>
                        {currentUser.name.slice(0, 1)}
                      </AvatarFallback>
                    </Avatar>
                    <span className="truncate group-data-[collapsible=icon]:hidden">
                      {currentUser.name}
                    </span>
                  </div>
                </DropdownMenuTrigger>
                <DropdownMenuContent side="top" align="start" className="w-56">
                  <DropdownMenuLabel className="font-normal">
                    <div className="leading-tight">
                      <p className="text-sm font-medium">{currentUser.name}</p>
                      <p className="text-xs text-muted-foreground">
                        {currentUser.email}
                      </p>
                    </div>
                  </DropdownMenuLabel>
                  <DropdownMenuSeparator />
                  <DropdownMenuGroup>
                    <DropdownMenuItem
                      onClick={() => setTheme(isDark ? "light" : "dark")}
                    >
                      {isDark ? <SunIcon /> : <MoonIcon />}
                      <span>{isDark ? "Light Mode" : "Dark Mode"}</span>
                    </DropdownMenuItem>
                    <DropdownMenuItem asChild>
                      <a
                        href="https://docs.medesk.com"
                        target="_blank"
                        rel="noreferrer"
                      >
                        <BookOpenIcon className="size-4" />
                        <span>Documentation</span>
                      </a>
                    </DropdownMenuItem>
                    <DropdownMenuItem asChild>
                      <a
                        href="https://medesk.com/support"
                        target="_blank"
                        rel="noreferrer"
                      >
                        <MessageCircleIcon className="size-4" />
                        <span>Contact support</span>
                      </a>
                    </DropdownMenuItem>
                  </DropdownMenuGroup>
                  <DropdownMenuSeparator />
                  <DropdownMenuItem variant="destructive">
                    <LogOutIcon className="size-4" />
                    <span>Log out</span>
                  </DropdownMenuItem>
                </DropdownMenuContent>
              </DropdownMenu>
            </SidebarMenuItem>
          </SidebarMenu>
        </SidebarGroup>
      </SidebarFooter>
      <SidebarRail />
    </Sidebar>
  );
}
```

### `src/components/dashboards/medesk-dashboard/components/medesk/theme-provider.tsx`

```tsx
import {
  createContext,
  useCallback,
  useContext,
  useEffect,
  useMemo,
  useState,
  type ReactNode,
} from "react";

export type Theme = "dark" | "light" | "system";

type ThemeProviderProps = {
  children: ReactNode;
  defaultTheme?: Theme;
  storageKey?: string;
};

type ThemeProviderState = {
  theme: Theme;
  resolvedTheme: "dark" | "light";
  setTheme: (theme: Theme) => void;
};

const ThemeProviderContext = createContext<ThemeProviderState | null>(null);

function getSystemTheme(): "dark" | "light" {
  return window.matchMedia("(prefers-color-scheme: dark)").matches
    ? "dark"
    : "light";
}

function applyTheme(theme: "dark" | "light") {
  const root = window.document.documentElement;
  root.classList.remove("light", "dark");
  root.classList.add(theme);
}

export function ThemeProvider({
  children,
  defaultTheme = "system",
  storageKey = "medesk-theme",
}: ThemeProviderProps) {
  const [theme, setThemeState] = useState<Theme>(() => {
    const stored = localStorage.getItem(storageKey) as Theme | null;
    return stored ?? defaultTheme;
  });
  const [systemTheme, setSystemTheme] = useState<"dark" | "light">(
    getSystemTheme,
  );
  const resolvedTheme = theme === "system" ? systemTheme : theme;

  useEffect(() => {
    applyTheme(resolvedTheme);
  }, [resolvedTheme]);

  useEffect(() => {
    if (theme !== "system") return;

    const media = window.matchMedia("(prefers-color-scheme: dark)");
    const onChange = () => setSystemTheme(getSystemTheme());
    media.addEventListener("change", onChange);
    return () => media.removeEventListener("change", onChange);
  }, [theme]);

  const setTheme = useCallback(
    (next: Theme) => {
      localStorage.setItem(storageKey, next);
      setThemeState(next);
    },
    [storageKey],
  );

  const value = useMemo(
    () => ({ theme, resolvedTheme, setTheme }),
    [theme, resolvedTheme, setTheme],
  );

  return (
    <ThemeProviderContext.Provider value={value}>
      {children}
    </ThemeProviderContext.Provider>
  );
}

export function useTheme() {
  const context = useContext(ThemeProviderContext);
  if (!context) {
    throw new Error("useTheme must be used within a ThemeProvider");
  }
  return context;
}
```

### `src/components/dashboards/medesk-dashboard/components/medesk/topbar.tsx`

```tsx
import { useEffect, useRef, useState } from "react";
import { CloseIcon, CommandIcon, SearchIcon } from "./icons";
import { useDashboardNavigation } from "./navigation";
import { Button } from "@/components/ui/button";
import {
  InputGroup,
  InputGroupAddon,
  InputGroupInput,
} from "@/components/ui/input-group";
import { SidebarTrigger } from "@/components/ui/sidebar";
import { navigationGroups } from "../../data";

export function DashboardTopbar() {
  const { pathname } = useDashboardNavigation();
  const [searchQuery, setSearchQuery] = useState("");
  const [isMobileSearchOpen, setIsMobileSearchOpen] = useState(false);
  const searchInputRef = useRef<HTMLInputElement>(null);
  const mobileSearchInputRef = useRef<HTMLInputElement>(null);
  const currentPage =
    navigationGroups
      .flatMap((group) => group.items)
      .find((item) => item.href === pathname) ?? navigationGroups[0].items[0];
  const CurrentPageIcon = currentPage.icon;

  const openMobileSearch = () => {
    setIsMobileSearchOpen(true);
    requestAnimationFrame(() => {
      mobileSearchInputRef.current?.focus();
    });
  };

  const closeMobileSearch = () => {
    setIsMobileSearchOpen(false);
  };

  useEffect(() => {
    const handleKeyDown = (event: KeyboardEvent) => {
      if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === "k") {
        event.preventDefault();

        if (window.matchMedia("(max-width: 767px)").matches) {
          setIsMobileSearchOpen(true);
          requestAnimationFrame(() => {
            mobileSearchInputRef.current?.focus();
          });
          return;
        }

        searchInputRef.current?.focus();
      }

      if (event.key === "Escape") {
        setIsMobileSearchOpen(false);
      }
    };

    window.addEventListener("keydown", handleKeyDown);
    return () => window.removeEventListener("keydown", handleKeyDown);
  }, []);

  return (
    <header className="flex h-18 shrink-0 items-center justify-between gap-4 px-5 md:px-6">
      {isMobileSearchOpen ? (
        <div className="flex w-full items-center gap-2 md:hidden">
          <InputGroup className="h-9 flex-1 rounded-lg border-none bg-secondary py-1 pr-2 pl-3">
            <InputGroupAddon className="pl-0 text-muted-foreground">
              <SearchIcon />
            </InputGroupAddon>
            <InputGroupInput
              ref={mobileSearchInputRef}
              className="h-full p-0 px-1.5! text-sm leading-5 tracking-tight placeholder:text-muted-foreground"
              aria-label="Find a control"
              placeholder="find a control"
              value={searchQuery}
              onChange={(event) => setSearchQuery(event.target.value)}
            />
          </InputGroup>
          <Button
            type="button"
            variant="outline"
            size="icon"
            className="shrink-0 rounded-lg"
            aria-label="Close search"
            onClick={closeMobileSearch}
          >
            <CloseIcon />
          </Button>
        </div>
      ) : (
        <>
          <div className="flex min-w-0 items-center gap-2">
            <SidebarTrigger
              size="icon"
              className="shrink-0 md:hidden [&_svg]:size-5!"
            />
            <div className="hidden items-end gap-4 md:flex">
              <div className="flex h-6 items-center gap-3">
                <CurrentPageIcon className="size-4" />
                <span className="text-lg leading-6.5 font-medium">
                  {currentPage.name}
                </span>
              </div>
              <div className="flex h-6 items-center gap-1">
                <span className="size-1.5 rounded-full bg-muted-foreground" />
                <span className="text-xs text-muted-foreground">
                  Last synced{" "}
                  <span className="text-foreground/80">5 min ago</span>
                </span>
              </div>
            </div>
          </div>

          <InputGroup className="hidden h-9 w-69.25 shrink-0 rounded-lg border-none bg-secondary py-1 pr-2 pl-2.5 md:flex">
            <InputGroupAddon className="gap-1.5 p-0 text-muted-foreground">
              <SearchIcon className="size-3" />
            </InputGroupAddon>
            <InputGroupInput
              ref={searchInputRef}
              className="h-full p-0 px-1 text-xs placeholder:text-muted-foreground"
              aria-label="Search patients and staff"
              placeholder="Search patients, staff..."
              value={searchQuery}
              onChange={(event) => setSearchQuery(event.target.value)}
            />
            {searchQuery === "" ? (
              <InputGroupAddon
                align="inline-end"
                className="p-0 text-muted-foreground"
              >
                <div className="flex h-6 w-9.5 items-center justify-center gap-1 rounded-md bg-background p-1.5">
                  <CommandIcon className="size-3" />
                  <span className="text-xs leading-none">K</span>
                </div>
              </InputGroupAddon>
            ) : null}
          </InputGroup>

          <Button
            type="button"
            variant="ghost"
            size="icon"
            className="shrink-0 md:hidden"
            aria-label="Open search"
            onClick={openMobileSearch}
          >
            <SearchIcon className="size-4" />
          </Button>
        </>
      )}
    </header>
  );
}
```

### `src/components/dashboards/medesk-dashboard/dashboard-layout.tsx`

```tsx
import type { CSSProperties, ReactNode } from "react";
import { DashboardSidebar } from "./components/medesk/sidebar";
import { DashboardTopbar } from "./components/medesk/topbar";
import { SidebarProvider } from "@/components/ui/sidebar";
import "./dashboard.css";

type DashboardLayoutProps = {
  children: ReactNode;
};

export default function DashboardLayout({ children }: DashboardLayoutProps) {
  return (
    <SidebarProvider
      defaultOpen
      className="medesk-dashboard h-svh overflow-hidden no-scrollbar"
      style={
        {
          "--sidebar-width": "17.25rem",
          "--sidebar-width-icon": "5.125rem",
        } as CSSProperties
      }
    >
      <DashboardSidebar />

      <main className="flex flex-1 flex-col overflow-hidden bg-sidebar p-0 md:p-2 md:pl-0">
        <div className="flex min-h-0 flex-1 flex-col overflow-hidden bg-background md:rounded-xl">
          <DashboardTopbar />
          <div className="flex-1 overflow-y-auto">{children}</div>
        </div>
      </main>
    </SidebarProvider>
  );
}
```

### `src/components/dashboards/medesk-dashboard/dashboard.css`

```css
.medesk-dashboard,
body:has(.medesk-dashboard) [data-slot="sidebar"][data-mobile="true"],
body:has(.medesk-dashboard) [data-slot="sheet-content"] {
  --background: oklch(1 0 0);
  --foreground: oklch(0.145 0 0);
  --card: oklch(0.98 0 0);
  --card-foreground: oklch(0.145 0 0);
  --popover: oklch(1 0 0);
  --popover-foreground: oklch(0.145 0 0);
  --primary: oklch(0.205 0 0);
  --primary-foreground: oklch(0.985 0 0);
  --secondary: oklch(0.97 0 0);
  --secondary-foreground: oklch(0.205 0 0);
  --muted: oklch(0.97 0 0);
  --muted-foreground: oklch(0.556 0 0);
  --accent: oklch(0.97 0 0);
  --accent-foreground: oklch(0.205 0 0);
  --destructive: oklch(0.577 0.245 27.325);
  --border: oklch(0.922 0 0);
  --input: oklch(0.922 0 0);
  --ring: oklch(0.708 0 0);
  --chart-1: oklch(0.87 0 0);
  --chart-2: oklch(0.556 0 0);
  --chart-3: oklch(0.439 0 0);
  --chart-4: oklch(0.371 0 0);
  --chart-5: oklch(0.269 0 0);
  --radius: 0.625rem;
  --sidebar: oklch(0.975 0 0);
  --sidebar-foreground: oklch(0.145 0 0);
  --sidebar-primary: oklch(0.205 0 0);
  --sidebar-primary-foreground: oklch(0.985 0 0);
  --sidebar-accent: oklch(0.97 0 0);
  --sidebar-accent-foreground: oklch(0.205 0 0);
  --sidebar-border: oklch(0.922 0 0);
  --sidebar-ring: oklch(0.708 0 0);
  --dashboard-scheduled: oklch(0.62325 0.14864 251.5);
  --dashboard-completed: oklch(0.62265 0.12424 165.02);
  --dashboard-no-show: oklch(0.76366 0.15429 69.59);
  --dashboard-secondary: oklch(0.59276 0.14905 282.66);
}

.medesk-dashboard.dark,
.dark .medesk-dashboard,
.dark body:has(.medesk-dashboard) [data-slot="sidebar"][data-mobile="true"],
.dark body:has(.medesk-dashboard) [data-slot="sheet-content"] {
  --background: oklch(0.145 0 0);
  --foreground: oklch(0.985 0 0);
  --card: oklch(0.205 0 0);
  --card-foreground: oklch(0.985 0 0);
  --popover: oklch(0.205 0 0);
  --popover-foreground: oklch(0.985 0 0);
  --primary: oklch(0.922 0 0);
  --primary-foreground: oklch(0.205 0 0);
  --secondary: oklch(0.269 0 0);
  --secondary-foreground: oklch(0.985 0 0);
  --muted: oklch(0.269 0 0);
  --muted-foreground: oklch(0.708 0 0);
  --accent: oklch(0.269 0 0);
  --accent-foreground: oklch(0.985 0 0);
  --destructive: oklch(0.704 0.191 22.216);
  --border: oklch(1 0 0 / 10%);
  --input: oklch(1 0 0 / 15%);
  --ring: oklch(0.556 0 0);
  --chart-1: oklch(0.87 0 0);
  --chart-2: oklch(0.556 0 0);
  --chart-3: oklch(0.439 0 0);
  --chart-4: oklch(0.371 0 0);
  --chart-5: oklch(0.269 0 0);
  --sidebar: oklch(0.18 0 0);
  --sidebar-foreground: oklch(0.985 0 0);
  --sidebar-primary: oklch(0.488 0.243 264.376);
  --sidebar-primary-foreground: oklch(0.985 0 0);
  --sidebar-accent: oklch(0.269 0 0);
  --sidebar-accent-foreground: oklch(0.985 0 0);
  --sidebar-border: oklch(1 0 0 / 10%);
  --sidebar-ring: oklch(0.556 0 0);
}

.medesk-dashboard.no-scrollbar,
.medesk-dashboard.no-scrollbar *,
.medesk-dashboard .no-scrollbar,
.medesk-dashboard .no-scrollbar * {
  -ms-overflow-style: none;
  scrollbar-width: none;
}

.medesk-dashboard .dashboard-load-segment {
  width: var(--department-width);
  animation: dashboard-load-grow 700ms ease-out both;
}

.medesk-dashboard .dashboard-resource-progress {
  transform-origin: left;
  animation: dashboard-resource-grow 700ms ease-out both;
}

@keyframes dashboard-load-grow {
  from {
    width: 0;
  }

  to {
    width: var(--department-width);
  }
}

@keyframes dashboard-resource-grow {
  from {
    transform: scaleX(0);
  }

  to {
    transform: scaleX(1);
  }
}

.medesk-dashboard.no-scrollbar::-webkit-scrollbar,
.medesk-dashboard.no-scrollbar *::-webkit-scrollbar,
.medesk-dashboard .no-scrollbar::-webkit-scrollbar,
.medesk-dashboard .no-scrollbar *::-webkit-scrollbar {
  display: none;
}

[data-slot="dropdown-menu-content"] [data-slot="dropdown-menu-item"],
[data-slot="dropdown-menu-content"] [data-slot="dropdown-menu-sub-trigger"] {
  padding-inline: 0.625rem;
  padding-block: 0.625rem;
}

[data-slot="dropdown-menu-content"] [data-slot="dropdown-menu-checkbox-item"],
[data-slot="dropdown-menu-content"] [data-slot="dropdown-menu-radio-item"] {
  padding-block: 0.625rem;
  padding-left: 0.625rem;
  padding-right: 2rem;
}
```

### `src/components/dashboards/medesk-dashboard/data.tsx`

```tsx
import type { ComponentType, SVGProps } from "react";
import {
  BedIcon,
  Building2Icon,
  FlaskConicalIcon,
  PillIcon,
} from "lucide-react";
const staffHarrison =
  "https://assets.watermelon.sh/components/doc-harrison-profile-picture.png";
const staffJefferson =
  "https://assets.watermelon.sh/components/doc-jeff-profile-picture.png";
const staffPatel =
  "https://assets.watermelon.sh/components/doc-anjali-profile-picture.png";
import * as Icons from "./components/medesk/icons";

export type NavIcon = ComponentType<SVGProps<SVGSVGElement>>;

export type NavigationItem = {
  name: string;
  href: string;
  icon: NavIcon;
  badge?: string;
};

export type NavigationGroup = {
  label: string;
  collapsible?: boolean;
  items: NavigationItem[];
};

export const navigationGroups: NavigationGroup[] = [
  {
    label: "Overview",
    collapsible: false,
    items: [{ name: "Dashboard", href: "/", icon: Icons.HomeIcon }],
  },
  {
    label: "Operations",
    collapsible: true,
    items: [
      {
        name: "Appointment",
        href: "/appointment",
        icon: Icons.CalendarCheckIcon,
      },
      { name: "Staff", href: "/staff", icon: Icons.IdentificationBadgeIcon },
      { name: "Departments", href: "/departments", icon: Icons.HospitalIcon },
      { name: "Resources", href: "/resources", icon: Icons.StackIcon },
    ],
  },
  {
    label: "Insights",
    collapsible: true,
    items: [
      { name: "Analytics", href: "/analytics", icon: Icons.ChartBarIcon },
      { name: "Reports", href: "/reports", icon: Icons.FileIcon },
      { name: "Trends", href: "/trends", icon: Icons.TrendUpIcon },
    ],
  },
  {
    label: "Assistant",
    collapsible: true,
    items: [
      { name: "AI Assistant", href: "/ai-assistant", icon: Icons.SparkleIcon },
      {
        name: "Smart Queries",
        href: "/smart-queries",
        icon: Icons.SpinnerIcon,
      },
    ],
  },
  {
    label: "Admin",
    collapsible: true,
    items: [
      { name: "Settings", href: "/settings", icon: Icons.GearIcon },
      {
        name: "Integrations",
        href: "/integrations",
        icon: Icons.PlugsConnectedIcon,
      },
      {
        name: "Permissions",
        href: "/permissions",
        icon: Icons.ShieldCheckIcon,
      },
    ],
  },
];

export const currentUser = {
  name: "Reyes Patel",
  email: "reyes@medesk.example",
  initials: "RP",
  avatar: `https://api.dicebear.com/9.x/avataaars/svg?seed=Reyes%20Patel`,
};

export const notifications = [
  {
    id: "exception-spike",
    title: "Exception volume spike",
    description: "3,154 open exceptions need review this week.",
    time: "2 min ago",
  },
  {
    id: "audit-complete",
    title: "Audit run completed",
    description: "Controls audit finished with 12 flagged items.",
    time: "1 hour ago",
  },
  {
    id: "integration-sync",
    title: "Integration synced",
    description: "ERP connector finished its latest sync.",
    time: "Yesterday",
  },
] as const;

export type SourceKind = "oracle" | "sharepoint" | "concur" | "email";

export type BatchStatus = "processing" | "completed" | "exception";

export const metrics = [
  {
    id: "total-processed",
    label: "Total processed",
    value: "147,392",
    icon: "clock" as const,
    trend: { value: "+2.4%", label: "vs last run", tone: "up" as const },
  },
  {
    id: "matched",
    label: "Matched",
    value: "12,847",
    icon: "seal" as const,
    trend: { value: "+97.86%", label: "match rate" },
  },
  {
    id: "exceptions",
    label: "Exceptions",
    value: "12,847",
    icon: "warning" as const,
    trend: { value: "2.14%", label: "exception rate" },
  },
  {
    id: "processing",
    label: "Processing",
    value: "12,847",
    icon: "arrows" as const,
    trend: { value: "Live", label: "in queue", tone: "live" as const },
  },
] as const;

export const batchTransactions = [
  {
    id: "1",
    status: "processing" as BatchStatus,
    transactionId: "TXN-84921",
    po: "PO-6952",
    vendor: "Accenture LTD",
    amount: "$42,200.00",
    sources: ["oracle", "sharepoint"] as SourceKind[],
    confidence: 72,
  },
  {
    id: "2",
    status: "processing" as BatchStatus,
    transactionId: "TXN-84921",
    po: "PO-6952",
    vendor: "Accenture LTD",
    amount: "$42,200.00",
    sources: ["oracle", "concur"] as SourceKind[],
    confidence: 58,
  },
  {
    id: "3",
    status: "completed" as BatchStatus,
    transactionId: "TXN-84921",
    po: "PO-6952",
    vendor: "Accenture LTD",
    amount: "$42,200.00",
    sources: ["oracle", "concur", "email"] as SourceKind[],
    confidence: 99,
  },
  {
    id: "4",
    status: "processing" as BatchStatus,
    transactionId: "TXN-84921",
    po: "PO-6952",
    vendor: "Accenture LTD",
    amount: "$42,200.00",
    sources: ["oracle", "concur"] as SourceKind[],
    confidence: 58,
  },
  {
    id: "5",
    status: "processing" as BatchStatus,
    transactionId: "TXN-84921",
    po: "PO-6952",
    vendor: "Accenture LTD",
    amount: "$42,200.00",
    sources: ["oracle", "concur"] as SourceKind[],
    confidence: 58,
  },
  {
    id: "6",
    status: "exception" as BatchStatus,
    transactionId: "TXN-84921",
    po: "PO-6952",
    vendor: "Accenture LTD",
    amount: "$42,200.00",
    sources: ["oracle", "email", "concur"] as SourceKind[],
    confidence: 34,
    confidenceNote: "Amount Variance",
  },
  {
    id: "7",
    status: "completed" as BatchStatus,
    transactionId: "TXN-84921",
    po: "PO-6952",
    vendor: "Accenture LTD",
    amount: "$42,200.00",
    sources: ["oracle", "concur"] as SourceKind[],
    confidence: 97,
  },
] as const;

export const sourceLabels: Record<SourceKind, string> = {
  oracle: "Oracle ERP",
  sharepoint: "Sharepoint",
  concur: "Concur",
  email: "Email",
};

export const batchStatusFilters = [
  { value: "all", label: "All statuses", icon: Icons.FadersHorizontalIcon },
  { value: "processing", label: "Processing", icon: Icons.SpinnerGapIcon },
  { value: "completed", label: "Completed", icon: Icons.CheckCircleIcon },
  { value: "exception", label: "Exception", icon: Icons.StatusWarningIcon },
] as const;

export type BatchTransaction = (typeof batchTransactions)[number];

export type MatchLineStatus = "matched" | "mismatched" | "partial";

export type TransactionDetails = {
  customer: string;
  batchId: string;
  date: string;
  flagged: boolean;
  purchaseOrder: {
    status: MatchLineStatus;
    amount: string;
    reference: string;
    source: string;
  };
  invoice: {
    status: MatchLineStatus;
    amount: string;
    reference: string;
    deltaVsPo: string;
  };
  goodsReceipt: {
    status: MatchLineStatus;
    amount: string;
    reference: string;
    fulfillment: string;
  };
  timeline: { title: string; parts: string[] }[];
};

export function getTransactionDetails(
  row: BatchTransaction,
): TransactionDetails {
  const isException = row.status === "exception";
  const isComplete = row.status === "completed";

  return {
    customer: "Consulting Corp",
    batchId: "BAT-2026-0407",
    date: "Apr 7, 2026",
    flagged: isException,
    purchaseOrder: {
      status: "matched",
      amount: isException ? "$417,301.00" : row.amount,
      reference: row.po.startsWith("PO")
        ? `PO-2026-${row.po.replace(/\D/g, "")}`
        : row.po,
      source: sourceLabels[row.sources[0] ?? "oracle"],
    },
    invoice: {
      status: isException ? "mismatched" : isComplete ? "matched" : "partial",
      amount: row.amount,
      reference: `INV-CC-${row.id.padStart(4, "0")}`,
      deltaVsPo: isException ? "+$12,450" : isComplete ? "$0.00" : "+$420.00",
    },
    goodsReceipt: {
      status: isException ? "partial" : isComplete ? "matched" : "partial",
      amount: isException ? "$394,100.00" : row.amount,
      reference: `GR-0407-${row.id.padStart(3, "0")}`,
      fulfillment: isException ? "91.7%" : isComplete ? "100%" : "86.4%",
    },
    timeline: [
      ...(isException
        ? [
            {
              title: "Flagged as exception",
              parts: [
                "Audit AI",
                "Audit AI",
                `Confidence dropped to ${row.confidence}%`,
              ],
            },
          ]
        : []),
      {
        title: "Viewed by J. Hartwell",
        parts: ["Manual review", "Today 11:38 AM"],
      },
      {
        title: "Three-way match processed",
        parts: ["Manual review", "Today 11:38 AM"],
      },
      {
        title: isException ? "Flagged as exception" : "Match checks completed",
        parts: ["Automated", "Today 11:34 AM", "PO, Invoice, GR ingested"],
      },
      {
        title: "Transaction Submitted",
        parts: ["Oracle ERP sync", "Today 11:30 AM", "BAT-2026-0407"],
      },
    ],
  };
}

export type BatchStatusFilter = (typeof batchStatusFilters)[number]["value"];

export const auditControls = {
  defaultLive: true,
} as const;

export const dashboardMetrics = [
  {
    label: "Today's appointments",
    value: "48",
    suffix: undefined,
    trend: "6 more than yesterday",
    color: "bg-[var(--dashboard-scheduled)]",
    trendColor: "text-[var(--dashboard-completed)]",
    lastSixDays: [18, 31, 48, 39, 44, 32],
  },
  {
    label: "Avg. wait time",
    value: "14",
    suffix: "min",
    trend: "3min above target",
    color: "bg-[var(--dashboard-no-show)]",
    trendColor: "text-[var(--dashboard-no-show)]",
    lastSixDays: [5, 11, 18, 14, 16, 12],
  },
  {
    label: "Bed occupancy",
    value: "82",
    suffix: "%",
    trend: "+2.4% vs last run",
    color: "bg-[var(--dashboard-completed)]",
    trendColor: "text-[var(--dashboard-completed)]",
    lastSixDays: [36, 54, 79, 67, 73, 58],
  },
  {
    label: "Patient satisfaction",
    value: "47",
    suffix: "/5",
    trend: "0.3pts this month",
    color: "bg-[var(--dashboard-secondary)]",
    trendColor: "text-[var(--dashboard-completed)]",
    lastSixDays: [14, 29, 45, 38, 41, 32],
  },
] as const;

export const dashboardAppointmentVolume = [
  { week: "Week 1", scheduled: 230, completed: 187, noShow: 13 },
  { week: "Week 2", scheduled: 196, completed: 162, noShow: 35 },
  { week: "Week 3", scheduled: 201, completed: 176, noShow: 10 },
  { week: "Week 4", scheduled: 224, completed: 154, noShow: 37 },
] as const;

export const dashboardAppointmentStats = [
  ["1024", "Total this month"],
  ["91%", "Completion rate"],
  ["47", "No - shows"],
] as const;

export const dashboardDepartmentLoad = [
  {
    label: "General",
    value: 38,
    percent: "39.2%",
    progress: 39.2,
    color: "bg-[var(--dashboard-scheduled)]",
  },
  {
    label: "Cardiology",
    value: 22,
    percent: "22.7%",
    progress: 22.7,
    color: "bg-[var(--dashboard-secondary)]",
  },
  {
    label: "Paediatrics",
    value: 17,
    percent: "17.5%",
    progress: 17.5,
    color: "bg-[var(--dashboard-completed)]",
  },
  {
    label: "Orthopaedics",
    value: 11,
    percent: "11.3%",
    progress: 11.3,
    color: "bg-[var(--dashboard-no-show)]",
  },
  {
    label: "Obs/Gynae",
    value: 9,
    percent: "9.3%",
    progress: 9.3,
    color: "bg-destructive",
  },
] as const;

export type DashboardAppointmentStatus =
  | "In progress"
  | "Waiting"
  | "Confirmed"
  | "Done";

export type DashboardAppointment = {
  time: string;
  patient: string;
  type: string;
  doctor: string;
  status: DashboardAppointmentStatus;
};

export const dashboardAppointments: readonly DashboardAppointment[] = [
  {
    time: "10:30",
    patient: "Fatima Ali",
    type: "Oncology",
    doctor: "Dr. Johnson",
    status: "In progress" as DashboardAppointmentStatus,
  },
  {
    time: "11:00",
    patient: "Oliver Wright",
    type: "General",
    doctor: "Dr. Thompson",
    status: "Waiting" as DashboardAppointmentStatus,
  },
  {
    time: "11:30",
    patient: "Sophia Patel",
    type: "Neurology",
    doctor: "Dr. Garcia",
    status: "Confirmed" as DashboardAppointmentStatus,
  },
  {
    time: "12:00",
    patient: "Ethan Lee",
    type: "Orthopedics",
    doctor: "Dr. Davis",
    status: "Confirmed" as DashboardAppointmentStatus,
  },
  {
    time: "12:30",
    patient: "Isabella Kim",
    type: "General",
    doctor: "Dr. Martinez",
    status: "Confirmed" as DashboardAppointmentStatus,
  },
  {
    time: "13:00",
    patient: "Liam Nguyen",
    type: "Endocrinology",
    doctor: "Dr. Brown",
    status: "Done" as DashboardAppointmentStatus,
  },
  {
    time: "13:30",
    patient: "Ava Johnson",
    type: "Pediatric",
    doctor: "Dr. Wilson",
    status: "Confirmed" as DashboardAppointmentStatus,
  },
  {
    time: "14:00",
    patient: "Noah Smith",
    type: "Urology",
    doctor: "Dr. Taylor",
    status: "Done" as DashboardAppointmentStatus,
  },
  {
    time: "08:30",
    patient: "Kiana Bergson",
    type: "General",
    doctor: "Dr. Mensah",
    status: "Done" as DashboardAppointmentStatus,
  },
] as const;

export const dashboardAppointmentStatusFilters = [
  { value: "all", label: "All statuses" },
  { value: "In progress", label: "In progress" },
  { value: "Waiting", label: "Waiting" },
  { value: "Confirmed", label: "Confirmed" },
  { value: "Done", label: "Done" },
] as const;

export type DashboardAppointmentStatusFilter =
  (typeof dashboardAppointmentStatusFilters)[number]["value"];

export function filterDashboardAppointments(
  appointments: readonly DashboardAppointment[],
  statusFilter: DashboardAppointmentStatusFilter,
) {
  if (statusFilter === "all") return [...appointments];
  return appointments.filter(
    (appointment) => appointment.status === statusFilter,
  );
}

export const dashboardStaffPerformance = [
  {
    name: "Dr. Harrison",
    role: "Cardiologist",
    points: 18,
    rating: "94%",
    avatar: staffHarrison,
  },
  {
    name: "Dr. Patel",
    role: "Cardiologist",
    points: 22,
    rating: "88%",
    avatar: staffPatel,
  },
  {
    name: "Dr. Jefferson",
    role: "Cardiologist",
    points: 14,
    rating: "91%",
    avatar: staffJefferson,
  },
] as const;

export const staffDetails = {
  "Dr. Harrison": {
    specialty: "Senior Cardiologist",
    department: "Cardiology",
    location: "MedCore Clinic",
    status: "On Duty",
    ward: "Ward 3B",
    metrics: [
      { label: "Patients seen", value: "18", trend: "3 vs avg." },
      { label: "Satisfaction", value: "94%", trend: "2% this week" },
      { label: "Avg. consult", value: "11 min", trend: "1 min target" },
    ],
    monthlyPerformance: {
      patientSeenLabel: "Patient Seen",
      targetLabel: "Target",
      target: 110,
      points: [
        { month: "Mar", patientsSeen: 48 },
        { month: "Apr", patientsSeen: 96 },
        { month: "May", patientsSeen: 72 },
        { month: "Jun", patientsSeen: 100 },
        { month: "Jul", patientsSeen: 146 },
        { month: "Aug", patientsSeen: 98 },
      ],
    },
    information: [
      ["Staff ID", "MC-2041"],
      ["Employment", "Full-time"],
      ["Joined", "Mar 12, 2019"],
      ["Contract End", "Dec 31, 2026"],
      ["Shift", "07:00 - 15:00"],
      ["Leave Balance", "14 Days"],
      ["Email", "a.harrison@medcore.ng"],
      ["Phone", "+1 903-4578-908"],
    ],
  },
  "Dr. Patel": {
    specialty: "Cardiologist",
    department: "Cardiology",
    location: "MedCore Clinic",
    status: "On Duty",
    ward: "Ward 2A",
    metrics: [
      { label: "Patients seen", value: "22", trend: "5 vs avg." },
      { label: "Satisfaction", value: "88%", trend: "1% this week" },
      { label: "Avg. consult", value: "13 min", trend: "2 min target" },
    ],
    monthlyPerformance: {
      patientSeenLabel: "Patient Seen",
      targetLabel: "Target",
      target: 120,
      points: [
        { month: "Mar", patientsSeen: 88 },
        { month: "Apr", patientsSeen: 116 },
        { month: "May", patientsSeen: 104 },
        { month: "Jun", patientsSeen: 136 },
        { month: "Jul", patientsSeen: 112 },
        { month: "Aug", patientsSeen: 156 },
      ],
    },
    information: [
      ["Staff ID", "MC-1928"],
      ["Employment", "Full-time"],
      ["Joined", "Jul 08, 2021"],
      ["Contract End", "Dec 31, 2026"],
      ["Shift", "09:00 - 17:00"],
      ["Leave Balance", "11 Days"],
      ["Email", "d.patel@medcore.ng"],
      ["Phone", "+1 903-4578-765"],
    ],
  },
  "Dr. Jefferson": {
    specialty: "Cardiologist",
    department: "Cardiology",
    location: "MedCore Clinic",
    status: "On Duty",
    ward: "Ward 3A",
    metrics: [
      { label: "Patients seen", value: "14", trend: "2 vs avg." },
      { label: "Satisfaction", value: "91%", trend: "3% this week" },
      { label: "Avg. consult", value: "12 min", trend: "1 min target" },
    ],
    monthlyPerformance: {
      patientSeenLabel: "Patient Seen",
      targetLabel: "Target",
      target: 80,
      points: [
        { month: "Mar", patientsSeen: 34 },
        { month: "Apr", patientsSeen: 58 },
        { month: "May", patientsSeen: 44 },
        { month: "Jun", patientsSeen: 76 },
        { month: "Jul", patientsSeen: 92 },
        { month: "Aug", patientsSeen: 68 },
      ],
    },
    information: [
      ["Staff ID", "MC-2156"],
      ["Employment", "Full-time"],
      ["Joined", "Nov 20, 2020"],
      ["Contract End", "Dec 31, 2026"],
      ["Shift", "08:00 - 16:00"],
      ["Leave Balance", "16 Days"],
      ["Email", "j.jefferson@medcore.ng"],
      ["Phone", "+1 903-4578-432"],
    ],
  },
} as const;

export const dashboardResources = [
  {
    label: "Beds",
    value: 82,
    unit: "Used",
    Icon: BedIcon,
    color: "bg-[var(--dashboard-scheduled)]",
  },
  {
    label: "Lab Equipment",
    value: 67,
    unit: "Active",
    Icon: FlaskConicalIcon,
    color: "bg-[var(--dashboard-completed)]",
  },
  {
    label: "Medication Stock",
    value: 91,
    unit: "Used",
    Icon: PillIcon,
    color: "bg-[var(--dashboard-secondary)]",
  },
  {
    label: "Consult Rooms",
    value: 75,
    unit: "Occupied",
    Icon: Building2Icon,
    color: "bg-[var(--dashboard-no-show)]",
  },
] as const;

export const dashboardTimelineRanges = [
  { value: "aug-2026", label: "Aug 1 - 14, 2026" },
  { value: "jul-2026", label: "Jul 1 - 31, 2026" },
  { value: "jun-2026", label: "Jun 1 - 30, 2026" },
  { value: "may-2026", label: "May 1 - 31, 2026" },
  { value: "apr-2026", label: "Apr 1 - 30, 2026" },
  { value: "mar-2026", label: "Mar 1 - 31, 2026" },
  { value: "feb-2026", label: "Feb 1 - 28, 2026" },
  { value: "jan-2026", label: "Jan 1 - 31, 2026" },
] as const;

export type DashboardTimelineRange =
  (typeof dashboardTimelineRanges)[number]["value"];

export const dashboardTimelineData = {
  "jan-2026": {
    metrics: dashboardMetrics,
    appointmentVolume: dashboardAppointmentVolume,
    appointmentStats: dashboardAppointmentStats,
    departmentLoad: dashboardDepartmentLoad,
    appointments: dashboardAppointments,
    staffPerformance: dashboardStaffPerformance,
    resources: dashboardResources,
  },
  "feb-2026": {
    metrics: dashboardMetrics,
    appointmentVolume: [
      { week: "Week 1", scheduled: 205, completed: 169, noShow: 22 },
      { week: "Week 2", scheduled: 224, completed: 186, noShow: 28 },
      { week: "Week 3", scheduled: 211, completed: 177, noShow: 19 },
      { week: "Week 4", scheduled: 238, completed: 192, noShow: 32 },
    ],
    appointmentStats: [
      ["984", "Total this month"],
      ["89%", "Completion rate"],
      ["51", "No - shows"],
    ],
    departmentLoad: dashboardDepartmentLoad,
    appointments: dashboardAppointments,
    staffPerformance: dashboardStaffPerformance,
    resources: dashboardResources,
  },
  "mar-2026": {
    metrics: dashboardMetrics,
    appointmentVolume: [
      { week: "Week 1", scheduled: 215, completed: 181, noShow: 19 },
      { week: "Week 2", scheduled: 233, completed: 194, noShow: 24 },
      { week: "Week 3", scheduled: 221, completed: 189, noShow: 17 },
      { week: "Week 4", scheduled: 241, completed: 203, noShow: 27 },
    ],
    appointmentStats: [
      ["1048", "Total this month"],
      ["91%", "Completion rate"],
      ["43", "No - shows"],
    ],
    departmentLoad: dashboardDepartmentLoad,
    appointments: dashboardAppointments,
    staffPerformance: dashboardStaffPerformance,
    resources: dashboardResources,
  },
  "apr-2026": {
    metrics: dashboardMetrics,
    appointmentVolume: dashboardAppointmentVolume,
    appointmentStats: dashboardAppointmentStats,
    departmentLoad: dashboardDepartmentLoad,
    appointments: dashboardAppointments,
    staffPerformance: dashboardStaffPerformance,
    resources: dashboardResources,
  },
  "may-2026": {
    metrics: [
      {
        label: "Today's appointments",
        value: "57",
        suffix: undefined,
        trend: "9 more than yesterday",
        color: "bg-[var(--dashboard-scheduled)]",
        trendColor: "text-[var(--dashboard-completed)]",
        lastSixDays: [22, 38, 57, 44, 51, 40],
      },
      {
        label: "Avg. wait time",
        value: "11",
        suffix: "min",
        trend: "2min below target",
        color: "bg-[var(--dashboard-no-show)]",
        trendColor: "text-[var(--dashboard-completed)]",
        lastSixDays: [6, 13, 19, 12, 16, 10],
      },
      {
        label: "Bed occupancy",
        value: "76",
        suffix: "%",
        trend: "-1.8% vs last run",
        color: "bg-[var(--dashboard-completed)]",
        trendColor: "text-[var(--dashboard-no-show)]",
        lastSixDays: [31, 48, 68, 76, 59, 66],
      },
      {
        label: "Patient satisfaction",
        value: "49",
        suffix: "/5",
        trend: "0.6pts this month",
        color: "bg-[var(--dashboard-secondary)]",
        trendColor: "text-[var(--dashboard-completed)]",
        lastSixDays: [17, 31, 49, 36, 44, 33],
      },
    ],
    appointmentVolume: [
      { week: "Week 1", scheduled: 218, completed: 201, noShow: 18 },
      { week: "Week 2", scheduled: 242, completed: 209, noShow: 21 },
      { week: "Week 3", scheduled: 226, completed: 193, noShow: 29 },
      { week: "Week 4", scheduled: 248, completed: 214, noShow: 16 },
    ],
    appointmentStats: [
      ["1098", "Total this month"],
      ["93%", "Completion rate"],
      ["38", "No - shows"],
    ],
    departmentLoad: [
      {
        label: "General",
        value: 44,
        percent: "37.9%",
        progress: 37.9,
        color: "bg-[var(--dashboard-scheduled)]",
      },
      {
        label: "Cardiology",
        value: 26,
        percent: "22.4%",
        progress: 22.4,
        color: "bg-[var(--dashboard-secondary)]",
      },
      {
        label: "Paediatrics",
        value: 21,
        percent: "18.1%",
        progress: 18.1,
        color: "bg-[var(--dashboard-completed)]",
      },
      {
        label: "Orthopaedics",
        value: 15,
        percent: "12.9%",
        progress: 12.9,
        color: "bg-[var(--dashboard-no-show)]",
      },
      {
        label: "Obs/Gynae",
        value: 10,
        percent: "8.6%",
        progress: 8.6,
        color: "bg-destructive",
      },
    ],
    appointments: [
      {
        time: "09:00",
        patient: "Maya Rodriguez",
        type: "Cardiology",
        doctor: "Dr. Patel",
        status: "Confirmed" as DashboardAppointmentStatus,
      },
      {
        time: "09:30",
        patient: "James Tan",
        type: "General",
        doctor: "Dr. Thompson",
        status: "Done" as DashboardAppointmentStatus,
      },
      {
        time: "10:00",
        patient: "Emma Davis",
        type: "Pediatric",
        doctor: "Dr. Wilson",
        status: "In progress" as DashboardAppointmentStatus,
      },
      {
        time: "10:30",
        patient: "Mason Brown",
        type: "Oncology",
        doctor: "Dr. Johnson",
        status: "Waiting" as DashboardAppointmentStatus,
      },
    ],
    staffPerformance: [
      {
        name: "Dr. Patel",
        role: "Cardiologist",
        points: 26,
        rating: "92%",
        avatar: staffPatel,
      },
      {
        name: "Dr. Harrison",
        role: "Cardiologist",
        points: 21,
        rating: "95%",
        avatar: staffHarrison,
      },
      {
        name: "Dr. Jefferson",
        role: "Cardiologist",
        points: 17,
        rating: "89%",
        avatar: staffJefferson,
      },
    ],
    resources: [
      {
        label: "Beds",
        value: 76,
        unit: "Used",
        Icon: BedIcon,
        color: "bg-[var(--dashboard-scheduled)]",
      },
      {
        label: "Lab Equipment",
        value: 72,
        unit: "Active",
        Icon: FlaskConicalIcon,
        color: "bg-[var(--dashboard-completed)]",
      },
      {
        label: "Medication Stock",
        value: 84,
        unit: "Used",
        Icon: PillIcon,
        color: "bg-[var(--dashboard-secondary)]",
      },
      {
        label: "Consult Rooms",
        value: 69,
        unit: "Occupied",
        Icon: Building2Icon,
        color: "bg-[var(--dashboard-no-show)]",
      },
    ],
  },
  "jun-2026": {
    metrics: [
      {
        label: "Today's appointments",
        value: "41",
        suffix: undefined,
        trend: "4 fewer than yesterday",
        color: "bg-[var(--dashboard-scheduled)]",
        trendColor: "text-[var(--dashboard-no-show)]",
        lastSixDays: [25, 41, 33, 47, 38, 29],
      },
      {
        label: "Avg. wait time",
        value: "17",
        suffix: "min",
        trend: "5min above target",
        color: "bg-[var(--dashboard-no-show)]",
        trendColor: "text-[var(--dashboard-no-show)]",
        lastSixDays: [8, 15, 21, 16, 18, 13],
      },
      {
        label: "Bed occupancy",
        value: "88",
        suffix: "%",
        trend: "+3.1% vs last run",
        color: "bg-[var(--dashboard-completed)]",
        trendColor: "text-[var(--dashboard-completed)]",
        lastSixDays: [41, 62, 88, 71, 79, 64],
      },
      {
        label: "Patient satisfaction",
        value: "46",
        suffix: "/5",
        trend: "-0.2pts this month",
        color: "bg-[var(--dashboard-secondary)]",
        trendColor: "text-[var(--dashboard-no-show)]",
        lastSixDays: [20, 34, 46, 39, 44, 30],
      },
    ],
    appointmentVolume: [
      { week: "Week 1", scheduled: 188, completed: 154, noShow: 31 },
      { week: "Week 2", scheduled: 207, completed: 168, noShow: 44 },
      { week: "Week 3", scheduled: 191, completed: 162, noShow: 26 },
      { week: "Week 4", scheduled: 214, completed: 171, noShow: 40 },
    ],
    appointmentStats: [
      ["932", "Total this month"],
      ["86%", "Completion rate"],
      ["61", "No - shows"],
    ],
    departmentLoad: [
      {
        label: "General",
        value: 31,
        percent: "33.3%",
        progress: 33.3,
        color: "bg-[var(--dashboard-scheduled)]",
      },
      {
        label: "Cardiology",
        value: 19,
        percent: "20.4%",
        progress: 20.4,
        color: "bg-[var(--dashboard-secondary)]",
      },
      {
        label: "Paediatrics",
        value: 16,
        percent: "17.2%",
        progress: 17.2,
        color: "bg-[var(--dashboard-completed)]",
      },
      {
        label: "Orthopaedics",
        value: 14,
        percent: "15.1%",
        progress: 15.1,
        color: "bg-[var(--dashboard-no-show)]",
      },
      {
        label: "Obs/Gynae",
        value: 13,
        percent: "14%",
        progress: 14,
        color: "bg-destructive",
      },
    ],
    appointments: [
      {
        time: "08:45",
        patient: "Lucas Papadopoulos",
        type: "General",
        doctor: "Dr. Kline",
        status: "Waiting" as DashboardAppointmentStatus,
      },
      {
        time: "09:15",
        patient: "Charlotte Wilson",
        type: "Neurology",
        doctor: "Dr. Harris",
        status: "Confirmed" as DashboardAppointmentStatus,
      },
      {
        time: "10:00",
        patient: "Amelia Martinez",
        type: "Surgical",
        doctor: "Dr. Rivera",
        status: "In progress" as DashboardAppointmentStatus,
      },
      {
        time: "10:30",
        patient: "Liam O'Sullivan",
        type: "General",
        doctor: "Dr. Patel",
        status: "Done" as DashboardAppointmentStatus,
      },
    ],
    staffPerformance: [
      {
        name: "Dr. Jefferson",
        role: "Cardiologist",
        points: 19,
        rating: "93%",
        avatar: staffJefferson,
      },
      {
        name: "Dr. Harrison",
        role: "Cardiologist",
        points: 16,
        rating: "90%",
        avatar: staffHarrison,
      },
      {
        name: "Dr. Patel",
        role: "Cardiologist",
        points: 15,
        rating: "87%",
        avatar: staffPatel,
      },
    ],
    resources: [
      {
        label: "Beds",
        value: 88,
        unit: "Used",
        Icon: BedIcon,
        color: "bg-[var(--dashboard-scheduled)]",
      },
      {
        label: "Lab Equipment",
        value: 61,
        unit: "Active",
        Icon: FlaskConicalIcon,
        color: "bg-[var(--dashboard-completed)]",
      },
      {
        label: "Medication Stock",
        value: 79,
        unit: "Used",
        Icon: PillIcon,
        color: "bg-[var(--dashboard-secondary)]",
      },
      {
        label: "Consult Rooms",
        value: 82,
        unit: "Occupied",
        Icon: Building2Icon,
        color: "bg-[var(--dashboard-no-show)]",
      },
    ],
  },
  "jul-2026": {
    metrics: dashboardMetrics,
    appointmentVolume: [
      { week: "Week 1", scheduled: 224, completed: 184, noShow: 23 },
      { week: "Week 2", scheduled: 229, completed: 191, noShow: 30 },
      { week: "Week 3", scheduled: 217, completed: 185, noShow: 18 },
      { week: "Week 4", scheduled: 235, completed: 197, noShow: 25 },
    ],
    appointmentStats: [
      ["1012", "Total this month"],
      ["90%", "Completion rate"],
      ["46", "No - shows"],
    ],
    departmentLoad: dashboardDepartmentLoad,
    appointments: dashboardAppointments,
    staffPerformance: dashboardStaffPerformance,
    resources: dashboardResources,
  },
  "aug-2026": {
    metrics: [
      {
        label: "Today's appointments",
        value: "52",
        suffix: undefined,
        trend: "7 more than yesterday",
        color: "bg-[var(--dashboard-scheduled)]",
        trendColor: "text-[var(--dashboard-completed)]",
        lastSixDays: [20, 34, 52, 40, 47, 35],
      },
      {
        label: "Avg. wait time",
        value: "13",
        suffix: "min",
        trend: "1min above target",
        color: "bg-[var(--dashboard-no-show)]",
        trendColor: "text-[var(--dashboard-no-show)]",
        lastSixDays: [7, 14, 20, 15, 18, 13],
      },
      {
        label: "Bed occupancy",
        value: "84",
        suffix: "%",
        trend: "+1.4% vs last run",
        color: "bg-[var(--dashboard-completed)]",
        trendColor: "text-[var(--dashboard-completed)]",
        lastSixDays: [38, 59, 84, 66, 75, 61],
      },
      {
        label: "Patient satisfaction",
        value: "48",
        suffix: "/5",
        trend: "0.4pts this month",
        color: "bg-[var(--dashboard-secondary)]",
        trendColor: "text-[var(--dashboard-completed)]",
        lastSixDays: [15, 27, 48, 35, 42, 30],
      },
    ],
    appointmentVolume: [
      { week: "Week 1", scheduled: 236, completed: 198, noShow: 17 },
      { week: "Week 2", scheduled: 228, completed: 188, noShow: 24 },
      { week: "Week 3", scheduled: 242, completed: 206, noShow: 13 },
      { week: "Week 4", scheduled: 218, completed: 179, noShow: 26 },
    ],
    appointmentStats: [
      ["1064", "Total this month"],
      ["92%", "Completion rate"],
      ["40", "No - shows"],
    ],
    departmentLoad: [
      {
        label: "General",
        value: 41,
        percent: "36.6%",
        progress: 36.6,
        color: "bg-[var(--dashboard-scheduled)]",
      },
      {
        label: "Cardiology",
        value: 24,
        percent: "21.4%",
        progress: 21.4,
        color: "bg-[var(--dashboard-secondary)]",
      },
      {
        label: "Paediatrics",
        value: 20,
        percent: "17.9%",
        progress: 17.9,
        color: "bg-[var(--dashboard-completed)]",
      },
      {
        label: "Orthopaedics",
        value: 15,
        percent: "13.4%",
        progress: 13.4,
        color: "bg-[var(--dashboard-no-show)]",
      },
      {
        label: "Obs/Gynae",
        value: 12,
        percent: "10.7%",
        progress: 10.7,
        color: "bg-destructive",
      },
    ],
    appointments: dashboardAppointments,
    staffPerformance: dashboardStaffPerformance,
    resources: [
      {
        label: "Beds",
        value: 84,
        unit: "Used",
        Icon: BedIcon,
        color: "bg-[var(--dashboard-scheduled)]",
      },
      {
        label: "Lab Equipment",
        value: 70,
        unit: "Active",
        Icon: FlaskConicalIcon,
        color: "bg-[var(--dashboard-completed)]",
      },
      {
        label: "Medication Stock",
        value: 88,
        unit: "Used",
        Icon: PillIcon,
        color: "bg-[var(--dashboard-secondary)]",
      },
      {
        label: "Consult Rooms",
        value: 77,
        unit: "Occupied",
        Icon: Building2Icon,
        color: "bg-[var(--dashboard-no-show)]",
      },
    ],
  },
} as const;

export function filterBatchTransactions(
  transactions: typeof batchTransactions,
  statusFilter: BatchStatusFilter,
) {
  if (statusFilter === "all") return [...transactions];
  return transactions.filter((row) => row.status === statusFilter);
}

export function buildBatchExportCsv(
  transactions: ReturnType<typeof filterBatchTransactions>,
) {
  const header = [
    "Status",
    "Transaction ID",
    "PO",
    "Vendor",
    "Amount",
    "Sources",
    "Confidence",
    "Note",
  ];

  const rows = transactions.map((row) => [
    row.status,
    row.transactionId,
    row.po,
    row.vendor,
    row.amount,
    row.sources.map((source) => sourceLabels[source]).join(" | "),
    `${row.confidence}%`,
    "confidenceNote" in row && row.confidenceNote ? row.confidenceNote : "",
  ]);

  return [header, ...rows]
    .map((cells) =>
      cells.map((cell) => `"${String(cell).replaceAll('"', '""')}"`).join(","),
    )
    .join("\n");
}
```

### `src/components/dashboards/medesk-dashboard/demo.tsx`

```tsx
import type { ReactNode } from "react";
import DashboardLayout from "./dashboard-layout";
import { DashboardPage } from "./components/medesk/dashboard-content";
import {
  DashboardNavigationProvider,
  useDashboardNavigation,
} from "./components/medesk/navigation";
import { ThemeProvider } from "./components/medesk/theme-provider";

const blankRoutes = new Set([
  "/appointment",
  "/staff",
  "/departments",
  "/resources",
  "/analytics",
  "/reports",
  "/trends",
  "/ai-assistant",
  "/smart-queries",
  "/settings",
  "/integrations",
  "/permissions",
]);

function DashboardRoute() {
  const { pathname } = useDashboardNavigation();

  const content: ReactNode = blankRoutes.has(pathname) ? null : (
    <DashboardPage />
  );

  return <DashboardLayout>{content}</DashboardLayout>;
}

export default function MedeskDashboardDemo() {
  return (
    <ThemeProvider defaultTheme="system" storageKey="medesk-theme">
      <DashboardNavigationProvider>
        <DashboardRoute />
      </DashboardNavigationProvider>
    </ThemeProvider>
  );
}
```
