{
  "$schema": "https://ui.shadcn.com/schema/registry.json",
  "name": "heraldui",
  "homepage": "https://herald-ui.vercel.app",
  "items": [
    {
      "name": "utils",
      "type": "registry:lib",
      "dependencies": [
        "clsx",
        "tailwind-merge"
      ],
      "files": [
        {
          "path": "packages/ui/src/lib/utils.ts",
          "type": "registry:lib",
          "target": "lib/utils.ts"
        }
      ],
      "description": "The cn() class-merge helper every component uses."
    },
    {
      "name": "tokens",
      "type": "registry:style",
      "files": [
        {
          "path": "packages/tokens/src/tokens.css",
          "type": "registry:file",
          "target": "app/tokens.css"
        }
      ],
      "description": "The OKLCH design-token layer — parametric brand hue, radius, light/dark."
    },
    {
      "name": "button",
      "type": "registry:ui",
      "dependencies": [
        "@base-ui/react",
        "class-variance-authority"
      ],
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/button.tsx",
          "type": "registry:ui",
          "target": "components/ui/button.tsx"
        }
      ],
      "description": "Actions and links, seven variants across sizes."
    },
    {
      "name": "accordion",
      "type": "registry:ui",
      "dependencies": [
        "@base-ui/react",
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/accordion.tsx",
          "type": "registry:ui",
          "target": "components/ui/accordion.tsx"
        }
      ],
      "description": "A vertically stacked set of disclosures."
    },
    {
      "name": "alert",
      "type": "registry:ui",
      "dependencies": [
        "class-variance-authority"
      ],
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/alert.tsx",
          "type": "registry:ui",
          "target": "components/ui/alert.tsx"
        }
      ],
      "description": "A callout for important messages."
    },
    {
      "name": "carousel",
      "type": "registry:ui",
      "dependencies": [
        "embla-carousel-react",
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/button"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/carousel.tsx",
          "type": "registry:ui",
          "target": "components/ui/carousel.tsx"
        }
      ],
      "description": "A slideshow of content panels."
    },
    {
      "name": "badge",
      "type": "registry:ui",
      "dependencies": [
        "@base-ui/react",
        "class-variance-authority"
      ],
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/badge.tsx",
          "type": "registry:ui",
          "target": "components/ui/badge.tsx"
        }
      ],
      "description": "Compact status and metadata labels."
    },
    {
      "name": "input",
      "type": "registry:ui",
      "dependencies": [
        "@base-ui/react"
      ],
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/input.tsx",
          "type": "registry:ui",
          "target": "components/ui/input.tsx"
        }
      ],
      "description": "A single-line text field."
    },
    {
      "name": "textarea",
      "type": "registry:ui",
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/textarea.tsx",
          "type": "registry:ui",
          "target": "components/ui/textarea.tsx"
        }
      ],
      "description": "A multiline text field."
    },
    {
      "name": "label",
      "type": "registry:ui",
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/label.tsx",
          "type": "registry:ui",
          "target": "components/ui/label.tsx"
        }
      ],
      "description": "An accessible form label."
    },
    {
      "name": "dialog",
      "type": "registry:ui",
      "dependencies": [
        "@base-ui/react",
        "lucide-react",
        "tw-animate-css"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/button"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/dialog.tsx",
          "type": "registry:ui",
          "target": "components/ui/dialog.tsx"
        }
      ],
      "description": "A modal dialog."
    },
    {
      "name": "popover",
      "type": "registry:ui",
      "dependencies": [
        "@base-ui/react",
        "tw-animate-css"
      ],
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/popover.tsx",
          "type": "registry:ui",
          "target": "components/ui/popover.tsx"
        }
      ],
      "description": "A floating panel anchored to a trigger."
    },
    {
      "name": "tooltip",
      "type": "registry:ui",
      "dependencies": [
        "@base-ui/react",
        "tw-animate-css"
      ],
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/tooltip.tsx",
          "type": "registry:ui",
          "target": "components/ui/tooltip.tsx"
        }
      ],
      "description": "A hover / focus label."
    },
    {
      "name": "dropdown-menu",
      "type": "registry:ui",
      "dependencies": [
        "@base-ui/react",
        "lucide-react",
        "tw-animate-css"
      ],
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/dropdown-menu.tsx",
          "type": "registry:ui",
          "target": "components/ui/dropdown-menu.tsx"
        }
      ],
      "description": "A menu of actions."
    },
    {
      "name": "switch",
      "type": "registry:ui",
      "dependencies": [
        "@base-ui/react"
      ],
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/switch.tsx",
          "type": "registry:ui",
          "target": "components/ui/switch.tsx"
        }
      ],
      "description": "A binary on/off toggle."
    },
    {
      "name": "slider",
      "type": "registry:ui",
      "dependencies": [
        "@base-ui/react"
      ],
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/slider.tsx",
          "type": "registry:ui",
          "target": "components/ui/slider.tsx"
        }
      ],
      "description": "A single- or multi-value range slider."
    },
    {
      "name": "toggle",
      "type": "registry:ui",
      "dependencies": [
        "@base-ui/react",
        "class-variance-authority"
      ],
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/toggle.tsx",
          "type": "registry:ui",
          "target": "components/ui/toggle.tsx"
        }
      ],
      "description": "A two-state pressable button."
    },
    {
      "name": "toggle-group",
      "type": "registry:ui",
      "dependencies": [
        "@base-ui/react",
        "class-variance-authority"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/toggle"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/toggle-group.tsx",
          "type": "registry:ui",
          "target": "components/ui/toggle-group.tsx"
        }
      ],
      "description": "A set of grouped toggles."
    },
    {
      "name": "calendar",
      "type": "registry:ui",
      "dependencies": [
        "react-day-picker",
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/button"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/calendar.tsx",
          "type": "registry:ui",
          "target": "components/ui/calendar.tsx"
        }
      ],
      "description": "A date picker on react-day-picker."
    },
    {
      "name": "skeleton",
      "type": "registry:ui",
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/skeleton.tsx",
          "type": "registry:ui",
          "target": "components/ui/skeleton.tsx"
        }
      ],
      "description": "A loading placeholder."
    },
    {
      "name": "spinner",
      "type": "registry:ui",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/spinner.tsx",
          "type": "registry:ui",
          "target": "components/ui/spinner.tsx"
        }
      ],
      "description": "A loading indicator."
    },
    {
      "name": "kbd",
      "type": "registry:ui",
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/kbd.tsx",
          "type": "registry:ui",
          "target": "components/ui/kbd.tsx"
        }
      ],
      "description": "A keyboard shortcut hint."
    },
    {
      "name": "breadcrumb",
      "type": "registry:ui",
      "dependencies": [
        "@base-ui/react",
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/breadcrumb.tsx",
          "type": "registry:ui",
          "target": "components/ui/breadcrumb.tsx"
        }
      ],
      "description": "A path of links to the current page."
    },
    {
      "name": "separator",
      "type": "registry:ui",
      "dependencies": [
        "@base-ui/react"
      ],
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/separator.tsx",
          "type": "registry:ui",
          "target": "components/ui/separator.tsx"
        }
      ],
      "description": "A visual divider."
    },
    {
      "name": "sonner",
      "type": "registry:ui",
      "dependencies": [
        "sonner",
        "lucide-react"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/sonner.tsx",
          "type": "registry:ui",
          "target": "components/ui/sonner.tsx"
        }
      ],
      "description": "Toast notifications."
    },
    {
      "name": "drawer",
      "type": "registry:ui",
      "dependencies": [
        "vaul"
      ],
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/drawer.tsx",
          "type": "registry:ui",
          "target": "components/ui/drawer.tsx"
        }
      ],
      "description": "A draggable bottom sheet on Vaul — scopeable to a container."
    },
    {
      "name": "avatar",
      "type": "registry:ui",
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/avatar.tsx",
          "type": "registry:ui",
          "target": "components/ui/avatar.tsx"
        }
      ],
      "description": "An image avatar with an initials-and-hue fallback.",
      "dependencies": [
        "class-variance-authority"
      ]
    },
    {
      "name": "card",
      "type": "registry:ui",
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/card.tsx",
          "type": "registry:ui",
          "target": "components/ui/card.tsx"
        }
      ],
      "description": "A surface for grouping related content."
    },
    {
      "name": "empty-state",
      "type": "registry:ui",
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/empty-state.tsx",
          "type": "registry:ui",
          "target": "components/ui/empty-state.tsx"
        }
      ],
      "description": "A placeholder for empty lists and screens."
    },
    {
      "name": "progress",
      "type": "registry:ui",
      "dependencies": [
        "@base-ui/react"
      ],
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/progress.tsx",
          "type": "registry:ui",
          "target": "components/ui/progress.tsx"
        }
      ],
      "description": "A determinate linear progress bar."
    },
    {
      "name": "progress-ring",
      "type": "registry:ui",
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/progress-ring.tsx",
          "type": "registry:ui",
          "target": "components/ui/progress-ring.tsx"
        }
      ],
      "description": "A compact SVG completion donut."
    },
    {
      "name": "tabs",
      "type": "registry:ui",
      "dependencies": [
        "@base-ui/react"
      ],
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/tabs.tsx",
          "type": "registry:ui",
          "target": "components/ui/tabs.tsx"
        }
      ],
      "description": "Layered sections toggled by a segmented control."
    },
    {
      "name": "alert-dialog",
      "type": "registry:ui",
      "dependencies": [
        "@base-ui/react",
        "tw-animate-css"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/button"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/alert-dialog.tsx",
          "type": "registry:ui",
          "target": "components/ui/alert-dialog.tsx"
        }
      ],
      "description": "A focus-trapped modal that confirms destructive actions."
    },
    {
      "name": "select",
      "type": "registry:ui",
      "dependencies": [
        "@base-ui/react",
        "lucide-react",
        "tw-animate-css"
      ],
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/select.tsx",
          "type": "registry:ui",
          "target": "components/ui/select.tsx"
        }
      ],
      "description": "A single-select dropdown on an input-style trigger."
    },
    {
      "name": "combobox",
      "type": "registry:ui",
      "dependencies": [
        "@base-ui/react",
        "lucide-react",
        "tw-animate-css"
      ],
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/combobox.tsx",
          "type": "registry:ui",
          "target": "components/ui/combobox.tsx"
        }
      ],
      "description": "A searchable single-select with type-to-filter."
    },
    {
      "name": "context-menu",
      "type": "registry:ui",
      "dependencies": [
        "lucide-react",
        "tw-animate-css"
      ],
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/context-menu.tsx",
          "type": "registry:ui",
          "target": "components/ui/context-menu.tsx"
        }
      ],
      "description": "A cursor-anchored right-click menu with submenus."
    },
    {
      "name": "stat-tile",
      "type": "registry:ui",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/stat-tile.tsx",
          "type": "registry:ui",
          "target": "components/ui/stat-tile.tsx"
        }
      ],
      "description": "A KPI cell with a trend delta for dashboards."
    },
    {
      "name": "filter-chip",
      "type": "registry:ui",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/filter-chip.tsx",
          "type": "registry:ui",
          "target": "components/ui/filter-chip.tsx"
        }
      ],
      "description": "Removable, toggleable active-filter pills."
    },
    {
      "name": "message-actions",
      "type": "registry:ui",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/button"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/message-actions.tsx",
          "type": "registry:ui",
          "target": "components/ui/message-actions.tsx"
        }
      ],
      "description": "Hover-revealed copy / edit / regenerate row."
    },
    {
      "name": "source-chips",
      "type": "registry:ui",
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/source-chips.tsx",
          "type": "registry:ui",
          "target": "components/ui/source-chips.tsx"
        }
      ],
      "description": "Numbered citation pills for RAG answers."
    },
    {
      "name": "censorable-image",
      "type": "registry:ui",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/censorable-image.tsx",
          "type": "registry:ui",
          "target": "components/ui/censorable-image.tsx"
        }
      ],
      "description": "Blur-until-reveal for sensitive or spoiler media."
    },
    {
      "name": "prompt-starters",
      "type": "registry:ui",
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/prompt-starters.tsx",
          "type": "registry:ui",
          "target": "components/ui/prompt-starters.tsx"
        }
      ],
      "description": "Clickable suggestion chips for an empty composer."
    },
    {
      "name": "sampling-params",
      "type": "registry:ui",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/slider",
        "@herald-ui/label"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/sampling-params.tsx",
          "type": "registry:ui",
          "target": "components/ui/sampling-params.tsx"
        }
      ],
      "description": "Temperature + collapsible advanced LLM knobs."
    },
    {
      "name": "conversation-export",
      "type": "registry:ui",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/button",
        "@herald-ui/dropdown-menu"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/conversation-export.tsx",
          "type": "registry:ui",
          "target": "components/ui/conversation-export.tsx"
        }
      ],
      "description": "Share a transcript as copyable / downloadable Markdown."
    },
    {
      "name": "voice-input",
      "type": "registry:ui",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/button",
        "@herald-ui/spinner"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/voice-input.tsx",
          "type": "registry:ui",
          "target": "components/ui/voice-input.tsx"
        }
      ],
      "description": "Push-to-talk mic button + dictation hook."
    },
    {
      "name": "attachment-tray",
      "type": "registry:ui",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/button"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/attachment-tray.tsx",
          "type": "registry:ui",
          "target": "components/ui/attachment-tray.tsx"
        }
      ],
      "description": "Image attach / paste / drag-drop for a composer."
    },
    {
      "name": "slash-command-palette",
      "type": "registry:ui",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/kbd"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/slash-command-palette.tsx",
          "type": "registry:ui",
          "target": "components/ui/slash-command-palette.tsx"
        }
      ],
      "description": "Inline \"/\" command autocomplete above a composer."
    },
    {
      "name": "tag-autocomplete",
      "type": "registry:ui",
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/textarea"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/tag-autocomplete.tsx",
          "type": "registry:ui",
          "target": "components/ui/tag-autocomplete.tsx"
        }
      ],
      "description": "Caret-aware prompt-tag autocomplete with weight stepping."
    },
    {
      "name": "use-stream-clock",
      "type": "registry:hook",
      "files": [
        {
          "path": "packages/ui/src/hooks/use-stream-clock.ts",
          "type": "registry:hook",
          "target": "hooks/use-stream-clock.ts"
        }
      ],
      "description": "Live elapsed timer that freezes to a final duration."
    },
    {
      "name": "agent-status-card",
      "type": "registry:ui",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/avatar",
        "@herald-ui/badge"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/agent-status-card.tsx",
          "type": "registry:ui",
          "target": "components/ui/agent-status-card.tsx"
        }
      ],
      "description": "A card summarizing an agent's health and stats."
    },
    {
      "name": "prop-list",
      "type": "registry:ui",
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/prop-list.tsx",
          "type": "registry:ui",
          "target": "components/ui/prop-list.tsx"
        }
      ],
      "description": "Key→value inspector rows for detail panels."
    },
    {
      "name": "bar-list",
      "type": "registry:ui",
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/bar-list.tsx",
          "type": "registry:ui",
          "target": "components/ui/bar-list.tsx"
        }
      ],
      "description": "Ranked horizontal bars for top-N by metric."
    },
    {
      "name": "sparkline",
      "type": "registry:ui",
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/sparkline.tsx",
          "type": "registry:ui",
          "target": "components/ui/sparkline.tsx"
        }
      ],
      "description": "A tiny inline trend chart for KPI rows."
    },
    {
      "name": "activity-feed",
      "type": "registry:block",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/avatar",
        "@herald-ui/badge",
        "@herald-ui/empty-state",
        "@herald-ui/input",
        "@herald-ui/format"
      ],
      "files": [
        {
          "path": "packages/ui/src/blocks/activity-feed.tsx",
          "type": "registry:component",
          "target": "blocks/activity-feed.tsx"
        }
      ],
      "description": "A searchable, timelined event feed."
    },
    {
      "name": "conversation-list",
      "type": "registry:block",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/avatar",
        "@herald-ui/input",
        "@herald-ui/button",
        "@herald-ui/dropdown-menu",
        "@herald-ui/format"
      ],
      "files": [
        {
          "path": "packages/ui/src/blocks/conversation-list.tsx",
          "type": "registry:component",
          "target": "blocks/conversation-list.tsx"
        }
      ],
      "description": "A recency-grouped chat-history sidebar."
    },
    {
      "name": "file-tree",
      "type": "registry:block",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/input"
      ],
      "files": [
        {
          "path": "packages/ui/src/blocks/file-tree.tsx",
          "type": "registry:component",
          "target": "blocks/file-tree.tsx"
        }
      ],
      "description": "A recursive, searchable folder explorer."
    },
    {
      "name": "kanban-board",
      "type": "registry:block",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/badge",
        "@herald-ui/avatar",
        "@herald-ui/progress-ring"
      ],
      "files": [
        {
          "path": "packages/ui/src/blocks/kanban-board.tsx",
          "type": "registry:component",
          "target": "blocks/kanban-board.tsx"
        }
      ],
      "description": "A draggable, data-defined column board."
    },
    {
      "name": "media-viewer",
      "type": "registry:block",
      "dependencies": [
        "lucide-react",
        "tw-animate-css"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/button"
      ],
      "files": [
        {
          "path": "packages/ui/src/blocks/media-viewer.tsx",
          "type": "registry:component",
          "target": "blocks/media-viewer.tsx"
        }
      ],
      "description": "A full-screen zoom/pan/slideshow lightbox."
    },
    {
      "name": "media-grid",
      "type": "registry:block",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/skeleton",
        "@herald-ui/empty-state"
      ],
      "files": [
        {
          "path": "packages/ui/src/blocks/media-grid.tsx",
          "type": "registry:component",
          "target": "blocks/media-grid.tsx"
        }
      ],
      "description": "A windowed thumbnail grid of assets."
    },
    {
      "name": "notifications-bell",
      "type": "registry:block",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/popover",
        "@herald-ui/button",
        "@herald-ui/avatar",
        "@herald-ui/empty-state",
        "@herald-ui/format"
      ],
      "files": [
        {
          "path": "packages/ui/src/blocks/notifications-bell.tsx",
          "type": "registry:component",
          "target": "blocks/notifications-bell.tsx"
        }
      ],
      "description": "A bell with an unread badge + panel."
    },
    {
      "name": "sidebar-nav",
      "type": "registry:block",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/tooltip"
      ],
      "files": [
        {
          "path": "packages/ui/src/blocks/sidebar-nav.tsx",
          "type": "registry:component",
          "target": "blocks/sidebar-nav.tsx"
        }
      ],
      "description": "A collapsible grouped navigation rail."
    },
    {
      "name": "dashboard",
      "type": "registry:block",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/app-shell",
        "@herald-ui/notifications-bell",
        "@herald-ui/activity-feed",
        "@herald-ui/agent-status-card",
        "@herald-ui/stat-tile",
        "@herald-ui/bar-list",
        "@herald-ui/sparkline",
        "@herald-ui/format"
      ],
      "files": [
        {
          "path": "packages/ui/src/blocks/dashboard.tsx",
          "type": "registry:component",
          "target": "blocks/dashboard.tsx"
        }
      ],
      "description": "A complete drop-in AI-OS cockpit — one command installs it all."
    },
    {
      "name": "theme-mode-toggle",
      "type": "registry:ui",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/theme-mode-toggle.tsx",
          "type": "registry:ui",
          "target": "components/ui/theme-mode-toggle.tsx"
        }
      ],
      "description": "A light / dark / system segmented control."
    },
    {
      "name": "accent-hue-picker",
      "type": "registry:ui",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/slider"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/accent-hue-picker.tsx",
          "type": "registry:ui",
          "target": "components/ui/accent-hue-picker.tsx"
        }
      ],
      "description": "Pick a brand accent on the OKLCH hue wheel."
    },
    {
      "name": "radius-picker",
      "type": "registry:ui",
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/radius-picker.tsx",
          "type": "registry:ui",
          "target": "components/ui/radius-picker.tsx"
        }
      ],
      "description": "Segmented control for the global corner radius."
    },
    {
      "name": "status-badge",
      "type": "registry:ui",
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/status-badge.tsx",
          "type": "registry:ui",
          "target": "components/ui/status-badge.tsx"
        }
      ],
      "description": "A colored dot + label for live/idle/error state."
    },
    {
      "name": "date-field",
      "type": "registry:ui",
      "dependencies": [
        "lucide-react",
        "react-day-picker"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/calendar",
        "@herald-ui/popover",
        "@herald-ui/button"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/date-field.tsx",
          "type": "registry:ui",
          "target": "components/ui/date-field.tsx"
        }
      ],
      "description": "An ISO-bound date input with a Calendar popover."
    },
    {
      "name": "property-select",
      "type": "registry:ui",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/popover",
        "@herald-ui/button"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/property-select.tsx",
          "type": "registry:ui",
          "target": "components/ui/property-select.tsx"
        }
      ],
      "description": "Single-select field with per-option glyphs."
    },
    {
      "name": "column-chart",
      "type": "registry:ui",
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/column-chart.tsx",
          "type": "registry:ui",
          "target": "components/ui/column-chart.tsx"
        }
      ],
      "description": "Vertical bars over time for usage or cost."
    },
    {
      "name": "storage-meter",
      "type": "registry:ui",
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/storage-meter.tsx",
          "type": "registry:ui",
          "target": "components/ui/storage-meter.tsx"
        }
      ],
      "description": "A stacked usage bar broken down by source."
    },
    {
      "name": "selection-bar",
      "type": "registry:ui",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/button"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/selection-bar.tsx",
          "type": "registry:ui",
          "target": "components/ui/selection-bar.tsx"
        }
      ],
      "description": "Floating bulk-actions toolbar for multi-select."
    },
    {
      "name": "settings-section",
      "type": "registry:ui",
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/settings-section.tsx",
          "type": "registry:ui",
          "target": "components/ui/settings-section.tsx"
        }
      ],
      "description": "Titled card of labeled rows with controls."
    },
    {
      "name": "recurrence-field",
      "type": "registry:ui",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/popover",
        "@herald-ui/button",
        "@herald-ui/input"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/recurrence-field.tsx",
          "type": "registry:ui",
          "target": "components/ui/recurrence-field.tsx"
        }
      ],
      "description": "Repeat-rule editor + a pure recurrence engine."
    },
    {
      "name": "session-list",
      "type": "registry:block",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/avatar",
        "@herald-ui/empty-state",
        "@herald-ui/badge",
        "@herald-ui/input",
        "@herald-ui/format"
      ],
      "files": [
        {
          "path": "packages/ui/src/blocks/session-list.tsx",
          "type": "registry:component",
          "target": "blocks/session-list.tsx"
        }
      ],
      "description": "Master-detail browser for agent sessions."
    },
    {
      "name": "user-menu",
      "type": "registry:ui",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/avatar",
        "@herald-ui/dropdown-menu"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/user-menu.tsx",
          "type": "registry:ui",
          "target": "components/ui/user-menu.tsx"
        }
      ],
      "description": "Account trigger + dropdown for a shell."
    },
    {
      "name": "use-turn-runner",
      "type": "registry:hook",
      "files": [
        {
          "path": "packages/ui/src/hooks/use-turn-runner.ts",
          "type": "registry:hook",
          "target": "hooks/use-turn-runner.ts"
        }
      ],
      "description": "Multi-agent round-robin speaker orchestrator."
    },
    {
      "name": "use-generation",
      "type": "registry:hook",
      "files": [
        {
          "path": "packages/ui/src/hooks/use-generation.ts",
          "type": "registry:hook",
          "target": "hooks/use-generation.ts"
        }
      ],
      "description": "Blocking submit → poll → result job lifecycle."
    },
    {
      "name": "use-undoable-delete",
      "type": "registry:hook",
      "registryDependencies": [
        "@herald-ui/sonner"
      ],
      "files": [
        {
          "path": "packages/ui/src/hooks/use-undoable-delete.ts",
          "type": "registry:hook",
          "target": "hooks/use-undoable-delete.ts"
        }
      ],
      "description": "Optimistic delete with an Undo toast."
    },
    {
      "name": "inline-agent-chat",
      "type": "registry:block",
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/thread",
        "@herald-ui/composer",
        "@herald-ui/avatar",
        "@herald-ui/chat-types"
      ],
      "files": [
        {
          "path": "packages/ui/src/blocks/inline-agent-chat.tsx",
          "type": "registry:component",
          "target": "blocks/inline-agent-chat.tsx"
        }
      ],
      "description": "A compact single-agent chat card to embed."
    },
    {
      "name": "concierge-drawer",
      "type": "registry:block",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/button",
        "@herald-ui/markdown",
        "@herald-ui/spinner"
      ],
      "files": [
        {
          "path": "packages/ui/src/blocks/concierge-drawer.tsx",
          "type": "registry:component",
          "target": "blocks/concierge-drawer.tsx"
        }
      ],
      "description": "A slide-in tool-using copilot drawer."
    },
    {
      "name": "roundtable-transcript",
      "type": "registry:block",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/avatar",
        "@herald-ui/button",
        "@herald-ui/markdown"
      ],
      "files": [
        {
          "path": "packages/ui/src/blocks/roundtable-transcript.tsx",
          "type": "registry:component",
          "target": "blocks/roundtable-transcript.tsx"
        }
      ],
      "description": "Multi-speaker conversation with transport controls."
    },
    {
      "name": "provider-manager",
      "type": "registry:block",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/input",
        "@herald-ui/button",
        "@herald-ui/badge",
        "@herald-ui/dialog",
        "@herald-ui/alert-dialog",
        "@herald-ui/empty-state",
        "@herald-ui/spinner"
      ],
      "files": [
        {
          "path": "packages/ui/src/blocks/provider-manager.tsx",
          "type": "registry:component",
          "target": "blocks/provider-manager.tsx"
        }
      ],
      "description": "Manage BYO OpenAI-compatible providers."
    },
    {
      "name": "persona-builder",
      "type": "registry:block",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/input",
        "@herald-ui/textarea",
        "@herald-ui/button",
        "@herald-ui/avatar",
        "@herald-ui/select",
        "@herald-ui/slider",
        "@herald-ui/label"
      ],
      "files": [
        {
          "path": "packages/ui/src/blocks/persona-builder.tsx",
          "type": "registry:component",
          "target": "blocks/persona-builder.tsx"
        }
      ],
      "description": "Compose an AI character in one form."
    },
    {
      "name": "model-card-browser",
      "type": "registry:block",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/input",
        "@herald-ui/badge",
        "@herald-ui/button",
        "@herald-ui/skeleton"
      ],
      "files": [
        {
          "path": "packages/ui/src/blocks/model-card-browser.tsx",
          "type": "registry:component",
          "target": "blocks/model-card-browser.tsx"
        }
      ],
      "description": "Searchable visual model/LoRA picker."
    },
    {
      "name": "knowledge-graph",
      "type": "registry:block",
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/blocks/knowledge-graph.tsx",
          "type": "registry:component",
          "target": "blocks/knowledge-graph.tsx"
        }
      ],
      "description": "A dependency-free force-directed graph."
    },
    {
      "name": "mobile-tab-bar",
      "type": "registry:block",
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/blocks/mobile-tab-bar.tsx",
          "type": "registry:component",
          "target": "blocks/mobile-tab-bar.tsx"
        }
      ],
      "description": "A safe-area-aware bottom tab bar."
    },
    {
      "name": "format",
      "type": "registry:lib",
      "files": [
        {
          "path": "packages/ui/src/lib/format.ts",
          "type": "registry:lib",
          "target": "lib/format.ts"
        }
      ],
      "description": "Shared formatting utils — the one relative-time vocabulary (formatRelativeTime) + RelativeTime type."
    },
    {
      "name": "chat-types",
      "type": "registry:lib",
      "files": [
        {
          "path": "packages/ui/src/lib/chat-types.ts",
          "type": "registry:lib",
          "target": "lib/chat-types.ts"
        }
      ],
      "description": "The typed parts[] chat message model (text/reasoning/tool/image/error)."
    },
    {
      "name": "chat-styles",
      "type": "registry:style",
      "files": [
        {
          "path": "packages/ui/src/styles/chat.css",
          "type": "registry:file",
          "target": "app/chat.css"
        }
      ],
      "description": "Prose + shimmer styles for markdown and streaming chat surfaces."
    },
    {
      "name": "markdown",
      "type": "registry:ui",
      "dependencies": [
        "react-markdown",
        "remark-gfm",
        "rehype-highlight",
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/button",
        "@herald-ui/chat-styles"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/markdown.tsx",
          "type": "registry:ui",
          "target": "components/ui/markdown.tsx"
        }
      ],
      "description": "GFM markdown with syntax-highlighted, copyable code."
    },
    {
      "name": "tool-card",
      "type": "registry:ui",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/spinner",
        "@herald-ui/chat-types",
        "@herald-ui/source-chips"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/tool-card.tsx",
          "type": "registry:ui",
          "target": "components/ui/tool-card.tsx"
        }
      ],
      "description": "A tool-call card with details and result disclosures."
    },
    {
      "name": "message",
      "type": "registry:ui",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/button",
        "@herald-ui/markdown",
        "@herald-ui/tool-card",
        "@herald-ui/approval-card",
        "@herald-ui/chat-types",
        "@herald-ui/use-stream-clock"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/message.tsx",
          "type": "registry:ui",
          "target": "components/ui/message.tsx"
        }
      ],
      "description": "Renders a message from its typed parts[]."
    },
    {
      "name": "thread",
      "type": "registry:ui",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/message",
        "@herald-ui/chat-types",
        "@herald-ui/tool-card"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/thread.tsx",
          "type": "registry:ui",
          "target": "components/ui/thread.tsx"
        }
      ],
      "description": "A chat transcript rendered from the typed parts[] model."
    },
    {
      "name": "composer",
      "type": "registry:ui",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/button"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/composer.tsx",
          "type": "registry:ui",
          "target": "components/ui/composer.tsx"
        }
      ],
      "description": "A controlled multiline input with send/stop and slots."
    },
    {
      "name": "model-picker",
      "type": "registry:ui",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/popover"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/model-picker.tsx",
          "type": "registry:ui",
          "target": "components/ui/model-picker.tsx"
        }
      ],
      "description": "A grouped agents/providers target picker."
    },
    {
      "name": "command-palette",
      "type": "registry:ui",
      "dependencies": [
        "lucide-react",
        "tw-animate-css"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/kbd"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/command-palette.tsx",
          "type": "registry:ui",
          "target": "components/ui/command-palette.tsx"
        }
      ],
      "description": "A global ⌘K command palette."
    },
    {
      "name": "stream",
      "type": "registry:lib",
      "registryDependencies": [
        "@herald-ui/chat-types"
      ],
      "files": [
        {
          "path": "packages/ui/src/lib/stream.ts",
          "type": "registry:lib",
          "target": "lib/stream.ts"
        }
      ],
      "description": "SSE → parts[] parsing primitives used by useStream."
    },
    {
      "name": "use-stream",
      "type": "registry:hook",
      "registryDependencies": [
        "@herald-ui/stream",
        "@herald-ui/chat-types"
      ],
      "files": [
        {
          "path": "packages/ui/src/hooks/use-stream.ts",
          "type": "registry:hook",
          "target": "hooks/use-stream.ts"
        }
      ],
      "description": "The SSE → parts[] streaming hook."
    },
    {
      "name": "chat-panel",
      "type": "registry:block",
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/thread",
        "@herald-ui/composer",
        "@herald-ui/model-picker",
        "@herald-ui/chat-types",
        "@herald-ui/tool-card",
        "@herald-ui/prompt-starters"
      ],
      "files": [
        {
          "path": "packages/ui/src/blocks/chat-panel.tsx",
          "type": "registry:component",
          "target": "blocks/chat-panel.tsx"
        }
      ],
      "description": "A full, drop-in chat surface — Thread + Composer + model picker."
    },
    {
      "name": "approval-card",
      "type": "registry:ui",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/button",
        "@herald-ui/chat-types"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/approval-card.tsx",
          "type": "registry:ui",
          "target": "components/ui/approval-card.tsx"
        }
      ],
      "description": "A human-in-the-loop permission gate rendered from an approval part."
    },
    {
      "name": "data-table",
      "type": "registry:ui",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/empty-state"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/data-table.tsx",
          "type": "registry:ui",
          "target": "components/ui/data-table.tsx"
        }
      ],
      "description": "A typed, sortable, multi-select table — zero table library."
    },
    {
      "name": "log-viewer",
      "type": "registry:ui",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/empty-state",
        "@herald-ui/filter-chip",
        "@herald-ui/input"
      ],
      "files": [
        {
          "path": "packages/ui/src/components/log-viewer.tsx",
          "type": "registry:ui",
          "target": "components/ui/log-viewer.tsx"
        }
      ],
      "description": "A live-tailing log console with severity filters and a reading-aware autoscroll."
    },
    {
      "name": "tool-manager",
      "type": "registry:block",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/button",
        "@herald-ui/input",
        "@herald-ui/spinner",
        "@herald-ui/status-badge",
        "@herald-ui/switch",
        "@herald-ui/dialog",
        "@herald-ui/alert-dialog",
        "@herald-ui/empty-state"
      ],
      "files": [
        {
          "path": "packages/ui/src/blocks/tool-manager.tsx",
          "type": "registry:component",
          "target": "blocks/tool-manager.tsx"
        }
      ],
      "description": "Manage an agent's built-in tools and MCP servers, per-tool toggles included."
    },
    {
      "name": "schedule-board",
      "type": "registry:block",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "@herald-ui/utils",
        "@herald-ui/button",
        "@herald-ui/empty-state",
        "@herald-ui/status-badge",
        "@herald-ui/switch",
        "@herald-ui/alert-dialog",
        "@herald-ui/recurrence-field",
        "@herald-ui/format"
      ],
      "files": [
        {
          "path": "packages/ui/src/blocks/schedule-board.tsx",
          "type": "registry:component",
          "target": "blocks/schedule-board.tsx"
        }
      ],
      "description": "The gateway's cron wall — recurring jobs, countdowns, pause/run/delete."
    },
    {
      "name": "app-shell",
      "type": "registry:block",
      "registryDependencies": [
        "@herald-ui/utils"
      ],
      "files": [
        {
          "path": "packages/ui/src/blocks/app-shell.tsx",
          "type": "registry:component",
          "target": "blocks/app-shell.tsx"
        }
      ],
      "description": "The sidebar + topbar + content frame for an AI OS."
    }
  ]
}
