{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "dashboard-01",
  "type": "registry:block",
  "title": "Dashboard with Revenue and Customers",
  "description": "Dashboard with Revenue and Customers. Complete application dashboards combining navigation, metrics, charts, and customer data.",
  "author": "Ephraim Duncan",
  "registryDependencies": [],
  "dependencies": [
    "@base-ui/react@1.9.0",
    "class-variance-authority@0.7.1",
    "cn@0.2.6",
    "date-fns@4.4.0",
    "lucide-react@0.577.0",
    "recharts@3.8.0"
  ],
  "files": [
    {
      "path": "content/components/dashboard/dashboard-01/app/page.tsx",
      "type": "registry:component",
      "target": "@components/uiblocks/dashboard-01/app/page.tsx",
      "content": "'use client';\n\nimport { useState } from 'react';\nimport { SidebarInset, SidebarProvider } from \"../shared/components/ui/sidebar\";\nimport { cn } from \"../shared/lib/utils\";\nimport { CustomersTable } from \"../customers-table\";\nimport { DashboardCharts } from \"../dashboard-charts\";\nimport { DashboardHeader } from \"../dashboard-header\";\nimport { DashboardSidebar } from \"../dashboard-sidebar\";\n\nexport default function Page() {\n  const [period, setPeriod] = useState<'day' | 'week' | 'month' | 'year'>(\n    'week'\n  );\n  const [range, setRange] = useState({ from: '2025-11-10', to: '2025-11-16' });\n\n  const bindTheme = (node: HTMLElement | null) => {\n    if (!node) {\n      return;\n    }\n    const onKey = (event: KeyboardEvent) => {\n      const target = event.target as HTMLElement;\n      if (\n        event.key === 'D' &&\n        event.shiftKey &&\n        !target.isContentEditable &&\n        !['INPUT', 'TEXTAREA', 'SELECT'].includes(target.tagName)\n      ) {\n        document.documentElement.classList.toggle('dark');\n      }\n    };\n    window.addEventListener('keydown', onKey);\n    return () => window.removeEventListener('keydown', onKey);\n  };\n\n  return (\n    <SidebarProvider\n      className=\"isolate min-h-dvh bg-background font-sans text-foreground antialiased [--chart-1:#3b82f6] [--chart-2:#d4d4d8] [--font-sans:system-ui,sans-serif] [--sidebar-width-icon:3.5rem]! [--sidebar-width:15.5rem]! **:data-[slot=sidebar-group-label]:transition-none **:data-[slot=sidebar-menu-button]:transition-none **:data-[slot=sidebar-container]:ease-[cubic-bezier(0.23,1,0.32,1)] **:data-[slot=sidebar-gap]:ease-[cubic-bezier(0.23,1,0.32,1)] dark:[--chart-2:#3f3f46] dark:[--sidebar-accent:#1a1a1a] dark:[--sidebar:#0d0d0d]\"\n      defaultOpen={false}\n    >\n      <a\n        className=\"sr-only focus:not-sr-only focus:fixed focus:top-2 focus:left-2 focus:z-50 focus:rounded-lg focus:bg-background focus:p-3\"\n        href=\"#overview\"\n      >\n        Skip to dashboard\n      </a>\n      <DashboardSidebar />\n      <SidebarInset className=\"min-w-0\" id=\"overview\" ref={bindTheme}>\n        <DashboardHeader\n          onPeriodChange={setPeriod}\n          onRangeChange={setRange}\n          period={period}\n          range={range}\n        />\n        <div className=\"@container/metrics border-b\">\n          <dl className=\"grid @3xl/metrics:grid-cols-4 grid-cols-2\">\n            {metrics.map((metric) => (\n              <div\n                className=\"flex min-w-0 flex-col justify-center gap-2 border-b @3xl/metrics:border-b-0 @3xl/metrics:not-first:border-l @3xl/metrics:px-7 px-4 py-6 even:border-l [&:nth-last-child(-n+2)]:border-b-0\"\n                key={metric.label}\n              >\n                <dt className=\"truncate text-muted-foreground text-sm sm:text-[0.9375rem]\">\n                  {metric.label}\n                </dt>\n                <dd className=\"flex flex-wrap items-baseline gap-2.5\">\n                  <span className=\"font-semibold text-[1.75rem] tabular-nums tracking-tight\">\n                    {metric.value}\n                  </span>\n                  <span\n                    className={cn(\n                      'font-medium text-[0.8125rem] tabular-nums',\n                      metric.changeClass\n                    )}\n                  >\n                    {metric.change}\n                  </span>\n                </dd>\n              </div>\n            ))}\n          </dl>\n        </div>\n        <DashboardCharts from={range.from} period={period} to={range.to} />\n        <CustomersTable />\n      </SidebarInset>\n    </SidebarProvider>\n  );\n}\n\nconst metrics = [\n  {\n    label: 'New customers',\n    value: '1,284',\n    change: '+8.2%',\n    changeClass: 'text-green-600 dark:text-green-400',\n  },\n  {\n    label: 'Success rate',\n    value: '97.4%',\n    change: '+0.6%',\n    changeClass: 'text-green-600 dark:text-green-400',\n  },\n  {\n    label: 'Failure rate',\n    value: '2.6%',\n    change: '-0.6%',\n    changeClass: 'text-red-600 dark:text-red-400',\n  },\n  {\n    label: 'Refunds',\n    value: '38',\n    change: '0.0%',\n    changeClass: 'text-muted-foreground',\n  },\n];\n"
    },
    {
      "path": "content/components/dashboard/dashboard-01/customers-table.tsx",
      "type": "registry:component",
      "target": "@components/uiblocks/dashboard-01/customers-table.tsx",
      "content": "'use client';\n\nimport {\n  DownloadIcon,\n  EllipsisIcon,\n  EyeIcon,\n  FunnelIcon,\n  MailIcon,\n  SearchIcon,\n  XIcon,\n} from 'lucide-react';\nimport { useState } from 'react';\nimport { Button } from \"./shared/components/ui/button\";\nimport {\n  Dialog,\n  DialogContent,\n  DialogDescription,\n  DialogFooter,\n  DialogHeader,\n  DialogTitle,\n} from \"./shared/components/ui/dialog\";\nimport {\n  DropdownMenu,\n  DropdownMenuCheckboxItem,\n  DropdownMenuContent,\n  DropdownMenuGroup,\n  DropdownMenuItem,\n  DropdownMenuLabel,\n  DropdownMenuSeparator,\n  DropdownMenuTrigger,\n} from \"./shared/components/ui/dropdown-menu\";\nimport {\n  InputGroup,\n  InputGroupAddon,\n  InputGroupInput,\n  InputGroupText,\n} from \"./shared/components/ui/input-group\";\nimport {\n  Table,\n  TableBody,\n  TableCell,\n  TableHead,\n  TableHeader,\n  TableRow,\n} from \"./shared/components/ui/table\";\nimport { cn } from \"./shared/lib/utils\";\n\nconst easeOut = 'ease-[cubic-bezier(0.23,1,0.32,1)]';\nconst press = `${easeOut} transition-[scale,background-color] duration-150 active:scale-[0.96] motion-reduce:active:scale-100`;\nconst swap = `${easeOut} fade-in zoom-in-95 motion-reduce:zoom-in-100 animate-in duration-150`;\n\nexport function CustomersTable() {\n  const [query, setQuery] = useState('');\n  const [selected, setSelected] = useState<Record<Facet, readonly string[]>>({\n    Plan: [],\n    Status: [],\n  });\n  const [page, setPage] = useState(1);\n  const [customer, setCustomer] = useState<Customer | null>(null);\n\n  const bindSearch = (node: HTMLInputElement | null) => {\n    if (!node) {\n      return;\n    }\n\n    const focusSearch = (event: KeyboardEvent) => {\n      if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === 'k') {\n        event.preventDefault();\n        node.focus();\n      }\n    };\n    window.addEventListener('keydown', focusSearch);\n    return () => window.removeEventListener('keydown', focusSearch);\n  };\n\n  const term = query.trim().toLocaleLowerCase();\n  const filtered = customers.filter(\n    (item) =>\n      (!term ||\n        item.name.toLocaleLowerCase().includes(term) ||\n        item.email.toLocaleLowerCase().includes(term)) &&\n      (!selected.Plan.length || selected.Plan.includes(item.plan)) &&\n      (!selected.Status.length || selected.Status.includes(item.status))\n  );\n\n  const pageCount = Math.max(1, Math.ceil(filtered.length / 9));\n  const visibleCustomers = filtered.slice((page - 1) * 9, page * 9);\n  const filterCount = selected.Plan.length + selected.Status.length;\n  const toggle = (facet: Facet, option: string) => {\n    setSelected((current) => ({\n      ...current,\n      [facet]: current[facet].includes(option)\n        ? current[facet].filter((item) => item !== option)\n        : [...current[facet], option],\n    }));\n    setPage(1);\n  };\n  const clear = (facet?: Facet) => {\n    setSelected((current) =>\n      facet ? { ...current, [facet]: [] } : { Plan: [], Status: [] }\n    );\n    setPage(1);\n  };\n\n  const exportCustomers = () => {\n    const csv = [\n      ['Customer', 'Email', 'Signed up', 'Plan', 'Status'],\n      ...filtered.map((item) => [\n        item.name,\n        item.email,\n        item.signedUp,\n        item.plan,\n        item.status,\n      ]),\n    ]\n      .map((row) =>\n        row.map((value) => `\"${value.replaceAll('\"', '\"\"')}\"`).join(',')\n      )\n      .join('\\n');\n    const url = URL.createObjectURL(\n      new Blob([csv], { type: 'text/csv;charset=utf-8' })\n    );\n    const link = document.createElement('a');\n    link.href = url;\n    link.download = 'customers.csv';\n    link.click();\n    URL.revokeObjectURL(url);\n  };\n\n  return (\n    <section className=\"@container/customers w-full\" id=\"customers\">\n      <div className=\"flex @3xl/customers:flex-row flex-col @3xl/customers:items-center @3xl/customers:justify-between gap-4 p-4 sm:p-7 sm:py-6\">\n        <div>\n          <h2 className=\"font-semibold text-[18px] leading-6\">New customers</h2>\n          <p className=\"mt-1 text-[13px] text-muted-foreground\">\n            Recent signups across all plans\n          </p>\n        </div>\n        <div className=\"flex min-w-0 flex-1 flex-wrap items-center @3xl/customers:justify-end gap-2\">\n          {filterCount > 0 && (\n            <fieldset\n              aria-label=\"Active customer filters\"\n              className=\"flex flex-wrap items-center gap-2\"\n            >\n              {facets.map(\n                (facet) =>\n                  selected[facet].length > 0 && (\n                    <div\n                      className={cn(\n                        swap,\n                        'flex h-7 items-center rounded-md bg-muted pl-2 text-[0.8125rem]'\n                      )}\n                      key={facet}\n                    >\n                      <DropdownMenu>\n                        <DropdownMenuTrigger\n                          render={\n                            <button\n                              className=\"flex h-full max-w-56 items-center gap-1 rounded-l-md outline-none focus-visible:ring-3 focus-visible:ring-ring/50\"\n                              type=\"button\"\n                            />\n                          }\n                        >\n                          <span className=\"text-muted-foreground\">\n                            {facet}:\n                          </span>\n                          <span className=\"truncate font-medium\">\n                            {selected[facet].join(', ')}\n                          </span>\n                        </DropdownMenuTrigger>\n                        <DropdownMenuContent className=\"w-44 rounded-[10px] p-1.5\">\n                          <DropdownMenuGroup>\n                            {options[facet].map((option) => (\n                              <DropdownMenuCheckboxItem\n                                checked={selected[facet].includes(option)}\n                                className=\"min-h-9 px-2.5\"\n                                closeOnClick={false}\n                                key={option}\n                                onCheckedChange={() => toggle(facet, option)}\n                              >\n                                {option}\n                              </DropdownMenuCheckboxItem>\n                            ))}\n                          </DropdownMenuGroup>\n                        </DropdownMenuContent>\n                      </DropdownMenu>\n                      <button\n                        aria-label={`Remove ${facet.toLowerCase()} filter`}\n                        className=\"flex h-full w-6 items-center justify-center rounded-r-md text-muted-foreground outline-none hover:text-foreground focus-visible:ring-3 focus-visible:ring-ring/50\"\n                        onClick={() => clear(facet)}\n                        type=\"button\"\n                      >\n                        <XIcon aria-hidden=\"true\" className=\"size-3.5\" />\n                      </button>\n                    </div>\n                  )\n              )}\n              <Button\n                onClick={() => clear()}\n                size=\"sm\"\n                type=\"button\"\n                variant=\"ghost\"\n              >\n                Clear all\n              </Button>\n            </fieldset>\n          )}\n          <label className=\"sr-only\" htmlFor=\"customer-search\">\n            Search customers\n          </label>\n          <InputGroup className=\"h-9 @3xl/customers:w-60 w-full border-border bg-background dark:border-input\">\n            <InputGroupAddon>\n              <InputGroupText>\n                <SearchIcon aria-hidden=\"true\" />\n              </InputGroupText>\n            </InputGroupAddon>\n            <InputGroupInput\n              className=\"text-[16px] sm:text-sm\"\n              id=\"customer-search\"\n              name=\"customer-search\"\n              onChange={(event) => {\n                setQuery(event.target.value);\n                setPage(1);\n              }}\n              placeholder=\"Search customers\"\n              ref={bindSearch}\n              type=\"search\"\n              value={query}\n            />\n            <InputGroupAddon align=\"inline-end\">\n              <kbd className=\"hidden rounded border bg-muted px-1.5 py-0.5 font-medium text-[10px] sm:block\">\n                ⌘K\n              </kbd>\n            </InputGroupAddon>\n          </InputGroup>\n          <div className=\"flex gap-2\">\n            <DropdownMenu>\n              <DropdownMenuTrigger\n                render={\n                  <Button\n                    className={cn(press, 'h-9 flex-1 sm:flex-none')}\n                    size=\"lg\"\n                    variant=\"outline\"\n                  />\n                }\n              >\n                <FunnelIcon aria-hidden=\"true\" />\n                Filter{filterCount ? ` (${filterCount})` : ''}\n              </DropdownMenuTrigger>\n              <DropdownMenuContent align=\"end\" className=\"w-48\">\n                {facets.map((facet, index) => (\n                  <DropdownMenuGroup key={facet}>\n                    {index > 0 && <DropdownMenuSeparator />}\n                    <DropdownMenuLabel>{facet}</DropdownMenuLabel>\n                    {options[facet].map((option) => (\n                      <DropdownMenuCheckboxItem\n                        checked={selected[facet].includes(option)}\n                        key={option}\n                        onCheckedChange={() => toggle(facet, option)}\n                      >\n                        {option}\n                      </DropdownMenuCheckboxItem>\n                    ))}\n                  </DropdownMenuGroup>\n                ))}\n                {filterCount > 0 && (\n                  <>\n                    <DropdownMenuSeparator />\n                    <DropdownMenuGroup>\n                      <DropdownMenuItem onClick={() => clear()}>\n                        Clear filters\n                      </DropdownMenuItem>\n                    </DropdownMenuGroup>\n                  </>\n                )}\n              </DropdownMenuContent>\n            </DropdownMenu>\n            <Button\n              className={cn(press, 'h-9 flex-1 sm:flex-none')}\n              onClick={exportCustomers}\n              size=\"lg\"\n              variant=\"outline\"\n            >\n              <DownloadIcon aria-hidden=\"true\" />\n              Export\n            </Button>\n          </div>\n        </div>\n      </div>\n\n      <div className=\"border-t\">\n        <Table className=\"min-w-245 table-fixed [&_td:first-child]:pl-4 sm:[&_td:first-child]:pl-7 [&_td:last-child]:pr-4 sm:[&_td:last-child]:pr-7 [&_th:first-child]:pl-4 sm:[&_th:first-child]:pl-7 [&_th:last-child]:pr-4 sm:[&_th:last-child]:pr-7\">\n          <colgroup>\n            <col className=\"w-[27%]\" />\n            <col className=\"w-[23%]\" />\n            <col className=\"w-[18%]\" />\n            <col className=\"w-[12%]\" />\n            <col className=\"w-[calc(20%-68px)]\" />\n            <col className=\"w-17\" />\n          </colgroup>\n          <TableHeader>\n            <TableRow className=\"h-11 hover:bg-transparent\">\n              <TableHead className=\"px-2 text-muted-foreground text-xs\">\n                Customer\n              </TableHead>\n              <TableHead className=\"px-2 text-muted-foreground text-xs\">\n                Email\n              </TableHead>\n              <TableHead className=\"px-2 text-muted-foreground text-xs\">\n                Signed up\n              </TableHead>\n              <TableHead className=\"px-2 text-muted-foreground text-xs\">\n                Plan\n              </TableHead>\n              <TableHead className=\"px-2 text-muted-foreground text-xs\">\n                Status\n              </TableHead>\n              <TableHead>\n                <span className=\"sr-only\">Actions</span>\n              </TableHead>\n            </TableRow>\n          </TableHeader>\n          <TableBody>\n            {visibleCustomers.map((item) => (\n              <TableRow className=\"h-14\" key={item.email}>\n                <TableCell className=\"px-2 py-0 font-medium text-sm\">\n                  {item.name}\n                </TableCell>\n                <TableCell className=\"px-2 py-0 text-muted-foreground text-sm\">\n                  {item.email}\n                </TableCell>\n                <TableCell className=\"px-2 py-0 text-muted-foreground text-sm\">\n                  {item.signedUp}\n                </TableCell>\n                <TableCell className=\"px-2 py-0 text-sm\">{item.plan}</TableCell>\n                <TableCell className=\"px-2 py-0\">\n                  <StatusDot status={item.status} />\n                </TableCell>\n                <TableCell className=\"px-0 py-0 text-right\">\n                  <DropdownMenu>\n                    <DropdownMenuTrigger\n                      render={\n                        <Button\n                          aria-label={`Actions for ${item.name}`}\n                          size=\"icon-sm\"\n                          variant=\"ghost\"\n                        />\n                      }\n                    >\n                      <EllipsisIcon aria-hidden=\"true\" />\n                    </DropdownMenuTrigger>\n                    <DropdownMenuContent\n                      align=\"end\"\n                      className=\"w-60 rounded-[10px] p-1.5\"\n                      sideOffset={6}\n                    >\n                      <DropdownMenuGroup>\n                        <DropdownMenuLabel className=\"flex flex-col gap-1 px-2.5 py-2\">\n                          <div className=\"truncate font-medium text-foreground text-sm\">\n                            {item.name}\n                          </div>\n                          <div className=\"truncate font-normal text-xs\">\n                            {item.email}\n                          </div>\n                        </DropdownMenuLabel>\n                      </DropdownMenuGroup>\n                      <DropdownMenuSeparator />\n                      <DropdownMenuGroup>\n                        <DropdownMenuItem\n                          className=\"min-h-9 gap-2.5 px-2.5\"\n                          onClick={() => setCustomer(item)}\n                        >\n                          <EyeIcon\n                            aria-hidden=\"true\"\n                            className=\"text-muted-foreground\"\n                          />\n                          View customer\n                        </DropdownMenuItem>\n                        <DropdownMenuItem\n                          className=\"min-h-9 gap-2.5 px-2.5\"\n                          render={\n                            <a\n                              aria-label={`Send email to ${item.name}`}\n                              href={`mailto:${item.email}`}\n                            >\n                              <MailIcon\n                                aria-hidden=\"true\"\n                                className=\"text-muted-foreground\"\n                              />\n                              Send email\n                            </a>\n                          }\n                        />\n                      </DropdownMenuGroup>\n                    </DropdownMenuContent>\n                  </DropdownMenu>\n                </TableCell>\n              </TableRow>\n            ))}\n            {!visibleCustomers.length && (\n              <TableRow className=\"h-28 hover:bg-transparent\">\n                <TableCell\n                  className=\"text-center text-muted-foreground text-sm\"\n                  colSpan={6}\n                >\n                  No customers match your search and filters.\n                </TableCell>\n              </TableRow>\n            )}\n          </TableBody>\n        </Table>\n      </div>\n\n      <div className=\"flex flex-col gap-3 border-t p-4 sm:flex-row sm:items-center sm:justify-between sm:px-7\">\n        <p aria-live=\"polite\" className=\"text-[13px] text-muted-foreground\">\n          {filtered.length\n            ? `${(page - 1) * 9 + 1}–${Math.min(page * 9, filtered.length)} of ${filtered.length} customers`\n            : '0 customers'}\n        </p>\n        <nav aria-label=\"Customer pages\" className=\"flex items-center gap-1\">\n          <Button\n            disabled={page === 1}\n            onClick={() => setPage((current) => Math.max(1, current - 1))}\n            size=\"sm\"\n            variant=\"outline\"\n          >\n            Previous\n          </Button>\n          {Array.from({ length: pageCount }, (_, index) => index + 1).map(\n            (number) => (\n              <Button\n                aria-current={page === number ? 'page' : undefined}\n                key={number}\n                onClick={() => setPage(number)}\n                size=\"icon-sm\"\n                variant={page === number ? 'secondary' : 'ghost'}\n              >\n                {number}\n              </Button>\n            )\n          )}\n          <Button\n            disabled={page === pageCount}\n            onClick={() =>\n              setPage((current) => Math.min(pageCount, current + 1))\n            }\n            size=\"sm\"\n            variant=\"outline\"\n          >\n            Next\n          </Button>\n        </nav>\n      </div>\n\n      <Dialog\n        onOpenChange={(open) => {\n          if (!open) {\n            setCustomer(null);\n          }\n        }}\n        open={customer !== null}\n      >\n        <DialogContent className=\"sm:max-w-md\">\n          {customer && (\n            <>\n              <DialogHeader>\n                <DialogTitle>{customer.name}</DialogTitle>\n                <DialogDescription>\n                  Customer details and signup information.\n                </DialogDescription>\n              </DialogHeader>\n              <dl className=\"grid grid-cols-[88px_1fr] gap-x-4 gap-y-3 text-sm\">\n                <dt className=\"text-muted-foreground\">Email</dt>\n                <dd className=\"min-w-0 break-all\">{customer.email}</dd>\n                <dt className=\"text-muted-foreground\">Signed up</dt>\n                <dd>{customer.signedUp}</dd>\n                <dt className=\"text-muted-foreground\">Plan</dt>\n                <dd>{customer.plan}</dd>\n                <dt className=\"text-muted-foreground\">Status</dt>\n                <dd>\n                  <StatusDot status={customer.status} />\n                </dd>\n              </dl>\n              <DialogFooter>\n                <Button\n                  render={\n                    <a\n                      aria-label={`Contact ${customer.name}`}\n                      href={`mailto:${customer.email}`}\n                    >\n                      <MailIcon aria-hidden=\"true\" />\n                      Contact customer\n                    </a>\n                  }\n                />\n              </DialogFooter>\n            </>\n          )}\n        </DialogContent>\n      </Dialog>\n    </section>\n  );\n}\n\nfunction StatusDot({ status }: { readonly status: Status }) {\n  return (\n    <span className=\"inline-flex items-center gap-2 text-sm\">\n      <span\n        aria-hidden=\"true\"\n        className={cn('size-1.5 rounded-full', statusDots[status])}\n      />\n      {status}\n    </span>\n  );\n}\n\ntype Plan = 'Starter' | 'Pro' | 'Team';\ntype Status = 'Active' | 'Pending' | 'Under review' | 'Rejected' | 'Inactive';\n\ntype Customer = {\n  readonly name: string;\n  readonly email: string;\n  readonly signedUp: string;\n  readonly plan: Plan;\n  readonly status: Status;\n};\n\nconst customers: readonly Customer[] = [\n  {\n    name: 'Priya Raman',\n    email: 'priya.raman@lumenlabs.io',\n    signedUp: 'Today, 9:12 AM',\n    plan: 'Pro',\n    status: 'Active',\n  },\n  {\n    name: 'Daniel Okafor',\n    email: 'd.okafor@fastmail.com',\n    signedUp: 'Today, 8:40 AM',\n    plan: 'Starter',\n    status: 'Pending',\n  },\n  {\n    name: 'Mei Lin Chen',\n    email: 'meilin@outlook.com',\n    signedUp: 'Yesterday, 6:05 PM',\n    plan: 'Team',\n    status: 'Active',\n  },\n  {\n    name: 'Tomás Herrera',\n    email: 'tomas.h@gmail.com',\n    signedUp: 'Yesterday, 2:31 PM',\n    plan: 'Pro',\n    status: 'Under review',\n  },\n  {\n    name: 'Aisha Bello',\n    email: 'aisha.bello@proton.me',\n    signedUp: '11 Nov, 4:18 PM',\n    plan: 'Starter',\n    status: 'Rejected',\n  },\n  {\n    name: 'Lucas Moreau',\n    email: 'l.moreau@yahoo.fr',\n    signedUp: '11 Nov, 11:02 AM',\n    plan: 'Team',\n    status: 'Active',\n  },\n  {\n    name: 'Hannah Weiss',\n    email: 'hannah.w@gmail.com',\n    signedUp: '10 Nov, 7:44 PM',\n    plan: 'Pro',\n    status: 'Pending',\n  },\n  {\n    name: 'Kenji Sato',\n    email: 'kenji.sato@icloud.com',\n    signedUp: '10 Nov, 3:15 PM',\n    plan: 'Starter',\n    status: 'Inactive',\n  },\n  {\n    name: 'Olivia Brooks',\n    email: 'olivia@brooks.studio',\n    signedUp: '9 Nov, 10:27 AM',\n    plan: 'Team',\n    status: 'Active',\n  },\n  {\n    name: 'Sofia Alvarez',\n    email: 'sofia@northstar.co',\n    signedUp: '9 Nov, 8:16 AM',\n    plan: 'Pro',\n    status: 'Active',\n  },\n  {\n    name: 'Marcus Johnson',\n    email: 'marcus.j@hey.com',\n    signedUp: '8 Nov, 5:42 PM',\n    plan: 'Team',\n    status: 'Under review',\n  },\n  {\n    name: 'Elena Petrova',\n    email: 'elena@kinetic.design',\n    signedUp: '8 Nov, 1:20 PM',\n    plan: 'Starter',\n    status: 'Pending',\n  },\n  {\n    name: 'Noah Williams',\n    email: 'noah@fieldnotes.app',\n    signedUp: '7 Nov, 4:55 PM',\n    plan: 'Pro',\n    status: 'Active',\n  },\n  {\n    name: 'Fatima Zahra',\n    email: 'fatima.z@proton.me',\n    signedUp: '7 Nov, 11:09 AM',\n    plan: 'Team',\n    status: 'Active',\n  },\n  {\n    name: 'Ethan Park',\n    email: 'ethan.park@icloud.com',\n    signedUp: '6 Nov, 6:33 PM',\n    plan: 'Starter',\n    status: 'Inactive',\n  },\n  {\n    name: 'Amara Nwosu',\n    email: 'amara@woven.studio',\n    signedUp: '6 Nov, 2:08 PM',\n    plan: 'Pro',\n    status: 'Rejected',\n  },\n  {\n    name: 'Gabriel Silva',\n    email: 'gabriel@orbit.dev',\n    signedUp: '5 Nov, 9:47 AM',\n    plan: 'Team',\n    status: 'Active',\n  },\n  {\n    name: 'Leila Haddad',\n    email: 'leila.h@fastmail.com',\n    signedUp: '4 Nov, 3:26 PM',\n    plan: 'Starter',\n    status: 'Pending',\n  },\n];\n\ntype Facet = 'Plan' | 'Status';\nconst facets: readonly Facet[] = ['Plan', 'Status'];\nconst options: Record<Facet, readonly string[]> = {\n  Plan: ['Starter', 'Pro', 'Team'],\n  Status: ['Active', 'Pending', 'Under review', 'Rejected', 'Inactive'],\n};\n\nconst statusDots: Record<Status, string> = {\n  Active: 'bg-green-500',\n  Pending: 'bg-amber-500',\n  'Under review': 'bg-blue-500',\n  Rejected: 'bg-red-500',\n  Inactive: 'bg-muted-foreground/40',\n};\n"
    },
    {
      "path": "content/components/dashboard/dashboard-01/dashboard-charts.tsx",
      "type": "registry:component",
      "target": "@components/uiblocks/dashboard-01/dashboard-charts.tsx",
      "content": "'use client';\n\nimport { format, parseISO } from 'date-fns';\nimport {\n  Area,\n  CartesianGrid,\n  ComposedChart,\n  Line,\n  XAxis,\n  YAxis,\n} from 'recharts';\nimport {\n  type ChartConfig,\n  ChartContainer,\n  ChartTooltip,\n  ChartTooltipContent,\n} from \"./shared/components/ui/chart\";\nimport { cn } from \"./shared/lib/utils\";\n\nconst swap =\n  'ease-[cubic-bezier(0.23,1,0.32,1)] fade-in zoom-in-95 motion-reduce:zoom-in-100 animate-in duration-150';\n\nexport function DashboardCharts({\n  period,\n  from,\n  to,\n}: {\n  period: 'day' | 'week' | 'month' | 'year';\n  from: string;\n  to: string;\n}) {\n  const hourly = from === to;\n  const start = days.findIndex((day) => day.date >= from);\n  const current = days.filter((day) => day.date >= from && day.date <= to);\n  const prior = days.slice(start - current.length, start);\n  const data = hourly\n    ? hours(current[0], prior[0])\n    : current.map((day, index) => ({\n        date: day.date,\n        revenue: day.revenue,\n        priorRevenue: prior[index]?.revenue ?? 0,\n        charges: day.charges,\n        priorCharges: prior[index]?.charges ?? 0,\n      }));\n  const tickStep = Math.max(1, Math.ceil(data.length / 7));\n  const ticks = data\n    .filter((_, index) => index % tickStep === 0)\n    .map((row) => row.date);\n  const tickFormat = hourly ? 'ha' : data.length > 90 ? 'MMM' : 'd MMM';\n  const labelFormat = hourly ? 'EEE, d MMM, ha' : 'EEE, d MMM yyyy';\n\n  return (\n    <div className=\"@container/charts border-b\">\n      <div className=\"grid @4xl/charts:grid-cols-2\">\n        {panels.map((panel) => {\n          const total = data.reduce((sum, row) => sum + row[panel.current], 0);\n          const previous = data.reduce(\n            (sum, row) => sum + row[panel.previous],\n            0\n          );\n          const change = previous ? ((total - previous) / previous) * 100 : 0;\n          const config = {\n            [panel.current]: {\n              label: `This ${period}`,\n              color: 'var(--chart-1)',\n            },\n            [panel.previous]: {\n              label: `Last ${period}`,\n              color: 'var(--chart-2)',\n            },\n          } satisfies ChartConfig;\n\n          return (\n            <section\n              aria-labelledby={`${panel.id}-title`}\n              className=\"@container/panel flex min-h-100 min-w-0 flex-col gap-7 border-t @4xl/charts:border-t-0 @4xl/charts:not-first:border-l p-4 py-7 first:border-t-0 sm:px-7\"\n              id={panel.id}\n              key={panel.id}\n            >\n              <div className=\"relative flex flex-col gap-2\">\n                <h2\n                  className=\"text-[0.9375rem] text-muted-foreground\"\n                  id={`${panel.id}-title`}\n                >\n                  {panel.title}\n                </h2>\n                <div className=\"flex flex-wrap items-baseline gap-2.5\">\n                  <p className=\"font-semibold text-[1.75rem] tabular-nums tracking-tight\">\n                    {panel.currency ? '$' : ''}\n                    {total.toLocaleString('en-US')}\n                  </p>\n                  <p\n                    className={cn(\n                      'font-medium text-[0.8125rem] tabular-nums',\n                      change < 0\n                        ? 'text-red-600 dark:text-red-400'\n                        : 'text-green-600 dark:text-green-400'\n                    )}\n                  >\n                    {change > 0 ? '+' : ''}\n                    {change.toFixed(1)}%\n                  </p>\n                  <p className=\"text-[0.8125rem] text-muted-foreground\">\n                    vs. last {period}\n                  </p>\n                </div>\n                <div className=\"@lg/panel:absolute @lg/panel:top-1 @lg/panel:right-0 flex items-center gap-4 text-[0.8125rem]\">\n                  <div className=\"flex items-center gap-2\">\n                    <span\n                      aria-hidden=\"true\"\n                      className=\"h-0.75 w-2.5 rounded-full bg-chart-1\"\n                    />\n                    This {period}\n                  </div>\n                  <div className=\"flex items-center gap-2\">\n                    <span\n                      aria-hidden=\"true\"\n                      className=\"h-0.75 w-2.5 rounded-full bg-chart-2\"\n                    />\n                    Last {period}\n                  </div>\n                </div>\n              </div>\n              {data.length ? (\n                <ChartContainer\n                  className={cn(swap, 'aspect-auto h-63 w-full')}\n                  config={config}\n                  key={`${from}-${to}`}\n                >\n                  <ComposedChart\n                    accessibilityLayer\n                    data={data}\n                    margin={{ top: 8, right: 8, bottom: 0, left: 0 }}\n                  >\n                    <CartesianGrid\n                      stroke=\"var(--border)\"\n                      strokeDasharray=\"3 4\"\n                      vertical={false}\n                    />\n                    <XAxis\n                      axisLine={false}\n                      dataKey=\"date\"\n                      height={40}\n                      minTickGap={24}\n                      tickFormatter={(date: string) =>\n                        format(parseISO(date), tickFormat)\n                      }\n                      tickLine={false}\n                      tickMargin={16}\n                      ticks={ticks}\n                    />\n                    <YAxis\n                      axisLine={false}\n                      domain={[0, 'auto']}\n                      tickCount={4}\n                      tickFormatter={(value: number) =>\n                        `${panel.currency ? '$' : ''}${value >= 1000 ? `${value / 1000}k` : value}`\n                      }\n                      tickLine={false}\n                      tickMargin={8}\n                      width={48}\n                    />\n                    <ChartTooltip\n                      content={\n                        <ChartTooltipContent\n                          className=\"w-47.5 rounded-[10px] bg-popover px-3 py-2.5\"\n                          formatter={(value, name) => (\n                            <div className=\"flex w-full items-center gap-2\">\n                              <span\n                                aria-hidden=\"true\"\n                                className={cn(\n                                  'size-2 shrink-0 rounded-xs',\n                                  name === panel.current\n                                    ? 'bg-chart-1'\n                                    : 'bg-chart-2'\n                                )}\n                              />\n                              <span className=\"flex-1 text-muted-foreground\">\n                                {name === panel.current\n                                  ? `This ${period}`\n                                  : `Last ${period}`}\n                              </span>\n                              <span className=\"font-medium text-foreground tabular-nums\">\n                                {panel.currency ? '$' : ''}\n                                {Number(value).toLocaleString('en-US')}\n                              </span>\n                            </div>\n                          )}\n                          labelClassName=\"font-normal text-muted-foreground\"\n                          labelFormatter={(label) =>\n                            typeof label === 'string'\n                              ? format(parseISO(label), labelFormat)\n                              : label\n                          }\n                        />\n                      }\n                      cursor={{\n                        stroke: 'var(--chart-1)',\n                        strokeDasharray: '3 3',\n                      }}\n                    />\n                    <Area\n                      activeDot={false}\n                      dataKey={panel.current}\n                      fill=\"var(--chart-1)\"\n                      fillOpacity={0.1}\n                      isAnimationActive={false}\n                      stroke=\"none\"\n                      tooltipType=\"none\"\n                      type=\"linear\"\n                    />\n                    <Line\n                      activeDot={{\n                        r: 5,\n                        fill: 'var(--chart-1)',\n                        stroke: 'var(--background)',\n                        strokeWidth: 2,\n                      }}\n                      dataKey={panel.current}\n                      dot={data.length === 1}\n                      isAnimationActive={false}\n                      stroke=\"var(--chart-1)\"\n                      strokeWidth={2.5}\n                      type=\"linear\"\n                    />\n                    <Line\n                      activeDot={{\n                        r: 4,\n                        fill: 'var(--chart-2)',\n                        stroke: 'var(--background)',\n                        strokeWidth: 2,\n                      }}\n                      dataKey={panel.previous}\n                      dot={data.length === 1}\n                      isAnimationActive={false}\n                      stroke=\"var(--chart-2)\"\n                      strokeWidth={2}\n                      type=\"linear\"\n                    />\n                  </ComposedChart>\n                </ChartContainer>\n              ) : (\n                <p className=\"flex flex-1 items-center justify-center text-muted-foreground text-sm\">\n                  No data for this date range.\n                </p>\n              )}\n            </section>\n          );\n        })}\n      </div>\n    </div>\n  );\n}\n\nconst panels = [\n  {\n    id: 'revenue',\n    title: 'Revenue',\n    current: 'revenue',\n    previous: 'priorRevenue',\n    currency: true,\n  },\n  {\n    id: 'charges',\n    title: 'Charges',\n    current: 'charges',\n    previous: 'priorCharges',\n    currency: false,\n  },\n] as const;\n\ntype Day = { date: string; revenue: number; charges: number };\n\n// Seeded LCG so every render draws the same two years of demo data.\nlet seed = 20_251_116;\nconst random = () => {\n  seed = (Math.imul(seed, 1_664_525) + 1_013_904_223) >>> 0;\n  return seed / 2 ** 32;\n};\n\nconst days: Day[] = Array.from({ length: 731 }, (_, index) => {\n  const date = new Date(Date.UTC(2023, 10, 17 + index));\n  const growth = 1 + index / 731;\n  const weekend = date.getUTCDay() % 6 === 0 ? 0.62 : 1;\n  const season =\n    1 + 0.12 * Math.sin(((date.getUTCMonth() - 3) / 12) * Math.PI * 2);\n  const spike = random() < 0.04 ? 1.6 : 1;\n  const revenue = Math.round(\n    3400 * growth * weekend * season * spike * (0.82 + random() * 0.36)\n  );\n  return {\n    date: date.toISOString().slice(0, 10),\n    revenue,\n    charges: Math.round((revenue / 13.5) * (0.9 + random() * 0.2)),\n  };\n});\n\nconst activity = [\n  0.54, 0.46, 0.38, 0.35, 0.41, 0.58, 0.74, 0.97, 1.12, 1.38, 1.21, 1.53, 1.29,\n  1.41, 1.67, 1.48, 1.31, 1.58, 1.36, 1.19, 1.04, 0.86, 0.72, 0.63,\n];\n\n// Split a day's totals across 24 hours. Noise is keyed on the date so the\n// same day always draws the same curve, and the hourly shares sum to the day.\nfunction hours(day: Day | undefined, previous: Day | undefined) {\n  if (!(day && previous)) {\n    return [];\n  }\n  const weights = [day, previous].map((row) => {\n    const key = Number(row.date.replaceAll('-', ''));\n    const noisy = activity.map(\n      (weight, hour) =>\n        weight * (0.8 + 0.4 * ((Math.sin(key + hour * 7.31) + 1) / 2))\n    );\n    const total = noisy.reduce((sum, weight) => sum + weight, 0);\n    return noisy.map((weight) => weight / total);\n  });\n  let share = 0;\n  let priorShare = 0;\n  return activity.map((_, hour) => {\n    const from = share;\n    const priorFrom = priorShare;\n    share += weights[0][hour];\n    priorShare += weights[1][hour];\n    return {\n      date: `${day.date}T${String(hour).padStart(2, '0')}:00:00`,\n      revenue: Math.round(day.revenue * share) - Math.round(day.revenue * from),\n      priorRevenue:\n        Math.round(previous.revenue * priorShare) -\n        Math.round(previous.revenue * priorFrom),\n      charges: Math.round(day.charges * share) - Math.round(day.charges * from),\n      priorCharges:\n        Math.round(previous.charges * priorShare) -\n        Math.round(previous.charges * priorFrom),\n    };\n  });\n}\n"
    },
    {
      "path": "content/components/dashboard/dashboard-01/dashboard-header.tsx",
      "type": "registry:component",
      "target": "@components/uiblocks/dashboard-01/dashboard-header.tsx",
      "content": "'use client';\n\nimport { format, parseISO } from 'date-fns';\nimport {\n  Bell,\n  CalendarDays,\n  ChartNoAxesCombined,\n  ChevronDown,\n  LockKeyhole,\n  LogOut,\n  Moon,\n  PanelLeftClose,\n  PanelLeftOpen,\n  Sun,\n  UserRound,\n} from 'lucide-react';\nimport { type ComponentProps, useState } from 'react';\nimport { Avatar, AvatarFallback, AvatarImage } from \"./shared/components/ui/avatar\";\nimport { Button } from \"./shared/components/ui/button\";\nimport {\n  Dialog,\n  DialogContent,\n  DialogDescription,\n  DialogFooter,\n  DialogHeader,\n  DialogTitle,\n} from \"./shared/components/ui/dialog\";\nimport {\n  DropdownMenu,\n  DropdownMenuContent,\n  DropdownMenuGroup,\n  DropdownMenuItem,\n  DropdownMenuLabel,\n  DropdownMenuRadioGroup,\n  DropdownMenuRadioItem,\n  DropdownMenuSeparator,\n  DropdownMenuTrigger,\n} from \"./shared/components/ui/dropdown-menu\";\nimport { Field, FieldGroup, FieldLabel } from \"./shared/components/ui/field\";\nimport { Input } from \"./shared/components/ui/input\";\nimport {\n  Popover,\n  PopoverContent,\n  PopoverDescription,\n  PopoverTitle,\n  PopoverTrigger,\n} from \"./shared/components/ui/popover\";\nimport { Separator } from \"./shared/components/ui/separator\";\nimport { useSidebar } from \"./shared/components/ui/sidebar\";\nimport { ToggleGroup, ToggleGroupItem } from \"./shared/components/ui/toggle-group\";\nimport { cn } from \"./shared/lib/utils\";\nimport type { DashboardCharts } from \"./dashboard-charts\";\n\ntype ChartOptions = ComponentProps<typeof DashboardCharts>;\ntype DateRange = Pick<ChartOptions, 'from' | 'to'>;\n\nconst press =\n  'ease-[cubic-bezier(0.23,1,0.32,1)] transition-[scale,background-color] duration-150 active:scale-[0.96] motion-reduce:active:scale-100';\n\nexport function DashboardHeader({\n  period,\n  range,\n  onPeriodChange,\n  onRangeChange,\n}: {\n  period: ChartOptions['period'];\n  range: DateRange;\n  onPeriodChange: (period: ChartOptions['period']) => void;\n  onRangeChange: (range: DateRange) => void;\n}) {\n  const { isMobile, openMobile, state, toggleSidebar } = useSidebar();\n  const sidebarOpen = isMobile ? openMobile : state === 'expanded';\n  const [customRange, setCustomRange] = useState<DateRange | null>(null);\n  const [unread, setUnread] = useState(true);\n  const [notificationsOpen, setNotificationsOpen] = useState(false);\n  const from = parseISO(range.from);\n  const to = parseISO(range.to);\n  const rangeLabel =\n    range.from === range.to\n      ? format(to, 'd MMM')\n      : `${format(from, from.getMonth() === to.getMonth() && from.getFullYear() === to.getFullYear() ? 'd' : 'd MMM')} – ${format(to, 'd MMM')}`;\n\n  return (\n    <>\n      <header className=\"flex min-h-15 flex-wrap items-center justify-between gap-3 border-b px-4 py-3 lg:px-7 lg:py-2\">\n        <div className=\"flex items-center gap-3\">\n          <Button\n            aria-expanded={sidebarOpen}\n            aria-label={sidebarOpen ? 'Collapse sidebar' : 'Expand sidebar'}\n            onClick={toggleSidebar}\n            size=\"icon-sm\"\n            type=\"button\"\n            variant=\"ghost\"\n          >\n            {sidebarOpen ? (\n              <PanelLeftClose aria-hidden=\"true\" />\n            ) : (\n              <PanelLeftOpen aria-hidden=\"true\" />\n            )}\n          </Button>\n          <h1 className=\"font-semibold text-lg tracking-tight\">Overview</h1>\n          <p className=\"text-[0.8125rem] text-muted-foreground max-sm:hidden\">\n            Updated 2 min ago\n          </p>\n        </div>\n        <div className=\"flex flex-wrap items-center gap-2 sm:gap-3\">\n          <ToggleGroup\n            aria-label=\"Chart period\"\n            className=\"rounded-[9px] border bg-muted/50 p-0.75\"\n            onValueChange={(values) => {\n              const next = periods.find((item) => item.value === values[0]);\n              if (!next) {\n                return;\n              }\n              onPeriodChange(next.value);\n              onRangeChange({ from: next.from, to: '2025-11-16' });\n            }}\n            size=\"sm\"\n            spacing={0.5}\n            value={[period]}\n          >\n            {periods.map((item) => (\n              <ToggleGroupItem\n                className=\"h-7 min-w-0 rounded-md px-3 text-[0.8125rem]\"\n                key={item.value}\n                value={item.value}\n              >\n                {item.label}\n              </ToggleGroupItem>\n            ))}\n          </ToggleGroup>\n          <DropdownMenu>\n            <DropdownMenuTrigger\n              render={\n                <Button\n                  aria-label={`Date range: ${rangeLabel}`}\n                  className={press}\n                  size=\"lg\"\n                  variant=\"outline\"\n                />\n              }\n            >\n              <CalendarDays data-icon=\"inline-start\" />\n              {rangeLabel}\n            </DropdownMenuTrigger>\n            <DropdownMenuContent\n              align=\"end\"\n              className=\"w-50 rounded-[10px] p-1.5\"\n            >\n              <DropdownMenuGroup>\n                <DropdownMenuLabel className=\"sr-only\">\n                  Date range\n                </DropdownMenuLabel>\n                <DropdownMenuRadioGroup\n                  onValueChange={(value) => {\n                    const next = ranges.find((item) => item.from === value);\n                    if (next) {\n                      onRangeChange({ from: next.from, to: '2025-11-16' });\n                    }\n                  }}\n                  value={range.to === '2025-11-16' ? range.from : ''}\n                >\n                  {ranges.map((item) => (\n                    <DropdownMenuRadioItem\n                      className=\"min-h-8.5 px-2.5\"\n                      key={item.label}\n                      value={item.from}\n                    >\n                      {item.label}\n                    </DropdownMenuRadioItem>\n                  ))}\n                </DropdownMenuRadioGroup>\n              </DropdownMenuGroup>\n              <DropdownMenuSeparator />\n              <DropdownMenuGroup>\n                <DropdownMenuItem\n                  className=\"min-h-8.5 px-2.5\"\n                  onClick={() => setCustomRange(range)}\n                >\n                  Custom range…\n                </DropdownMenuItem>\n              </DropdownMenuGroup>\n            </DropdownMenuContent>\n          </DropdownMenu>\n          <Separator className=\"h-5! max-sm:hidden\" orientation=\"vertical\" />\n          <Button\n            aria-label=\"Toggle dark mode\"\n            className={cn(press, 'relative')}\n            onClick={() => document.documentElement.classList.toggle('dark')}\n            size=\"icon-lg\"\n            title=\"Toggle dark mode (Shift+D)\"\n            type=\"button\"\n            variant=\"ghost\"\n          >\n            <Sun className=\"scale-100 opacity-100 transition-[opacity,scale] duration-150 ease-out dark:scale-50 dark:opacity-0\" />\n            <Moon className=\"absolute scale-50 opacity-0 transition-[opacity,scale] duration-150 ease-out dark:scale-100 dark:opacity-100\" />\n          </Button>\n          <Popover onOpenChange={setNotificationsOpen} open={notificationsOpen}>\n            <PopoverTrigger\n              render={\n                <Button\n                  aria-label={\n                    unread ? 'Notifications, unread updates' : 'Notifications'\n                  }\n                  className={cn(press, 'relative')}\n                  size=\"icon-lg\"\n                  variant=\"ghost\"\n                />\n              }\n            >\n              <Bell />\n              {unread && (\n                <span className=\"absolute top-2 right-2 size-1.5 rounded-full bg-blue-500 ring-2 ring-background\" />\n              )}\n            </PopoverTrigger>\n            <PopoverContent\n              align=\"end\"\n              className=\"w-90 max-w-[calc(100vw-2rem)] gap-0 overflow-hidden rounded-xl p-0\"\n              sideOffset={8}\n            >\n              <div className=\"flex h-13 items-center justify-between gap-3 border-b px-4\">\n                <PopoverTitle>Notifications</PopoverTitle>\n                <div className=\"text-muted-foreground text-xs tabular-nums\">\n                  {unread ? '2 unread' : 'All read'}\n                </div>\n                <PopoverDescription className=\"sr-only\">\n                  Recent workspace activity.\n                </PopoverDescription>\n              </div>\n              <Button\n                className=\"h-auto w-full items-start justify-start gap-3 whitespace-normal rounded-none p-4 text-left font-normal\"\n                onClick={() => setNotificationsOpen(false)}\n                render={\n                  <a href=\"#revenue\">\n                    <div className=\"flex size-9 shrink-0 items-center justify-center rounded-lg border bg-background\">\n                      <ChartNoAxesCombined\n                        aria-hidden=\"true\"\n                        className=\"size-4 text-muted-foreground\"\n                      />\n                    </div>\n                    <div className=\"flex min-w-0 flex-1 flex-col gap-1\">\n                      <div className=\"flex items-center justify-between gap-3 text-sm\">\n                        <span className=\"font-medium\">Weekly report</span>\n                        <time className=\"shrink-0 text-muted-foreground text-xs\">\n                          2m ago\n                        </time>\n                      </div>\n                      <p className=\"text-[0.8125rem] text-muted-foreground leading-5\">\n                        10–16 Nov · $42,910 in revenue\n                      </p>\n                      <p className=\"text-muted-foreground text-xs\">\n                        3,482 charges processed\n                      </p>\n                    </div>\n                    <span\n                      aria-hidden=\"true\"\n                      className={\n                        unread\n                          ? 'mt-1.5 size-1.5 shrink-0 rounded-full bg-blue-500'\n                          : 'mt-1.5 size-1.5 shrink-0'\n                      }\n                    />\n                  </a>\n                }\n                variant=\"ghost\"\n              />\n              <Separator />\n              <Button\n                className=\"h-auto w-full items-start justify-start gap-3 whitespace-normal rounded-none p-4 text-left font-normal\"\n                onClick={() => setNotificationsOpen(false)}\n                render={\n                  <a href=\"#customers\">\n                    <Avatar className=\"size-9 rounded-lg after:rounded-lg\">\n                      <AvatarImage\n                        alt=\"\"\n                        className=\"rounded-lg\"\n                        src=\"https://i.pravatar.cc/96?img=47\"\n                      />\n                      <AvatarFallback className=\"rounded-lg\">PR</AvatarFallback>\n                    </Avatar>\n                    <div className=\"flex min-w-0 flex-1 flex-col gap-1\">\n                      <div className=\"flex items-center justify-between gap-3 text-sm\">\n                        <span className=\"font-medium\">\n                          Priya Raman signed up\n                        </span>\n                        <time className=\"shrink-0 text-muted-foreground text-xs\">\n                          18m ago\n                        </time>\n                      </div>\n                      <p className=\"text-[0.8125rem] text-muted-foreground leading-5\">\n                        Joined Lumen Labs on the Pro plan.\n                      </p>\n                    </div>\n                    <span\n                      aria-hidden=\"true\"\n                      className={\n                        unread\n                          ? 'mt-1.5 size-1.5 shrink-0 rounded-full bg-blue-500'\n                          : 'mt-1.5 size-1.5 shrink-0'\n                      }\n                    />\n                  </a>\n                }\n                variant=\"ghost\"\n              />\n              <div className=\"flex items-center justify-end border-t px-3 py-2\">\n                <Button\n                  disabled={!unread}\n                  onClick={() => setUnread(false)}\n                  size=\"sm\"\n                  type=\"button\"\n                  variant=\"ghost\"\n                >\n                  Mark all as read\n                </Button>\n              </div>\n            </PopoverContent>\n          </Popover>\n          <DropdownMenu>\n            <DropdownMenuTrigger\n              render={\n                <Button\n                  aria-label=\"Account menu\"\n                  className={cn(press, 'gap-2 rounded-full pr-2.5 pl-1')}\n                  size=\"lg\"\n                  variant=\"outline\"\n                />\n              }\n            >\n              <Avatar className=\"size-7\">\n                <AvatarFallback className=\"bg-muted font-semibold text-[0.6875rem] text-foreground\">\n                  EB\n                </AvatarFallback>\n              </Avatar>\n              <ChevronDown data-icon=\"inline-end\" />\n            </DropdownMenuTrigger>\n            <DropdownMenuContent\n              align=\"end\"\n              className=\"w-60 rounded-[10px] p-1.5\"\n            >\n              <DropdownMenuGroup>\n                <DropdownMenuLabel className=\"flex flex-col gap-0.5 px-2.5 py-2\">\n                  <div className=\"font-medium text-foreground text-sm\">\n                    Ephraim Brooks\n                  </div>\n                  <div className=\"font-normal text-[0.8125rem]\">\n                    ephraim@lumenlabs.io\n                  </div>\n                </DropdownMenuLabel>\n              </DropdownMenuGroup>\n              <DropdownMenuSeparator />\n              <DropdownMenuGroup>\n                <DropdownMenuItem\n                  className=\"min-h-8.5 gap-2.5 px-2.5\"\n                  render={\n                    <a aria-label=\"Profile\" href=\"/settings/profile\">\n                      <UserRound />\n                      Profile\n                    </a>\n                  }\n                />\n                <DropdownMenuItem\n                  className=\"min-h-8.5 gap-2.5 px-2.5\"\n                  render={\n                    <a\n                      aria-label=\"Notifications\"\n                      href=\"/settings/notifications\"\n                    >\n                      <Bell />\n                      Notifications\n                    </a>\n                  }\n                />\n                <DropdownMenuItem\n                  className=\"min-h-8.5 gap-2.5 px-2.5\"\n                  render={\n                    <a aria-label=\"Security\" href=\"/settings/security\">\n                      <LockKeyhole />\n                      Security\n                    </a>\n                  }\n                />\n              </DropdownMenuGroup>\n              <DropdownMenuSeparator />\n              <DropdownMenuGroup>\n                <DropdownMenuItem\n                  className=\"min-h-8.5 gap-2.5 px-2.5\"\n                  render={\n                    <a aria-label=\"Log out\" href=\"/login\">\n                      <LogOut />\n                      Log out\n                    </a>\n                  }\n                  variant=\"destructive\"\n                />\n              </DropdownMenuGroup>\n            </DropdownMenuContent>\n          </DropdownMenu>\n        </div>\n      </header>\n      <Dialog\n        onOpenChange={(open) => {\n          if (!open) {\n            setCustomRange(null);\n          }\n        }}\n        open={customRange !== null}\n      >\n        <DialogContent>\n          {customRange && (\n            <form\n              className=\"flex flex-col gap-5\"\n              onSubmit={(event) => {\n                event.preventDefault();\n                if (\n                  customRange.from &&\n                  customRange.to &&\n                  customRange.from <= customRange.to\n                ) {\n                  onRangeChange(customRange);\n                  setCustomRange(null);\n                }\n              }}\n            >\n              <DialogHeader>\n                <DialogTitle>Custom date range</DialogTitle>\n                <DialogDescription>\n                  Choose the dates to include in your charts.\n                </DialogDescription>\n              </DialogHeader>\n              <FieldGroup>\n                <Field>\n                  <FieldLabel htmlFor=\"dashboard-from\">Start date</FieldLabel>\n                  <Input\n                    id=\"dashboard-from\"\n                    max={customRange.to}\n                    name=\"from\"\n                    onChange={(event) =>\n                      setCustomRange({\n                        ...customRange,\n                        from: event.target.value,\n                      })\n                    }\n                    required\n                    type=\"date\"\n                    value={customRange.from}\n                  />\n                </Field>\n                <Field>\n                  <FieldLabel htmlFor=\"dashboard-to\">End date</FieldLabel>\n                  <Input\n                    id=\"dashboard-to\"\n                    min={customRange.from}\n                    name=\"to\"\n                    onChange={(event) =>\n                      setCustomRange({ ...customRange, to: event.target.value })\n                    }\n                    required\n                    type=\"date\"\n                    value={customRange.to}\n                  />\n                </Field>\n              </FieldGroup>\n              <DialogFooter>\n                <Button\n                  onClick={() => setCustomRange(null)}\n                  type=\"button\"\n                  variant=\"outline\"\n                >\n                  Cancel\n                </Button>\n                <Button className={press} type=\"submit\">\n                  Apply range\n                </Button>\n              </DialogFooter>\n            </form>\n          )}\n        </DialogContent>\n      </Dialog>\n    </>\n  );\n}\n\nconst periods = [\n  { label: 'Day', value: 'day', from: '2025-11-16' },\n  { label: 'Week', value: 'week', from: '2025-11-10' },\n  { label: 'Month', value: 'month', from: '2025-10-18' },\n  { label: 'Year', value: 'year', from: '2025-01-01' },\n] as const;\n\nconst ranges = [\n  { label: 'Last 7 days', from: '2025-11-10' },\n  { label: 'Last 14 days', from: '2025-11-03' },\n  { label: 'Last 30 days', from: '2025-10-18' },\n  { label: 'This quarter', from: '2025-10-01' },\n  { label: 'Year to date', from: '2025-01-01' },\n];\n"
    },
    {
      "path": "content/components/dashboard/dashboard-01/dashboard-sidebar.tsx",
      "type": "registry:component",
      "target": "@components/uiblocks/dashboard-01/dashboard-sidebar.tsx",
      "content": "'use client';\n\nimport {\n  ArrowLeftRight,\n  BriefcaseBusiness,\n  ChartNoAxesCombined,\n  Check,\n  ChevronDown,\n  CircleHelp,\n  CirclePlus,\n  CreditCard,\n  LayoutDashboard,\n  Moon,\n  Settings,\n  Users,\n} from 'lucide-react';\nimport { useState } from 'react';\nimport { Button } from \"./shared/components/ui/button\";\nimport {\n  Dialog,\n  DialogContent,\n  DialogDescription,\n  DialogFooter,\n  DialogHeader,\n  DialogTitle,\n} from \"./shared/components/ui/dialog\";\nimport {\n  DropdownMenu,\n  DropdownMenuContent,\n  DropdownMenuGroup,\n  DropdownMenuItem,\n  DropdownMenuLabel,\n  DropdownMenuSeparator,\n  DropdownMenuTrigger,\n} from \"./shared/components/ui/dropdown-menu\";\nimport { Field, FieldGroup, FieldLabel } from \"./shared/components/ui/field\";\nimport { Input } from \"./shared/components/ui/input\";\nimport { Progress } from \"./shared/components/ui/progress\";\nimport {\n  Sidebar,\n  SidebarContent,\n  SidebarFooter,\n  SidebarGroup,\n  SidebarGroupLabel,\n  SidebarHeader,\n  SidebarMenu,\n  SidebarMenuButton,\n  SidebarMenuItem,\n  useSidebar,\n} from \"./shared/components/ui/sidebar\";\nimport { cn } from \"./shared/lib/utils\";\n\nexport function DashboardSidebar() {\n  const { isMobile, setOpenMobile, state } = useSidebar();\n  const [workspaces, setWorkspaces] = useState([\n    'Lumen Labs',\n    'Halcyon Studio',\n    'Pinecrest Co.',\n  ]);\n  const [workspace, setWorkspace] = useState('Lumen Labs');\n  const [creating, setCreating] = useState(false);\n  const [name, setName] = useState('');\n\n  return (\n    <>\n      <Sidebar collapsible=\"icon\">\n        <SidebarHeader className=\"px-3 pt-3.5 pb-5\">\n          <SidebarMenu>\n            <SidebarMenuItem>\n              <DropdownMenu>\n                <DropdownMenuTrigger\n                  render={\n                    <SidebarMenuButton\n                      aria-label={`${workspace}, switch workspace`}\n                      className=\"h-9 gap-2 rounded-lg px-2 font-medium group-data-[collapsible=icon]:justify-center group-data-[collapsible=icon]:p-0!\"\n                    />\n                  }\n                >\n                  <span className=\"flex size-5 shrink-0 items-center justify-center rounded-[5px] bg-blue-500 font-semibold text-[0.6875rem] text-white\">\n                    {workspace.slice(0, 1)}\n                  </span>\n                  <span className=\"flex-1 truncate group-data-[collapsible=icon]:hidden\">\n                    {workspace}\n                  </span>\n                  <ChevronDown className=\"text-muted-foreground group-data-[collapsible=icon]:hidden\" />\n                </DropdownMenuTrigger>\n                <DropdownMenuContent\n                  className={cn(\n                    'rounded-[10px] p-1.5',\n                    state === 'collapsed' && !isMobile\n                      ? 'w-56'\n                      : 'w-(--anchor-width)'\n                  )}\n                  side={state === 'collapsed' && !isMobile ? 'right' : 'bottom'}\n                  sideOffset={8}\n                >\n                  <DropdownMenuGroup>\n                    <DropdownMenuLabel className=\"px-2.5 py-2\">\n                      Workspaces\n                    </DropdownMenuLabel>\n                    {workspaces.map((item, index) => (\n                      <DropdownMenuItem\n                        className={cn(\n                          'min-h-9 gap-2.5 px-2.5',\n                          item === workspace && 'bg-accent'\n                        )}\n                        key={item}\n                        onClick={() => setWorkspace(item)}\n                      >\n                        <span\n                          className={cn(\n                            'flex size-5 shrink-0 items-center justify-center rounded-[5px] font-semibold text-[0.6875rem]',\n                            index === 0\n                              ? 'bg-blue-500 text-white'\n                              : 'bg-muted text-muted-foreground'\n                          )}\n                        >\n                          {item.slice(0, 1)}\n                        </span>\n                        <span className=\"flex-1 truncate\">{item}</span>\n                        {item === workspace && <Check aria-label=\"Selected\" />}\n                      </DropdownMenuItem>\n                    ))}\n                  </DropdownMenuGroup>\n                  <DropdownMenuSeparator />\n                  <DropdownMenuGroup>\n                    <DropdownMenuItem\n                      className=\"min-h-9 gap-2.5 px-2.5\"\n                      onClick={() => setCreating(true)}\n                    >\n                      <CirclePlus />\n                      Create workspace\n                    </DropdownMenuItem>\n                  </DropdownMenuGroup>\n                </DropdownMenuContent>\n              </DropdownMenu>\n            </SidebarMenuItem>\n          </SidebarMenu>\n        </SidebarHeader>\n        <SidebarContent>\n          <SidebarGroup className=\"px-3 py-0\">\n            <SidebarGroupLabel className=\"px-2.5 text-[0.6875rem] tracking-wider\">\n              WORKSPACE\n            </SidebarGroupLabel>\n            <SidebarMenu className=\"gap-0.5\">\n              {navigation.map((item) => (\n                <SidebarMenuItem\n                  className={\n                    item.label === 'Overview'\n                      ? 'before:-left-3 before:absolute before:top-2.5 before:h-4 before:w-0.75 before:rounded-r-sm before:bg-blue-500'\n                      : undefined\n                  }\n                  key={item.label}\n                >\n                  <SidebarMenuButton\n                    className=\"h-9 gap-2.5 rounded-lg px-2.5\"\n                    isActive={item.label === 'Overview'}\n                    onClick={() => setOpenMobile(false)}\n                    render={\n                      <a aria-label={item.label} href={item.href}>\n                        <item.icon\n                          aria-hidden=\"true\"\n                          className={\n                            item.label === 'Overview'\n                              ? undefined\n                              : 'text-muted-foreground'\n                          }\n                        />\n                        <span className=\"flex-1 group-data-[collapsible=icon]:hidden\">\n                          {item.label}\n                        </span>\n                        {item.label === 'Customers' && (\n                          <div className=\"rounded-full bg-muted px-1.5 text-[0.6875rem] text-muted-foreground tabular-nums group-data-[collapsible=icon]:hidden\">\n                            12\n                          </div>\n                        )}\n                      </a>\n                    }\n                    tooltip={item.label}\n                  />\n                </SidebarMenuItem>\n              ))}\n            </SidebarMenu>\n          </SidebarGroup>\n        </SidebarContent>\n        <SidebarFooter className=\"gap-3 px-3 pb-5\">\n          <SidebarMenu className=\"gap-0.5\">\n            <SidebarMenuItem>\n              <DropdownMenu>\n                <DropdownMenuTrigger\n                  render={\n                    <SidebarMenuButton\n                      aria-label=\"Settings\"\n                      className=\"h-9 gap-2.5 rounded-lg px-2.5\"\n                      tooltip=\"Settings\"\n                    />\n                  }\n                >\n                  <Settings className=\"text-muted-foreground\" />\n                  <span className=\"group-data-[collapsible=icon]:hidden\">\n                    Settings\n                  </span>\n                </DropdownMenuTrigger>\n                <DropdownMenuContent\n                  className=\"w-64 rounded-[10px] p-1.5\"\n                  side=\"top\"\n                  sideOffset={8}\n                >\n                  <DropdownMenuGroup>\n                    <DropdownMenuItem\n                      className=\"min-h-9 gap-2.5 px-2.5\"\n                      render={\n                        <a\n                          aria-label=\"Company profile\"\n                          href=\"/settings/company\"\n                        >\n                          <BriefcaseBusiness />\n                          Company profile\n                        </a>\n                      }\n                    />\n                    <DropdownMenuItem\n                      className=\"min-h-9 gap-2.5 px-2.5\"\n                      render={\n                        <a aria-label=\"Team\" href=\"/settings/team\">\n                          <Users />\n                          Team\n                        </a>\n                      }\n                    />\n                    <DropdownMenuItem\n                      className=\"min-h-9 gap-2.5 px-2.5\"\n                      render={\n                        <a aria-label=\"Billing\" href=\"/settings/billing\">\n                          <CreditCard />\n                          Billing\n                        </a>\n                      }\n                    />\n                    <DropdownMenuItem\n                      className=\"min-h-9 gap-2.5 px-2.5\"\n                      closeOnClick={false}\n                      onClick={() =>\n                        document.documentElement.classList.toggle('dark')\n                      }\n                    >\n                      <Moon />\n                      <span className=\"flex-1\">Appearance</span>\n                      <div className=\"text-muted-foreground text-xs\">\n                        <span className=\"dark:hidden\">Light</span>\n                        <span className=\"not-dark:hidden\">Dark</span>\n                      </div>\n                    </DropdownMenuItem>\n                  </DropdownMenuGroup>\n                </DropdownMenuContent>\n              </DropdownMenu>\n            </SidebarMenuItem>\n            <SidebarMenuItem>\n              <SidebarMenuButton\n                className=\"h-9 gap-2.5 rounded-lg px-2.5\"\n                render={\n                  <a\n                    aria-label=\"Help and support\"\n                    href=\"mailto:support@lumenlabs.io\"\n                  >\n                    <CircleHelp className=\"text-muted-foreground\" />\n                    <span className=\"group-data-[collapsible=icon]:hidden\">\n                      Help &amp; support\n                    </span>\n                  </a>\n                }\n                tooltip=\"Help and support\"\n              />\n            </SidebarMenuItem>\n          </SidebarMenu>\n          <div className=\"flex flex-col gap-3 rounded-[10px] border border-border bg-background p-3 group-data-[collapsible=icon]:hidden dark:border-input dark:bg-input/30\">\n            <div className=\"flex items-center justify-between text-[0.8125rem]\">\n              <span className=\"font-medium\">Monthly volume</span>\n              <div className=\"text-[0.8125rem] text-muted-foreground tabular-nums\">\n                72%\n              </div>\n            </div>\n            <Progress\n              aria-label=\"Monthly volume used\"\n              className=\"[&_[data-slot=progress-indicator]]:bg-blue-500 [&_[data-slot=progress-track]]:bg-border\"\n              value={72.4}\n            />\n            <p className=\"text-muted-foreground text-xs tabular-nums\">\n              $72,400 of $100,000 used\n            </p>\n          </div>\n        </SidebarFooter>\n      </Sidebar>\n      <Dialog onOpenChange={setCreating} open={creating}>\n        <DialogContent>\n          <form\n            className=\"flex flex-col gap-5\"\n            onSubmit={(event) => {\n              event.preventDefault();\n              const nextName = name.trim();\n              if (!nextName) {\n                return;\n              }\n              if (!workspaces.includes(nextName)) {\n                setWorkspaces([...workspaces, nextName]);\n              }\n              setWorkspace(nextName);\n              setName('');\n              setCreating(false);\n            }}\n          >\n            <DialogHeader>\n              <DialogTitle>Create workspace</DialogTitle>\n              <DialogDescription>\n                Add a workspace to this dashboard preview.\n              </DialogDescription>\n            </DialogHeader>\n            <FieldGroup>\n              <Field>\n                <FieldLabel htmlFor=\"workspace-name\">Workspace name</FieldLabel>\n                <Input\n                  autoComplete=\"organization\"\n                  id=\"workspace-name\"\n                  maxLength={60}\n                  name=\"workspace-name\"\n                  onChange={(event) => setName(event.target.value)}\n                  pattern=\".*\\S.*\"\n                  required\n                  value={name}\n                />\n              </Field>\n            </FieldGroup>\n            <DialogFooter>\n              <Button\n                onClick={() => setCreating(false)}\n                type=\"button\"\n                variant=\"outline\"\n              >\n                Cancel\n              </Button>\n              <Button type=\"submit\">Create workspace</Button>\n            </DialogFooter>\n          </form>\n        </DialogContent>\n      </Dialog>\n    </>\n  );\n}\n\nconst navigation = [\n  { label: 'Overview', href: '#overview', icon: LayoutDashboard },\n  { label: 'Customers', href: '#customers', icon: Users },\n  { label: 'Transactions', href: '/transactions', icon: ArrowLeftRight },\n  { label: 'Payouts', href: '/payouts', icon: CreditCard },\n  { label: 'Reports', href: '#revenue', icon: ChartNoAxesCombined },\n];\n"
    },
    {
      "path": "licenses/dashboard-01/LICENSE.txt",
      "type": "registry:file",
      "target": "@components/uiblocks/dashboard-01/LICENSE.txt",
      "content": "Includes source from Blocks.so and its bundled primitives.\nSource: https://github.com/ephraimduncan/blocks\nRevision: 3f759d5171c2391253ec4c772e9e5b3db2bc7c7f\n\nMIT License\n\nCopyright (c) 2025 Ephraim Duncan\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
    },
    {
      "path": "components/ui/avatar.tsx",
      "type": "registry:component",
      "target": "@components/uiblocks/dashboard-01/shared/components/ui/avatar.tsx",
      "content": "'use client';\n\nimport { Avatar as AvatarPrimitive } from '@base-ui/react/avatar';\nimport type * as React from 'react';\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Avatar({\n  className,\n  size = 'default',\n  ...props\n}: AvatarPrimitive.Root.Props & {\n  size?: 'default' | 'sm' | 'lg';\n}) {\n  return (\n    <AvatarPrimitive.Root\n      className={cn(\n        'group/avatar relative flex size-8 shrink-0 select-none rounded-full after:absolute after:inset-0 after:rounded-full after:border after:border-border after:mix-blend-darken data-[size=lg]:size-10 data-[size=sm]:size-6 dark:after:mix-blend-lighten',\n        className\n      )}\n      data-size={size}\n      data-slot=\"avatar\"\n      {...props}\n    />\n  );\n}\n\nfunction AvatarImage({ className, ...props }: AvatarPrimitive.Image.Props) {\n  return (\n    <AvatarPrimitive.Image\n      className={cn(\n        'aspect-square size-full rounded-full object-cover',\n        className\n      )}\n      data-slot=\"avatar-image\"\n      {...props}\n    />\n  );\n}\n\nfunction AvatarFallback({\n  className,\n  ...props\n}: AvatarPrimitive.Fallback.Props) {\n  return (\n    <AvatarPrimitive.Fallback\n      className={cn(\n        'flex size-full items-center justify-center rounded-full bg-muted text-muted-foreground text-sm group-data-[size=sm]/avatar:text-xs',\n        className\n      )}\n      data-slot=\"avatar-fallback\"\n      {...props}\n    />\n  );\n}\n\nfunction AvatarBadge({ className, ...props }: React.ComponentProps<'span'>) {\n  return (\n    <span\n      className={cn(\n        'absolute right-0 bottom-0 z-10 inline-flex select-none items-center justify-center rounded-full bg-primary text-primary-foreground bg-blend-color ring-2 ring-background',\n        'group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden',\n        'group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2',\n        'group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2',\n        className\n      )}\n      data-slot=\"avatar-badge\"\n      {...props}\n    />\n  );\n}\n\nfunction AvatarGroup({ className, ...props }: React.ComponentProps<'div'>) {\n  return (\n    <div\n      className={cn(\n        'group/avatar-group -space-x-2 flex *:data-[slot=avatar]:ring-2 *:data-[slot=avatar]:ring-background',\n        className\n      )}\n      data-slot=\"avatar-group\"\n      {...props}\n    />\n  );\n}\n\nfunction AvatarGroupCount({\n  className,\n  ...props\n}: React.ComponentProps<'div'>) {\n  return (\n    <div\n      className={cn(\n        'relative flex size-8 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground text-sm ring-2 ring-background group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3',\n        className\n      )}\n      data-slot=\"avatar-group-count\"\n      {...props}\n    />\n  );\n}\n\nexport {\n  Avatar,\n  AvatarImage,\n  AvatarFallback,\n  AvatarGroup,\n  AvatarGroupCount,\n  AvatarBadge,\n};\n"
    },
    {
      "path": "components/ui/button.tsx",
      "type": "registry:component",
      "target": "@components/uiblocks/dashboard-01/shared/components/ui/button.tsx",
      "content": "import { Button as ButtonPrimitive } from '@base-ui/react/button';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from \"../../lib/utils\";\n\nconst buttonVariants = cva(\n  \"group/button inline-flex shrink-0 select-none items-center justify-center whitespace-nowrap rounded-lg border border-transparent bg-clip-padding font-medium text-sm outline-none transition-all focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n  {\n    variants: {\n      variant: {\n        default: 'bg-primary text-primary-foreground hover:bg-primary/80',\n        outline:\n          'border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50',\n        secondary:\n          'bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground',\n        ghost:\n          'hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50',\n        destructive:\n          'bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 dark:hover:bg-destructive/30',\n        link: 'text-primary underline-offset-4 hover:underline',\n      },\n      size: {\n        default:\n          'h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2',\n        xs: \"h-6 gap-1 in-data-[slot=button-group]:rounded-lg rounded-[min(var(--radius-md),10px)] px-2 text-xs has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3\",\n        sm: \"h-7 gap-1 in-data-[slot=button-group]:rounded-lg rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5\",\n        lg: 'h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2',\n        icon: 'size-8',\n        'icon-xs':\n          \"size-6 in-data-[slot=button-group]:rounded-lg rounded-[min(var(--radius-md),10px)] [&_svg:not([class*='size-'])]:size-3\",\n        'icon-sm':\n          'size-7 in-data-[slot=button-group]:rounded-lg rounded-[min(var(--radius-md),12px)]',\n        'icon-lg': 'size-9',\n      },\n    },\n    defaultVariants: {\n      variant: 'default',\n      size: 'default',\n    },\n  }\n);\n\nfunction Button({\n  className,\n  variant = 'default',\n  size = 'default',\n  ...props\n}: ButtonPrimitive.Props & VariantProps<typeof buttonVariants>) {\n  return (\n    <ButtonPrimitive\n      className={cn(buttonVariants({ variant, size, className }))}\n      data-slot=\"button\"\n      {...props}\n    />\n  );\n}\n\nexport { Button, buttonVariants };\n"
    },
    {
      "path": "components/ui/chart.tsx",
      "type": "registry:component",
      "target": "@components/uiblocks/dashboard-01/shared/components/ui/chart.tsx",
      "content": "'use client';\n\nimport * as React from 'react';\nimport type { TooltipValueType } from 'recharts';\nimport * as RechartsPrimitive from 'recharts';\n\nimport { cn } from \"../../lib/utils\";\n\n// Format: { THEME_NAME: CSS_SELECTOR }\nconst THEMES = { light: '', dark: '.dark' } as const;\n\nconst INITIAL_DIMENSION = { width: 320, height: 200 } as const;\ntype TooltipNameType = number | string;\n\nexport type ChartConfig = Record<\n  string,\n  {\n    label?: React.ReactNode;\n    icon?: React.ComponentType;\n  } & (\n    | { color?: string; theme?: never }\n    | { color?: never; theme: Record<keyof typeof THEMES, string> }\n  )\n>;\n\ntype ChartContextProps = {\n  config: ChartConfig;\n};\n\nconst ChartContext = React.createContext<ChartContextProps | null>(null);\n\nfunction useChart() {\n  const context = React.useContext(ChartContext);\n\n  if (!context) {\n    throw new Error('useChart must be used within a <ChartContainer />');\n  }\n\n  return context;\n}\n\nfunction ChartContainer({\n  id,\n  className,\n  children,\n  config,\n  initialDimension = INITIAL_DIMENSION,\n  ...props\n}: React.ComponentProps<'div'> & {\n  config: ChartConfig;\n  children: React.ComponentProps<\n    typeof RechartsPrimitive.ResponsiveContainer\n  >['children'];\n  initialDimension?: {\n    width: number;\n    height: number;\n  };\n}) {\n  const uniqueId = React.useId();\n  const chartId = `chart-${id ?? uniqueId.replace(/:/g, '')}`;\n\n  return (\n    <ChartContext.Provider value={{ config }}>\n      <div\n        className={cn(\n          \"flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-hidden [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-sector]:outline-hidden [&_.recharts-surface]:outline-hidden\",\n          className\n        )}\n        data-chart={chartId}\n        data-slot=\"chart\"\n        {...props}\n      >\n        <ChartStyle config={config} id={chartId} />\n        <RechartsPrimitive.ResponsiveContainer\n          initialDimension={initialDimension}\n        >\n          {children}\n        </RechartsPrimitive.ResponsiveContainer>\n      </div>\n    </ChartContext.Provider>\n  );\n}\n\nconst ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {\n  const colorConfig = Object.entries(config).filter(\n    ([, config]) => config.theme ?? config.color\n  );\n\n  if (!colorConfig.length) {\n    return null;\n  }\n\n  return (\n    <style\n      dangerouslySetInnerHTML={{\n        __html: Object.entries(THEMES)\n          .map(\n            ([theme, prefix]) => `\n${prefix} [data-chart=${id}] {\n${colorConfig\n  .map(([key, itemConfig]) => {\n    const color =\n      itemConfig.theme?.[theme as keyof typeof itemConfig.theme] ??\n      itemConfig.color;\n    return color ? `  --color-${key}: ${color};` : null;\n  })\n  .join('\\n')}\n}\n`\n          )\n          .join('\\n'),\n      }}\n    />\n  );\n};\n\nconst ChartTooltip = RechartsPrimitive.Tooltip;\n\nfunction ChartTooltipContent({\n  active,\n  payload,\n  className,\n  indicator = 'dot',\n  hideLabel = false,\n  hideIndicator = false,\n  label,\n  labelFormatter,\n  labelClassName,\n  formatter,\n  color,\n  nameKey,\n  labelKey,\n}: React.ComponentProps<typeof RechartsPrimitive.Tooltip> &\n  React.ComponentProps<'div'> & {\n    hideLabel?: boolean;\n    hideIndicator?: boolean;\n    indicator?: 'line' | 'dot' | 'dashed';\n    nameKey?: string;\n    labelKey?: string;\n  } & Omit<\n    RechartsPrimitive.DefaultTooltipContentProps<\n      TooltipValueType,\n      TooltipNameType\n    >,\n    'accessibilityLayer'\n  >) {\n  const { config } = useChart();\n\n  const tooltipLabel = React.useMemo(() => {\n    if (hideLabel || !payload?.length) {\n      return null;\n    }\n\n    const [item] = payload;\n    const key = `${labelKey ?? item?.dataKey ?? item?.name ?? 'value'}`;\n    const itemConfig = getPayloadConfigFromPayload(config, item, key);\n    const value =\n      !labelKey && typeof label === 'string'\n        ? (config[label]?.label ?? label)\n        : itemConfig?.label;\n\n    if (labelFormatter) {\n      return (\n        <div className={cn('font-medium', labelClassName)}>\n          {labelFormatter(value, payload)}\n        </div>\n      );\n    }\n\n    if (!value) {\n      return null;\n    }\n\n    return <div className={cn('font-medium', labelClassName)}>{value}</div>;\n  }, [\n    label,\n    labelFormatter,\n    payload,\n    hideLabel,\n    labelClassName,\n    config,\n    labelKey,\n  ]);\n\n  if (!(active && payload?.length)) {\n    return null;\n  }\n\n  const nestLabel = payload.length === 1 && indicator !== 'dot';\n\n  return (\n    <div\n      className={cn(\n        'grid min-w-32 items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl',\n        className\n      )}\n    >\n      {nestLabel ? null : tooltipLabel}\n      <div className=\"grid gap-1.5\">\n        {payload\n          .filter((item) => item.type !== 'none')\n          .map((item, index) => {\n            const key = `${nameKey ?? item.name ?? item.dataKey ?? 'value'}`;\n            const itemConfig = getPayloadConfigFromPayload(config, item, key);\n            const indicatorColor = color ?? item.payload?.fill ?? item.color;\n\n            return (\n              <div\n                className={cn(\n                  'flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground',\n                  indicator === 'dot' && 'items-center'\n                )}\n                key={index}\n              >\n                {formatter && item?.value !== undefined && item.name ? (\n                  formatter(item.value, item.name, item, index, item.payload)\n                ) : (\n                  <>\n                    {itemConfig?.icon ? (\n                      <itemConfig.icon />\n                    ) : (\n                      !hideIndicator && (\n                        <div\n                          className={cn(\n                            'shrink-0 rounded-[2px] border-(--color-border) bg-(--color-bg)',\n                            {\n                              'h-2.5 w-2.5': indicator === 'dot',\n                              'w-1': indicator === 'line',\n                              'w-0 border-[1.5px] border-dashed bg-transparent':\n                                indicator === 'dashed',\n                              'my-0.5': nestLabel && indicator === 'dashed',\n                            }\n                          )}\n                          style={\n                            {\n                              '--color-bg': indicatorColor,\n                              '--color-border': indicatorColor,\n                            } as React.CSSProperties\n                          }\n                        />\n                      )\n                    )}\n                    <div\n                      className={cn(\n                        'flex flex-1 justify-between leading-none',\n                        nestLabel ? 'items-end' : 'items-center'\n                      )}\n                    >\n                      <div className=\"grid gap-1.5\">\n                        {nestLabel ? tooltipLabel : null}\n                        <span className=\"text-muted-foreground\">\n                          {itemConfig?.label ?? item.name}\n                        </span>\n                      </div>\n                      {item.value != null && (\n                        <span className=\"font-medium font-mono text-foreground tabular-nums\">\n                          {typeof item.value === 'number'\n                            ? item.value.toLocaleString()\n                            : String(item.value)}\n                        </span>\n                      )}\n                    </div>\n                  </>\n                )}\n              </div>\n            );\n          })}\n      </div>\n    </div>\n  );\n}\n\nconst ChartLegend = RechartsPrimitive.Legend;\n\nfunction ChartLegendContent({\n  className,\n  hideIcon = false,\n  payload,\n  verticalAlign = 'bottom',\n  nameKey,\n}: React.ComponentProps<'div'> & {\n  hideIcon?: boolean;\n  nameKey?: string;\n} & RechartsPrimitive.DefaultLegendContentProps) {\n  const { config } = useChart();\n\n  if (!payload?.length) {\n    return null;\n  }\n\n  return (\n    <div\n      className={cn(\n        'flex items-center justify-center gap-4',\n        verticalAlign === 'top' ? 'pb-3' : 'pt-3',\n        className\n      )}\n    >\n      {payload\n        .filter((item) => item.type !== 'none')\n        .map((item, index) => {\n          const key = `${nameKey ?? item.dataKey ?? 'value'}`;\n          const itemConfig = getPayloadConfigFromPayload(config, item, key);\n\n          return (\n            <div\n              className={cn(\n                'flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground'\n              )}\n              key={index}\n            >\n              {itemConfig?.icon && !hideIcon ? (\n                <itemConfig.icon />\n              ) : (\n                <div\n                  className=\"h-2 w-2 shrink-0 rounded-[2px]\"\n                  style={{\n                    backgroundColor: item.color,\n                  }}\n                />\n              )}\n              {itemConfig?.label}\n            </div>\n          );\n        })}\n    </div>\n  );\n}\n\nfunction getPayloadConfigFromPayload(\n  config: ChartConfig,\n  payload: unknown,\n  key: string\n) {\n  if (typeof payload !== 'object' || payload === null) {\n    return;\n  }\n\n  const payloadPayload =\n    'payload' in payload &&\n    typeof payload.payload === 'object' &&\n    payload.payload !== null\n      ? payload.payload\n      : undefined;\n\n  let configLabelKey: string = key;\n\n  if (\n    key in payload &&\n    typeof payload[key as keyof typeof payload] === 'string'\n  ) {\n    configLabelKey = payload[key as keyof typeof payload] as string;\n  } else if (\n    payloadPayload &&\n    key in payloadPayload &&\n    typeof payloadPayload[key as keyof typeof payloadPayload] === 'string'\n  ) {\n    configLabelKey = payloadPayload[\n      key as keyof typeof payloadPayload\n    ] as string;\n  }\n\n  return configLabelKey in config ? config[configLabelKey] : config[key];\n}\n\nexport {\n  ChartContainer,\n  ChartTooltip,\n  ChartTooltipContent,\n  ChartLegend,\n  ChartLegendContent,\n  ChartStyle,\n};\n"
    },
    {
      "path": "components/ui/dialog.tsx",
      "type": "registry:component",
      "target": "@components/uiblocks/dashboard-01/shared/components/ui/dialog.tsx",
      "content": "'use client';\n\nimport { Dialog as DialogPrimitive } from '@base-ui/react/dialog';\nimport { XIcon } from 'lucide-react';\nimport type * as React from 'react';\nimport { Button } from \"./button\";\nimport { cn } from \"../../lib/utils\";\n\nfunction Dialog({ ...props }: DialogPrimitive.Root.Props) {\n  return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />;\n}\n\nfunction DialogTrigger({ ...props }: DialogPrimitive.Trigger.Props) {\n  return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />;\n}\n\nfunction DialogPortal({ ...props }: DialogPrimitive.Portal.Props) {\n  return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />;\n}\n\nfunction DialogClose({ ...props }: DialogPrimitive.Close.Props) {\n  return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />;\n}\n\nfunction DialogOverlay({\n  className,\n  ...props\n}: DialogPrimitive.Backdrop.Props) {\n  return (\n    <DialogPrimitive.Backdrop\n      className={cn(\n        'data-open:fade-in-0 data-closed:fade-out-0 fixed inset-0 isolate z-50 bg-black/10 duration-100 data-closed:animate-out data-open:animate-in supports-backdrop-filter:backdrop-blur-xs',\n        className\n      )}\n      data-slot=\"dialog-overlay\"\n      {...props}\n    />\n  );\n}\n\nfunction DialogContent({\n  className,\n  children,\n  showCloseButton = true,\n  ...props\n}: DialogPrimitive.Popup.Props & {\n  showCloseButton?: boolean;\n}) {\n  return (\n    <DialogPortal>\n      <DialogOverlay />\n      <DialogPrimitive.Popup\n        className={cn(\n          '-translate-x-1/2 -translate-y-1/2 data-open:fade-in-0 data-open:zoom-in-95 data-closed:fade-out-0 data-closed:zoom-out-95 fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] gap-4 rounded-xl bg-popover p-4 text-popover-foreground text-sm outline-none ring-1 ring-foreground/10 duration-100 data-closed:animate-out data-open:animate-in sm:max-w-sm',\n          className\n        )}\n        data-slot=\"dialog-content\"\n        {...props}\n      >\n        {children}\n        {showCloseButton && (\n          <DialogPrimitive.Close\n            data-slot=\"dialog-close\"\n            render={\n              <Button\n                className=\"absolute top-2 right-2\"\n                size=\"icon-sm\"\n                variant=\"ghost\"\n              />\n            }\n          >\n            <XIcon />\n            <span className=\"sr-only\">Close</span>\n          </DialogPrimitive.Close>\n        )}\n      </DialogPrimitive.Popup>\n    </DialogPortal>\n  );\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<'div'>) {\n  return (\n    <div\n      className={cn('flex flex-col gap-2', className)}\n      data-slot=\"dialog-header\"\n      {...props}\n    />\n  );\n}\n\nfunction DialogFooter({\n  className,\n  showCloseButton = false,\n  children,\n  ...props\n}: React.ComponentProps<'div'> & {\n  showCloseButton?: boolean;\n}) {\n  return (\n    <div\n      className={cn(\n        '-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 sm:flex-row sm:justify-end',\n        className\n      )}\n      data-slot=\"dialog-footer\"\n      {...props}\n    >\n      {children}\n      {showCloseButton && (\n        <DialogPrimitive.Close render={<Button variant=\"outline\" />}>\n          Close\n        </DialogPrimitive.Close>\n      )}\n    </div>\n  );\n}\n\nfunction DialogTitle({ className, ...props }: DialogPrimitive.Title.Props) {\n  return (\n    <DialogPrimitive.Title\n      className={cn('font-medium text-base leading-none', className)}\n      data-slot=\"dialog-title\"\n      {...props}\n    />\n  );\n}\n\nfunction DialogDescription({\n  className,\n  ...props\n}: DialogPrimitive.Description.Props) {\n  return (\n    <DialogPrimitive.Description\n      className={cn(\n        'text-muted-foreground text-sm *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground',\n        className\n      )}\n      data-slot=\"dialog-description\"\n      {...props}\n    />\n  );\n}\n\nexport {\n  Dialog,\n  DialogClose,\n  DialogContent,\n  DialogDescription,\n  DialogFooter,\n  DialogHeader,\n  DialogOverlay,\n  DialogPortal,\n  DialogTitle,\n  DialogTrigger,\n};\n"
    },
    {
      "path": "components/ui/dropdown-menu.tsx",
      "type": "registry:component",
      "target": "@components/uiblocks/dashboard-01/shared/components/ui/dropdown-menu.tsx",
      "content": "'use client';\n\nimport { Menu as MenuPrimitive } from '@base-ui/react/menu';\nimport { CheckIcon, ChevronRightIcon } from 'lucide-react';\nimport type * as React from 'react';\nimport { cn } from \"../../lib/utils\";\n\nfunction DropdownMenu({ ...props }: MenuPrimitive.Root.Props) {\n  return <MenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />;\n}\n\nfunction DropdownMenuPortal({ ...props }: MenuPrimitive.Portal.Props) {\n  return <MenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />;\n}\n\nfunction DropdownMenuTrigger({ ...props }: MenuPrimitive.Trigger.Props) {\n  return <MenuPrimitive.Trigger data-slot=\"dropdown-menu-trigger\" {...props} />;\n}\n\nfunction DropdownMenuContent({\n  align = 'start',\n  alignOffset = 0,\n  side = 'bottom',\n  sideOffset = 4,\n  className,\n  ...props\n}: MenuPrimitive.Popup.Props &\n  Pick<\n    MenuPrimitive.Positioner.Props,\n    'align' | 'alignOffset' | 'side' | 'sideOffset'\n  >) {\n  return (\n    <MenuPrimitive.Portal>\n      <MenuPrimitive.Positioner\n        align={align}\n        alignOffset={alignOffset}\n        className=\"isolate z-50 outline-none\"\n        side={side}\n        sideOffset={sideOffset}\n      >\n        <MenuPrimitive.Popup\n          className={cn(\n            'data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:fade-in-0 data-open:zoom-in-95 data-closed:fade-out-0 data-closed:zoom-out-95 z-50 max-h-(--available-height) w-(--anchor-width) min-w-32 origin-(--transform-origin) overflow-y-auto overflow-x-hidden rounded-lg bg-popover p-1 text-popover-foreground shadow-md outline-none ring-1 ring-foreground/10 duration-100 data-closed:animate-out data-open:animate-in data-closed:overflow-hidden',\n            className\n          )}\n          data-slot=\"dropdown-menu-content\"\n          {...props}\n        />\n      </MenuPrimitive.Positioner>\n    </MenuPrimitive.Portal>\n  );\n}\n\nfunction DropdownMenuGroup({ ...props }: MenuPrimitive.Group.Props) {\n  return <MenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />;\n}\n\nfunction DropdownMenuLabel({\n  className,\n  inset,\n  ...props\n}: MenuPrimitive.GroupLabel.Props & {\n  inset?: boolean;\n}) {\n  return (\n    <MenuPrimitive.GroupLabel\n      className={cn(\n        'px-1.5 py-1 font-medium text-muted-foreground text-xs data-inset:pl-7',\n        className\n      )}\n      data-inset={inset}\n      data-slot=\"dropdown-menu-label\"\n      {...props}\n    />\n  );\n}\n\nfunction DropdownMenuItem({\n  className,\n  inset,\n  variant = 'default',\n  ...props\n}: MenuPrimitive.Item.Props & {\n  inset?: boolean;\n  variant?: 'default' | 'destructive';\n}) {\n  return (\n    <MenuPrimitive.Item\n      className={cn(\n        \"group/dropdown-menu-item relative flex cursor-default select-none items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-disabled:pointer-events-none data-inset:pl-7 data-[variant=destructive]:text-destructive data-disabled:opacity-50 data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0 data-[variant=destructive]:*:[svg]:text-destructive\",\n        className\n      )}\n      data-inset={inset}\n      data-slot=\"dropdown-menu-item\"\n      data-variant={variant}\n      {...props}\n    />\n  );\n}\n\nfunction DropdownMenuSub({ ...props }: MenuPrimitive.SubmenuRoot.Props) {\n  return <MenuPrimitive.SubmenuRoot data-slot=\"dropdown-menu-sub\" {...props} />;\n}\n\nfunction DropdownMenuSubTrigger({\n  className,\n  inset,\n  children,\n  ...props\n}: MenuPrimitive.SubmenuTrigger.Props & {\n  inset?: boolean;\n}) {\n  return (\n    <MenuPrimitive.SubmenuTrigger\n      className={cn(\n        \"flex cursor-default select-none items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-open:bg-accent data-popup-open:bg-accent data-inset:pl-7 data-open:text-accent-foreground data-popup-open:text-accent-foreground [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n        className\n      )}\n      data-inset={inset}\n      data-slot=\"dropdown-menu-sub-trigger\"\n      {...props}\n    >\n      {children}\n      <ChevronRightIcon className=\"ml-auto\" />\n    </MenuPrimitive.SubmenuTrigger>\n  );\n}\n\nfunction DropdownMenuSubContent({\n  align = 'start',\n  alignOffset = -3,\n  side = 'right',\n  sideOffset = 0,\n  className,\n  ...props\n}: React.ComponentProps<typeof DropdownMenuContent>) {\n  return (\n    <DropdownMenuContent\n      align={align}\n      alignOffset={alignOffset}\n      className={cn(\n        'data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:fade-in-0 data-open:zoom-in-95 data-closed:fade-out-0 data-closed:zoom-out-95 w-auto min-w-[96px] rounded-lg bg-popover p-1 text-popover-foreground shadow-lg ring-1 ring-foreground/10 duration-100 data-closed:animate-out data-open:animate-in',\n        className\n      )}\n      data-slot=\"dropdown-menu-sub-content\"\n      side={side}\n      sideOffset={sideOffset}\n      {...props}\n    />\n  );\n}\n\nfunction DropdownMenuCheckboxItem({\n  className,\n  children,\n  checked,\n  inset,\n  ...props\n}: MenuPrimitive.CheckboxItem.Props & {\n  inset?: boolean;\n}) {\n  return (\n    <MenuPrimitive.CheckboxItem\n      checked={checked}\n      className={cn(\n        \"relative flex cursor-default select-none items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-disabled:pointer-events-none data-inset:pl-7 data-disabled:opacity-50 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n        className\n      )}\n      data-inset={inset}\n      data-slot=\"dropdown-menu-checkbox-item\"\n      {...props}\n    >\n      <span\n        className=\"pointer-events-none absolute right-2 flex items-center justify-center\"\n        data-slot=\"dropdown-menu-checkbox-item-indicator\"\n      >\n        <MenuPrimitive.CheckboxItemIndicator>\n          <CheckIcon />\n        </MenuPrimitive.CheckboxItemIndicator>\n      </span>\n      {children}\n    </MenuPrimitive.CheckboxItem>\n  );\n}\n\nfunction DropdownMenuRadioGroup({ ...props }: MenuPrimitive.RadioGroup.Props) {\n  return (\n    <MenuPrimitive.RadioGroup\n      data-slot=\"dropdown-menu-radio-group\"\n      {...props}\n    />\n  );\n}\n\nfunction DropdownMenuRadioItem({\n  className,\n  children,\n  inset,\n  ...props\n}: MenuPrimitive.RadioItem.Props & {\n  inset?: boolean;\n}) {\n  return (\n    <MenuPrimitive.RadioItem\n      className={cn(\n        \"relative flex cursor-default select-none items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-disabled:pointer-events-none data-inset:pl-7 data-disabled:opacity-50 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n        className\n      )}\n      data-inset={inset}\n      data-slot=\"dropdown-menu-radio-item\"\n      {...props}\n    >\n      <span\n        className=\"pointer-events-none absolute right-2 flex items-center justify-center\"\n        data-slot=\"dropdown-menu-radio-item-indicator\"\n      >\n        <MenuPrimitive.RadioItemIndicator>\n          <CheckIcon />\n        </MenuPrimitive.RadioItemIndicator>\n      </span>\n      {children}\n    </MenuPrimitive.RadioItem>\n  );\n}\n\nfunction DropdownMenuSeparator({\n  className,\n  ...props\n}: MenuPrimitive.Separator.Props) {\n  return (\n    <MenuPrimitive.Separator\n      className={cn('-mx-1 my-1 h-px bg-border', className)}\n      data-slot=\"dropdown-menu-separator\"\n      {...props}\n    />\n  );\n}\n\nfunction DropdownMenuShortcut({\n  className,\n  ...props\n}: React.ComponentProps<'span'>) {\n  return (\n    <span\n      className={cn(\n        'ml-auto text-muted-foreground text-xs tracking-widest group-focus/dropdown-menu-item:text-accent-foreground',\n        className\n      )}\n      data-slot=\"dropdown-menu-shortcut\"\n      {...props}\n    />\n  );\n}\n\nexport {\n  DropdownMenu,\n  DropdownMenuPortal,\n  DropdownMenuTrigger,\n  DropdownMenuContent,\n  DropdownMenuGroup,\n  DropdownMenuLabel,\n  DropdownMenuItem,\n  DropdownMenuCheckboxItem,\n  DropdownMenuRadioGroup,\n  DropdownMenuRadioItem,\n  DropdownMenuSeparator,\n  DropdownMenuShortcut,\n  DropdownMenuSub,\n  DropdownMenuSubTrigger,\n  DropdownMenuSubContent,\n};\n"
    },
    {
      "path": "components/ui/field.tsx",
      "type": "registry:component",
      "target": "@components/uiblocks/dashboard-01/shared/components/ui/field.tsx",
      "content": "'use client';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useMemo } from 'react';\nimport { Label } from \"./label\";\nimport { Separator } from \"./separator\";\nimport { cn } from \"../../lib/utils\";\n\nfunction FieldSet({ className, ...props }: React.ComponentProps<'fieldset'>) {\n  return (\n    <fieldset\n      className={cn(\n        'flex flex-col gap-4 has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3',\n        className\n      )}\n      data-slot=\"field-set\"\n      {...props}\n    />\n  );\n}\n\nfunction FieldLegend({\n  className,\n  variant = 'legend',\n  ...props\n}: React.ComponentProps<'legend'> & { variant?: 'legend' | 'label' }) {\n  return (\n    <legend\n      className={cn(\n        'mb-1.5 font-medium data-[variant=label]:text-sm data-[variant=legend]:text-base',\n        className\n      )}\n      data-slot=\"field-legend\"\n      data-variant={variant}\n      {...props}\n    />\n  );\n}\n\nfunction FieldGroup({ className, ...props }: React.ComponentProps<'div'>) {\n  return (\n    <div\n      className={cn(\n        'group/field-group @container/field-group flex w-full flex-col gap-5 data-[slot=checkbox-group]:gap-3 *:data-[slot=field-group]:gap-4',\n        className\n      )}\n      data-slot=\"field-group\"\n      {...props}\n    />\n  );\n}\n\nconst fieldVariants = cva(\n  'group/field flex w-full gap-2 data-[invalid=true]:text-destructive',\n  {\n    variants: {\n      orientation: {\n        vertical: 'flex-col *:w-full [&>.sr-only]:w-auto',\n        horizontal:\n          'flex-row items-center has-[>[data-slot=field-content]]:items-start *:data-[slot=field-label]:flex-auto has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px',\n        responsive:\n          '@md/field-group:flex-row flex-col @md/field-group:items-center *:w-full @md/field-group:*:w-auto @md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:*:data-[slot=field-label]:flex-auto [&>.sr-only]:w-auto @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px',\n      },\n    },\n    defaultVariants: {\n      orientation: 'vertical',\n    },\n  }\n);\n\nfunction Field({\n  className,\n  orientation = 'vertical',\n  ...props\n}: React.ComponentProps<'div'> & VariantProps<typeof fieldVariants>) {\n  return (\n    <div\n      className={cn(fieldVariants({ orientation }), className)}\n      data-orientation={orientation}\n      data-slot=\"field\"\n      role=\"group\"\n      {...props}\n    />\n  );\n}\n\nfunction FieldContent({ className, ...props }: React.ComponentProps<'div'>) {\n  return (\n    <div\n      className={cn(\n        'group/field-content flex flex-1 flex-col gap-0.5 leading-snug',\n        className\n      )}\n      data-slot=\"field-content\"\n      {...props}\n    />\n  );\n}\n\nfunction FieldLabel({\n  className,\n  ...props\n}: React.ComponentProps<typeof Label>) {\n  return (\n    <Label\n      className={cn(\n        'group/field-label peer/field-label flex w-fit gap-2 leading-snug has-[>[data-slot=field]]:has-[:focus-visible]:border-ring has-[>[data-slot=field]]:has-[:focus-visible]:ring-3 has-[>[data-slot=field]]:has-[:focus-visible]:ring-ring/50 has-[>[data-slot=field]]:rounded-lg has-[>[data-slot=field]]:border has-data-checked:border-primary/30 has-data-checked:bg-primary/5 has-[>[data-slot=field]]:not-has-[:disabled,[data-disabled]]:hover:bg-muted/50 *:data-[slot=field]:p-2.5 group-data-[disabled=true]/field:opacity-50 dark:has-data-checked:border-primary/20 dark:has-data-checked:bg-primary/10',\n        'has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col',\n        className\n      )}\n      data-slot=\"field-label\"\n      {...props}\n    />\n  );\n}\n\nfunction FieldTitle({ className, ...props }: React.ComponentProps<'div'>) {\n  return (\n    <div\n      className={cn(\n        'flex w-fit items-center gap-2 font-medium text-sm group-data-[disabled=true]/field:opacity-50',\n        className\n      )}\n      data-slot=\"field-label\"\n      {...props}\n    />\n  );\n}\n\nfunction FieldDescription({ className, ...props }: React.ComponentProps<'p'>) {\n  return (\n    <p\n      className={cn(\n        '[[data-variant=legend]+&]:-mt-1.5 text-left font-normal text-muted-foreground text-sm leading-normal group-has-data-horizontal/field:text-balance',\n        'nth-last-2:-mt-1 last:mt-0',\n        '[&>a:hover]:text-primary [&>a]:underline [&>a]:underline-offset-4',\n        className\n      )}\n      data-slot=\"field-description\"\n      {...props}\n    />\n  );\n}\n\nfunction FieldSeparator({\n  children,\n  className,\n  ...props\n}: React.ComponentProps<'div'> & {\n  children?: React.ReactNode;\n}) {\n  return (\n    <div\n      className={cn(\n        '-my-2 group-data-[variant=outline]/field-group:-mb-2 relative h-5 text-sm',\n        className\n      )}\n      data-content={!!children}\n      data-slot=\"field-separator\"\n      {...props}\n    >\n      <Separator className=\"absolute inset-0 top-1/2\" />\n      {children && (\n        <span\n          className=\"relative mx-auto block w-fit bg-background px-2 text-muted-foreground\"\n          data-slot=\"field-separator-content\"\n        >\n          {children}\n        </span>\n      )}\n    </div>\n  );\n}\n\nfunction FieldError({\n  className,\n  children,\n  errors,\n  ...props\n}: React.ComponentProps<'div'> & {\n  errors?: Array<{ message?: string } | undefined>;\n}) {\n  const content = useMemo(() => {\n    if (children) {\n      return children;\n    }\n\n    if (!errors?.length) {\n      return null;\n    }\n\n    const uniqueErrors = [\n      ...new Map(errors.map((error) => [error?.message, error])).values(),\n    ];\n\n    if (uniqueErrors?.length === 1) {\n      return uniqueErrors[0]?.message;\n    }\n\n    return (\n      <ul className=\"ml-4 flex list-disc flex-col gap-1\">\n        {uniqueErrors.map(\n          (error, index) =>\n            error?.message && <li key={index}>{error.message}</li>\n        )}\n      </ul>\n    );\n  }, [children, errors]);\n\n  if (!content) {\n    return null;\n  }\n\n  return (\n    <div\n      className={cn('font-normal text-destructive text-sm', className)}\n      data-slot=\"field-error\"\n      role=\"alert\"\n      {...props}\n    >\n      {content}\n    </div>\n  );\n}\n\nexport {\n  Field,\n  FieldLabel,\n  FieldDescription,\n  FieldError,\n  FieldGroup,\n  FieldLegend,\n  FieldSeparator,\n  FieldSet,\n  FieldContent,\n  FieldTitle,\n};\n"
    },
    {
      "path": "components/ui/input-group.tsx",
      "type": "registry:component",
      "target": "@components/uiblocks/dashboard-01/shared/components/ui/input-group.tsx",
      "content": "'use client';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport type * as React from 'react';\nimport { Button } from \"./button\";\nimport { Input } from \"./input\";\nimport { Textarea } from \"./textarea\";\nimport { cn } from \"../../lib/utils\";\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<'div'>) {\n  return (\n    <div\n      className={cn(\n        'group/input-group relative flex h-8 w-full min-w-0 items-center rounded-lg border border-input outline-none transition-colors in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-start]]:h-auto has-[>textarea]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:flex-col has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot][aria-invalid=true]]:border-destructive has-disabled:bg-input/50 has-disabled:opacity-50 has-[[data-slot=input-group-control]:focus-visible]:ring-3 has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:ring-3 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 dark:bg-input/30 dark:has-disabled:bg-input/80 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-start]]:[&>input]:pl-1.5',\n        className\n      )}\n      data-slot=\"input-group\"\n      role=\"group\"\n      {...props}\n    />\n  );\n}\n\nconst inputGroupAddonVariants = cva(\n  \"flex h-auto cursor-text select-none items-center justify-center gap-2 py-1.5 font-medium text-muted-foreground text-sm group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4\",\n  {\n    variants: {\n      align: {\n        'inline-start':\n          'order-first pl-2 has-[>button]:ml-[-0.3rem] has-[>kbd]:ml-[-0.15rem]',\n        'inline-end':\n          'order-last pr-2 has-[>button]:mr-[-0.3rem] has-[>kbd]:mr-[-0.15rem]',\n        'block-start':\n          'order-first w-full justify-start px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2',\n        'block-end':\n          'order-last w-full justify-start px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2',\n      },\n    },\n    defaultVariants: {\n      align: 'inline-start',\n    },\n  }\n);\n\nfunction InputGroupAddon({\n  className,\n  align = 'inline-start',\n  ...props\n}: React.ComponentProps<'div'> & VariantProps<typeof inputGroupAddonVariants>) {\n  return (\n    <div\n      className={cn(inputGroupAddonVariants({ align }), className)}\n      data-align={align}\n      data-slot=\"input-group-addon\"\n      onClick={(e) => {\n        if ((e.target as HTMLElement).closest('button')) {\n          return;\n        }\n        e.currentTarget.parentElement?.querySelector('input')?.focus();\n      }}\n      role=\"group\"\n      {...props}\n    />\n  );\n}\n\nconst inputGroupButtonVariants = cva(\n  'flex items-center gap-2 text-sm shadow-none',\n  {\n    variants: {\n      size: {\n        xs: \"h-6 gap-1 rounded-[calc(var(--radius)-3px)] px-1.5 [&>svg:not([class*='size-'])]:size-3.5\",\n        sm: '',\n        'icon-xs':\n          'size-6 rounded-[calc(var(--radius)-3px)] p-0 has-[>svg]:p-0',\n        'icon-sm': 'size-8 p-0 has-[>svg]:p-0',\n      },\n    },\n    defaultVariants: {\n      size: 'xs',\n    },\n  }\n);\n\nfunction InputGroupButton({\n  className,\n  type = 'button',\n  variant = 'ghost',\n  size = 'xs',\n  ...props\n}: Omit<React.ComponentProps<typeof Button>, 'size' | 'type'> &\n  VariantProps<typeof inputGroupButtonVariants> & {\n    type?: 'button' | 'submit' | 'reset';\n  }) {\n  return (\n    <Button\n      className={cn(inputGroupButtonVariants({ size }), className)}\n      data-size={size}\n      type={type}\n      variant={variant}\n      {...props}\n    />\n  );\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<'span'>) {\n  return (\n    <span\n      className={cn(\n        \"flex items-center gap-2 text-muted-foreground text-sm [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none\",\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction InputGroupInput({\n  className,\n  ...props\n}: React.ComponentProps<'input'>) {\n  return (\n    <Input\n      className={cn(\n        'flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent',\n        className\n      )}\n      data-slot=\"input-group-control\"\n      {...props}\n    />\n  );\n}\n\nfunction InputGroupTextarea({\n  className,\n  ...props\n}: React.ComponentProps<'textarea'>) {\n  return (\n    <Textarea\n      className={cn(\n        'flex-1 resize-none rounded-none border-0 bg-transparent py-2 shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent',\n        className\n      )}\n      data-slot=\"input-group-control\"\n      {...props}\n    />\n  );\n}\n\nexport {\n  InputGroup,\n  InputGroupAddon,\n  InputGroupButton,\n  InputGroupText,\n  InputGroupInput,\n  InputGroupTextarea,\n};\n"
    },
    {
      "path": "components/ui/input.tsx",
      "type": "registry:component",
      "target": "@components/uiblocks/dashboard-01/shared/components/ui/input.tsx",
      "content": "import { Input as InputPrimitive } from '@base-ui/react/input';\nimport type * as React from 'react';\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Input({ className, type, ...props }: React.ComponentProps<'input'>) {\n  return (\n    <InputPrimitive\n      className={cn(\n        'h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base outline-none transition-colors file:inline-flex file:h-6 file:border-0 file:bg-transparent file:font-medium file:text-foreground file:text-sm placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 dark:disabled:bg-input/80',\n        className\n      )}\n      data-slot=\"input\"\n      type={type}\n      {...props}\n    />\n  );\n}\n\nexport { Input };\n"
    },
    {
      "path": "components/ui/label.tsx",
      "type": "registry:component",
      "target": "@components/uiblocks/dashboard-01/shared/components/ui/label.tsx",
      "content": "'use client';\n\nimport type * as React from 'react';\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Label({ className, ...props }: React.ComponentProps<'label'>) {\n  return (\n    <label\n      className={cn(\n        'flex select-none items-center gap-2 font-medium text-sm leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-50 group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50',\n        className\n      )}\n      data-slot=\"label\"\n      {...props}\n    />\n  );\n}\n\nexport { Label };\n"
    },
    {
      "path": "components/ui/popover.tsx",
      "type": "registry:component",
      "target": "@components/uiblocks/dashboard-01/shared/components/ui/popover.tsx",
      "content": "'use client';\n\nimport { Popover as PopoverPrimitive } from '@base-ui/react/popover';\nimport type * as React from 'react';\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Popover({ ...props }: PopoverPrimitive.Root.Props) {\n  return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />;\n}\n\nfunction PopoverTrigger({ ...props }: PopoverPrimitive.Trigger.Props) {\n  return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />;\n}\n\nfunction PopoverContent({\n  className,\n  align = 'center',\n  alignOffset = 0,\n  side = 'bottom',\n  sideOffset = 4,\n  ...props\n}: PopoverPrimitive.Popup.Props &\n  Pick<\n    PopoverPrimitive.Positioner.Props,\n    'align' | 'alignOffset' | 'side' | 'sideOffset'\n  >) {\n  return (\n    <PopoverPrimitive.Portal>\n      <PopoverPrimitive.Positioner\n        align={align}\n        alignOffset={alignOffset}\n        className=\"isolate z-50\"\n        side={side}\n        sideOffset={sideOffset}\n      >\n        <PopoverPrimitive.Popup\n          className={cn(\n            'data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:fade-in-0 data-open:zoom-in-95 data-closed:fade-out-0 data-closed:zoom-out-95 z-50 flex w-72 origin-(--transform-origin) flex-col gap-2.5 rounded-lg bg-popover p-2.5 text-popover-foreground text-sm shadow-md outline-hidden ring-1 ring-foreground/10 duration-100 data-closed:animate-out data-open:animate-in',\n            className\n          )}\n          data-slot=\"popover-content\"\n          {...props}\n        />\n      </PopoverPrimitive.Positioner>\n    </PopoverPrimitive.Portal>\n  );\n}\n\nfunction PopoverHeader({ className, ...props }: React.ComponentProps<'div'>) {\n  return (\n    <div\n      className={cn('flex flex-col gap-0.5 text-sm', className)}\n      data-slot=\"popover-header\"\n      {...props}\n    />\n  );\n}\n\nfunction PopoverTitle({ className, ...props }: PopoverPrimitive.Title.Props) {\n  return (\n    <PopoverPrimitive.Title\n      className={cn('font-medium', className)}\n      data-slot=\"popover-title\"\n      {...props}\n    />\n  );\n}\n\nfunction PopoverDescription({\n  className,\n  ...props\n}: PopoverPrimitive.Description.Props) {\n  return (\n    <PopoverPrimitive.Description\n      className={cn('text-muted-foreground', className)}\n      data-slot=\"popover-description\"\n      {...props}\n    />\n  );\n}\n\nexport {\n  Popover,\n  PopoverContent,\n  PopoverDescription,\n  PopoverHeader,\n  PopoverTitle,\n  PopoverTrigger,\n};\n"
    },
    {
      "path": "components/ui/progress.tsx",
      "type": "registry:component",
      "target": "@components/uiblocks/dashboard-01/shared/components/ui/progress.tsx",
      "content": "'use client';\n\nimport { Progress as ProgressPrimitive } from '@base-ui/react/progress';\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Progress({\n  className,\n  children,\n  value,\n  ...props\n}: ProgressPrimitive.Root.Props) {\n  return (\n    <ProgressPrimitive.Root\n      className={cn('flex flex-wrap gap-3', className)}\n      data-slot=\"progress\"\n      value={value}\n      {...props}\n    >\n      {children}\n      <ProgressTrack>\n        <ProgressIndicator />\n      </ProgressTrack>\n    </ProgressPrimitive.Root>\n  );\n}\n\nfunction ProgressTrack({ className, ...props }: ProgressPrimitive.Track.Props) {\n  return (\n    <ProgressPrimitive.Track\n      className={cn(\n        'relative flex h-1 w-full items-center overflow-x-hidden rounded-full bg-muted',\n        className\n      )}\n      data-slot=\"progress-track\"\n      {...props}\n    />\n  );\n}\n\nfunction ProgressIndicator({\n  className,\n  ...props\n}: ProgressPrimitive.Indicator.Props) {\n  return (\n    <ProgressPrimitive.Indicator\n      className={cn('h-full bg-primary transition-all', className)}\n      data-slot=\"progress-indicator\"\n      {...props}\n    />\n  );\n}\n\nfunction ProgressLabel({ className, ...props }: ProgressPrimitive.Label.Props) {\n  return (\n    <ProgressPrimitive.Label\n      className={cn('font-medium text-sm', className)}\n      data-slot=\"progress-label\"\n      {...props}\n    />\n  );\n}\n\nfunction ProgressValue({ className, ...props }: ProgressPrimitive.Value.Props) {\n  return (\n    <ProgressPrimitive.Value\n      className={cn(\n        'ml-auto text-muted-foreground text-sm tabular-nums',\n        className\n      )}\n      data-slot=\"progress-value\"\n      {...props}\n    />\n  );\n}\n\nexport {\n  Progress,\n  ProgressTrack,\n  ProgressIndicator,\n  ProgressLabel,\n  ProgressValue,\n};\n"
    },
    {
      "path": "components/ui/separator.tsx",
      "type": "registry:component",
      "target": "@components/uiblocks/dashboard-01/shared/components/ui/separator.tsx",
      "content": "'use client';\n\nimport { Separator as SeparatorPrimitive } from '@base-ui/react/separator';\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Separator({\n  className,\n  orientation = 'horizontal',\n  ...props\n}: SeparatorPrimitive.Props) {\n  return (\n    <SeparatorPrimitive\n      className={cn(\n        'shrink-0 self-center bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px',\n        className\n      )}\n      data-slot=\"separator\"\n      orientation={orientation}\n      {...props}\n    />\n  );\n}\n\nexport { Separator };\n"
    },
    {
      "path": "components/ui/sheet.tsx",
      "type": "registry:component",
      "target": "@components/uiblocks/dashboard-01/shared/components/ui/sheet.tsx",
      "content": "'use client';\n\nimport { Dialog as SheetPrimitive } from '@base-ui/react/dialog';\nimport { XIcon } from 'lucide-react';\nimport type * as React from 'react';\nimport { Button } from \"./button\";\nimport { cn } from \"../../lib/utils\";\n\nfunction Sheet({ ...props }: SheetPrimitive.Root.Props) {\n  return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />;\n}\n\nfunction SheetTrigger({ ...props }: SheetPrimitive.Trigger.Props) {\n  return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />;\n}\n\nfunction SheetClose({ ...props }: SheetPrimitive.Close.Props) {\n  return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />;\n}\n\nfunction SheetPortal({ ...props }: SheetPrimitive.Portal.Props) {\n  return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />;\n}\n\nfunction SheetOverlay({ className, ...props }: SheetPrimitive.Backdrop.Props) {\n  return (\n    <SheetPrimitive.Backdrop\n      className={cn(\n        'fixed inset-0 z-50 bg-black/10 transition-opacity duration-150 data-ending-style:opacity-0 data-starting-style:opacity-0 supports-backdrop-filter:backdrop-blur-xs',\n        className\n      )}\n      data-slot=\"sheet-overlay\"\n      {...props}\n    />\n  );\n}\n\nfunction SheetContent({\n  className,\n  children,\n  side = 'right',\n  showCloseButton = true,\n  ...props\n}: SheetPrimitive.Popup.Props & {\n  side?: 'top' | 'right' | 'bottom' | 'left';\n  showCloseButton?: boolean;\n}) {\n  return (\n    <SheetPortal>\n      <SheetOverlay />\n      <SheetPrimitive.Popup\n        className={cn(\n          'fixed z-50 flex flex-col gap-4 bg-popover bg-clip-padding text-popover-foreground text-sm shadow-lg transition duration-200 ease-in-out data-[side=left]:data-ending-style:translate-x-[-2.5rem] data-[side=left]:data-starting-style:translate-x-[-2.5rem] data-[side=right]:data-ending-style:translate-x-[2.5rem] data-[side=right]:data-starting-style:translate-x-[2.5rem] data-[side=bottom]:data-ending-style:translate-y-[2.5rem] data-[side=bottom]:data-starting-style:translate-y-[2.5rem] data-[side=top]:data-ending-style:translate-y-[-2.5rem] data-[side=top]:data-starting-style:translate-y-[-2.5rem] data-[side=bottom]:inset-x-0 data-[side=top]:inset-x-0 data-[side=left]:inset-y-0 data-[side=right]:inset-y-0 data-[side=top]:top-0 data-[side=right]:right-0 data-[side=bottom]:bottom-0 data-[side=left]:left-0 data-[side=bottom]:h-auto data-[side=left]:h-full data-[side=right]:h-full data-[side=top]:h-auto data-[side=left]:w-3/4 data-[side=right]:w-3/4 data-[side=bottom]:border-t data-[side=left]:border-r data-[side=top]:border-b data-[side=right]:border-l data-ending-style:opacity-0 data-starting-style:opacity-0 data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm',\n          className\n        )}\n        data-side={side}\n        data-slot=\"sheet-content\"\n        {...props}\n      >\n        {children}\n        {showCloseButton && (\n          <SheetPrimitive.Close\n            data-slot=\"sheet-close\"\n            render={\n              <Button\n                className=\"absolute top-3 right-3\"\n                size=\"icon-sm\"\n                variant=\"ghost\"\n              />\n            }\n          >\n            <XIcon />\n            <span className=\"sr-only\">Close</span>\n          </SheetPrimitive.Close>\n        )}\n      </SheetPrimitive.Popup>\n    </SheetPortal>\n  );\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<'div'>) {\n  return (\n    <div\n      className={cn('flex flex-col gap-0.5 p-4', className)}\n      data-slot=\"sheet-header\"\n      {...props}\n    />\n  );\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<'div'>) {\n  return (\n    <div\n      className={cn('mt-auto flex flex-col gap-2 p-4', className)}\n      data-slot=\"sheet-footer\"\n      {...props}\n    />\n  );\n}\n\nfunction SheetTitle({ className, ...props }: SheetPrimitive.Title.Props) {\n  return (\n    <SheetPrimitive.Title\n      className={cn('font-medium text-base text-foreground', className)}\n      data-slot=\"sheet-title\"\n      {...props}\n    />\n  );\n}\n\nfunction SheetDescription({\n  className,\n  ...props\n}: SheetPrimitive.Description.Props) {\n  return (\n    <SheetPrimitive.Description\n      className={cn('text-muted-foreground text-sm', className)}\n      data-slot=\"sheet-description\"\n      {...props}\n    />\n  );\n}\n\nexport {\n  Sheet,\n  SheetTrigger,\n  SheetClose,\n  SheetContent,\n  SheetHeader,\n  SheetFooter,\n  SheetTitle,\n  SheetDescription,\n};\n"
    },
    {
      "path": "components/ui/sidebar.tsx",
      "type": "registry:component",
      "target": "@components/uiblocks/dashboard-01/shared/components/ui/sidebar.tsx",
      "content": "'use client';\n\nimport { mergeProps } from '@base-ui/react/merge-props';\nimport { useRender } from '@base-ui/react/use-render';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { PanelLeftIcon } from 'lucide-react';\nimport * as React from 'react';\nimport { Button } from \"./button\";\nimport { Input } from \"./input\";\nimport { Separator } from \"./separator\";\nimport {\n  Sheet,\n  SheetContent,\n  SheetDescription,\n  SheetHeader,\n  SheetTitle,\n} from \"./sheet\";\nimport { Skeleton } from \"./skeleton\";\nimport {\n  Tooltip,\n  TooltipContent,\n  TooltipTrigger,\n} from \"./tooltip\";\nimport { useIsMobile } from \"../../hooks/use-mobile\";\nimport { cn } from \"../../lib/utils\";\n\nconst SIDEBAR_COOKIE_NAME = 'sidebar_state';\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;\nconst SIDEBAR_WIDTH = '16rem';\nconst SIDEBAR_WIDTH_MOBILE = '18rem';\nconst SIDEBAR_WIDTH_ICON = '3rem';\nconst SIDEBAR_KEYBOARD_SHORTCUT = 'b';\n\ntype SidebarContextProps = {\n  state: 'expanded' | 'collapsed';\n  open: boolean;\n  setOpen: (open: boolean) => void;\n  openMobile: boolean;\n  setOpenMobile: (open: boolean) => void;\n  isMobile: boolean;\n  toggleSidebar: () => void;\n};\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null);\n\nfunction useSidebar() {\n  const context = React.useContext(SidebarContext);\n  if (!context) {\n    throw new Error('useSidebar must be used within a SidebarProvider.');\n  }\n\n  return context;\n}\n\nfunction SidebarProvider({\n  defaultOpen = true,\n  open: openProp,\n  onOpenChange: setOpenProp,\n  className,\n  style,\n  children,\n  ...props\n}: React.ComponentProps<'div'> & {\n  defaultOpen?: boolean;\n  open?: boolean;\n  onOpenChange?: (open: boolean) => void;\n}) {\n  const isMobile = useIsMobile();\n  const [openMobile, setOpenMobile] = React.useState(false);\n\n  // This is the internal state of the sidebar.\n  // We use openProp and setOpenProp for control from outside the component.\n  const [_open, _setOpen] = React.useState(defaultOpen);\n  const open = openProp ?? _open;\n  const setOpen = React.useCallback(\n    (value: boolean | ((value: boolean) => boolean)) => {\n      const openState = typeof value === 'function' ? value(open) : value;\n      if (setOpenProp) {\n        setOpenProp(openState);\n      } else {\n        _setOpen(openState);\n      }\n\n      // This sets the cookie to keep the sidebar state.\n      document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;\n    },\n    [setOpenProp, open]\n  );\n\n  // Helper to toggle the sidebar.\n  const toggleSidebar = React.useCallback(() => {\n    return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open);\n  }, [isMobile, setOpen]);\n\n  // Adds a keyboard shortcut to toggle the sidebar.\n  React.useEffect(() => {\n    const handleKeyDown = (event: KeyboardEvent) => {\n      if (\n        event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n        (event.metaKey || event.ctrlKey)\n      ) {\n        event.preventDefault();\n        toggleSidebar();\n      }\n    };\n\n    window.addEventListener('keydown', handleKeyDown);\n    return () => window.removeEventListener('keydown', handleKeyDown);\n  }, [toggleSidebar]);\n\n  // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n  // This makes it easier to style the sidebar with Tailwind classes.\n  const state = open ? 'expanded' : 'collapsed';\n\n  const contextValue = React.useMemo<SidebarContextProps>(\n    () => ({\n      state,\n      open,\n      setOpen,\n      isMobile,\n      openMobile,\n      setOpenMobile,\n      toggleSidebar,\n    }),\n    [state, open, setOpen, isMobile, openMobile, toggleSidebar]\n  );\n\n  return (\n    <SidebarContext.Provider value={contextValue}>\n      <div\n        className={cn(\n          'group/sidebar-wrapper flex min-h-svh w-full has-data-[variant=inset]:bg-sidebar',\n          className\n        )}\n        data-slot=\"sidebar-wrapper\"\n        style={\n          {\n            '--sidebar-width': SIDEBAR_WIDTH,\n            '--sidebar-width-icon': SIDEBAR_WIDTH_ICON,\n            ...style,\n          } as React.CSSProperties\n        }\n        {...props}\n      >\n        {children}\n      </div>\n    </SidebarContext.Provider>\n  );\n}\n\nfunction Sidebar({\n  side = 'left',\n  variant = 'sidebar',\n  collapsible = 'offcanvas',\n  className,\n  children,\n  dir,\n  ...props\n}: React.ComponentProps<'div'> & {\n  side?: 'left' | 'right';\n  variant?: 'sidebar' | 'floating' | 'inset';\n  collapsible?: 'offcanvas' | 'icon' | 'none';\n}) {\n  const { isMobile, state, openMobile, setOpenMobile } = useSidebar();\n\n  if (collapsible === 'none') {\n    return (\n      <div\n        className={cn(\n          'flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground',\n          className\n        )}\n        data-slot=\"sidebar\"\n        {...props}\n      >\n        {children}\n      </div>\n    );\n  }\n\n  if (isMobile) {\n    return (\n      <Sheet onOpenChange={setOpenMobile} open={openMobile} {...props}>\n        <SheetContent\n          className=\"w-(--sidebar-width) bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden\"\n          data-mobile=\"true\"\n          data-sidebar=\"sidebar\"\n          data-slot=\"sidebar\"\n          dir={dir}\n          side={side}\n          style={\n            {\n              '--sidebar-width': SIDEBAR_WIDTH_MOBILE,\n            } as React.CSSProperties\n          }\n        >\n          <SheetHeader className=\"sr-only\">\n            <SheetTitle>Sidebar</SheetTitle>\n            <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n          </SheetHeader>\n          <div className=\"flex h-full w-full flex-col\">{children}</div>\n        </SheetContent>\n      </Sheet>\n    );\n  }\n\n  return (\n    <div\n      className=\"group peer hidden text-sidebar-foreground md:block\"\n      data-collapsible={state === 'collapsed' ? collapsible : ''}\n      data-side={side}\n      data-slot=\"sidebar\"\n      data-state={state}\n      data-variant={variant}\n    >\n      {/* This is what handles the sidebar gap on desktop */}\n      <div\n        className={cn(\n          'relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear',\n          'group-data-[collapsible=offcanvas]:w-0',\n          'group-data-[side=right]:rotate-180',\n          variant === 'floating' || variant === 'inset'\n            ? 'group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]'\n            : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon)'\n        )}\n        data-slot=\"sidebar-gap\"\n      />\n      <div\n        className={cn(\n          'fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear data-[side=right]:right-0 data-[side=left]:left-0 data-[side=right]:group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)] data-[side=left]:group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)] md:flex',\n          // Adjust the padding for floating and inset variants.\n          variant === 'floating' || variant === 'inset'\n            ? 'p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]'\n            : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l',\n          className\n        )}\n        data-side={side}\n        data-slot=\"sidebar-container\"\n        {...props}\n      >\n        <div\n          className=\"flex size-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:shadow-sm group-data-[variant=floating]:ring-1 group-data-[variant=floating]:ring-sidebar-border\"\n          data-sidebar=\"sidebar\"\n          data-slot=\"sidebar-inner\"\n        >\n          {children}\n        </div>\n      </div>\n    </div>\n  );\n}\n\nfunction SidebarTrigger({\n  className,\n  onClick,\n  ...props\n}: React.ComponentProps<typeof Button>) {\n  const { toggleSidebar } = useSidebar();\n\n  return (\n    <Button\n      className={cn(className)}\n      data-sidebar=\"trigger\"\n      data-slot=\"sidebar-trigger\"\n      onClick={(event) => {\n        onClick?.(event);\n        toggleSidebar();\n      }}\n      size=\"icon-sm\"\n      variant=\"ghost\"\n      {...props}\n    >\n      <PanelLeftIcon />\n      <span className=\"sr-only\">Toggle Sidebar</span>\n    </Button>\n  );\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<'button'>) {\n  const { toggleSidebar } = useSidebar();\n\n  return (\n    <button\n      aria-label=\"Toggle Sidebar\"\n      className={cn(\n        'group-data-[side=left]:-right-4 ltr:-translate-x-1/2 rtl:-translate-x-1/2 absolute inset-y-0 z-20 hidden w-4 transition-all ease-linear after:absolute after:inset-y-0 after:start-1/2 after:w-[2px] hover:after:bg-sidebar-border group-data-[side=right]:left-0 sm:flex',\n        'in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize',\n        '[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize',\n        'group-data-[collapsible=offcanvas]:translate-x-0 hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:after:left-full',\n        '[[data-side=left][data-collapsible=offcanvas]_&]:-right-2',\n        '[[data-side=right][data-collapsible=offcanvas]_&]:-left-2',\n        className\n      )}\n      data-sidebar=\"rail\"\n      data-slot=\"sidebar-rail\"\n      onClick={toggleSidebar}\n      tabIndex={-1}\n      title=\"Toggle Sidebar\"\n      {...props}\n    />\n  );\n}\n\nfunction SidebarInset({ className, ...props }: React.ComponentProps<'main'>) {\n  return (\n    <main\n      className={cn(\n        'relative flex w-full flex-1 flex-col bg-background md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2 md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm',\n        className\n      )}\n      data-slot=\"sidebar-inset\"\n      {...props}\n    />\n  );\n}\n\nfunction SidebarInput({\n  className,\n  ...props\n}: React.ComponentProps<typeof Input>) {\n  return (\n    <Input\n      className={cn('h-8 w-full bg-background shadow-none', className)}\n      data-sidebar=\"input\"\n      data-slot=\"sidebar-input\"\n      {...props}\n    />\n  );\n}\n\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<'div'>) {\n  return (\n    <div\n      className={cn('flex flex-col gap-2 p-2', className)}\n      data-sidebar=\"header\"\n      data-slot=\"sidebar-header\"\n      {...props}\n    />\n  );\n}\n\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<'div'>) {\n  return (\n    <div\n      className={cn('flex flex-col gap-2 p-2', className)}\n      data-sidebar=\"footer\"\n      data-slot=\"sidebar-footer\"\n      {...props}\n    />\n  );\n}\n\nfunction SidebarSeparator({\n  className,\n  ...props\n}: React.ComponentProps<typeof Separator>) {\n  return (\n    <Separator\n      className={cn('mx-2 w-auto bg-sidebar-border', className)}\n      data-sidebar=\"separator\"\n      data-slot=\"sidebar-separator\"\n      {...props}\n    />\n  );\n}\n\nfunction SidebarContent({ className, ...props }: React.ComponentProps<'div'>) {\n  return (\n    <div\n      className={cn(\n        'no-scrollbar flex min-h-0 flex-1 flex-col gap-0 overflow-auto group-data-[collapsible=icon]:overflow-hidden',\n        className\n      )}\n      data-sidebar=\"content\"\n      data-slot=\"sidebar-content\"\n      {...props}\n    />\n  );\n}\n\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<'div'>) {\n  return (\n    <div\n      className={cn('relative flex w-full min-w-0 flex-col p-2', className)}\n      data-sidebar=\"group\"\n      data-slot=\"sidebar-group\"\n      {...props}\n    />\n  );\n}\n\nfunction SidebarGroupLabel({\n  className,\n  render,\n  ...props\n}: useRender.ComponentProps<'div'> & React.ComponentProps<'div'>) {\n  return useRender({\n    defaultTagName: 'div',\n    props: mergeProps<'div'>(\n      {\n        className: cn(\n          'group-data-[collapsible=icon]:-mt-8 flex h-8 shrink-0 items-center rounded-md px-2 font-medium text-sidebar-foreground/70 text-xs outline-hidden ring-sidebar-ring transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 group-data-[collapsible=icon]:opacity-0 [&>svg]:size-4 [&>svg]:shrink-0',\n          className\n        ),\n      },\n      props\n    ),\n    render,\n    state: {\n      slot: 'sidebar-group-label',\n      sidebar: 'group-label',\n    },\n  });\n}\n\nfunction SidebarGroupAction({\n  className,\n  render,\n  ...props\n}: useRender.ComponentProps<'button'> & React.ComponentProps<'button'>) {\n  return useRender({\n    defaultTagName: 'button',\n    props: mergeProps<'button'>(\n      {\n        className: cn(\n          'after:-inset-2 absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-hidden ring-sidebar-ring transition-transform after:absolute hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 group-data-[collapsible=icon]:hidden md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0',\n          className\n        ),\n      },\n      props\n    ),\n    render,\n    state: {\n      slot: 'sidebar-group-action',\n      sidebar: 'group-action',\n    },\n  });\n}\n\nfunction SidebarGroupContent({\n  className,\n  ...props\n}: React.ComponentProps<'div'>) {\n  return (\n    <div\n      className={cn('w-full text-sm', className)}\n      data-sidebar=\"group-content\"\n      data-slot=\"sidebar-group-content\"\n      {...props}\n    />\n  );\n}\n\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<'ul'>) {\n  return (\n    <ul\n      className={cn('flex w-full min-w-0 flex-col gap-0', className)}\n      data-sidebar=\"menu\"\n      data-slot=\"sidebar-menu\"\n      {...props}\n    />\n  );\n}\n\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<'li'>) {\n  return (\n    <li\n      className={cn('group/menu-item relative', className)}\n      data-sidebar=\"menu-item\"\n      data-slot=\"sidebar-menu-item\"\n      {...props}\n    />\n  );\n}\n\nconst sidebarMenuButtonVariants = cva(\n  'peer/menu-button group/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-hidden ring-sidebar-ring 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 disabled:pointer-events-none disabled:opacity-50 group-has-data-[sidebar=menu-action]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-active:bg-sidebar-accent data-active:font-medium data-active:text-sidebar-accent-foreground data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! [&>span:last-child]:truncate [&_svg]:size-4 [&_svg]:shrink-0',\n  {\n    variants: {\n      variant: {\n        default: 'hover:bg-sidebar-accent hover:text-sidebar-accent-foreground',\n        outline:\n          'bg-background shadow-[0_0_0_1px_var(--sidebar-border)] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_var(--sidebar-accent)]',\n      },\n      size: {\n        default: 'h-8 text-sm',\n        sm: 'h-7 text-xs',\n        lg: 'h-12 text-sm group-data-[collapsible=icon]:p-0!',\n      },\n    },\n    defaultVariants: {\n      variant: 'default',\n      size: 'default',\n    },\n  }\n);\n\nfunction SidebarMenuButton({\n  render,\n  isActive = false,\n  variant = 'default',\n  size = 'default',\n  tooltip,\n  className,\n  ...props\n}: useRender.ComponentProps<'button'> &\n  React.ComponentProps<'button'> & {\n    isActive?: boolean;\n    tooltip?: string | React.ComponentProps<typeof TooltipContent>;\n  } & VariantProps<typeof sidebarMenuButtonVariants>) {\n  const { isMobile, state } = useSidebar();\n  const comp = useRender({\n    defaultTagName: 'button',\n    props: mergeProps<'button'>(\n      {\n        className: cn(sidebarMenuButtonVariants({ variant, size }), className),\n      },\n      props\n    ),\n    render: tooltip ? <TooltipTrigger render={render} /> : render,\n    state: {\n      slot: 'sidebar-menu-button',\n      sidebar: 'menu-button',\n      size,\n      active: isActive,\n    },\n  });\n\n  if (!tooltip) {\n    return comp;\n  }\n\n  if (typeof tooltip === 'string') {\n    tooltip = {\n      children: tooltip,\n    };\n  }\n\n  return (\n    <Tooltip>\n      {comp}\n      <TooltipContent\n        align=\"center\"\n        hidden={state !== 'collapsed' || isMobile}\n        side=\"right\"\n        {...tooltip}\n      />\n    </Tooltip>\n  );\n}\n\nfunction SidebarMenuAction({\n  className,\n  render,\n  showOnHover = false,\n  ...props\n}: useRender.ComponentProps<'button'> &\n  React.ComponentProps<'button'> & {\n    showOnHover?: boolean;\n  }) {\n  return useRender({\n    defaultTagName: 'button',\n    props: mergeProps<'button'>(\n      {\n        className: cn(\n          'after:-inset-2 absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-hidden ring-sidebar-ring transition-transform after:absolute hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 peer-hover/menu-button:text-sidebar-accent-foreground group-data-[collapsible=icon]:hidden peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0',\n          showOnHover &&\n            'group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 aria-expanded:opacity-100 peer-data-active/menu-button:text-sidebar-accent-foreground md:opacity-0',\n          className\n        ),\n      },\n      props\n    ),\n    render,\n    state: {\n      slot: 'sidebar-menu-action',\n      sidebar: 'menu-action',\n    },\n  });\n}\n\nfunction SidebarMenuBadge({\n  className,\n  ...props\n}: React.ComponentProps<'div'>) {\n  return (\n    <div\n      className={cn(\n        'pointer-events-none absolute right-1 flex h-5 min-w-5 select-none items-center justify-center rounded-md px-1 font-medium text-sidebar-foreground text-xs tabular-nums peer-hover/menu-button:text-sidebar-accent-foreground group-data-[collapsible=icon]:hidden peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 peer-data-active/menu-button:text-sidebar-accent-foreground',\n        className\n      )}\n      data-sidebar=\"menu-badge\"\n      data-slot=\"sidebar-menu-badge\"\n      {...props}\n    />\n  );\n}\n\nfunction SidebarMenuSkeleton({\n  className,\n  showIcon = false,\n  ...props\n}: React.ComponentProps<'div'> & {\n  showIcon?: boolean;\n}) {\n  // Random width between 50 to 90%.\n  const [width] = React.useState(() => {\n    return `${Math.floor(Math.random() * 40) + 50}%`;\n  });\n\n  return (\n    <div\n      className={cn('flex h-8 items-center gap-2 rounded-md px-2', className)}\n      data-sidebar=\"menu-skeleton\"\n      data-slot=\"sidebar-menu-skeleton\"\n      {...props}\n    >\n      {showIcon && (\n        <Skeleton\n          className=\"size-4 rounded-md\"\n          data-sidebar=\"menu-skeleton-icon\"\n        />\n      )}\n      <Skeleton\n        className=\"h-4 max-w-(--skeleton-width) flex-1\"\n        data-sidebar=\"menu-skeleton-text\"\n        style={\n          {\n            '--skeleton-width': width,\n          } as React.CSSProperties\n        }\n      />\n    </div>\n  );\n}\n\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<'ul'>) {\n  return (\n    <ul\n      className={cn(\n        'mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-sidebar-border border-l px-2.5 py-0.5 group-data-[collapsible=icon]:hidden',\n        className\n      )}\n      data-sidebar=\"menu-sub\"\n      data-slot=\"sidebar-menu-sub\"\n      {...props}\n    />\n  );\n}\n\nfunction SidebarMenuSubItem({\n  className,\n  ...props\n}: React.ComponentProps<'li'>) {\n  return (\n    <li\n      className={cn('group/menu-sub-item relative', className)}\n      data-sidebar=\"menu-sub-item\"\n      data-slot=\"sidebar-menu-sub-item\"\n      {...props}\n    />\n  );\n}\n\nfunction SidebarMenuSubButton({\n  render,\n  size = 'md',\n  isActive = false,\n  className,\n  ...props\n}: useRender.ComponentProps<'a'> &\n  React.ComponentProps<'a'> & {\n    size?: 'sm' | 'md';\n    isActive?: boolean;\n  }) {\n  return useRender({\n    defaultTagName: 'a',\n    props: mergeProps<'a'>(\n      {\n        className: cn(\n          '-translate-x-px flex h-7 min-w-0 items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground outline-hidden ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-active:bg-sidebar-accent data-[size=md]:text-sm data-[size=sm]:text-xs data-active:text-sidebar-accent-foreground group-data-[collapsible=icon]:hidden [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground',\n          className\n        ),\n      },\n      props\n    ),\n    render,\n    state: {\n      slot: 'sidebar-menu-sub-button',\n      sidebar: 'menu-sub-button',\n      size,\n      active: isActive,\n    },\n  });\n}\n\nexport {\n  Sidebar,\n  SidebarContent,\n  SidebarFooter,\n  SidebarGroup,\n  SidebarGroupAction,\n  SidebarGroupContent,\n  SidebarGroupLabel,\n  SidebarHeader,\n  SidebarInput,\n  SidebarInset,\n  SidebarMenu,\n  SidebarMenuAction,\n  SidebarMenuBadge,\n  SidebarMenuButton,\n  SidebarMenuItem,\n  SidebarMenuSkeleton,\n  SidebarMenuSub,\n  SidebarMenuSubButton,\n  SidebarMenuSubItem,\n  SidebarProvider,\n  SidebarRail,\n  SidebarSeparator,\n  SidebarTrigger,\n  useSidebar,\n};\n"
    },
    {
      "path": "components/ui/skeleton.tsx",
      "type": "registry:component",
      "target": "@components/uiblocks/dashboard-01/shared/components/ui/skeleton.tsx",
      "content": "import { cn } from \"../../lib/utils\";\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<'div'>) {\n  return (\n    <div\n      className={cn('animate-pulse rounded-md bg-muted', className)}\n      data-slot=\"skeleton\"\n      {...props}\n    />\n  );\n}\n\nexport { Skeleton };\n"
    },
    {
      "path": "components/ui/table.tsx",
      "type": "registry:component",
      "target": "@components/uiblocks/dashboard-01/shared/components/ui/table.tsx",
      "content": "'use client';\n\nimport type * as React from 'react';\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Table({ className, ...props }: React.ComponentProps<'table'>) {\n  return (\n    <div\n      className=\"relative w-full overflow-x-auto\"\n      data-slot=\"table-container\"\n    >\n      <table\n        className={cn('w-full caption-bottom text-sm', className)}\n        data-slot=\"table\"\n        {...props}\n      />\n    </div>\n  );\n}\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<'thead'>) {\n  return (\n    <thead\n      className={cn('[&_tr]:border-b', className)}\n      data-slot=\"table-header\"\n      {...props}\n    />\n  );\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<'tbody'>) {\n  return (\n    <tbody\n      className={cn('[&_tr:last-child]:border-0', className)}\n      data-slot=\"table-body\"\n      {...props}\n    />\n  );\n}\n\nfunction TableFooter({ className, ...props }: React.ComponentProps<'tfoot'>) {\n  return (\n    <tfoot\n      className={cn(\n        'border-t bg-muted/50 font-medium [&>tr]:last:border-b-0',\n        className\n      )}\n      data-slot=\"table-footer\"\n      {...props}\n    />\n  );\n}\n\nfunction TableRow({ className, ...props }: React.ComponentProps<'tr'>) {\n  return (\n    <tr\n      className={cn(\n        'border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted',\n        className\n      )}\n      data-slot=\"table-row\"\n      {...props}\n    />\n  );\n}\n\nfunction TableHead({ className, ...props }: React.ComponentProps<'th'>) {\n  return (\n    <th\n      className={cn(\n        'h-10 whitespace-nowrap px-2 text-left align-middle font-medium text-foreground [&:has([role=checkbox])]:pr-0',\n        className\n      )}\n      data-slot=\"table-head\"\n      {...props}\n    />\n  );\n}\n\nfunction TableCell({ className, ...props }: React.ComponentProps<'td'>) {\n  return (\n    <td\n      className={cn(\n        'whitespace-nowrap p-2 align-middle [&:has([role=checkbox])]:pr-0',\n        className\n      )}\n      data-slot=\"table-cell\"\n      {...props}\n    />\n  );\n}\n\nfunction TableCaption({\n  className,\n  ...props\n}: React.ComponentProps<'caption'>) {\n  return (\n    <caption\n      className={cn('mt-4 text-muted-foreground text-sm', className)}\n      data-slot=\"table-caption\"\n      {...props}\n    />\n  );\n}\n\nexport {\n  Table,\n  TableHeader,\n  TableBody,\n  TableFooter,\n  TableHead,\n  TableRow,\n  TableCell,\n  TableCaption,\n};\n"
    },
    {
      "path": "components/ui/textarea.tsx",
      "type": "registry:component",
      "target": "@components/uiblocks/dashboard-01/shared/components/ui/textarea.tsx",
      "content": "import type * as React from 'react';\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Textarea({ className, ...props }: React.ComponentProps<'textarea'>) {\n  return (\n    <textarea\n      className={cn(\n        'field-sizing-content flex min-h-16 w-full rounded-lg border border-input bg-transparent px-2.5 py-2 text-base outline-none transition-colors placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 dark:disabled:bg-input/80',\n        className\n      )}\n      data-slot=\"textarea\"\n      {...props}\n    />\n  );\n}\n\nexport { Textarea };\n"
    },
    {
      "path": "components/ui/toggle-group.tsx",
      "type": "registry:component",
      "target": "@components/uiblocks/dashboard-01/shared/components/ui/toggle-group.tsx",
      "content": "'use client';\n\nimport { Toggle as TogglePrimitive } from '@base-ui/react/toggle';\nimport { ToggleGroup as ToggleGroupPrimitive } from '@base-ui/react/toggle-group';\nimport type { VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\nimport { toggleVariants } from \"./toggle\";\nimport { cn } from \"../../lib/utils\";\n\nconst ToggleGroupContext = React.createContext<\n  VariantProps<typeof toggleVariants> & {\n    spacing?: number;\n    orientation?: 'horizontal' | 'vertical';\n  }\n>({\n  size: 'default',\n  variant: 'default',\n  spacing: 2,\n  orientation: 'horizontal',\n});\n\nfunction ToggleGroup({\n  className,\n  variant,\n  size,\n  spacing = 2,\n  orientation = 'horizontal',\n  children,\n  ...props\n}: ToggleGroupPrimitive.Props &\n  VariantProps<typeof toggleVariants> & {\n    spacing?: number;\n    orientation?: 'horizontal' | 'vertical';\n  }) {\n  return (\n    <ToggleGroupPrimitive\n      className={cn(\n        'group/toggle-group flex w-fit flex-row items-center gap-[--spacing(var(--gap))] rounded-lg data-vertical:flex-col data-vertical:items-stretch data-[size=sm]:rounded-[min(var(--radius-md),10px)]',\n        className\n      )}\n      data-orientation={orientation}\n      data-size={size}\n      data-slot=\"toggle-group\"\n      data-spacing={spacing}\n      data-variant={variant}\n      style={{ '--gap': spacing } as React.CSSProperties}\n      {...props}\n    >\n      <ToggleGroupContext.Provider\n        value={{ variant, size, spacing, orientation }}\n      >\n        {children}\n      </ToggleGroupContext.Provider>\n    </ToggleGroupPrimitive>\n  );\n}\n\nfunction ToggleGroupItem({\n  className,\n  children,\n  variant = 'default',\n  size = 'default',\n  ...props\n}: TogglePrimitive.Props & VariantProps<typeof toggleVariants>) {\n  const context = React.useContext(ToggleGroupContext);\n\n  return (\n    <TogglePrimitive\n      className={cn(\n        'shrink-0 focus:z-10 focus-visible:z-10 group-data-[spacing=0]/toggle-group:rounded-none group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=outline]:border-t-0 group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=outline]:border-l-0 group-data-[spacing=0]/toggle-group:px-2 group-data-[spacing=0]/toggle-group:has-data-[icon=inline-end]:pr-1.5 group-data-[spacing=0]/toggle-group:has-data-[icon=inline-start]:pl-1.5 group-data-horizontal/toggle-group:data-[spacing=0]:last:rounded-r-lg group-data-vertical/toggle-group:data-[spacing=0]:last:rounded-b-lg group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-t group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-l group-data-vertical/toggle-group:data-[spacing=0]:first:rounded-t-lg group-data-horizontal/toggle-group:data-[spacing=0]:first:rounded-l-lg',\n        toggleVariants({\n          variant: context.variant || variant,\n          size: context.size || size,\n        }),\n        className\n      )}\n      data-size={context.size || size}\n      data-slot=\"toggle-group-item\"\n      data-spacing={context.spacing}\n      data-variant={context.variant || variant}\n      {...props}\n    >\n      {children}\n    </TogglePrimitive>\n  );\n}\n\nexport { ToggleGroup, ToggleGroupItem };\n"
    },
    {
      "path": "components/ui/toggle.tsx",
      "type": "registry:component",
      "target": "@components/uiblocks/dashboard-01/shared/components/ui/toggle.tsx",
      "content": "'use client';\n\nimport { Toggle as TogglePrimitive } from '@base-ui/react/toggle';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from \"../../lib/utils\";\n\nconst toggleVariants = cva(\n  \"group/toggle inline-flex items-center justify-center gap-1 whitespace-nowrap rounded-lg font-medium text-sm outline-none transition-all hover:bg-muted hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-pressed:bg-muted aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[state=on]:bg-muted dark:aria-invalid:ring-destructive/40 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n  {\n    variants: {\n      variant: {\n        default: 'bg-transparent',\n        outline: 'border border-input bg-transparent hover:bg-muted',\n      },\n      size: {\n        default:\n          'h-8 min-w-8 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2',\n        sm: \"h-7 min-w-7 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5\",\n        lg: 'h-9 min-w-9 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2',\n      },\n    },\n    defaultVariants: {\n      variant: 'default',\n      size: 'default',\n    },\n  }\n);\n\nfunction Toggle({\n  className,\n  variant = 'default',\n  size = 'default',\n  ...props\n}: TogglePrimitive.Props & VariantProps<typeof toggleVariants>) {\n  return (\n    <TogglePrimitive\n      className={cn(toggleVariants({ variant, size, className }))}\n      data-slot=\"toggle\"\n      {...props}\n    />\n  );\n}\n\nexport { Toggle, toggleVariants };\n"
    },
    {
      "path": "components/ui/tooltip.tsx",
      "type": "registry:component",
      "target": "@components/uiblocks/dashboard-01/shared/components/ui/tooltip.tsx",
      "content": "'use client';\n\nimport { Tooltip as TooltipPrimitive } from '@base-ui/react/tooltip';\n\nimport { cn } from \"../../lib/utils\";\n\nfunction TooltipProvider({\n  delay = 0,\n  ...props\n}: TooltipPrimitive.Provider.Props) {\n  return (\n    <TooltipPrimitive.Provider\n      data-slot=\"tooltip-provider\"\n      delay={delay}\n      {...props}\n    />\n  );\n}\n\nfunction Tooltip({ ...props }: TooltipPrimitive.Root.Props) {\n  return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />;\n}\n\nfunction TooltipTrigger({ ...props }: TooltipPrimitive.Trigger.Props) {\n  return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />;\n}\n\nfunction TooltipContent({\n  className,\n  side = 'top',\n  sideOffset = 4,\n  align = 'center',\n  alignOffset = 0,\n  children,\n  ...props\n}: TooltipPrimitive.Popup.Props &\n  Pick<\n    TooltipPrimitive.Positioner.Props,\n    'align' | 'alignOffset' | 'side' | 'sideOffset'\n  >) {\n  return (\n    <TooltipPrimitive.Portal>\n      <TooltipPrimitive.Positioner\n        align={align}\n        alignOffset={alignOffset}\n        className=\"isolate z-50\"\n        side={side}\n        sideOffset={sideOffset}\n      >\n        <TooltipPrimitive.Popup\n          className={cn(\n            'data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:fade-in-0 data-open:zoom-in-95 data-closed:fade-out-0 data-closed:zoom-out-95 z-50 inline-flex w-fit max-w-xs origin-(--transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-background text-xs has-data-[slot=kbd]:pr-1.5 data-[state=delayed-open]:animate-in data-closed:animate-out data-open:animate-in **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm',\n            className\n          )}\n          data-slot=\"tooltip-content\"\n          {...props}\n        >\n          {children}\n          <TooltipPrimitive.Arrow className=\"data-[side=inline-end]:-left-1 data-[side=inline-end]:-translate-y-1/2 data-[side=inline-start]:-right-1 data-[side=inline-start]:-translate-y-1/2 data-[side=left]:-right-1 data-[side=left]:-translate-y-1/2 data-[side=right]:-left-1 data-[side=right]:-translate-y-1/2 data-[side=top]:-bottom-2.5 z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground data-[side=bottom]:top-1 data-[side=inline-end]:top-1/2! data-[side=inline-start]:top-1/2! data-[side=left]:top-1/2! data-[side=right]:top-1/2!\" />\n        </TooltipPrimitive.Popup>\n      </TooltipPrimitive.Positioner>\n    </TooltipPrimitive.Portal>\n  );\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n"
    },
    {
      "path": "hooks/use-mobile.ts",
      "type": "registry:component",
      "target": "@components/uiblocks/dashboard-01/shared/hooks/use-mobile.ts",
      "content": "import * as React from 'react';\n\nconst MOBILE_BREAKPOINT = 768;\n\nexport function useIsMobile() {\n  const [isMobile, setIsMobile] = React.useState<boolean | undefined>(\n    undefined\n  );\n\n  React.useEffect(() => {\n    const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);\n    const onChange = () => {\n      setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n    };\n    mql.addEventListener('change', onChange);\n    setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n    return () => mql.removeEventListener('change', onChange);\n  }, []);\n\n  return !!isMobile;\n}\n"
    },
    {
      "path": "lib/utils.ts",
      "type": "registry:component",
      "target": "@components/uiblocks/dashboard-01/shared/lib/utils.ts",
      "content": "export { cn } from \"cn\";\n"
    }
  ],
  "categories": [
    "dashboard",
    "application",
    "clean-saas"
  ],
  "docs": "Import the default component from @components/uiblocks/dashboard-01/app/page.tsx. React 19, Tailwind CSS 4, and the standard shadcn CSS theme variables are required. This block is framework-independent React and works in TanStack Start, Vite, and Next.js projects. Connect links or navigation callbacks to your host application. Demo avatars use public image URLs; replace them with your own assets. Demo handlers must be connected to your product. See https://uiblocks.org/dashboard/dashboard-01 for content guidelines and source attribution.",
  "meta": {
    "kind": "block",
    "version": "0.1.0",
    "source": {
      "name": "Blocks.so",
      "url": "https://github.com/ephraimduncan/blocks",
      "license": "MIT",
      "author": "Ephraim Duncan",
      "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
    },
    "license": "MIT",
    "style": "clean-saas",
    "pageType": "application",
    "featured": false,
    "tags": [
      "dashboard",
      "analytics",
      "customers",
      "revenue",
      "后台",
      "仪表盘",
      "分析",
      "客户"
    ],
    "contentGuidelines": [
      "Keep one primary dashboard question and a consistent reporting period.",
      "Replace demo data and verify charts with sparse and long datasets."
    ],
    "recommendedWith": [],
    "entry": "@components/uiblocks/dashboard-01/app/page.tsx",
    "exportName": "default",
    "frameworkIndependent": true,
    "frameworkDependencies": [],
    "compatibleHosts": [
      "react",
      "vite",
      "tanstack-start",
      "nextjs"
    ],
    "requirements": {
      "react": ">=19",
      "tailwind": ">=4"
    },
    "previewUrl": "https://uiblocks.org/preview/dashboard-01"
  }
}
