{
  "$schema": "https://ui.shadcn.com/schema/registry.json",
  "name": "zyeon",
  "homepage": "https://ui.zyeon.ai",
  "items": [
    {
      "name": "effect-button",
      "type": "registry:ui",
      "title": "Effect Button",
      "description": "One button, seven visual effects (shimmer, shine, spotlight, glow, gradient, glass, ripple) as cva variants.",
      "files": [
        {
          "path": "src/registry/ui/effect-button.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "class-variance-authority"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "animated-text",
      "type": "registry:ui",
      "title": "Animated Text",
      "description": "Character-level text animation \u2014 typewriter, scramble and flowing gradient variants in one component.",
      "files": [
        {
          "path": "src/registry/ui/animated-text.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "rating",
      "type": "registry:ui",
      "title": "Rating",
      "description": "An accessible star rating input (whole or half steps) that doubles as a fractional read-only display.",
      "files": [
        {
          "path": "src/registry/ui/rating.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "chart-donut-stat",
      "type": "registry:ui",
      "title": "Donut Chart \u00b7 Center Stat",
      "description": "A four-state donut widget with a center stat and value/percentage legend, driven by one zod contract.",
      "files": [
        {
          "path": "src/registry/ui/chart-donut-stat.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/chart-donut-stat.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "recharts"
      ],
      "registryDependencies": [
        "chart",
        "utils"
      ]
    },
    {
      "name": "pricing-table",
      "type": "registry:block",
      "title": "Pricing Table",
      "description": "A four-state pricing section with a data-derived monthly/yearly toggle and a highlighted recommended tier.",
      "files": [
        {
          "path": "src/registry/blocks/pricing-table.tsx",
          "type": "registry:block"
        },
        {
          "path": "src/registry/blocks/pricing-table.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "stateful-button",
      "type": "registry:ui",
      "title": "Stateful Button",
      "description": "An action button with a built-in idle \u2192 loading \u2192 success/error state machine \u2014 stable width, live-region announcements, auto-reset.",
      "files": [
        {
          "path": "src/registry/ui/stateful-button.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "slide-to-confirm",
      "type": "registry:ui",
      "title": "Slide to Confirm",
      "description": "A slide-to-confirm control \u2014 drag the thumb to the end of the track to fire an action, guarding destructive or irreversible operations against accidental taps.",
      "files": [
        {
          "path": "src/registry/ui/slide-to-confirm.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "theme-toggle-button",
      "type": "registry:ui",
      "title": "Theme Toggle",
      "description": "An animated sun/moon theme toggle button \u2014 controlled and host-agnostic, with a rotate-and-scale icon cross-fade.",
      "files": [
        {
          "path": "src/registry/ui/theme-toggle-button.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "tags-input",
      "type": "registry:ui",
      "title": "Tags Input",
      "description": "A chips input for free-form multi-value entry \u2014 Enter or comma commits, paste splits, duplicates shake, maxTags caps with a counter.",
      "files": [
        {
          "path": "src/registry/ui/tags-input.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "dropzone",
      "type": "registry:ui",
      "title": "Dropzone",
      "description": "A native drag-and-drop file picker with accept/size/count validation, inline rejection reasons and a removable file list.",
      "files": [
        {
          "path": "src/registry/ui/dropzone.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "number-ticker",
      "type": "registry:ui",
      "title": "Number Ticker",
      "description": "A count-up number that eases from 0 to its target the first time it scrolls into view \u2014 Intl-formatted with prefix/suffix.",
      "files": [
        {
          "path": "src/registry/ui/number-ticker.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "status-badge",
      "type": "registry:ui",
      "title": "Status Badge",
      "description": "A presence and health indicator \u2014 colored dot or tinted pill, with status colors mapped to theme tokens and an optional liveness pulse.",
      "files": [
        {
          "path": "src/registry/ui/status-badge.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "avatar-group",
      "type": "registry:ui",
      "title": "Avatar Group",
      "description": "An overlapping avatar stack with ring cutouts, letter fallbacks for broken images, and a computed +N overflow chip.",
      "files": [
        {
          "path": "src/registry/ui/avatar-group.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "timeline",
      "type": "registry:ui",
      "title": "Timeline",
      "description": "A contract-driven vertical timeline with done, active and upcoming milestone nodes and four data states.",
      "files": [
        {
          "path": "src/registry/ui/timeline.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/timeline.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "spinner",
      "type": "registry:ui",
      "title": "Spinner",
      "description": "One indeterminate loader, seven shapes \u2014 three boxed (ring, dual-ring, bars) and four inline dot rows (dots, ellipsis, bounce, wave), with tone and count props.",
      "files": [
        {
          "path": "src/registry/ui/spinner.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "progress-meter",
      "type": "registry:ui",
      "title": "Progress Meter",
      "description": "One progress contract in two geometries \u2014 a linear bar or a compact ring, each with determinate and indeterminate modes, four tones and four sizes.",
      "files": [
        {
          "path": "src/registry/ui/progress-meter.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "banner",
      "type": "registry:ui",
      "title": "Banner",
      "description": "A page-top announcement bar with info, accent and destructive variants, a real action link and consumer-owned dismissal.",
      "files": [
        {
          "path": "src/registry/ui/banner.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "class-variance-authority",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "dock",
      "type": "registry:ui",
      "title": "Dock",
      "description": "A macOS-style dock with proximity-based icon magnification, spring physics and hover label bubbles.",
      "files": [
        {
          "path": "src/registry/ui/dock.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "animated-tabs",
      "type": "registry:ui",
      "title": "Animated Tabs",
      "description": "A controlled tab strip with a sliding active indicator \u2014 underline and pill variants animated via motion layout animation.",
      "files": [
        {
          "path": "src/registry/ui/animated-tabs.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "marquee",
      "type": "registry:ui",
      "title": "Marquee",
      "description": "A pure-CSS infinite scrolling belt for logo walls and testimonial strips \u2014 seamless loop, edge fade and hover pause.",
      "files": [
        {
          "path": "src/registry/ui/marquee.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "comparison-slider",
      "type": "registry:ui",
      "title": "Comparison Slider",
      "description": "A draggable before/after comparison slider with clip-path reveal, pointer capture and full keyboard support.",
      "files": [
        {
          "path": "src/registry/ui/comparison-slider.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "grid-dots",
      "type": "registry:ui",
      "title": "Grid Dots",
      "description": "A zero-JS grid, dots or cross pattern background container with an optional radial fade mask \u2014 a pure server component.",
      "files": [
        {
          "path": "src/registry/ui/grid-dots.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "aurora",
      "type": "registry:ui",
      "title": "Aurora",
      "description": "An animated aurora-gradient background container \u2014 theme-token blobs drifting in pure CSS.",
      "files": [
        {
          "path": "src/registry/ui/aurora.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "chart-bar-interactive",
      "type": "registry:ui",
      "title": "Bar Chart \u00b7 Interactive",
      "description": "An interactive bar chart card with per-series big-number toggles that switch which series the bars plot.",
      "files": [
        {
          "path": "src/registry/ui/chart-bar-interactive.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/chart-bar-interactive.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "recharts"
      ],
      "registryDependencies": [
        "chart",
        "utils"
      ]
    },
    {
      "name": "sparkline-stat-card",
      "type": "registry:ui",
      "title": "Stat Card \u00b7 Sparkline",
      "description": "A KPI card \u2014 headline figure, tone-aware delta badge and a minimal sparkline \u2014 with four data states from one contract.",
      "files": [
        {
          "path": "src/registry/ui/sparkline-stat-card.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/sparkline-stat-card.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "recharts",
        "lucide-react"
      ],
      "registryDependencies": [
        "chart",
        "utils"
      ]
    },
    {
      "name": "testimonials",
      "type": "registry:block",
      "title": "Testimonials",
      "description": "A masonry wall of customer quote cards with avatars, driven by one contract through all four data states.",
      "files": [
        {
          "path": "src/registry/blocks/testimonials.tsx",
          "type": "registry:block"
        },
        {
          "path": "src/registry/blocks/testimonials.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "stats-section",
      "type": "registry:block",
      "title": "Stats Section",
      "description": "A marketing KPI band of big formatted numbers with hairline dividers, driven by a four-state contract.",
      "files": [
        {
          "path": "src/registry/blocks/stats-section.tsx",
          "type": "registry:block"
        },
        {
          "path": "src/registry/blocks/stats-section.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "faq-section",
      "type": "registry:block",
      "title": "FAQ Section",
      "description": "A four-state FAQ accordion block with a self-contained, dependency-free disclosure list and smooth grid-rows expansion.",
      "files": [
        {
          "path": "src/registry/blocks/faq-section.tsx",
          "type": "registry:block"
        },
        {
          "path": "src/registry/blocks/faq-section.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "magnetic-button",
      "type": "registry:ui",
      "title": "Magnetic Button",
      "description": "A button that drifts toward the cursor within a sensing radius and springs back on leave, with a subtle reverse-parallax label.",
      "files": [
        {
          "path": "src/registry/ui/magnetic-button.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "password-input",
      "type": "registry:ui",
      "title": "Password Input",
      "description": "A styled password field with a show/hide toggle and an optional heuristic strength meter.",
      "files": [
        {
          "path": "src/registry/ui/password-input.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "kbd",
      "type": "registry:ui",
      "title": "Kbd",
      "description": "Keycap and key-combination display \u2014 semantic `<kbd>` markup with platform-aware glyphs (mod resolves to \u2318 on mac, Ctrl on windows).",
      "files": [
        {
          "path": "src/registry/ui/kbd.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "credit-card",
      "type": "registry:ui",
      "title": "Credit Card",
      "description": "A flippable bank card display with a masked number, holder and expiry on the front, magstripe and a hidden CVC placeholder on the back.",
      "files": [
        {
          "path": "src/registry/ui/credit-card.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "animated-tooltip",
      "type": "registry:ui",
      "title": "Animated Tooltip",
      "description": "A self-contained hover/focus tooltip with a spring pop-in, reduced-motion fallback and an arrow callout \u2014 no Radix dependency.",
      "files": [
        {
          "path": "src/registry/ui/animated-tooltip.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "image-zoom",
      "type": "registry:ui",
      "title": "Image Zoom",
      "description": "A clickable thumbnail that opens a full-screen lightbox with a fade + scale transition, Esc/backdrop/click-to-close, and focus management.",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "src/registry/ui/image-zoom.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "word-rotate",
      "type": "registry:ui",
      "title": "Word Rotate",
      "description": "A jitter-free rotating word inside a headline, cycling through slide or fade transitions with zero layout shift.",
      "files": [
        {
          "path": "src/registry/ui/word-rotate.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "spotlight",
      "type": "registry:ui",
      "title": "Spotlight",
      "description": "A cursor-following radial glow background container \u2014 pointer coordinates track via ref-driven CSS variables, never React state.",
      "files": [
        {
          "path": "src/registry/ui/spotlight.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "use-copy-to-clipboard",
      "type": "registry:hook",
      "title": "useCopyToClipboard",
      "description": "A clipboard-copy hook with a timed copied state and a non-throwing error channel.",
      "files": [
        {
          "path": "src/registry/hooks/use-copy-to-clipboard.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "copy-button",
      "type": "registry:ui",
      "title": "Copy Button",
      "description": "A ghost icon or label button that writes text to the clipboard and flashes a timed \"Copied\" confirmation.",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "src/registry/ui/copy-button.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "search-input",
      "type": "registry:ui",
      "title": "Search Input",
      "description": "A search field with an icon, a clear button that appears on value, an optional loading spinner, and a decorative shortcut hint.",
      "files": [
        {
          "path": "src/registry/ui/search-input.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "autosize-textarea",
      "type": "registry:ui",
      "title": "Autosize Textarea",
      "description": "A textarea that grows with its content via CSS field-sizing with a scrollHeight-based JS fallback, capped between minRows and maxRows.",
      "files": [
        {
          "path": "src/registry/ui/autosize-textarea.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "accordion",
      "type": "registry:ui",
      "title": "Accordion",
      "description": "A zero-dependency accessible disclosure list \u2014 single or multiple expansion, grid-rows animation, and full APG keyboard support.",
      "files": [
        {
          "path": "src/registry/ui/accordion.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "empty-state",
      "type": "registry:ui",
      "title": "Empty State",
      "description": "A centered empty-state panel with an icon chip, title, description and up to two actions \u2014 link actions render RSC-safe, onClick actions need a client boundary.",
      "files": [
        {
          "path": "src/registry/ui/empty-state.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "skeleton",
      "type": "registry:ui",
      "title": "Skeleton",
      "description": "A loading-placeholder primitive \u2014 line, circle and rect shapes with pulse or shimmer motion \u2014 that mirrors the layout it stands in for.",
      "files": [
        {
          "path": "src/registry/ui/skeleton.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "class-variance-authority"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "callout",
      "type": "registry:ui",
      "title": "Callout",
      "description": "An inline highlight box for docs, forms and explanatory copy \u2014 info, success, warning and danger variants with a tinted accent bar and default icon per variant.",
      "files": [
        {
          "path": "src/registry/ui/callout.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "scroll-progress",
      "type": "registry:ui",
      "title": "Scroll Progress",
      "description": "A thin fixed bar tracking page or container scroll position, written straight to the DOM with zero re-renders.",
      "files": [
        {
          "path": "src/registry/ui/scroll-progress.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "breadcrumbs",
      "type": "registry:ui",
      "title": "Breadcrumbs",
      "description": "An accessible breadcrumb trail with collapsible overflow \u2014 first item + ellipsis + last items once maxItems is exceeded.",
      "files": [
        {
          "path": "src/registry/ui/breadcrumbs.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "pagination",
      "type": "registry:ui",
      "title": "Pagination",
      "description": "Page-number navigation with a sliding sibling window, edge pinning, and an ellipsis only when the page count actually needs one.",
      "files": [
        {
          "path": "src/registry/ui/pagination.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "stepper",
      "type": "registry:ui",
      "title": "Stepper",
      "description": "A horizontal wizard progress indicator \u2014 completed steps are clickable to go back, the current and future steps never are.",
      "files": [
        {
          "path": "src/registry/ui/stepper.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "carousel",
      "type": "registry:ui",
      "title": "Carousel",
      "description": "An embla-powered slide carousel with autoplay (hover-pause, reduced-motion aware), looped or bounded navigation, arrow buttons and synced pagination dots.",
      "files": [
        {
          "path": "src/registry/ui/carousel.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "embla-carousel-react",
        "embla-carousel-autoplay",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "use-debounce-value",
      "type": "registry:hook",
      "title": "useDebounceValue",
      "description": "A generic hook that returns a value only after it has stopped changing for a delay, with no flash on first render.",
      "files": [
        {
          "path": "src/registry/hooks/use-debounce-value.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-local-storage",
      "type": "registry:hook",
      "title": "useLocalStorage",
      "description": "An SSR-safe localStorage-backed state hook, kept in sync across same-tab instances and other tabs.",
      "files": [
        {
          "path": "src/registry/hooks/use-local-storage.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-media-query",
      "type": "registry:hook",
      "title": "useMediaQuery",
      "description": "An SSR-safe hook that subscribes to a CSS media query and returns whether it currently matches.",
      "files": [
        {
          "path": "src/registry/hooks/use-media-query.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "scroll-to-top",
      "type": "registry:ui",
      "title": "Scroll to Top",
      "description": "A floating button that fades in past a scroll threshold and smoothly scrolls its container (or the window) back to the top.",
      "files": [
        {
          "path": "src/registry/ui/scroll-to-top.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "number-input",
      "type": "registry:ui",
      "title": "Number Input",
      "description": "A capsule quantity stepper with a decrement/increment button either side of a directly-editable, clamped numeric field.",
      "files": [
        {
          "path": "src/registry/ui/number-input.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "swatch-picker",
      "type": "registry:ui",
      "title": "Swatch Picker",
      "description": "An accessible radiogroup of preset color swatches with roving tabindex, arrow-key navigation, and a contrast-safe selected check mark.",
      "files": [
        {
          "path": "src/registry/ui/swatch-picker.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "chat-bubble",
      "type": "registry:ui",
      "title": "Chat Bubble",
      "description": "A single message bubble with role-based alignment and color, an avatar slot, and a bouncing typing indicator for assembling chat message lists.",
      "files": [
        {
          "path": "src/registry/ui/chat-bubble.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "relative-time",
      "type": "registry:ui",
      "title": "Relative Time",
      "description": "Auto-refreshing 'time ago' text rendered as a real <time> element, formatted with Intl.RelativeTimeFormat and hydration-safe via useSyncExternalStore.",
      "files": [
        {
          "path": "src/registry/ui/relative-time.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "description-list",
      "type": "registry:ui",
      "title": "Description List",
      "description": "A semantic key-value list for order details, profile echoes, and settings summaries, in a divided-rows or panel-grid layout.",
      "files": [
        {
          "path": "src/registry/ui/description-list.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "qr-code",
      "type": "registry:ui",
      "title": "QR Code",
      "description": "A tokenized QR code renderer \u2014 encodes any string to SVG and inherits currentColor, auto-inverting in dark mode.",
      "files": [
        {
          "path": "src/registry/ui/qr-code.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "qrcode"
      ],
      "devDependencies": [
        "@types/qrcode"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "countdown",
      "type": "registry:ui",
      "title": "Countdown",
      "description": "A ticking days/hours/minutes/seconds countdown for launches and promotions, with a one-shot onComplete callback and SSR-safe hydration.",
      "files": [
        {
          "path": "src/registry/ui/countdown.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "activity-heatmap",
      "type": "registry:ui",
      "title": "Activity Heatmap",
      "description": "A GitHub-style contribution grid \u2014 daily counts as a five-step color scale over a windowed week-by-week calendar, with four data states.",
      "files": [
        {
          "path": "src/registry/ui/activity-heatmap.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/activity-heatmap.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "file-tree",
      "type": "registry:ui",
      "title": "File Tree",
      "description": "An accessible hierarchical file/folder tree with WAI-ARIA-nested treeitem/group markup, roving tabindex, and grid-rows expand animation.",
      "files": [
        {
          "path": "src/registry/ui/file-tree.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "masonry-grid",
      "type": "registry:ui",
      "title": "Masonry Grid",
      "description": "A pure-CSS waterfall grid container that arranges children into responsive columns via break-inside-avoid wrappers, no measuring or JS required.",
      "files": [
        {
          "path": "src/registry/ui/masonry-grid.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "video-embed",
      "type": "registry:ui",
      "title": "Video Embed",
      "description": "A lite YouTube/Vimeo facade \u2014 poster and play button until clicked, so the real iframe and its third-party script never load until the user opts in.",
      "files": [
        {
          "path": "src/registry/ui/video-embed.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "text-reveal",
      "type": "registry:ui",
      "title": "Text Reveal",
      "description": "Word-by-word or character-by-character text reveal triggered by scrolling into view, with a staggered fade-up-blur entrance.",
      "files": [
        {
          "path": "src/registry/ui/text-reveal.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "meteors",
      "type": "registry:ui",
      "title": "Meteors",
      "description": "A decorative diagonal shooting-star field for hero/card backdrops \u2014 deterministically scattered, pure CSS.",
      "files": [
        {
          "path": "src/registry/ui/meteors.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "use-intersection-observer",
      "type": "registry:hook",
      "title": "useIntersectionObserver",
      "description": "A callback-ref hook reporting whether an element is intersecting its viewport, with an optional one-shot reveal-once mode.",
      "files": [
        {
          "path": "src/registry/hooks/use-intersection-observer.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "like-button",
      "type": "registry:ui",
      "title": "Like Button",
      "description": "A social toggle that fills its icon, bursts a ring of particles and rolls the counter on every tap.",
      "files": [
        {
          "path": "src/registry/ui/like-button.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "class-variance-authority"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "share-button",
      "type": "registry:ui",
      "title": "Share Button",
      "description": "A share trigger whose targets fan out on an arc or a rail, one 40ms step apart, with outside-click and Esc dismissal.",
      "files": [
        {
          "path": "src/registry/ui/share-button.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "download-button",
      "type": "registry:ui",
      "title": "Download Button",
      "description": "A download CTA that fills like a liquid gauge as the transfer advances, then settles into a checked or retryable state.",
      "files": [
        {
          "path": "src/registry/ui/download-button.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "split-button",
      "type": "registry:ui",
      "title": "Split Button",
      "description": "A primary action welded to an arrow segment that opens its own keyboard-navigable action menu.",
      "files": [
        {
          "path": "src/registry/ui/split-button.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "class-variance-authority"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "gradient-border-button",
      "type": "registry:ui",
      "title": "Gradient Border Button",
      "description": "A rotating conic-gradient ring around a solid core, so the border carries the colour and the label keeps full contrast.",
      "files": [
        {
          "path": "src/registry/ui/gradient-border-button.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "class-variance-authority"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "fab-menu",
      "type": "registry:ui",
      "title": "FAB Menu",
      "description": "A floating action button that fans a labelled column of secondary actions upward, with staggered entry and focus handling.",
      "files": [
        {
          "path": "src/registry/ui/fab-menu.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "otp-input",
      "type": "registry:ui",
      "title": "OTP Input",
      "description": "A segmented verification-code field with auto-advance, paste-to-fill, optional grouping and masking.",
      "files": [
        {
          "path": "src/registry/ui/otp-input.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "range-slider",
      "type": "registry:ui",
      "title": "Range Slider",
      "description": "A two-thumb range selector with a minimum gap, value bubbles, marks and full keyboard control.",
      "files": [
        {
          "path": "src/registry/ui/range-slider.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "toggle-switch",
      "type": "registry:ui",
      "title": "Toggle Switch",
      "description": "A switch with a sliding knob, Check/X icons fading inside the track, three sizes and a loading state.",
      "files": [
        {
          "path": "src/registry/ui/toggle-switch.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "class-variance-authority",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "currency-input",
      "type": "registry:ui",
      "title": "Currency Input",
      "description": "A money field that stays raw while you type and normalizes with Intl.NumberFormat on blur \u2014 grouping, fixed decimals, clamping, and a number | null value.",
      "files": [
        {
          "path": "src/registry/ui/currency-input.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "phone-input",
      "type": "registry:ui",
      "title": "Phone Input",
      "description": "A country dial-code picker fused to a number field \u2014 searchable self-drawn listbox, keyboard driven, emitting an E.164 string on every change.",
      "files": [
        {
          "path": "src/registry/ui/phone-input.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "inline-edit",
      "type": "registry:ui",
      "title": "Inline Edit",
      "description": "Click-to-edit text that swaps a button for an input in place \u2014 pending state on async saves, rollback with the failure reason, and no width jump.",
      "files": [
        {
          "path": "src/registry/ui/inline-edit.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "choice-cards",
      "type": "registry:ui",
      "title": "Choice Cards",
      "description": "A card-shaped radio or checkbox group \u2014 icon, title, description and badge per option, with roving-tabindex keyboard selection.",
      "files": [
        {
          "path": "src/registry/ui/choice-cards.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "class-variance-authority"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "filter-chips",
      "type": "registry:ui",
      "title": "Filter Chips",
      "description": "A wrapping row of toggle chips for narrowing a list \u2014 per-facet counts, single or multi select, and a Clear all that only appears when something is on.",
      "files": [
        {
          "path": "src/registry/ui/filter-chips.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "class-variance-authority"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "stat-card",
      "type": "registry:ui",
      "title": "Stat Card",
      "description": "A KPI grid \u2014 label, big tabular figure and a tone-coded delta per metric \u2014 with loading, empty, error and ready driven by one contract.",
      "files": [
        {
          "path": "src/registry/ui/stat-card.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/stat-card.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "terminal",
      "type": "registry:ui",
      "title": "Terminal",
      "description": "A terminal window that replays a scripted session \u2014 commands type out character by character, output blocks fade in, comments stay dim.",
      "files": [
        {
          "path": "src/registry/ui/terminal.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "mini-calendar",
      "type": "registry:ui",
      "title": "Mini Calendar",
      "description": "A compact month grid for picking one date \u2014 keyboard-navigable, timezone-safe, with today, disabled days and event dots. No date library.",
      "files": [
        {
          "path": "src/registry/ui/mini-calendar.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "tilt-card",
      "type": "registry:ui",
      "title": "Tilt Card",
      "description": "A card container that leans toward the pointer in 3D, with an optional gloss that tracks the cursor.",
      "files": [
        {
          "path": "src/registry/ui/tilt-card.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "notification-badge",
      "type": "registry:ui",
      "title": "Notification Badge",
      "description": "A count bubble that wraps any element \u2014 rolling digits, a bump on change, max overflow, dot mode with a ping, and four corner placements.",
      "files": [
        {
          "path": "src/registry/ui/notification-badge.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "class-variance-authority"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "flip-card",
      "type": "registry:ui",
      "title": "Flip Card",
      "description": "A two-faced container that turns over on hover or click to swap a summary for its details.",
      "files": [
        {
          "path": "src/registry/ui/flip-card.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "bento-grid",
      "type": "registry:ui",
      "title": "Bento Grid",
      "description": "A responsive tiling layout of mixed-size feature cards, with a pointer-tracked glow and honest click affordances.",
      "files": [
        {
          "path": "src/registry/ui/bento-grid.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "typing-indicator",
      "type": "registry:ui",
      "title": "Typing Indicator",
      "description": "A chat presence indicator \u2014 optional avatar, a receiver-side bubble of waving dots, and a name line that collapses for groups.",
      "files": [
        {
          "path": "src/registry/ui/typing-indicator.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "class-variance-authority"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "emoji-reaction",
      "type": "registry:ui",
      "title": "Emoji Reaction",
      "description": "A reaction bar of tallied emoji chips plus a keyboard-navigable picker for adding one more.",
      "files": [
        {
          "path": "src/registry/ui/emoji-reaction.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "class-variance-authority",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "confirm-dialog",
      "type": "registry:ui",
      "title": "Confirm Dialog",
      "description": "One confirmation dialog for every destructive action \u2014 async pending, inline failure and type-to-confirm.",
      "files": [
        {
          "path": "src/registry/ui/confirm-dialog.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "alert-dialog",
        "button",
        "utils"
      ]
    },
    {
      "name": "success-check",
      "type": "registry:ui",
      "title": "Success Check",
      "description": "An SVG outcome mark that draws its ring and then its stroke \u2014 a check for success, a cross for failure.",
      "files": [
        {
          "path": "src/registry/ui/success-check.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "toast-stack",
      "type": "registry:ui",
      "title": "Toast Stack",
      "description": "A self-contained toast system \u2014 newest slides in, older ones stack behind it, hover expands the pile into a list.",
      "files": [
        {
          "path": "src/registry/ui/toast-stack.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "bottom-nav",
      "type": "registry:ui",
      "title": "Bottom Nav",
      "description": "A mobile tab bar with badges, safe-area padding and an indicator that measures the active item and glides to it.",
      "files": [
        {
          "path": "src/registry/ui/bottom-nav.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "segmented-control",
      "type": "registry:ui",
      "title": "Segmented Control",
      "description": "An iOS-style exclusive picker whose selected thumb slides between options, with cva sizes and full radiogroup keyboard support.",
      "files": [
        {
          "path": "src/registry/ui/segmented-control.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "class-variance-authority"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "toc-scrollspy",
      "type": "registry:ui",
      "title": "TOC Scrollspy",
      "description": "An article outline that follows the reader \u2014 headings are watched with one IntersectionObserver and a rail slides to the current section.",
      "files": [
        {
          "path": "src/registry/ui/toc-scrollspy.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "sidebar-nav",
      "type": "registry:ui",
      "title": "Sidebar Nav",
      "description": "A grouped app sidebar with collapsible sections, icons, badges, an active-item indicator and an icon-only collapsed rail.",
      "files": [
        {
          "path": "src/registry/ui/sidebar-nav.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "link-preview",
      "type": "registry:ui",
      "title": "Link Preview",
      "description": "An inline link that reveals a hoverable preview card \u2014 thumbnail, title, description and domain \u2014 with edge-aware flipping and touch-safe degradation.",
      "files": [
        {
          "path": "src/registry/ui/link-preview.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "lightbox-gallery",
      "type": "registry:ui",
      "title": "Lightbox Gallery",
      "description": "A thumbnail grid that opens a full-screen lightbox with arrow navigation, a counter, captions and focus return.",
      "files": [
        {
          "path": "src/registry/ui/lightbox-gallery.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "image-placeholder",
      "type": "registry:ui",
      "title": "Image Placeholder",
      "description": "A progressive image loader \u2014 skeleton, blur-up or color placeholder, a 400ms cross-fade on load and an error panel when the URL fails.",
      "files": [
        {
          "path": "src/registry/ui/image-placeholder.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "photo-stack",
      "type": "registry:ui",
      "title": "Photo Stack",
      "description": "A tilted deck of photos \u2014 drag, click or arrow-key the top one away and it cycles to the bottom, forever.",
      "files": [
        {
          "path": "src/registry/ui/photo-stack.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "typewriter",
      "type": "registry:ui",
      "title": "Typewriter",
      "description": "A type-and-delete headline that cycles through a list of sentences with a blinking caret.",
      "files": [
        {
          "path": "src/registry/ui/typewriter.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "gradient-text",
      "type": "registry:ui",
      "title": "Gradient Text",
      "description": "Polymorphic heading text painted with a token-driven gradient, optionally looping \u2014 no hex codes anywhere.",
      "files": [
        {
          "path": "src/registry/ui/gradient-text.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "scramble-text",
      "type": "registry:ui",
      "title": "Scramble Text",
      "description": "Text that lands as random characters and decodes left to right, on mount, on scroll-in or on hover.",
      "files": [
        {
          "path": "src/registry/ui/scramble-text.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "shiny-text",
      "type": "registry:ui",
      "title": "Shiny Text",
      "description": "A restrained inline shimmer \u2014 one narrow light band loops across muted text, for New badges and quiet links.",
      "files": [
        {
          "path": "src/registry/ui/shiny-text.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "highlight-marker",
      "type": "registry:ui",
      "title": "Highlight Marker",
      "description": "Highlighter, underline or hand-drawn circle that wipes across a phrase when it scrolls into view.",
      "files": [
        {
          "path": "src/registry/ui/highlight-marker.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "gradient-mesh",
      "type": "registry:ui",
      "title": "Gradient Mesh",
      "description": "A full-bleed mesh-gradient wash \u2014 oversized blurred token blobs drifting past each other as an absolute background layer.",
      "files": [
        {
          "path": "src/registry/ui/gradient-mesh.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "retro-grid",
      "type": "registry:ui",
      "title": "Retro Grid",
      "description": "An 80s synthwave floor \u2014 a tiled grid laid flat in perspective, scrolling toward the viewer and dissolving into the horizon.",
      "files": [
        {
          "path": "src/registry/ui/retro-grid.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "light-beams",
      "type": "registry:ui",
      "title": "Light Beams",
      "description": "Angled shafts of light falling from the top edge, each breathing on its own tempo and fading out before the bottom.",
      "files": [
        {
          "path": "src/registry/ui/light-beams.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "noise-texture",
      "type": "registry:ui",
      "title": "Noise Texture",
      "description": "An SVG turbulence grain layer that gives flat fills and gradients the tooth of print \u2014 optionally jittering like film.",
      "files": [
        {
          "path": "src/registry/ui/noise-texture.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "use-click-outside",
      "type": "registry:hook",
      "title": "useClickOutside",
      "description": "A hook that runs a handler when a pointer interaction lands outside one or more referenced elements.",
      "files": [
        {
          "path": "src/registry/hooks/use-click-outside.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-keyboard-shortcut",
      "type": "registry:hook",
      "title": "useKeyboardShortcut",
      "description": "A hook that binds human-readable key combos like mod+k to a handler, with platform-aware modifiers and an input-focus guard.",
      "files": [
        {
          "path": "src/registry/hooks/use-keyboard-shortcut.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-window-size",
      "type": "registry:hook",
      "title": "useWindowSize",
      "description": "A hook that tracks the viewport size with per-frame or debounced commits and an explicit not-ready state before hydration.",
      "files": [
        {
          "path": "src/registry/hooks/use-window-size.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-mouse-position",
      "type": "registry:hook",
      "title": "useMousePosition",
      "description": "A hook that tracks pointer position, optionally relative to an element, with clamped 0..1 normalized coordinates.",
      "files": [
        {
          "path": "src/registry/hooks/use-mouse-position.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-interval",
      "type": "registry:hook",
      "title": "useInterval",
      "description": "A declarative setInterval hook with a nullable delay, an always-fresh callback, and pause/resume controls.",
      "files": [
        {
          "path": "src/registry/hooks/use-interval.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "hold-to-confirm",
      "type": "registry:ui",
      "title": "Hold to Confirm",
      "description": "A press-and-hold confirmation button \u2014 hold past a charge bar to fire an action, guarding destructive or irreversible operations against accidental taps.",
      "files": [
        {
          "path": "src/registry/ui/hold-to-confirm.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "signature-pad",
      "type": "registry:ui",
      "title": "Signature Pad",
      "description": "A canvas signature capture surface with pointer-drawn strokes, undo/clear, and a PNG data URL export.",
      "files": [
        {
          "path": "src/registry/ui/signature-pad.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "corner-ribbon",
      "type": "registry:ui",
      "title": "Corner Ribbon",
      "description": "A diagonal corner badge draped over a card \u2014 NEW / SALE / POPULAR callouts that wrap any card content.",
      "files": [
        {
          "path": "src/registry/ui/corner-ribbon.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "feature-table",
      "type": "registry:ui",
      "title": "Feature Table",
      "description": "A contract-driven feature comparison matrix across plans or versions, rendered as a real semantic table with four data states.",
      "files": [
        {
          "path": "src/registry/ui/feature-table.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/feature-table.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "sortable-list",
      "type": "registry:ui",
      "title": "Sortable List",
      "description": "A drag-to-reorder list (settings, playlists, priority queues) built on dnd-kit with a keyboard-sortable fallback.",
      "files": [
        {
          "path": "src/registry/ui/sortable-list.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "@dnd-kit/core",
        "@dnd-kit/sortable",
        "@dnd-kit/utilities",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "animated-list",
      "type": "registry:ui",
      "title": "Animated List",
      "description": "A flex column that staggers items in on first mount, pops in new entries, and exits removed ones while the rest smoothly re-flow into place.",
      "files": [
        {
          "path": "src/registry/ui/animated-list.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "confetti",
      "type": "registry:ui",
      "title": "Confetti",
      "description": "A DOM-particle celebration burst layer \u2014 bump a counter to fire a delta-time normalized confetti burst inside a relative container.",
      "files": [
        {
          "path": "src/registry/ui/confetti.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "cookie-consent",
      "type": "registry:ui",
      "title": "Cookie Consent",
      "description": "A bottom-fixed cookie consent card with slide in/out animation that persists the visitor's accept/decline choice to localStorage.",
      "files": [
        {
          "path": "src/registry/ui/cookie-consent.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "floating-navbar",
      "type": "registry:ui",
      "title": "Floating Navbar",
      "description": "A header that hides on scroll-down and reappears on scroll-up, giving long reading surfaces the vertical space back without losing the nav.",
      "files": [
        {
          "path": "src/registry/ui/floating-navbar.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "audio-player",
      "type": "registry:ui",
      "title": "Audio Player",
      "description": "A minimal token-styled audio player card \u2014 play/pause, seek, and mm:ss time over a native <audio> element.",
      "files": [
        {
          "path": "src/registry/ui/audio-player.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "device-frame",
      "type": "registry:ui",
      "title": "Device Frame",
      "description": "A CSS-only phone or browser shell \u2014 drop a screenshot or a live component into a mockup for marketing pages, no iframe.",
      "files": [
        {
          "path": "src/registry/ui/device-frame.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "read-more",
      "type": "registry:ui",
      "title": "Read More",
      "description": "A line-clamped text block with an expand/collapse toggle that only appears when content actually overflows.",
      "files": [
        {
          "path": "src/registry/ui/read-more.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "waves",
      "type": "registry:ui",
      "title": "Waves",
      "description": "An SVG wave divider and layered backdrop for section transitions and hero bottoms \u2014 pure CSS, no canvas.",
      "files": [
        {
          "path": "src/registry/ui/waves.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "use-scroll-direction",
      "type": "registry:hook",
      "title": "useScrollDirection",
      "description": "A scroll-direction hook that only re-renders on up/down flips, with a displacement threshold to ignore jitter.",
      "files": [
        {
          "path": "src/registry/hooks/use-scroll-direction.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-online",
      "type": "registry:hook",
      "title": "useOnline",
      "description": "An SSR-safe hook that tracks the browser's online/offline status via useSyncExternalStore.",
      "files": [
        {
          "path": "src/registry/hooks/use-online.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-toggle",
      "type": "registry:hook",
      "title": "useToggle",
      "description": "A boolean-state hook with a fixed toggle/setTrue/setFalse/set action set that keeps a stable reference across renders.",
      "files": [
        {
          "path": "src/registry/hooks/use-toggle.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-timeout",
      "type": "registry:hook",
      "title": "useTimeout",
      "description": "A declarative one-shot setTimeout hook with a latest-ref callback, a null-to-pause delay, and reset/clear controls.",
      "files": [
        {
          "path": "src/registry/hooks/use-timeout.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-throttle-value",
      "type": "registry:hook",
      "title": "useThrottleValue",
      "description": "A generic hook that throttles a fast-changing value with leading + trailing emission, ticking at most once per interval.",
      "files": [
        {
          "path": "src/registry/hooks/use-throttle-value.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-previous",
      "type": "registry:hook",
      "title": "usePrevious",
      "description": "A hook that returns the value from one render ago, via render-time state adjustment instead of a ref+effect.",
      "files": [
        {
          "path": "src/registry/hooks/use-previous.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-hover",
      "type": "registry:hook",
      "title": "useHover",
      "description": "A callback-ref hover hook that exposes a hovered boolean via pointerenter/pointerleave, for hover-driven side effects like prefetching \u2014 not for CSS-replaceable visual hover styling.",
      "files": [
        {
          "path": "src/registry/hooks/use-hover.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-event-listener",
      "type": "registry:hook",
      "title": "useEventListener",
      "description": "A type-safe window/document/element event listener hook with a latest-ref handler \u2014 zero rebinds on handler change, never stale.",
      "files": [
        {
          "path": "src/registry/hooks/use-event-listener.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-scroll-lock",
      "type": "registry:hook",
      "title": "useScrollLock",
      "description": "A controlled body-scroll lock hook with scrollbar-width compensation and a reentrant lock counter for multiple simultaneous callers.",
      "files": [
        {
          "path": "src/registry/hooks/use-scroll-lock.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-session-storage",
      "type": "registry:hook",
      "title": "useSessionStorage",
      "description": "An SSR-safe sessionStorage-backed state hook, kept in sync across same-tab instances only.",
      "files": [
        {
          "path": "src/registry/hooks/use-session-storage.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-document-title",
      "type": "registry:hook",
      "title": "useDocumentTitle",
      "description": "Sets document.title for as long as a component is mounted and restores the pre-mount title on unmount.",
      "files": [
        {
          "path": "src/registry/hooks/use-document-title.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-countdown",
      "type": "registry:hook",
      "title": "useCountdown",
      "description": "A duration-based countdown state machine with start/pause/reset controls and a once-only onComplete callback.",
      "files": [
        {
          "path": "src/registry/hooks/use-countdown.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-fullscreen",
      "type": "registry:hook",
      "title": "useFullscreen",
      "description": "A hook that requests/exits native fullscreen on a single element via a callback ref, keeping a fullscreen boolean in sync (including Esc) through useSyncExternalStore.",
      "files": [
        {
          "path": "src/registry/hooks/use-fullscreen.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-idle",
      "type": "registry:hook",
      "title": "useIdle",
      "description": "Flips a boolean idle state after a period with no pointer, keyboard, wheel, or touch activity, with a throttled reset and SSR-safe cleanup.",
      "files": [
        {
          "path": "src/registry/hooks/use-idle.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "combobox",
      "type": "registry:ui",
      "title": "Combobox",
      "description": "A searchable dropdown selector \u2014 single or multi-select, grouped, creatable, with keyboard-driven filtering and chip overflow.",
      "files": [
        {
          "path": "src/registry/ui/combobox.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "date-range-picker",
      "type": "registry:ui",
      "title": "Date Range Picker",
      "description": "A two-month range calendar with preset shortcuts (Today, Last 7/30 days, this/last month), hover preview and no date-library dependency.",
      "files": [
        {
          "path": "src/registry/ui/date-range-picker.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "time-picker",
      "type": "registry:ui",
      "title": "Time Picker",
      "description": "A segmented hour:minute input with arrow-key stepping and a clock-button dropdown, normalizing to 24-hour \"HH:mm\" regardless of display format.",
      "files": [
        {
          "path": "src/registry/ui/time-picker.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "color-picker",
      "type": "registry:ui",
      "title": "Color Picker",
      "description": "A hex-driven color picker with a saturation/value area, hue and alpha sliders, format-aware text input, swatches, and an optional eyedropper.",
      "files": [
        {
          "path": "src/registry/ui/color-picker.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "prompt-input",
      "type": "registry:ui",
      "title": "Prompt Input",
      "description": "An autosizing chat input with paste/drag/pick attachments, a streaming Send\u21c4Stop button, IME-safe submit and a character counter.",
      "files": [
        {
          "path": "src/registry/ui/prompt-input.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "mention-input",
      "type": "registry:ui",
      "title": "Mention Input",
      "description": "A plain-text textarea where a trigger character (default @) opens a caret-anchored, filtered picker \u2014 mentions, or repurposed for slash commands.",
      "files": [
        {
          "path": "src/registry/ui/mention-input.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "api-key-field",
      "type": "registry:ui",
      "title": "API Key Field",
      "description": "A settings-page secret field with fixed-length masking, reveal/hide with optional auto re-mask, copy-to-clipboard with a visible failure fallback, and a two-step confirm before regenerating.",
      "files": [
        {
          "path": "src/registry/ui/api-key-field.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "code-block",
      "type": "registry:ui",
      "title": "Code Block",
      "description": "A copyable code panel with its own minimal regex syntax highlighter \u2014 line numbers, line highlighting, tabs and a wrap toggle, no external highlighting engine.",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "src/registry/ui/code-block.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "json-viewer",
      "type": "registry:ui",
      "title": "JSON Viewer",
      "description": "A collapsible, searchable JSON tree viewer with type-colored values, per-node copy value/path, and safe rendering of circular refs and every JS edge-case value.",
      "files": [
        {
          "path": "src/registry/ui/json-viewer.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "page-header",
      "type": "registry:ui",
      "title": "Page Header",
      "description": "An app-shell page header \u2014 breadcrumb slot, icon, title, status meta and actions that wrap instead of squeeze, plus an optional controlled tab strip.",
      "files": [
        {
          "path": "src/registry/ui/page-header.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "bulk-action-bar",
      "type": "registry:ui",
      "title": "Bulk Action Bar",
      "description": "A floating toolbar that mounts once rows are selected \u2014 inline actions, an overflow \"More\" menu, and a live-announced count.",
      "files": [
        {
          "path": "src/registry/ui/bulk-action-bar.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "motion"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "virtual-list",
      "type": "registry:ui",
      "title": "Virtual List",
      "description": "A hand-rolled windowed list \u2014 renders only the visible rows of a huge array, with fixed or measured variable heights, imperative scroll control and infinite-scroll support.",
      "files": [
        {
          "path": "src/registry/ui/virtual-list.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "scroll-reveal",
      "type": "registry:ui",
      "title": "Scroll Reveal",
      "description": "A variant-driven entrance wrapper \u2014 fade, slide, blur or scale any children in once they scroll into view, with an optional per-child stagger.",
      "files": [
        {
          "path": "src/registry/ui/scroll-reveal.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "onboarding-tour",
      "type": "registry:ui",
      "title": "Onboarding Tour",
      "description": "A spotlight-style product walkthrough that dims the page, cuts a rounded hole around each step's real target, and positions an auto-flipping tooltip card beside it.",
      "files": [
        {
          "path": "src/registry/ui/onboarding-tour.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "error-state",
      "type": "registry:ui",
      "title": "Error State",
      "description": "An error panel \u2014 inline/card/page density, safe unknown-error extraction, collapsible stack trace, a copyable error code and a real retry pending state.",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "src/registry/ui/error-state.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "command-palette",
      "type": "registry:ui",
      "title": "Command Palette",
      "description": "A \u2318K-style command palette \u2014 portal dialog, fuzzy subsequence search, grouped commands, recent items and full keyboard navigation.",
      "files": [
        {
          "path": "src/registry/ui/command-palette.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "sticky-header",
      "type": "registry:ui",
      "title": "Sticky Header",
      "description": "An in-flow page header that shrinks, blurs, or hides on scroll, exposing its scroll state as data attributes for consumers to style.",
      "files": [
        {
          "path": "src/registry/ui/sticky-header.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "voice-recorder",
      "type": "registry:ui",
      "title": "Voice Recorder",
      "description": "A real MediaRecorder-backed voice recorder \u2014 live AnalyserNode waveform, pause/resume, mic-permission handling, and a listen-before-you-send preview.",
      "files": [
        {
          "path": "src/registry/ui/voice-recorder.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "image-cropper",
      "type": "registry:ui",
      "title": "Image Cropper",
      "description": "A drag/zoom/rotate image cropper with pointer + keyboard control that exports a real cropped Blob via canvas.",
      "files": [
        {
          "path": "src/registry/ui/image-cropper.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "data-table",
      "type": "registry:ui",
      "title": "Data Table",
      "description": "A contract-driven interactive data table \u2014 controlled sort, tri-state row selection, sticky header, row actions, and real loading/empty/error states.",
      "files": [
        {
          "path": "src/registry/ui/data-table.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/data-table.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "form-wizard",
      "type": "registry:ui",
      "title": "Form Wizard",
      "description": "A multi-step form state machine \u2014 per-step validation gates (sync or async), focus moved to the first bad field, and a self-contained progress rail.",
      "files": [
        {
          "path": "src/registry/ui/form-wizard.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "file-upload-list",
      "type": "registry:ui",
      "title": "File Upload List",
      "description": "An upload queue with per-file progress, pause/resume, retry, cancel and remove, a byte-weighted batch summary and throttled screen-reader announcements.",
      "files": [
        {
          "path": "src/registry/ui/file-upload-list.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "checkbox-tree",
      "type": "registry:ui",
      "title": "Checkbox Tree",
      "description": "A multi-select hierarchical picker: parent\u2194child cascade with derived indeterminate parents, WAI-ARIA tree keyboard navigation, disabled subtrees, and search that auto-expands the path to every hit.",
      "files": [
        {
          "path": "src/registry/ui/checkbox-tree.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "duration-input",
      "type": "registry:ui",
      "title": "Duration Input",
      "description": "A duration field normalized to seconds \u2014 carrying h/m/s spinbutton segments (type 90 minutes, get 1h 30m) or a free-text mode that parses \"1h30\", \"90m\" and \"1:30\".",
      "files": [
        {
          "path": "src/registry/ui/duration-input.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "masked-input",
      "type": "registry:ui",
      "title": "Masked Input",
      "description": "A pattern-masked text field \u2014 9/A/* slots with literal separators, masked and raw value on every change, and caret-preserving edits in the middle of the string.",
      "files": [
        {
          "path": "src/registry/ui/masked-input.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "filter-bar",
      "type": "registry:ui",
      "title": "Filter Bar",
      "description": "Composable filter bar for a table toolbar: an add-filter menu, one editable chip per active filter with its own remove button, portalled editors for select / multiselect / date-range / text / boolean, wrap-or-collapse overflow and Clear all.",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "src/registry/ui/filter-bar.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "emoji-picker",
      "type": "registry:ui",
      "title": "Emoji Picker",
      "description": "A full emoji panel \u2014 554 built-in emoji in 8 categories with bilingual search, skin tones, recents and a windowed arrow-key grid, inline or portalled beside a trigger.",
      "files": [
        {
          "path": "src/registry/ui/emoji-picker.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "form-field",
      "type": "registry:ui",
      "title": "Form Field",
      "description": "A label + control wrapper that injects id, aria-describedby, invalid/required state, disabled and a character counter into whatever control you nest inside it.",
      "files": [
        {
          "path": "src/registry/ui/form-field.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "credit-card-form",
      "type": "registry:ui",
      "title": "Credit Card Form",
      "description": "Card entry with brand-aware grouping and maxLength, a Luhn check, MM/YY with a real expiry rule, blur-time errors, auto-advance and correct cc-* autocomplete \u2014 UI only, real payments belong in a PCI-compliant hosted field set.",
      "files": [
        {
          "path": "src/registry/ui/credit-card-form.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "availability-picker",
      "type": "registry:ui",
      "title": "Availability Picker",
      "description": "A week \u00d7 time-slot grid you brush to declare when you are free \u2014 paint/erase drag strokes, keyboard painting, blocked slots and an optional group heatmap.",
      "files": [
        {
          "path": "src/registry/ui/availability-picker.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "kanban-board",
      "type": "registry:ui",
      "title": "Kanban Board",
      "description": "A contract-driven kanban board \u2014 dnd-kit drag and drop across and within columns, keyboard-accessible moves with live announcements, WIP limits that block over-filling, per-column scrolling, and real loading/empty/error states.",
      "files": [
        {
          "path": "src/registry/ui/kanban-board.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/kanban-board.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "@dnd-kit/core",
        "@dnd-kit/sortable",
        "@dnd-kit/utilities",
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "schedule-calendar",
      "type": "registry:ui",
      "title": "Schedule Calendar",
      "description": "A day/week time grid \u2014 events placed by the minute, overlapping ones packed side by side, an all-day row, a caller-supplied current-time line, click-to-create slots and real loading/empty/error states.",
      "files": [
        {
          "path": "src/registry/ui/schedule-calendar.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/schedule-calendar.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "notification-center",
      "type": "registry:ui",
      "title": "Notification Center",
      "description": "An inbox popover for the app bell \u2014 grouped rows, tab filters, per-row and bulk read management, clipping-aware placement, and real loading/empty/error states.",
      "files": [
        {
          "path": "src/registry/ui/notification-center.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/notification-center.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "log-viewer",
      "type": "registry:ui",
      "title": "Log Viewer",
      "description": "A runtime log console \u2014 level filters with counts, search highlighting with hit-to-hit jumps, tail-follow that pauses on manual scroll, and windowed rendering for huge buffers.",
      "files": [
        {
          "path": "src/registry/ui/log-viewer.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/log-viewer.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "comment-thread",
      "type": "registry:ui",
      "title": "Comment Thread",
      "description": "A nested discussion tree \u2014 collapsible reply subtrees on a clickable thread line, optimistic voting, inline reply composer with a posting/failed lifecycle, controlled sorting, and a depth cap that hands deep threads off to a permalink.",
      "files": [
        {
          "path": "src/registry/ui/comment-thread.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/comment-thread.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "chat-thread",
      "type": "registry:ui",
      "title": "Chat Thread",
      "description": "A contract-driven conversation stream \u2014 sender grouping, day and unread dividers, streaming append, load-older with position kept, and a scroll that never gets stolen from the reader.",
      "files": [
        {
          "path": "src/registry/ui/chat-thread.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/chat-thread.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "profile-card",
      "type": "registry:ui",
      "title": "Profile Card",
      "description": "One person card in three densities \u2014 vertical, horizontal and compact \u2014 with presence dot, badges, stats, a stretched-link name and initials fallback.",
      "files": [
        {
          "path": "src/registry/ui/profile-card.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "rating-summary",
      "type": "registry:ui",
      "title": "Rating Summary",
      "description": "A read-only review digest: average score, fractional stars and five distribution bars that double as star-filter toggles, plus a no-reviews state.",
      "files": [
        {
          "path": "src/registry/ui/rating-summary.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "product-card",
      "type": "registry:ui",
      "title": "Product Card",
      "description": "A storefront product card: one stretched link over the whole card, variant swatches that swap the photo, a discount derived from the was-price, a sold-out veil and a four-phase Add to cart that never fakes success.",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "src/registry/ui/product-card.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "diff-viewer",
      "type": "registry:ui",
      "title": "Diff Viewer",
      "description": "A GitHub-style text diff \u2014 unified or side-by-side, own LCS line matching with word-level highlights, foldable context, a pinned line-number gutter and guards for huge inputs.",
      "files": [
        {
          "path": "src/registry/ui/diff-viewer.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "uptime-bars",
      "type": "registry:ui",
      "title": "Uptime Bars",
      "description": "A status-page availability strip \u2014 one bar per day bucketed into operational / degraded / partial / major, with hover-or-focus incident detail and a width-aware day window.",
      "files": [
        {
          "path": "src/registry/ui/uptime-bars.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "steps-checklist",
      "type": "registry:ui",
      "title": "Steps Checklist",
      "description": "An onboarding checklist that tracks setup progress \u2014 togglable steps with optional CTAs, expandable detail, a progress meter and a completion celebration.",
      "files": [
        {
          "path": "src/registry/ui/steps-checklist.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "split-pane",
      "type": "registry:ui",
      "title": "Split Pane",
      "description": "A dependency-free resizable split layout \u2014 percentage flex-basis panes, percent or px per-pane minimums, double-click collapse, full keyboard resizing and an optional persisted layout.",
      "files": [
        {
          "path": "src/registry/ui/split-pane.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "settings-list",
      "type": "registry:ui",
      "title": "Settings List",
      "description": "Grouped settings rows \u2014 label and description on the left, your own control on the right, with whole-row links, badges, disabled rows and a danger zone.",
      "files": [
        {
          "path": "src/registry/ui/settings-list.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "scroll-area",
      "type": "registry:ui",
      "title": "Scroll Area",
      "description": "A themed scroll container that keeps native scrolling untouched \u2014 the platform bar is hidden and a draggable thumb is drawn from scrollTop/scrollHeight, with edge fades and an end-reached callback.",
      "files": [
        {
          "path": "src/registry/ui/scroll-area.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "drawer",
      "type": "registry:ui",
      "title": "Drawer",
      "description": "A gesture-driven drawer for any edge \u2014 snap points, velocity-based settling, scroll-aware pull-to-close, focus trap and refcounted scroll lock. No vaul.",
      "files": [
        {
          "path": "src/registry/ui/drawer.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "popover",
      "type": "registry:ui",
      "title": "Popover",
      "description": "A click-triggered floating panel that portals past clipping ancestors, then flips, shifts and size-caps itself against the nearest scrollable boundary.",
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "src/registry/ui/popover.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "hover-card",
      "type": "registry:ui",
      "title": "Hover Card",
      "description": "A hover-and-focus card for arbitrary rich content \u2014 avatar, stats, links, buttons \u2014 with an open delay, a close grace period the pointer can cross into, clip-aware flipping and tap-to-toggle on touch.",
      "files": [
        {
          "path": "src/registry/ui/hover-card.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "feedback-widget",
      "type": "registry:ui",
      "title": "Feedback Widget",
      "description": "A corner or inline feedback launcher with a sentiment radiogroup, category chips, message and optional email, driven by an idle \u2192 submitting \u2192 success \u2192 error submit state machine.",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "src/registry/ui/feedback-widget.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "loading-overlay",
      "type": "registry:ui",
      "title": "Loading Overlay",
      "description": "A scrim that freezes one region or the whole viewport while work is in flight \u2014 delay-gated so short requests never flash, held for a minimum so it never blinks out, and inert underneath so Tab cannot walk into the frozen form.",
      "files": [
        {
          "path": "src/registry/ui/loading-overlay.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "shortcuts-dialog",
      "type": "registry:ui",
      "title": "Shortcuts Dialog",
      "description": "A grouped keyboard cheat sheet bound to the ? key \u2014 platform-correct keycap glyphs, token-based filtering, focus trap and a refcounted scroll lock.",
      "files": [
        {
          "path": "src/registry/ui/shortcuts-dialog.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "top-loading-bar",
      "type": "registry:ui",
      "title": "Top Loading Bar",
      "description": "A thin route and request bar that climbs asymptotically towards 99% while work is in flight \u2014 delay-gated so fast requests never flash, held for a minimum duration, with a controlled mode, top or bottom placement and an optional spinner.",
      "files": [
        {
          "path": "src/registry/ui/top-loading-bar.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "error-boundary",
      "type": "registry:ui",
      "title": "Error Boundary",
      "description": "A real React error boundary \u2014 keyed remount on reset, automatic recovery when resetKeys change, a consecutive-failure guard, onError reporting with the component stack, and dev-only stack details.",
      "files": [
        {
          "path": "src/registry/ui/error-boundary.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "mega-menu",
      "type": "registry:ui",
      "title": "Mega Menu",
      "description": "A site nav bar whose entries drop a wide multi-column sheet across the whole navbar \u2014 portalled past clipping ancestors, hover intent with instant lateral switching, and an automatic accordion fallback.",
      "files": [
        {
          "path": "src/registry/ui/mega-menu.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "context-menu",
      "type": "registry:ui",
      "title": "Context Menu",
      "description": "Right-click, long-press or Shift+F10 menu that opens at the pointer \u2014 checkboxes, submenus, typeahead, and flipping bounded by the nearest clipping ancestor.",
      "files": [
        {
          "path": "src/registry/ui/context-menu.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "dropdown-menu",
      "type": "registry:ui",
      "title": "Dropdown Menu",
      "description": "A generic dropdown menu \u2014 any trigger, structured rows (commands, checkboxes, radio groups, submenus), typeahead and clipping-aware placement.",
      "files": [
        {
          "path": "src/registry/ui/dropdown-menu.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "video-player",
      "type": "registry:ui",
      "title": "Video Player",
      "description": "A custom control skin for a self-hosted <video> \u2014 pointer-capture scrubbing with preview time, buffered ranges, volume memory, speed menu, subtitles, fullscreen, PiP, keyboard shortcuts and a readable error state.",
      "files": [
        {
          "path": "src/registry/ui/video-player.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "video-hover-preview",
      "type": "registry:ui",
      "title": "Video Hover Preview",
      "description": "A thumbnail card that plays a muted preview clip on hover or keyboard focus \u2014 delayed lazy load, pointer-x scrubbing, progress bar, and a poster fallback on error.",
      "files": [
        {
          "path": "src/registry/ui/video-hover-preview.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "camera-capture",
      "type": "registry:ui",
      "title": "Camera Capture",
      "description": "A real getUserMedia webcam capturer \u2014 live preview, countdown shutter, mirrored canvas export, and a keep/retake review that returns a JPEG Blob.",
      "files": [
        {
          "path": "src/registry/ui/camera-capture.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "particles",
      "type": "registry:ui",
      "title": "Particles",
      "description": "An interactive canvas particle field \u2014 dots, linked constellations, snow or fireflies that follow your text token and scatter from the pointer.",
      "files": [
        {
          "path": "src/registry/ui/particles.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "use-async",
      "type": "registry:hook",
      "title": "useAsync",
      "description": "A one-call async state machine with last-call-wins race protection, AbortSignal cancellation and unmount-safe resolves.",
      "files": [
        {
          "path": "src/registry/hooks/use-async.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-drag-scroll",
      "type": "registry:hook",
      "title": "useDragScroll",
      "description": "Grab-to-scroll any overflow container with pointer drags \u2014 momentum glide, grabbing cursor, and click suppression so dragging over a card never fires its onClick.",
      "files": [
        {
          "path": "src/registry/hooks/use-drag-scroll.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-long-press",
      "type": "registry:hook",
      "title": "useLongPress",
      "description": "A press-and-hold gesture hook returning spreadable pointer/keyboard handlers plus isPressing and 0\u20131 progress \u2014 pointer-captured, cancels past a move tolerance, works with held Space/Enter.",
      "files": [
        {
          "path": "src/registry/hooks/use-long-press.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-swipe",
      "type": "registry:hook",
      "title": "useSwipe",
      "description": "A Pointer Events swipe hook with axis/direction locking, distance-or-velocity commit and live follow-the-finger deltas \u2014 spread its props, animate the offset yourself.",
      "files": [
        {
          "path": "src/registry/hooks/use-swipe.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-resize-observer",
      "type": "registry:hook",
      "title": "useResizeObserver",
      "description": "A callback-ref hook that measures an element's own size with ResizeObserver \u2014 selectable box model, rAF-batched or debounced commits, and no resize-loop errors.",
      "files": [
        {
          "path": "src/registry/hooks/use-resize-observer.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-geolocation",
      "type": "registry:hook",
      "title": "useGeolocation",
      "description": "Reads or continuously watches the browser's geolocation behind an explicit request()/stop() pair, with hydration-safe capability detection, a queried permission state, and separate denied / timeout / position-unavailable / unsupported outcomes.",
      "files": [
        {
          "path": "src/registry/hooks/use-geolocation.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-page-visibility",
      "type": "registry:hook",
      "title": "usePageVisibility",
      "description": "Subscribes to page visibility via useSyncExternalStore so polling, timers and video pause when the tab is hidden, with onVisible/onHidden callbacks and the away duration.",
      "files": [
        {
          "path": "src/registry/hooks/use-page-visibility.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-broadcast-channel",
      "type": "registry:hook",
      "title": "useBroadcastChannel",
      "description": "Broadcasts messages between same-origin tabs over BroadcastChannel, with SSR-safe capability detection, an optional local echo and structured-clone diagnostics.",
      "files": [
        {
          "path": "src/registry/hooks/use-broadcast-channel.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-undo-redo",
      "type": "registry:hook",
      "title": "useUndoRedo",
      "description": "A state container with linear undo/redo history \u2014 keystroke coalescing, forced breakpoints, a bounded stack, and stable callbacks.",
      "files": [
        {
          "path": "src/registry/hooks/use-undo-redo.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-controllable-state",
      "type": "registry:hook",
      "title": "useControllableState",
      "description": "A useState-shaped hook that lets one component serve both controlled (value/onChange) and uncontrolled (defaultValue) callers, with a stable setter and prop-accurate updaters.",
      "files": [
        {
          "path": "src/registry/hooks/use-controllable-state.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "package-info",
      "type": "registry:ui",
      "title": "Package Info",
      "description": "Display package versions, dependency groups, and upgrade status in a compact metadata panel.",
      "files": [
        {
          "path": "src/registry/ui/package-info.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/package-info.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "announcement",
      "type": "registry:ui",
      "title": "Announcement",
      "description": "A compact inline announcement link with an optional label, icon and directional CTA cue.",
      "files": [
        {
          "path": "src/registry/ui/announcement.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "border-trace-button",
      "type": "registry:ui",
      "title": "Border Trace Button",
      "description": "A native button with an animated border trace and reduced-motion fallback.",
      "files": [
        {
          "path": "src/registry/ui/border-trace-button.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "animated-beam",
      "type": "registry:ui",
      "title": "Animated Beam",
      "description": "Connect two interface nodes with a responsive animated SVG beam.",
      "files": [
        {
          "path": "src/registry/ui/animated-beam.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "flickering-grid",
      "type": "registry:ui",
      "title": "Flickering Grid",
      "description": "Render a responsive canvas grid with subtle, reduced-motion-aware flickering cells.",
      "files": [
        {
          "path": "src/registry/ui/flickering-grid.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "environment-variables",
      "type": "registry:ui",
      "title": "Environment Variables",
      "description": "Review, reveal, and copy environment variables with sensitive values masked by default.",
      "files": [
        {
          "path": "src/registry/ui/environment-variables.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/environment-variables.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "test-results",
      "type": "registry:ui",
      "title": "Test Results",
      "description": "Summarize test suites, outcomes, durations, and failure details across explicit data states.",
      "files": [
        {
          "path": "src/registry/ui/test-results.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/test-results.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "schema-display",
      "type": "registry:ui",
      "title": "Schema Display",
      "description": "Document API operations, parameters, and nested schemas in an accessible expandable view.",
      "files": [
        {
          "path": "src/registry/ui/schema-display.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/schema-display.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "stack-trace",
      "type": "registry:ui",
      "title": "Stack Trace",
      "description": "Parse, inspect, and copy stack traces while preserving unrecognized raw frames.",
      "files": [
        {
          "path": "src/registry/ui/stack-trace.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/stack-trace.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "perspective-marquee",
      "type": "registry:ui",
      "title": "3D Marquee",
      "description": "Present media tiles in a responsive perspective marquee with explicit data states.",
      "files": [
        {
          "path": "src/registry/ui/perspective-marquee.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/perspective-marquee.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "slug-input",
      "type": "registry:ui",
      "title": "Slug Input",
      "description": "A URL field that transliterates the title as you type, detaches the moment you edit it by hand, and debounces an availability check with clickable -2 / -3 suggestions.",
      "files": [
        {
          "path": "src/registry/ui/slug-input.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "unit-input",
      "type": "registry:ui",
      "title": "Unit Input",
      "description": "A number-plus-unit field for design tokens \u2014 12px, 1.5rem, 50% \u2014 with arrow/wheel stepping, optional conversion on unit switch, and an auto state.",
      "files": [
        {
          "path": "src/registry/ui/unit-input.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "repeater-field",
      "type": "registry:ui",
      "title": "Repeater Field",
      "description": "A generic controlled array field \u2014 add, remove, move and drag-sort rows of any shape, with min/max clamping and stable row ids that never remount a focused input.",
      "files": [
        {
          "path": "src/registry/ui/repeater-field.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "@dnd-kit/core",
        "@dnd-kit/sortable",
        "@dnd-kit/utilities",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "timezone-picker",
      "type": "registry:ui",
      "title": "Timezone Picker",
      "description": "A searchable IANA time-zone field \u2014 ~90 zones grouped Popular / All, each row showing that zone's live local time and derived GMT offset, in a portalled panel no overflow-hidden card can clip.",
      "files": [
        {
          "path": "src/registry/ui/timezone-picker.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "cron-input",
      "type": "registry:ui",
      "title": "Cron Input",
      "description": "A visual five-field cron builder \u2014 presets, hour/minute selects and weekday/month chips write the expression, pasting one parses back into them, with a plain-English summary and the next runs.",
      "files": [
        {
          "path": "src/registry/ui/cron-input.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "leaderboard",
      "type": "registry:ui",
      "title": "Leaderboard",
      "description": "A ranked standings board \u2014 podium tiers, rank-change arrows, a highlighted current-user row with a pinned \"your rank\" bar, and real loading/empty/error states.",
      "files": [
        {
          "path": "src/registry/ui/leaderboard.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/leaderboard.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "invoice-summary",
      "type": "registry:ui",
      "title": "Invoice Summary",
      "description": "An invoice / order total block \u2014 line items (quantity \u00d7 unit), discounts, taxes with rates, shipping, total and amount due, all in integer minor units, with full and compact variants and four data states.",
      "files": [
        {
          "path": "src/registry/ui/invoice-summary.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/invoice-summary.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "request-waterfall",
      "type": "registry:ui",
      "title": "Request Waterfall",
      "description": "A DevTools-style network waterfall \u2014 one adaptive time axis, bars segmented by DNS/connect/TLS/TTFB/download, hover-or-focus phase breakdowns, duration sorting, and real loading/empty/error states.",
      "files": [
        {
          "path": "src/registry/ui/request-waterfall.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/request-waterfall.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "org-chart",
      "type": "registry:ui",
      "title": "Org Chart",
      "description": "A recursive org/hierarchy chart drawn with pure-CSS connector lines (sibling bus trimmed at both ends), collapsible subtrees, vertical or horizontal orientation, renderNode-swappable cards, and a keyboard-navigable WAI-ARIA tree that scrolls inside its own box instead of overflowing.",
      "files": [
        {
          "path": "src/registry/ui/org-chart.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "api-endpoint",
      "type": "registry:ui",
      "title": "API Endpoint",
      "description": "A collapsible API reference card with a monochrome-safe method badge, grouped parameter tables, expandable response examples, and a generated Copy-as-cURL command that reports failure honestly.",
      "files": [
        {
          "path": "src/registry/ui/api-endpoint.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "save-indicator",
      "type": "registry:ui",
      "title": "Save Indicator",
      "description": "Autosave status line for an editor toolbar \u2014 Saving\u2026 holds a minimum beat to avoid flicker, Saved fades back into \"Last saved 3 minutes ago\", and errors stay put with a Retry.",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "src/registry/ui/save-indicator.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "permission-prompt",
      "type": "registry:ui",
      "title": "Permission Prompt",
      "description": "A pre-permission explainer card that says why camera, microphone, location, notification or clipboard access is needed before the browser's one-shot dialog is spent, with per-permission recovery steps and a retry once it's blocked.",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "src/registry/ui/permission-prompt.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "connection-status",
      "type": "registry:ui",
      "title": "Connection Status",
      "description": "An online / offline / reconnecting bar with an exponential-backoff retry countdown, a manual retry button and SSR-safe browser subscription.",
      "files": [
        {
          "path": "src/registry/ui/connection-status.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "workspace-switcher",
      "type": "registry:ui",
      "title": "Workspace Switcher",
      "description": "A workspace / organization switcher: active workspace in the trigger, grouped searchable menu in a portalled panel, pinned create and settings footer.",
      "files": [
        {
          "path": "src/registry/ui/workspace-switcher.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "image-annotation",
      "type": "registry:ui",
      "title": "Image Annotation",
      "description": "Click-to-pin image annotation \u2014 numbered draggable markers with notes, stored as percentages of the image so they never drift when it resizes.",
      "files": [
        {
          "path": "src/registry/ui/image-annotation.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "redacted-text",
      "type": "registry:ui",
      "title": "Redacted Text",
      "description": "Blur, black-bar or character-mask a sensitive string with hover / click / press-and-hold reveal \u2014 where mask actually removes the plaintext from the DOM.",
      "files": [
        {
          "path": "src/registry/ui/redacted-text.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "ripple-rings",
      "type": "registry:ui",
      "title": "Ripple Rings",
      "description": "Concentric ripples expanding out of one origin \u2014 a pure CSS/DOM backdrop with an optional pointer-following origin and a static reduced-motion fallback.",
      "files": [
        {
          "path": "src/registry/ui/ripple-rings.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "topography",
      "type": "registry:ui",
      "title": "Topography",
      "description": "A seamlessly tiling contour-map backdrop traced from seeded hash noise \u2014 quiet relief lines for docs shells, auth screens and empty states.",
      "files": [
        {
          "path": "src/registry/ui/topography.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "use-selection",
      "type": "registry:hook",
      "title": "useSelection",
      "description": "A list multi-selection state machine with Shift range, platform-aware cmd/ctrl toggle, tri-state select-all flags, and automatic pruning when items change.",
      "files": [
        {
          "path": "src/registry/hooks/use-selection.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-pagination",
      "type": "registry:hook",
      "title": "usePagination",
      "description": "Headless pagination state \u2014 clamped page, page count, item range, client-side slice() and the ellipsis page sequence, controlled or uncontrolled.",
      "files": [
        {
          "path": "src/registry/hooks/use-pagination.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "address-form",
      "type": "registry:ui",
      "title": "Address Form",
      "description": "A postal address form driven by a country rule table: per-country field set, field order and labels, state dropdown or free text or nothing, postal codes that are required, optional or absent, blur-time validation, correct autocomplete tokens, and an announced clear when a value cannot follow you to the next country.",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "src/registry/ui/address-form.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "rich-text-toolbar",
      "type": "registry:ui",
      "title": "Rich Text Toolbar",
      "description": "An editor-agnostic formatting bar: grouped toggle buttons that never steal the editor's selection, collapse into an overflow menu by measurement, and walk on a single tab stop \u2014 plus a floating variant that follows the selection.",
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "src/registry/ui/rich-text-toolbar.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "json-editor",
      "type": "registry:ui",
      "title": "JSON Editor",
      "description": "An editable JSON textarea with live syntax validation, exact line/column errors marked in a synced gutter, optional schema checking, and format/minify/copy/reset tools.",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "src/registry/ui/json-editor.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "query-builder",
      "type": "registry:ui",
      "title": "Query Builder",
      "description": "A recursive AND/OR condition tree \u2014 operator menus follow the field's type, any condition can be turned into a nested group up to a depth cap, and a read-only SQL-ish expression shows what the tree means.",
      "files": [
        {
          "path": "src/registry/ui/query-builder.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "pin-pad",
      "type": "registry:ui",
      "title": "Pin Pad",
      "description": "A touch-first numeric keypad for PIN entry: 44px keys, masked dot indicator, deterministic shuffled layout, keyboard parity, and pending/error states.",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "src/registry/ui/pin-pad.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "percent-allocator",
      "type": "registry:ui",
      "title": "Percent Allocator",
      "description": "Split a total across rows with largest-remainder rebalancing, per-row locks and min/max limits \u2014 the shares always add up to the target exactly.",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "src/registry/ui/percent-allocator.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "markdown-editor",
      "type": "registry:ui",
      "title": "Markdown Editor",
      "description": "A textarea-based Markdown editor with a selection-aware toggling toolbar, \u2318B/\u2318I/\u2318K shortcuts, write/preview/split modes and a dependency-free preview renderer.",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "src/registry/ui/markdown-editor.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "language-picker",
      "type": "registry:ui",
      "title": "Language Picker",
      "description": "A locale field that lists every language under its own name \u2014 \u7b80\u4f53\u4e2d\u6587 beside Chinese (Simplified) \u2014 searchable by endonym, English name or BCP 47 tag, with RTL rows rendered in their own direction, optional translation completeness and a browser-language matching ladder.",
      "files": [
        {
          "path": "src/registry/ui/language-picker.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "dimension-input",
      "type": "registry:ui",
      "title": "Dimension Input",
      "description": "A paired width \u00d7 height field with an aspect-ratio lock that freezes the ratio when you lock it, clamps both sides against min/max, and ships swap plus size/ratio presets.",
      "files": [
        {
          "path": "src/registry/ui/dimension-input.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "gradient-picker",
      "type": "registry:ui",
      "title": "Gradient Picker",
      "description": "A CSS gradient editor: draggable stop rail with double-click insert, keyboard-reachable stops, an angle dial, and a read-only linear/radial/conic CSS string with copy.",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "src/registry/ui/gradient-picker.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "shortcut-recorder",
      "type": "registry:ui",
      "title": "Shortcut Recorder",
      "description": "A field that records a keyboard shortcut by pressing it \u2014 swallows every key while recording, waits past the modifiers for a real key, and separates browser-reserved combos (refused) from ones that would override an existing binding (recorded, with a warning).",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "src/registry/ui/shortcut-recorder.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "gantt-chart",
      "type": "registry:ui",
      "title": "Gantt Chart",
      "description": "A project schedule chart \u2014 sticky task column, adaptive day/week/month axis, progress-filled bars, milestone diamonds, finish-to-start dependency elbows, collapsible groups, and real loading/empty/error states.",
      "files": [
        {
          "path": "src/registry/ui/gantt-chart.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/gantt-chart.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "inbox-list",
      "type": "registry:ui",
      "title": "Inbox List",
      "description": "A triage-ready message list \u2014 unread by weight and dot, Shift-range multi-select with a bulk bar, keyboard shortcuts, hover-and-focus row actions, and real loading/empty/error states.",
      "files": [
        {
          "path": "src/registry/ui/inbox-list.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/inbox-list.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "audit-trail",
      "type": "registry:ui",
      "title": "Audit Trail",
      "description": "A compliance-grade activity log \u2014 one readable sentence per event, day separators, expandable before/after diffs, and real loading/empty/error states.",
      "files": [
        {
          "path": "src/registry/ui/audit-trail.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/audit-trail.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "permission-matrix",
      "type": "registry:ui",
      "title": "Permission Matrix",
      "description": "An editable roles \u00d7 permissions grid: tri-state cells (allow / deny / inherit), collapsible permission groups, a pinned permission column, locked system-role columns, row/column bulk edits, and real loading/empty/error states.",
      "files": [
        {
          "path": "src/registry/ui/permission-matrix.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/permission-matrix.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "data-grid-editable",
      "type": "registry:ui",
      "title": "Data Grid Editable",
      "description": "A spreadsheet-style editable data grid \u2014 per-column cell editors, roving-tabindex keyboard navigation, per-cell validation, async commits that show pending and roll back, TSV paste, sticky header and first column, plus real loading/empty/error states.",
      "files": [
        {
          "path": "src/registry/ui/data-grid-editable.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/data-grid-editable.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "session-list",
      "type": "registry:ui",
      "title": "Session List",
      "description": "Signed-in devices with per-row and bulk sign-out \u2014 the current session is highlighted and never revocable, rejected revokes keep the row with a retry, and loading/empty/error are first-class states.",
      "files": [
        {
          "path": "src/registry/ui/session-list.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/session-list.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "changelog-list",
      "type": "registry:ui",
      "title": "Changelog List",
      "description": "User-facing release notes \u2014 one block per version, entries grouped by kind with an icon and a word, a sticky version rail on wide containers and real per-release permalinks.",
      "files": [
        {
          "path": "src/registry/ui/changelog-list.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "tree-map",
      "type": "registry:ui",
      "title": "Tree Map",
      "description": "A squarified treemap that tiles a hierarchy by value \u2014 nested groups, click-to-drill with a breadcrumb, rank-based shading and keyboard-reachable DOM tiles (no canvas).",
      "files": [
        {
          "path": "src/registry/ui/tree-map.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "toolbar",
      "type": "registry:ui",
      "title": "Toolbar",
      "description": "A grouped application toolbar that measures itself and folds its lowest-priority actions into a portalled \"More\" menu \u2014 no breakpoints, roving tabindex, pressed toggles kept intact.",
      "files": [
        {
          "path": "src/registry/ui/toolbar.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "version-history",
      "type": "registry:ui",
      "title": "Version History",
      "description": "A day-grouped snapshot list \u2014 preview a version, compare two, and roll one back behind a real confirmation with pending, failure and retry.",
      "files": [
        {
          "path": "src/registry/ui/version-history.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "mini-map",
      "type": "registry:ui",
      "title": "Mini Map",
      "description": "A thumbnail navigator for any scroll container \u2014 a draggable viewport box over an auto-measured (or custom-drawn) silhouette, kept in sync by a passive rAF-throttled listener that writes transform straight to the DOM.",
      "files": [
        {
          "path": "src/registry/ui/mini-map.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "inline-error-summary",
      "type": "registry:ui",
      "title": "Inline Error Summary",
      "description": "A top-of-form error summary whose rows scroll to and focus the field they name \u2014 persistent polite live region, self-focusing panel, onNavigate hook for collapsed fields and a maxVisible overflow count.",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "src/registry/ui/inline-error-summary.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "health-check-list",
      "type": "registry:ui",
      "title": "Health Check List",
      "description": "A self-diagnostics panel \u2014 one independently re-runnable probe per row, shape-plus-word statuses, expandable evidence, real fix actions and a counts-and-verdict summary.",
      "files": [
        {
          "path": "src/registry/ui/health-check-list.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "status-timeline",
      "type": "registry:ui",
      "title": "Status Timeline",
      "description": "A read-only progress thread for an async run \u2014 per-stage icon + word, live elapsed time on the running stage, expandable failures and a settled-run summary, vertical or horizontal.",
      "files": [
        {
          "path": "src/registry/ui/status-timeline.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "diff-confirm",
      "type": "registry:ui",
      "title": "Diff Confirm",
      "description": "A confirmation dialog that shows the change list first \u2014 grouped create/update/delete counts, expandable before \u2192 after rows, type-to-confirm past a destructive threshold, and a failure state that keeps the plan on screen.",
      "files": [
        {
          "path": "src/registry/ui/diff-confirm.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "app-launcher",
      "type": "registry:ui",
      "title": "App Launcher",
      "description": "A nine-dot app switcher: a grid button that drops a portalled tile grid of real links, with arrow-key grid navigation, groups, pinned and recent rows, and a search box once the suite outgrows a 3x3.",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "src/registry/ui/app-launcher.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "nav-rail",
      "type": "registry:ui",
      "title": "Nav Rail",
      "description": "A narrow vertical icon navigation bar that widens into a labelled column \u2014 keyboard-reachable tooltips, top/bottom zones, badges and a controllable expanded state.",
      "files": [
        {
          "path": "src/registry/ui/nav-rail.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "audio-waveform",
      "type": "registry:ui",
      "title": "Audio Waveform",
      "description": "A canvas amplitude waveform with a click/drag/keyboard seek slider \u2014 takes precomputed peaks or decodes a src itself, highlights regions, and stays a controlled display while your own audio element plays.",
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "src/registry/ui/audio-waveform.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "media-grid-selectable",
      "type": "registry:ui",
      "title": "Media Grid Selectable",
      "description": "A multi-select photo/video grid with Shift range, cmd/ctrl toggle, two-dimensional arrow-key navigation, a selection cap, lazy thumbnails and type-icon fallbacks.",
      "files": [
        {
          "path": "src/registry/ui/media-grid-selectable.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "audio-visualizer",
      "type": "registry:ui",
      "title": "Audio Visualizer",
      "description": "A real-time AnalyserNode visualizer \u2014 spectrum bars, oscilloscope, radial ring or segmented level meter, driven by a stream, an audio element or an analyser you own.",
      "files": [
        {
          "path": "src/registry/ui/audio-visualizer.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "file-preview",
      "type": "registry:ui",
      "title": "File Preview",
      "description": "A preview card for any single file \u2014 image/video thumbnails, a working audio play bar, type icons with MIME-or-extension metadata, card/row/tile variants and leak-free object URLs.",
      "files": [
        {
          "path": "src/registry/ui/file-preview.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "truncate-middle",
      "type": "registry:ui",
      "title": "Truncate Middle",
      "description": "Middle-ellipsis text that keeps both ends readable \u2014 a fixed head/tail cluster count, or as many characters as the measured width actually fits.",
      "files": [
        {
          "path": "src/registry/ui/truncate-middle.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "glitch-text",
      "type": "registry:ui",
      "title": "Glitch Text",
      "description": "Cyberpunk glitch headline \u2014 two pseudo-element copies tear the text into slices and slide, in pure CSS, dead still under reduced motion.",
      "files": [
        {
          "path": "src/registry/ui/glitch-text.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "search-highlight",
      "type": "registry:ui",
      "title": "Search Highlight",
      "description": "Highlights the parts of a text that match a search query \u2014 substring, per-word or fuzzy subsequence, with escaped queries, merged overlaps and a current-match cursor.",
      "files": [
        {
          "path": "src/registry/ui/search-highlight.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "starfield",
      "type": "registry:ui",
      "title": "Starfield",
      "description": "A layered parallax star field on one canvas \u2014 2-4 depth layers drifting or warping, seeded for a reproducible sky, with a faint-dust fallback on light surfaces.",
      "files": [
        {
          "path": "src/registry/ui/starfield.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "hex-grid",
      "type": "registry:ui",
      "title": "Hex Grid",
      "description": "A seamlessly tiling honeycomb backdrop \u2014 outlined, tinted or vertex-dotted, with an optional edge fade and a few seeded cells breathing on CSS alone.",
      "files": [
        {
          "path": "src/registry/ui/hex-grid.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "circuit-board",
      "type": "registry:ui",
      "title": "Circuit Board",
      "description": "A seamlessly tiling PCB backdrop \u2014 seeded traces with 45\u00b0/90\u00b0 corners, pads, vias and component footprints, plus an optional signal pulse.",
      "files": [
        {
          "path": "src/registry/ui/circuit-board.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "use-focus-trap",
      "type": "registry:hook",
      "title": "useFocusTrap",
      "description": "A hook that keeps keyboard focus inside a container: moves focus in, cycles Tab both ways, only the innermost trap reacts, and focus returns to the trigger on release.",
      "files": [
        {
          "path": "src/registry/hooks/use-focus-trap.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-roving-tabindex",
      "type": "registry:hook",
      "title": "useRovingTabindex",
      "description": "A roving-tabindex hook that gives a control group one Tab stop and arrow-key navigation inside it \u2014 horizontal / vertical / grid lanes, disabled-item skipping, loop or stop, Home/End and typeahead.",
      "files": [
        {
          "path": "src/registry/hooks/use-roving-tabindex.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-permission",
      "type": "registry:hook",
      "title": "usePermission",
      "description": "Subscribes to navigator.permissions for one name or a whole panel of them \u2014 query only, never request \u2014 folding Firefox's rejections, Safari's gaps, unknown names and insecure origins into one honest unsupported state with a reason, plus change-event updates and a manual query().",
      "files": [
        {
          "path": "src/registry/hooks/use-permission.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-web-share",
      "type": "registry:hook",
      "title": "useWebShare",
      "description": "Opens the native share sheet with typed outcomes \u2014 a cancelled sheet is dismissed rather than an error, files are gated behind canShare, and the fallback reports its own success or failure.",
      "files": [
        {
          "path": "src/registry/hooks/use-web-share.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-speech-recognition",
      "type": "registry:hook",
      "title": "useSpeechRecognition",
      "description": "Speech-to-text on the Web Speech API: prefixed-constructor detection, interim vs settled transcripts, a continuous mode that re-arms itself after the engine's silence timeout yet always stops on stop(), and errors split into benign / recoverable / blocked.",
      "files": [
        {
          "path": "src/registry/hooks/use-speech-recognition.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-mutation-observer",
      "type": "registry:hook",
      "title": "useMutationObserver",
      "description": "A callback-ref hook that watches DOM changes with MutationObserver \u2014 filtered attributes, rAF-batched records, and a disconnect/write/observe guard against self-feeding loops.",
      "files": [
        {
          "path": "src/registry/hooks/use-mutation-observer.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-step",
      "type": "registry:hook",
      "title": "useStep",
      "description": "A step machine for multi-step flows \u2014 async can-go-next gates with a pending flag, visited/completed sets, loop, and clamping when steps change.",
      "files": [
        {
          "path": "src/registry/hooks/use-step.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-list",
      "type": "registry:hook",
      "title": "useList",
      "description": "Array state with every mutation you keep hand-writing \u2014 push, insertAt, move, swap and keyed upsert, all batch-safe, out-of-range-safe, and reference-stable.",
      "files": [
        {
          "path": "src/registry/hooks/use-list.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-clipboard-paste",
      "type": "registry:hook",
      "title": "useClipboardPaste",
      "description": "Catches pasted images, files and rich text \u2014 page-wide or scoped to a ref \u2014 draining clipboardData synchronously, gating files through accept/maxFiles with an itemised rejection list, plus an optional permission-checked active read.",
      "files": [
        {
          "path": "src/registry/hooks/use-clipboard-paste.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-wake-lock",
      "type": "registry:hook",
      "title": "useWakeLock",
      "description": "Keeps the screen awake for the length of a task and re-acquires the wake lock the browser silently takes away whenever the tab is hidden, with gesture-safe requests and distinguishable refusal errors.",
      "files": [
        {
          "path": "src/registry/hooks/use-wake-lock.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-hash",
      "type": "registry:hook",
      "title": "useHash",
      "description": "An SSR-safe hook that reads and writes the URL hash as shareable UI state, writing through pushState/replaceState and broadcasting to every instance on the page.",
      "files": [
        {
          "path": "src/registry/hooks/use-hash.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-notification",
      "type": "registry:hook",
      "title": "useNotification",
      "description": "Sends desktop notifications behind a gesture-gated requestPermission() that never throws, keeps the permission state live via the Permissions API, registers each notification by tag so close(tag) works, and skips notifications while the page is visible.",
      "files": [
        {
          "path": "src/registry/hooks/use-notification.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "chart-area-stacked",
      "type": "registry:ui",
      "title": "Area Chart (Stacked)",
      "description": "A four-state stacked area chart card whose legend chips toggle single series, re-stacking the survivors and rescaling the y-axis, with a per-series plus total tooltip.",
      "files": [
        {
          "path": "src/registry/ui/chart-area-stacked.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/chart-area-stacked.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "recharts"
      ],
      "registryDependencies": [
        "chart",
        "utils"
      ]
    },
    {
      "name": "chart-line-multi",
      "type": "registry:ui",
      "title": "Multi-Series Line Chart",
      "description": "A four-state multi-series line chart whose shared crosshair reads every series at the hovered x, ranked by value, with null gaps left broken.",
      "files": [
        {
          "path": "src/registry/ui/chart-line-multi.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/chart-line-multi.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "recharts"
      ],
      "registryDependencies": [
        "chart",
        "utils"
      ]
    },
    {
      "name": "chart-radial-progress",
      "type": "registry:ui",
      "title": "Radial Progress Chart",
      "description": "A four-state radial progress card: one concentric ring per metric against its own target, a summary number in the hole, and over-target rings capped at one lap with truncation marks instead of drawing through.",
      "files": [
        {
          "path": "src/registry/ui/chart-radial-progress.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/chart-radial-progress.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "recharts"
      ],
      "registryDependencies": [
        "chart",
        "utils"
      ]
    },
    {
      "name": "chart-funnel",
      "type": "registry:ui",
      "title": "Funnel Chart",
      "description": "A four-state conversion funnel: tapering bands with a minimum width, plus per-stage counts, step conversion and cumulative conversion.",
      "files": [
        {
          "path": "src/registry/ui/chart-funnel.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/chart-funnel.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "recharts"
      ],
      "registryDependencies": [
        "chart",
        "utils"
      ]
    },
    {
      "name": "chart-scatter-quadrant",
      "type": "registry:ui",
      "title": "Scatter Chart (Quadrants)",
      "description": "A four-state decision-matrix scatter chart: median or fixed crosshair, labelled tinted quadrants, collision fan-out and a screen-reader data table.",
      "files": [
        {
          "path": "src/registry/ui/chart-scatter-quadrant.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/chart-scatter-quadrant.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "recharts"
      ],
      "registryDependencies": [
        "chart",
        "utils"
      ]
    },
    {
      "name": "chart-radar-compare",
      "type": "registry:ui",
      "title": "Radar Comparison Chart",
      "description": "A four-state radar chart comparing two or three subjects across mixed-unit dimensions: each spoke is normalized 0-100 while the tooltip keeps the raw values.",
      "files": [
        {
          "path": "src/registry/ui/chart-radar-compare.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/chart-radar-compare.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "recharts"
      ],
      "registryDependencies": [
        "chart",
        "utils"
      ]
    },
    {
      "name": "chart-waterfall",
      "type": "registry:ui",
      "title": "Waterfall Chart",
      "description": "A bridge chart of floating bars \u2014 derived opening/subtotal/closing anchors, hatched decreases, running-total connectors, slot-aware ticks and real loading/empty/error states.",
      "files": [
        {
          "path": "src/registry/ui/chart-waterfall.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/chart-waterfall.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "recharts"
      ],
      "registryDependencies": [
        "chart",
        "utils"
      ]
    },
    {
      "name": "chart-gauge",
      "type": "registry:ui",
      "title": "Gauge Chart",
      "description": "A four-state needle dial that reads one metric against contract-driven threshold bands, with explicit boundary attribution and an out-of-range caret.",
      "files": [
        {
          "path": "src/registry/ui/chart-gauge.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/chart-gauge.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "chart-bullet",
      "type": "registry:ui",
      "title": "Bullet Chart",
      "description": "A four-state bullet chart: one row per KPI with its own scale, a measure bar against a target tick and qualitative bands, plus clamped off-scale markers.",
      "files": [
        {
          "path": "src/registry/ui/chart-bullet.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/chart-bullet.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "recharts"
      ],
      "registryDependencies": [
        "chart",
        "utils"
      ]
    },
    {
      "name": "chart-candlestick",
      "type": "registry:ui",
      "title": "Candlestick Chart",
      "description": "A four-state OHLC candlestick chart: hollow-up / solid-down bodies, wicks, doji and limit-locked sessions kept visible, and a full-OHLC tooltip.",
      "files": [
        {
          "path": "src/registry/ui/chart-candlestick.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/chart-candlestick.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "recharts",
        "lucide-react"
      ],
      "registryDependencies": [
        "chart",
        "utils"
      ]
    },
    {
      "name": "chart-histogram",
      "type": "registry:ui",
      "title": "Histogram",
      "description": "A four-state distribution chart that bins raw values itself \u2014 auto / fixed-count / fixed-width bins with optional percentile reference lines.",
      "files": [
        {
          "path": "src/registry/ui/chart-histogram.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/chart-histogram.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "recharts"
      ],
      "registryDependencies": [
        "chart",
        "utils"
      ]
    },
    {
      "name": "chart-stacked-bar-pct",
      "type": "registry:ui",
      "title": "100% Stacked Bar Chart",
      "description": "A four-state 100% stacked bar chart with largest-remainder rounding, so every bar's percentages add up to exactly 100.",
      "files": [
        {
          "path": "src/registry/ui/chart-stacked-bar-pct.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/chart-stacked-bar-pct.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "recharts"
      ],
      "registryDependencies": [
        "chart",
        "utils"
      ]
    },
    {
      "name": "chart-step-line",
      "type": "registry:ui",
      "title": "Step Line Chart",
      "description": "A four-state step chart for discrete state over time \u2014 values hold flat then jump, with three step alignments, change markers and a change table.",
      "files": [
        {
          "path": "src/registry/ui/chart-step-line.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/chart-step-line.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "recharts"
      ],
      "registryDependencies": [
        "chart",
        "utils"
      ]
    },
    {
      "name": "chart-range-area",
      "type": "registry:ui",
      "title": "Range Area Chart",
      "description": "A four-state range-area card: a center line inside one or two nested uncertainty bands, with contradictory bounds repaired and disclosed instead of drawn as crossed polygons.",
      "files": [
        {
          "path": "src/registry/ui/chart-range-area.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/chart-range-area.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "recharts"
      ],
      "registryDependencies": [
        "chart",
        "utils"
      ]
    },
    {
      "name": "hero-section",
      "type": "registry:block",
      "title": "Hero Section",
      "description": "A props-driven landing hero with eyebrow, dual CTAs, social-proof bar and an optional visual that collapses to a centred column when omitted.",
      "files": [
        {
          "path": "src/registry/blocks/hero-section.tsx",
          "type": "registry:block"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "feature-grid",
      "type": "registry:block",
      "title": "Feature Grid",
      "description": "A four-state feature section: equal-weight icon cards with optional real \"learn more\" links, and no cap on how many render.",
      "files": [
        {
          "path": "src/registry/blocks/feature-grid.tsx",
          "type": "registry:block"
        },
        {
          "path": "src/registry/blocks/feature-grid.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "cta-band",
      "type": "registry:block",
      "title": "CTA Band",
      "description": "A closing call-to-action strip \u2014 headline, supporting line and a primary/secondary CTA pair, in four surfaces (plain, card, muted, accent) and row or stacked layouts.",
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "src/registry/blocks/cta-band.tsx",
          "type": "registry:block"
        }
      ]
    },
    {
      "name": "logo-cloud",
      "type": "registry:block",
      "title": "Logo Cloud",
      "description": "A trusted-by logo wall that optically equalises logos of wildly different aspect ratios, as a static grid or a reduced-motion-aware marquee.",
      "files": [
        {
          "path": "src/registry/blocks/logo-cloud.tsx",
          "type": "registry:block"
        },
        {
          "path": "src/registry/blocks/logo-cloud.contract.ts",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ],
      "dependencies": [
        "zod"
      ]
    },
    {
      "name": "newsletter-signup",
      "type": "registry:block",
      "title": "Newsletter Signup",
      "description": "An email capture band driven by a real submit state machine: zod validation, a duplicate-submit guard, a role=status confirmation, an idempotent already-subscribed branch, and a failure that keeps the address you typed.",
      "dependencies": [
        "zod",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "src/registry/blocks/newsletter-signup.tsx",
          "type": "registry:block"
        }
      ]
    },
    {
      "name": "site-footer",
      "type": "registry:block",
      "title": "Site Footer",
      "description": "A contract-driven site footer: brand block with named social links, collapsible link columns on mobile, and a legal bottom bar with an optional locale switcher.",
      "files": [
        {
          "path": "src/registry/blocks/site-footer.tsx",
          "type": "registry:block"
        },
        {
          "path": "src/registry/blocks/site-footer.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "team-grid",
      "type": "registry:block",
      "title": "Team Grid",
      "description": "A four-state team section with equal-height member cards, initials-fallback avatars, real social links and optional department grouping.",
      "files": [
        {
          "path": "src/registry/blocks/team-grid.tsx",
          "type": "registry:block"
        },
        {
          "path": "src/registry/blocks/team-grid.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "contact-section",
      "type": "registry:block",
      "title": "Contact Section",
      "description": "A contact block built around its submit state machine: zod-validated name/email/topic/message, a duplicate-submit guard, a confirmation panel that names the address it replied to, and a failure that keeps every character you typed \u2014 beside contact rows whose mailto:/tel:/map links are derived from their own values.",
      "dependencies": [
        "zod",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "src/registry/blocks/contact-section.tsx",
          "type": "registry:block"
        }
      ]
    },
    {
      "name": "blog-card-grid",
      "type": "registry:block",
      "title": "Blog Card Grid",
      "description": "A four-state article grid: one stretched link per card (category and author stay independently clickable), a featured post that spans two columns, and deliberate, configurable line clamping so mismatched title lengths still line up.",
      "files": [
        {
          "path": "src/registry/blocks/blog-card-grid.tsx",
          "type": "registry:block"
        },
        {
          "path": "src/registry/blocks/blog-card-grid.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "auth-card",
      "type": "registry:block",
      "title": "Auth Card",
      "description": "Sign-in, sign-up and reset in one card: a typed rejection union (bad credentials, address taken, rate limited), per-mode autocomplete tokens, a duplicate-submit guard, and input that survives every failure.",
      "dependencies": [
        "zod",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "src/registry/blocks/auth-card.tsx",
          "type": "registry:block"
        }
      ]
    },
    {
      "name": "dashboard-shell",
      "type": "registry:block",
      "title": "Dashboard Shell",
      "description": "An app shell with a pinned top bar, a collapsible icon rail and a main region that is the page's only scroll container \u2014 on mobile the sidebar becomes a scroll-locked, focus-trapped drawer.",
      "files": [
        {
          "path": "src/registry/blocks/dashboard-shell.tsx",
          "type": "registry:block"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "integration-grid",
      "type": "registry:block",
      "title": "Integration Grid",
      "description": "A four-state integrations directory: debounced search and category facets that really filter, a live result count, and per-card connect / disconnect with pending, error and retry.",
      "files": [
        {
          "path": "src/registry/blocks/integration-grid.tsx",
          "type": "registry:block"
        },
        {
          "path": "src/registry/blocks/integration-grid.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils",
        "https://ui.zyeon.ai/r/use-debounce-value.json"
      ]
    },
    {
      "name": "metric-overview",
      "type": "registry:block",
      "title": "Metric Overview",
      "description": "A dashboard KPI row \u2014 one shared range switcher over comparable cards, deltas coloured by each metric's polarity, and a sparkline per card.",
      "files": [
        {
          "path": "src/registry/blocks/metric-overview.tsx",
          "type": "registry:block"
        },
        {
          "path": "src/registry/blocks/metric-overview.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "recharts",
        "lucide-react"
      ],
      "registryDependencies": [
        "chart",
        "utils"
      ]
    },
    {
      "name": "error-page",
      "type": "registry:block",
      "title": "Error Page",
      "description": "A full-viewport error page for 404 / 403 / 500 / offline / maintenance \u2014 per-type copy and advice, a back button that degrades when the history stack is empty, live online status, and a copyable error ID behind collapsed diagnostics.",
      "files": [
        {
          "path": "src/registry/blocks/error-page.tsx",
          "type": "registry:block"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils",
        "https://ui.zyeon.ai/r/use-copy-to-clipboard.json",
        "https://ui.zyeon.ai/r/use-online.json"
      ]
    },
    {
      "name": "roadmap-board",
      "type": "registry:block",
      "title": "Roadmap Board",
      "description": "A public product roadmap in planned / in-progress / shipped lanes, with optimistic upvoting that rolls back and reports the failure, per-lane empty states and real loading/empty/error branches.",
      "files": [
        {
          "path": "src/registry/blocks/roadmap-board.tsx",
          "type": "registry:block"
        },
        {
          "path": "src/registry/blocks/roadmap-board.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "job-listings",
      "type": "registry:block",
      "title": "Job Listings",
      "description": "A four-state careers board: roles grouped by department, three filters that really combine (department, location, remote-only), a live result count, and salary ranges whose absence is spelled out instead of left blank.",
      "files": [
        {
          "path": "src/registry/blocks/job-listings.tsx",
          "type": "registry:block"
        },
        {
          "path": "src/registry/blocks/job-listings.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "git-graph",
      "type": "registry:ui",
      "title": "Git Graph",
      "description": "A commit-DAG viewer with reusable swimlanes \u2014 topological ordering, lane reuse after merges, orphan roots, shallow-history tails, copyable full hashes and four data states.",
      "files": [
        {
          "path": "src/registry/ui/git-graph.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/git-graph.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils",
        "https://ui.zyeon.ai/r/use-copy-to-clipboard.json"
      ]
    },
    {
      "name": "poll-results",
      "type": "registry:ui",
      "title": "Poll Results",
      "description": "A poll / survey result readout \u2014 one bar per option with largest-remainder percentages that always total exactly 100%, tie-aware leader badges, a your-vote marker, and a ballot view that hides the counts until the visitor votes.",
      "files": [
        {
          "path": "src/registry/ui/poll-results.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/poll-results.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "resource-usage",
      "type": "registry:ui",
      "title": "Resource Usage",
      "description": "A quota panel for heterogeneous resources \u2014 per-unit formatting (1024-based bytes, throughput, duration, cores, counts, money), unlimited rows with no bar at all, rescaled over-quota tracks, collapsible groups and usage sorting.",
      "files": [
        {
          "path": "src/registry/ui/resource-usage.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/resource-usage.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "metric-comparison",
      "type": "registry:ui",
      "title": "Metric Comparison",
      "description": "A period-over-period comparison table \u2014 current, previous, absolute change and change %, with polarity-aware tone, sortable columns, expandable breakdowns and four data states.",
      "files": [
        {
          "path": "src/registry/ui/metric-comparison.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/metric-comparison.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "token-usage-meter",
      "type": "registry:ui",
      "title": "Token Usage Meter",
      "description": "An LLM quota panel \u2014 tokens used vs quota, split by model with separate input/output prices, an exact cost estimate, days to reset and a burn-rate projection, in four contract-driven states.",
      "files": [
        {
          "path": "src/registry/ui/token-usage-meter.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/token-usage-meter.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "tool-call-trace",
      "type": "registry:ui",
      "title": "Tool Call Trace",
      "description": "An agent's tool-call tree \u2014 nested sub-calls with a capped indent, structured args and results in expandable JSON, one shared duration unit, first-class running/failed calls, and real loading/empty/error states.",
      "files": [
        {
          "path": "src/registry/ui/tool-call-trace.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/tool-call-trace.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils",
        "https://ui.zyeon.ai/r/json-viewer.json"
      ]
    },
    {
      "name": "event-card",
      "type": "registry:ui",
      "title": "Event Card",
      "description": "An event card whose calendar tear-off survives cross-day, cross-month and cross-year spans, formats every instant in an explicit IANA zone, and drives an ordered capacity machine where ended outranks the seat count.",
      "files": [
        {
          "path": "src/registry/ui/event-card.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils",
        "https://ui.zyeon.ai/r/avatar-group.json"
      ]
    },
    {
      "name": "keyboard-map",
      "type": "registry:ui",
      "title": "Keyboard Map",
      "description": "A keyboard layout diagram with your app's shortcuts painted onto the caps \u2014 platform-correct glyphs and modifier order (\u2318 \u2325 vs Ctrl Alt), whole-chord highlighting, and a readable binding list.",
      "files": [
        {
          "path": "src/registry/ui/keyboard-map.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "csv-import",
      "type": "registry:ui",
      "title": "CSV Import",
      "description": "A three-step CSV importer \u2014 RFC 4180 parsing (quoted delimiters, embedded newlines, doubled quotes), delimiter and BOM detection, auto-guessed column mapping with duplicate and required-field gates, and a capped preview that reports ragged rows by line number.",
      "files": [
        {
          "path": "src/registry/ui/csv-import.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils",
        "https://ui.zyeon.ai/r/dropzone.json"
      ]
    },
    {
      "name": "recurrence-picker",
      "type": "registry:ui",
      "title": "Recurrence Picker",
      "description": "A calendar-language repeat editor that writes an RFC 5545 RRULE \u2014 frequency, interval, weekday chips, \"second Tuesday\" / \"last day of the month\", and a Never / N times / until-date ending \u2014 with the next dates previewed from the same rule evaluator.",
      "files": [
        {
          "path": "src/registry/ui/recurrence-picker.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "seat-picker",
      "type": "registry:ui",
      "title": "Seat Picker",
      "description": "A zoomable SVG venue map for picking seats \u2014 section/row/seat keyboard navigation, per-seat spoken names, shape+pattern status encoding, a list fallback, max-seat and no-orphan rules.",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "src/registry/ui/seat-picker.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "variant-selector",
      "type": "registry:ui",
      "title": "Variant Selector",
      "description": "Multi-dimension product options resolved against a sparse SKU matrix \u2014 impossible combinations stay visible and struck through, availability converges from either direction, and dead ends name the one dimension to change.",
      "files": [
        {
          "path": "src/registry/ui/variant-selector.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "model-selector",
      "type": "registry:ui",
      "title": "Model Selector",
      "description": "An LLM model picker whose options carry context window, per-million input/output rates, capability badges and real availability \u2014 and can be filtered and sorted by them.",
      "files": [
        {
          "path": "src/registry/ui/model-selector.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "pdf-viewer",
      "type": "registry:ui",
      "title": "PDF Viewer",
      "description": "A document viewer shell with a pluggable render layer \u2014 controlled paging synced to scroll, fit-width/fit-page zoom that re-fits on resize, thumbnail rail, text search, keyboard and pinch, named loading/404/damaged/encrypted states, and a native <object> fallback.",
      "files": [
        {
          "path": "src/registry/ui/pdf-viewer.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils",
        "https://ui.zyeon.ai/r/use-controllable-state.json"
      ]
    },
    {
      "name": "video-timeline",
      "type": "registry:ui",
      "title": "Video Timeline",
      "description": "A controlled scrub track with chapter-segmented rail, buffered ranges, keyframe hover previews and draggable in/out trim handles \u2014 delta dragging, frame-accurate keys, no player attached.",
      "files": [
        {
          "path": "src/registry/ui/video-timeline.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "qr-scanner",
      "type": "registry:ui",
      "title": "QR Scanner",
      "description": "A camera QR reader on the native BarcodeDetector with a pluggable decoder \u2014 an enforced scan frame, a throttled decode loop, a per-value cooldown, an image fallback, and a camera that is always released.",
      "files": [
        {
          "path": "src/registry/ui/qr-scanner.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils",
        "https://ui.zyeon.ai/r/use-permission.json"
      ]
    },
    {
      "name": "pagination-cursor",
      "type": "registry:ui",
      "title": "Cursor Pagination",
      "description": "A load-more control for cursor APIs \u2014 a synchronous in-flight guard so one cursor is never fetched twice, an optional intersection sentinel with a burst budget, retry that keeps the loaded rows, and a live-region count.",
      "files": [
        {
          "path": "src/registry/ui/pagination-cursor.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils",
        "https://ui.zyeon.ai/r/use-intersection-observer.json"
      ]
    },
    {
      "name": "tab-overflow",
      "type": "registry:ui",
      "title": "Tab Overflow",
      "description": "A measured tab strip that folds the tabs it cannot fit into a \"More\" menu \u2014 real tablist semantics, the selected tab is never collapsed, and no breakpoints anywhere.",
      "files": [
        {
          "path": "src/registry/ui/tab-overflow.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils",
        "https://ui.zyeon.ai/r/use-roving-tabindex.json"
      ]
    },
    {
      "name": "rate-limit-notice",
      "type": "registry:ui",
      "title": "Rate Limit Notice",
      "description": "A 429 panel whose cooldown recomputes from an absolute target instant, so a suspended tab wakes up to the right number \u2014 auto-unlock with milestone-only announcements and no auto-retry, remaining quota with icon/word/outline urgency, consecutive-backoff labelling and an upgrade CTA.",
      "files": [
        {
          "path": "src/registry/ui/rate-limit-notice.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "conflict-resolver",
      "type": "registry:ui",
      "title": "Conflict Resolver",
      "description": "A field-level three-way merge for concurrent edits \u2014 base/mine/theirs per field, only the genuinely conflicting fields asked about as radiogroups, bulk fill with per-field override, and a merged record on submit.",
      "files": [
        {
          "path": "src/registry/ui/conflict-resolver.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "settings-page",
      "type": "registry:block",
      "title": "Settings Page",
      "description": "A settings page shell \u2014 section nav, per-section save, and an unsaved-changes guard that stops a section switch with save / discard / cancel instead of dropping the edit.",
      "files": [
        {
          "path": "src/registry/blocks/settings-page.tsx",
          "type": "registry:block"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "alert-dialog",
        "button",
        "utils",
        "https://ui.zyeon.ai/r/toggle-switch.json"
      ]
    },
    {
      "name": "api-keys-panel",
      "type": "registry:block",
      "title": "API Keys Panel",
      "description": "A four-state API key manager built around show-the-secret-once \u2014 a forced acknowledgement before the reveal can be closed, a name-repeating revoke confirmation, and lifecycle plus never-used called out per key.",
      "files": [
        {
          "path": "src/registry/blocks/api-keys-panel.tsx",
          "type": "registry:block"
        },
        {
          "path": "src/registry/blocks/api-keys-panel.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils",
        "button",
        "dialog",
        "https://ui.zyeon.ai/r/confirm-dialog.json",
        "https://ui.zyeon.ai/r/use-copy-to-clipboard.json"
      ]
    },
    {
      "name": "chart-sankey",
      "type": "registry:ui",
      "title": "Sankey Diagram",
      "description": "A four-state Sankey diagram that checks the books before it draws: flow conservation per node, cycle detection, longest-path layering, cross-layer ribbons and a minimum ribbon width, with an sr-only flow table.",
      "files": [
        {
          "path": "src/registry/ui/chart-sankey.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/chart-sankey.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "recharts"
      ],
      "registryDependencies": [
        "chart",
        "utils",
        "https://ui.zyeon.ai/r/use-resize-observer.json"
      ]
    },
    {
      "name": "chart-cohort-retention",
      "type": "registry:ui",
      "title": "Cohort Retention Grid",
      "description": "A triangular cohort-retention table \u2014 one row per entry cohort, one column per period since signup, cells that carry both a colour-graded rate and its absolute count, with unobserved periods left blank instead of zeroed.",
      "files": [
        {
          "path": "src/registry/ui/chart-cohort-retention.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/chart-cohort-retention.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "chart-heatmap-matrix",
      "type": "registry:ui",
      "title": "Heatmap Matrix",
      "description": "A rows \u00d7 columns value grid with sequential and diverging colour scales \u2014 the diverging arms stay symmetric around the centre, the domain is fixable so two grids stay comparable, and missing values never render as zero.",
      "files": [
        {
          "path": "src/registry/ui/chart-heatmap-matrix.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/chart-heatmap-matrix.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "chart-bar-grouped",
      "type": "registry:ui",
      "title": "Grouped Bar Chart",
      "description": "A four-state grouped bar chart that flips to horizontal rows when columns would go under 10px, textures every series so colour is never the only cue, and keeps missing readings distinct from measured zeros.",
      "files": [
        {
          "path": "src/registry/ui/chart-bar-grouped.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/chart-bar-grouped.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "recharts"
      ],
      "registryDependencies": [
        "chart",
        "utils",
        "https://ui.zyeon.ai/r/use-resize-observer.json"
      ]
    },
    {
      "name": "use-optimistic",
      "type": "registry:hook",
      "title": "useOptimistic",
      "description": "Keyed optimistic updates for plain props and event handlers: props always reclaim a stale overlay so counters cannot drift, sync throws become rejections, repeat clicks on a pending key are refused, out-of-order resolves lose, and failures roll back with a readable error.",
      "files": [
        {
          "path": "src/registry/hooks/use-optimistic.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-event-source",
      "type": "registry:hook",
      "title": "useEventSource",
      "description": "Subscribe to a Server-Sent Events stream with a four-state connection machine, capped exponential-backoff reconnects, named-event subscriptions and callbacks that never re-open the stream.",
      "files": [
        {
          "path": "src/registry/hooks/use-event-source.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-query-param",
      "type": "registry:hook",
      "title": "useQueryParam",
      "description": "An SSR-safe hook that keeps a piece of state in a URL query parameter, with typed codecs, defaults kept out of the link, replace-by-default history and every instance on the page in sync.",
      "files": [
        {
          "path": "src/registry/hooks/use-query-param.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-indexed-db",
      "type": "registry:hook",
      "title": "useIndexedDb",
      "description": "An async IndexedDB-backed store hook: loading state, versioned upgrades, blocked-deadlock handling, quota errors, key-range queries and cross-tab invalidation.",
      "registryDependencies": [
        "https://ui.zyeon.ai/r/use-broadcast-channel.json"
      ],
      "files": [
        {
          "path": "src/registry/hooks/use-indexed-db.tsx",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "scrollbar-styles",
      "type": "registry:ui",
      "title": "Scrollbar Styles",
      "description": "Six presets that re-skin the browser's own scrollbar in pure CSS \u2014 no JavaScript, no drawn thumb, and one capability-tiered sheet that keeps `::-webkit-scrollbar` and `scrollbar-width` from cancelling each other out.",
      "files": [
        {
          "path": "src/registry/ui/scrollbar-styles.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "chart-pareto",
      "type": "registry:ui",
      "title": "Pareto Chart",
      "description": "A four-state Pareto chart: bars ranked high to low with a cumulative-percentage curve on a second axis, a configurable 80% line, and the crossing bar named.",
      "files": [
        {
          "path": "src/registry/ui/chart-pareto.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/chart-pareto.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "recharts"
      ],
      "registryDependencies": [
        "chart",
        "utils"
      ]
    },
    {
      "name": "chart-boxplot",
      "type": "registry:ui",
      "title": "Box Plot",
      "description": "A four-state box plot comparing distributions side by side: R-7 quartiles, Tukey 1.5\u00d7IQR whiskers on real observations, de-overlapped outliers, and raw points for groups too small for quartiles.",
      "files": [
        {
          "path": "src/registry/ui/chart-boxplot.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/chart-boxplot.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "recharts"
      ],
      "registryDependencies": [
        "chart",
        "utils"
      ]
    },
    {
      "name": "chart-bump",
      "type": "registry:ui",
      "title": "Bump Chart",
      "description": "A four-state bump chart: one line per entity on a reversed integer position scale, competition ranking for ties, edge labels at both ends, and a broken line wherever an entity is off the board.",
      "files": [
        {
          "path": "src/registry/ui/chart-bump.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/chart-bump.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "recharts"
      ],
      "registryDependencies": [
        "chart",
        "utils",
        "https://ui.zyeon.ai/r/use-resize-observer.json"
      ]
    },
    {
      "name": "chart-slope",
      "type": "registry:ui",
      "title": "Slope Chart",
      "description": "A four-state slope chart for two points in time: labels at both ends, a pooling avoidance pass that never moves the points, leader lines back to the real endpoint, and a same-unit refusal.",
      "files": [
        {
          "path": "src/registry/ui/chart-slope.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/chart-slope.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod"
      ],
      "registryDependencies": [
        "utils",
        "https://ui.zyeon.ai/r/use-resize-observer.json"
      ]
    },
    {
      "name": "billing-history",
      "type": "registry:block",
      "title": "Billing History",
      "description": "A four-state invoice list \u2014 per-currency money through Intl, a six-state lifecycle with partial-refund arithmetic, real filters and pagination, and PDF links that never render as dead buttons.",
      "files": [
        {
          "path": "src/registry/blocks/billing-history.tsx",
          "type": "registry:block"
        },
        {
          "path": "src/registry/blocks/billing-history.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "notification-preferences",
      "type": "registry:block",
      "title": "Notification Preferences",
      "description": "An events \u00d7 channels notification matrix that saves as you toggle: per-switch pending and single-switch rollback on failure, locked always-on rows, a disconnected channel column with a real Connect entry point, row/column bulk actions with a bulk-vs-manual marker, and a quiet-hours window that wraps past midnight.",
      "files": [
        {
          "path": "src/registry/blocks/notification-preferences.tsx",
          "type": "registry:block"
        },
        {
          "path": "src/registry/blocks/notification-preferences.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "two-factor-setup",
      "type": "registry:block",
      "title": "Two-Factor Setup",
      "description": "The enable-2FA flow around its one irreversible step \u2014 QR plus a copyable manual key, a six-digit check whose attempt budget only ever goes down, and recovery codes rendered once behind a finish button that refuses to fire until they are saved.",
      "files": [
        {
          "path": "src/registry/blocks/two-factor-setup.tsx",
          "type": "registry:block"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils",
        "https://ui.zyeon.ai/r/otp-input.json",
        "https://ui.zyeon.ai/r/qr-code.json",
        "https://ui.zyeon.ai/r/use-copy-to-clipboard.json"
      ]
    },
    {
      "name": "usage-dashboard",
      "type": "registry:block",
      "title": "Usage Dashboard",
      "description": "A period-scoped usage block \u2014 headline, quota bar, cumulative burn-up curve and per-dimension breakdown all derived from one bucket array, so the four readouts cannot disagree; run-rate projection stated apart from actual usage, and period switches that never put a new label over old figures.",
      "files": [
        {
          "path": "src/registry/blocks/usage-dashboard.tsx",
          "type": "registry:block"
        },
        {
          "path": "src/registry/blocks/usage-dashboard.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "recharts",
        "lucide-react"
      ],
      "registryDependencies": [
        "chart",
        "utils"
      ]
    },
    {
      "name": "empty-dashboard",
      "type": "registry:block",
      "title": "Empty Dashboard",
      "description": "A first-run dashboard: welcome copy, a setup checklist whose progress counts done separately from skipped, a labelled skeleton of the filled dashboard, and a confirmed sample-data escape hatch \u2014 the block renders nothing once nothing is left to do.",
      "files": [
        {
          "path": "src/registry/blocks/empty-dashboard.tsx",
          "type": "registry:block"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "search-results",
      "type": "registry:block",
      "title": "Search Results",
      "description": "A four-state search results page \u2014 query echo, keyword highlighting, faceted type/recency/tag filters whose counts are the real post-click result count, and pagination that snaps back to page 1 on every filter change.",
      "files": [
        {
          "path": "src/registry/blocks/search-results.tsx",
          "type": "registry:block"
        },
        {
          "path": "src/registry/blocks/search-results.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils",
        "https://ui.zyeon.ai/r/search-highlight.json"
      ]
    },
    {
      "name": "checkout-form",
      "type": "registry:block",
      "title": "Checkout Form",
      "description": "A one-page checkout \u2014 contact, delivery address, payment method and an order summary whose delivery, tax and payment fee are derived from the form in the same render, in integer minor units, so the lines always add up to the button and the money can never lag the address.",
      "dependencies": [
        "zod",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils",
        "https://ui.zyeon.ai/r/credit-card-form.json"
      ],
      "files": [
        {
          "path": "src/registry/blocks/checkout-form.tsx",
          "type": "registry:block"
        }
      ]
    },
    {
      "name": "order-confirmation",
      "type": "registry:block",
      "title": "Order Confirmation",
      "description": "A post-checkout receipt block \u2014 a dictatable, one-click-copyable order number, an itemised table whose money is refined to add up, a delivery window rather than a promised day, ship / pickup / digital fulfillment, and print styles that keep it on paper.",
      "files": [
        {
          "path": "src/registry/blocks/order-confirmation.tsx",
          "type": "registry:block"
        },
        {
          "path": "src/registry/blocks/order-confirmation.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils",
        "https://ui.zyeon.ai/r/use-copy-to-clipboard.json"
      ]
    },
    {
      "name": "feature-comparison",
      "type": "registry:block",
      "title": "Feature Comparison",
      "description": "A dated us-vs-competitors capability table \u2014 yes / partial / no / not-disclosed told apart by shape and word, numeric rows with a per-row unit, a frozen capability column, and a verified-on date measured against an injected now.",
      "files": [
        {
          "path": "src/registry/blocks/feature-comparison.tsx",
          "type": "registry:block"
        },
        {
          "path": "src/registry/blocks/feature-comparison.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "case-study-grid",
      "type": "registry:block",
      "title": "Case Study Grid",
      "description": "A four-state customer-story grid where the quantified result is the first-class field: every metric carries value, unit, direction and a required baseline (or says \"No baseline captured\"), industry and company-size facets really filter with truthful counts, and logos of any aspect ratio are optically area-matched.",
      "files": [
        {
          "path": "src/registry/blocks/case-study-grid.tsx",
          "type": "registry:block"
        },
        {
          "path": "src/registry/blocks/case-study-grid.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "feature-flag-list",
      "type": "registry:ui",
      "title": "Feature Flag List",
      "description": "A per-environment feature flag table \u2014 production toggles gated behind a confirmation that repeats the flag key, rollout percentage kept orthogonal to on/off, optimistic switches that roll back one at a time, expandable targeting rules, and real loading/empty/error states.",
      "files": [
        {
          "path": "src/registry/ui/feature-flag-list.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/feature-flag-list.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils",
        "https://ui.zyeon.ai/r/confirm-dialog.json",
        "https://ui.zyeon.ai/r/toggle-switch.json",
        "https://ui.zyeon.ai/r/use-optimistic.json"
      ]
    },
    {
      "name": "webhook-log",
      "type": "registry:ui",
      "title": "Webhook Log",
      "description": "A webhook delivery log with the retry lifecycle built in \u2014 outcome classes that keep timeouts separate from status codes, a countdown to the next attempt derived from an injected clock, masked credential headers, collapsed payloads with honest truncation, and a guarded replay confirmation.",
      "files": [
        {
          "path": "src/registry/ui/webhook-log.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/webhook-log.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils",
        "https://ui.zyeon.ai/r/json-viewer.json"
      ]
    },
    {
      "name": "citation-list",
      "type": "registry:ui",
      "title": "Citation List",
      "description": "The numbered reference list under an AI answer \u2014 numbering derived the same way Citation Chip derives it so the markers and the list always agree, repeated sources merged with a citation count, graded trust that never relies on colour, and sources with no usable URL that refuse to become dead links.",
      "files": [
        {
          "path": "src/registry/ui/citation-list.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/citation-list.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "dependency-list",
      "type": "registry:ui",
      "title": "Dependency List",
      "description": "An auditable dependency tree \u2014 real semver comparison, graded staleness, ordered CVE severities, licence obligation classes, and the import chain behind every transitive package.",
      "files": [
        {
          "path": "src/registry/ui/dependency-list.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/dependency-list.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "sla-report",
      "type": "registry:ui",
      "title": "SLA Report",
      "description": "A contract-side availability settlement \u2014 real period length, overlap-merged downtime, weighted or worst-service composite, an error budget that is allowed to read past 100%, and the service-credit rung the period landed on.",
      "files": [
        {
          "path": "src/registry/ui/sla-report.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/sla-report.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "screen-recorder",
      "type": "registry:ui",
      "title": "Screen Recorder",
      "description": "A real getDisplayMedia screen recorder \u2014 surface picker, optional microphone mixdown, live duration and size, and a preview you can download.",
      "files": [
        {
          "path": "src/registry/ui/screen-recorder.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "audio-transcript",
      "type": "registry:ui",
      "title": "Audio Transcript",
      "description": "A timestamped, speaker-labelled transcript synced to a playhead \u2014 the spoken line highlights and stays in view until the reader scrolls away, any line seeks to its exact start, and search steps through every hit.",
      "files": [
        {
          "path": "src/registry/ui/audio-transcript.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "fit-text",
      "type": "registry:ui",
      "title": "Fit Text",
      "description": "One line of text scaled until it exactly fills the width it was given \u2014 headline, KPI number or cover title, sized from a real browser measurement instead of an estimate.",
      "files": [
        {
          "path": "src/registry/ui/fit-text.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "balanced-heading",
      "type": "registry:ui",
      "title": "Balanced Heading",
      "description": "A heading that breaks its lines to even lengths instead of stranding one word on the last line \u2014 pure CSS text-wrap with a copy-safe fallback for engines that lack it.",
      "files": [
        {
          "path": "src/registry/ui/balanced-heading.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "pull-quote",
      "type": "registry:ui",
      "title": "Pull Quote",
      "description": "Editorial pull quote for body copy: centered, floated left/right with the text wrapping around it, or bled past the measure \u2014 figure + blockquote + figcaption, with a decorative quote mark that never lands in the clipboard.",
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "src/registry/ui/pull-quote.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "link-underline",
      "type": "registry:ui",
      "title": "Link Underline",
      "description": "Underline motion for inline body links \u2014 slide, center, wipe or thicken \u2014 drawn per line box so wrapped links keep a rule on every line, with descender clearance, a focus ring hover never draws, and text-decoration fallbacks for reduced motion, forced colors and print.",
      "dependencies": [
        "radix-ui"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "src/registry/ui/link-underline.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "install-pwa-button",
      "type": "registry:ui",
      "title": "Install PWA Button",
      "description": "An install CTA that catches beforeinstallprompt at module scope so a late-mounting button still gets it, and renders nothing at all when the app is installed, was refused recently, or cannot be installed here.",
      "files": [
        {
          "path": "src/registry/ui/install-pwa-button.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "record-button",
      "type": "registry:ui",
      "title": "Record Button",
      "description": "A record control with an idle \u2192 recording \u2192 processing \u2192 done state machine \u2014 drift-free elapsed timer, minimum/maximum take guards, and an optional hold-to-record gesture with slide-away cancel.",
      "files": [
        {
          "path": "src/registry/ui/record-button.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "voronoi-cells",
      "type": "registry:ui",
      "title": "Voronoi Cells",
      "description": "A slowly flowing Voronoi diagram on one canvas \u2014 organic cell walls, a tinted mosaic or separated pebbles, seeded so the same field comes back every time.",
      "files": [
        {
          "path": "src/registry/ui/voronoi-cells.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "bokeh-lights",
      "type": "registry:ui",
      "title": "Bokeh Lights",
      "description": "Slowly floating out-of-focus light discs on one canvas \u2014 seeded for a reproducible picture, painted from a pre-rendered sprite instead of a per-frame blur, with an opacity lever that keeps overlaid copy readable.",
      "files": [
        {
          "path": "src/registry/ui/bokeh-lights.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "scanlines",
      "type": "registry:ui",
      "title": "Scanlines",
      "description": "A CRT line grille whose pitch is snapped to the display's physical pixel grid, with an optional one-pixel-per-step roll and a WCAG-clamped flicker.",
      "files": [
        {
          "path": "src/registry/ui/scanlines.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "chat-sidebar",
      "type": "registry:ui",
      "title": "Chat Sidebar",
      "description": "A conversation-history sidebar \u2014 calendar-day groups cut in the display time zone, in-place rename with rollback, delete confirmed by title, pinning, local search with its own no-match state, and real loading/empty/error branches.",
      "files": [
        {
          "path": "src/registry/ui/chat-sidebar.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/chat-sidebar.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils",
        "dropdown-menu",
        "https://ui.zyeon.ai/r/confirm-dialog.json"
      ]
    },
    {
      "name": "chat-window",
      "type": "registry:ui",
      "title": "Chat Window",
      "description": "A chat shell in three presentations \u2014 inline, docked and modal \u2014 with a focus trap, refcounted scroll lock and a resizable dock, that never re-creates the panel when you switch.",
      "files": [
        {
          "path": "src/registry/ui/chat-window.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "streaming-text",
      "type": "registry:ui",
      "title": "Streaming Text",
      "description": "An incremental Markdown renderer for LLM output \u2014 finished blocks are frozen, half-written markup is closed speculatively, the caret rides the last character and screen readers hear the answer once.",
      "files": [
        {
          "path": "src/registry/ui/streaming-text.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "message-list",
      "type": "registry:ui",
      "title": "Message List",
      "description": "An AI transcript whose scroll behaves \u2014 glued to the newest token while streaming, released the instant the reader scrolls up, anchored when older pages land, and windowed so a 1000-turn thread stays a dozen nodes wide.",
      "files": [
        {
          "path": "src/registry/ui/message-list.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/message-list.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "chat-composer",
      "type": "registry:ui",
      "title": "Chat Composer",
      "description": "A managed chat composer: one send\u21c4stop button slot, optimistic draft clear with restore-on-failure, AbortSignal handoff, IME-safe Enter and attachments with their own upload lifecycle.",
      "files": [
        {
          "path": "src/registry/ui/chat-composer.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils",
        "https://ui.zyeon.ai/r/autosize-textarea.json"
      ]
    },
    {
      "name": "message-actions",
      "type": "registry:ui",
      "title": "Message Actions",
      "description": "The action bar under one chat message \u2014 revealed by hover, focus and touch alike (never hover alone), costing zero layout, with copy in either Markdown or plain text, an exclusive thumbs tri-state, a streaming-safe Regenerate and speech that stops when the message unmounts.",
      "files": [
        {
          "path": "src/registry/ui/message-actions.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils",
        "dropdown-menu",
        "https://ui.zyeon.ai/r/use-copy-to-clipboard.json",
        "https://ui.zyeon.ai/r/use-controllable-state.json"
      ]
    },
    {
      "name": "reasoning-block",
      "type": "registry:ui",
      "title": "Reasoning Block",
      "description": "A collapsible model-reasoning panel driven by the stream's lifecycle \u2014 auto-opens while tokens arrive, auto-collapses when they stop, and permanently stands down once the reader touches it.",
      "files": [
        {
          "path": "src/registry/ui/reasoning-block.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "tool-call-card",
      "type": "registry:ui",
      "title": "Tool Call Card",
      "description": "One agent tool call inline in a conversation \u2014 a first-class approval gate with a one-shot Approve/Decline, structured args and results, key-based redaction that keeps secrets out of the DOM, announced truncation for huge payloads, and real loading/empty/error states.",
      "files": [
        {
          "path": "src/registry/ui/tool-call-card.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/tool-call-card.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils",
        "https://ui.zyeon.ai/r/json-viewer.json",
        "https://ui.zyeon.ai/r/use-copy-to-clipboard.json"
      ]
    },
    {
      "name": "citation-chip",
      "type": "registry:ui",
      "title": "Citation Chip",
      "description": "The inline [n] marker that trails a sentence in an AI answer \u2014 an inline box that cannot change the paragraph's line height, with a source card portalled past every clipping bubble.",
      "files": [
        {
          "path": "src/registry/ui/citation-chip.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "suggested-prompts",
      "type": "registry:ui",
      "title": "Suggested Prompts",
      "description": "Click-to-send conversation starters and follow-ups \u2014 a wrapping strip of one-shot cards that latches after the first pick, goes inert while the assistant streams, and re-rolls without collapsing the row.",
      "files": [
        {
          "path": "src/registry/ui/suggested-prompts.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/suggested-prompts.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils",
        "https://ui.zyeon.ai/r/use-roving-tabindex.json"
      ]
    },
    {
      "name": "artifact-panel",
      "type": "registry:ui",
      "title": "Artifact Panel",
      "description": "A side panel for the file the assistant keeps rewriting \u2014 a revision rail with the prompt behind each one, preview / source / changes, per-revision scroll memory, and copy plus download that always take the revision you are looking at.",
      "files": [
        {
          "path": "src/registry/ui/artifact-panel.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/artifact-panel.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils",
        "https://ui.zyeon.ai/r/streaming-text.json"
      ]
    },
    {
      "name": "agent-steps",
      "type": "registry:ui",
      "title": "Agent Steps",
      "description": "A live agent run whose plan is still being written \u2014 steps stream in without moving what is already on screen, failures retry in place, and a replan cancels the rest of the plan instead of failing it.",
      "files": [
        {
          "path": "src/registry/ui/agent-steps.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/agent-steps.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "context-attachments",
      "type": "registry:ui",
      "title": "Context Attachments",
      "description": "The context list attached to a conversation \u2014 files, links, snippets and selections with their token cost, under a budget meter that spells out reserve + attachments = used and names exactly which entries get dropped when the window overflows.",
      "files": [
        {
          "path": "src/registry/ui/context-attachments.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/context-attachments.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "prompt-library",
      "type": "registry:ui",
      "title": "Prompt Library",
      "description": "A saved-prompt library with fill-in-the-blank templates \u2014 search across title, body and tags, faceted categories, a variable form ordered by first appearance, and a preview that is character-for-character what gets inserted.",
      "files": [
        {
          "path": "src/registry/ui/prompt-library.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/prompt-library.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "zod",
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "message-branch",
      "type": "registry:ui",
      "title": "Message Branch",
      "description": "A compact pager for the sibling variants of one reply \u2014 an id-stable selection that survives late arrivals, follow-the-tip on regenerate, ends that never steal focus, and one announcement per move.",
      "files": [
        {
          "path": "src/registry/ui/message-branch.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "chat-day-divider",
      "type": "registry:ui",
      "title": "Chat Day Divider",
      "description": "A muted separator for chat transcripts \u2014 day chip, unread watermark and context event \u2014 that derives Today/Yesterday from calendar days, relabels itself at local midnight, and can pin to the top while its day scrolls.",
      "files": [
        {
          "path": "src/registry/ui/chat-day-divider.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "message-skeleton",
      "type": "registry:ui",
      "title": "Message Skeleton",
      "description": "A chat-shaped loading placeholder \u2014 seeded conversation rhythm, alternating bubbles or document rows, a sweep phase-shifted through the thread, and one late screen-reader announcement.",
      "files": [
        {
          "path": "src/registry/ui/message-skeleton.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "streaming-markdown",
      "type": "registry:ui",
      "title": "Streaming Markdown",
      "description": "A progressive Markdown renderer for LLM streams that paints only what can no longer change \u2014 the ambiguous tail waits in a buffer instead of flashing raw markup.",
      "files": [
        {
          "path": "src/registry/ui/streaming-markdown.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "streaming-table",
      "type": "registry:ui",
      "title": "Streaming Table",
      "description": "A table that renders while its rows are still arriving \u2014 the header locks the column geometry on frame one, cells still in flight shimmer in place, and the footer count settles into a total.",
      "files": [
        {
          "path": "src/registry/ui/streaming-table.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "streaming-code",
      "type": "registry:ui",
      "title": "Streaming Code",
      "description": "A code panel that renders while the model is still writing it \u2014 caret on the last line, frozen finished lines, regex tinting, copy-what-arrived and auto-scroll the reader can break.",
      "files": [
        {
          "path": "src/registry/ui/streaming-code.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "model-compare",
      "type": "registry:block",
      "title": "Model Compare",
      "description": "A side-by-side arena for two answers to one prompt \u2014 per-side streaming states, derived speed, optional blind names, and a vote that fires exactly once.",
      "files": [
        {
          "path": "src/registry/blocks/model-compare.tsx",
          "type": "registry:block"
        },
        {
          "path": "src/registry/blocks/model-compare.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "pinned-messages",
      "type": "registry:ui",
      "title": "Pinned Messages",
      "description": "A pinned-messages strip for a conversation \u2014 one chip per pin, as many as genuinely fit measured against the real container, the rest collapsed into a +N more panel, unpin behind a confirmation that fires once, and real loading/empty/error states.",
      "files": [
        {
          "path": "src/registry/ui/pinned-messages.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/pinned-messages.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "https://ui.zyeon.ai/r/popover.json",
        "utils"
      ]
    },
    {
      "name": "message-search",
      "type": "registry:ui",
      "title": "Message Search",
      "description": "In-conversation search that expands from an icon into a field \u2014 debounced dispatch, a hit counter walked with Enter and Shift+Enter, and a result list of role, time and an excerpt with the query emphasised.",
      "files": [
        {
          "path": "src/registry/ui/message-search.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "edit-message",
      "type": "registry:ui",
      "title": "Edit Message",
      "description": "In-place editor for a message that was already sent \u2014 it states how many replies the fork will drop, guards the draft on cancel, keeps it on a rejected resubmit, and never forks for unchanged text.",
      "files": [
        {
          "path": "src/registry/ui/edit-message.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "https://ui.zyeon.ai/r/autosize-textarea.json",
        "https://ui.zyeon.ai/r/use-controllable-state.json",
        "utils"
      ]
    },
    {
      "name": "quote-reply",
      "type": "registry:ui",
      "title": "Quote Reply",
      "description": "Quote-and-reply for a transcript \u2014 a floating Quote action over a text selection, a dismissible quote chip above the composer, and a whole-message fallback.",
      "files": [
        {
          "path": "src/registry/ui/quote-reply.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "conversation-summary",
      "type": "registry:ui",
      "title": "Conversation Summary",
      "description": "A compaction seam for long chats \u2014 a hairline marker that reports how many earlier messages were summarized, discloses the bullet summary, and offers a restore that can only fire once.",
      "files": [
        {
          "path": "src/registry/ui/conversation-summary.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "scroll-to-latest",
      "type": "registry:ui",
      "title": "Scroll To Latest",
      "description": "A floating jump-to-latest pill for a growing chat viewport \u2014 a sentinel decides when the reader has left the floor, arrivals since then ride in the badge, and one click re-pins follow mode.",
      "files": [
        {
          "path": "src/registry/ui/scroll-to-latest.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "read-aloud-button",
      "type": "registry:ui",
      "title": "Read Aloud Button",
      "description": "A per-message listen toggle \u2014 progress ring, tiny equalizer and a speed pill \u2014 driven by the browser's speech engine or by your own TTS callbacks.",
      "files": [
        {
          "path": "src/registry/ui/read-aloud-button.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "translation-toggle",
      "type": "registry:ui",
      "title": "Translation Toggle",
      "description": "A per-message translation affordance \u2014 a pill that names the detected source language, crossfades between original and translation while the box tweens between their measured heights, re-aims at another target language from a menu, and stands in with a skeleton shaped by the source while a request is in flight.",
      "files": [
        {
          "path": "src/registry/ui/translation-toggle.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "dropdown-menu",
        "https://ui.zyeon.ai/r/use-controllable-state.json",
        "utils"
      ]
    },
    {
      "name": "ai-disclaimer",
      "type": "registry:ui",
      "title": "AI Disclaimer",
      "description": "The 'AI can make mistakes. Check important info.' line \u2014 inline, banner and details-popover chromes, role=note so it never interrupts, and a one-shot dismissal that hands persistence to the app.",
      "files": [
        {
          "path": "src/registry/ui/ai-disclaimer.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "ai-badge",
      "type": "registry:ui",
      "title": "AI Badge",
      "description": "A provenance chip for AI-touched content \u2014 generated / assisted / human-edited, with the model and timestamp behind a tooltip or popover and a contrast-safe overlay mode for images.",
      "files": [
        {
          "path": "src/registry/ui/ai-badge.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "radix-ui"
      ],
      "registryDependencies": [
        "tooltip",
        "utils"
      ]
    },
    {
      "name": "stop-generating",
      "type": "registry:ui",
      "title": "Stop Generating",
      "description": "One button slot for the whole run \u2014 Stop while tokens arrive, Continue generating when the reply hit its length cap, nothing when idle, with a scoped Esc binding and a one-shot lock on both actions.",
      "files": [
        {
          "path": "src/registry/ui/stop-generating.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "regenerate-menu",
      "type": "registry:ui",
      "title": "Regenerate Menu",
      "description": "A split retry control for one assistant answer \u2014 the button half re-runs it, the chevron opens a menu with a model submenu that marks the current model and an inline instruction field, and every path emits one discriminated action.",
      "files": [
        {
          "path": "src/registry/ui/regenerate-menu.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "button",
        "dropdown-menu",
        "input",
        "utils"
      ]
    },
    {
      "name": "response-feedback",
      "type": "registry:ui",
      "title": "Response Feedback",
      "description": "Thumbs up or down on one AI answer, with a follow-up panel of reason chips and a comment, and exactly one submission per message \u2014 locked into a receipt when it lands.",
      "files": [
        {
          "path": "src/registry/ui/response-feedback.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "radix-ui"
      ],
      "registryDependencies": [
        "https://ui.zyeon.ai/r/use-controllable-state.json",
        "utils"
      ]
    },
    {
      "name": "share-conversation",
      "type": "registry:ui",
      "title": "Share Conversation",
      "description": "A publish-a-link share dialog for a chat thread \u2014 server-issued URL, optimistic visibility and attachment writes with rollback, copy feedback and a destructive revoke confirm.",
      "files": [
        {
          "path": "src/registry/ui/share-conversation.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "badge",
        "button",
        "dialog",
        "utils"
      ]
    },
    {
      "name": "conversation-export",
      "type": "registry:ui",
      "title": "Conversation Export",
      "description": "An export menu for a whole conversation \u2014 scope radio, a size estimate on every format, and a row that spins, ticks or turns into Retry without the menu ever closing under it.",
      "files": [
        {
          "path": "src/registry/ui/conversation-export.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "button",
        "dropdown-menu",
        "https://ui.zyeon.ai/r/use-controllable-state.json",
        "utils"
      ]
    },
    {
      "name": "answer-sources",
      "type": "registry:ui",
      "title": "Answer Sources",
      "description": "The numbered favicon cards behind one AI answer \u2014 a scrolling strip or an expandable list, the retrieved excerpt one hover or one Tab away, dead sources that refuse to link, and four data states.",
      "files": [
        {
          "path": "src/registry/ui/answer-sources.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/answer-sources.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "tooltip",
        "utils"
      ]
    },
    {
      "name": "confidence-meter",
      "type": "registry:ui",
      "title": "Confidence Meter",
      "description": "A response-confidence reading \u2014 segmented bar or small ring banded by your own cut points, with a 'why' disclosure that breaks the score into per-signal factor rows.",
      "files": [
        {
          "path": "src/registry/ui/confidence-meter.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "moderation-notice",
      "type": "registry:ui",
      "title": "Moderation Notice",
      "description": "Content-policy interruption states for chat \u2014 blocked input, withheld response and softened answer, with category chips that cross-highlight the flagged passage, a one-shot appeal action, and role=alert only when something was actually stopped.",
      "files": [
        {
          "path": "src/registry/ui/moderation-notice.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "badge",
        "button",
        "utils"
      ]
    },
    {
      "name": "slash-command-menu",
      "type": "registry:ui",
      "title": "Slash Command Menu",
      "description": "A caret-anchored \"/\" command popup for a textarea you already own \u2014 sectioned list, roving keyboard cursor, and one commit that either inserts a token or fires an action.",
      "files": [
        {
          "path": "src/registry/ui/slash-command-menu.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "dictation-button",
      "type": "registry:ui",
      "title": "Dictation Button",
      "description": "A composer mic that turns speech into committed text \u2014 toggle or hold-to-talk, an amplitude ring, a live interim chip, and exactly one transcript per session.",
      "files": [
        {
          "path": "src/registry/ui/dictation-button.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "prompt-variables",
      "type": "registry:ui",
      "title": "Prompt Variables",
      "description": "An inline template filler \u2014 every {{variable}} slot becomes a chip-sized text, select or number editor inside the sentence, repeats mirror the first one live, and the preview is byte-identical to what gets sent.",
      "files": [
        {
          "path": "src/registry/ui/prompt-variables.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "prompt-enhancer",
      "type": "registry:ui",
      "title": "Prompt Enhancer",
      "description": "An \"improve my prompt\" affordance for a prompt field \u2014 a shimmering request state, a word-level diff of the rewrite, and a one-shot Accept with undo.",
      "files": [
        {
          "path": "src/registry/ui/prompt-enhancer.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "button",
        "utils"
      ]
    },
    {
      "name": "persona-picker",
      "type": "registry:ui",
      "title": "Persona Picker",
      "description": "Choose the assistant persona a turn runs under \u2014 seeded avatar cards or a compact combobox, capability tags, the system-prompt fragment each persona quietly injects, unavailable rows that say why, and four data states.",
      "files": [
        {
          "path": "src/registry/ui/persona-picker.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/persona-picker.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "tooltip",
        "utils"
      ]
    },
    {
      "name": "tone-selector",
      "type": "registry:ui",
      "title": "Tone Selector",
      "description": "A radio-group row of rewrite tones where every pill carries a sample phrase, and the custom tone applies only once its free-text instruction is committed.",
      "files": [
        {
          "path": "src/registry/ui/tone-selector.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "button",
        "input",
        "tooltip",
        "utils"
      ]
    },
    {
      "name": "sampling-controls",
      "type": "registry:ui",
      "title": "Sampling Controls",
      "description": "A controlled panel for temperature, top-p, max tokens and the penalties \u2014 editable value badges, a worded creative-to-precise scale, per-parameter revert, and a nudge when temperature and top-p are tuned together.",
      "files": [
        {
          "path": "src/registry/ui/sampling-controls.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "system-prompt-editor",
      "type": "registry:ui",
      "title": "System Prompt Editor",
      "description": "A system-prompt editing surface: an autosizing monospace field with placeholder highlighting painted behind the caret, a live token estimate against a budget, presets that insert without destroying work, and an unsaved bar that owns Save and Discard.",
      "files": [
        {
          "path": "src/registry/ui/system-prompt-editor.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "button",
        "dropdown-menu",
        "utils"
      ]
    },
    {
      "name": "chat-mode-picker",
      "type": "registry:ui",
      "title": "Chat Mode Picker",
      "description": "The composer's capability chips \u2014 web search, deep research, canvas, image \u2014 with a plan gate, a context gate, a cap, conflicting pairs, and a set that repairs itself when the model changes.",
      "files": [
        {
          "path": "src/registry/ui/chat-mode-picker.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "https://ui.zyeon.ai/r/use-controllable-state.json",
        "https://ui.zyeon.ai/r/use-roving-tabindex.json",
        "tooltip",
        "utils"
      ]
    },
    {
      "name": "context-limit-banner",
      "type": "registry:ui",
      "title": "Context Limit Banner",
      "description": "A context-window warning that escalates from a quiet notice to a blocking wall \u2014 a thin usage meter with threshold ticks, rising-edge-only announcements, dismissal that re-arms on escalation, and the three exits out of a full conversation.",
      "files": [
        {
          "path": "src/registry/ui/context-limit-banner.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "button",
        "utils"
      ]
    },
    {
      "name": "agent-inbox",
      "type": "registry:ui",
      "title": "Agent Inbox",
      "description": "A human-in-the-loop queue of everything your agents parked on a person \u2014 triage ranking, overdue flags, one-shot inline Approve/Deny, grouping by agent or urgency, and four data states.",
      "files": [
        {
          "path": "src/registry/ui/agent-inbox.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/agent-inbox.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "agent-plan",
      "type": "registry:ui",
      "title": "Agent Plan",
      "description": "An agent's plan while it is still a draft \u2014 ordered steps with their rationale, risk chips on the dangerous ones, per-step include/exclude, inline rewriting, a live duration and cost estimate for the steps you kept, and a one-shot Approve or Request changes.",
      "files": [
        {
          "path": "src/registry/ui/agent-plan.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/agent-plan.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "badge",
        "button",
        "utils"
      ]
    },
    {
      "name": "task-queue",
      "type": "registry:ui",
      "title": "Task Queue",
      "description": "An agent work queue \u2014 live progress and the current step for running tasks, drag-to-reprioritise queued ones with a keyboard path, one-shot cancel and retry per row, a concurrency budget in the header, and four data states.",
      "files": [
        {
          "path": "src/registry/ui/task-queue.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/task-queue.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "@dnd-kit/core",
        "@dnd-kit/sortable",
        "@dnd-kit/utilities",
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "agent-status",
      "type": "registry:ui",
      "title": "Agent Status",
      "description": "A compact agent state chip \u2014 a dot and a label morphing through idle, thinking, tool use, waiting-on-you and failure, with a drift-free phase clock and one polite announcement per phase.",
      "files": [
        {
          "path": "src/registry/ui/agent-status.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "run-summary",
      "type": "registry:ui",
      "title": "Run Summary",
      "description": "The receipt for one finished agent run \u2014 outcome and reason, a duration/token/cost stat strip, and an expandable per-model table that says so when its rows don't add up to the headline totals.",
      "files": [
        {
          "path": "src/registry/ui/run-summary.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/run-summary.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "chat-checkpoint",
      "type": "registry:ui",
      "title": "Chat Checkpoint",
      "description": "A conversation save point that guards its own restore \u2014 named marker, live age, auto vs manual origin, an \"N messages since\" cost line, and a one-shot rollback that explains the fork before it happens.",
      "files": [
        {
          "path": "src/registry/ui/chat-checkpoint.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "badge",
        "button",
        "utils"
      ]
    },
    {
      "name": "computer-use-panel",
      "type": "registry:ui",
      "title": "Computer Use Panel",
      "description": "A computer-use session viewer \u2014 screenshots with the agent's click, type, scroll and drag markers drawn on them, a synced action log you step through with the arrow keys, and live follow-and-takeover.",
      "files": [
        {
          "path": "src/registry/ui/computer-use-panel.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/computer-use-panel.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "web-preview",
      "type": "registry:ui",
      "title": "Web Preview",
      "description": "A browser pane an agent drives \u2014 read-only address bar, a history scrubber that follows the newest page until you step back, a load bar, fit-to-pane width presets and a console drawer.",
      "files": [
        {
          "path": "src/registry/ui/web-preview.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "button",
        "https://ui.zyeon.ai/r/use-controllable-state.json",
        "https://ui.zyeon.ai/r/use-roving-tabindex.json",
        "utils"
      ]
    },
    {
      "name": "mcp-server-list",
      "type": "registry:ui",
      "title": "MCP Server List",
      "description": "A four-state MCP connections manager \u2014 transport and live status per server, an enable switch that is intent while status stays reality, cached tool chips with an honest count, and per-row reconnect or authorize.",
      "files": [
        {
          "path": "src/registry/ui/mcp-server-list.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/mcp-server-list.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "tool-catalog",
      "type": "registry:ui",
      "title": "Tool Catalog",
      "description": "A searchable registry of the tools an agent may call \u2014 source facets with live counts, per-tool allow switches, parameter tables that open themselves when the query lands inside a signature, and four data states.",
      "files": [
        {
          "path": "src/registry/ui/tool-catalog.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/tool-catalog.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "badge",
        "button",
        "input",
        "utils"
      ]
    },
    {
      "name": "agent-handoff",
      "type": "registry:ui",
      "title": "Agent Handoff",
      "description": "An agent-to-agent handoff marker \u2014 from/to avatars, a track that marches while the transfer is in flight, the reason control moved, chips for the context passed along, and who holds the run; compact divider and detailed card variants.",
      "files": [
        {
          "path": "src/registry/ui/agent-handoff.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "agent-roster",
      "type": "registry:ui",
      "title": "Agent Roster",
      "description": "A multi-agent fleet panel \u2014 per-agent state dot, model chip, current-task line and capacity bar, attention-first sorting, a real listbox keyboard path, and four data states.",
      "files": [
        {
          "path": "src/registry/ui/agent-roster.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/agent-roster.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "agent-graph",
      "type": "registry:ui",
      "title": "Agent Graph",
      "description": "A workflow DAG drawn in pure SVG from nodes and edges alone \u2014 layered auto-layout with crossing reduction, typed node shapes, status tints, flowing active wires, loop-back routing and four data states.",
      "files": [
        {
          "path": "src/registry/ui/agent-graph.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/agent-graph.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "inline-completion",
      "type": "registry:ui",
      "title": "Inline Completion",
      "description": "Ghost text for a textarea \u2014 a caret-aligned mirror paints the model's continuation in muted type, Tab accepts it, Cmd/Ctrl+Right takes one word, Esc dismisses.",
      "files": [
        {
          "path": "src/registry/ui/inline-completion.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "file-change-list",
      "type": "registry:ui",
      "title": "File Change List",
      "description": "The files an agent touched \u2014 middle-truncated paths, A/M/D/R marks, churn bars scaled across the whole run, one-shot Accept/Revert per file plus a bulk bar, and a slot for the inline diff.",
      "files": [
        {
          "path": "src/registry/ui/file-change-list.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/file-change-list.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "interpreter-output",
      "type": "registry:ui",
      "title": "Interpreter Output",
      "description": "The result of one code-interpreter run \u2014 source collapsed by default, stdout / stderr / rich results behind tabs derived from what actually arrived, the exception pinned above them, tail-capped output that sticks while it streams, and a one-shot Re-run.",
      "files": [
        {
          "path": "src/registry/ui/interpreter-output.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/interpreter-output.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "human-handoff",
      "type": "registry:ui",
      "title": "Human Handoff",
      "description": "A bot-to-human escalation card that walks one ticket through request, queue, connecting, connected and an offline leave-your-address fallback.",
      "files": [
        {
          "path": "src/registry/ui/human-handoff.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "button",
        "input",
        "label",
        "utils"
      ]
    },
    {
      "name": "scheduled-tasks",
      "type": "registry:ui",
      "title": "Scheduled Tasks",
      "description": "A list of scheduled agent automations \u2014 a human cadence next to a live countdown to the next run, the last run's outcome inline, a pause switch, a one-shot manual trigger, the failure printed on the row that broke, and four data states.",
      "files": [
        {
          "path": "src/registry/ui/scheduled-tasks.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/scheduled-tasks.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "retrieval-results",
      "type": "registry:ui",
      "title": "Retrieval Results",
      "description": "The RAG retrieval step opened up \u2014 ranked chunk cards with source and page, a similarity bar carrying the pipeline cutoff, whole-word query emphasis, a used-in-answer badge wired to its citation number, and a threshold divider that refuses to lie.",
      "files": [
        {
          "path": "src/registry/ui/retrieval-results.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/retrieval-results.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "knowledge-picker",
      "type": "registry:ui",
      "title": "Knowledge Picker",
      "description": "A grounding-scope selector for collections, files and links \u2014 tri-state collections that cascade only over what is actually selectable, per-source document and chunk counts with index freshness, an accounting bar that prices the selection in chunks, and four data states.",
      "files": [
        {
          "path": "src/registry/ui/knowledge-picker.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/knowledge-picker.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "indexing-progress",
      "type": "registry:ui",
      "title": "Indexing Progress",
      "description": "An ingest pipeline board \u2014 per-source parse \u2192 chunk \u2192 embed chips, a byte-weighted aggregate with a derived ETA, failures that keep the stage they died at behind a one-shot retry, and a completed summary.",
      "files": [
        {
          "path": "src/registry/ui/indexing-progress.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/indexing-progress.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "web-search-card",
      "type": "registry:ui",
      "title": "Web Search Card",
      "description": "One web-search step inline in a conversation \u2014 the queries the model typed, the pages that came back, which ones it actually read and which ended up cited, with a data-driven reading shimmer and four data states.",
      "files": [
        {
          "path": "src/registry/ui/web-search-card.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/web-search-card.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "voice-orb",
      "type": "registry:ui",
      "title": "Voice Orb",
      "description": "A voice-session orb \u2014 layered token gradients that breathe when idle, ripple to a 0..1 amplitude while listening, swirl while thinking and pulse while speaking.",
      "files": [
        {
          "path": "src/registry/ui/voice-orb.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "voice-chat",
      "type": "registry:block",
      "title": "Voice Chat",
      "description": "A realtime voice session panel \u2014 speaking orb, word-by-word live captions, mute, mic picker, connection meter, session clock, and an end-of-call summary.",
      "files": [
        {
          "path": "src/registry/blocks/voice-chat.tsx",
          "type": "registry:block"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "alert-dialog",
        "button",
        "dropdown-menu",
        "https://ui.zyeon.ai/r/use-controllable-state.json",
        "utils"
      ]
    },
    {
      "name": "live-captions",
      "type": "registry:ui",
      "title": "Live Captions",
      "description": "A broadcast-style caption bar for a live recogniser feed \u2014 interim words render muted and solidify when finalised, a rolling two-line window follows the speech, speaker chips carry the turn, and the panel hides itself after silence.",
      "files": [
        {
          "path": "src/registry/ui/live-captions.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "voice-picker",
      "type": "registry:ui",
      "title": "Voice Picker",
      "description": "Pick the TTS voice a reply is spoken in \u2014 cards or a combobox, language and accent chips, neutral timbre tags, and a play button that auditions without selecting, with exactly one sample sounding at a time.",
      "files": [
        {
          "path": "src/registry/ui/voice-picker.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/voice-picker.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "model-card",
      "type": "registry:ui",
      "title": "Model Card",
      "description": "One model's spec sheet \u2014 context window, max output and cutoff, tri-state capability chips, per-million-token pricing with the cached-read discount, benchmark bars that switch to a signed comparison against a baseline, and a deprecation notice that names the successor.",
      "files": [
        {
          "path": "src/registry/ui/model-card.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/model-card.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "button",
        "https://ui.zyeon.ai/r/use-copy-to-clipboard.json",
        "utils"
      ]
    },
    {
      "name": "cost-breakdown",
      "type": "registry:ui",
      "title": "Cost Breakdown",
      "description": "An LLM cost receipt \u2014 every metered line as quantity \u00d7 rate = amount in micro-unit money that keeps sub-cent charges, grouping by model or kind, a highlighted prompt-caching savings line, and four contract-driven states.",
      "files": [
        {
          "path": "src/registry/ui/cost-breakdown.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/cost-breakdown.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "eval-scorecard",
      "type": "registry:ui",
      "title": "Eval Scorecard",
      "description": "One evaluation run at a glance \u2014 an overall dial marked with the pass gate, per-criterion bars carrying their own gate ticks and baseline deltas, regressions called out by name, and the worst failing cases disclosed on the row that owns them.",
      "files": [
        {
          "path": "src/registry/ui/eval-scorecard.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/eval-scorecard.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "logprobs-viewer",
      "type": "registry:ui",
      "title": "Logprobs Viewer",
      "description": "Token-level probabilities for a model response \u2014 the answer itself heat-tinted by uncertainty on one chart token, dotted-underlined below a live threshold, with top-k alternatives as probability bars on hover, focus or arrow key.",
      "files": [
        {
          "path": "src/registry/ui/logprobs-viewer.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/logprobs-viewer.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "finetune-status",
      "type": "registry:ui",
      "title": "Finetune Status",
      "description": "One fine-tune run as a card \u2014 a pipeline strip that keeps the stage a stopped run died at, derived step/epoch progress, a scrubbable train/validation loss sparkline with broken eval gaps, hyperparameter rows, a checkpoint radiogroup that re-targets the deploy action, and a one-shot cancel behind an inline destructive confirm.",
      "files": [
        {
          "path": "src/registry/ui/finetune-status.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/finetune-status.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "batch-jobs",
      "type": "registry:ui",
      "title": "Batch Jobs",
      "description": "A batch inference jobs table \u2014 middle-truncated copyable job ids, a stacked done/failed/pending bar per job, spend so far, age and ETA derived from an injected clock, an expandable failed-request preview, a one-shot cancel, partial-result downloads, and four data states.",
      "files": [
        {
          "path": "src/registry/ui/batch-jobs.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/batch-jobs.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "https://ui.zyeon.ai/r/use-copy-to-clipboard.json",
        "utils"
      ]
    },
    {
      "name": "safety-controls",
      "type": "registry:ui",
      "title": "Safety Controls",
      "description": "Per-category content thresholds on a four-rung scale \u2014 a plain-language line for what each rung actually does, strictness presets that batch-set every row, policy floors and locked rows, and an unsaved-changes bar that names the filters you are about to loosen.",
      "files": [
        {
          "path": "src/registry/ui/safety-controls.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/safety-controls.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "memory-list",
      "type": "registry:ui",
      "title": "Memory List",
      "description": "The things an assistant remembers about someone, as a list they can audit \u2014 inline editing behind a one-editor lock, a two-step bin that fires exactly once, an add box that refuses duplicates, per-memory and master switches, the \"used in this chat\" highlight, and four data states.",
      "files": [
        {
          "path": "src/registry/ui/memory-list.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/memory-list.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "badge",
        "button",
        "https://ui.zyeon.ai/r/toggle-switch.json",
        "input",
        "utils"
      ]
    },
    {
      "name": "custom-instructions",
      "type": "registry:ui",
      "title": "Custom Instructions",
      "description": "An end-user preference form for assistant instructions: autosizing questions with example popovers, per-field character budgets, one switch that gates every field without erasing it, and a Save / Cancel bar whose Cancel stays undoable.",
      "files": [
        {
          "path": "src/registry/ui/custom-instructions.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "radix-ui"
      ],
      "registryDependencies": [
        "button",
        "utils"
      ]
    },
    {
      "name": "model-router",
      "type": "registry:ui",
      "title": "Model Router",
      "description": "A routing policy panel \u2014 ordered first-match-wins rules with testable condition chips, per-rule switches with optimistic rollback, a health-aware fallback chain, and a prompt tester that names the rule which claims a request and the ones never asked.",
      "files": [
        {
          "path": "src/registry/ui/model-router.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/model-router.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "button",
        "input",
        "utils"
      ]
    },
    {
      "name": "cache-indicator",
      "type": "registry:ui",
      "title": "Cache Indicator",
      "description": "A prompt-cache chip for one request \u2014 hit / partial / miss / write derived from the token counts, a tooltip breakdown of cached vs fresh tokens and money saved, and a self-correcting TTL ring that flips the chip to expired and fires onExpire exactly once.",
      "files": [
        {
          "path": "src/registry/ui/cache-indicator.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "tooltip",
        "utils"
      ]
    },
    {
      "name": "tokenizer-preview",
      "type": "registry:ui",
      "title": "Tokenizer Preview",
      "description": "A tokenizer playground for input text \u2014 alternating-tinted token chunks from a deterministic built-in splitter or your own, token/char/word counts, a live cost estimate at an editable per-Mtok rate, and markers for whitespace and unusually long tokens.",
      "files": [
        {
          "path": "src/registry/ui/tokenizer-preview.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "input",
        "label",
        "utils"
      ]
    },
    {
      "name": "few-shot-editor",
      "type": "registry:ui",
      "title": "Few Shot Editor",
      "description": "A few-shot example manager \u2014 paired input/output cards you add, duplicate, drag-reorder and switch off, with per-example and total token estimates against a budget, and gentle hints for blank outputs and near-duplicate inputs.",
      "files": [
        {
          "path": "src/registry/ui/few-shot-editor.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/few-shot-editor.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "@dnd-kit/core",
        "@dnd-kit/sortable",
        "@dnd-kit/utilities",
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "https://ui.zyeon.ai/r/autosize-textarea.json",
        "utils"
      ]
    },
    {
      "name": "embedding-map",
      "type": "registry:ui",
      "title": "Embedding Map",
      "description": "A 2-D embedding scatter in pure SVG \u2014 clusters carried by chart token and mark shape, centroid names that yield instead of overlapping, a query wired to the retriever's own ranking, and four data states.",
      "files": [
        {
          "path": "src/registry/ui/embedding-map.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/embedding-map.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "structured-output",
      "type": "registry:ui",
      "title": "Structured Output",
      "description": "A JSON-mode response rendered through its schema \u2014 labelled rows in schema order, kind-aware values, field-level expected-vs-got validation, pending fields while the stream runs, off-schema keys kept, and a raw JSON view.",
      "files": [
        {
          "path": "src/registry/ui/structured-output.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/structured-output.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "badge",
        "https://ui.zyeon.ai/r/use-copy-to-clipboard.json",
        "utils"
      ]
    },
    {
      "name": "pii-detector",
      "type": "registry:ui",
      "title": "PII Detector",
      "description": "A pre-send privacy scan \u2014 detected emails, phones, cards, IDs and names underlined by category, a hover or focus popover per entity, a mask-or-keep decision on each, and a masked preview of exactly what will be sent.",
      "files": [
        {
          "path": "src/registry/ui/pii-detector.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "button",
        "https://ui.zyeon.ai/r/copy-button.json",
        "utils"
      ]
    },
    {
      "name": "thinking-indicator",
      "type": "registry:ui",
      "title": "Thinking Indicator",
      "description": "A transcript-line thinking status \u2014 a highlight sweeping the label, a phase walk that never lies about progress, a clock that only appears once the wait is real, and a fade-out that hands the slot to the answer.",
      "files": [
        {
          "path": "src/registry/ui/thinking-indicator.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "queue-position",
      "type": "registry:ui",
      "title": "Queue Position",
      "description": "A generation-queue waiting room \u2014 a position dial that rolls down through every place it passes, a drain bar measured from where you joined, a self-correcting ETA, an optimistic notify-me switch and an arm-before-you-lose-it leave action.",
      "files": [
        {
          "path": "src/registry/ui/queue-position.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "button",
        "utils"
      ]
    },
    {
      "name": "conversation-title",
      "type": "registry:ui",
      "title": "Conversation Title",
      "description": "An auto-generated chat title \u2014 a sparkle provenance hint, click-to-edit rename with a length counter, and a regenerate button that shimmer-cycles candidate names before settling.",
      "files": [
        {
          "path": "src/registry/ui/conversation-title.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "button",
        "tooltip",
        "utils"
      ]
    },
    {
      "name": "ai-selection-menu",
      "type": "registry:ui",
      "title": "AI Selection Menu",
      "description": "An Ask-AI row that floats over a text selection \u2014 action shortcuts, submenus, a free-form question field, one captured excerpt and a keyboard path in.",
      "files": [
        {
          "path": "src/registry/ui/ai-selection-menu.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "rewrite-preview",
      "type": "registry:ui",
      "title": "Rewrite Preview",
      "description": "A prose rewrite review panel \u2014 sentence-level tints, per-paragraph Accept / Keep verdicts, measured delta chips and a one-shot Apply that hands back the merged draft.",
      "files": [
        {
          "path": "src/registry/ui/rewrite-preview.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "badge",
        "button",
        "utils"
      ]
    },
    {
      "name": "assistant-avatar",
      "type": "registry:ui",
      "title": "Assistant Avatar",
      "description": "An assistant identity chip whose ring carries the state \u2014 a portrait or a seed-derived token gradient inside, ripples while listening, a conic sweep while thinking, equalizer ticks while speaking.",
      "files": [
        {
          "path": "src/registry/ui/assistant-avatar.tsx",
          "type": "registry:ui"
        }
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "image-generation",
      "type": "registry:ui",
      "title": "Image Generation",
      "description": "An image-generation result card \u2014 the prompt above a variations grid that blurs up and scans while it renders, per-image download / upscale / vary, a first-class safety-blocked state, and the seed behind whichever variation you pick.",
      "files": [
        {
          "path": "src/registry/ui/image-generation.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/image-generation.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "video-generation",
      "type": "registry:ui",
      "title": "Video Generation",
      "description": "A text-to-video render as one card \u2014 prompt, a storyboard that fills in frame by frame, a staged bar that cannot rewind, a poster with a duration chip when it lands, and a failure that keeps the frames it managed to make.",
      "files": [
        {
          "path": "src/registry/ui/video-generation.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/video-generation.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "chatbot-widget",
      "type": "registry:block",
      "title": "Chatbot Widget",
      "description": "An embeddable support chat widget \u2014 launcher bubble with an acknowledged unread badge, a panel that keeps its draft when minimised, quick replies, and a rating row on the way out.",
      "files": [
        {
          "path": "src/registry/blocks/chatbot-widget.tsx",
          "type": "registry:block"
        },
        {
          "path": "src/registry/blocks/chatbot-widget.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "button",
        "input",
        "utils"
      ]
    },
    {
      "name": "ai-answer",
      "type": "registry:block",
      "title": "AI Answer",
      "description": "A search-answer section \u2014 the question, the sources it stands on, prose whose every sentence carries a numbered chip back to a source, follow-ups, and a streaming pass where sources land before the text.",
      "files": [
        {
          "path": "src/registry/blocks/ai-answer.tsx",
          "type": "registry:block"
        },
        {
          "path": "src/registry/blocks/ai-answer.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "tooltip",
        "utils"
      ]
    },
    {
      "name": "research-report",
      "type": "registry:block",
      "title": "Research Report",
      "description": "The finished output of a deep-research run \u2014 prose whose citation numbers are derived from one walk of the data, per-section source chips, an outline that follows the reader, and a methodology footer that shows the queries run and the sources rejected.",
      "files": [
        {
          "path": "src/registry/blocks/research-report.tsx",
          "type": "registry:block"
        },
        {
          "path": "src/registry/blocks/research-report.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "agent-dashboard",
      "type": "registry:block",
      "title": "Agent Dashboard",
      "description": "An agent-ops overview \u2014 KPI tiles whose trends are derived, a runs-over-time bar chart, a recent-runs table whose failing rows expand to the error line, and a live-agent rail that filters the table without moving the window figures.",
      "files": [
        {
          "path": "src/registry/blocks/agent-dashboard.tsx",
          "type": "registry:block"
        },
        {
          "path": "src/registry/blocks/agent-dashboard.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "assistant-welcome",
      "type": "registry:block",
      "title": "Assistant Welcome",
      "description": "A first-run assistant hero \u2014 greeting, capability cards and starter chips that prefill the host's composer instead of sending, over a token-only animated accent.",
      "files": [
        {
          "path": "src/registry/blocks/assistant-welcome.tsx",
          "type": "registry:block"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "api-error-card",
      "type": "registry:ui",
      "title": "API Error Card",
      "description": "An LLM API failure card whose recovery is chosen by error class \u2014 a countdown ring with one-shot opt-in auto-retry for 429s, a key-settings exit for auth, a status-page exit for overload, and trim / summarize exits when the context is too long.",
      "files": [
        {
          "path": "src/registry/ui/api-error-card.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "stream-inspector",
      "type": "registry:ui",
      "title": "Stream Inspector",
      "description": "A developer feed of the raw frames of one streamed model response \u2014 per-frame offsets and gaps, a TTFT marker line, header stats, stall marking with jump-to-next, delta folding, tail-follow with break-away and a pretty/raw toggle per row.",
      "files": [
        {
          "path": "src/registry/ui/stream-inspector.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/stream-inspector.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "prompt-diff",
      "type": "registry:ui",
      "title": "Prompt Diff",
      "description": "A word-level diff of two prompt versions \u2014 split or unified columns, version chips with author, date and run count, side swap, per-version copy and a one-shot restore.",
      "files": [
        {
          "path": "src/registry/ui/prompt-diff.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "badge",
        "button",
        "utils"
      ]
    },
    {
      "name": "throughput-meter",
      "type": "registry:ui",
      "title": "Throughput Meter",
      "description": "A live tokens-per-second readout \u2014 rolling sparkline, time to first token, current-vs-average delta, a stall flag raised by the meter's own clock, and a run summary when the stream ends.",
      "files": [
        {
          "path": "src/registry/ui/throughput-meter.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "context-inspector",
      "type": "registry:ui",
      "title": "Context Inspector",
      "description": "A stacked map of the assembled prompt \u2014 system, tools, files, memory and history as proportional slices with per-entry token costs, an expandable breakdown that never hides what it didn't itemise, a reply-headroom band that warns before the answer stops fitting, and a what-if preview of every evictable entry.",
      "files": [
        {
          "path": "src/registry/ui/context-inspector.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/context-inspector.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "guardrail-trace",
      "type": "registry:ui",
      "title": "Guardrail Trace",
      "description": "The safety evaluation of one request, rule by rule \u2014 a verdict header derived from the rules rather than asserted beside them, matched-span excerpts with per-rule rationale, verdict filter chips, a passing-row budget that can never hide a block, and four data states.",
      "files": [
        {
          "path": "src/registry/ui/guardrail-trace.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/guardrail-trace.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "badge",
        "button",
        "utils"
      ]
    },
    {
      "name": "conversation-tree",
      "type": "registry:ui",
      "title": "Conversation Tree",
      "description": "The branching map of a whole chat \u2014 a flat parentId list nested into a vertical tree, the current path lit as a continuous spine, abandoned forks folded into counted stubs, WAI-ARIA tree keyboard navigation, and four data states.",
      "files": [
        {
          "path": "src/registry/ui/conversation-tree.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/conversation-tree.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "agent-permissions",
      "type": "registry:ui",
      "title": "Agent Permissions",
      "description": "A capability-scoping panel for one agent \u2014 per-tool switches with risk bands, a spend cap metered against what is already spent, an add-and-remove domain allowlist, an ordered file-access scale with policy ceilings, and an unsaved-changes bar that counts every change that expands the agent's authority.",
      "files": [
        {
          "path": "src/registry/ui/agent-permissions.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/agent-permissions.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "latency-breakdown",
      "type": "registry:ui",
      "title": "Latency Breakdown",
      "description": "Per-request phase bars \u2014 queue, TTFT, generation and tool time on one shared scale, with a floor that keeps sub-pixel phases visible, a legend that ranks the runs by a phase, and a p50/p95 footer that names the population it came from.",
      "files": [
        {
          "path": "src/registry/ui/latency-breakdown.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/latency-breakdown.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "prompt-arena",
      "type": "registry:ui",
      "title": "Prompt Arena",
      "description": "Pairwise prompt results as a scoreboard you can act on \u2014 an A/tie/B split bar, a verdict gated by a Wilson interval instead of a raw lead, sampled matchups with their own vote splits, the two outputs for one input on demand, and a rerun that fires exactly once.",
      "files": [
        {
          "path": "src/registry/ui/prompt-arena.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/prompt-arena.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "dataset-browser",
      "type": "registry:ui",
      "title": "Dataset Browser",
      "description": "A prompt/completion dataset row by row \u2014 one-line pair previews, quality-flag chips with the rule behind each one, the full pair one click away, OR'd flag filters, and a selection that survives filtering feeding a bulk export/remove bar.",
      "files": [
        {
          "path": "src/registry/ui/dataset-browser.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/dataset-browser.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "badge",
        "button",
        "https://ui.zyeon.ai/r/use-copy-to-clipboard.json",
        "utils"
      ]
    },
    {
      "name": "labeling-queue",
      "type": "registry:ui",
      "title": "Labeling Queue",
      "description": "A one-item-at-a-time human labeling queue \u2014 number-key label buttons, skip and flag escapes, a resumable \"34 / 200\" progress bar, undo for the last call, an all-done screen, and a one-shot lock per item so a double press can never double-label.",
      "files": [
        {
          "path": "src/registry/ui/labeling-queue.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/labeling-queue.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "detection-overlay",
      "type": "registry:ui",
      "title": "Detection Overlay",
      "description": "Object-detection results drawn over the picture they came from \u2014 per-class tinted boxes with label and confidence chips, a live confidence gate, a class legend, and a rail whose hover, focus and selection stay in sync with the boxes.",
      "files": [
        {
          "path": "src/registry/ui/detection-overlay.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/detection-overlay.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "ocr-viewer",
      "type": "registry:ui",
      "title": "Ocr Viewer",
      "description": "A scanned page beside the text read off it, kept in sync both ways \u2014 hover or focus a line to light up its source box, click a box to focus its line, with low-confidence words underlined in place.",
      "files": [
        {
          "path": "src/registry/ui/ocr-viewer.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/ocr-viewer.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "button",
        "tooltip",
        "utils"
      ]
    },
    {
      "name": "upgrade-prompt",
      "type": "registry:ui",
      "title": "Upgrade Prompt",
      "description": "An in-feature paywall \u2014 usage note, benefit bullets, a two-tier mini compare, an async upgrade CTA and a \"remind me tomorrow\" snooze that round-trips through the host, as a banner or as an overlay that blurs only its own box.",
      "files": [
        {
          "path": "src/registry/ui/upgrade-prompt.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "badge",
        "button",
        "utils"
      ]
    },
    {
      "name": "usage-alerts",
      "type": "registry:ui",
      "title": "Usage Alerts",
      "description": "A budget alert-rule manager \u2014 threshold tripwires on a scale that runs past 100%, per-rule channels, a one-shot test send with a real in-flight state, and a fired-alert history waiting to be acknowledged, in four contract-driven states.",
      "files": [
        {
          "path": "src/registry/ui/usage-alerts.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/usage-alerts.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "request-history",
      "type": "registry:ui",
      "title": "Request History",
      "description": "A playground's run rail \u2014 every request with the model and knobs it was sent with, pinned favourites kept above the churn, one click to load a run back into the editor, and a confirmation when that would overwrite your draft.",
      "files": [
        {
          "path": "src/registry/ui/request-history.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/request-history.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "badge",
        "utils"
      ]
    },
    {
      "name": "open-in-chat",
      "type": "registry:ui",
      "title": "Open In Chat",
      "description": "A provider menu that turns the content on the page into a written prompt and hands it to ChatGPT, Claude, Cursor or the clipboard \u2014 deeplink when it fits the URL, copy when it does not.",
      "files": [
        {
          "path": "src/registry/ui/open-in-chat.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "button",
        "dropdown-menu",
        "utils"
      ]
    },
    {
      "name": "mcp-install-button",
      "type": "registry:ui",
      "title": "MCP Install Button",
      "description": "A one-click MCP install control \u2014 one server description, translated per client into a Claude Code command, a Claude Desktop or VS Code config or a Cursor deeplink, with copy feedback, placeholder env keys and a verify-connection check.",
      "files": [
        {
          "path": "src/registry/ui/mcp-install-button.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "button",
        "dropdown-menu",
        "utils"
      ]
    },
    {
      "name": "commit-card",
      "type": "registry:ui",
      "title": "Commit Card",
      "description": "One agent commit as a card \u2014 a Conventional Commits badge parsed out of the raw git message, the files it touched behind an announced cap, an agent and timestamp line, a two-step one-shot revert, and a grouped rail for a whole run.",
      "files": [
        {
          "path": "src/registry/ui/commit-card.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/commit-card.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "badge",
        "button",
        "utils"
      ]
    },
    {
      "name": "sandbox-status",
      "type": "registry:ui",
      "title": "Sandbox Status",
      "description": "A sandbox lifecycle card \u2014 provisioning through reclaimed, CPU / memory meters, an uptime clock that freezes on teardown, and restart / tear-down behind a confirm and a one-shot lock.",
      "files": [
        {
          "path": "src/registry/ui/sandbox-status.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "alert-dialog",
        "badge",
        "button",
        "utils"
      ]
    },
    {
      "name": "fallback-notice",
      "type": "registry:ui",
      "title": "Fallback Notice",
      "description": "An inline \"answered by a backup model\" notice \u2014 the failed primary and the model that answered as a chip chain, reason-class copy, and a one-shot retry-with-primary button that suppresses itself when a retry cannot help.",
      "files": [
        {
          "path": "src/registry/ui/fallback-notice.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "persona-editor",
      "type": "registry:ui",
      "title": "Persona Editor",
      "description": "An authoring form for one assistant persona: a seed-derived face with a deterministic shuffle, trait chips that refuse rather than truncate, a tone select, budgeted instructions, a preview bubble recomposed on every keystroke, and a save bar that names which fields moved.",
      "files": [
        {
          "path": "src/registry/ui/persona-editor.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "radix-ui"
      ],
      "registryDependencies": [
        "button",
        "input",
        "label",
        "utils"
      ]
    },
    {
      "name": "content-credentials",
      "type": "registry:ui",
      "title": "Content Credentials",
      "description": "A C2PA-flavoured provenance panel \u2014 a four-rung signature verdict, the signing issuer, the created/edited/exported chain, an expandable raw manifest, and a compact chip that opens the whole thing in a popover.",
      "files": [
        {
          "path": "src/registry/ui/content-credentials.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "radix-ui"
      ],
      "registryDependencies": [
        "button",
        "utils"
      ]
    },
    {
      "name": "rate-limit-meter",
      "type": "registry:ui",
      "title": "Rate Limit Meter",
      "description": "A live request-budget meter \u2014 a rolling-window gauge, a burst-dot timeline of recent calls, an escalating severity band, an expiry-aware forecast of when the limit lands, and a reset countdown once it does.",
      "files": [
        {
          "path": "src/registry/ui/rate-limit-meter.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ]
    },
    {
      "name": "byok-setup",
      "type": "registry:ui",
      "title": "BYOK Setup",
      "description": "A bring-your-own-key card \u2014 configurable provider slots, a masked field that cleans what you paste and checks the shape per provider, a cancellable live test with latency or a reason, a storage disclaimer that never leaves, and removal behind a confirm.",
      "files": [
        {
          "path": "src/registry/ui/byok-setup.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "alert-dialog",
        "badge",
        "button",
        "utils"
      ]
    },
    {
      "name": "data-controls",
      "type": "registry:ui",
      "title": "Data Controls",
      "description": "An AI privacy panel where every control saves on its own \u2014 a training consent switch with a plain-language consequence line, a retention scale that warns when it deletes nothing, an export job with progress, and a type-to-confirm deletion.",
      "files": [
        {
          "path": "src/registry/ui/data-controls.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "alert-dialog",
        "button",
        "input",
        "utils"
      ]
    },
    {
      "name": "chat-import",
      "type": "registry:ui",
      "title": "Chat Import",
      "description": "A staged importer for assistant exports \u2014 reads ChatGPT, Claude and JSON-Lines files, previews the conversations it recovered with per-item checkboxes, and ends on a summary that names every skipped item and why.",
      "files": [
        {
          "path": "src/registry/ui/chat-import.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "badge",
        "button",
        "https://ui.zyeon.ai/r/dropzone.json",
        "input",
        "utils"
      ]
    },
    {
      "name": "ai-form-assist",
      "type": "registry:ui",
      "title": "AI Form Assist",
      "description": "Model-filled form fields \u2014 a sparkle per row, ghost-rendered values with a confidence tint, source popovers, a staggered fill-all wave, and per-field accept, dismiss and undo.",
      "files": [
        {
          "path": "src/registry/ui/ai-form-assist.tsx",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "radix-ui"
      ],
      "registryDependencies": [
        "button",
        "utils"
      ]
    },
    {
      "name": "translation-panel",
      "type": "registry:ui",
      "title": "Translation Panel",
      "description": "A document beside its machine translation, aligned segment by segment \u2014 hover or focus a pair and both halves light up, with per-segment translated / waiting / failed states, a swappable language header, a formality control and progress over the whole job.",
      "files": [
        {
          "path": "src/registry/ui/translation-panel.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/registry/ui/translation-panel.contract.ts",
          "type": "registry:ui"
        }
      ],
      "dependencies": [
        "lucide-react",
        "zod"
      ],
      "registryDependencies": [
        "button",
        "utils"
      ]
    }
  ]
}
