{ "$schema": "https://ui.shadcn.com/schema/registry.json", "items": [ { "name": "featured-card", "type": "registry:block", "title": "Featured Card", "description": "A featured strip with gradient border, faded icon, headline and optional CTA or custom action.", "registryDependencies": [ "codarise/ui/card" ], "files": [ { "path": "featured-card.tsx", "type": "registry:block" } ] }, { "name": "bento-card", "type": "registry:block", "title": "Bento Card", "description": "A bento-style dashboard card with a gradient header (dither + animated blur blobs), icon or custom headerContent, title, description, badge, and optional body. Pass a gradient id from project-themes for the header color. Router-agnostic — use onClick for navigation (e.g. onClick={() => navigate({ to: href })}). Use the `featured` prop for a larger highlight variant.", "registryDependencies": [ "codarise/ui/badge", "codarise/ui/card", "codarise/ui/project-themes" ], "files": [ { "path": "bento-card.tsx", "type": "registry:block" } ] }, { "name": "loading-state", "type": "registry:block", "title": "Loading State", "description": "A centered loading state with spinner, title, and optional description.", "registryDependencies": [ "codarise/ui/spinner" ], "files": [ { "path": "loading-state.tsx", "type": "registry:block" } ] }, { "name": "error-state", "type": "registry:block", "title": "Error State", "description": "A centered error state with icon, title, description, and optional retry button or custom action.", "dependencies": [ "lucide-react" ], "registryDependencies": [ "codarise/ui/icon-wrapper", "codarise/ui/button" ], "files": [ { "path": "error-state.tsx", "type": "registry:block" } ] }, { "name": "chat-bubble", "type": "registry:block", "title": "Chat Bubble", "description": "A chat bubble wrapper with role-to-variant mapping helpers for user, assistant, system, and error messages.", "registryDependencies": [ "codarise/ui/bubble" ], "files": [ { "path": "chat-bubble.tsx", "type": "registry:block" } ] }, { "name": "chat-marker", "type": "registry:block", "title": "Chat Marker", "description": "A chat marker with optional leading icon, built on the Marker primitive.", "registryDependencies": [ "codarise/ui/marker" ], "files": [ { "path": "chat-marker.tsx", "type": "registry:block" } ] }, { "name": "chat-message-row", "type": "registry:block", "title": "Chat Message Row", "description": "A shared chat row shell that aligns avatar, header, content, and footer. Framework-agnostic — features map their message type to this.", "registryDependencies": [ "codarise/ui/message" ], "files": [ { "path": "chat-message-row.tsx", "type": "registry:block" } ] }, { "name": "page-layout", "type": "registry:block", "title": "Page Layout", "description": "Page composition primitives: PageLayout, PageHeader (with back button), PageSection, and PageContent. Router-agnostic.", "dependencies": [ "lucide-react" ], "registryDependencies": [ "codarise/ui/button" ], "files": [ { "path": "page-layout.tsx", "type": "registry:block" } ] }, { "name": "thinking-display", "type": "registry:block", "title": "Thinking Display", "description": "A collapsible thinking/reasoning panel with streaming-aware auto-open/collapse, shimmer label, scroll fade, and copy button.", "registryDependencies": [ "codarise/ui/copy-button", "codarise/ui/text-shimmer" ], "files": [ { "path": "thinking-display.tsx", "type": "registry:block" } ] }, { "name": "model-card", "type": "registry:block", "title": "Model Card", "description": "A model card with gradient background derived from the model name. Generic — pass badges, metadata, features, and footer as ReactNode. Color is auto-derived via model-colors util or can be overridden.", "dependencies": [ "lucide-react" ], "registryDependencies": [ "codarise/ui/card", "codarise/ui/model-colors" ], "files": [ { "path": "model-card.tsx", "type": "registry:block" } ] }, { "name": "model-select", "type": "registry:block", "title": "Model Select", "description": "A model selector with popover list, keyboard navigation, favorites (localStorage), and optional details panel. Generic — uses ModelOption type instead of a domain type. Color is auto-derived via model-colors. Includes trigger button, model list, and details panel with pricing/features/capabilities.", "dependencies": [ "lucide-react" ], "registryDependencies": [ "codarise/ui/badge", "codarise/ui/button", "codarise/ui/label", "codarise/ui/popover", "codarise/ui/tooltip", "codarise/ui/model-colors" ], "files": [ { "path": "model-select.tsx", "type": "registry:block" }, { "path": "model-select/types.ts", "type": "registry:block" }, { "path": "model-select/helpers.ts", "type": "registry:block" }, { "path": "model-select/use-favorites.ts", "type": "registry:block" }, { "path": "model-select/use-model-selector.ts", "type": "registry:block" }, { "path": "model-select/trigger.tsx", "type": "registry:block" }, { "path": "model-select/model-list.tsx", "type": "registry:block" }, { "path": "model-select/details-panel.tsx", "type": "registry:block" } ] }, { "name": "upload-dropzone", "type": "registry:block", "title": "Upload Dropzone", "description": "Drag & drop file upload zone with click-to-select. Uses a drag counter to avoid flicker. Supports compact and prominent variants.", "dependencies": [ "lucide-react" ], "registryDependencies": [ "codarise/ui/icon-wrapper" ], "files": [ { "path": "upload-dropzone.tsx", "type": "registry:block" } ] }, { "name": "domain-tenant-switcher", "type": "registry:block", "title": "Domain / Tenant Switcher", "description": "A large popover switcher for domains and their tenants. Global search filters both lists at once (fuzzy); left column lists domains with avatar, role badge, and settings gear; right column lists tenants of the selected domain. Clicking a tenant switches context and closes the popover. Includes per-column loading skeletons, error retry, empty states, keyboard nav (↑↓/Enter/Esc), and a custom-trigger slot. Framework-agnostic — pass data + callbacks (onDomainChange/onTenantChange/onCreate*/onOpen*Settings).", "dependencies": [ "lucide-react" ], "registryDependencies": [ "codarise/ui/avatar", "codarise/ui/badge", "codarise/ui/button", "codarise/ui/input", "codarise/ui/popover", "codarise/ui/skeleton", "codarise/ui/tooltip", "codarise/ui/initials" ], "files": [ { "path": "domain-tenant-switcher.tsx", "type": "registry:block" }, { "path": "domain-tenant-switcher/types.ts", "type": "registry:block" }, { "path": "domain-tenant-switcher/helpers.ts", "type": "registry:block" }, { "path": "domain-tenant-switcher/domain-list.tsx", "type": "registry:block" }, { "path": "domain-tenant-switcher/tenant-list.tsx", "type": "registry:block" }, { "path": "domain-tenant-switcher/switcher-content.tsx", "type": "registry:block" } ] }, { "name": "sidebar", "type": "registry:block", "title": "Sidebar", "description": "Complete sidebar system: provider with localStorage + breakpoint tracking, collapsible shell, header (logo slots), nav (groups + items with active state), footer (User pill with avatar + more-dots affordance + optional notifications bell), mobile sheet, and toggle button. Uses plain tags — swap for your router's Link. Wire up: pass groups + activeHref to SidebarNav, user + menuItems + onLogout + notifications to SidebarFooter. The footer also accepts a notificationsNode slot to drop in a richer notification experience (e.g. the notifications block's NotificationBell) without coupling the sidebar to a specific implementation.", "dependencies": [ "lucide-react" ], "registryDependencies": [ "codarise/ui/avatar", "codarise/ui/badge", "codarise/ui/button", "codarise/ui/dropdown-menu", "codarise/ui/scroll-area", "codarise/ui/sheet", "codarise/ui/tooltip", "codarise/ui/initials" ], "files": [ { "path": "sidebar.tsx", "type": "registry:block" } ] }, { "name": "notifications", "type": "registry:block", "title": "Notification Bell", "description": "A self-contained notifications system: NotificationBell (popover trigger with unread badge + new-notification ping), NotificationCenter (grouped Today/Yesterday/Earlier list with mark-all-as-read), NotificationItem (type-aware icon, hover-to-read, action buttons), NotificationEmpty, and helpers. Framework-agnostic and data-driven — pass notifications + unreadCount + onMarkAsRead/onMarkAllAsRead via props (no router/react-query coupling). Wire the bell into the sidebar via SidebarFooter's notificationsNode slot, or use standalone. The compact `icon` variant matches the sidebar footer bell styling.", "dependencies": [ "lucide-react" ], "registryDependencies": [ "codarise/ui/badge", "codarise/ui/button", "codarise/ui/icon-wrapper", "codarise/ui/popover", "codarise/ui/skeleton" ], "files": [ { "path": "notifications/notification-bell.tsx", "type": "registry:block" }, { "path": "notifications/notification-center.tsx", "type": "registry:block" }, { "path": "notifications/notification-item.tsx", "type": "registry:block" }, { "path": "notifications/notification-empty.tsx", "type": "registry:block" }, { "path": "notifications/notification-utils.ts", "type": "registry:block" }, { "path": "notifications/types.ts", "type": "registry:block" } ] }, { "name": "project-switcher", "type": "registry:block", "title": "Project Switcher", "description": "A compact project picker for a sidebar / top nav. Combobox trigger shows the current project's avatar + name (or a 'Select Project' fallback); popover opens a searchable Command list of projects with member count + inactive badge, plus a 'View all Projects' action. Renders a loading skeleton while loading and a dashed empty state with a 'Create Project' button when there are no projects. Framework-agnostic and data-driven — no router or project-context coupling. Wire onSelectProject / onViewAllProjects / onCreateProject to your app's navigation + context store. Ported from fe-agentic's ProjectSwitcher, decoupled from @tanstack/react-router + ProjectContext (props + callbacks instead).", "dependencies": [ "lucide-react" ], "registryDependencies": [ "codarise/ui/tenant-avatar", "codarise/ui/badge", "codarise/ui/button", "codarise/ui/command", "codarise/ui/empty", "codarise/ui/popover", "codarise/ui/skeleton" ], "files": [ { "path": "project-switcher.tsx", "type": "registry:block" } ] } ] }