diff --git a/public/registry.json b/public/registry.json
index e094048..0e0dca1 100644
--- a/public/registry.json
+++ b/public/registry.json
@@ -1,1790 +1,1227 @@
{
"$schema": "https://ui.shadcn.com/schema/registry.json",
- "name": "blode/ui",
"homepage": "https://blode.co/ui",
"items": [
{
- "name": "index",
- "type": "registry:style",
- "dependencies": ["class-variance-authority", "blode-icons-react"],
+ "name": "ui",
+ "type": "registry:base",
+ "title": "Blode UI",
+ "description": "Blode UI design-system base built on Base UI.",
+ "dependencies": [
+ "@base-ui/react",
+ "tw-animate-css",
+ "class-variance-authority",
+ "blode-icons-react"
+ ],
"registryDependencies": ["utils"],
- "files": [],
- "cssVars": {}
+ "cssVars": {
+ "theme": {
+ "field-height": "48px",
+ "field-height-sm": "40px",
+ "field-padding-x": "1rem",
+ "field-padding-y": "12px",
+ "field-radius": "var(--radius-2xl)",
+ "radius-2xl": "calc(var(--radius) + 8px)",
+ "radius-3xl": "calc(var(--radius) + 12px)",
+ "radius-4xl": "calc(var(--radius) + 16px)",
+ "radius-md": "calc(var(--radius) - 2px)",
+ "radius-sm": "calc(var(--radius) - 4px)",
+ "radius-xl": "calc(var(--radius) + 4px)",
+ "shadow-input": "0 1px 2px 0 rgb(0 0 0 / 0.05)",
+ "shadow-lg": "0 0 0 1px rgba(51, 51, 51, 0.04), 0 1px 1px 0.5px rgba(51, 51, 51, 0.04), 0 3px 3px -1.5px rgba(51, 51, 51, 0.02), 0 6px 6px -3px rgba(51, 51, 51, 0.04), 0 12px 12px -6px rgba(51, 51, 51, 0.04), 0 24px 24px -12px rgba(51, 51, 51, 0.04), 0 48px 48px -24px rgba(51, 51, 51, 0.04), 0 96px 96px -32px rgba(51, 51, 51, 0.06), inset 0 -1px 1px -0.5px rgba(51, 51, 51, 0.06)",
+ "shadow-md": "0 0 0 1px rgba(51, 51, 51, 0.04), 0 1px 1px 0.5px rgba(51, 51, 51, 0.04), 0 3px 3px -1.5px rgba(51, 51, 51, 0.02), 0 6px 6px -3px rgba(51, 51, 51, 0.04), 0 12px 12px -6px rgba(51, 51, 51, 0.04), 0 24px 24px -12px rgba(51, 51, 51, 0.04), 0 48px 48px -24px rgba(51, 51, 51, 0.04), inset 0 -1px 1px -0.5px rgba(51, 51, 51, 0.06)",
+ "shadow-popover": "0 24px 40px -12px oklch(0.255 0.078 116.06 / 0.08), 0 16px 28px -8px oklch(0.255 0.078 116.06 / 0.04), 0 4px 6px -2px oklch(0.255 0.078 116.06 / 0.04), 0 0 2px 0 oklch(0.255 0.078 116.06 / 0.04), 0 0 0 1px oklch(0.255 0.078 116.06 / 0.04)",
+ "shadow-sm": "0 0 0 1px rgba(51, 51, 51, 0.04), 0 16px 8px -8px rgba(51, 51, 51, 0.01), 0 12px 6px -6px rgba(51, 51, 51, 0.02), 0 5px 5px -2.5px rgba(51, 51, 51, 0.08), 0 1px 3px -1.5px rgba(51, 51, 51, 0.16), inset 0 -0.5px 0.5px rgba(51, 51, 51, 0.08)",
+ "shadow-soft": "0 15px 50px 0 rgba(27, 32, 50, 0.1)",
+ "shadow-xs": "0 0 0 1px rgba(51, 51, 51, 0.04), 0 4px 8px -2px rgba(51, 51, 51, 0.06), 0 2px 4px rgba(51, 51, 51, 0.04), 0 1px 2px rgba(51, 51, 51, 0.04), inset 0 -1px 1px -0.5px rgba(51, 51, 51, 0.06)",
+ "textarea-min-height": "70px"
+ },
+ "light": {
+ "code": "oklch(0.98 0 0)",
+ "code-foreground": "oklch(0.145 0 0)",
+ "input-hover": "oklch(0.87 0 0)",
+ "overlay": "oklch(0.832 0.015 251.2 / 0.7)",
+ "placeholder-foreground": "oklch(0.556 0 0)",
+ "success": "oklch(0.527 0.154 150.069)",
+ "success-foreground": "oklch(1 0 0)",
+ "surface": "oklch(0.98 0 0)",
+ "surface-foreground": "oklch(0.145 0 0)",
+ "warning": "oklch(0.681 0.162 75.834)",
+ "warning-foreground": "oklch(0.286 0.066 53.813)"
+ },
+ "dark": {
+ "code": "oklch(0.2 0 0)",
+ "code-foreground": "oklch(0.708 0 0)",
+ "input-hover": "oklch(1 0 0 / 25%)",
+ "overlay": "oklch(0.326 0.03 258.3 / 0.7)",
+ "placeholder-foreground": "oklch(0.708 0 0)",
+ "success": "oklch(0.723 0.219 149.579)",
+ "success-foreground": "oklch(0.266 0.065 152.934)",
+ "surface": "oklch(0.2 0 0)",
+ "surface-foreground": "oklch(0.708 0 0)",
+ "warning": "oklch(0.795 0.184 86.047)",
+ "warning-foreground": "oklch(0.286 0.066 53.813)"
+ }
+ },
+ "css": {
+ "@media (prefers-reduced-motion: reduce)": {
+ "*, *::before, *::after": {
+ "animation-duration": "0.01ms !important",
+ "animation-iteration-count": "1 !important",
+ "scroll-behavior": "auto !important",
+ "transition-duration": "0.01ms !important"
+ }
+ },
+ "@utility tabular-figures": {
+ "font-family": "var(--font-mono)",
+ "font-variant-numeric": "tabular-nums"
+ }
+ },
+ "config": {
+ "tailwind": {
+ "baseColor": "neutral",
+ "cssVariables": true
+ },
+ "iconLibrary": "blode-icons-react",
+ "registries": {
+ "@blode": "https://blode.co/ui/r/{name}.json"
+ }
+ }
},
{
"name": "accordion",
"type": "registry:ui",
- "dependencies": ["@base-ui/react"],
+ "title": "Accordion",
+ "description": "A vertically stacked set of interactive headings that reveal or hide associated content.",
+ "dependencies": ["@base-ui/react", "motion"],
"files": [
{
- "path": "registry/ui/accordion.tsx",
+ "path": "registry/default/ui/accordion.tsx",
"type": "registry:ui"
}
- ],
- "tailwind": {
- "config": {
- "theme": {
- "extend": {
- "keyframes": {
- "accordion-down": {
- "from": {
- "height": "0"
- },
- "to": {
- "height": "var(--radix-accordion-content-height)"
- }
- },
- "accordion-up": {
- "from": {
- "height": "var(--radix-accordion-content-height)"
- },
- "to": {
- "height": "0"
- }
- }
- },
- "animation": {
- "accordion-down": "accordion-down 0.2s ease-out",
- "accordion-up": "accordion-up 0.2s ease-out"
- }
- }
- }
- }
- }
+ ]
},
{
"name": "alert",
"type": "registry:ui",
+ "title": "Alert",
+ "description": "A callout that displays a short, important message to attract attention.",
"files": [
{
- "path": "registry/ui/alert.tsx",
+ "path": "registry/default/ui/alert.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "avatar",
+ "name": "alert-dialog",
"type": "registry:ui",
+ "title": "Alert Dialog",
+ "description": "A modal dialog that interrupts the user with important content and expects a response.",
"dependencies": ["@base-ui/react"],
+ "registryDependencies": ["button"],
"files": [
{
- "path": "registry/ui/avatar.tsx",
+ "path": "registry/default/ui/alert-dialog.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "badge",
+ "name": "aspect-ratio",
"type": "registry:ui",
+ "title": "Aspect Ratio",
+ "description": "A component that maintains a consistent width-to-height ratio.",
"dependencies": ["@base-ui/react"],
"files": [
{
- "path": "registry/ui/badge.tsx",
+ "path": "registry/default/ui/aspect-ratio.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "button",
+ "name": "autocomplete",
"type": "registry:ui",
+ "title": "Autocomplete",
+ "description": "An input that suggests matching values while typing.",
"dependencies": ["@base-ui/react"],
"files": [
{
- "path": "registry/ui/button.tsx",
+ "path": "registry/default/ui/autocomplete.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "card",
+ "name": "avatar",
"type": "registry:ui",
+ "title": "Avatar",
+ "description": "An image element with a fallback for representing the user.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "registry/ui/card.tsx",
+ "path": "registry/default/ui/avatar.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "collapsible",
+ "name": "bar-list",
"type": "registry:ui",
- "dependencies": ["@base-ui/react"],
+ "title": "Bar List",
+ "description": "A compact comparison list that visualises values as horizontal bars.",
"files": [
{
- "path": "registry/ui/collapsible.tsx",
+ "path": "registry/default/ui/bar-list.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "command",
+ "name": "badge",
"type": "registry:ui",
- "dependencies": ["cmdk"],
- "registryDependencies": ["dialog"],
+ "title": "Badge",
+ "description": "A small status indicator for labelling and categorising items.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "registry/ui/command.tsx",
+ "path": "registry/default/ui/badge.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "dialog",
+ "name": "breadcrumb",
"type": "registry:ui",
+ "title": "Breadcrumb",
+ "description": "A navigation aid that shows the current page location within a hierarchy.",
"dependencies": ["@base-ui/react"],
"files": [
{
- "path": "registry/ui/dialog.tsx",
+ "path": "registry/default/ui/breadcrumb.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "dropdown-menu",
+ "name": "button",
"type": "registry:ui",
+ "title": "Button",
+ "description": "An interactive element that triggers an action when clicked.",
"dependencies": ["@base-ui/react"],
+ "registryDependencies": ["spinner"],
"files": [
{
- "path": "registry/ui/dropdown-menu.tsx",
+ "path": "registry/default/ui/button.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "input",
+ "name": "button-group",
"type": "registry:ui",
+ "title": "Button Group",
+ "description": "A container that groups related buttons together with shared styling.",
+ "registryDependencies": ["button", "separator"],
"files": [
{
- "path": "registry/ui/input.tsx",
+ "path": "registry/default/ui/button-group.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "label",
+ "name": "calendar",
"type": "registry:ui",
- "dependencies": ["@base-ui/react"],
+ "title": "Calendar",
+ "description": "A date field component that allows users to pick dates.",
+ "dependencies": ["react-day-picker@latest", "date-fns"],
+ "registryDependencies": ["button"],
"files": [
{
- "path": "registry/ui/label.tsx",
+ "path": "registry/default/ui/calendar.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "popover",
+ "name": "card",
"type": "registry:ui",
- "dependencies": ["@base-ui/react"],
+ "title": "Card",
+ "description": "A container for grouping related content and actions.",
"files": [
{
- "path": "registry/ui/popover.tsx",
+ "path": "registry/default/ui/card.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "scroll-area",
+ "name": "carousel",
"type": "registry:ui",
- "dependencies": ["@base-ui/react"],
+ "title": "Carousel",
+ "description": "A slideshow component for cycling through a set of content.",
+ "dependencies": ["embla-carousel-react"],
+ "registryDependencies": ["button"],
"files": [
{
- "path": "registry/ui/scroll-area.tsx",
+ "path": "registry/default/ui/carousel.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "select",
+ "name": "circular-progress",
"type": "registry:ui",
- "dependencies": ["@base-ui/react"],
+ "title": "Circular Progress",
+ "description": "A circular indicator that shows the progress of a task.",
"files": [
{
- "path": "registry/ui/select.tsx",
+ "path": "registry/default/ui/circular-progress.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "separator",
+ "name": "checkbox",
"type": "registry:ui",
+ "title": "Checkbox",
+ "description": "A control that allows the user to toggle between checked and unchecked states.",
"dependencies": ["@base-ui/react"],
"files": [
{
- "path": "registry/ui/separator.tsx",
+ "path": "registry/default/ui/checkbox.tsx",
+ "type": "registry:ui"
+ },
+ {
+ "path": "registry/default/ui/checkbox.css",
"type": "registry:ui"
}
]
},
{
- "name": "sheet",
+ "name": "checkbox-group",
"type": "registry:ui",
+ "title": "Checkbox Group",
+ "description": "A grouped set of related checkboxes managed with shared state.",
"dependencies": ["@base-ui/react"],
+ "registryDependencies": ["checkbox"],
"files": [
{
- "path": "registry/ui/sheet.tsx",
+ "path": "registry/default/ui/checkbox-group.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "skeleton",
+ "name": "collapsible",
"type": "registry:ui",
+ "title": "Collapsible",
+ "description": "An interactive component that expands and collapses a panel of content.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "registry/ui/skeleton.tsx",
+ "path": "registry/default/ui/collapsible.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "sonner",
+ "name": "currency-input",
"type": "registry:ui",
- "dependencies": ["sonner", "next-themes"],
+ "title": "Currency Input",
+ "description": "A formatted input field for entering monetary values.",
+ "dependencies": ["blode-icons-react", "react-currency-input-field"],
"files": [
{
- "path": "registry/ui/sonner.tsx",
+ "path": "registry/default/ui/currency-input.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "switch",
+ "name": "combobox",
"type": "registry:ui",
- "dependencies": ["@base-ui/react"],
+ "title": "Combobox",
+ "description": "An autocomplete input that combines a text field with a filterable dropdown list.",
+ "dependencies": ["@base-ui/react", "blode-icons-react"],
+ "registryDependencies": ["button", "input-group"],
"files": [
{
- "path": "registry/ui/switch.tsx",
+ "path": "registry/default/ui/combobox.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "table",
+ "name": "multi-combobox",
"type": "registry:ui",
+ "title": "Multi Combobox",
+ "description": "A combobox that allows selecting multiple items with tag-style badges.",
+ "dependencies": ["@base-ui/react", "downshift", "lodash", "blode-icons-react"],
+ "registryDependencies": ["badge"],
"files": [
{
- "path": "registry/ui/table.tsx",
+ "path": "registry/default/ui/multi-combobox.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "tabs",
+ "name": "command",
"type": "registry:ui",
- "dependencies": ["@base-ui/react"],
+ "title": "Command",
+ "description": "A command palette for fast, keyboard-driven searching and navigation.",
+ "dependencies": ["cmdk"],
+ "registryDependencies": ["dialog"],
"files": [
{
- "path": "registry/ui/tabs.tsx",
+ "path": "registry/default/ui/command.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "tooltip",
+ "name": "context-menu",
"type": "registry:ui",
+ "title": "Context Menu",
+ "description": "A menu that appears on right-click, providing contextual actions.",
"dependencies": ["@base-ui/react"],
"files": [
{
- "path": "registry/ui/tooltip.tsx",
+ "path": "registry/default/ui/context-menu.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "accordion-demo",
- "type": "registry:example",
- "registryDependencies": ["accordion"],
- "files": [
- {
- "path": "examples/accordion-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "alert-demo",
- "type": "registry:example",
- "registryDependencies": ["alert"],
+ "name": "copy-button",
+ "type": "registry:ui",
+ "title": "Copy Button",
+ "description": "A button that copies text to the clipboard with animated feedback.",
+ "dependencies": ["blode-icons-react", "motion"],
+ "registryDependencies": ["button", "@blode/use-copy-to-clipboard"],
"files": [
{
- "path": "examples/alert-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/copy-button.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "alert-destructive",
- "type": "registry:example",
- "registryDependencies": ["alert"],
+ "name": "dialog",
+ "type": "registry:ui",
+ "title": "Dialog",
+ "description": "A modal window that overlays the main content and requires user interaction.",
+ "dependencies": ["@base-ui/react"],
+ "registryDependencies": ["button"],
"files": [
{
- "path": "examples/alert-destructive.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/dialog.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "alert-dialog-demo",
- "type": "registry:example",
- "registryDependencies": ["alert-dialog", "button"],
+ "name": "drawer",
+ "type": "registry:ui",
+ "title": "Drawer",
+ "description": "A panel that slides in from the edge of the screen.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/alert-dialog-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/drawer.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "aspect-ratio-demo",
- "type": "registry:example",
- "registryDependencies": ["aspect-ratio"],
+ "name": "dropdown-menu",
+ "type": "registry:ui",
+ "title": "Dropdown Menu",
+ "description": "A menu that opens from a trigger button, displaying a list of actions.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/aspect-ratio-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/dropdown-menu.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "avatar-demo",
- "type": "registry:example",
- "registryDependencies": ["avatar"],
+ "name": "empty",
+ "type": "registry:ui",
+ "title": "Empty",
+ "description": "A placeholder displayed when there is no content or data to show.",
"files": [
{
- "path": "examples/avatar-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/empty.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "badge-demo",
- "type": "registry:example",
- "registryDependencies": ["badge"],
+ "name": "field",
+ "type": "registry:ui",
+ "title": "Field",
+ "description": "A form field wrapper that pairs a label, input, and helper text.",
+ "registryDependencies": ["label", "separator"],
"files": [
{
- "path": "examples/badge-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/field.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "badge-destructive",
- "type": "registry:example",
- "registryDependencies": ["badge"],
+ "name": "form",
+ "type": "registry:ui",
+ "title": "Form",
+ "description": "A form component with validation powered by React Hook Form and Zod.",
+ "dependencies": ["@base-ui/react", "@hookform/resolvers", "zod", "react-hook-form"],
+ "registryDependencies": ["button", "label"],
"files": [
{
- "path": "examples/badge-destructive.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/form.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "badge-outline",
- "type": "registry:example",
- "registryDependencies": ["badge"],
+ "name": "hover-card",
+ "type": "registry:ui",
+ "title": "Hover Card",
+ "description": "A popup card that appears when hovering over a trigger element.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/badge-outline.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/hover-card.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "badge-green",
- "type": "registry:example",
- "registryDependencies": ["badge"],
+ "name": "input",
+ "type": "registry:ui",
+ "title": "Input",
+ "description": "A text input field for capturing user data.",
+ "dependencies": ["blode-icons-react"],
"files": [
{
- "path": "examples/badge-green.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/input.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "breadcrumb-demo",
- "type": "registry:example",
- "registryDependencies": ["breadcrumb"],
+ "name": "input-group",
+ "type": "registry:ui",
+ "title": "Input Group",
+ "description": "A wrapper that combines an input with addons like icons or buttons.",
+ "registryDependencies": ["button", "input", "textarea"],
"files": [
{
- "path": "examples/breadcrumb-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/input-group.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "breadcrumb-separator",
- "type": "registry:example",
- "registryDependencies": ["breadcrumb"],
+ "name": "input-otp",
+ "type": "registry:ui",
+ "title": "Input OTP",
+ "description": "A one-time password input with individual character fields.",
+ "dependencies": ["input-otp"],
"files": [
{
- "path": "examples/breadcrumb-separator.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/input-otp.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "breadcrumb-dropdown",
- "type": "registry:example",
- "registryDependencies": ["breadcrumb"],
+ "name": "item",
+ "type": "registry:ui",
+ "title": "Item",
+ "description": "A flexible list item component for menus, settings, and data rows.",
+ "dependencies": ["@base-ui/react"],
+ "registryDependencies": ["separator"],
"files": [
{
- "path": "examples/breadcrumb-dropdown.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/item.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "breadcrumb-ellipsis",
- "type": "registry:example",
- "registryDependencies": ["breadcrumb"],
+ "name": "label",
+ "type": "registry:ui",
+ "title": "Label",
+ "description": "An accessible label that associates text with a form control.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/breadcrumb-ellipsis.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/label.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "breadcrumb-link",
- "type": "registry:example",
- "registryDependencies": ["breadcrumb"],
+ "name": "menubar",
+ "type": "registry:ui",
+ "title": "Menubar",
+ "description": "A horizontal menu bar with dropdown menus, commonly used for application navigation.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/breadcrumb-link.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/menubar.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "breadcrumb-responsive",
- "type": "registry:example",
- "registryDependencies": ["breadcrumb"],
+ "name": "meter",
+ "type": "registry:ui",
+ "title": "Meter",
+ "description": "A meter that shows a scalar value within a bounded range.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/breadcrumb-responsive.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/meter.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "button-demo",
- "type": "registry:example",
- "registryDependencies": ["button"],
+ "name": "navigation-menu",
+ "type": "registry:ui",
+ "title": "Navigation Menu",
+ "description": "A responsive navigation component with support for dropdown panels.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/button-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/navigation-menu.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "button-secondary",
- "type": "registry:example",
- "registryDependencies": ["button"],
+ "name": "number-field",
+ "type": "registry:ui",
+ "title": "Number Field",
+ "description": "A numeric input with increment, decrement, and scrubbing interactions.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/button-secondary.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/number-field.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "button-destructive",
- "type": "registry:example",
+ "name": "pagination",
+ "type": "registry:ui",
+ "title": "Pagination",
+ "description": "A navigation component for paging through content across multiple pages.",
"registryDependencies": ["button"],
"files": [
{
- "path": "examples/button-destructive.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/pagination.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "button-ghost",
- "type": "registry:example",
- "registryDependencies": ["button"],
+ "name": "password-input",
+ "type": "registry:ui",
+ "title": "Password Input",
+ "description": "A password input with a toggle button to show or hide the password.",
+ "dependencies": ["blode-icons-react"],
+ "registryDependencies": ["input"],
"files": [
{
- "path": "examples/button-ghost.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/password-input.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "button-link",
- "type": "registry:example",
- "registryDependencies": ["button"],
+ "name": "phone-input",
+ "type": "registry:ui",
+ "title": "Phone Input",
+ "description": "An international phone number input with country code selector.",
+ "dependencies": ["blode-icons-react", "react-phone-number-input"],
+ "registryDependencies": ["button", "command", "input", "popover", "scroll-area"],
"files": [
{
- "path": "examples/button-link.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/phone-input.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "button-with-icon",
- "type": "registry:example",
- "registryDependencies": ["button"],
+ "name": "popover",
+ "type": "registry:ui",
+ "title": "Popover",
+ "description": "A floating panel that appears next to a trigger element.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/button-with-icon.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/popover.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "button-loading",
- "type": "registry:example",
- "registryDependencies": ["button"],
+ "name": "progress",
+ "type": "registry:ui",
+ "title": "Progress",
+ "description": "A horizontal bar that indicates the completion progress of a task.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/button-loading.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/progress.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "button-icon",
- "type": "registry:example",
- "registryDependencies": ["button"],
+ "name": "progress-list",
+ "type": "registry:ui",
+ "title": "Progress List",
+ "description": "A vertical list of progress items with completed and pending states.",
+ "dependencies": ["blode-icons-react"],
"files": [
{
- "path": "examples/button-icon.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/progress-list.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "button-as-child",
- "type": "registry:example",
+ "name": "prompt",
+ "type": "registry:ui",
+ "title": "Prompt",
+ "description": "A confirmation dialog that asks the user for input before proceeding.",
+ "dependencies": ["@base-ui/react"],
"registryDependencies": ["button"],
"files": [
{
- "path": "examples/button-as-child.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/prompt.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "calendar-demo",
- "type": "registry:example",
- "registryDependencies": ["calendar"],
+ "name": "radio-group",
+ "type": "registry:ui",
+ "title": "Radio Group",
+ "description": "A set of mutually exclusive options where only one can be selected.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/calendar-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/radio-group.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "calendar-form",
- "type": "registry:example",
- "registryDependencies": ["calendar", "form", "popover"],
+ "name": "resizable",
+ "type": "registry:ui",
+ "title": "Resizable",
+ "description": "A layout component with draggable handles for resizing panels.",
+ "dependencies": ["react-resizable-panels@^4"],
"files": [
{
- "path": "examples/calendar-form.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/resizable.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "card-demo",
- "type": "registry:example",
- "registryDependencies": ["card", "button", "switch"],
+ "name": "scroll-area",
+ "type": "registry:ui",
+ "title": "Scroll Area",
+ "description": "A scrollable container with custom styled scrollbars.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/card-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/scroll-area.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "card-with-form",
- "type": "registry:example",
- "registryDependencies": ["button", "card", "input", "label", "select"],
+ "name": "select",
+ "type": "registry:ui",
+ "title": "Select",
+ "description": "A dropdown control for choosing a single value from a list of options.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/card-with-form.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/select.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "carousel-demo",
- "type": "registry:example",
- "registryDependencies": ["carousel"],
+ "name": "separator",
+ "type": "registry:ui",
+ "title": "Separator",
+ "description": "A visual divider that separates content into distinct sections.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/carousel-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/separator.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "carousel-size",
- "type": "registry:example",
- "registryDependencies": ["carousel"],
+ "name": "sheet",
+ "type": "registry:ui",
+ "title": "Sheet",
+ "description": "A panel that slides in from the edge of the viewport with an overlay.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/carousel-size.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/sheet.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "carousel-spacing",
- "type": "registry:example",
- "registryDependencies": ["carousel"],
- "files": [
- {
- "path": "examples/carousel-spacing.tsx",
- "type": "registry:example"
+ "name": "sidebar",
+ "type": "registry:ui",
+ "title": "Sidebar",
+ "description": "A collapsible side navigation component with multiple layout variants.",
+ "dependencies": ["@base-ui/react", "class-variance-authority", "blode-icons-react"],
+ "registryDependencies": [
+ "button",
+ "separator",
+ "sheet",
+ "tooltip",
+ "input",
+ "@blode/use-mobile",
+ "skeleton"
+ ],
+ "cssVars": {
+ "light": {
+ "sidebar-accent": "240 4.8% 95.9%",
+ "sidebar-accent-foreground": "240 5.9% 10%",
+ "sidebar-background": "0 0% 98%",
+ "sidebar-border": "220 13% 91%",
+ "sidebar-foreground": "240 5.3% 26.1%",
+ "sidebar-primary": "240 5.9% 10%",
+ "sidebar-primary-foreground": "0 0% 98%",
+ "sidebar-ring": "217.2 91.2% 59.8%"
+ },
+ "dark": {
+ "sidebar-accent": "240 3.7% 15.9%",
+ "sidebar-accent-foreground": "240 4.8% 95.9%",
+ "sidebar-background": "240 5.9% 10%",
+ "sidebar-border": "240 3.7% 15.9%",
+ "sidebar-foreground": "240 4.8% 95.9%",
+ "sidebar-primary": "224.3 76.3% 48%",
+ "sidebar-primary-foreground": "0 0% 100%",
+ "sidebar-ring": "217.2 91.2% 59.8%"
+ }
+ },
+ "files": [
+ {
+ "path": "registry/default/ui/sidebar.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "carousel-orientation",
- "type": "registry:example",
- "registryDependencies": ["carousel"],
+ "name": "skeleton",
+ "type": "registry:ui",
+ "title": "Skeleton",
+ "description": "A placeholder animation that indicates content is loading.",
"files": [
{
- "path": "examples/carousel-orientation.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/skeleton.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "carousel-api",
- "type": "registry:example",
- "registryDependencies": ["carousel"],
+ "name": "slider",
+ "type": "registry:ui",
+ "title": "Slider",
+ "description": "A draggable control for selecting a numeric value within a range.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/carousel-api.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/slider.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "carousel-plugin",
- "type": "registry:example",
- "registryDependencies": ["carousel"],
+ "name": "sonner",
+ "type": "registry:ui",
+ "title": "Sonner",
+ "description": "A toast notification component powered by Sonner.",
+ "dependencies": ["sonner", "next-themes"],
"files": [
{
- "path": "examples/carousel-plugin.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/sonner.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "checkbox-demo",
- "type": "registry:example",
- "registryDependencies": ["checkbox"],
+ "name": "spinner",
+ "type": "registry:ui",
+ "title": "Spinner",
+ "description": "An animated loading indicator for asynchronous operations.",
"files": [
{
- "path": "examples/checkbox-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/spinner.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "checkbox-disabled",
- "type": "registry:example",
- "registryDependencies": ["checkbox"],
+ "name": "stat",
+ "type": "registry:ui",
+ "title": "Stat",
+ "description": "A compact metric card for showing a headline value and label.",
"files": [
{
- "path": "examples/checkbox-disabled.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/stat.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "checkbox-form-multiple",
- "type": "registry:example",
- "registryDependencies": ["checkbox", "form"],
+ "name": "switch",
+ "type": "registry:ui",
+ "title": "Switch",
+ "description": "A toggle control for switching between on and off states.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/checkbox-form-multiple.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/switch.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "checkbox-form-single",
- "type": "registry:example",
- "registryDependencies": ["checkbox", "form"],
+ "name": "table",
+ "type": "registry:ui",
+ "title": "Table",
+ "description": "A responsive table for displaying structured data in rows and columns.",
"files": [
{
- "path": "examples/checkbox-form-single.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/table.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "checkbox-with-text",
- "type": "registry:example",
- "registryDependencies": ["checkbox"],
+ "name": "tabs",
+ "type": "registry:ui",
+ "title": "Tabs",
+ "description": "A tabbed interface that organises content into switchable panels.",
+ "dependencies": ["@base-ui/react", "class-variance-authority", "merge-refs"],
+ "registryDependencies": ["@blode/use-tab-observer"],
"files": [
{
- "path": "examples/checkbox-with-text.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/tabs.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "collapsible-demo",
- "type": "registry:example",
- "registryDependencies": ["collapsible"],
+ "name": "textarea",
+ "type": "registry:ui",
+ "title": "Textarea",
+ "description": "A multi-line text input field for longer form content.",
"files": [
{
- "path": "examples/collapsible-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/textarea.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "combobox-demo",
- "type": "registry:example",
- "registryDependencies": ["command"],
+ "name": "toggle",
+ "type": "registry:ui",
+ "title": "Toggle",
+ "description": "A two-state button that can be toggled on or off.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/combobox-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/toggle.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "combobox-dropdown-menu",
- "type": "registry:example",
- "registryDependencies": ["command", "dropdown-menu", "button"],
+ "name": "toggle-group",
+ "type": "registry:ui",
+ "title": "Toggle Group",
+ "description": "A set of toggle buttons where one or more can be active.",
+ "dependencies": ["@base-ui/react"],
+ "registryDependencies": ["toggle"],
"files": [
{
- "path": "examples/combobox-dropdown-menu.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/toggle-group.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "combobox-form",
- "type": "registry:example",
- "registryDependencies": ["command", "form"],
+ "name": "tooltip",
+ "type": "registry:ui",
+ "title": "Tooltip",
+ "description": "A popup that displays helpful information when hovering or focusing an element.",
+ "dependencies": ["@base-ui/react"],
+ "docs": "The `tooltip` component has been added. Remember to wrap your app with the `TooltipProvider` component.\n\n```tsx title=\"app/layout.tsx\"\nimport { TooltipProvider } from \"@/components/ui/tooltip\"\n\nexport default function RootLayout({ children }: { children: React.ReactNode }) {\n return (\n \n
\n {children}\n \n \n )\n}\n```\n",
"files": [
{
- "path": "examples/combobox-form.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/tooltip.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "combobox-popover",
- "type": "registry:example",
- "registryDependencies": ["combobox", "popover"],
+ "name": "kbd",
+ "type": "registry:ui",
+ "title": "Kbd",
+ "description": "A styled keyboard key indicator for displaying shortcuts and key combinations.",
"files": [
{
- "path": "examples/combobox-popover.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/kbd.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "combobox-responsive",
- "type": "registry:example",
- "registryDependencies": ["combobox", "popover", "drawer"],
+ "name": "native-select",
+ "type": "registry:ui",
+ "title": "Native Select",
+ "description": "A styled wrapper around the native HTML select element.",
"files": [
{
- "path": "examples/combobox-responsive.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/native-select.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "command-demo",
- "type": "registry:example",
- "registryDependencies": ["command"],
+ "name": "direction",
+ "type": "registry:ui",
+ "title": "Direction",
+ "description": "A context provider for managing text direction (LTR/RTL) across components.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/command-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/direction.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "command-dialog",
- "type": "registry:example",
- "registryDependencies": ["command", "dialog"],
+ "name": "file-thumbnail",
+ "type": "registry:ui",
+ "title": "File Thumbnail",
+ "description": "A square preview tile for an attached file — an image thumbnail or a file icon with name.",
"files": [
{
- "path": "examples/command-dialog.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/file-thumbnail.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "context-menu-demo",
- "type": "registry:example",
- "registryDependencies": ["context-menu"],
+ "name": "chat-message",
+ "type": "registry:ui",
+ "title": "Chat Message",
+ "description": "A chat transcript entry for user and assistant messages, with attachments and a hover meta row.",
+ "dependencies": ["motion"],
+ "registryDependencies": ["file-thumbnail"],
"files": [
{
- "path": "examples/context-menu-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/chat-message.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "data-table-demo",
- "type": "registry:example",
- "registryDependencies": ["data-table"],
+ "name": "input-message",
+ "type": "registry:ui",
+ "title": "Input Message",
+ "description": "A chat composer with an auto-resizing textarea, action slots, a send button, and drag-and-drop attachments.",
+ "dependencies": ["motion", "react-textarea-autosize"],
+ "registryDependencies": ["button", "file-thumbnail"],
"files": [
{
- "path": "examples/data-table-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/input-message.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "date-picker-demo",
- "type": "registry:example",
- "dependencies": ["date-fns"],
- "registryDependencies": ["button", "calendar", "popover"],
+ "name": "thinking-indicator",
+ "type": "registry:ui",
+ "title": "Thinking Indicator",
+ "description": "An animated status indicator with a morphing glyph and cycling text for thinking states.",
+ "dependencies": ["motion"],
"files": [
{
- "path": "examples/date-picker-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/thinking-indicator.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "date-picker-form",
- "type": "registry:example",
- "dependencies": ["date-fns"],
- "registryDependencies": ["button", "calendar", "form", "popover"],
+ "name": "thinking-steps",
+ "type": "registry:ui",
+ "title": "Thinking Steps",
+ "description": "A collapsible chain-of-thought stepper with steps, sources, details, and images.",
+ "dependencies": ["motion"],
+ "registryDependencies": ["accordion", "badge"],
"files": [
{
- "path": "examples/date-picker-form.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/thinking-steps.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "date-picker-with-presets",
- "type": "registry:example",
- "dependencies": ["date-fns"],
- "registryDependencies": ["button", "calendar", "popover", "select"],
+ "name": "ask-user-questions",
+ "type": "registry:ui",
+ "title": "Ask User Questions",
+ "description": "A stepped questionnaire with single- or multi-select options, free-form answers, and skip.",
+ "dependencies": ["motion"],
+ "registryDependencies": ["button", "badge", "textarea"],
"files": [
{
- "path": "examples/date-picker-with-presets.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/ask-user-questions.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "date-picker-with-range",
- "type": "registry:example",
- "dependencies": ["date-fns"],
- "registryDependencies": ["button", "calendar", "popover"],
+ "name": "bubble",
+ "type": "registry:ui",
+ "title": "Bubble",
+ "description": "A message surface for chat interfaces, with variants, alignment, reactions, and composable content.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/date-picker-with-range.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/bubble.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "dialog-demo",
- "type": "registry:example",
- "registryDependencies": ["dialog"],
+ "name": "message",
+ "type": "registry:ui",
+ "title": "Message",
+ "description": "A row primitive for chat transcripts, pairing an avatar with content, header, and footer, aligned to the start or end.",
"files": [
{
- "path": "examples/dialog-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/message.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "dialog-close-button",
- "type": "registry:example",
- "registryDependencies": ["dialog", "button"],
+ "name": "message-scroller",
+ "type": "registry:ui",
+ "title": "Message Scroller",
+ "description": "A chat scroll container that anchors turns, opens saved transcripts, follows streamed responses, loads history without jumping, and jumps to any message.",
+ "dependencies": ["@shadcn/react"],
+ "registryDependencies": ["button"],
"files": [
{
- "path": "examples/dialog-close-button.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/message-scroller.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "drawer-demo",
- "type": "registry:example",
- "registryDependencies": ["drawer"],
+ "name": "attachment",
+ "type": "registry:ui",
+ "title": "Attachment",
+ "description": "A card for files and images with upload, processing, error, and done states, an optional full-card trigger, and a scrollable group.",
+ "dependencies": ["@base-ui/react"],
+ "registryDependencies": ["button"],
"files": [
{
- "path": "examples/drawer-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/attachment.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "drawer-dialog",
- "type": "registry:example",
- "registryDependencies": ["drawer", "dialog"],
+ "name": "marker",
+ "type": "registry:ui",
+ "title": "Marker",
+ "description": "A compact inline status line for activity feeds and transcripts, with optional icon, separator, and border variants.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/drawer-dialog.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/marker.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "dropdown-menu-demo",
- "type": "registry:example",
- "registryDependencies": ["dropdown-menu"],
+ "name": "utils",
+ "type": "registry:lib",
+ "title": "Utils",
+ "description": "Utility functions including cn() for merging Tailwind CSS classes.",
+ "dependencies": ["clsx", "tailwind-merge"],
"files": [
{
- "path": "examples/dropdown-menu-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/lib/utils.ts",
+ "type": "registry:lib"
}
]
},
{
- "name": "dropdown-menu-checkboxes",
- "type": "registry:example",
- "registryDependencies": ["dropdown-menu", "checkbox"],
+ "name": "use-copy-to-clipboard",
+ "type": "registry:lib",
+ "title": "Use Copy To Clipboard",
+ "description": "A hook that copies text to the clipboard and resets after a timeout.",
"files": [
{
- "path": "examples/dropdown-menu-checkboxes.tsx",
- "type": "registry:example"
+ "path": "registry/default/hooks/use-copy-to-clipboard.ts",
+ "type": "registry:lib"
}
]
},
{
- "name": "dropdown-menu-radio-group",
- "type": "registry:example",
- "registryDependencies": ["dropdown-menu", "radio-group"],
+ "name": "use-mobile",
+ "type": "registry:lib",
+ "title": "Use Mobile",
+ "description": "A hook that detects whether the viewport matches a mobile breakpoint.",
"files": [
{
- "path": "examples/dropdown-menu-radio-group.tsx",
- "type": "registry:example"
+ "path": "registry/default/hooks/use-mobile.ts",
+ "type": "registry:lib"
}
]
},
{
- "name": "hover-card-demo",
- "type": "registry:example",
- "registryDependencies": ["hover-card"],
- "files": [
- {
- "path": "examples/hover-card-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-demo",
- "type": "registry:example",
- "registryDependencies": ["input"],
- "files": [
- {
- "path": "examples/input-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-disabled",
- "type": "registry:example",
- "registryDependencies": ["input"],
- "files": [
- {
- "path": "examples/input-disabled.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-file",
- "type": "registry:example",
- "registryDependencies": ["input"],
- "files": [
- {
- "path": "examples/input-file.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-form",
- "type": "registry:example",
- "registryDependencies": ["input", "button", "form"],
- "files": [
- {
- "path": "examples/input-form.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-with-button",
- "type": "registry:example",
- "registryDependencies": ["input", "button"],
- "files": [
- {
- "path": "examples/input-with-button.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-with-label",
- "type": "registry:example",
- "registryDependencies": ["input", "button", "label"],
- "files": [
- {
- "path": "examples/input-with-label.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-with-text",
- "type": "registry:example",
- "registryDependencies": ["input", "button", "label"],
- "files": [
- {
- "path": "examples/input-with-text.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-otp-demo",
- "type": "registry:example",
- "registryDependencies": ["input-otp"],
- "files": [
- {
- "path": "examples/input-otp-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-otp-pattern",
- "type": "registry:example",
- "registryDependencies": ["input-otp"],
- "files": [
- {
- "path": "examples/input-otp-pattern.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-otp-separator",
- "type": "registry:example",
- "registryDependencies": ["input-otp"],
- "files": [
- {
- "path": "examples/input-otp-separator.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-otp-controlled",
- "type": "registry:example",
- "registryDependencies": ["input-otp"],
- "files": [
- {
- "path": "examples/input-otp-controlled.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-otp-form",
- "type": "registry:example",
- "registryDependencies": ["input-otp", "form"],
- "files": [
- {
- "path": "examples/input-otp-form.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "label-demo",
- "type": "registry:example",
- "registryDependencies": ["label"],
- "files": [
- {
- "path": "examples/label-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "menubar-demo",
- "type": "registry:example",
- "registryDependencies": ["menubar"],
- "files": [
- {
- "path": "examples/menubar-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "navigation-menu-demo",
- "type": "registry:example",
- "registryDependencies": ["navigation-menu"],
- "files": [
- {
- "path": "examples/navigation-menu-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "pagination-demo",
- "type": "registry:example",
- "registryDependencies": ["pagination"],
- "files": [
- {
- "path": "examples/pagination-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "popover-demo",
- "type": "registry:example",
- "registryDependencies": ["popover"],
- "files": [
- {
- "path": "examples/popover-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "progress-demo",
- "type": "registry:example",
- "registryDependencies": ["progress"],
- "files": [
- {
- "path": "examples/progress-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "radio-group-demo",
- "type": "registry:example",
- "registryDependencies": ["radio-group"],
- "files": [
- {
- "path": "examples/radio-group-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "radio-group-form",
- "type": "registry:example",
- "registryDependencies": ["radio-group", "form"],
- "files": [
- {
- "path": "examples/radio-group-form.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "resizable-demo",
- "type": "registry:example",
- "registryDependencies": ["resizable"],
- "files": [
- {
- "path": "examples/resizable-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "resizable-demo-with-handle",
- "type": "registry:example",
- "registryDependencies": ["resizable"],
- "files": [
- {
- "path": "examples/resizable-demo-with-handle.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "resizable-vertical",
- "type": "registry:example",
- "registryDependencies": ["resizable"],
- "files": [
- {
- "path": "examples/resizable-vertical.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "resizable-handle",
- "type": "registry:example",
- "registryDependencies": ["resizable"],
- "files": [
- {
- "path": "examples/resizable-handle.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "scroll-area-demo",
- "type": "registry:example",
- "registryDependencies": ["scroll-area"],
- "files": [
- {
- "path": "examples/scroll-area-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "scroll-area-horizontal-demo",
- "type": "registry:example",
- "registryDependencies": ["scroll-area"],
- "files": [
- {
- "path": "examples/scroll-area-horizontal-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "select-demo",
- "type": "registry:example",
- "registryDependencies": ["select"],
- "files": [
- {
- "path": "examples/select-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "select-scrollable",
- "type": "registry:example",
- "registryDependencies": ["select"],
- "files": [
- {
- "path": "examples/select-scrollable.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "select-form",
- "type": "registry:example",
- "registryDependencies": ["select"],
- "files": [
- {
- "path": "examples/select-form.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "separator-demo",
- "type": "registry:example",
- "registryDependencies": ["separator"],
- "files": [
- {
- "path": "examples/separator-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "sheet-demo",
- "type": "registry:example",
- "registryDependencies": ["sheet"],
- "files": [
- {
- "path": "examples/sheet-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "sheet-side",
- "type": "registry:example",
- "registryDependencies": ["sheet"],
- "files": [
- {
- "path": "examples/sheet-side.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "skeleton-demo",
- "type": "registry:example",
- "registryDependencies": ["skeleton"],
- "files": [
- {
- "path": "examples/skeleton-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "skeleton-card",
- "type": "registry:example",
- "registryDependencies": ["skeleton"],
- "files": [
- {
- "path": "examples/skeleton-card.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "slider-demo",
- "type": "registry:example",
- "registryDependencies": ["slider"],
- "files": [
- {
- "path": "examples/slider-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "sonner-demo",
- "type": "registry:example",
- "registryDependencies": ["sonner"],
- "files": [
- {
- "path": "examples/sonner-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "switch-demo",
- "type": "registry:example",
- "registryDependencies": ["switch"],
- "files": [
- {
- "path": "examples/switch-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "switch-form",
- "type": "registry:example",
- "registryDependencies": ["switch", "form"],
- "files": [
- {
- "path": "examples/switch-form.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "table-demo",
- "type": "registry:example",
- "registryDependencies": ["table"],
- "files": [
- {
- "path": "examples/table-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "tabs-demo",
- "type": "registry:example",
- "registryDependencies": ["tabs"],
- "files": [
- {
- "path": "examples/tabs-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "textarea-demo",
- "type": "registry:example",
- "registryDependencies": ["textarea"],
- "files": [
- {
- "path": "examples/textarea-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "textarea-disabled",
- "type": "registry:example",
- "registryDependencies": ["textarea"],
- "files": [
- {
- "path": "examples/textarea-disabled.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "textarea-form",
- "type": "registry:example",
- "registryDependencies": ["textarea", "form"],
- "files": [
- {
- "path": "examples/textarea-form.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "textarea-with-button",
- "type": "registry:example",
- "registryDependencies": ["textarea", "button"],
- "files": [
- {
- "path": "examples/textarea-with-button.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "textarea-with-label",
- "type": "registry:example",
- "registryDependencies": ["textarea", "label"],
- "files": [
- {
- "path": "examples/textarea-with-label.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "textarea-with-text",
- "type": "registry:example",
- "registryDependencies": ["textarea", "label"],
- "files": [
- {
- "path": "examples/textarea-with-text.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-group-demo",
- "type": "registry:example",
- "registryDependencies": ["toggle-group"],
- "files": [
- {
- "path": "examples/toggle-group-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-group-disabled",
- "type": "registry:example",
- "registryDependencies": ["toggle-group"],
- "files": [
- {
- "path": "examples/toggle-group-disabled.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-group-lg",
- "type": "registry:example",
- "registryDependencies": ["toggle-group"],
- "files": [
- {
- "path": "examples/toggle-group-lg.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-group-outline",
- "type": "registry:example",
- "registryDependencies": ["toggle-group"],
- "files": [
- {
- "path": "examples/toggle-group-outline.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-group-sm",
- "type": "registry:example",
- "registryDependencies": ["toggle-group"],
- "files": [
- {
- "path": "examples/toggle-group-sm.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-group-single",
- "type": "registry:example",
- "registryDependencies": ["toggle-group"],
- "files": [
- {
- "path": "examples/toggle-group-single.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-demo",
- "type": "registry:example",
- "registryDependencies": ["toggle"],
- "files": [
- {
- "path": "examples/toggle-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-disabled",
- "type": "registry:example",
- "registryDependencies": ["toggle"],
- "files": [
- {
- "path": "examples/toggle-disabled.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-lg",
- "type": "registry:example",
- "registryDependencies": ["toggle"],
- "files": [
- {
- "path": "examples/toggle-lg.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-outline",
- "type": "registry:example",
- "registryDependencies": ["toggle"],
- "files": [
- {
- "path": "examples/toggle-outline.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-sm",
- "type": "registry:example",
- "registryDependencies": ["toggle"],
- "files": [
- {
- "path": "examples/toggle-sm.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-with-text",
- "type": "registry:example",
- "registryDependencies": ["toggle"],
- "files": [
- {
- "path": "examples/toggle-with-text.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "tooltip-demo",
- "type": "registry:example",
- "registryDependencies": ["tooltip"],
- "files": [
- {
- "path": "examples/tooltip-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-blockquote",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-blockquote.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-demo",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-h1",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-h1.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-h2",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-h2.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-h3",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-h3.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-h4",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-h4.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-inline-code",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-inline-code.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-large",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-large.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-lead",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-lead.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-list",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-list.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-muted",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-muted.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-p",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-p.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-small",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-small.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-table",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-table.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "mode-toggle",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/mode-toggle.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "utils",
+ "name": "use-tab-observer",
"type": "registry:lib",
- "dependencies": ["clsx", "tailwind-merge"],
+ "title": "Use Tab Observer",
+ "description": "A hook that observes and tracks the active tab indicator position.",
"files": [
{
- "path": "registry/lib/utils.ts",
+ "path": "registry/default/hooks/use-tab-observer.ts",
"type": "registry:lib"
}
]
}
- ]
+ ],
+ "name": "blode"
}
diff --git a/registry.json b/registry.json
deleted file mode 100644
index 4a52e60..0000000
--- a/registry.json
+++ /dev/null
@@ -1,1860 +0,0 @@
-{
- "name": "blode/ui",
- "homepage": "https://blode.co/ui",
- "items": [
- {
- "name": "index",
- "type": "registry:style",
- "dependencies": ["class-variance-authority", "blode-icons-react"],
- "registryDependencies": ["utils"],
- "files": [],
- "cssVars": {}
- },
- {
- "name": "accordion",
- "type": "registry:ui",
- "dependencies": ["@base-ui/react"],
- "files": [
- {
- "path": "registry/ui/accordion.tsx",
- "type": "registry:ui"
- }
- ],
- "tailwind": {
- "config": {
- "theme": {
- "extend": {
- "keyframes": {
- "accordion-down": {
- "from": {
- "height": "0"
- },
- "to": {
- "height": "var(--radix-accordion-content-height)"
- }
- },
- "accordion-up": {
- "from": {
- "height": "var(--radix-accordion-content-height)"
- },
- "to": {
- "height": "0"
- }
- }
- },
- "animation": {
- "accordion-down": "accordion-down 0.2s ease-out",
- "accordion-up": "accordion-up 0.2s ease-out"
- }
- }
- }
- }
- }
- },
- {
- "name": "alert",
- "type": "registry:ui",
- "files": [
- {
- "path": "registry/ui/alert.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "avatar",
- "type": "registry:ui",
- "dependencies": ["@base-ui/react"],
- "files": [
- {
- "path": "registry/ui/avatar.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "badge",
- "type": "registry:ui",
- "dependencies": ["@base-ui/react"],
- "files": [
- {
- "path": "registry/ui/badge.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "button",
- "type": "registry:ui",
- "dependencies": ["@base-ui/react"],
- "files": [
- {
- "path": "registry/ui/button.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "card",
- "type": "registry:ui",
- "files": [
- {
- "path": "registry/ui/card.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "collapsible",
- "type": "registry:ui",
- "dependencies": ["@base-ui/react"],
- "files": [
- {
- "path": "registry/ui/collapsible.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "command",
- "type": "registry:ui",
- "dependencies": ["cmdk"],
- "registryDependencies": ["dialog"],
- "files": [
- {
- "path": "registry/ui/command.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "dialog",
- "type": "registry:ui",
- "dependencies": ["@base-ui/react"],
- "files": [
- {
- "path": "registry/ui/dialog.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "dropdown-menu",
- "type": "registry:ui",
- "dependencies": ["@base-ui/react"],
- "files": [
- {
- "path": "registry/ui/dropdown-menu.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "input",
- "type": "registry:ui",
- "files": [
- {
- "path": "registry/ui/input.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "label",
- "type": "registry:ui",
- "dependencies": ["@base-ui/react"],
- "files": [
- {
- "path": "registry/ui/label.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "popover",
- "type": "registry:ui",
- "dependencies": ["@base-ui/react"],
- "files": [
- {
- "path": "registry/ui/popover.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "scroll-area",
- "type": "registry:ui",
- "dependencies": ["@base-ui/react"],
- "files": [
- {
- "path": "registry/ui/scroll-area.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "select",
- "type": "registry:ui",
- "dependencies": ["@base-ui/react"],
- "files": [
- {
- "path": "registry/ui/select.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "separator",
- "type": "registry:ui",
- "dependencies": ["@base-ui/react"],
- "files": [
- {
- "path": "registry/ui/separator.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "sheet",
- "type": "registry:ui",
- "dependencies": ["@base-ui/react"],
- "files": [
- {
- "path": "registry/ui/sheet.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "skeleton",
- "type": "registry:ui",
- "files": [
- {
- "path": "registry/ui/skeleton.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "sonner",
- "type": "registry:ui",
- "dependencies": ["sonner", "next-themes"],
- "files": [
- {
- "path": "registry/ui/sonner.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "switch",
- "type": "registry:ui",
- "dependencies": ["@base-ui/react"],
- "files": [
- {
- "path": "registry/ui/switch.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "table",
- "type": "registry:ui",
- "files": [
- {
- "path": "registry/ui/table.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "tabs",
- "type": "registry:ui",
- "dependencies": ["@base-ui/react"],
- "files": [
- {
- "path": "registry/ui/tabs.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "tooltip",
- "type": "registry:ui",
- "dependencies": ["@base-ui/react"],
- "files": [
- {
- "path": "registry/ui/tooltip.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "accordion-demo",
- "type": "registry:example",
- "registryDependencies": ["accordion"],
- "files": [
- {
- "path": "examples/accordion-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "alert-demo",
- "type": "registry:example",
- "registryDependencies": ["alert"],
- "files": [
- {
- "path": "examples/alert-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "alert-destructive",
- "type": "registry:example",
- "registryDependencies": ["alert"],
- "files": [
- {
- "path": "examples/alert-destructive.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "alert-dialog-demo",
- "type": "registry:example",
- "registryDependencies": ["alert-dialog", "button"],
- "files": [
- {
- "path": "examples/alert-dialog-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "aspect-ratio-demo",
- "type": "registry:example",
- "registryDependencies": ["aspect-ratio"],
- "files": [
- {
- "path": "examples/aspect-ratio-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "avatar-demo",
- "type": "registry:example",
- "registryDependencies": ["avatar"],
- "files": [
- {
- "path": "examples/avatar-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "badge-demo",
- "type": "registry:example",
- "registryDependencies": ["badge"],
- "files": [
- {
- "path": "examples/badge-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "badge-destructive",
- "type": "registry:example",
- "registryDependencies": ["badge"],
- "files": [
- {
- "path": "examples/badge-destructive.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "badge-outline",
- "type": "registry:example",
- "registryDependencies": ["badge"],
- "files": [
- {
- "path": "examples/badge-outline.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "badge-green",
- "type": "registry:example",
- "registryDependencies": ["badge"],
- "files": [
- {
- "path": "examples/badge-green.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "breadcrumb-demo",
- "type": "registry:example",
- "registryDependencies": ["breadcrumb"],
- "files": [
- {
- "path": "examples/breadcrumb-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "breadcrumb-separator",
- "type": "registry:example",
- "registryDependencies": ["breadcrumb"],
- "files": [
- {
- "path": "examples/breadcrumb-separator.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "breadcrumb-dropdown",
- "type": "registry:example",
- "registryDependencies": ["breadcrumb"],
- "files": [
- {
- "path": "examples/breadcrumb-dropdown.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "breadcrumb-ellipsis",
- "type": "registry:example",
- "registryDependencies": ["breadcrumb"],
- "files": [
- {
- "path": "examples/breadcrumb-ellipsis.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "breadcrumb-link",
- "type": "registry:example",
- "registryDependencies": ["breadcrumb"],
- "files": [
- {
- "path": "examples/breadcrumb-link.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "breadcrumb-responsive",
- "type": "registry:example",
- "registryDependencies": ["breadcrumb"],
- "files": [
- {
- "path": "examples/breadcrumb-responsive.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "button-demo",
- "type": "registry:example",
- "registryDependencies": ["button"],
- "files": [
- {
- "path": "examples/button-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "button-secondary",
- "type": "registry:example",
- "registryDependencies": ["button"],
- "files": [
- {
- "path": "examples/button-secondary.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "button-destructive",
- "type": "registry:example",
- "registryDependencies": ["button"],
- "files": [
- {
- "path": "examples/button-destructive.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "button-outline",
- "type": "registry:example",
- "registryDependencies": ["button"],
- "files": [
- {
- "path": "examples/button-outline.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "button-ghost",
- "type": "registry:example",
- "registryDependencies": ["button"],
- "files": [
- {
- "path": "examples/button-ghost.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "button-link",
- "type": "registry:example",
- "registryDependencies": ["button"],
- "files": [
- {
- "path": "examples/button-link.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "button-with-icon",
- "type": "registry:example",
- "registryDependencies": ["button"],
- "files": [
- {
- "path": "examples/button-with-icon.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "button-loading",
- "type": "registry:example",
- "registryDependencies": ["button"],
- "files": [
- {
- "path": "examples/button-loading.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "button-icon",
- "type": "registry:example",
- "registryDependencies": ["button"],
- "files": [
- {
- "path": "examples/button-icon.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "button-as-child",
- "type": "registry:example",
- "registryDependencies": ["button"],
- "files": [
- {
- "path": "examples/button-as-child.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "calendar-demo",
- "type": "registry:example",
- "registryDependencies": ["calendar"],
- "files": [
- {
- "path": "examples/calendar-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "calendar-form",
- "type": "registry:example",
- "registryDependencies": ["calendar", "form", "popover"],
- "files": [
- {
- "path": "examples/calendar-form.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "card-demo",
- "type": "registry:example",
- "registryDependencies": ["card", "button", "switch"],
- "files": [
- {
- "path": "examples/card-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "card-with-form",
- "type": "registry:example",
- "registryDependencies": ["button", "card", "input", "label", "select"],
- "files": [
- {
- "path": "examples/card-with-form.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "carousel-demo",
- "type": "registry:example",
- "registryDependencies": ["carousel"],
- "files": [
- {
- "path": "examples/carousel-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "carousel-size",
- "type": "registry:example",
- "registryDependencies": ["carousel"],
- "files": [
- {
- "path": "examples/carousel-size.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "carousel-spacing",
- "type": "registry:example",
- "registryDependencies": ["carousel"],
- "files": [
- {
- "path": "examples/carousel-spacing.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "carousel-orientation",
- "type": "registry:example",
- "registryDependencies": ["carousel"],
- "files": [
- {
- "path": "examples/carousel-orientation.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "carousel-api",
- "type": "registry:example",
- "registryDependencies": ["carousel"],
- "files": [
- {
- "path": "examples/carousel-api.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "carousel-plugin",
- "type": "registry:example",
- "registryDependencies": ["carousel"],
- "files": [
- {
- "path": "examples/carousel-plugin.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "checkbox-demo",
- "type": "registry:example",
- "registryDependencies": ["checkbox"],
- "files": [
- {
- "path": "examples/checkbox-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "checkbox-disabled",
- "type": "registry:example",
- "registryDependencies": ["checkbox"],
- "files": [
- {
- "path": "examples/checkbox-disabled.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "checkbox-form-multiple",
- "type": "registry:example",
- "registryDependencies": ["checkbox", "form"],
- "files": [
- {
- "path": "examples/checkbox-form-multiple.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "checkbox-form-single",
- "type": "registry:example",
- "registryDependencies": ["checkbox", "form"],
- "files": [
- {
- "path": "examples/checkbox-form-single.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "checkbox-with-text",
- "type": "registry:example",
- "registryDependencies": ["checkbox"],
- "files": [
- {
- "path": "examples/checkbox-with-text.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "collapsible-demo",
- "type": "registry:example",
- "registryDependencies": ["collapsible"],
- "files": [
- {
- "path": "examples/collapsible-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "combobox-demo",
- "type": "registry:example",
- "registryDependencies": ["command"],
- "files": [
- {
- "path": "examples/combobox-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "combobox-dropdown-menu",
- "type": "registry:example",
- "registryDependencies": ["command", "dropdown-menu", "button"],
- "files": [
- {
- "path": "examples/combobox-dropdown-menu.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "combobox-form",
- "type": "registry:example",
- "registryDependencies": ["command", "form"],
- "files": [
- {
- "path": "examples/combobox-form.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "combobox-popover",
- "type": "registry:example",
- "registryDependencies": ["combobox", "popover"],
- "files": [
- {
- "path": "examples/combobox-popover.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "combobox-responsive",
- "type": "registry:example",
- "registryDependencies": ["combobox", "popover", "drawer"],
- "files": [
- {
- "path": "examples/combobox-responsive.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "command-demo",
- "type": "registry:example",
- "registryDependencies": ["command"],
- "files": [
- {
- "path": "examples/command-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "command-dialog",
- "type": "registry:example",
- "registryDependencies": ["command", "dialog"],
- "files": [
- {
- "path": "examples/command-dialog.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "context-menu-demo",
- "type": "registry:example",
- "registryDependencies": ["context-menu"],
- "files": [
- {
- "path": "examples/context-menu-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "data-table-demo",
- "type": "registry:example",
- "registryDependencies": ["data-table"],
- "files": [
- {
- "path": "examples/data-table-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "date-picker-demo",
- "type": "registry:example",
- "dependencies": ["date-fns"],
- "registryDependencies": ["button", "calendar", "popover"],
- "files": [
- {
- "path": "examples/date-picker-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "date-picker-form",
- "type": "registry:example",
- "dependencies": ["date-fns"],
- "registryDependencies": ["button", "calendar", "form", "popover"],
- "files": [
- {
- "path": "examples/date-picker-form.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "date-picker-with-presets",
- "type": "registry:example",
- "dependencies": ["date-fns"],
- "registryDependencies": ["button", "calendar", "popover", "select"],
- "files": [
- {
- "path": "examples/date-picker-with-presets.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "date-picker-with-range",
- "type": "registry:example",
- "dependencies": ["date-fns"],
- "registryDependencies": ["button", "calendar", "popover"],
- "files": [
- {
- "path": "examples/date-picker-with-range.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "dialog-demo",
- "type": "registry:example",
- "registryDependencies": ["dialog"],
- "files": [
- {
- "path": "examples/dialog-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "dialog-close-button",
- "type": "registry:example",
- "registryDependencies": ["dialog", "button"],
- "files": [
- {
- "path": "examples/dialog-close-button.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "drawer-demo",
- "type": "registry:example",
- "registryDependencies": ["drawer"],
- "files": [
- {
- "path": "examples/drawer-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "drawer-dialog",
- "type": "registry:example",
- "registryDependencies": ["drawer", "dialog"],
- "files": [
- {
- "path": "examples/drawer-dialog.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "dropdown-menu-demo",
- "type": "registry:example",
- "registryDependencies": ["dropdown-menu"],
- "files": [
- {
- "path": "examples/dropdown-menu-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "dropdown-menu-checkboxes",
- "type": "registry:example",
- "registryDependencies": ["dropdown-menu", "checkbox"],
- "files": [
- {
- "path": "examples/dropdown-menu-checkboxes.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "dropdown-menu-radio-group",
- "type": "registry:example",
- "registryDependencies": ["dropdown-menu", "radio-group"],
- "files": [
- {
- "path": "examples/dropdown-menu-radio-group.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "hover-card-demo",
- "type": "registry:example",
- "registryDependencies": ["hover-card"],
- "files": [
- {
- "path": "examples/hover-card-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-demo",
- "type": "registry:example",
- "registryDependencies": ["input"],
- "files": [
- {
- "path": "examples/input-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-disabled",
- "type": "registry:example",
- "registryDependencies": ["input"],
- "files": [
- {
- "path": "examples/input-disabled.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-file",
- "type": "registry:example",
- "registryDependencies": ["input"],
- "files": [
- {
- "path": "examples/input-file.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-form",
- "type": "registry:example",
- "registryDependencies": ["input", "button", "form"],
- "files": [
- {
- "path": "examples/input-form.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-with-button",
- "type": "registry:example",
- "registryDependencies": ["input", "button"],
- "files": [
- {
- "path": "examples/input-with-button.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-with-label",
- "type": "registry:example",
- "registryDependencies": ["input", "button", "label"],
- "files": [
- {
- "path": "examples/input-with-label.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-with-text",
- "type": "registry:example",
- "registryDependencies": ["input", "button", "label"],
- "files": [
- {
- "path": "examples/input-with-text.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-otp-demo",
- "type": "registry:example",
- "registryDependencies": ["input-otp"],
- "files": [
- {
- "path": "examples/input-otp-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-otp-pattern",
- "type": "registry:example",
- "registryDependencies": ["input-otp"],
- "files": [
- {
- "path": "examples/input-otp-pattern.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-otp-separator",
- "type": "registry:example",
- "registryDependencies": ["input-otp"],
- "files": [
- {
- "path": "examples/input-otp-separator.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-otp-controlled",
- "type": "registry:example",
- "registryDependencies": ["input-otp"],
- "files": [
- {
- "path": "examples/input-otp-controlled.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-otp-form",
- "type": "registry:example",
- "registryDependencies": ["input-otp", "form"],
- "files": [
- {
- "path": "examples/input-otp-form.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "label-demo",
- "type": "registry:example",
- "registryDependencies": ["label"],
- "files": [
- {
- "path": "examples/label-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "menubar-demo",
- "type": "registry:example",
- "registryDependencies": ["menubar"],
- "files": [
- {
- "path": "examples/menubar-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "navigation-menu-demo",
- "type": "registry:example",
- "registryDependencies": ["navigation-menu"],
- "files": [
- {
- "path": "examples/navigation-menu-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "pagination-demo",
- "type": "registry:example",
- "registryDependencies": ["pagination"],
- "files": [
- {
- "path": "examples/pagination-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "popover-demo",
- "type": "registry:example",
- "registryDependencies": ["popover"],
- "files": [
- {
- "path": "examples/popover-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "progress-demo",
- "type": "registry:example",
- "registryDependencies": ["progress"],
- "files": [
- {
- "path": "examples/progress-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "radio-group-demo",
- "type": "registry:example",
- "registryDependencies": ["radio-group"],
- "files": [
- {
- "path": "examples/radio-group-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "radio-group-form",
- "type": "registry:example",
- "registryDependencies": ["radio-group", "form"],
- "files": [
- {
- "path": "examples/radio-group-form.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "resizable-demo",
- "type": "registry:example",
- "registryDependencies": ["resizable"],
- "files": [
- {
- "path": "examples/resizable-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "resizable-demo-with-handle",
- "type": "registry:example",
- "registryDependencies": ["resizable"],
- "files": [
- {
- "path": "examples/resizable-demo-with-handle.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "resizable-vertical",
- "type": "registry:example",
- "registryDependencies": ["resizable"],
- "files": [
- {
- "path": "examples/resizable-vertical.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "resizable-handle",
- "type": "registry:example",
- "registryDependencies": ["resizable"],
- "files": [
- {
- "path": "examples/resizable-handle.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "scroll-area-demo",
- "type": "registry:example",
- "registryDependencies": ["scroll-area"],
- "files": [
- {
- "path": "examples/scroll-area-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "scroll-area-horizontal-demo",
- "type": "registry:example",
- "registryDependencies": ["scroll-area"],
- "files": [
- {
- "path": "examples/scroll-area-horizontal-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "select-demo",
- "type": "registry:example",
- "registryDependencies": ["select"],
- "files": [
- {
- "path": "examples/select-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "select-scrollable",
- "type": "registry:example",
- "registryDependencies": ["select"],
- "files": [
- {
- "path": "examples/select-scrollable.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "select-form",
- "type": "registry:example",
- "registryDependencies": ["select"],
- "files": [
- {
- "path": "examples/select-form.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "separator-demo",
- "type": "registry:example",
- "registryDependencies": ["separator"],
- "files": [
- {
- "path": "examples/separator-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "sheet-demo",
- "type": "registry:example",
- "registryDependencies": ["sheet"],
- "files": [
- {
- "path": "examples/sheet-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "sheet-side",
- "type": "registry:example",
- "registryDependencies": ["sheet"],
- "files": [
- {
- "path": "examples/sheet-side.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "skeleton-demo",
- "type": "registry:example",
- "registryDependencies": ["skeleton"],
- "files": [
- {
- "path": "examples/skeleton-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "skeleton-card",
- "type": "registry:example",
- "registryDependencies": ["skeleton"],
- "files": [
- {
- "path": "examples/skeleton-card.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "slider-demo",
- "type": "registry:example",
- "registryDependencies": ["slider"],
- "files": [
- {
- "path": "examples/slider-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "sonner-demo",
- "type": "registry:example",
- "registryDependencies": ["sonner"],
- "files": [
- {
- "path": "examples/sonner-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "switch-demo",
- "type": "registry:example",
- "registryDependencies": ["switch"],
- "files": [
- {
- "path": "examples/switch-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "switch-form",
- "type": "registry:example",
- "registryDependencies": ["switch", "form"],
- "files": [
- {
- "path": "examples/switch-form.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "table-demo",
- "type": "registry:example",
- "registryDependencies": ["table"],
- "files": [
- {
- "path": "examples/table-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "tabs-demo",
- "type": "registry:example",
- "registryDependencies": ["tabs"],
- "files": [
- {
- "path": "examples/tabs-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "textarea-demo",
- "type": "registry:example",
- "registryDependencies": ["textarea"],
- "files": [
- {
- "path": "examples/textarea-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "textarea-disabled",
- "type": "registry:example",
- "registryDependencies": ["textarea"],
- "files": [
- {
- "path": "examples/textarea-disabled.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "textarea-form",
- "type": "registry:example",
- "registryDependencies": ["textarea", "form"],
- "files": [
- {
- "path": "examples/textarea-form.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "textarea-with-button",
- "type": "registry:example",
- "registryDependencies": ["textarea", "button"],
- "files": [
- {
- "path": "examples/textarea-with-button.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "textarea-with-label",
- "type": "registry:example",
- "registryDependencies": ["textarea", "label"],
- "files": [
- {
- "path": "examples/textarea-with-label.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "textarea-with-text",
- "type": "registry:example",
- "registryDependencies": ["textarea", "label"],
- "files": [
- {
- "path": "examples/textarea-with-text.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-group-demo",
- "type": "registry:example",
- "registryDependencies": ["toggle-group"],
- "files": [
- {
- "path": "examples/toggle-group-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-group-disabled",
- "type": "registry:example",
- "registryDependencies": ["toggle-group"],
- "files": [
- {
- "path": "examples/toggle-group-disabled.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-group-lg",
- "type": "registry:example",
- "registryDependencies": ["toggle-group"],
- "files": [
- {
- "path": "examples/toggle-group-lg.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-group-outline",
- "type": "registry:example",
- "registryDependencies": ["toggle-group"],
- "files": [
- {
- "path": "examples/toggle-group-outline.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-group-sm",
- "type": "registry:example",
- "registryDependencies": ["toggle-group"],
- "files": [
- {
- "path": "examples/toggle-group-sm.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-group-single",
- "type": "registry:example",
- "registryDependencies": ["toggle-group"],
- "files": [
- {
- "path": "examples/toggle-group-single.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-demo",
- "type": "registry:example",
- "registryDependencies": ["toggle"],
- "files": [
- {
- "path": "examples/toggle-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-disabled",
- "type": "registry:example",
- "registryDependencies": ["toggle"],
- "files": [
- {
- "path": "examples/toggle-disabled.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-lg",
- "type": "registry:example",
- "registryDependencies": ["toggle"],
- "files": [
- {
- "path": "examples/toggle-lg.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-outline",
- "type": "registry:example",
- "registryDependencies": ["toggle"],
- "files": [
- {
- "path": "examples/toggle-outline.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-sm",
- "type": "registry:example",
- "registryDependencies": ["toggle"],
- "files": [
- {
- "path": "examples/toggle-sm.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-with-text",
- "type": "registry:example",
- "registryDependencies": ["toggle"],
- "files": [
- {
- "path": "examples/toggle-with-text.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "tooltip-demo",
- "type": "registry:example",
- "registryDependencies": ["tooltip"],
- "files": [
- {
- "path": "examples/tooltip-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-blockquote",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-blockquote.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-demo",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-h1",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-h1.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-h2",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-h2.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-h3",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-h3.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-h4",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-h4.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-inline-code",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-inline-code.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-large",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-large.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-lead",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-lead.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-list",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-list.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-muted",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-muted.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-p",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-p.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-small",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-small.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-table",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-table.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "mode-toggle",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/mode-toggle.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "chart-bar-demo",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/chart-bar-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "chart-bar-demo-grid",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/chart-bar-demo-grid.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "chart-bar-demo-axis",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/chart-bar-demo-axis.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "chart-bar-demo-tooltip",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/chart-bar-demo-tooltip.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "chart-bar-demo-legend",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/chart-bar-demo-legend.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "chart-tooltip-demo",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/chart-tooltip-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "utils",
- "type": "registry:lib",
- "dependencies": ["clsx", "tailwind-merge"],
- "files": [
- {
- "path": "registry/lib/utils.ts",
- "type": "registry:lib"
- }
- ]
- }
- ]
-}
diff --git a/scripts/build-registry.mts b/scripts/build-registry.mts
index cba9807..9624c4d 100644
--- a/scripts/build-registry.mts
+++ b/scripts/build-registry.mts
@@ -21,6 +21,9 @@ interface NormalizedRegistryFile {
}
const REGISTRY_PATH = path.join(process.cwd(), "public/r");
+/** Served at blode.co/ui/registry.json. Formatted alongside REGISTRY_PATH so
+ * `npm run check` stays green after a rebuild. */
+const PUBLIC_REGISTRY_JSON = path.join(process.cwd(), "public/registry.json");
const REGISTRY_SOURCE_PATH = path.join(process.cwd(), "__registry__");
const REGISTRY_INDEX_WHITELIST = new Set>([
@@ -360,11 +363,21 @@ async function buildRegistryJson(registry: Registry): Promise {
name: registry.name,
};
- await fs.writeFile(
- path.join(REGISTRY_PATH, "registry.json"),
- JSON.stringify(payload, null, 2),
- "utf-8",
- );
+ const json = JSON.stringify(payload, null, 2);
+
+ // Written to both paths deliberately. `public/r/registry.json` is the one the
+ // shadcn CLI resolves against, and `public/registry.json` is what
+ // blode.co/ui/registry.json serves, which is the URL a directory reviewer
+ // opens first.
+ //
+ // Both were hand-maintained copies until now, and both had drifted: they
+ // carried `"name": "blode/ui"` long after registry/index.ts moved to the bare
+ // `blode` token, and neither had a `$schema`. A reviewer checking the
+ // advertised registry URL saw a namespace that contradicts `@blode`.
+ await Promise.all([
+ fs.writeFile(path.join(REGISTRY_PATH, "registry.json"), json, "utf-8"),
+ fs.writeFile(PUBLIC_REGISTRY_JSON, json, "utf-8"),
+ ]);
}
// ----------------------------------------------------------------------------
@@ -444,7 +457,7 @@ try {
// diff that was byte-identical once parsed. Formatting the output here
// means what this script writes is already what the formatter wants, so a
// rebuild leaves a clean tree wherever it runs — not just on commit.
- execFileSync("npx", ["oxfmt", REGISTRY_PATH, REGISTRY_SOURCE_PATH], {
+ execFileSync("npx", ["oxfmt", REGISTRY_PATH, REGISTRY_SOURCE_PATH, PUBLIC_REGISTRY_JSON], {
stdio: "inherit",
});
console.log("💅 Formatted generated output");