# Tallie dashboard

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

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

## Install

```bash
npx shadcn@latest add https://registry.watermelon.sh/r/tallie-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`
- Registry items: `button`, `dropdown-menu`, `input-group`, `sheet`, `sidebar`, `table`, `utils`

## Files

### `src/components/dashboards/tallie-dashboard/components/tallie/dashboard-page.tsx`

```tsx
import { useMemo, useState } from "react";
import {
  ArrowUpRightIcon,
  ArrowsCounterClockwiseIcon,
  CheckCircleIcon,
  ClockIcon,
  FadersHorizontalIcon,
  FileArrowUpIcon,
  PauseIcon,
  PlayIcon,
  SealCheckIcon,
  SpinnerGapIcon,
  StatusWarningIcon,
  WarningIcon,
} from "./icons";
import { TransactionDetailsSheet } from "./transaction-details-sheet";
import { Button, buttonVariants } from "@/components/ui/button";
import {
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuRadioGroup,
  DropdownMenuRadioItem,
  DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu";
import {
  Table,
  TableBody,
  TableCell,
  TableHead,
  TableHeader,
  TableRow,
} from "@/components/ui/table";
import {
  auditControls,
  batchStatusFilters,
  batchTransactions,
  buildBatchExportCsv,
  filterBatchTransactions,
  metrics,
  sourceLabels,
  type BatchStatus,
  type BatchStatusFilter,
  type BatchTransaction,
  type SourceKind,
} from "../../data";
import { cn } from "@/lib/utils";

const metricIcons = {
  clock: ClockIcon,
  seal: SealCheckIcon,
  warning: WarningIcon,
  arrows: ArrowsCounterClockwiseIcon,
} as const;

const sourceClassName: Record<SourceKind, string> = {
  oracle: "bg-(--source-oracle)/15 text-(--source-oracle)",
  sharepoint: "bg-(--source-sharepoint)/15 text-(--source-sharepoint)",
  concur: "bg-(--source-concur)/15 text-(--source-concur)",
  email: "bg-(--source-email)/15 text-(--source-email)",
};

const statusConfig: Record<
  BatchStatus,
  { label: string; className: string; Icon: typeof SpinnerGapIcon }
> = {
  processing: {
    label: "Processing",
    className: "text-(--status-processing)",
    Icon: SpinnerGapIcon,
  },
  completed: {
    label: "Completed",
    className: "text-(--status-completed)",
    Icon: CheckCircleIcon,
  },
  exception: {
    label: "Exception",
    className: "text-(--status-exception)",
    Icon: StatusWarningIcon,
  },
};

const tableHeadClassName =
  "h-12.5 bg-zinc-50 text-base tracking-tight dark:bg-card";

const outlineActionClassName = "h-8.5 gap-1 px-3.5 shadow-xs";

function LiveBadge({
  live,
  size = "md",
}: {
  live: boolean;
  size?: "md" | "sm";
}) {
  return (
    <span
      className={cn(
        "inline-flex items-center justify-center rounded-lg font-medium",
        live
          ? "bg-(--live)/10 text-(--live)"
          : "bg-muted text-muted-foreground",
        size === "md" && "gap-1.25 px-4 py-2.5 text-xs leading-4.5",
        size === "sm" &&
          "gap-[2.9px] rounded-[5.8px] px-[9.25px] py-[5.8px] text-[7px] leading-[10.4px]",
      )}
    >
      <span
        className={cn(
          "rounded-full",
          live ? "bg-(--live)" : "bg-muted-foreground",
          size === "md" ? "size-2.25" : "size-[5.2px]",
          live && size === "md" && "live-dot-pulse",
        )}
      />
      {live ? "Live" : "Paused"}
    </span>
  );
}

export function DashboardPage() {
  const [isLive, setIsLive] = useState<boolean>(auditControls.defaultLive);
  const [statusFilter, setStatusFilter] = useState<BatchStatusFilter>("all");
  const [selectedTransaction, setSelectedTransaction] =
    useState<BatchTransaction | null>(null);

  const filteredTransactions = useMemo(
    () => filterBatchTransactions(batchTransactions, statusFilter),
    [statusFilter],
  );

  const activeFilterLabel =
    batchStatusFilters.find((filter) => filter.value === statusFilter)?.label ??
    "All statuses";

  function handleRunAudit() {
    setIsLive(true);
  }

  function handlePause() {
    setIsLive(false);
  }

  function handleExport() {
    const csv = buildBatchExportCsv(filteredTransactions);
    const blob = new Blob([csv], { type: "text/csv;charset=utf-8;" });
    const url = URL.createObjectURL(blob);
    const link = document.createElement("a");
    link.href = url;
    link.download = `tallie-batch-${statusFilter}.csv`;
    link.click();
    URL.revokeObjectURL(url);
  }

  return (
    <div className="flex flex-col gap-10 px-4 py-6 md:px-8 md:py-10">
      <div className="flex flex-col gap-4 md:flex-row md:items-end md:justify-between">
        <div className="flex flex-col gap-1">
          <h1 className="font-serif text-3xl leading-snug tracking-tight">
            Three-Way Match Audit
          </h1>
          <p className="text-lg text-muted-foreground">
            Real time validation of transaction
          </p>
        </div>

        <div className="flex flex-wrap items-center gap-3">
          <LiveBadge live={isLive} />
          <Button
            className="h-10 gap-1 px-3.5"
            disabled={isLive}
            onClick={handleRunAudit}
          >
            Run Audit
            <PlayIcon />
          </Button>
          <Button
            variant="outline"
            className="h-10 gap-1 px-3.5 shadow-sm"
            disabled={!isLive}
            onClick={handlePause}
          >
            Pause
            <PauseIcon />
          </Button>
        </div>
      </div>

      <section className="flex flex-col gap-3">
        <h2 className="text-lg font-medium">Metrics</h2>
        <div className="grid gap-3 sm:grid-cols-2 xl:grid-cols-4">
          {metrics.map((metric) => {
            const Icon = metricIcons[metric.icon];
            const showLiveTrend =
              "tone" in metric.trend && metric.trend.tone === "live";
            return (
              <div
                key={metric.id}
                className="flex h-37.5 flex-col justify-between rounded-xl border bg-zinc-50 p-4 dark:bg-card"
              >
                <div className="flex items-start gap-2">
                  <Icon className="size-5" />
                  <span className="text-sm font-medium tracking-tight">
                    {metric.label}
                  </span>
                </div>
                <div className="flex flex-col gap-3">
                  <p className="text-3xl leading-none font-medium">
                    {metric.value}
                  </p>
                  <div className="flex items-center gap-1 text-xs">
                    {"tone" in metric.trend && metric.trend.tone === "up" ? (
                      <ArrowUpRightIcon className="size-4 text-(--trend)" />
                    ) : null}
                    {showLiveTrend ? (
                      <SpinnerGapIcon
                        className={cn(
                          "size-4 text-(--status-processing)",
                          isLive && "animate-spin",
                        )}
                      />
                    ) : null}
                    <span>
                      <span className="font-medium">
                        {showLiveTrend
                          ? isLive
                            ? metric.trend.value
                            : "Paused"
                          : metric.trend.value}
                      </span>{" "}
                      <span className="text-muted-foreground">
                        {metric.trend.label}
                      </span>
                    </span>
                  </div>
                </div>
              </div>
            );
          })}
        </div>
      </section>

      <section className="flex flex-col gap-5">
        <div className="flex flex-col gap-3 md:flex-row md:items-end md:justify-between">
          <div className="flex flex-col gap-2">
            <div className="flex flex-wrap items-center gap-2">
              <h2 className="text-lg font-medium">Current processing Batch</h2>
              <LiveBadge live={isLive} size="sm" />
            </div>
            <p className="text-sm text-muted-foreground">
              {isLive
                ? "Live transaction with auto scrolling"
                : "Audit paused — resume to continue processing"}
            </p>
          </div>
          <div className="flex w-full items-center justify-between md:w-auto md:justify-start md:gap-2">
            <DropdownMenu>
              <DropdownMenuTrigger
                type="button"
                className={buttonVariants({
                  variant: "outline",
                  className: outlineActionClassName,
                })}
              >
                {statusFilter === "all" ? "Filter" : activeFilterLabel}
                <FadersHorizontalIcon />
              </DropdownMenuTrigger>
              <DropdownMenuContent
                align="start"
                className="tallie-dashboard w-48"
              >
                <DropdownMenuRadioGroup
                  value={statusFilter}
                  onValueChange={(value) =>
                    setStatusFilter(value as BatchStatusFilter)
                  }
                >
                  {batchStatusFilters.map((filter) => {
                    const FilterIcon = filter.icon;
                    return (
                      <DropdownMenuRadioItem
                        key={filter.value}
                        value={filter.value}
                        className="gap-2 text-muted-foreground data-[state=checked]:font-medium data-[state=checked]:text-foreground"
                      >
                        <FilterIcon
                          className={cn(
                            filter.value === "processing" &&
                              "text-(--status-processing)!",
                            filter.value === "completed" &&
                              "text-(--status-completed)!",
                            filter.value === "exception" &&
                              "text-(--status-exception)!",
                          )}
                        />
                        {filter.label}
                      </DropdownMenuRadioItem>
                    );
                  })}
                </DropdownMenuRadioGroup>
              </DropdownMenuContent>
            </DropdownMenu>
            <Button
              variant="outline"
              className={outlineActionClassName}
              onClick={handleExport}
            >
              Export
              <FileArrowUpIcon />
            </Button>
          </div>
        </div>

        <div className="overflow-hidden rounded-xl bg-zinc-50/40 dark:bg-card/40">
          <Table>
            <TableHeader>
              <TableRow className="hover:bg-transparent">
                <TableHead className={cn(tableHeadClassName, "min-w-40 px-4")}>
                  Status
                </TableHead>
                <TableHead className={cn(tableHeadClassName, "min-w-45 px-0")}>
                  Transaction ID
                </TableHead>
                <TableHead
                  className={cn(tableHeadClassName, "min-w-42.5 px-0")}
                >
                  Vendor
                </TableHead>
                <TableHead
                  className={cn(tableHeadClassName, "min-w-42.5 px-0")}
                >
                  Amount
                </TableHead>
                <TableHead className={cn(tableHeadClassName, "min-w-60 px-0")}>
                  Sources
                </TableHead>
                <TableHead className={cn(tableHeadClassName, "min-w-35 px-0")}>
                  Confidence
                </TableHead>
              </TableRow>
            </TableHeader>
            <TableBody>
              {filteredTransactions.length === 0 ? (
                <TableRow className="hover:bg-transparent">
                  <TableCell
                    colSpan={6}
                    className="h-24 px-4 text-center text-muted-foreground"
                  >
                    No transactions match this filter.
                  </TableCell>
                </TableRow>
              ) : (
                filteredTransactions.map((row) => {
                  const status = statusConfig[row.status];
                  const StatusIcon = status.Icon;
                  return (
                    <TableRow
                      key={row.id}
                      className="h-18 cursor-pointer hover:bg-muted/50"
                      tabIndex={0}
                      onClick={() => setSelectedTransaction(row)}
                      onKeyDown={(event) => {
                        if (event.key === "Enter" || event.key === " ") {
                          event.preventDefault();
                          setSelectedTransaction(row);
                        }
                      }}
                    >
                      <TableCell className="px-4 py-4">
                        <div
                          className={cn(
                            "inline-flex h-7.5 items-center gap-2 rounded-xl py-1 pr-4 pl-3 text-sm font-medium",
                            status.className,
                          )}
                        >
                          <StatusIcon
                            className={cn(
                              "size-4",
                              row.status === "processing" &&
                                isLive &&
                                "animate-spin",
                            )}
                          />
                          {status.label}
                        </div>
                      </TableCell>
                      <TableCell className="px-0 py-4">
                        <div className="flex flex-col gap-1">
                          <span className="text-base font-medium tracking-tight">
                            {row.transactionId}
                          </span>
                          <span className="text-xs text-muted-foreground">
                            PO:: {row.po}
                          </span>
                        </div>
                      </TableCell>
                      <TableCell className="px-0 py-4 text-base font-medium tracking-tight">
                        {row.vendor}
                      </TableCell>
                      <TableCell className="px-0 py-4 font-mono text-base font-medium">
                        {row.amount}
                      </TableCell>
                      <TableCell className="px-0 py-4">
                        <div className="flex flex-wrap gap-1.5">
                          {row.sources.map((source) => (
                            <span
                              key={source}
                              className={cn(
                                "rounded px-2 py-0.5 text-xs tracking-tight",
                                source === "oracle" && "font-medium",
                                sourceClassName[source],
                              )}
                            >
                              {sourceLabels[source]}
                            </span>
                          ))}
                        </div>
                      </TableCell>
                      <TableCell className="px-0 py-4">
                        <div className="flex flex-col gap-1">
                          <span className="text-base font-medium tracking-tight">
                            {row.confidence}%
                          </span>
                          {"confidenceNote" in row && row.confidenceNote ? (
                            <span className="text-xs font-medium tracking-tight text-(--status-exception)">
                              {row.confidenceNote}
                            </span>
                          ) : null}
                        </div>
                      </TableCell>
                    </TableRow>
                  );
                })
              )}
            </TableBody>
          </Table>
        </div>
      </section>

      <TransactionDetailsSheet
        transaction={selectedTransaction}
        open={selectedTransaction !== null}
        onOpenChange={(open) => {
          if (!open) setSelectedTransaction(null);
        }}
      />
    </div>
  );
}
```

### `src/components/dashboards/tallie-dashboard/components/tallie/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}>
      <path
        d="M17.1336 8.49063L10.8836 2.24063C10.6492 2.00638 10.3314 1.8748 10 1.8748C9.66862 1.8748 9.3508 2.00638 9.11641 2.24063L2.86641 8.49063C2.74977 8.6064 2.65731 8.7442 2.59441 8.89602C2.53151 9.04785 2.49942 9.21066 2.5 9.375V16.875C2.5 17.0408 2.56585 17.1997 2.68306 17.3169C2.80027 17.4342 2.95924 17.5 3.125 17.5H16.875C17.0408 17.5 17.1997 17.4342 17.3169 17.3169C17.4342 17.1997 17.5 17.0408 17.5 16.875V9.375C17.5006 9.21066 17.4685 9.04785 17.4056 8.89602C17.3427 8.7442 17.2502 8.6064 17.1336 8.49063ZM16.25 16.25H3.75V9.375L10 3.125L16.25 9.375V16.25Z"
        fill="currentColor"
      />
    </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}>
      <path
        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"
      />
    </Icon>
  );
}

export function ShieldCheckIcon({ className, ...props }: IconProps) {
  return (
    <Icon className={className} {...props}>
      <path
        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"
      />
    </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}>
      <path
        d="M10 6.25C9.25832 6.25 8.5333 6.46993 7.91661 6.88199C7.29993 7.29404 6.81928 7.87971 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.64645 10.9942 6.25103 10 6.25ZM10 12.5C9.50555 12.5 9.0222 12.3534 8.61107 12.0787C8.19995 11.804 7.87952 11.4135 7.6903 10.9567C7.50108 10.4999 7.45157 9.99723 7.54804 9.51227C7.6445 9.02732 7.8826 8.58186 8.23223 8.23223C8.58186 7.8826 9.02732 7.6445 9.51227 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.5ZM18.5891 8.37578C18.5717 8.28777 18.5355 8.20454 18.4831 8.13174C18.4306 8.05895 18.3631 7.99829 18.2852 7.95391L15.9547 6.62578L15.9453 3.99922C15.945 3.90876 15.9251 3.81944 15.8869 3.73743C15.8488 3.65542 15.7933 3.58268 15.7242 3.52422C14.8789 2.80914 13.9053 2.26115 12.8555 1.90938C12.7728 1.88139 12.6852 1.87103 12.5982 1.87897C12.5113 1.88691 12.427 1.91297 12.3508 1.95547L10 3.26953L7.64687 1.95313C7.57059 1.91039 7.48618 1.88413 7.39911 1.87606C7.31204 1.86798 7.22425 1.87827 7.14141 1.90625C6.0923 2.26059 5.11992 2.81068 4.27578 3.52734C4.20685 3.58572 4.15139 3.65834 4.11322 3.7402C4.07505 3.82207 4.05508 3.91124 4.05469 4.00156L4.04297 6.63047L1.7125 7.95859C1.63453 8.00298 1.56703 8.06363 1.51459 8.13643C1.46216 8.20923 1.426 8.29246 1.40859 8.38047C1.19531 9.45225 1.19531 10.5556 1.40859 11.6273C1.426 11.7154 1.46216 11.7986 1.51459 11.8714C1.56703 11.9442 1.63453 12.0048 1.7125 12.0492L4.04297 13.3773L4.05234 16.0039C4.05263 16.0944 4.07254 16.1837 4.11071 16.2657C4.14889 16.3477 4.20441 16.4204 4.27344 16.4789C5.11881 17.194 6.09231 17.742 7.14219 18.0938C7.22487 18.1217 7.31249 18.1321 7.39941 18.1242C7.48634 18.1162 7.57063 18.0902 7.64687 18.0477L10 16.7305L12.3531 18.0469C12.4462 18.0988 12.5512 18.1257 12.6578 18.125C12.7261 18.125 12.7939 18.1139 12.8586 18.0922C13.9076 17.7383 14.88 17.1888 15.7242 16.4727C15.7932 16.4143 15.8486 16.3417 15.8868 16.2598C15.9249 16.1779 15.9449 16.0888 15.9453 15.9984L15.957 13.3695L18.2875 12.0414C18.3655 11.997 18.433 11.9364 18.4854 11.8636C18.5378 11.7908 18.574 11.7075 18.5914 11.6195C18.8035 10.5486 18.8027 9.4464 18.5891 8.37578ZM17.4172 11.1031L15.1852 12.3727C15.0874 12.4283 15.0064 12.5092 14.9508 12.607C14.9055 12.6852 14.8578 12.768 14.8094 12.8461C14.7474 12.9446 14.7143 13.0586 14.7141 13.175L14.7023 15.6945C14.1024 16.1657 13.434 16.5424 12.7203 16.8117L10.4687 15.557C10.3753 15.5053 10.2701 15.4784 10.1633 15.4789H10.1484C10.0539 15.4789 9.95859 15.4789 9.86406 15.4789C9.75226 15.4761 9.64171 15.5031 9.54375 15.557L7.29062 16.8148C6.5754 16.5476 5.90517 16.1727 5.30312 15.7031L5.29453 13.1875C5.29415 13.0709 5.26113 12.9567 5.19922 12.8578C5.15078 12.7797 5.10312 12.7016 5.05859 12.6188C5.00338 12.5194 4.92241 12.4369 4.82422 12.3797L2.58984 11.107C2.47422 10.3756 2.47422 9.63062 2.58984 8.89922L4.81797 7.62734C4.91576 7.57174 4.99674 7.49076 5.05234 7.39297C5.09766 7.31484 5.14531 7.23203 5.19375 7.15391C5.25575 7.05539 5.28878 6.94141 5.28906 6.825L5.30078 4.30547C5.90073 3.83433 6.56911 3.45759 7.28281 3.18828L9.53125 4.44297C9.6291 4.49721 9.73972 4.52419 9.85156 4.52109C9.94609 4.52109 10.0414 4.52109 10.1359 4.52109C10.2477 4.52389 10.3583 4.49693 10.4562 4.44297L12.7094 3.18516C13.4246 3.4524 14.0948 3.8273 14.6969 4.29688L14.7055 6.8125C14.7059 6.92914 14.7389 7.04334 14.8008 7.14219C14.8492 7.22031 14.8969 7.29844 14.9414 7.38125C14.9966 7.48056 15.0776 7.56314 15.1758 7.62031L17.4102 8.89297C17.5273 9.62493 17.5286 10.3708 17.4141 11.1031H17.4172Z"
        fill="currentColor"
      />
    </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 (
    <svg
      viewBox="0 0 18 18"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn("size-4.5", className)}
      {...props}
    >
      <path
        d="M15.023 7.14797L9.39797 12.773C9.34573 12.8253 9.28369 12.8668 9.2154 12.8951C9.14712 12.9234 9.07392 12.9379 9 12.9379C8.92608 12.9379 8.85288 12.9234 8.7846 12.8951C8.71631 12.8668 8.65427 12.8253 8.60203 12.773L2.97703 7.14797C2.87148 7.04242 2.81219 6.89927 2.81219 6.75C2.81219 6.60073 2.87148 6.45758 2.97703 6.35203C3.08258 6.24648 3.22573 6.18719 3.375 6.18719C3.52427 6.18719 3.66742 6.24648 3.77297 6.35203L9 11.5798L14.227 6.35203C14.2793 6.29977 14.3413 6.25831 14.4096 6.23003C14.4779 6.20174 14.5511 6.18719 14.625 6.18719C14.6989 6.18719 14.7721 6.20174 14.8404 6.23003C14.9087 6.25831 14.9707 6.29977 15.023 6.35203C15.0752 6.40429 15.1167 6.46634 15.145 6.53462C15.1733 6.6029 15.1878 6.67609 15.1878 6.75C15.1878 6.82391 15.1733 6.8971 15.145 6.96538C15.1167 7.03366 15.0752 7.09571 15.023 7.14797Z"
        fill="currentColor"
      />
    </svg>
  );
}

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
      viewBox="0 0 15 15.625"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn("size-3.75", className)}
      {...props}
    >
      <path
        d="M13.5672 8.30781C13.6253 8.36588 13.6713 8.43482 13.7027 8.51069C13.7342 8.58656 13.7503 8.66788 13.7503 8.75C13.7503 8.83212 13.7342 8.91344 13.7027 8.98931C13.6713 9.06518 13.6253 9.13412 13.5672 9.19219C13.5091 9.25026 13.4402 9.29632 13.3643 9.32775C13.2884 9.35917 13.2071 9.37535 13.125 9.37535C13.0429 9.37535 12.9616 9.35917 12.8857 9.32775C12.8098 9.29632 12.7409 9.25026 12.6828 9.19219L8.125 4.63359V15C8.125 15.1658 8.05915 15.3247 7.94194 15.4419C7.82473 15.5592 7.66576 15.625 7.5 15.625C7.33424 15.625 7.17527 15.5592 7.05806 15.4419C6.94085 15.3247 6.875 15.1658 6.875 15V4.63359L2.31719 9.19219C2.25912 9.25026 2.19018 9.29632 2.11431 9.32775C2.03844 9.35917 1.95712 9.37535 1.875 9.37535C1.79288 9.37535 1.71156 9.35917 1.63569 9.32775C1.55982 9.29632 1.49088 9.25026 1.43281 9.19219C1.37474 9.13412 1.32868 9.06518 1.29725 8.98931C1.26583 8.91344 1.24965 8.83212 1.24965 8.75C1.24965 8.66788 1.26583 8.58656 1.29725 8.51069C1.32868 8.43482 1.37474 8.36588 1.43281 8.30781L7.05781 2.68281C7.11586 2.6247 7.18479 2.5786 7.26066 2.54715C7.33654 2.5157 7.41787 2.49951 7.5 2.49951C7.58213 2.49951 7.66346 2.5157 7.73934 2.54715C7.81521 2.5786 7.88414 2.6247 7.94219 2.68281L13.5672 8.30781ZM14.375 0H0.625C0.45924 0 0.300269 0.0658481 0.183058 0.183058C0.0658481 0.300269 0 0.45924 0 0.625C0 0.79076 0.0658481 0.949731 0.183058 1.06694C0.300269 1.18415 0.45924 1.25 0.625 1.25H14.375C14.5408 1.25 14.6997 1.18415 14.8169 1.06694C14.9342 0.949731 15 0.79076 15 0.625C15 0.45924 14.9342 0.300269 14.8169 0.183058C14.6997 0.0658481 14.5408 0 14.375 0Z"
        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>
  );
}
```

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

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

export function TallieLogo({ className, ...props }: SVGProps<SVGSVGElement>) {
  return (
    <svg
      viewBox="0 0 32 32"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
      className={cn("size-8", className)}
      {...props}
    >
      <path
        d="M15.1618 8.85808C14.8469 6.15898 14.5143 3.30915 14.5143 0H17.4857C17.4857 3.27198 17.1547 6.11819 16.8402 8.82032C16.5839 11.0224 16.3388 13.1288 16.2933 15.292C17.7853 13.7358 19.0904 12.0856 20.4576 10.357C22.1433 8.22584 23.9234 5.97556 26.2632 3.63571L28.3643 5.73683C26.0506 8.05048 23.8038 9.82888 21.6707 11.5173L21.6687 11.5188C19.9313 12.8942 18.2692 14.2099 16.708 15.7067C18.8632 15.6612 20.9529 15.4174 23.1418 15.1619C25.8409 14.8469 28.6909 14.5143 32 14.5143V17.4857C28.7282 17.4857 25.8819 17.1546 23.1799 16.8402L23.1779 16.84C20.9763 16.5838 18.8706 16.3389 16.708 16.2933C18.2632 17.7842 19.9125 19.0887 21.6399 20.455L21.6426 20.4573C23.7739 22.1431 26.0243 23.9231 28.3643 26.2632L26.2632 28.3643C23.9495 26.0507 22.1712 23.804 20.483 21.6711L20.479 21.6656L20.4757 21.6612C19.102 19.9265 17.7879 18.267 16.2933 16.708C16.3388 18.8712 16.5839 20.9776 16.8402 23.1797C17.1547 25.8818 17.4857 28.728 17.4857 32H14.5143C14.5143 28.6909 14.8469 25.841 15.1618 23.1419L15.1625 23.1375C15.4176 20.9502 15.6612 18.8618 15.7067 16.708C14.2121 18.267 12.898 19.9265 11.5243 21.6612L11.521 21.6656L11.517 21.6711C9.8288 23.804 8.05048 26.0507 5.73683 28.3643L3.63571 26.2632C5.97567 23.9231 8.22608 22.1431 10.3574 20.4573L10.3601 20.455C12.0875 19.0887 13.7368 17.7842 15.292 16.2933C13.1288 16.339 11.0223 16.584 8.82008 16.8402C6.11808 17.1546 3.27187 17.4857 0 17.4857V14.5143C3.30915 14.5143 6.15915 14.8469 8.85824 15.1619C11.0471 15.4174 13.1368 15.6612 15.292 15.7067C13.7302 14.2094 12.0674 12.8933 10.3293 11.5173C8.19624 9.82888 5.94933 8.05048 3.63571 5.73683L5.73683 3.63571C8.07656 5.97556 9.85672 8.22584 11.5424 10.357C12.9096 12.0855 14.2147 13.7357 15.7067 15.2918C15.6612 13.1382 15.4176 11.0498 15.1625 8.86248L15.1618 8.85808Z"
        fill="currentColor"
      />
    </svg>
  );
}
```

### `src/components/dashboards/tallie-dashboard/components/tallie/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/tallie-dashboard/components/tallie/sidebar.tsx`

```tsx
import {
  BookOpenIcon,
  CreditCardIcon,
  LogOutIcon,
  MessageCircleIcon,
  SettingsIcon,
  UserIcon as LucideUserIcon,
} from "lucide-react";
import {
  QuestionIcon,
  SidebarCollapseIcon,
  ToggleIcon,
  UserIcon,
} from "./icons";
import { TallieLogo } from "./logo";
import { DashboardLink, useDashboardNavigation } from "./navigation";
import { useTheme } from "./theme-provider";
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,
  useSidebar,
} from "@/components/ui/sidebar";
import { currentUser, navigationGroups, type NavigationItem } from "../../data";
import { cn } from "@/lib/utils";

const menuButtonClassName = cn(
  "h-11 gap-2.5 rounded-lg px-3 text-base text-sidebar-foreground/70 transition-colors",
  "aria-[current=page]:bg-background aria-[current=page]:font-medium aria-[current=page]:text-sidebar-accent-foreground",
  "data-open:bg-background data-open:text-sidebar-accent-foreground",
  "[&_svg]:size-5!",
  "group-data-[collapsible=icon]:size-11! group-data-[collapsible=icon]:justify-center group-data-[collapsible=icon]:p-0! group-data-[collapsible=icon]:[&>span]:hidden",
);

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 className="sidebar-badge-shadow static ml-auto rounded bg-background px-2 py-1.5 text-sm font-normal text-sidebar-foreground/70 group-aria-[current=page]/menu-button:font-medium group-aria-[current=page]/menu-button:text-sidebar-accent-foreground">
            {item.badge}
          </SidebarMenuBadge>
        ) : null}
      </DashboardLink>
    </SidebarMenuButton>
  );
}

function HelpItem() {
  return (
    <SidebarMenuItem>
      <DropdownMenu>
        <DropdownMenuTrigger
          type="button"
          className={cn(dropdownTriggerClassName, menuButtonClassName)}
          aria-label="Help"
        >
          <QuestionIcon />
          <span>Help</span>
        </DropdownMenuTrigger>
        <DropdownMenuContent
          side="top"
          align="start"
          className="tallie-dashboard w-56"
        >
          <DropdownMenuLabel className="font-normal">
            <p className="text-sm font-medium text-foreground">Need help?</p>
            <p>Guides, docs, and support for Tallie.</p>
          </DropdownMenuLabel>
          <DropdownMenuSeparator />
          <DropdownMenuGroup>
            <DropdownMenuItem asChild>
              <a
                href="https://docs.tallie.com"
                target="_blank"
                rel="noreferrer"
              >
                <BookOpenIcon />
                Documentation
              </a>
            </DropdownMenuItem>
            <DropdownMenuItem asChild>
              <a
                href="https://tallie.com/support"
                target="_blank"
                rel="noreferrer"
              >
                <MessageCircleIcon />
                Contact support
              </a>
            </DropdownMenuItem>
          </DropdownMenuGroup>
        </DropdownMenuContent>
      </DropdownMenu>
    </SidebarMenuItem>
  );
}

function DarkModeItem() {
  const { resolvedTheme, setTheme } = useTheme();
  const isDark = resolvedTheme === "dark";
  const label = isDark ? "Light Mode" : "Dark Mode";

  return (
    <SidebarMenuItem>
      <SidebarMenuButton
        tooltip={label}
        className={menuButtonClassName}
        onClick={() => setTheme(isDark ? "light" : "dark")}
      >
        <ToggleIcon pressed={isDark} />
        <span>{label}</span>
      </SidebarMenuButton>
    </SidebarMenuItem>
  );
}

function ProfileItem() {
  return (
    <SidebarMenuItem>
      <DropdownMenu>
        <DropdownMenuTrigger
          type="button"
          className={cn(dropdownTriggerClassName, menuButtonClassName)}
          aria-label="Profile"
        >
          <UserIcon />
          <span>Profile</span>
        </DropdownMenuTrigger>
        <DropdownMenuContent
          side="top"
          align="start"
          className="tallie-dashboard w-56"
        >
          <DropdownMenuLabel className="font-normal">
            <div className="leading-tight">
              <p className="text-sm font-medium text-foreground">
                {currentUser.name}
              </p>
              <p>{currentUser.email}</p>
            </div>
          </DropdownMenuLabel>
          <DropdownMenuSeparator />
          <DropdownMenuGroup>
            <DropdownMenuItem>
              <LucideUserIcon />
              Account
            </DropdownMenuItem>
            <DropdownMenuItem>
              <SettingsIcon />
              Preferences
            </DropdownMenuItem>
            <DropdownMenuItem>
              <CreditCardIcon />
              Billing
            </DropdownMenuItem>
          </DropdownMenuGroup>
          <DropdownMenuSeparator />
          <DropdownMenuItem variant="destructive">
            <LogOutIcon />
            Log out
          </DropdownMenuItem>
        </DropdownMenuContent>
      </DropdownMenu>
    </SidebarMenuItem>
  );
}

function CollapseControl({
  collapsed,
  onToggle,
}: {
  collapsed: boolean;
  onToggle: () => void;
}) {
  if (!collapsed) {
    return (
      <button
        type="button"
        onClick={onToggle}
        className="flex size-9.5 shrink-0 items-center justify-center rounded-lg bg-secondary"
        aria-label="Collapse sidebar"
      >
        <SidebarCollapseIcon className="-rotate-90" />
      </button>
    );
  }

  return (
    <div className="relative size-11 shrink-0">
      <div className="pointer-events-none absolute inset-0 flex items-center justify-center transition-all ease-linear group-hover:scale-75 group-hover:opacity-0">
        <TallieLogo className="size-6" />
      </div>
      <div className="pointer-events-none absolute inset-0 flex scale-75 items-center justify-center opacity-0 transition-all ease-linear group-hover:pointer-events-auto group-hover:scale-100 group-hover:opacity-100">
        <button
          type="button"
          onClick={onToggle}
          className="flex size-11 items-center justify-center rounded-lg bg-secondary"
          aria-label="Expand sidebar"
        >
          <SidebarCollapseIcon className="rotate-90" />
        </button>
      </div>
    </div>
  );
}

export function DashboardSidebar() {
  const { state, toggleSidebar } = useSidebar();
  const collapsed = state === "collapsed";

  return (
    <Sidebar collapsible="icon" className="h-full border-none">
      <SidebarHeader
        className={cn(
          "h-16 flex-row items-center border-b border-sidebar-border transition-[padding] md:h-20",
          collapsed ? "justify-start px-3" : "justify-between gap-4.75 px-4",
        )}
      >
        {!collapsed && (
          <div className="flex min-w-0 flex-1 items-center gap-2">
            <TallieLogo className="size-8 shrink-0" />
            <span className="truncate text-xl font-semibold">Tallie</span>
          </div>
        )}
        <CollapseControl collapsed={collapsed} onToggle={toggleSidebar} />
      </SidebarHeader>

      <SidebarContent className="gap-4 overflow-x-hidden overflow-y-auto px-3 py-4 group-data-[collapsible=icon]:overflow-y-auto!">
        {navigationGroups.map((group) => (
          <SidebarGroup key={group.label} className="gap-2 p-0">
            <SidebarGroupLabel className="h-auto px-3 py-1 text-base font-normal text-muted-foreground">
              {group.label}
            </SidebarGroupLabel>
            <SidebarGroupContent>
              <SidebarMenu className="gap-2">
                {group.items.map((item) => (
                  <SidebarMenuItem key={item.name}>
                    <NavItem item={item} />
                  </SidebarMenuItem>
                ))}
              </SidebarMenu>
            </SidebarGroupContent>
          </SidebarGroup>
        ))}
      </SidebarContent>

      <SidebarFooter className="border-t border-sidebar-border px-3 py-3">
        <SidebarMenu className="gap-2">
          <HelpItem />
          <DarkModeItem />
          <ProfileItem />
        </SidebarMenu>
      </SidebarFooter>
    </Sidebar>
  );
}
```

### `src/components/dashboards/tallie-dashboard/components/tallie/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";
}

export function ThemeProvider({
  children,
  defaultTheme = "system",
  storageKey = "tallie-theme",
}: ThemeProviderProps) {
  const [theme, setThemeState] = useState<Theme>(() => {
    if (typeof window === "undefined") return defaultTheme;

    const stored = localStorage.getItem(storageKey);
    if (stored === "light" || stored === "dark" || stored === "system") {
      return stored;
    }

    return defaultTheme;
  });

  const [systemTheme, setSystemTheme] = useState<"dark" | "light">(() => {
    if (typeof window === "undefined") return "light";
    return getSystemTheme();
  });

  const resolvedTheme = theme === "system" ? systemTheme : theme;

  useEffect(() => {
    const root = document.documentElement;
    root.classList.remove("light", "dark");
    root.classList.add(resolvedTheme);
  }, [resolvedTheme]);

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

  const setTheme = useCallback(
    (nextTheme: Theme) => {
      localStorage.setItem(storageKey, nextTheme);
      setThemeState(nextTheme);
    },
    [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/tallie-dashboard/components/tallie/topbar.tsx`

```tsx
import { useEffect, useRef, useState } from "react";
import {
  CreditCardIcon,
  LogOutIcon,
  SettingsIcon,
  UserIcon as LucideUserIcon,
} from "lucide-react";
import {
  BellIcon,
  CaretDownIcon,
  CloseIcon,
  CommandIcon,
  SearchIcon,
} from "./icons";
import { Button, buttonVariants } from "@/components/ui/button";
import {
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuGroup,
  DropdownMenuItem,
  DropdownMenuLabel,
  DropdownMenuSeparator,
  DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu";
import {
  InputGroup,
  InputGroupAddon,
  InputGroupInput,
} from "@/components/ui/input-group";
import { SidebarTrigger } from "@/components/ui/sidebar";
import { currentUser, notifications } from "../../data";

export function DashboardTopbar() {
  const [searchQuery, setSearchQuery] = useState("");
  const [isMobileSearchOpen, setIsMobileSearchOpen] = useState(false);
  const searchInputRef = useRef<HTMLInputElement>(null);
  const mobileSearchInputRef = useRef<HTMLInputElement>(null);

  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-16 shrink-0 items-center justify-between gap-2 border-b px-4 md:h-20 md:px-8">
      {isMobileSearchOpen ? (
        <div className="flex w-full items-center gap-2 md:hidden">
          <InputGroup className="h-11 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-lg"
            className="size-8.5 shrink-0 rounded-lg"
            aria-label="Close search"
            onClick={closeMobileSearch}
          >
            <CloseIcon />
          </Button>
        </div>
      ) : (
        <>
          <div className="flex min-w-0 flex-1 items-center gap-2">
            <SidebarTrigger className="size-8.5 shrink-0 md:hidden [&_svg]:size-5!" />

            <InputGroup className="hidden h-11 w-105.25 max-w-full rounded-lg border-none bg-secondary py-1 pr-2 pl-3 md:flex">
              <InputGroupAddon className="pl-0 text-muted-foreground">
                <SearchIcon />
              </InputGroupAddon>
              <InputGroupInput
                ref={searchInputRef}
                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)}
              />
              {searchQuery === "" ? (
                <InputGroupAddon
                  align="inline-end"
                  className="pr-0 text-muted-foreground"
                >
                  <div className="flex h-5.5 w-9.5 items-center justify-center gap-1 rounded-md bg-background px-2 py-1.5">
                    <CommandIcon />
                    <span className="text-sm leading-none">K</span>
                  </div>
                </InputGroupAddon>
              ) : null}
            </InputGroup>
          </div>

          <div className="flex shrink-0 items-center gap-2">
            <Button
              type="button"
              variant="outline"
              size="icon-lg"
              className="size-8.5 rounded-lg md:hidden"
              aria-label="Open search"
              onClick={openMobileSearch}
            >
              <SearchIcon className="size-4" />
            </Button>

            <DropdownMenu>
              <DropdownMenuTrigger
                type="button"
                className={buttonVariants({
                  variant: "outline",
                  size: "icon-lg",
                  className: "relative size-8.5 rounded-lg",
                })}
                aria-label="Notifications"
              >
                <BellIcon />
                <span className="absolute top-1.75 left-4.5 size-1.5 rounded-full bg-destructive" />
              </DropdownMenuTrigger>
              <DropdownMenuContent
                align="center"
                className="tallie-dashboard w-72 mr-4.75"
              >
                <DropdownMenuGroup>
                  <DropdownMenuLabel>Notifications</DropdownMenuLabel>
                  <DropdownMenuSeparator />
                  {notifications.map((notification) => (
                    <DropdownMenuItem
                      key={notification.id}
                      className="items-start py-2"
                    >
                      <div>
                        <p className="font-medium">{notification.title}</p>
                        <p className="text-xs text-muted-foreground">
                          {notification.description}
                        </p>
                        <p className="mt-1 text-xs text-muted-foreground">
                          {notification.time}
                        </p>
                      </div>
                    </DropdownMenuItem>
                  ))}
                </DropdownMenuGroup>
                <DropdownMenuSeparator />
                <DropdownMenuItem className="justify-center hover:underline focus:bg-transparent">
                  View all notifications
                </DropdownMenuItem>
              </DropdownMenuContent>
            </DropdownMenu>

            <DropdownMenu>
              <DropdownMenuTrigger
                type="button"
                className={buttonVariants({
                  variant: "ghost",
                  className:
                    "h-auto gap-2 px-0 hover:bg-transparent aria-expanded:bg-transparent data-open:[&>svg]:rotate-180",
                })}
                aria-label="Account menu"
              >
                <img
                  src={currentUser.avatar}
                  alt=""
                  className="size-8.5 rounded-lg border bg-muted object-cover"
                />
                <CaretDownIcon className="hidden transition-transform md:block" />
              </DropdownMenuTrigger>
              <DropdownMenuContent
                align="end"
                className="tallie-dashboard w-56"
              >
                <DropdownMenuLabel className="font-normal">
                  <div className="leading-tight">
                    <p className="text-sm font-medium text-foreground">
                      {currentUser.name}
                    </p>
                    <p>{currentUser.email}</p>
                  </div>
                </DropdownMenuLabel>
                <DropdownMenuSeparator />
                <DropdownMenuGroup>
                  <DropdownMenuItem>
                    <LucideUserIcon />
                    Account
                  </DropdownMenuItem>
                  <DropdownMenuItem>
                    <SettingsIcon />
                    Preferences
                  </DropdownMenuItem>
                  <DropdownMenuItem>
                    <CreditCardIcon />
                    Billing
                  </DropdownMenuItem>
                </DropdownMenuGroup>
                <DropdownMenuSeparator />
                <DropdownMenuItem variant="destructive">
                  <LogOutIcon />
                  Log out
                </DropdownMenuItem>
              </DropdownMenuContent>
            </DropdownMenu>
          </div>
        </>
      )}
    </header>
  );
}
```

### `src/components/dashboards/tallie-dashboard/components/tallie/transaction-details-sheet.tsx`

```tsx
import {
  ArrowRightIcon,
  CheckIcon,
  FlagIcon,
  TriangleAlertIcon,
  XIcon,
} from "lucide-react";
import { StatusWarningIcon, TimelineCheckIcon } from "./icons";
import { Button } from "@/components/ui/button";
import {
  Sheet,
  SheetClose,
  SheetContent,
  SheetDescription,
  SheetFooter,
  SheetHeader,
  SheetTitle,
} from "@/components/ui/sheet";
import {
  getTransactionDetails,
  type BatchStatus,
  type BatchTransaction,
  type MatchLineStatus,
} from "../../data";
import { cn } from "@/lib/utils";

const statusLabel: Record<BatchStatus, string> = {
  processing: "Processing",
  completed: "Completed",
  exception: "Exception",
};

const matchStatusConfig: Record<
  MatchLineStatus,
  { label: string; className: string; Icon: typeof CheckIcon }
> = {
  matched: {
    label: "Matched",
    className: "text-(--status-completed)",
    Icon: CheckIcon,
  },
  mismatched: {
    label: "Mismatched",
    className: "text-(--status-exception)",
    Icon: XIcon,
  },
  partial: {
    label: "Partial",
    className: "text-orange-500",
    Icon: TriangleAlertIcon,
  },
};

function OverviewCard({
  label,
  value,
  large,
}: {
  label: string;
  value: string;
  large?: boolean;
}) {
  return (
    <div
      className={cn(
        "flex flex-col gap-2 rounded-xl bg-zinc-50 dark:bg-muted",
        large ? "justify-center p-4" : "p-3",
      )}
    >
      <p
        className={cn(
          "text-sm font-medium tracking-tight",
          large ? "opacity-70" : "opacity-60",
        )}
      >
        {label}
      </p>
      <p
        className={cn(
          "font-medium leading-none",
          large ? "text-3xl" : "text-lg",
        )}
      >
        {value}
      </p>
    </div>
  );
}

function MatchField({ label, value }: { label: string; value: string }) {
  return (
    <div className="flex min-w-0 flex-1 flex-col gap-1.5">
      <p className="text-sm text-muted-foreground">{label}</p>
      <p className="truncate text-base font-medium tracking-tight">{value}</p>
    </div>
  );
}

function MatchBlock({
  title,
  status,
  fields,
}: {
  title: string;
  status: MatchLineStatus;
  fields: [string, string][];
}) {
  const config = matchStatusConfig[status];
  const Icon = config.Icon;

  return (
    <div className="flex flex-col gap-2 rounded-xl bg-zinc-50 px-1 pt-2 pb-1 dark:bg-muted">
      <div className="flex items-center justify-between px-2">
        <p className="text-base font-medium tracking-tight">{title}</p>
        <span
          className={cn(
            "inline-flex items-center gap-1.5 rounded-xl px-2 py-1 text-sm font-medium",
            config.className,
          )}
        >
          <Icon className="size-3.5" />
          {config.label}
        </span>
      </div>
      <div className="flex items-start gap-3 rounded-xl border bg-background p-4">
        {fields.map(([label, value]) => (
          <MatchField key={label} label={label} value={value} />
        ))}
      </div>
    </div>
  );
}

export function TransactionDetailsSheet({
  transaction,
  open,
  onOpenChange,
}: {
  transaction: BatchTransaction | null;
  open: boolean;
  onOpenChange: (open: boolean) => void;
}) {
  const details = transaction ? getTransactionDetails(transaction) : null;

  return (
    <Sheet open={open} onOpenChange={onOpenChange}>
      {transaction && details ? (
        <SheetContent
          side="right"
          showCloseButton={false}
          className="tallie-dashboard gap-0 p-0 data-[side=right]:w-full data-[side=right]:max-w-130 data-[side=right]:sm:max-w-130"
        >
          <SheetHeader className="flex-row items-center justify-between border-b p-6">
            <div className="flex min-w-0 flex-col">
              <SheetTitle className="text-lg">Transaction Details</SheetTitle>
              <SheetDescription className="sr-only">
                Full details for {transaction.transactionId}
              </SheetDescription>
            </div>
            <SheetClose asChild>
              <Button variant="ghost" size="icon-sm" aria-label="Close">
                <XIcon className="size-5" />
              </Button>
            </SheetClose>
          </SheetHeader>

          <div className="flex min-h-0 flex-1 flex-col gap-7 overflow-y-auto">
            <div className="flex flex-col gap-3 px-6 pt-7">
              <h2 className="text-2xl leading-snug font-medium tracking-tight">
                {transaction.transactionId}
              </h2>
              <div className="flex flex-wrap items-center gap-1.5">
                <span
                  className={cn(
                    "inline-flex items-center gap-2.5 rounded px-3 py-1 text-sm font-medium",
                    transaction.status === "exception" &&
                      "bg-(--status-exception)/15 text-(--status-exception)",
                    transaction.status === "completed" &&
                      "bg-(--status-completed)/15 text-(--status-completed)",
                    transaction.status === "processing" &&
                      "bg-(--status-processing)/15 text-(--status-processing)",
                  )}
                >
                  {transaction.status === "exception" ? (
                    <StatusWarningIcon className="size-4" />
                  ) : null}
                  {statusLabel[transaction.status]}
                </span>
                <span className="rounded bg-(--source-sharepoint)/15 px-3 py-1 text-sm text-(--source-sharepoint)">
                  {transaction.confidence}% confidence
                </span>
                {details.flagged ? (
                  <span className="inline-flex items-center gap-2 rounded-xl py-1 pr-4 pl-3 text-sm font-medium">
                    <span className="size-2.5 rounded-full bg-(--status-exception)" />
                    Flagged
                  </span>
                ) : null}
              </div>
            </div>

            <div className="flex flex-col gap-8 px-6">
              <div className="flex flex-col gap-3">
                <OverviewCard label="Amount" value={transaction.amount} large />
                <div className="grid grid-cols-2 gap-3">
                  <OverviewCard label="Customer" value={details.customer} />
                  <OverviewCard label="Vendor" value={transaction.vendor} />
                  <OverviewCard label="Batch ID" value={details.batchId} />
                  <OverviewCard label="Date" value={details.date} />
                </div>
              </div>

              <div className="flex flex-col gap-3">
                <h3 className="text-base font-medium tracking-tight">
                  Three-way Match Breakdown
                </h3>
                <MatchBlock
                  title="Purchase Order"
                  status={details.purchaseOrder.status}
                  fields={[
                    ["Amount", details.purchaseOrder.amount],
                    ["PO no.", details.purchaseOrder.reference],
                    ["Source", details.purchaseOrder.source],
                  ]}
                />
                <MatchBlock
                  title="Invoice"
                  status={details.invoice.status}
                  fields={[
                    ["Amount", details.invoice.amount],
                    ["Invoice no.", details.invoice.reference],
                    ["Delta vs PO", details.invoice.deltaVsPo],
                  ]}
                />
                <MatchBlock
                  title="Goods Receipt"
                  status={details.goodsReceipt.status}
                  fields={[
                    ["Amount", details.goodsReceipt.amount],
                    ["PO number", details.goodsReceipt.reference],
                    ["Source", details.goodsReceipt.fulfillment],
                  ]}
                />
              </div>

              <div className="flex flex-col gap-4 pb-7">
                <h3 className="text-base font-medium tracking-tight">
                  Activity Timeline
                </h3>
                <ol className="flex flex-col gap-8">
                  {details.timeline.map((item, index) => (
                    <li
                      key={`${item.title}-${index}`}
                      className="relative flex gap-4"
                    >
                      {index < details.timeline.length - 1 ? (
                        <span
                          aria-hidden
                          className="absolute top-8 left-4 h-[calc(100%+1rem)] w-px bg-border"
                        />
                      ) : null}
                      <span className="relative z-10 flex size-8 shrink-0 items-center justify-center rounded-full bg-zinc-100 dark:bg-muted">
                        <TimelineCheckIcon />
                      </span>
                      <div className="flex min-w-0 flex-col gap-1 pt-0.5">
                        <p className="text-base font-medium tracking-tight">
                          {item.title}
                        </p>
                        <p className="flex flex-wrap items-center gap-1 text-xs text-muted-foreground">
                          {item.parts.map((part, partIndex) => (
                            <span
                              key={`${part}-${partIndex}`}
                              className="inline-flex items-center gap-1"
                            >
                              {partIndex > 0 ? (
                                <span
                                  aria-hidden
                                  className="size-1 rounded-full bg-muted-foreground/50"
                                />
                              ) : null}
                              {part}
                            </span>
                          ))}
                        </p>
                      </div>
                    </li>
                  ))}
                </ol>
              </div>
            </div>
          </div>

          <SheetFooter className="gap-3 border-t p-6">
            <div className="grid grid-cols-2 gap-3">
              <Button variant="outline" className="h-12 gap-2">
                <CheckIcon />
                Approve anyway
              </Button>
              <Button
                variant="outline"
                className="h-12 gap-2 text-(--status-exception) hover:text-(--status-exception)"
              >
                <FlagIcon />
                Flag for Review
              </Button>
            </div>
            <Button className="h-12 w-full gap-2">
              Request Correction
              <ArrowRightIcon />
            </Button>
          </SheetFooter>
        </SheetContent>
      ) : null}
    </Sheet>
  );
}
```

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

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

type DashboardLayoutProps = {
  children: ReactNode;
};

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

      <main className="flex flex-1 flex-col overflow-hidden">
        <DashboardTopbar />
        <div className="flex-1 overflow-y-auto">{children}</div>
      </main>
    </SidebarProvider>
  );
}
```

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

```css
@import "@fontsource/geist/400.css";
@import "@fontsource/geist/500.css";
@import "@fontsource/geist/600.css";
@import "@fontsource/instrument-serif/400.css";
@import "@fontsource/geist-mono/500.css";

.tallie-dashboard,
body:has(.tallie-dashboard) [data-slot="sidebar"][data-mobile="true"],
body:has(.tallie-dashboard) [data-slot="dropdown-menu-content"],
body:has(.tallie-dashboard) [data-slot="sheet-content"],
body:has(.tallie-dashboard) [data-slot="tooltip-content"] {
  --radius: 0.625rem;
  --background: oklch(1 0 0);
  --foreground: oklch(0.2271 0.0625 260.828);
  --card: oklch(0.97 0 0);
  --card-foreground: oklch(0.2271 0.0625 260.828);
  --popover: oklch(1 0 0);
  --popover-foreground: oklch(0.2271 0.0625 260.828);
  --primary: oklch(0 0 0);
  --primary-foreground: oklch(0.985 0 0);
  --secondary: oklch(0.9761 0 0);
  --secondary-foreground: oklch(0.2271 0.0625 260.828);
  --muted: oklch(0.9761 0 0);
  --muted-foreground: oklch(0.5138 0 0);
  --accent: oklch(0.97 0 0);
  --accent-foreground: oklch(0.2271 0.0625 260.828);
  --destructive: oklch(0.574 0.232 29.36);
  --border: oklch(0.9401 0 0);
  --input: oklch(0.9401 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);
  --sidebar: oklch(0.9431 0 0);
  --sidebar-foreground: oklch(0.2271 0.0625 260.828);
  --sidebar-primary: oklch(0.2271 0.0625 260.828);
  --sidebar-primary-foreground: oklch(0.985 0 0);
  --sidebar-accent: oklch(0.9761 0 0);
  --sidebar-accent-foreground: oklch(0.2271 0.0625 260.828);
  --sidebar-border: oklch(0.9189 0 0);
  --sidebar-ring: oklch(0.708 0 0);
  --sidebar-muted: oklch(0.6993 0 0);
  --sidebar-muted-foreground: oklch(0.5138 0 0);
  --live: #00b153;
  --status-processing: #2762ea;
  --status-completed: #16a34a;
  --status-exception: #dc2627;
  --source-oracle: #5946f9;
  --source-sharepoint: #09aff7;
  --source-concur: #ff4fa3;
  --source-email: #09aff7;
  --trend: #2c9c5d;
  --font-serif: "Instrument Serif", serif;
  --font-mono: "Geist Mono", ui-monospace, monospace;
}

.tallie-dashboard,
body:has(.tallie-dashboard),
body:has(.tallie-dashboard) [data-slot="sidebar"][data-mobile="true"] {
  --font-sans: "Geist", sans-serif;
  font-family: "Geist", sans-serif;
  font-weight: 400;
}

.tallie-dashboard {
  background-color: var(--background);
  color: var(--foreground);
}

.tallie-dashboard.dark,
.dark .tallie-dashboard,
.dark body:has(.tallie-dashboard) [data-slot="sidebar"][data-mobile="true"],
.dark body:has(.tallie-dashboard) [data-slot="dropdown-menu-content"],
.dark body:has(.tallie-dashboard) [data-slot="sheet-content"],
.dark body:has(.tallie-dashboard) [data-slot="tooltip-content"] {
  --background: oklch(0.244 0 0);
  --foreground: oklch(0.985 0 0);
  --card: oklch(0.281 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.574 0.232 29.36);
  --border: oklch(1 0 0 / 12%);
  --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.173 0 0);
  --sidebar-foreground: oklch(0.985 0 0);
  --sidebar-primary: oklch(0.922 0 0);
  --sidebar-primary-foreground: oklch(0.205 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);
  --sidebar-muted: oklch(0.535 0 0);
  --sidebar-muted-foreground: oklch(0.725 0 0);
}

.tallie-dashboard .font-serif {
  font-family: var(--font-serif);
}

.tallie-dashboard .font-mono {
  font-family: var(--font-mono);
}

/* custom classes */
.sidebar-badge-shadow {
  filter: drop-shadow(0 0.0125rem 0.125rem rgba(0, 0, 0, 0.05));
}

@keyframes live-dot-pulse {
  0% {
    transform: scale(1);
    opacity: 0.55;
  }
  100% {
    transform: scale(2.75);
    opacity: 0;
  }
}

.live-dot-pulse {
  position: relative;
}

.live-dot-pulse::before,
.live-dot-pulse::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
  background: inherit;
  pointer-events: none;
  transform-origin: center;
  animation: live-dot-pulse 1.5s ease-out infinite;
}

.live-dot-pulse::after {
  animation-delay: 0.75s;
}

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

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

body:has(.tallie-dashboard)
  [data-slot="dropdown-menu-content"]
  [data-slot="dropdown-menu-item"],
body:has(.tallie-dashboard)
  [data-slot="dropdown-menu-content"]
  [data-slot="dropdown-menu-sub-trigger"] {
  padding-inline: 0.625rem;
  padding-block: 0.625rem;
}

body:has(.tallie-dashboard)
  [data-slot="dropdown-menu-content"]
  [data-slot="dropdown-menu-checkbox-item"],
body:has(.tallie-dashboard)
  [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/tallie-dashboard/data.tsx`

```tsx
import type { ComponentType, SVGProps } from "react";
import {
  CheckCircleIcon,
  ClockIcon,
  FadersHorizontalIcon,
  FileIcon,
  FolderIcon,
  GearIcon,
  HomeIcon,
  LinkIcon,
  PlayCircleIcon,
  ShieldCheckIcon,
  SpinnerGapIcon,
  StatusWarningIcon,
  UsersIcon,
  WarningIcon,
} from "./components/tallie/icons";

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

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

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

export const navigationGroups: NavigationGroup[] = [
  {
    label: "Main",
    items: [
      { name: "Dashboard", href: "/", icon: HomeIcon },
      { name: "Activity", href: "/activity", icon: ClockIcon },
      {
        name: "Exception",
        href: "/exception",
        icon: WarningIcon,
        badge: "3,154",
      },
      { name: "Transactions", href: "/transactions", icon: FileIcon },
    ],
  },
  {
    label: "Workflow",
    items: [
      { name: "Controls", href: "/controls", icon: ShieldCheckIcon },
      { name: "Audit Runs", href: "/audit-runs", icon: PlayCircleIcon },
      { name: "Reports", href: "/reports", icon: FolderIcon },
    ],
  },
  {
    label: "System",
    items: [
      { name: "Integrations", href: "/integrations", icon: LinkIcon },
      { name: "Team", href: "/team", icon: UsersIcon },
      { name: "Settings", href: "/settings", icon: GearIcon },
    ],
  },
];

export const currentUser = {
  name: "Alex Morgan",
  email: "alex@tallie.com",
  initials: "AM",
  avatar: `https://api.dicebear.com/9.x/avataaars/svg?seed=${encodeURIComponent("Alex Morgan")}`,
};

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: FadersHorizontalIcon },
  { value: "processing", label: "Processing", icon: SpinnerGapIcon },
  { value: "completed", label: "Completed", icon: CheckCircleIcon },
  { value: "exception", label: "Exception", icon: 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 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/tallie-dashboard/demo.tsx`

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

const blankRoutes = new Set([
  "/activity",
  "/exception",
  "/transactions",
  "/controls",
  "/audit-runs",
  "/reports",
  "/integrations",
  "/team",
  "/settings",
]);

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

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

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

export default function TallieDashboardDemo() {
  return (
    <ThemeProvider>
      <DashboardNavigationProvider>
        <DashboardRoute />
      </DashboardNavigationProvider>
    </ThemeProvider>
  );
}
```
