{ "$schema": "https://ui.shadcn.com/schema/registry.json", "name": "nebari", "homepage": "https://github.com/nebari-dev/nebari-design", "items": [ { "name": "utils", "type": "registry:lib", "title": "cn() utility", "description": "Class-name merge helper built on clsx and tailwind-merge.", "files": [ { "path": "registry/nebari/lib/utils.ts", "type": "registry:lib" } ] }, { "name": "spinner", "type": "registry:ui", "title": "Spinner", "description": "Animated loading spinner built on lucide-react.", "dependencies": ["lucide-react"], "registryDependencies": ["@nebari/utils"], "files": [ { "path": "registry/nebari/ui/spinner.tsx", "type": "registry:ui" } ] }, { "name": "button", "type": "registry:ui", "title": "Button", "description": "Button with variants, sizes, a loading state, and polymorphic render-prop composition.", "dependencies": [ "@base-ui/react", "class-variance-authority", "lucide-react" ], "registryDependencies": [ "@nebari/utils", "@nebari/spinner", "@nebari/theme" ], "files": [ { "path": "registry/nebari/ui/button.tsx", "type": "registry:ui" } ] }, { "name": "switch", "type": "registry:ui", "title": "Switch", "description": "Toggle a single setting on or off with immediate effect, built on Base UI's Switch.", "dependencies": ["@base-ui/react"], "registryDependencies": ["@nebari/utils", "@nebari/theme"], "files": [ { "path": "registry/nebari/ui/switch.tsx", "type": "registry:ui" } ] }, { "name": "slider", "type": "registry:ui", "title": "Slider", "description": "Bounded numeric input with single-value and range behavior, keyboard navigation, and Nebari track and thumb styling.", "dependencies": ["@base-ui/react"], "registryDependencies": ["@nebari/utils", "@nebari/theme"], "files": [ { "path": "registry/nebari/ui/slider.tsx", "type": "registry:ui" } ] }, { "name": "checkbox", "type": "registry:ui", "title": "Checkbox", "description": "Labeled checkbox with default and boxed variants, checked, unchecked, and indeterminate states, validation feedback, and Base UI behavior.", "dependencies": [ "@base-ui/react", "class-variance-authority", "lucide-react" ], "registryDependencies": ["@nebari/utils", "@nebari/theme"], "files": [ { "path": "registry/nebari/ui/checkbox.tsx", "type": "registry:ui" } ] }, { "name": "radio-group", "type": "registry:ui", "title": "Radio Group", "description": "Mutually exclusive radio group with default and boxed item variants, stable selected targets, and group-level validation feedback.", "dependencies": ["@base-ui/react", "class-variance-authority"], "registryDependencies": ["@nebari/utils", "@nebari/theme"], "files": [ { "path": "registry/nebari/ui/radio-group.tsx", "type": "registry:ui" } ] }, { "name": "field", "type": "registry:ui", "title": "Field", "description": "Groups a control with its label, description, and validation message, wiring accessible-name and description associations automatically. Built on Base UI's Field.", "dependencies": ["@base-ui/react"], "registryDependencies": ["@nebari/utils"], "files": [ { "path": "registry/nebari/ui/field.tsx", "type": "registry:ui" } ] }, { "name": "input", "type": "registry:ui", "title": "Input", "description": "Single-line text-entry field with hover, focus, disabled, and invalid states, built on Base UI's Input and auto-wired to Field.", "dependencies": ["@base-ui/react", "lucide-react"], "registryDependencies": ["@nebari/utils", "@nebari/theme"], "files": [ { "path": "registry/nebari/ui/input.tsx", "type": "registry:ui" } ] }, { "name": "label", "type": "registry:ui", "title": "Label", "description": "Accessible label for a form control, paired via htmlFor or composed with Field.", "registryDependencies": ["@nebari/utils"], "files": [ { "path": "registry/nebari/ui/label.tsx", "type": "registry:ui" } ] }, { "name": "textarea", "type": "registry:ui", "title": "Textarea", "description": "Multi-line text-entry field — a styled native textarea mirroring Input's border, focus ring, disabled, and invalid states.", "dependencies": ["lucide-react"], "registryDependencies": ["@nebari/utils", "@nebari/theme"], "files": [ { "path": "registry/nebari/ui/textarea.tsx", "type": "registry:ui" } ] }, { "name": "table", "type": "registry:ui", "title": "Table", "description": "Responsive data table with Nebari header, cell, row, footer, caption, and hover styling.", "registryDependencies": ["@nebari/utils", "@nebari/theme"], "files": [ { "path": "registry/nebari/ui/table.tsx", "type": "registry:ui" } ] }, { "name": "alert", "type": "registry:ui", "title": "Alert", "description": "Inline status message with default, success, warning, and destructive variants, composed of Alert, AlertTitle, AlertDescription, and AlertAction.", "dependencies": ["class-variance-authority", "lucide-react"], "registryDependencies": ["@nebari/utils"], "files": [ { "path": "registry/nebari/ui/alert.tsx", "type": "registry:ui" } ] }, { "name": "badge", "type": "registry:ui", "title": "Badge", "description": "Small status/label chip with variants, composable via Base UI's render prop.", "dependencies": ["@base-ui/react", "class-variance-authority"], "registryDependencies": ["@nebari/utils"], "files": [ { "path": "registry/nebari/ui/badge.tsx", "type": "registry:ui" } ] }, { "name": "breadcrumb", "type": "registry:ui", "title": "Breadcrumb", "description": "Hierarchy navigation trail with default, ellipsis-triggered, and current-route dropdown compositions.", "dependencies": ["@base-ui/react", "lucide-react"], "registryDependencies": ["@nebari/utils", "@nebari/theme"], "files": [ { "path": "registry/nebari/ui/breadcrumb.tsx", "type": "registry:ui" } ] }, { "name": "card", "type": "registry:ui", "title": "Card", "description": "Static content surface composed from header, title, description, action, content, and footer sections.", "dependencies": ["class-variance-authority"], "registryDependencies": ["@nebari/utils"], "files": [ { "path": "registry/nebari/ui/card.tsx", "type": "registry:ui" } ] }, { "name": "dialog", "type": "registry:ui", "title": "Dialog", "description": "Modal dialog with overlay, close control, header, footer, title, and description parts, built on Base UI's Dialog.", "dependencies": ["@base-ui/react", "lucide-react"], "registryDependencies": [ "@nebari/utils", "@nebari/button", "@nebari/theme" ], "files": [ { "path": "registry/nebari/ui/dialog.tsx", "type": "registry:ui" } ] }, { "name": "drawer", "type": "registry:ui", "title": "Drawer", "description": "Edge-anchored panel for secondary tasks, contextual detail, or short forms, with right-side and bottom-sheet variants built on Base UI Drawer.", "dependencies": ["@base-ui/react", "lucide-react"], "registryDependencies": [ "@nebari/utils", "@nebari/button", "@nebari/theme" ], "files": [ { "path": "registry/nebari/ui/drawer.tsx", "type": "registry:ui" } ] }, { "name": "tabs", "type": "registry:ui", "title": "Tabs", "description": "Tabs for switching between related panels, with pill and underline variants built on Base UI.", "dependencies": ["@base-ui/react", "class-variance-authority"], "registryDependencies": ["@nebari/utils"], "files": [ { "path": "registry/nebari/ui/tabs.tsx", "type": "registry:ui" } ] }, { "name": "select", "type": "registry:ui", "title": "Select", "description": "Accessible standard-size select menu with grouped labels, separators, validation states, and anchored popup positioning.", "dependencies": ["@base-ui/react", "lucide-react"], "registryDependencies": ["@nebari/utils", "@nebari/theme"], "files": [ { "path": "registry/nebari/ui/select.tsx", "type": "registry:ui" } ] }, { "name": "navigation-menu", "type": "registry:ui", "title": "Navigation Menu", "description": "Application navigation bar with anchor-first NavLink items, NavDropdownMenu composition, and brand/actions slots.", "dependencies": ["@base-ui/react", "class-variance-authority"], "registryDependencies": [ "@nebari/dropdown-menu", "@nebari/utils", "@nebari/theme" ], "files": [ { "path": "registry/nebari/ui/navigation-menu.tsx", "type": "registry:ui" } ] }, { "name": "dropdown-menu", "type": "registry:ui", "title": "Dropdown Menu", "description": "Action menu triggered by a button, with grouped items, labels, separators, checkbox items, and nested submenus.", "dependencies": [ "@base-ui/react", "class-variance-authority", "lucide-react" ], "registryDependencies": ["@nebari/utils", "@nebari/theme"], "files": [ { "path": "registry/nebari/ui/dropdown-menu.tsx", "type": "registry:ui" } ] }, { "name": "tooltip", "type": "registry:ui", "title": "Tooltip", "description": "Compact supplemental information shown on hover or keyboard focus, with anchored positioning and optional arrow. Touch devices don't trigger tooltips so critical information shouldn't live only in a tooltip.", "dependencies": ["@base-ui/react"], "registryDependencies": ["@nebari/utils", "@nebari/theme"], "files": [ { "path": "registry/nebari/ui/tooltip.tsx", "type": "registry:ui" } ] }, { "name": "code-block", "type": "registry:ui", "title": "Code Block", "description": "Formatted, monospaced code snippet with an optional language/filename header, a copy-to-clipboard button, and optional line numbers. Composed of CodeBlock, CodeBlockHeader, CodeBlockBody, and CodeBlockCopyButton.", "dependencies": ["class-variance-authority", "lucide-react"], "registryDependencies": ["@nebari/utils", "@nebari/theme"], "files": [ { "path": "registry/nebari/ui/code-block.tsx", "type": "registry:ui" } ] }, { "name": "claude-skill", "type": "registry:file", "title": "Nebari UI Claude Code skill", "description": "Claude Code skill that teaches an AI assistant how to install and use Nebari components in a consumer app — registry setup, the component catalog, the Base UI render-prop convention, and theming.", "files": [ { "path": "registry/nebari/skills/nebari-ui/SKILL.md", "type": "registry:file", "target": "~/.claude/skills/nebari-ui/SKILL.md" } ] }, { "name": "theme", "type": "registry:theme", "title": "Nebari theme", "description": "Nebari brand color tokens and radius for light and dark modes.", "css": { "@keyframes nebari-fade-in": { "from": { "opacity": "0" }, "to": { "opacity": "1" } }, "@keyframes nebari-fade-out": { "from": { "opacity": "1" }, "to": { "opacity": "0" } }, "@keyframes nebari-slide-up-fade": { "from": { "opacity": "0", "transform": "translateY(6px)" }, "to": { "opacity": "1", "transform": "translateY(0)" } }, "@keyframes nebari-slide-down-fade": { "from": { "opacity": "1", "transform": "translateY(0)" }, "to": { "opacity": "0", "transform": "translateY(6px)" } } }, "cssVars": { "theme": { "radius": "0.625rem", "duration-fast": "100ms", "duration-base": "200ms", "duration-slow": "350ms", "ease-standard": "cubic-bezier(0.4, 0, 0.2, 1)", "ease-emphasized": "cubic-bezier(0.2, 0, 0, 1)", "animate-fade-in": "nebari-fade-in var(--duration-base) var(--ease-standard) both", "animate-fade-out": "nebari-fade-out var(--duration-base) var(--ease-standard) both", "animate-slide-up-fade": "nebari-slide-up-fade var(--duration-base) var(--ease-emphasized) both", "animate-slide-down-fade": "nebari-slide-down-fade var(--duration-base) var(--ease-emphasized) both" }, "light": { "background": "oklch(97.91% 0 0)", "foreground": "oklch(26.94% 0.0037 286.15)", "scrim": "rgba(0, 0, 0, 0.5)", "card": "oklch(100% 0 0)", "card-foreground": "oklch(26.94% 0.0037 286.15)", "popover": "oklch(100% 0 0)", "popover-foreground": "oklch(26.94% 0.0037 286.15)", "primary": "oklch(55.06% 0.1886 311.45)", "primary-foreground": "oklch(100% 0 0)", "primary-hover": "oklch(47.01% 0.1577 311.26)", "secondary": "oklch(95.04% 0.0042 236.50)", "secondary-foreground": "oklch(32.95% 0.0209 254.12)", "muted": "oklch(94.94% 0.0013 286.37)", "muted-foreground": "oklch(54.86% 0.0154 285.88)", "muted-foreground-strong": "oklch(47.01% 0.0112 285.96)", "accent": "oklch(95.04% 0.0042 236.50)", "accent-foreground": "oklch(32.95% 0.0209 254.12)", "destructive": "oklch(95.06% 0.0247 29.93)", "destructive-foreground": "oklch(54.97% 0.2151 27.33)", "warning": "oklch(95.02% 0.0692 92.11)", "warning-foreground": "oklch(46.91% 0.0960 91.90)", "success": "oklch(94.94% 0.0433 149.41)", "success-foreground": "oklch(47.01% 0.1313 149.41)", "border": "oklch(78.06% 0.0056 286.27)", "input": "oklch(69.88% 0.0130 286.06)", "border-strong": "oklch(61.96% 0.0134 286.00)", "ring": "oklch(61.98% 0.2159 311.67)", "chart-1": "oklch(61.98% 0.2159 311.67)", "chart-2": "oklch(61.96% 0.0932 187.62)", "chart-3": "oklch(70.05% 0.1417 86.43)", "chart-4": "oklch(62.1% 0.1880 264.30)", "chart-5": "oklch(61.95% 0.1718 149.70)", "sidebar": "oklch(97.91% 0 0)", "sidebar-foreground": "oklch(26.94% 0.0037 286.15)", "sidebar-primary": "oklch(55.06% 0.1886 311.45)", "sidebar-primary-foreground": "oklch(100% 0 0)", "sidebar-accent": "oklch(95.04% 0.0042 236.50)", "sidebar-accent-foreground": "oklch(32.95% 0.0209 254.12)", "sidebar-border": "oklch(78.06% 0.0056 286.27)", "sidebar-ring": "oklch(61.98% 0.2159 311.67)" }, "dark": { "background": "oklch(26.94% 0.0037 286.15)", "foreground": "oklch(97.91% 0 0)", "scrim": "rgba(0, 0, 0, 0.6)", "card": "oklch(33.01% 0.0052 286.11)", "card-foreground": "oklch(97.91% 0 0)", "popover": "oklch(26.94% 0.0037 286.15)", "popover-foreground": "oklch(97.91% 0 0)", "primary": "oklch(61.98% 0.2159 311.67)", "primary-foreground": "oklch(0% 0 0)", "primary-hover": "oklch(69.98% 0.1926 311.48)", "secondary": "oklch(40% 0.0269 250.57)", "secondary-foreground": "oklch(95.04% 0.0042 236.50)", "muted": "oklch(33.01% 0.0052 286.11)", "muted-foreground": "oklch(69.88% 0.0130 286.06)", "muted-foreground-strong": "oklch(78.06% 0.0056 286.27)", "accent": "oklch(40% 0.0269 250.57)", "accent-foreground": "oklch(95.04% 0.0042 236.50)", "destructive": "oklch(33.1% 0.1332 27.42)", "destructive-foreground": "oklch(78.02% 0.1024 27.78)", "warning": "oklch(33.09% 0.0677 92.20)", "warning-foreground": "oklch(87.09% 0.1248 91.93)", "success": "oklch(32.88% 0.0887 149.73)", "success-foreground": "oklch(87.04% 0.0814 149.55)", "border": "oklch(47.01% 0.0112 285.96)", "input": "oklch(54.86% 0.0154 285.88)", "border-strong": "oklch(61.96% 0.0134 286.00)", "ring": "oklch(69.98% 0.1926 311.48)", "chart-1": "oklch(69.98% 0.1926 311.48)", "chart-2": "oklch(69.9% 0.0995 187.56)", "chart-3": "oklch(77.95% 0.1259 85.96)", "chart-4": "oklch(69.95% 0.1433 264.44)", "chart-5": "oklch(69.96% 0.1814 149.67)", "sidebar": "oklch(26.94% 0.0037 286.15)", "sidebar-foreground": "oklch(97.91% 0 0)", "sidebar-primary": "oklch(61.98% 0.2159 311.67)", "sidebar-primary-foreground": "oklch(0% 0 0)", "sidebar-accent": "oklch(40% 0.0269 250.57)", "sidebar-accent-foreground": "oklch(95.04% 0.0042 236.50)", "sidebar-border": "oklch(47.01% 0.0112 285.96)", "sidebar-ring": "oklch(69.98% 0.1926 311.48)" } } } ] }