{
  "$schema": "https://ui.shadcn.com/schema/registry.json",
  "name": "kit-web",
  "homepage": "https://github.com/itsHendri/protokit",
  "items": [
    {
      "name": "theme",
      "type": "registry:theme",
      "title": "Kit theme",
      "description": "The kit tokens as Tailwind 4 CSS variables (oklch, light + dark) and the radius scale. Generated from tokens/tokens.json.",
      "cssVars": {
        "theme": {
          "radius-sm": "calc(var(--radius) * 0.6)",
          "radius-md": "calc(var(--radius) * 0.8)",
          "radius-lg": "var(--radius)",
          "radius-xl": "calc(var(--radius) * 1.6)",
          "radius-2xl": "calc(var(--radius) * 2)"
        },
        "light": {
          "radius": "0.625rem",
          "background": "oklch(1 0 0)",
          "foreground": "oklch(0.1408 0.0044 285.82)",
          "card": "oklch(1 0 0)",
          "card-foreground": "oklch(0.1408 0.0044 285.82)",
          "popover": "oklch(1 0 0)",
          "popover-foreground": "oklch(0.1408 0.0044 285.82)",
          "primary": "oklch(0.5461 0.2152 262.88)",
          "primary-foreground": "oklch(1 0 0)",
          "secondary": "oklch(0.9674 0.0013 286.38)",
          "secondary-foreground": "oklch(0.2103 0.0059 285.89)",
          "muted": "oklch(0.9674 0.0013 286.38)",
          "muted-foreground": "oklch(0.4419 0.0146 285.79)",
          "accent": "oklch(0.9674 0.0013 286.38)",
          "accent-foreground": "oklch(0.2103 0.0059 285.89)",
          "destructive": "oklch(0.569 0.215 27.38)",
          "destructive-foreground": "oklch(1 0 0)",
          "success": "oklch(0.5273 0.1371 150.07)",
          "success-foreground": "oklch(1 0 0)",
          "warning": "oklch(0.5553 0.1455 49)",
          "warning-foreground": "oklch(1 0 0)",
          "info": "oklch(0.5 0.1193 242.75)",
          "info-foreground": "oklch(1 0 0)",
          "border": "oklch(0.9197 0.004 286.32)",
          "input": "oklch(0.9197 0.004 286.32)",
          "ring": "oklch(0.5461 0.2152 262.88)",
          "sidebar": "oklch(0.9851 0 0)",
          "sidebar-foreground": "oklch(0.1408 0.0044 285.82)",
          "sidebar-primary": "oklch(0.5461 0.2152 262.88)",
          "sidebar-primary-foreground": "oklch(1 0 0)",
          "sidebar-accent": "oklch(0.9674 0.0013 286.38)",
          "sidebar-accent-foreground": "oklch(0.2103 0.0059 285.89)",
          "sidebar-border": "oklch(0.9197 0.004 286.32)",
          "sidebar-ring": "oklch(0.5461 0.2152 262.88)",
          "chart-1": "oklch(0.6231 0.188 259.81)",
          "chart-2": "oklch(0.7227 0.192 149.58)",
          "chart-3": "oklch(0.7686 0.1647 70.08)",
          "chart-4": "oklch(0.6368 0.2078 25.33)",
          "chart-5": "oklch(0.6847 0.1479 237.32)"
        },
        "dark": {
          "background": "oklch(0.1408 0.0044 285.82)",
          "foreground": "oklch(0.9851 0 0)",
          "card": "oklch(0.2103 0.0059 285.89)",
          "card-foreground": "oklch(0.9851 0 0)",
          "popover": "oklch(0.2103 0.0059 285.89)",
          "popover-foreground": "oklch(0.9851 0 0)",
          "primary": "oklch(0.6507 0.1869 259.77)",
          "primary-foreground": "oklch(0.1408 0.0044 285.82)",
          "secondary": "oklch(0.2739 0.0055 286.03)",
          "secondary-foreground": "oklch(0.9851 0 0)",
          "muted": "oklch(0.2739 0.0055 286.03)",
          "muted-foreground": "oklch(0.7118 0.0129 286.07)",
          "accent": "oklch(0.2739 0.0055 286.03)",
          "accent-foreground": "oklch(0.9851 0 0)",
          "destructive": "oklch(0.6696 0.2078 25.3)",
          "destructive-foreground": "oklch(0.1408 0.0044 285.82)",
          "success": "oklch(0.7227 0.192 149.58)",
          "success-foreground": "oklch(0.1408 0.0044 285.82)",
          "warning": "oklch(0.8369 0.1644 84.43)",
          "warning-foreground": "oklch(0.1408 0.0044 285.82)",
          "info": "oklch(0.6847 0.1479 237.32)",
          "info-foreground": "oklch(0.1408 0.0044 285.82)",
          "border": "oklch(0.2739 0.0055 286.03)",
          "input": "oklch(0.2739 0.0055 286.03)",
          "ring": "oklch(0.6507 0.1869 259.77)",
          "sidebar": "oklch(0.2103 0.0059 285.89)",
          "sidebar-foreground": "oklch(0.9851 0 0)",
          "sidebar-primary": "oklch(0.6507 0.1869 259.77)",
          "sidebar-primary-foreground": "oklch(0.1408 0.0044 285.82)",
          "sidebar-accent": "oklch(0.2739 0.0055 286.03)",
          "sidebar-accent-foreground": "oklch(0.9851 0 0)",
          "sidebar-border": "oklch(0.2739 0.0055 286.03)",
          "sidebar-ring": "oklch(0.6507 0.1869 259.77)",
          "chart-1": "oklch(0.7137 0.1434 254.62)",
          "chart-2": "oklch(0.8003 0.1821 151.71)",
          "chart-3": "oklch(0.8369 0.1644 84.43)",
          "chart-4": "oklch(0.7106 0.1661 22.22)",
          "chart-5": "oklch(0.7535 0.139 232.66)"
        }
      }
    },
    {
      "name": "lib-embed-boot",
      "type": "registry:lib",
      "title": "lib/embed-boot.ts",
      "dependencies": [],
      "registryDependencies": [
        "@kit/lib-embed-theme"
      ],
      "files": [
        {
          "path": "lib/embed-boot.ts",
          "type": "registry:lib",
          "target": "lib/embed-boot.ts"
        }
      ]
    },
    {
      "name": "lib-embed-theme",
      "type": "registry:lib",
      "title": "lib/embed-theme.ts",
      "dependencies": [],
      "registryDependencies": [
        "@kit/lib-theme"
      ],
      "files": [
        {
          "path": "lib/embed-theme.ts",
          "type": "registry:lib",
          "target": "lib/embed-theme.ts"
        }
      ]
    },
    {
      "name": "lib-embed",
      "type": "registry:lib",
      "title": "lib/embed.ts",
      "dependencies": [],
      "registryDependencies": [
        "@kit/lib-embed-boot"
      ],
      "files": [
        {
          "path": "lib/embed.ts",
          "type": "registry:lib",
          "target": "lib/embed.ts"
        }
      ]
    },
    {
      "name": "lib-theme",
      "type": "registry:lib",
      "title": "lib/theme.ts",
      "dependencies": [],
      "registryDependencies": [],
      "files": [
        {
          "path": "lib/theme.ts",
          "type": "registry:lib",
          "target": "lib/theme.ts"
        }
      ]
    },
    {
      "name": "hook-use-reduced-motion",
      "type": "registry:hook",
      "title": "hooks/use-reduced-motion.ts",
      "dependencies": [],
      "registryDependencies": [],
      "files": [
        {
          "path": "hooks/use-reduced-motion.ts",
          "type": "registry:hook",
          "target": "hooks/use-reduced-motion.ts"
        }
      ]
    },
    {
      "name": "button",
      "type": "registry:ui",
      "title": "Button",
      "description": "`variant` default/secondary/outline/ghost/link/destructive · `size` default/sm/lg/icon · `asChild` for links",
      "dependencies": [
        "class-variance-authority@^0.7.1",
        "cn@^0.4.0",
        "radix-ui@^1.7.0"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "components/ui/button.tsx",
          "type": "registry:ui",
          "target": "components/ui/button.tsx"
        }
      ],
      "categories": [
        "actions"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "Button",
          "buttonVariants"
        ],
        "api": "<Button variant? size? asChild?>Label</Button>"
      }
    },
    {
      "name": "floating-button",
      "type": "registry:component",
      "title": "Floating button",
      "description": "floats OVER the scroll (a Button flows with it) · Material calls it a FAB · `icon label? variant position` · one per page",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "components/kit/floating-button.tsx",
          "type": "registry:component",
          "target": "components/kit/floating-button.tsx"
        }
      ],
      "categories": [
        "actions"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "FloatingButton"
        ],
        "api": "<FloatingButton icon label? variant=\"primary|secondary\" position=\"inline|bottom-right|bottom-center\" aria-label? />"
      }
    },
    {
      "name": "icon-badge",
      "type": "registry:component",
      "title": "Icon badge",
      "description": "icon button with unread count/dot · always labelled",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "components/kit/icon-badge.tsx",
          "type": "registry:component",
          "target": "components/kit/icon-badge.tsx"
        }
      ],
      "categories": [
        "actions"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "IconBadge"
        ],
        "api": "<IconBadge icon count? dot? aria-label onClick? />"
      }
    },
    {
      "name": "action-grid",
      "type": "registry:component",
      "title": "Action grid",
      "description": "the row of shortcuts under a page hero · 3–4 `items`, one row only, last tile is \"More\"",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "components/kit/action-grid.tsx",
          "type": "registry:component",
          "target": "components/kit/action-grid.tsx"
        }
      ],
      "categories": [
        "actions"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "ActionGrid"
        ],
        "api": "<ActionGrid items={[{icon,label,onClick|href,badge?}]} />"
      }
    },
    {
      "name": "date-picker",
      "type": "registry:component",
      "title": "Date picker",
      "description": "one date in a form · field-styled button → Calendar in a Popover · `value onChange disabled?`",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0"
      ],
      "registryDependencies": [
        "@kit/button",
        "@kit/calendar",
        "popover"
      ],
      "files": [
        {
          "path": "components/kit/date-picker.tsx",
          "type": "registry:component",
          "target": "components/kit/date-picker.tsx"
        }
      ],
      "categories": [
        "inputs"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "DatePicker"
        ],
        "api": "<DatePicker id value onChange placeholder? disabled? />"
      }
    },
    {
      "name": "calendar",
      "type": "registry:ui",
      "title": "Calendar",
      "description": "a month grid (react-day-picker) · `mode` single/range/multiple · use DatePicker for a form field",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0",
        "react-day-picker@^10.0.2"
      ],
      "registryDependencies": [
        "@kit/button"
      ],
      "files": [
        {
          "path": "components/ui/calendar.tsx",
          "type": "registry:ui",
          "target": "components/ui/calendar.tsx"
        }
      ],
      "categories": [
        "inputs"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "Calendar",
          "CalendarDayButton"
        ],
        "api": "<Calendar mode=\"single\" selected onSelect disabled? />"
      }
    },
    {
      "name": "slider",
      "type": "registry:ui",
      "title": "Slider",
      "description": "a value on a range · two thumbs for a range",
      "dependencies": [
        "cn@^0.4.0",
        "radix-ui@^1.7.0"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "components/ui/slider.tsx",
          "type": "registry:ui",
          "target": "components/ui/slider.tsx"
        }
      ],
      "categories": [
        "inputs"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "Slider"
        ],
        "api": "<Slider value onValueChange min max step aria-label />"
      }
    },
    {
      "name": "filter-chip",
      "type": "registry:component",
      "title": "Filter chip",
      "description": "neutral-active chips in a scrolling row",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "components/kit/filter-chip.tsx",
          "type": "registry:component",
          "target": "components/kit/filter-chip.tsx"
        }
      ],
      "categories": [
        "inputs"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "FilterChip",
          "FilterChipRow"
        ],
        "api": "<FilterChipRow><FilterChip label selected onClick icon? /></FilterChipRow>"
      }
    },
    {
      "name": "segmented-control",
      "type": "registry:component",
      "title": "Segmented control",
      "description": "2–4 options, sliding thumb",
      "dependencies": [
        "cn@^0.4.0"
      ],
      "registryDependencies": [
        "@kit/hook-use-reduced-motion"
      ],
      "files": [
        {
          "path": "components/kit/segmented-control.tsx",
          "type": "registry:component",
          "target": "components/kit/segmented-control.tsx"
        }
      ],
      "categories": [
        "inputs"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "SegmentedControl"
        ],
        "api": "<SegmentedControl segments={[{value,label}]} value onChange aria-label />"
      }
    },
    {
      "name": "search-field",
      "type": "registry:component",
      "title": "Search field",
      "description": "Input + search icon + clear",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0"
      ],
      "registryDependencies": [
        "input"
      ],
      "files": [
        {
          "path": "components/kit/search-field.tsx",
          "type": "registry:component",
          "target": "components/kit/search-field.tsx"
        }
      ],
      "categories": [
        "inputs"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "SearchField"
        ],
        "api": "<SearchField value onChangeText placeholder />"
      }
    },
    {
      "name": "quantity-stepper",
      "type": "registry:component",
      "title": "Quantity stepper",
      "description": "− value + · `min max step`",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "components/kit/quantity-stepper.tsx",
          "type": "registry:component",
          "target": "components/kit/quantity-stepper.tsx"
        }
      ],
      "categories": [
        "inputs"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "QuantityStepper"
        ],
        "api": "<QuantityStepper value onChange min? max? step? aria-label />"
      }
    },
    {
      "name": "rating",
      "type": "registry:component",
      "title": "Rating",
      "description": "stars · display (half stars, `showValue`, `count`) or input with `onChange`",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "components/kit/rating.tsx",
          "type": "registry:component",
          "target": "components/kit/rating.tsx"
        }
      ],
      "categories": [
        "inputs"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "Rating"
        ],
        "api": "<Rating value onChange? showValue? count? size? aria-label? />"
      }
    },
    {
      "name": "amount-input",
      "type": "registry:component",
      "title": "Amount input",
      "description": "hero money field · MAX and currency switch",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "components/kit/amount-input.tsx",
          "type": "registry:component",
          "target": "components/kit/amount-input.tsx"
        }
      ],
      "categories": [
        "inputs"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "AmountInput"
        ],
        "api": "<AmountInput value onChangeText symbol helper? onMax? onToggleCurrency? error? />"
      }
    },
    {
      "name": "otp-input",
      "type": "registry:component",
      "title": "OTP input",
      "description": "N-digit code, paste-aware",
      "dependencies": [
        "cn@^0.4.0"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "components/kit/otp-input.tsx",
          "type": "registry:component",
          "target": "components/kit/otp-input.tsx"
        }
      ],
      "categories": [
        "inputs"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "OtpInput"
        ],
        "api": "<OtpInput length value onChange onComplete error? />"
      }
    },
    {
      "name": "password-input",
      "type": "registry:component",
      "title": "Password input",
      "description": "Input + show/hide",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0"
      ],
      "registryDependencies": [
        "input"
      ],
      "files": [
        {
          "path": "components/kit/password-input.tsx",
          "type": "registry:component",
          "target": "components/kit/password-input.tsx"
        }
      ],
      "categories": [
        "inputs"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "PasswordInput"
        ],
        "api": "<PasswordInput id value onChange />"
      }
    },
    {
      "name": "selectable-card",
      "type": "registry:component",
      "title": "Selectable card",
      "description": "card as a radio/checkbox choice",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "components/kit/selectable-card.tsx",
          "type": "registry:component",
          "target": "components/kit/selectable-card.tsx"
        }
      ],
      "categories": [
        "inputs"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "SelectableCard"
        ],
        "api": "<SelectableCard title description? icon? detail? selected onClick mode=\"radio|checkbox\" />"
      }
    },
    {
      "name": "range-selector",
      "type": "registry:component",
      "title": "Range selector",
      "description": "chart range (1D·1W·1M·1Y·ALL), the active one inverts",
      "dependencies": [
        "cn@^0.4.0"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "components/kit/range-selector.tsx",
          "type": "registry:component",
          "target": "components/kit/range-selector.tsx"
        }
      ],
      "categories": [
        "inputs"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "RangeSelector"
        ],
        "api": "<RangeSelector options value onChange aria-label />"
      }
    },
    {
      "name": "app-shell",
      "type": "registry:component",
      "title": "App shell",
      "description": "sidebar of 4–8 destinations on desktop, a sheet on mobile · active item follows the URL",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0"
      ],
      "registryDependencies": [
        "@kit/button",
        "sheet"
      ],
      "files": [
        {
          "path": "components/kit/app-shell.tsx",
          "type": "registry:component",
          "target": "components/kit/app-shell.tsx"
        }
      ],
      "categories": [
        "navigation"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "AppShell"
        ],
        "api": "<AppShell brand nav={[{href,label,icon}]} footer? topbar?>{page}</AppShell>"
      }
    },
    {
      "name": "stepper",
      "type": "registry:component",
      "title": "Stepper",
      "description": "`numbered` / `compact` flow progress",
      "dependencies": [
        "cn@^0.4.0"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "components/kit/stepper.tsx",
          "type": "registry:component",
          "target": "components/kit/stepper.tsx"
        }
      ],
      "categories": [
        "navigation"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "Stepper"
        ],
        "api": "<Stepper current total labels? variant=\"numbered|compact\" />"
      }
    },
    {
      "name": "section-header",
      "type": "registry:component",
      "title": "Section header",
      "description": "title + action, outside the card",
      "dependencies": [
        "cn@^0.4.0"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "components/kit/section-header.tsx",
          "type": "registry:component",
          "target": "components/kit/section-header.tsx"
        }
      ],
      "categories": [
        "navigation"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "SectionHeader"
        ],
        "api": "<SectionHeader title action? onAction? actionHref? level? />"
      }
    },
    {
      "name": "pager-dots",
      "type": "registry:component",
      "title": "Pager dots",
      "description": "page indicator · HorizontalPager renders them for you",
      "dependencies": [
        "cn@^0.4.0"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "components/kit/pager-dots.tsx",
          "type": "registry:component",
          "target": "components/kit/pager-dots.tsx"
        }
      ],
      "categories": [
        "navigation"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "PagerDots"
        ],
        "api": "<PagerDots count activeIndex />"
      }
    },
    {
      "name": "horizontal-pager",
      "type": "registry:component",
      "title": "Horizontal pager",
      "description": "CSS scroll-snap pager + dots · keyboard scrollable",
      "dependencies": [
        "cn@^0.4.0"
      ],
      "registryDependencies": [
        "@kit/pager-dots"
      ],
      "files": [
        {
          "path": "components/kit/horizontal-pager.tsx",
          "type": "registry:component",
          "target": "components/kit/horizontal-pager.tsx"
        }
      ],
      "categories": [
        "navigation"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "HorizontalPager"
        ],
        "api": "<HorizontalPager itemWidth? gap? showDots? onIndexChange?>{cards}</HorizontalPager>"
      }
    },
    {
      "name": "data-table",
      "type": "registry:component",
      "title": "Data table",
      "description": "sortable columns + built-in empty state · `columns rows rowKey caption?`",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0"
      ],
      "registryDependencies": [
        "@kit/empty-state",
        "table"
      ],
      "files": [
        {
          "path": "components/kit/data-table.tsx",
          "type": "registry:component",
          "target": "components/kit/data-table.tsx"
        }
      ],
      "categories": [
        "data"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "DataTable"
        ],
        "api": "<DataTable columns={[{key,header,cell?,sortValue?,align?}]} rows rowKey caption? />"
      }
    },
    {
      "name": "stat-tile",
      "type": "registry:component",
      "title": "Stat tile",
      "description": "one KPI with a signed change · `invert` when down is good",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0"
      ],
      "registryDependencies": [
        "card"
      ],
      "files": [
        {
          "path": "components/kit/stat-tile.tsx",
          "type": "registry:component",
          "target": "components/kit/stat-tile.tsx"
        }
      ],
      "categories": [
        "data"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "StatTile"
        ],
        "api": "<StatTile label value delta? deltaLabel? invert? />"
      }
    },
    {
      "name": "badge",
      "type": "registry:ui",
      "title": "Badge",
      "description": "a status or tag · a status is an outline Badge with a coloured dot (`bg-success` …), the word in foreground text",
      "dependencies": [
        "class-variance-authority@^0.7.1",
        "cn@^0.4.0",
        "radix-ui@^1.7.0"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "components/ui/badge.tsx",
          "type": "registry:ui",
          "target": "components/ui/badge.tsx"
        }
      ],
      "categories": [
        "data"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "Badge",
          "badgeVariants"
        ],
        "api": "<Badge variant?>Label</Badge>"
      }
    },
    {
      "name": "avatar-group",
      "type": "registry:component",
      "title": "Avatar group",
      "description": "overlapping avatars + \"+N\"",
      "dependencies": [
        "cn@^0.4.0"
      ],
      "registryDependencies": [
        "avatar"
      ],
      "files": [
        {
          "path": "components/kit/avatar-group.tsx",
          "type": "registry:component",
          "target": "components/kit/avatar-group.tsx"
        }
      ],
      "categories": [
        "data"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "AvatarGroup"
        ],
        "api": "<AvatarGroup items={[{id,initials,src?}]} max? size? />"
      }
    },
    {
      "name": "list-row",
      "type": "registry:component",
      "title": "List row",
      "description": "ONE row · the canonical row · `last` on the final row · `select={{mode,selected}}` makes it a radio/checkbox row",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "components/kit/list-row.tsx",
          "type": "registry:component",
          "target": "components/kit/list-row.tsx"
        }
      ],
      "categories": [
        "data"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "ListRow"
        ],
        "api": "<ListRow leading title subtitle? value? sublabel? trailing? chevron? onClick? href? last? />"
      }
    },
    {
      "name": "list-group",
      "type": "registry:component",
      "title": "List group",
      "description": "the CONTAINER around rows: title, dividers, footnote, card/plain surface · sets `last` for you",
      "dependencies": [
        "cn@^0.4.0"
      ],
      "registryDependencies": [
        "card"
      ],
      "files": [
        {
          "path": "components/kit/list-group.tsx",
          "type": "registry:component",
          "target": "components/kit/list-group.tsx"
        }
      ],
      "categories": [
        "data"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "ListGroup"
        ],
        "api": "<ListGroup title? footnote? variant=\"card|plain\">{rows}</ListGroup>"
      }
    },
    {
      "name": "icon-circle",
      "type": "registry:component",
      "title": "Icon circle",
      "description": "leading icon well, row scale (≤64px) · `shape` circle/square · `tone`",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "components/kit/icon-circle.tsx",
          "type": "registry:component",
          "target": "components/kit/icon-circle.tsx"
        }
      ],
      "categories": [
        "data"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "IconCircle"
        ],
        "api": "<IconCircle as size? shape=\"circle|square\" tone? />"
      }
    },
    {
      "name": "summary-card",
      "type": "registry:component",
      "title": "Summary card",
      "description": "label/value rows, optionally in a Card",
      "dependencies": [
        "cn@^0.4.0"
      ],
      "registryDependencies": [
        "card"
      ],
      "files": [
        {
          "path": "components/kit/key-value-list.tsx",
          "type": "registry:component",
          "target": "components/kit/key-value-list.tsx"
        }
      ],
      "categories": [
        "data"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "KeyValueList",
          "SummaryCard"
        ],
        "api": "<SummaryCard title? rows={[{label,value}]} /> · <KeyValueList rows />"
      }
    },
    {
      "name": "percent-change",
      "type": "registry:component",
      "title": "Percent change",
      "description": "signed % with trend icon",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "components/kit/percent-change.tsx",
          "type": "registry:component",
          "target": "components/kit/percent-change.tsx"
        }
      ],
      "categories": [
        "data"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "PercentChange"
        ],
        "api": "<PercentChange value decimals? showIcon? />"
      }
    },
    {
      "name": "progress-ring",
      "type": "registry:component",
      "title": "Progress ring",
      "description": "circular determinate progress",
      "dependencies": [
        "cn@^0.4.0"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "components/kit/progress-ring.tsx",
          "type": "registry:component",
          "target": "components/kit/progress-ring.tsx"
        }
      ],
      "categories": [
        "data"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "ProgressRing"
        ],
        "api": "<ProgressRing value size? tone? aria-label>{centre}</ProgressRing>"
      }
    },
    {
      "name": "status-dot",
      "type": "registry:component",
      "title": "Status dot",
      "description": "small semantic status indicator, beside its label",
      "dependencies": [
        "class-variance-authority@^0.7.1",
        "cn@^0.4.0"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "components/kit/status-dot.tsx",
          "type": "registry:component",
          "target": "components/kit/status-dot.tsx"
        }
      ],
      "categories": [
        "data"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "StatusDot"
        ],
        "api": "<StatusDot tone size />"
      }
    },
    {
      "name": "timeline",
      "type": "registry:component",
      "title": "Timeline",
      "description": "vertical status steps joined by a line · each `done` / `current` / `upcoming` with time and note",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "components/kit/timeline.tsx",
          "type": "registry:component",
          "target": "components/kit/timeline.tsx"
        }
      ],
      "categories": [
        "data"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "Timeline"
        ],
        "api": "<Timeline items={[{ title, time?, description?, state }]} tone? />"
      }
    },
    {
      "name": "value-header",
      "type": "registry:component",
      "title": "Value header",
      "description": "hero figure + caption · `maskable` adds the eye toggle",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "components/kit/value-header.tsx",
          "type": "registry:component",
          "target": "components/kit/value-header.tsx"
        }
      ],
      "categories": [
        "data"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "ValueHeader"
        ],
        "api": "<ValueHeader value label? caption? captionTone? maskable? align? />"
      }
    },
    {
      "name": "alert",
      "type": "registry:ui",
      "title": "Alert",
      "description": "inline and persistent · `variant` default/destructive",
      "dependencies": [
        "class-variance-authority@^0.7.1",
        "cn@^0.4.0"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "components/ui/alert.tsx",
          "type": "registry:ui",
          "target": "components/ui/alert.tsx"
        }
      ],
      "categories": [
        "feedback"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "Alert",
          "AlertTitle",
          "AlertDescription"
        ],
        "api": "<Alert variant?><Icon /><AlertTitle /><AlertDescription /></Alert>"
      }
    },
    {
      "name": "empty-state",
      "type": "registry:component",
      "title": "Empty state",
      "description": "nothing here yet, and the way out · `default` page / `compact` in a card",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "components/kit/empty-state.tsx",
          "type": "registry:component",
          "target": "components/kit/empty-state.tsx"
        }
      ],
      "categories": [
        "feedback"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "EmptyState"
        ],
        "api": "<EmptyState icon title description? action? variant? />"
      }
    },
    {
      "name": "spinner",
      "type": "registry:component",
      "title": "Spinner",
      "description": "themed loading indicator · announced as \"Loading\"",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "components/kit/spinner.tsx",
          "type": "registry:component",
          "target": "components/kit/spinner.tsx"
        }
      ],
      "categories": [
        "feedback"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "Spinner"
        ],
        "api": "<Spinner size=\"small|large\" tone=\"primary|primary-foreground|foreground|muted\" aria-label? />"
      }
    },
    {
      "name": "success-screen",
      "type": "registry:component",
      "title": "Success screen",
      "description": "the one success template",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0"
      ],
      "registryDependencies": [
        "@kit/spinner",
        "@kit/spot"
      ],
      "files": [
        {
          "path": "components/kit/success-screen.tsx",
          "type": "registry:component",
          "target": "components/kit/success-screen.tsx"
        }
      ],
      "categories": [
        "feedback"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "SuccessScreen"
        ],
        "api": "<SuccessScreen title body? amount? amountSubtitle? loading?>{extra}</SuccessScreen>"
      }
    },
    {
      "name": "page-header",
      "type": "registry:component",
      "title": "Page header",
      "description": "title, description and actions · one per page, first in the content",
      "dependencies": [
        "cn@^0.4.0"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "components/kit/page-header.tsx",
          "type": "registry:component",
          "target": "components/kit/page-header.tsx"
        }
      ],
      "categories": [
        "layout"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "PageHeader"
        ],
        "api": "<PageHeader eyebrow? title description? actions? />"
      }
    },
    {
      "name": "prose",
      "type": "registry:component",
      "title": "Prose",
      "description": "long-form text (articles, docs, rendered markdown) at the theme's typeset: measure, leading, flow",
      "dependencies": [
        "cn@^0.4.0"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "components/kit/prose.tsx",
          "type": "registry:component",
          "target": "components/kit/prose.tsx"
        }
      ],
      "categories": [
        "layout"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "Prose"
        ],
        "api": "<Prose as?=\"div|article|section\">{html}</Prose>"
      }
    },
    {
      "name": "sticky-bottom-bar",
      "type": "registry:component",
      "title": "Sticky bottom bar",
      "description": "action bar that sticks to the bottom of its scroll container · safe-area aware",
      "dependencies": [
        "cn@^0.4.0"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "components/kit/sticky-bottom-bar.tsx",
          "type": "registry:component",
          "target": "components/kit/sticky-bottom-bar.tsx"
        }
      ],
      "categories": [
        "layout"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "StickyBottomBar"
        ],
        "api": "<StickyBottomBar transparent?>{buttons}</StickyBottomBar>"
      }
    },
    {
      "name": "promo-card",
      "type": "registry:component",
      "title": "Promo card",
      "description": "tinted offer/nudge card · arrow CTA, dismiss X, generated art · one per page",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0"
      ],
      "registryDependencies": [
        "@kit/placeholder"
      ],
      "files": [
        {
          "path": "components/kit/promo-card.tsx",
          "type": "registry:component",
          "target": "components/kit/promo-card.tsx"
        }
      ],
      "categories": [
        "layout"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "PromoCard"
        ],
        "api": "<PromoCard title body? action? onDismiss? tone? seed? icon? />"
      }
    },
    {
      "name": "footnote",
      "type": "registry:component",
      "title": "Footnote",
      "description": "small print / disclosure, last on the page",
      "dependencies": [
        "cn@^0.4.0"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "components/kit/footnote.tsx",
          "type": "registry:component",
          "target": "components/kit/footnote.tsx"
        }
      ],
      "categories": [
        "layout"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "Footnote"
        ],
        "api": "<Footnote action?={{label,href|onClick}}>{copy}</Footnote>"
      }
    },
    {
      "name": "image-tile",
      "type": "registry:component",
      "title": "Image tile",
      "description": "rounded image · `seed` draws generated art when there is no `src`",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0"
      ],
      "registryDependencies": [
        "@kit/placeholder"
      ],
      "files": [
        {
          "path": "components/kit/image-tile.tsx",
          "type": "registry:component",
          "target": "components/kit/image-tile.tsx"
        }
      ],
      "categories": [
        "media"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "ImageTile"
        ],
        "api": "<ImageTile src? alt? ratio? caption? fallbackIcon? seed? />"
      }
    },
    {
      "name": "placeholder",
      "type": "registry:component",
      "title": "Placeholder",
      "description": "deterministic abstract SVG art from a `seed` · the kit ships no raster imagery",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "components/kit/placeholder.tsx",
          "type": "registry:component",
          "target": "components/kit/placeholder.tsx"
        }
      ],
      "categories": [
        "media"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "Placeholder"
        ],
        "api": "<Placeholder seed ratio? palette=\"chart|mono|primary\" icon? />"
      }
    },
    {
      "name": "spot",
      "type": "registry:component",
      "title": "Spot",
      "description": "an icon at illustration scale (≥64px) · SuccessScreen uses it",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "components/kit/spot.tsx",
          "type": "registry:component",
          "target": "components/kit/spot.tsx"
        }
      ],
      "categories": [
        "media"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "Spot"
        ],
        "api": "<Spot icon size=\"md|lg|xl\" tone? shape=\"circle|square\" ring? />"
      }
    },
    {
      "name": "hero",
      "type": "registry:component",
      "title": "Hero",
      "description": "one promise, one primary action · `media` for a product shot, omit for centred",
      "dependencies": [
        "cn@^0.4.0"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "components/kit/hero.tsx",
          "type": "registry:component",
          "target": "components/kit/hero.tsx"
        }
      ],
      "categories": [
        "marketing"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "Hero"
        ],
        "api": "<Hero eyebrow? title description? actions? media? />"
      }
    },
    {
      "name": "feature-grid",
      "type": "registry:component",
      "title": "Feature grid",
      "description": "3–6 short blocks · `columns` 2/3",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "components/kit/feature-grid.tsx",
          "type": "registry:component",
          "target": "components/kit/feature-grid.tsx"
        }
      ],
      "categories": [
        "marketing"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "FeatureGrid"
        ],
        "api": "<FeatureGrid features={[{icon,title,description}]} columns? />"
      }
    },
    {
      "name": "pricing-card",
      "type": "registry:component",
      "title": "Pricing card",
      "description": "one plan · 2–4 side by side · `highlighted` on one",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0"
      ],
      "registryDependencies": [
        "@kit/badge",
        "card"
      ],
      "files": [
        {
          "path": "components/kit/pricing-card.tsx",
          "type": "registry:component",
          "target": "components/kit/pricing-card.tsx"
        }
      ],
      "categories": [
        "marketing"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "PricingCard"
        ],
        "api": "<PricingCard name price period? description? features action highlighted? />"
      }
    },
    {
      "name": "chat-message",
      "type": "registry:component",
      "title": "Chat message",
      "description": "one turn · user = bubble on the right, assistant = plain text on the left",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0"
      ],
      "registryDependencies": [
        "avatar"
      ],
      "files": [
        {
          "path": "components/kit/chat-message.tsx",
          "type": "registry:component",
          "target": "components/kit/chat-message.tsx"
        }
      ],
      "categories": [
        "ai"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "ChatMessage"
        ],
        "api": "<ChatMessage role=\"user|assistant\" initials?>{content}</ChatMessage>"
      }
    },
    {
      "name": "chat-composer",
      "type": "registry:component",
      "title": "Chat composer",
      "description": "Enter sends, Shift+Enter breaks · `busy` turns Send into Stop · `accept` turns on attachments (paperclip, drop, chips)",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0"
      ],
      "registryDependencies": [
        "@kit/attachment-chip",
        "@kit/button",
        "textarea"
      ],
      "files": [
        {
          "path": "components/kit/chat-composer.tsx",
          "type": "registry:component",
          "target": "components/kit/chat-composer.tsx"
        }
      ],
      "categories": [
        "ai"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "ChatComposer"
        ],
        "api": "<ChatComposer onSend={(text, files) => …} busy? onStop? placeholder? accept? maxFiles? />"
      }
    },
    {
      "name": "attachment-chip",
      "type": "registry:component",
      "title": "Attachment chip",
      "description": "a file in a conversation: icon by type, name, size · `onRemove` while composing",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0"
      ],
      "registryDependencies": [
        "@kit/button"
      ],
      "files": [
        {
          "path": "components/kit/attachment-chip.tsx",
          "type": "registry:component",
          "target": "components/kit/attachment-chip.tsx"
        }
      ],
      "categories": [
        "ai"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "AttachmentChip",
          "formatBytes"
        ],
        "api": "<AttachmentChip file={{ name, size, type? }} onRemove? />"
      }
    },
    {
      "name": "chat-thread-list",
      "type": "registry:component",
      "title": "Chat thread list",
      "description": "past conversations, grouped by when · `threads activeId onSelect onNew?`",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0"
      ],
      "registryDependencies": [
        "@kit/button"
      ],
      "files": [
        {
          "path": "components/kit/chat-thread-list.tsx",
          "type": "registry:component",
          "target": "components/kit/chat-thread-list.tsx"
        }
      ],
      "categories": [
        "ai"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "ChatThreadList"
        ],
        "api": "<ChatThreadList threads={[{id,title,preview?,group?}]} activeId onSelect onNew? />"
      }
    },
    {
      "name": "sources",
      "type": "registry:component",
      "title": "Sources",
      "description": "what an answer is based on · numbered chips with previews · `[n]` in text → inline citations",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0"
      ],
      "registryDependencies": [
        "popover"
      ],
      "files": [
        {
          "path": "components/kit/sources.tsx",
          "type": "registry:component",
          "target": "components/kit/sources.tsx"
        }
      ],
      "categories": [
        "ai"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "SourceList",
          "CitedText",
          "stripCitations"
        ],
        "api": "<CitedText text=\"… [1]\" sources={[{ title, meta?, snippet?, href? }]} /><SourceList sources />"
      }
    },
    {
      "name": "follow-up-suggestions",
      "type": "registry:component",
      "title": "Follow-up suggestions",
      "description": "next questions under the latest answer · picking one sends it",
      "dependencies": [
        "cn@^0.4.0"
      ],
      "registryDependencies": [
        "@kit/button"
      ],
      "files": [
        {
          "path": "components/kit/follow-up-suggestions.tsx",
          "type": "registry:component",
          "target": "components/kit/follow-up-suggestions.tsx"
        }
      ],
      "categories": [
        "ai"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "FollowUpSuggestions"
        ],
        "api": "<FollowUpSuggestions suggestions={[\"…\"]} onSelect />"
      }
    },
    {
      "name": "streaming-text",
      "type": "registry:component",
      "title": "Streaming text",
      "description": "an answer arriving · all at once under reduced motion · screen readers get it once",
      "dependencies": [],
      "registryDependencies": [
        "@kit/hook-use-reduced-motion"
      ],
      "files": [
        {
          "path": "components/kit/streaming-text.tsx",
          "type": "registry:component",
          "target": "components/kit/streaming-text.tsx"
        }
      ],
      "categories": [
        "ai"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "StreamingText",
          "useStreamingText"
        ],
        "api": "<StreamingText text onDone? />"
      }
    },
    {
      "name": "thinking-indicator",
      "type": "registry:component",
      "title": "Thinking indicator",
      "description": "the model is working · say what it is doing when you can",
      "dependencies": [
        "cn@^0.4.0"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "components/kit/thinking-indicator.tsx",
          "type": "registry:component",
          "target": "components/kit/thinking-indicator.tsx"
        }
      ],
      "categories": [
        "ai"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "ThinkingIndicator"
        ],
        "api": "<ThinkingIndicator label? />"
      }
    },
    {
      "name": "tool-call-card",
      "type": "registry:component",
      "title": "Tool call card",
      "description": "an action the assistant took · `status` running/done/error/stopped · details collapsed",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0"
      ],
      "registryDependencies": [
        "collapsible"
      ],
      "files": [
        {
          "path": "components/kit/tool-call-card.tsx",
          "type": "registry:component",
          "target": "components/kit/tool-call-card.tsx"
        }
      ],
      "categories": [
        "ai"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "ToolCallCard"
        ],
        "api": "<ToolCallCard title status input? output? />"
      }
    },
    {
      "name": "approval-card",
      "type": "registry:component",
      "title": "Approval card",
      "description": "consent before consequence · says what changes and whether it can be undone",
      "dependencies": [
        "cn@^0.4.0",
        "lucide-react@^1.52.0"
      ],
      "registryDependencies": [
        "@kit/button"
      ],
      "files": [
        {
          "path": "components/kit/approval-card.tsx",
          "type": "registry:component",
          "target": "components/kit/approval-card.tsx"
        }
      ],
      "categories": [
        "ai"
      ],
      "docs": "Needs the kit theme (`@kit/theme`) and a next-themes ThemeProvider (attribute=\"class\") at the root.",
      "meta": {
        "exports": [
          "ApprovalCard"
        ],
        "api": "<ApprovalCard title description? details? onApprove onDeny />"
      }
    }
  ]
}
