{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "home-dashboard",
  "title": "Home Dashboard",
  "description": "Company revenue, hiring, regional filters, and a sortable customer table.",
  "dependencies": [
    "@tanstack/react-table@^8.21.3",
    "lucide-react@^1.33.0"
  ],
  "registryDependencies": [
    "https://components.exe.xyz/r/app-shell.json",
    "https://components.exe.xyz/r/avatar.json",
    "https://components.exe.xyz/r/breadcrumb.json",
    "https://components.exe.xyz/r/button.json",
    "https://components.exe.xyz/r/chart-card.json",
    "https://components.exe.xyz/r/chip.json",
    "https://components.exe.xyz/r/dashboard-view-state.json",
    "https://components.exe.xyz/r/earnings-chart-card.json",
    "https://components.exe.xyz/r/icon-button.json",
    "https://components.exe.xyz/r/input.json",
    "https://components.exe.xyz/r/line-chart-card.json",
    "https://components.exe.xyz/r/popover.json",
    "https://components.exe.xyz/r/select.json",
    "https://components.exe.xyz/r/sidebar.json",
    "https://components.exe.xyz/r/stat-cards.json",
    "https://components.exe.xyz/r/table.json",
    "https://components.exe.xyz/r/utils.json"
  ],
  "files": [
    {
      "path": "src/components/templates/home-dashboard.tsx",
      "content": "\"use client\"\n\nimport { useEffect, useMemo, useState } from \"react\"\nimport {\n  flexRender,\n  getCoreRowModel,\n  getFilteredRowModel,\n  getPaginationRowModel,\n  getSortedRowModel,\n  useReactTable,\n} from \"@tanstack/react-table\"\nimport type { ColumnDef, SortingState } from \"@tanstack/react-table\"\nimport {\n  BarChart3,\n  Bell,\n  CalendarDays,\n  FolderKanban,\n  Home,\n  Inbox,\n  LifeBuoy,\n  Menu,\n  Package,\n  Search,\n  ShoppingBag,\n  UserRound,\n  Users,\n} from \"lucide-react\"\n\nimport { EarningsChartCard } from \"@/components/charts/earnings-chart-card\"\nimport { LineChartCard } from \"@/components/charts/line-chart-card\"\nimport { Sidebar } from \"@/components/blocks/sidebar\"\nimport type { SidebarItem } from \"@/components/blocks/sidebar\"\nimport { AppShell } from \"@/components/templates/app-shell\"\nimport { useDashboardView } from \"@/lib/use-dashboard-view\"\nimport type { DashboardView } from \"@/lib/use-dashboard-view\"\nimport { cn } from \"@/lib/utils\"\nimport { StatCard, StatCardRow } from \"@/components/blocks/stat-cards\"\nimport { Avatar, AvatarFallback } from \"@/components/ui/avatar\"\nimport {\n  Breadcrumb,\n  BreadcrumbItem,\n  BreadcrumbLink,\n  BreadcrumbList,\n  BreadcrumbPage,\n  BreadcrumbSeparator,\n} from \"@/components/ui/breadcrumb\"\nimport { Button } from \"@/components/ui/button\"\nimport { Chip } from \"@/components/ui/chip\"\nimport { IconButton } from \"@/components/ui/icon-button\"\nimport { Input } from \"@/components/ui/input\"\nimport {\n  Popover,\n  PopoverContent,\n  PopoverTrigger,\n} from \"@/components/ui/popover\"\nimport {\n  Select,\n  SelectContent,\n  SelectItem,\n  SelectTrigger,\n  SelectValue,\n} from \"@/components/ui/select\"\nimport {\n  Table,\n  TableBody,\n  TableCell,\n  TableHead,\n  TableHeader,\n  TableRow,\n} from \"@/components/ui/table\"\nimport { formatNumber } from \"@/components/charts/chart-card\"\n\nexport const homeKpis = [\n  { label: \"Customers\", value: 14592, delta: 0.053, icon: Users },\n  { label: \"Unit sold\", value: 385, delta: -0.021, icon: ShoppingBag },\n  { label: \"Orders\", value: 1394, delta: 0, icon: Package },\n  { label: \"Support tickets\", value: 708, delta: 0.128, icon: LifeBuoy },\n]\n\nexport type HomeCustomer = {\n  name: string\n  initials: string\n  status: \"Waiting\" | \"Processing\" | \"Shipped\" | \"Completed\" | \"Delivery failed\"\n  product: string\n  region: \"NA\" | \"EU\" | \"Asia\" | \"Oceania\"\n  date: string\n  amount: number\n}\n\nexport const homeCustomers: HomeCustomer[] = [\n  {\n    name: \"John Clarkson\",\n    initials: \"JC\",\n    status: \"Waiting\",\n    product: \"Sneakers\",\n    region: \"NA\",\n    date: \"Sep 05, 2026\",\n    amount: 3412,\n  },\n  {\n    name: \"Aspen Lubin\",\n    initials: \"AL\",\n    status: \"Processing\",\n    product: \"Jacket\",\n    region: \"EU\",\n    date: \"Sep 04, 2026\",\n    amount: 890,\n  },\n  {\n    name: \"Michael Ekstrom\",\n    initials: \"ME\",\n    status: \"Completed\",\n    product: \"Wallet\",\n    region: \"EU\",\n    date: \"Sep 03, 2026\",\n    amount: 124,\n  },\n  {\n    name: \"Kianna Vaccaro\",\n    initials: \"KV\",\n    status: \"Shipped\",\n    product: \"Sneakers\",\n    region: \"Asia\",\n    date: \"Sep 02, 2026\",\n    amount: 210,\n  },\n  {\n    name: \"Livia Saris\",\n    initials: \"LS\",\n    status: \"Processing\",\n    product: \"Bag\",\n    region: \"Oceania\",\n    date: \"Sep 01, 2026\",\n    amount: 640,\n  },\n  {\n    name: \"Jaydon Aminoff\",\n    initials: \"JA\",\n    status: \"Delivery failed\",\n    product: \"Jacket\",\n    region: \"NA\",\n    date: \"Aug 30, 2026\",\n    amount: 188,\n  },\n  {\n    name: \"Maria Lubin\",\n    initials: \"ML\",\n    status: \"Completed\",\n    product: \"Wallet\",\n    region: \"EU\",\n    date: \"Aug 28, 2026\",\n    amount: 96,\n  },\n  {\n    name: \"Ann Press\",\n    initials: \"AP\",\n    status: \"Shipped\",\n    product: \"Sneakers\",\n    region: \"NA\",\n    date: \"Aug 27, 2026\",\n    amount: 430,\n  },\n]\n\nconst hires = [\n  {\n    name: \"Livia Saris\",\n    role: \"Backend Engineer\",\n    when: \"Joined today\",\n    initials: \"LS\",\n  },\n  {\n    name: \"Jaydon Aminoff\",\n    role: \"UI Designer\",\n    when: \"2 days ago\",\n    initials: \"JA\",\n  },\n  {\n    name: \"Maria Lubin\",\n    role: \"User Researcher\",\n    when: \"5 days ago\",\n    initials: \"ML\",\n  },\n  {\n    name: \"Ann Press\",\n    role: \"DevOps Engineer\",\n    when: \"A week ago\",\n    initials: \"AP\",\n  },\n]\n\nconst inbox = [\n  {\n    id: \"n1\",\n    title: \"Livia Saris mentioned you\",\n    description: \"Payroll for the new hires is ready to review.\",\n    timestamp: \"8m\",\n    unread: true,\n  },\n  {\n    id: \"n2\",\n    title: \"Weekly earnings posted\",\n    description: \"$7,462 this period.\",\n    timestamp: \"2h\",\n    unread: true,\n  },\n  {\n    id: \"n3\",\n    title: \"Customer export finished\",\n    description: \"North America CSV is ready.\",\n    timestamp: \"1d\",\n    unread: false,\n  },\n]\n\nconst statusChip: Record<HomeCustomer[\"status\"], string> = {\n  Waiting:\n    \"border-transparent bg-[color-mix(in_srgb,var(--chart-4)_18%,transparent)] text-[var(--chart-4)]\",\n  Processing: \"border-transparent bg-primary/10 text-primary\",\n  Shipped:\n    \"border-transparent bg-[color-mix(in_srgb,var(--chart-2)_16%,transparent)] text-[var(--chart-2)]\",\n  Completed: \"border-border bg-card text-foreground\",\n  \"Delivery failed\": \"border-transparent bg-destructive/10 text-destructive\",\n}\n\nconst mobileHiddenCustomerColumns = new Set([\n  \"status\",\n  \"product\",\n  \"region\",\n  \"date\",\n])\n\nconst companyViewLabel: Record<DashboardView, string> = {\n  home: \"Overview\",\n  analytics: \"Revenue\",\n  calendar: \"Hiring\",\n  projects: \"Orders\",\n  medical: \"Inventory\",\n  profile: \"Account\",\n  inbox: \"Inbox\",\n}\n\nfunction companyNavItems(current: DashboardView): SidebarItem[] {\n  return [\n    { id: \"home\", href: \"#home\", label: \"Overview\", icon: Home },\n    { id: \"analytics\", href: \"#revenue\", label: \"Revenue\", icon: BarChart3 },\n    {\n      id: \"calendar\",\n      href: \"#hiring\",\n      label: \"Hiring\",\n      icon: CalendarDays,\n      badge: 4,\n    },\n    {\n      id: \"projects\",\n      href: \"#orders\",\n      label: \"Orders\",\n      icon: FolderKanban,\n      badge: 18,\n    },\n    { id: \"medical\", href: \"#inventory\", label: \"Inventory\", icon: Package },\n    { id: \"profile\", href: \"#account\", label: \"Account\", icon: UserRound },\n    { id: \"inbox\", href: \"#inbox\", label: \"Inbox\", icon: Inbox, badge: 3 },\n  ].map((item) => ({ ...item, current: item.id === current }))\n}\n\nconst companySections: Record<\n  Exclude<DashboardView, \"home\" | \"inbox\">,\n  {\n    eyebrow: string\n    title: string\n    description: string\n    rows: [string, string][]\n  }\n> = {\n  analytics: {\n    eyebrow: \"Revenue review\",\n    title: \"$184,920 booked in September\",\n    description:\n      \"Direct sales passed marketplace revenue for the first time this quarter.\",\n    rows: [\n      [\"Direct store\", \"$92,480\"],\n      [\"Marketplace\", \"$68,210\"],\n      [\"Wholesale\", \"$24,230\"],\n    ],\n  },\n  calendar: {\n    eyebrow: \"Hiring schedule\",\n    title: \"Four interviews this week\",\n    description:\n      \"Product design and backend engineering are the two open hiring loops.\",\n    rows: [\n      [\"Mon 10:00\", \"Portfolio review · Hana Cole\"],\n      [\"Tue 14:30\", \"Systems interview · Luis Moreno\"],\n      [\"Thu 11:00\", \"Team interview · Cass Bell\"],\n    ],\n  },\n  projects: {\n    eyebrow: \"Fulfillment queue\",\n    title: \"18 orders need attention\",\n    description:\n      \"Most exceptions are address checks or items waiting for a warehouse scan.\",\n    rows: [\n      [\"Address check\", \"7 orders\"],\n      [\"Awaiting scan\", \"6 orders\"],\n      [\"Carrier delay\", \"5 orders\"],\n    ],\n  },\n  medical: {\n    eyebrow: \"Stock control\",\n    title: \"Three products are below reorder level\",\n    description:\n      \"The East warehouse can cover current demand while replenishment is in transit.\",\n    rows: [\n      [\"Canvas sneaker · 42\", \"18 remaining\"],\n      [\"Field jacket · M\", \"11 remaining\"],\n      [\"Fold wallet · rust\", \"8 remaining\"],\n    ],\n  },\n  profile: {\n    eyebrow: \"Company account\",\n    title: \"Plotter Supply Co.\",\n    description:\n      \"Billing, tax, and notification details for the commerce account.\",\n    rows: [\n      [\"Billing contact\", \"finance@plotter.supply\"],\n      [\"Default region\", \"North America\"],\n      [\"Statement day\", \"First business day\"],\n    ],\n  },\n}\n\nfunction CompanySection({\n  view,\n}: {\n  view: Exclude<DashboardView, \"home\" | \"inbox\">\n}) {\n  const section = companySections[view]\n  return (\n    <section className=\"mx-auto max-w-3xl overflow-hidden rounded-[2px] border border-border bg-card\">\n      <header className=\"border-b border-border p-4\">\n        <p className=\"font-mono text-[9px] tracking-[0.12em] text-muted-foreground uppercase\">\n          {section.eyebrow}\n        </p>\n        <h1 className=\"mt-1 font-heading text-lg font-semibold\">\n          {section.title}\n        </h1>\n        <p className=\"mt-1 max-w-xl text-xs leading-5 text-muted-foreground\">\n          {section.description}\n        </p>\n      </header>\n      <dl className=\"divide-y divide-border\">\n        {section.rows.map(([label, value]) => (\n          <div\n            key={label}\n            className=\"flex items-center justify-between gap-4 px-4 py-3 text-xs\"\n          >\n            <dt className=\"font-medium\">{label}</dt>\n            <dd className=\"text-right font-mono text-[10px] text-muted-foreground\">\n              {value}\n            </dd>\n          </div>\n        ))}\n      </dl>\n    </section>\n  )\n}\n\nexport function HomeDashboardTemplate() {\n  const { view, go } = useDashboardView(\"home\")\n  const [mobileOpen, setMobileOpen] = useState(false)\n  const [collapsed, setCollapsed] = useState(false)\n  const [query, setQuery] = useState(\"\")\n\n  function navigate(id: string) {\n    go(id)\n    setMobileOpen(false)\n  }\n\n  return (\n    <AppShell>\n      <a\n        href=\"#customers-table\"\n        className=\"sr-only focus:not-sr-only focus:absolute focus:top-2 focus:left-2 focus:z-20 focus:bg-card focus:px-2 focus:py-1\"\n      >\n        Skip to table\n      </a>\n      <Sidebar\n        variant=\"dashboard\"\n        collapsed={collapsed}\n        onCollapsedChange={setCollapsed}\n        mobileOpen={mobileOpen}\n        onMobileOpenChange={setMobileOpen}\n        items={companyNavItems(view)}\n        onNavigate={navigate}\n        user={{\n          name: \"Avery Brooks\",\n          email: \"avery@plottersupply.co\",\n          initials: \"AB\",\n        }}\n        team={{\n          name: \"Plotter Supply\",\n          email: \"ops@plottersupply.co\",\n          initials: \"PS\",\n        }}\n      />\n      <div className=\"flex min-h-0 min-w-0 flex-1 flex-col\">\n        <header className=\"flex flex-wrap items-center gap-2 border-b border-border px-3 py-2\">\n          <IconButton\n            icon={Menu}\n            size=\"small\"\n            variant=\"ghost\"\n            aria-label=\"Open menu\"\n            className=\"md:hidden\"\n            onClick={() => setMobileOpen(true)}\n          />\n          <Breadcrumb className=\"min-w-0\">\n            <BreadcrumbList>\n              <BreadcrumbItem>\n                <BreadcrumbLink\n                  href=\"#home\"\n                  onClick={(event) => {\n                    event.preventDefault()\n                    navigate(\"home\")\n                  }}\n                >\n                  Home\n                </BreadcrumbLink>\n              </BreadcrumbItem>\n              <BreadcrumbSeparator />\n              <BreadcrumbItem>\n                <BreadcrumbPage>{companyViewLabel[view]}</BreadcrumbPage>\n              </BreadcrumbItem>\n            </BreadcrumbList>\n          </Breadcrumb>\n          <div className=\"relative order-last min-w-0 basis-full sm:order-none sm:min-w-[12rem] sm:flex-1 sm:basis-auto\">\n            <Search className=\"pointer-events-none absolute top-1/2 left-2 size-3.5 -translate-y-1/2 text-muted-foreground\" />\n            <Input\n              value={query}\n              onChange={(event) => setQuery(event.target.value)}\n              placeholder=\"Search\"\n              aria-label=\"Search\"\n              className=\"rounded-[2px] pl-7\"\n            />\n          </div>\n          <Popover>\n            <PopoverTrigger asChild>\n              <IconButton\n                icon={Bell}\n                size=\"small\"\n                variant=\"ghost\"\n                aria-label=\"Notifications\"\n              />\n            </PopoverTrigger>\n            <PopoverContent\n              align=\"end\"\n              className=\"w-[min(22rem,calc(100vw-1rem))] p-0\"\n            >\n              <InboxList items={inbox} />\n            </PopoverContent>\n          </Popover>\n        </header>\n        <main className=\"min-h-0 flex-1 overflow-auto p-3\">\n          <p className=\"sr-only\" aria-live=\"polite\">\n            {companyViewLabel[view]}\n          </p>\n          {view !== \"home\" && view !== \"inbox\" ? (\n            <CompanySection view={view} />\n          ) : null}\n          {view === \"inbox\" ? (\n            <div className=\"mx-auto max-w-xl rounded-[2px] border border-border bg-card\">\n              <InboxList items={inbox} />\n            </div>\n          ) : null}\n          {view === \"home\" ? (\n            <>\n              <StatCardRow>\n                {homeKpis.map((kpi) => (\n                  <StatCard\n                    key={kpi.label}\n                    label={kpi.label}\n                    value={kpi.value}\n                    delta={kpi.delta}\n                    icon={kpi.icon}\n                  />\n                ))}\n              </StatCardRow>\n              <div className=\"mt-3 grid grid-cols-1 gap-3 xl:grid-cols-2\">\n                <EarningsChartCard />\n                <LineChartCard title=\"Revenue\" />\n              </div>\n              <section className=\"mt-3\" aria-label=\"Recent hires\">\n                <div className=\"mb-2 flex items-baseline justify-between\">\n                  <h2 className=\"font-heading text-sm font-medium\">\n                    Recent hires\n                  </h2>\n                  <p className=\"font-mono text-[11px] text-muted-foreground\">\n                    56 this month\n                  </p>\n                </div>\n                <ul className=\"grid grid-cols-1 gap-2 sm:grid-cols-2\">\n                  {hires.map((hire) => (\n                    <li\n                      key={hire.name}\n                      className=\"flex items-center gap-3 rounded-[2px] border border-border bg-card px-3 py-3\"\n                    >\n                      <Avatar>\n                        <AvatarFallback>{hire.initials}</AvatarFallback>\n                      </Avatar>\n                      <div className=\"min-w-0\">\n                        <p className=\"truncate text-sm font-medium\">\n                          {hire.name}\n                        </p>\n                        <p className=\"truncate text-xs text-muted-foreground\">\n                          {hire.role}\n                        </p>\n                        <p className=\"font-mono text-[11px] text-muted-foreground\">\n                          {hire.when}\n                        </p>\n                      </div>\n                    </li>\n                  ))}\n                </ul>\n              </section>\n              <section\n                id=\"customers-table\"\n                className=\"mt-3\"\n                aria-label=\"customers\"\n              >\n                <CustomersTable data={homeCustomers} query={query} />\n              </section>\n            </>\n          ) : null}\n        </main>\n      </div>\n    </AppShell>\n  )\n}\n\nfunction CustomersTable({\n  data,\n  query,\n}: {\n  data: HomeCustomer[]\n  query: string\n}) {\n  const [sorting, setSorting] = useState<SortingState>([])\n  const [globalFilter, setGlobalFilter] = useState(query)\n  const [region, setRegion] = useState(\"all\")\n  const filtered = useMemo(() => {\n    const byRegion =\n      region === \"all\" ? data : data.filter((row) => row.region === region)\n    const q = globalFilter.trim().toLowerCase()\n    if (!q) return byRegion\n    return byRegion.filter((row) =>\n      `${row.name} ${row.product} ${row.status}`.toLowerCase().includes(q)\n    )\n  }, [data, globalFilter, region])\n\n  useEffect(() => setGlobalFilter(query), [query])\n\n  const columns = useMemo<ColumnDef<HomeCustomer>[]>(\n    () => [\n      {\n        accessorKey: \"name\",\n        header: \"Customer\",\n        cell: ({ row }) => (\n          <div className=\"flex items-center gap-2\">\n            <Avatar size=\"sm\">\n              <AvatarFallback>{row.original.initials}</AvatarFallback>\n            </Avatar>\n            <span>{row.original.name}</span>\n          </div>\n        ),\n      },\n      {\n        accessorKey: \"status\",\n        header: \"Status\",\n        cell: ({ getValue }) => {\n          const status = getValue() as HomeCustomer[\"status\"]\n          return (\n            <Chip variant=\"outline\" className={statusChip[status]}>\n              {status}\n            </Chip>\n          )\n        },\n      },\n      { accessorKey: \"product\", header: \"Product\" },\n      { accessorKey: \"region\", header: \"Region\" },\n      { accessorKey: \"date\", header: \"Date\" },\n      {\n        accessorKey: \"amount\",\n        header: \"Amount\",\n        cell: ({ getValue }) => (\n          <span className=\"font-mono\">\n            ${formatNumber(getValue() as number)}\n          </span>\n        ),\n      },\n    ],\n    []\n  )\n\n  const table = useReactTable({\n    data: filtered,\n    columns,\n    state: { sorting },\n    onSortingChange: setSorting,\n    getCoreRowModel: getCoreRowModel(),\n    getSortedRowModel: getSortedRowModel(),\n    getFilteredRowModel: getFilteredRowModel(),\n    getPaginationRowModel: getPaginationRowModel(),\n    initialState: { pagination: { pageIndex: 0, pageSize: 5 } },\n  })\n\n  return (\n    <div className=\"rounded-[2px] border border-border bg-card\">\n      <div className=\"flex flex-wrap items-center justify-between gap-2 px-3 py-3\">\n        <div>\n          <h2 className=\"font-heading text-sm font-medium\">Customers</h2>\n          <p className=\"font-mono text-[11px] text-muted-foreground\">\n            {filtered.length} {filtered.length === 1 ? \"customer\" : \"customers\"}\n          </p>\n        </div>\n        <div className=\"flex flex-wrap items-center gap-2\">\n          <Input\n            value={globalFilter}\n            onChange={(event) => setGlobalFilter(event.target.value)}\n            placeholder=\"Search customers\"\n            className=\"max-w-xs rounded-[2px]\"\n            aria-label=\"Search customers\"\n          />\n          <Select value={region} onValueChange={setRegion}>\n            <SelectTrigger\n              size=\"sm\"\n              aria-label=\"Region\"\n              className=\"h-8 w-32 rounded-[2px]\"\n            >\n              <SelectValue />\n            </SelectTrigger>\n            <SelectContent>\n              <SelectItem value=\"all\">All regions</SelectItem>\n              <SelectItem value=\"NA\">NA</SelectItem>\n              <SelectItem value=\"EU\">EU</SelectItem>\n              <SelectItem value=\"Asia\">Asia</SelectItem>\n              <SelectItem value=\"Oceania\">Oceania</SelectItem>\n            </SelectContent>\n          </Select>\n        </div>\n      </div>\n      <Table>\n        <TableHeader>\n          {table.getHeaderGroups().map((headerGroup) => (\n            <TableRow key={headerGroup.id}>\n              {headerGroup.headers.map((header) => (\n                <TableHead\n                  key={header.id}\n                  className={cn(\n                    mobileHiddenCustomerColumns.has(header.column.id) &&\n                      \"hidden sm:table-cell\"\n                  )}\n                  aria-sort={\n                    header.column.getIsSorted() === \"asc\"\n                      ? \"ascending\"\n                      : header.column.getIsSorted() === \"desc\"\n                        ? \"descending\"\n                        : \"none\"\n                  }\n                >\n                  <button\n                    type=\"button\"\n                    className=\"hover:text-foreground\"\n                    onClick={header.column.getToggleSortingHandler()}\n                  >\n                    {flexRender(\n                      header.column.columnDef.header,\n                      header.getContext()\n                    )}\n                  </button>\n                </TableHead>\n              ))}\n            </TableRow>\n          ))}\n        </TableHeader>\n        <TableBody>\n          {table.getRowModel().rows.map((row) => (\n            <TableRow key={row.id}>\n              {row.getVisibleCells().map((cell) => (\n                <TableCell\n                  key={cell.id}\n                  className={cn(\n                    mobileHiddenCustomerColumns.has(cell.column.id) &&\n                      \"hidden sm:table-cell\"\n                  )}\n                >\n                  {flexRender(cell.column.columnDef.cell, cell.getContext())}\n                </TableCell>\n              ))}\n            </TableRow>\n          ))}\n        </TableBody>\n      </Table>\n      <div className=\"flex items-center justify-end gap-2 border-t border-border px-3 py-2\">\n        <Button\n          size=\"sm\"\n          variant=\"outline\"\n          onClick={() => table.previousPage()}\n          disabled={!table.getCanPreviousPage()}\n        >\n          Previous\n        </Button>\n        <Button\n          size=\"sm\"\n          variant=\"outline\"\n          onClick={() => table.nextPage()}\n          disabled={!table.getCanNextPage()}\n        >\n          Next\n        </Button>\n      </div>\n    </div>\n  )\n}\n\nfunction InboxList({\n  items,\n}: {\n  items: {\n    id: string\n    title: string\n    description?: string\n    timestamp: string\n    unread: boolean\n  }[]\n}) {\n  return (\n    <ul className=\"divide-y divide-border\">\n      {items.map((item) => (\n        <li key={item.id} className=\"flex gap-3 px-3 py-3\">\n          <span\n            aria-hidden=\"true\"\n            className={cn(\n              \"mt-1.5 size-1.5 shrink-0 rounded-full\",\n              item.unread ? \"bg-primary\" : \"bg-border\"\n            )}\n          />\n          <div className=\"min-w-0 flex-1\">\n            <div className=\"flex items-baseline justify-between gap-2\">\n              <p className=\"truncate text-sm font-medium\">{item.title}</p>\n              <p className=\"shrink-0 font-mono text-[10px] text-muted-foreground\">\n                {item.timestamp}\n              </p>\n            </div>\n            {item.description ? (\n              <p className=\"mt-0.5 text-xs text-pretty text-muted-foreground\">\n                {item.description}\n              </p>\n            ) : null}\n          </div>\n        </li>\n      ))}\n    </ul>\n  )\n}\n",
      "type": "registry:block"
    }
  ],
  "type": "registry:block"
}