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");