diff --git a/.gitignore b/.gitignore index 14620ff..5e2480e 100644 --- a/.gitignore +++ b/.gitignore @@ -49,3 +49,6 @@ bun.lockb # LangGraph API .langgraph_api + +# local shadcn reference checkout (not a workspace) +shadcn/ diff --git a/apps/agent/main.py b/apps/agent/main.py index c9934f6..72a463a 100644 --- a/apps/agent/main.py +++ b/apps/agent/main.py @@ -6,15 +6,16 @@ import warnings from typing import Any, List, TypedDict +import uvicorn +from ag_ui_langgraph import add_langgraph_fastapi_endpoint +from copilotkit import CopilotKitMiddleware, CopilotKitState, LangGraphAGUIAgent from dotenv import load_dotenv from fastapi import FastAPI -import uvicorn from langchain.agents import create_agent -from copilotkit import CopilotKitMiddleware, CopilotKitState, LangGraphAGUIAgent -from ag_ui_langgraph import add_langgraph_fastapi_endpoint + +from src.bounded_memory_saver import BoundedMemorySaver from src.middleware import apply_structured_output_schema, normalize_context from src.patches import apply as apply_patches -from src.bounded_memory_saver import BoundedMemorySaver from src.search import search_tools _ = load_dotenv() @@ -23,13 +24,20 @@ class AgentState(CopilotKitState): proverbs: List[str] + design_params: dict[str, Any] + class AgentContext(TypedDict, total=False): output_schema: dict[str, Any] + agent = create_agent( - model="openai:gpt-5.2", - middleware=[normalize_context, CopilotKitMiddleware(), apply_structured_output_schema], + model="openai:gpt-5.4", + middleware=[ + normalize_context, + CopilotKitMiddleware(), + apply_structured_output_schema, + ], context_schema=AgentContext, tools=[*search_tools], state_schema=AgentState, @@ -39,7 +47,53 @@ class AgentContext(TypedDict, total=False): "Only wrap UI components into cards. For Markdown, don't wrap it in this. Use rows for " "side-by-side layouts (2 columns max). Keep it clean and simple.\n" "When generating large components, reports, dashboards, etc. Make sure the entire thing is in a card. " - "Only use components when necessary. Like for example just showing text you probably don't need to. Use your judgment." + "Only use components when necessary. Like for example just showing text you probably don't need to. Use your judgment.\n\n" + "When the user is on the /create route (the design-system customizer), you can help them tailor their theme. " + "The frontend exposes the current design parameters via readable context and a tool named 'updateDesignSystem'. " + "Valid parameters: base (radix|base), style (vega|nova|maia|lyra|mira|luma|sera), baseColor (neutral|gray|zinc|slate|stone|taupe), " + "theme (same palette as baseColor), chartColor (same palette), radius (default|none|small|medium|large), " + "font (inter|geist|figtree|jetbrains-mono|noto-sans|...), fontHeading (inherit or a font value), " + "iconLibrary (lucide|tabler|phosphor|hugeicons|remixicon), menuAccent (subtle|bold), " + "menuColor (default|inverted|default-translucent|inverted-translucent). " + "When the user asks you to change the look (e.g. 'make it pink with a serif body font and rounded corners'), " + "call updateDesignSystem with the subset of fields you want to change. Only pass fields you are changing.\n\n" + "CRITICAL: call 'randomize' EXACTLY ONCE per user request. After it returns, respond to the user with a short " + "summary of what changed (or what couldn't change because it was locked) — do NOT call randomize again in the " + "same turn, even to retry a locked param. If the user wants to unlock and reshuffle, explain the situation and " + "wait for them to confirm.\n\n" + "When the user asks you to build or create a custom component on /create (e.g. 'create a weather card', " + "'build a pricing card with three tiers', 'make a stat dashboard'), call the 'createCustomComponent' tool. " + "CRITICAL: call 'createCustomComponent' EXACTLY ONCE per user request. After the tool returns successfully, " + "respond with a short text reply — do NOT call the tool again. Panel 03 holds exactly ONE component at a time — " + "each call replaces the previous one. If the 'Current custom component' readable already shows the same title " + "the user is asking for, do not rebuild unless the user explicitly asks for a change. " + "It takes { title, prompt, spec } where spec is { root: Node }. Supported node types: " + "card {title?, description?, children: Node[], footer?: Node[]}, " + "column {gap?: sm|md|lg, children}, " + "row {gap?: sm|md|lg, align?: start|center|end|between, children}, " + "grid {columns: 2|3|4, gap?, children}, " + "heading {text, level?: 1|2|3|4, tone?}, " + "text {text, tone?, size?: xs|sm|base|lg, weight?: normal|medium|semibold|bold}, " + "badge {text, tone?}, " + "icon {name, size?, tone?}, " + "stat {label, value, trend?: up|down|flat|none, trendValue?}, " + "progress {value: 0-100, label?}, " + "separator {orientation?}, " + "image {src (url), alt?, aspect?: square|video|portrait}. " + "Tones: default|muted|primary|secondary|accent|destructive — never use hex colors, always use tones so the " + "component inherits the current theme. The root must be a 'card'. " + "Use sensible placeholder data (e.g. '72°F', 'San Francisco'). Keep the tree compact and readable. " + "Common icon names: sun, moon, cloud, cloud-rain, cloud-snow, wind, thermometer, droplets, map-pin, " + "trending-up, trending-down, star, heart, check, zap, sparkles, clock, calendar, user, users, dollar-sign, " + "shopping-cart, package, activity, bar-chart, line-chart, pie-chart. " + "Example (weather card): { title: 'Weather Card', root: { type: 'card', title: 'San Francisco', " + "description: 'Partly cloudy', children: [ { type: 'row', align: 'between', children: [ " + "{ type: 'stat', label: 'Current', value: '72°F', trend: 'up', trendValue: '+3°' }, " + "{ type: 'icon', name: 'cloud', size: 48, tone: 'primary' } ] }, " + "{ type: 'grid', columns: 3, gap: 'sm', children: [ " + "{ type: 'stat', label: 'Humidity', value: '54%' }, " + "{ type: 'stat', label: 'Wind', value: '8 mph' }, " + "{ type: 'stat', label: 'UV Index', value: '6' } ] } ] } }." ), ) @@ -55,6 +109,7 @@ class AgentContext(TypedDict, total=False): path="/", ) + def main(): """Run the uvicorn server.""" port = int(os.getenv("PORT", "8123")) diff --git a/apps/runtime/package.json b/apps/runtime/package.json index fa950b5..f57a8a8 100644 --- a/apps/runtime/package.json +++ b/apps/runtime/package.json @@ -6,7 +6,7 @@ "dev": "tsx watch server.ts" }, "dependencies": { - "@copilotkit/runtime": "1.54.0", + "@copilotkit/runtime": "1.56.2", "@hono/node-server": "^1.13.6", "hono": "^4.11.4" }, diff --git a/apps/ui/package.json b/apps/ui/package.json index 1a82eeb..e06eb11 100644 --- a/apps/ui/package.json +++ b/apps/ui/package.json @@ -8,36 +8,57 @@ "preview": "vite preview" }, "dependencies": { - "@ag-ui/core": "^0.0.47", + "@ag-ui/core": "^0.0.52", "@base-ui/react": "^1.2.0", - "@copilotkit/react-core": "1.54.0", - "@copilotkit/react-ui": "1.54.0", + "@copilotkit/react-core": "1.56.2", + "@copilotkit/react-ui": "1.56.2", + "@fontsource/figtree": "^5.2.10", + "@fontsource/geist": "^5.2.8", + "@fontsource/inter": "^5.2.8", + "@fontsource/jetbrains-mono": "^5.2.8", + "@fontsource/noto-sans": "^5.2.10", + "@fontsource/playfair-display": "^5.2.8", "@frenchfryai/core": "0.1.1", "@frenchfryai/react": "0.1.1", "@frenchfryai/runtime": "0.1.1", "@hashbrownai/core": "0.5.0-beta.4", "@hashbrownai/react": "0.5.0-beta.4", "@hookform/resolvers": "^5.2.2", + "@hugeicons/core-free-icons": "^4.1.1", + "@hugeicons/react": "^1.1.6", + "@phosphor-icons/react": "^2.1.10", + "@remixicon/react": "^4.9.0", + "@tabler/icons-react": "^3.41.1", + "@tanstack/react-form": "^1.29.0", + "change-case": "^5.4.4", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", "date-fns": "^4.1.0", + "dedent": "^1.7.2", "embla-carousel-react": "^8.6.0", "figma-squircle": "^1.1.0", "input-otp": "^1.4.2", + "jotai": "^2.19.1", "lucide-react": "^0.575.0", + "motion": "^12.38.0", "next-themes": "^0.4.6", + "nuqs": "^2.8.9", "prism-react-renderer": "^2.4.1", "radix-ui": "^1.4.3", "react": "^19.2.3", "react-day-picker": "^9.13.2", "react-dom": "^19.2.3", "react-hook-form": "^7.71.2", + "react-qr-code": "^2.0.18", "react-resizable-panels": "^4.6.5", + "react-router-dom": "^7.14.1", "recharts": "2.15.4", "sonner": "^2.0.7", "streamdown": "^2.1.0", + "swr": "^2.4.1", "tailwind-merge": "^3.5.0", + "ts-morph": "^28.0.0", "vaul": "^1.1.2", "zod": "^4.3.6" }, @@ -46,7 +67,7 @@ "@types/react": "^19", "@types/react-dom": "^19", "@vitejs/plugin-react": "^4", - "shadcn": "^3.8.5", + "shadcn": "^4.3.0", "tailwindcss": "^4", "tw-animate-css": "^1.4.0", "typescript": "^5", diff --git a/apps/ui/src/App.tsx b/apps/ui/src/App.tsx index 49e3c06..785518d 100644 --- a/apps/ui/src/App.tsx +++ b/apps/ui/src/App.tsx @@ -1,11 +1,9 @@ import { CopilotKit } from "@copilotkit/react-core"; -import { useAgentContext, CopilotChat } from "@copilotkit/react-core/v2"; +import { NuqsAdapter } from "nuqs/adapters/react-router/v7"; +import { BrowserRouter, Route, Routes } from "react-router-dom"; -import { AppHeader } from "@/components/app-header"; -import { useChatKit } from "@/components/chat/chat-kit"; -import { s } from "@hashbrownai/core"; -import { chatTheme } from "@/lib/chat-theme"; -import { useInitialSuggestions } from "./lib/suggestions"; +import { ChatRoute } from "@/routes/chat"; +import { CreateRoute } from "@/routes/create/page"; export function App() { return ( @@ -17,26 +15,14 @@ export function App() { } showDevConsole={false} > - + + + + } /> + } /> + + + ); } - -export function Page() { - const chatKit = useChatKit(); - useAgentContext({ description: "output_schema", value: s.toJsonSchema(chatKit.schema) }); - useInitialSuggestions(); - - return ; -} - -function Chat() { - return ( -
- -
- -
-
- ); -} diff --git a/apps/ui/src/components/copy-button.tsx b/apps/ui/src/components/copy-button.tsx new file mode 100644 index 0000000..0e81e8d --- /dev/null +++ b/apps/ui/src/components/copy-button.tsx @@ -0,0 +1,120 @@ + +import * as React from "react" +import { IconCheck, IconCopy } from "@tabler/icons-react" + +import { trackEvent, type Event } from "@/lib/events" +import { cn } from "@/lib/utils" +import { Button } from "@/registry/new-york-v4/ui/button" + +function legacyCopyToClipboard(value: string) { + const textArea = document.createElement("textarea") + textArea.value = value + textArea.setAttribute("readonly", "") + textArea.style.position = "fixed" + textArea.style.opacity = "0" + textArea.style.pointerEvents = "none" + + document.body.appendChild(textArea) + textArea.focus() + textArea.select() + textArea.setSelectionRange(0, value.length) + + let hasCopied = false + try { + hasCopied = document.execCommand("copy") + } catch { + hasCopied = false + } + + document.body.removeChild(textArea) + return hasCopied +} + +export async function copyToClipboardWithMeta(value: string, event?: Event) { + if (typeof window === "undefined") { + return false + } + + if (!value) { + return false + } + + let hasCopied = false + + if (navigator.clipboard?.writeText) { + try { + await navigator.clipboard.writeText(value) + hasCopied = true + } catch { + hasCopied = legacyCopyToClipboard(value) + } + } else { + hasCopied = legacyCopyToClipboard(value) + } + + if (!hasCopied) { + return false + } + + if (event) { + trackEvent(event) + } + + return true +} + +export function CopyButton({ + value, + className, + variant = "ghost", + event, + ...props +}: React.ComponentProps & { + value: string + src?: string + event?: Event["name"] + tooltip?: string +}) { + const [hasCopied, setHasCopied] = React.useState(false) + + React.useEffect(() => { + if (hasCopied) { + const timer = setTimeout(() => setHasCopied(false), 2000) + return () => clearTimeout(timer) + } + }, [hasCopied]) + + return ( + + ) +} diff --git a/apps/ui/src/components/icons.tsx b/apps/ui/src/components/icons.tsx new file mode 100644 index 0000000..214ace1 --- /dev/null +++ b/apps/ui/src/components/icons.tsx @@ -0,0 +1,207 @@ +import { FileIcon } from "lucide-react" + +type IconProps = React.HTMLAttributes + +export const Icons = { + logo: (props: IconProps) => ( + + + + + + ), + twitter: (props: IconProps) => ( + + + + ), + gitHub: (props: IconProps) => ( + + + + ), + radix: (props: IconProps) => ( + + + + + + ), + aria: (props: IconProps) => ( + + + + ), + npm: (props: IconProps) => ( + + + + ), + yarn: (props: IconProps) => ( + + + + ), + pnpm: (props: IconProps) => ( + + + + ), + react: (props: IconProps) => ( + + + + ), + tailwind: (props: IconProps) => ( + + + + ), + google: (props: IconProps) => ( + + + + ), + apple: (props: IconProps) => ( + + + + ), + paypal: (props: IconProps) => ( + + + + ), + spinner: (props: IconProps) => ( + + + + ), + json: (props: IconProps) => ( + + + + ), + ts: (props: IconProps) => ( + + + + ), + css: (props: IconProps) => ( + + + + ), + bash: (props: IconProps) => ( + + + + ), + v0: (props: IconProps) => ( + + + + + ), +} + +export function getIconForLanguageExtension(language: string) { + switch (language) { + case "json": + return + case "css": + return + case "js": + case "jsx": + case "ts": + case "tsx": + case "typescript": + return + default: + return + } +} diff --git a/apps/ui/src/components/theme-provider.tsx b/apps/ui/src/components/theme-provider.tsx new file mode 100644 index 0000000..aa1a205 --- /dev/null +++ b/apps/ui/src/components/theme-provider.tsx @@ -0,0 +1,54 @@ + +import * as React from "react" +import { ThemeProvider as NextThemesProvider, useTheme } from "next-themes" + +function ThemeShortcut() { + const { setTheme, resolvedTheme } = useTheme() + + React.useEffect(() => { + const down = (e: KeyboardEvent) => { + if ( + (e.key === "d" || e.key === "D") && + !e.metaKey && + !e.ctrlKey && + !e.altKey + ) { + if ( + (e.target instanceof HTMLElement && e.target.isContentEditable) || + e.target instanceof HTMLInputElement || + e.target instanceof HTMLTextAreaElement || + e.target instanceof HTMLSelectElement + ) { + return + } + + e.preventDefault() + setTheme(resolvedTheme === "dark" ? "light" : "dark") + } + } + + document.addEventListener("keydown", down) + return () => document.removeEventListener("keydown", down) + }, [resolvedTheme, setTheme]) + + return null +} + +export function ThemeProvider({ + children, + ...props +}: React.ComponentProps) { + return ( + + + {children} + + ) +} diff --git a/apps/ui/src/globals.css b/apps/ui/src/globals.css index 5e46c51..f58f014 100644 --- a/apps/ui/src/globals.css +++ b/apps/ui/src/globals.css @@ -2,7 +2,24 @@ @import "tw-animate-css"; @import "shadcn/tailwind.css"; +@import "./registry/styles/style-vega.css" layer(base); +@import "./registry/styles/style-nova.css" layer(base); +@import "./registry/styles/style-lyra.css" layer(base); +@import "./registry/styles/style-maia.css" layer(base); +@import "./registry/styles/style-mira.css" layer(base); +@import "./registry/styles/style-luma.css" layer(base); +@import "./registry/styles/style-sera.css" layer(base); + +@custom-variant style-vega (&:where(.style-vega *)); +@custom-variant style-nova (&:where(.style-nova *)); +@custom-variant style-lyra (&:where(.style-lyra *)); +@custom-variant style-maia (&:where(.style-maia *)); +@custom-variant style-mira (&:where(.style-mira *)); +@custom-variant style-luma (&:where(.style-luma *)); +@custom-variant style-sera (&:where(.style-sera *)); + @custom-variant dark (&:is(.dark *)); +@custom-variant fixed (&:is(.layout-fixed *)); :root { --font-body: "Fredoka", "DM Sans", "Segoe UI", sans-serif; @@ -108,15 +125,29 @@ body::before { background-size: 256px 256px; } -h1, -h2, -h3, -h4, -h5, -h6 { +body > :not([data-design-system-root]) :is(h1, h2, h3, h4, h5, h6), +body > :not([data-design-system-root]):is(h1, h2, h3, h4, h5, h6) { font-family: var(--font-display); } +[data-design-system-root] :is(h1, h2, h3, h4, h5, h6) { + font-family: var(--font-heading, var(--font-sans)); +} + +.cn-font-heading { + font-family: var(--font-heading, var(--font-sans)); +} + +/* + * @copilotkit/react-ui's input.css ships a selector list where the commas + * make bare ".dark" (and a few siblings) apply "color: rgb(69,69,69) !important" + * to any element with class "dark", which clobbers Tailwind's dark-mode color + * inside our customizer Card. Override with higher specificity + !important. + */ +body :is(.dark, [data-theme="dark"]):not(.poweredBy) { + color: var(--foreground) !important; +} + code, pre, kbd, @@ -402,10 +433,51 @@ samp { } } +@keyframes tool-pulse { + 0%, + 100% { + box-shadow: 0 6px 20px -18px rgba(0, 0, 0, 0.35); + } + 50% { + box-shadow: 0 10px 28px -18px rgba(0, 0, 0, 0.45); + } +} + +@keyframes tool-dot { + 0%, + 80%, + 100% { + opacity: 0.25; + transform: translateY(0); + } + 40% { + opacity: 1; + transform: translateY(-1px); + } +} + +@keyframes tool-fade-in { + from { + opacity: 0; + transform: translateY(-2px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + @theme inline { + --animate-tool-pulse: tool-pulse 1.8s ease-in-out infinite; + --animate-tool-dot: tool-dot 1.2s ease-in-out infinite; + --animate-tool-fade-in: tool-fade-in 240ms ease-out both; --font-family-body: "Fredoka", "DM Sans", "Segoe UI", sans-serif; --font-family-display: "KefirVariable", "Fraunces", "Times New Roman", serif; --font-family-code: "JetBrains Mono", "SFMono-Regular", Menlo, Monaco, Consolas, monospace; + --font-sans: var(--font-sans); + --font-heading: var(--font-heading); + --breakpoint-3xl: 1600px; + --breakpoint-4xl: 2000px; --radius-sm: calc(var(--radius) - 4px); --radius-md: calc(var(--radius) - 2px); --radius-lg: var(--radius); diff --git a/apps/ui/src/hooks/use-config.ts b/apps/ui/src/hooks/use-config.ts new file mode 100644 index 0000000..f607114 --- /dev/null +++ b/apps/ui/src/hooks/use-config.ts @@ -0,0 +1,18 @@ +import { useAtom } from "jotai" +import { atomWithStorage } from "jotai/utils" + +type Config = { + style: "new-york-v4" + packageManager: "npm" | "yarn" | "pnpm" | "bun" + installationType: "cli" | "manual" +} + +const configAtom = atomWithStorage("config", { + style: "new-york-v4", + packageManager: "pnpm", + installationType: "cli", +}) + +export function useConfig() { + return useAtom(configAtom) +} diff --git a/apps/ui/src/hooks/use-copy-to-clipboard.ts b/apps/ui/src/hooks/use-copy-to-clipboard.ts new file mode 100644 index 0000000..0a01ade --- /dev/null +++ b/apps/ui/src/hooks/use-copy-to-clipboard.ts @@ -0,0 +1,79 @@ + +import * as React from "react" + +function legacyCopyToClipboard(value: string) { + const textArea = document.createElement("textarea") + textArea.value = value + textArea.setAttribute("readonly", "") + textArea.style.position = "fixed" + textArea.style.opacity = "0" + textArea.style.pointerEvents = "none" + + document.body.appendChild(textArea) + textArea.focus() + textArea.select() + textArea.setSelectionRange(0, value.length) + + let hasCopied = false + try { + hasCopied = document.execCommand("copy") + } catch { + hasCopied = false + } + + document.body.removeChild(textArea) + return hasCopied +} + +export function useCopyToClipboard({ + timeout = 2000, + onCopy, +}: { + timeout?: number + onCopy?: () => void +} = {}) { + const [isCopied, setIsCopied] = React.useState(false) + + const copyToClipboard = async (value: string) => { + if (typeof window === "undefined") { + return false + } + + if (!value) { + return false + } + + let hasCopied = false + + if (navigator.clipboard?.writeText) { + try { + await navigator.clipboard.writeText(value) + hasCopied = true + } catch { + hasCopied = legacyCopyToClipboard(value) + } + } else { + hasCopied = legacyCopyToClipboard(value) + } + + if (!hasCopied) { + return false + } + + setIsCopied(true) + + if (onCopy) { + onCopy() + } + + if (timeout !== 0) { + setTimeout(() => { + setIsCopied(false) + }, timeout) + } + + return true + } + + return { isCopied, copyToClipboard } +} diff --git a/apps/ui/src/hooks/use-media-query.tsx b/apps/ui/src/hooks/use-media-query.tsx new file mode 100644 index 0000000..95e552c --- /dev/null +++ b/apps/ui/src/hooks/use-media-query.tsx @@ -0,0 +1,19 @@ +import * as React from "react" + +export function useMediaQuery(query: string) { + const [value, setValue] = React.useState(false) + + React.useEffect(() => { + function onChange(event: MediaQueryListEvent) { + setValue(event.matches) + } + + const result = matchMedia(query) + result.addEventListener("change", onChange) + setValue(result.matches) + + return () => result.removeEventListener("change", onChange) + }, [query]) + + return value +} diff --git a/apps/ui/src/hooks/use-meta-color.ts b/apps/ui/src/hooks/use-meta-color.ts new file mode 100644 index 0000000..2cfbd17 --- /dev/null +++ b/apps/ui/src/hooks/use-meta-color.ts @@ -0,0 +1,28 @@ +import * as React from "react" +import { useTheme } from "next-themes" + +export const META_THEME_COLORS = { + light: "#ffffff", + dark: "#0a0a0a", +} + +export function useMetaColor() { + const { resolvedTheme } = useTheme() + + const metaColor = React.useMemo(() => { + return resolvedTheme !== "dark" + ? META_THEME_COLORS.light + : META_THEME_COLORS.dark + }, [resolvedTheme]) + + const setMetaColor = React.useCallback((color: string) => { + document + .querySelector('meta[name="theme-color"]') + ?.setAttribute("content", color) + }, []) + + return { + metaColor, + setMetaColor, + } +} diff --git a/apps/ui/src/hooks/use-mobile.ts b/apps/ui/src/hooks/use-mobile.ts index 502fd32..29c7c87 100644 --- a/apps/ui/src/hooks/use-mobile.ts +++ b/apps/ui/src/hooks/use-mobile.ts @@ -1,19 +1,17 @@ -import * as React from "react"; +import * as React from "react" -const MOBILE_BREAKPOINT = 768; - -export function useIsMobile() { - const [isMobile, setIsMobile] = React.useState(undefined); +export function useIsMobile(mobileBreakpoint = 768) { + const [isMobile, setIsMobile] = React.useState(undefined) React.useEffect(() => { - const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`); + const mql = window.matchMedia(`(max-width: ${mobileBreakpoint - 1}px)`) const onChange = () => { - setIsMobile(window.innerWidth < MOBILE_BREAKPOINT); - }; - mql.addEventListener("change", onChange); - setIsMobile(window.innerWidth < MOBILE_BREAKPOINT); - return () => mql.removeEventListener("change", onChange); - }, []); + setIsMobile(window.innerWidth < mobileBreakpoint) + } + mql.addEventListener("change", onChange) + setIsMobile(window.innerWidth < mobileBreakpoint) + return () => mql.removeEventListener("change", onChange) + }, [mobileBreakpoint]) - return !!isMobile; + return !!isMobile } diff --git a/apps/ui/src/hooks/use-mounted.ts b/apps/ui/src/hooks/use-mounted.ts new file mode 100644 index 0000000..3a20c62 --- /dev/null +++ b/apps/ui/src/hooks/use-mounted.ts @@ -0,0 +1,11 @@ +import * as React from "react" + +export function useMounted() { + const [mounted, setMounted] = React.useState(false) + + React.useEffect(() => { + setMounted(true) + }, []) + + return mounted +} diff --git a/apps/ui/src/lib/config.ts b/apps/ui/src/lib/config.ts new file mode 100644 index 0000000..67a510f --- /dev/null +++ b/apps/ui/src/lib/config.ts @@ -0,0 +1,42 @@ +export const siteConfig = { + name: "shadcn/ui", + url: "https://ui.shadcn.com", + ogImage: "https://ui.shadcn.com/og.jpg", + description: + "A set of beautifully designed components that you can customize, extend, and build on. Start here then make it your own. Open Source. Open Code.", + links: { + twitter: "https://twitter.com/shadcn", + github: "https://github.com/shadcn-ui/ui", + }, + navItems: [ + { + href: "/docs/installation", + label: "Docs", + }, + { + href: "/docs/components", + label: "Components", + }, + { + href: "/blocks", + label: "Blocks", + }, + { + href: "/charts/area", + label: "Charts", + }, + { + href: "/docs/directory", + label: "Directory", + }, + { + href: "/create", + label: "Create", + }, + ], +} + +export const META_THEME_COLORS = { + light: "#ffffff", + dark: "#09090b", +} diff --git a/apps/ui/src/lib/events.ts b/apps/ui/src/lib/events.ts new file mode 100644 index 0000000..5298db7 --- /dev/null +++ b/apps/ui/src/lib/events.ts @@ -0,0 +1,11 @@ +export type Event = { + name: string; + properties?: Record; +}; + +export function trackEvent(event: Event): void { + if (import.meta.env.DEV) { + // eslint-disable-next-line no-console + console.debug("[event]", event.name, event.properties ?? {}); + } +} diff --git a/apps/ui/src/lib/font-definitions.ts b/apps/ui/src/lib/font-definitions.ts new file mode 100644 index 0000000..f585bcb --- /dev/null +++ b/apps/ui/src/lib/font-definitions.ts @@ -0,0 +1,331 @@ +export type FontDefinition = { + name: string + title: string + type: "sans" | "mono" | "serif" + family: string + registryVariable: "--font-sans" | "--font-mono" | "--font-serif" + previewVariable: string + provider: "google" + import: string + dependency: string + subsets: readonly string[] + weight?: readonly string[] +} + +export const FONT_DEFINITIONS = [ + { + name: "geist", + title: "Geist", + type: "sans", + family: "'Geist Variable', sans-serif", + registryVariable: "--font-sans", + previewVariable: "--font-geist-sans", + provider: "google", + import: "Geist", + dependency: "@fontsource-variable/geist", + subsets: ["latin"], + }, + { + name: "inter", + title: "Inter", + type: "sans", + family: "'Inter Variable', sans-serif", + registryVariable: "--font-sans", + previewVariable: "--font-inter", + provider: "google", + import: "Inter", + dependency: "@fontsource-variable/inter", + subsets: ["latin"], + }, + { + name: "noto-sans", + title: "Noto Sans", + type: "sans", + family: "'Noto Sans Variable', sans-serif", + registryVariable: "--font-sans", + previewVariable: "--font-noto-sans", + provider: "google", + import: "Noto_Sans", + dependency: "@fontsource-variable/noto-sans", + subsets: ["latin"], + }, + { + name: "nunito-sans", + title: "Nunito Sans", + type: "sans", + family: "'Nunito Sans Variable', sans-serif", + registryVariable: "--font-sans", + previewVariable: "--font-nunito-sans", + provider: "google", + import: "Nunito_Sans", + dependency: "@fontsource-variable/nunito-sans", + subsets: ["latin"], + }, + { + name: "figtree", + title: "Figtree", + type: "sans", + family: "'Figtree Variable', sans-serif", + registryVariable: "--font-sans", + previewVariable: "--font-figtree", + provider: "google", + import: "Figtree", + dependency: "@fontsource-variable/figtree", + subsets: ["latin"], + }, + { + name: "roboto", + title: "Roboto", + type: "sans", + family: "'Roboto Variable', sans-serif", + registryVariable: "--font-sans", + previewVariable: "--font-roboto", + provider: "google", + import: "Roboto", + dependency: "@fontsource-variable/roboto", + subsets: ["latin"], + }, + { + name: "raleway", + title: "Raleway", + type: "sans", + family: "'Raleway Variable', sans-serif", + registryVariable: "--font-sans", + previewVariable: "--font-raleway", + provider: "google", + import: "Raleway", + dependency: "@fontsource-variable/raleway", + subsets: ["latin"], + }, + { + name: "dm-sans", + title: "DM Sans", + type: "sans", + family: "'DM Sans Variable', sans-serif", + registryVariable: "--font-sans", + previewVariable: "--font-dm-sans", + provider: "google", + import: "DM_Sans", + dependency: "@fontsource-variable/dm-sans", + subsets: ["latin"], + }, + { + name: "public-sans", + title: "Public Sans", + type: "sans", + family: "'Public Sans Variable', sans-serif", + registryVariable: "--font-sans", + previewVariable: "--font-public-sans", + provider: "google", + import: "Public_Sans", + dependency: "@fontsource-variable/public-sans", + subsets: ["latin"], + }, + { + name: "outfit", + title: "Outfit", + type: "sans", + family: "'Outfit Variable', sans-serif", + registryVariable: "--font-sans", + previewVariable: "--font-outfit", + provider: "google", + import: "Outfit", + dependency: "@fontsource-variable/outfit", + subsets: ["latin"], + }, + { + name: "oxanium", + title: "Oxanium", + type: "sans", + family: "'Oxanium Variable', sans-serif", + registryVariable: "--font-sans", + previewVariable: "--font-oxanium", + provider: "google", + import: "Oxanium", + dependency: "@fontsource-variable/oxanium", + subsets: ["latin"], + }, + { + name: "manrope", + title: "Manrope", + type: "sans", + family: "'Manrope Variable', sans-serif", + registryVariable: "--font-sans", + previewVariable: "--font-manrope", + provider: "google", + import: "Manrope", + dependency: "@fontsource-variable/manrope", + subsets: ["latin"], + }, + { + name: "space-grotesk", + title: "Space Grotesk", + type: "sans", + family: "'Space Grotesk Variable', sans-serif", + registryVariable: "--font-sans", + previewVariable: "--font-space-grotesk", + provider: "google", + import: "Space_Grotesk", + dependency: "@fontsource-variable/space-grotesk", + subsets: ["latin"], + }, + { + name: "montserrat", + title: "Montserrat", + type: "sans", + family: "'Montserrat Variable', sans-serif", + registryVariable: "--font-sans", + previewVariable: "--font-montserrat", + provider: "google", + import: "Montserrat", + dependency: "@fontsource-variable/montserrat", + subsets: ["latin"], + }, + { + name: "ibm-plex-sans", + title: "IBM Plex Sans", + type: "sans", + family: "'IBM Plex Sans Variable', sans-serif", + registryVariable: "--font-sans", + previewVariable: "--font-ibm-plex-sans", + provider: "google", + import: "IBM_Plex_Sans", + dependency: "@fontsource-variable/ibm-plex-sans", + subsets: ["latin"], + }, + { + name: "source-sans-3", + title: "Source Sans 3", + type: "sans", + family: "'Source Sans 3 Variable', sans-serif", + registryVariable: "--font-sans", + previewVariable: "--font-source-sans-3", + provider: "google", + import: "Source_Sans_3", + dependency: "@fontsource-variable/source-sans-3", + subsets: ["latin"], + }, + { + name: "instrument-sans", + title: "Instrument Sans", + type: "sans", + family: "'Instrument Sans Variable', sans-serif", + registryVariable: "--font-sans", + previewVariable: "--font-instrument-sans", + provider: "google", + import: "Instrument_Sans", + dependency: "@fontsource-variable/instrument-sans", + subsets: ["latin"], + }, + { + name: "jetbrains-mono", + title: "JetBrains Mono", + type: "mono", + family: "'JetBrains Mono Variable', monospace", + registryVariable: "--font-mono", + previewVariable: "--font-jetbrains-mono", + provider: "google", + import: "JetBrains_Mono", + dependency: "@fontsource-variable/jetbrains-mono", + subsets: ["latin"], + }, + { + name: "geist-mono", + title: "Geist Mono", + type: "mono", + family: "'Geist Mono Variable', monospace", + registryVariable: "--font-mono", + previewVariable: "--font-geist-mono", + provider: "google", + import: "Geist_Mono", + dependency: "@fontsource-variable/geist-mono", + subsets: ["latin"], + }, + { + name: "noto-serif", + title: "Noto Serif", + type: "serif", + family: "'Noto Serif Variable', serif", + registryVariable: "--font-serif", + previewVariable: "--font-noto-serif", + provider: "google", + import: "Noto_Serif", + dependency: "@fontsource-variable/noto-serif", + subsets: ["latin"], + }, + { + name: "roboto-slab", + title: "Roboto Slab", + type: "serif", + family: "'Roboto Slab Variable', serif", + registryVariable: "--font-serif", + previewVariable: "--font-roboto-slab", + provider: "google", + import: "Roboto_Slab", + dependency: "@fontsource-variable/roboto-slab", + subsets: ["latin"], + }, + { + name: "merriweather", + title: "Merriweather", + type: "serif", + family: "'Merriweather Variable', serif", + registryVariable: "--font-serif", + previewVariable: "--font-merriweather", + provider: "google", + import: "Merriweather", + dependency: "@fontsource-variable/merriweather", + subsets: ["latin"], + }, + { + name: "lora", + title: "Lora", + type: "serif", + family: "'Lora Variable', serif", + registryVariable: "--font-serif", + previewVariable: "--font-lora", + provider: "google", + import: "Lora", + dependency: "@fontsource-variable/lora", + subsets: ["latin"], + }, + { + name: "playfair-display", + title: "Playfair Display", + type: "serif", + family: "'Playfair Display Variable', serif", + registryVariable: "--font-serif", + previewVariable: "--font-playfair-display", + provider: "google", + import: "Playfair_Display", + dependency: "@fontsource-variable/playfair-display", + subsets: ["latin"], + }, + { + name: "eb-garamond", + title: "EB Garamond", + type: "serif", + family: "'EB Garamond Variable', serif", + registryVariable: "--font-serif", + previewVariable: "--font-eb-garamond", + provider: "google", + import: "EB_Garamond", + dependency: "@fontsource-variable/eb-garamond", + subsets: ["latin"], + }, + { + name: "instrument-serif", + title: "Instrument Serif", + type: "serif", + family: "'Instrument Serif', serif", + registryVariable: "--font-serif", + previewVariable: "--font-instrument-serif", + provider: "google", + import: "Instrument_Serif", + dependency: "@fontsource/instrument-serif", + subsets: ["latin"], + weight: ["400"], + }, +] as const satisfies readonly FontDefinition[] + +export type FontName = (typeof FONT_DEFINITIONS)[number]["name"] diff --git a/apps/ui/src/lib/utils.ts b/apps/ui/src/lib/utils.ts index a5ef193..d305e3e 100644 --- a/apps/ui/src/lib/utils.ts +++ b/apps/ui/src/lib/utils.ts @@ -4,3 +4,8 @@ import { twMerge } from "tailwind-merge"; export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)); } + +export function absoluteUrl(path: string) { + const base = import.meta.env.VITE_APP_URL ?? window.location.origin; + return `${base}${path}`; +} diff --git a/apps/ui/src/registry/__blocks__.json b/apps/ui/src/registry/__blocks__.json new file mode 100644 index 0000000..a97a144 --- /dev/null +++ b/apps/ui/src/registry/__blocks__.json @@ -0,0 +1,143 @@ +[ + { + "name": "preview" + }, + { + "name": "preview-02" + }, + { + "name": "login-01", + "description": "A simple login form.", + "categories": ["authentication", "login"] + }, + { + "name": "login-02", + "description": "A two column login page with a cover image.", + "categories": ["authentication", "login"] + }, + { + "name": "login-03", + "description": "A login page with a muted background color.", + "categories": ["authentication", "login"] + }, + { + "name": "login-04", + "description": "A login page with form and image.", + "categories": ["authentication", "login"] + }, + { + "name": "login-05", + "description": "A simple email-only login page.", + "categories": ["authentication", "login"] + }, + { + "name": "signup-01", + "description": "A simple signup form.", + "categories": ["authentication", "signup"] + }, + { + "name": "signup-02", + "description": "A two column signup page with a cover image.", + "categories": ["authentication", "signup"] + }, + { + "name": "signup-03", + "description": "A signup page with a muted background color.", + "categories": ["authentication", "signup"] + }, + { + "name": "signup-04", + "description": "A signup page with form and image.", + "categories": ["authentication", "signup"] + }, + { + "name": "signup-05", + "description": "A simple signup form with social providers.", + "categories": ["authentication", "signup"] + }, + { + "name": "dashboard-01", + "description": "A dashboard with sidebar, charts and data table.", + "categories": ["dashboard"] + }, + { + "name": "sidebar-01", + "description": "A simple sidebar with navigation grouped by section.", + "categories": ["sidebar", "dashboard"] + }, + { + "name": "sidebar-02", + "description": "A sidebar with collapsible sections.", + "categories": ["sidebar", "dashboard"] + }, + { + "name": "sidebar-03", + "description": "A sidebar with submenus.", + "categories": ["sidebar", "dashboard"] + }, + { + "name": "sidebar-04", + "description": "A floating sidebar with submenus.", + "categories": ["sidebar", "dashboard"] + }, + { + "name": "sidebar-05", + "description": "A sidebar with collapsible submenus.", + "categories": ["sidebar", "dashboard"] + }, + { + "name": "sidebar-06", + "description": "A sidebar with submenus as dropdowns.", + "categories": ["sidebar", "dashboard"] + }, + { + "name": "sidebar-07", + "description": "A sidebar that collapses to icons.", + "categories": ["sidebar", "dashboard"] + }, + { + "name": "sidebar-08", + "description": "An inset sidebar with secondary navigation.", + "categories": ["sidebar", "dashboard"] + }, + { + "name": "sidebar-09", + "description": "Collapsible nested sidebars.", + "categories": ["sidebar", "dashboard"] + }, + { + "name": "sidebar-10", + "description": "A sidebar in a popover.", + "categories": ["sidebar", "dashboard"] + }, + { + "name": "sidebar-11", + "description": "A sidebar with a collapsible file tree.", + "categories": ["sidebar", "dashboard"] + }, + { + "name": "sidebar-12", + "description": "A sidebar with a calendar.", + "categories": ["sidebar", "dashboard"] + }, + { + "name": "sidebar-13", + "description": "A sidebar in a dialog.", + "categories": ["sidebar", "dashboard"] + }, + { + "name": "sidebar-14", + "description": "A sidebar on the right.", + "categories": ["sidebar", "dashboard"] + }, + { + "name": "sidebar-15", + "description": "A left and right sidebar.", + "categories": ["sidebar", "dashboard"] + }, + { + "name": "sidebar-16", + "description": "A sidebar with a sticky site header.", + "categories": ["sidebar", "dashboard"] + } +] diff --git a/apps/ui/src/registry/base-colors.ts b/apps/ui/src/registry/base-colors.ts new file mode 100644 index 0000000..3523db3 --- /dev/null +++ b/apps/ui/src/registry/base-colors.ts @@ -0,0 +1,9 @@ +import { THEMES } from "@/registry/themes" + +export const BASE_COLORS = THEMES.filter((theme) => + ["neutral", "stone", "zinc", "mauve", "olive", "mist", "taupe"].includes( + theme.name + ) +) + +export type BaseColor = (typeof BASE_COLORS)[number] diff --git a/apps/ui/src/registry/bases.ts b/apps/ui/src/registry/bases.ts new file mode 100644 index 0000000..49c3f99 --- /dev/null +++ b/apps/ui/src/registry/bases.ts @@ -0,0 +1,29 @@ +import { type registryItemSchema } from "shadcn/schema" +import { type z } from "zod" + +export const BASES: z.infer[] = [ + { + name: "radix", + type: "registry:style", + title: "Radix UI", + description: + "Optimized for fast development, easy maintenance, and accessibility.", + dependencies: ["radix-ui"], + meta: { + logo: "Radix UI", + }, + }, + { + name: "base", + type: "registry:style", + title: "Base UI", + description: + "Components for building accessible web apps and design systems.", + dependencies: ["@base-ui/react"], + meta: { + logo: "", + }, + }, +] + +export type Base = (typeof BASES)[number] diff --git a/apps/ui/src/registry/bases/README.md b/apps/ui/src/registry/bases/README.md new file mode 100644 index 0000000..752d0b1 --- /dev/null +++ b/apps/ui/src/registry/bases/README.md @@ -0,0 +1,15 @@ +# Registry bases (`base` and `radix`) + +This folder holds **two parallel registries**: + +- **`base/`** — Base UI–backed components and blocks +- **`radix/`** — Radix-backed components and blocks + +## Keep them in sync + +For any **shared** surface (same preview block, same card, same example intent), changes should be applied to **both** `base` and `radix` variants. + +- Adjust only what must differ: imports (`.../base/ui/...` vs `.../radix/ui/...`) and primitive APIs. +- Avoid editing only one tree unless the work is intentionally scoped to a single base. + +Project automation: see `.cursor/rules/registry-bases-parity.mdc` for the Cursor rule agents use when working under `apps/v4/registry/bases/`. diff --git a/apps/ui/src/registry/bases/__index__.tsx b/apps/ui/src/registry/bases/__index__.tsx new file mode 100644 index 0000000..bd732c6 --- /dev/null +++ b/apps/ui/src/registry/bases/__index__.tsx @@ -0,0 +1,9782 @@ +// @ts-nocheck +// This file is autogenerated by scripts/build-registry.ts +// Do not edit this file directly. + +import * as React from "react" + +export const Index: Record> = { + radix: { + accordion: { + name: "accordion", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/accordion.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/accordion") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "accordion" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/accordion", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/accordion-example.tsx", + api: "https://www.radix-ui.com/primitives/docs/components/accordion.md", + }, + }, + }, + alert: { + name: "alert", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/alert.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/alert") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "alert" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/alert", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/alert-example.tsx", + }, + }, + }, + "alert-dialog": { + name: "alert-dialog", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: ["button"], + files: [ + { + path: "registry/bases/radix/ui/alert-dialog.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/alert-dialog") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "alert-dialog" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/alert-dialog", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/alert-dialog-example.tsx", + api: "https://www.radix-ui.com/primitives/docs/components/alert-dialog.md", + }, + }, + }, + "aspect-ratio": { + name: "aspect-ratio", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/aspect-ratio.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/aspect-ratio") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "aspect-ratio" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/aspect-ratio", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/aspect-ratio-example.tsx", + api: "https://www.radix-ui.com/primitives/docs/components/aspect-ratio.md", + }, + }, + }, + avatar: { + name: "avatar", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/avatar.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/avatar") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "avatar" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/avatar", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/avatar-example.tsx", + api: "https://www.radix-ui.com/primitives/docs/components/avatar.md", + }, + }, + }, + badge: { + name: "badge", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/badge.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/badge") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "badge" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/badge", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/badge-example.tsx", + }, + }, + }, + breadcrumb: { + name: "breadcrumb", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/breadcrumb.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/breadcrumb") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "breadcrumb" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/breadcrumb", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/breadcrumb-example.tsx", + }, + }, + }, + button: { + name: "button", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/button.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/button") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "button" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/button", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/button-example.tsx", + }, + }, + }, + "button-group": { + name: "button-group", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: ["separator"], + files: [ + { + path: "registry/bases/radix/ui/button-group.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/button-group") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "button-group" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/button-group", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/button-group-example.tsx", + }, + }, + }, + calendar: { + name: "calendar", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: ["button"], + files: [ + { + path: "registry/bases/radix/ui/calendar.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/calendar") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "calendar" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/calendar", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/calendar-example.tsx", + api: "https://react-day-picker.js.org", + }, + }, + }, + card: { + name: "card", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/card.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/card") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "card" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/card", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/card-example.tsx", + }, + }, + }, + carousel: { + name: "carousel", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: ["button"], + files: [ + { + path: "registry/bases/radix/ui/carousel.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/carousel") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "carousel" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/carousel", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/carousel-example.tsx", + api: "https://www.embla-carousel.com/get-started/react", + }, + }, + }, + chart: { + name: "chart", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/chart.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/chart") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "chart" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/chart", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/chart-example.tsx", + }, + }, + }, + checkbox: { + name: "checkbox", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/checkbox.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/checkbox") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "checkbox" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/checkbox", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/checkbox-example.tsx", + api: "https://www.radix-ui.com/docs/primitives/components/checkbox.md", + }, + }, + }, + collapsible: { + name: "collapsible", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/collapsible.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/collapsible") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "collapsible" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/collapsible", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/collapsible-example.tsx", + api: "https://www.radix-ui.com/docs/primitives/components/collapsible.md", + }, + }, + }, + combobox: { + name: "combobox", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: ["button", "input-group"], + files: [ + { + path: "registry/bases/radix/ui/combobox.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/combobox") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "combobox" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/combobox", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/combobox-example.tsx", + api: "https://base-ui.com/react/components/combobox", + }, + }, + }, + command: { + name: "command", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: ["dialog", "input-group"], + files: [ + { + path: "registry/bases/radix/ui/command.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/command") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "command" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/command", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/command-example.tsx", + api: "https://github.com/dip/cmdk", + }, + }, + }, + "context-menu": { + name: "context-menu", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/context-menu.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/context-menu") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "context-menu" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/context-menu", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/context-menu-example.tsx", + api: "https://www.radix-ui.com/docs/primitives/components/context-menu.md", + }, + }, + }, + dialog: { + name: "dialog", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: ["button"], + files: [ + { + path: "registry/bases/radix/ui/dialog.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/dialog") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "dialog" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/dialog", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/dialog-example.tsx", + api: "https://www.radix-ui.com/docs/primitives/components/dialog.md", + }, + }, + }, + drawer: { + name: "drawer", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/drawer.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/drawer") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "drawer" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/drawer", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/drawer-example.tsx", + api: "https://vaul.emilkowal.ski/getting-started", + }, + }, + }, + "dropdown-menu": { + name: "dropdown-menu", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/dropdown-menu.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/dropdown-menu") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "dropdown-menu" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/dropdown-menu", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/dropdown-menu-example.tsx", + api: "https://www.radix-ui.com/docs/primitives/components/dropdown-menu.md", + }, + }, + }, + empty: { + name: "empty", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/empty.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/empty") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "empty" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/empty", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/empty-example.tsx", + }, + }, + }, + field: { + name: "field", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: ["label", "separator"], + files: [ + { + path: "registry/bases/radix/ui/field.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/field") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "field" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/field", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/field-example.tsx", + }, + }, + }, + "hover-card": { + name: "hover-card", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/hover-card.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/hover-card") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "hover-card" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/hover-card", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/hover-card-example.tsx", + api: "https://www.radix-ui.com/docs/primitives/components/hover-card.md", + }, + }, + }, + input: { + name: "input", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/input.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/input") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "input" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/input", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/input-example.tsx", + }, + }, + }, + "input-group": { + name: "input-group", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: ["button", "input", "textarea"], + files: [ + { + path: "registry/bases/radix/ui/input-group.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/input-group") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "input-group" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/input-group", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/input-group-example.tsx", + }, + }, + }, + "input-otp": { + name: "input-otp", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/input-otp.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/input-otp") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "input-otp" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/input-otp", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/input-otp-example.tsx", + api: "https://input-otp.rodz.dev", + }, + }, + }, + item: { + name: "item", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: ["separator"], + files: [ + { + path: "registry/bases/radix/ui/item.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/item") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "item" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/item", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/item-example.tsx", + }, + }, + }, + label: { + name: "label", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/label.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/label") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "label" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/label", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/label-example.tsx", + api: "https://www.radix-ui.com/docs/primitives/components/label.md", + }, + }, + }, + menubar: { + name: "menubar", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/menubar.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/menubar") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "menubar" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/menubar", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/menubar-example.tsx", + api: "https://www.radix-ui.com/docs/primitives/components/menubar.md", + }, + }, + }, + "navigation-menu": { + name: "navigation-menu", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/navigation-menu.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/navigation-menu") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "navigation-menu" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/navigation-menu", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/navigation-menu-example.tsx", + api: "https://www.radix-ui.com/docs/primitives/components/navigation-menu.md", + }, + }, + }, + pagination: { + name: "pagination", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: ["button"], + files: [ + { + path: "registry/bases/radix/ui/pagination.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/pagination") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "pagination" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/pagination", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/pagination-example.tsx", + }, + }, + }, + popover: { + name: "popover", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/popover.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/popover") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "popover" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/popover", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/popover-example.tsx", + api: "https://www.radix-ui.com/docs/primitives/components/popover.md", + }, + }, + }, + progress: { + name: "progress", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/progress.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/progress") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "progress" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/progress", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/progress-example.tsx", + api: "https://www.radix-ui.com/docs/primitives/components/progress.md", + }, + }, + }, + "radio-group": { + name: "radio-group", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/radio-group.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/radio-group") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "radio-group" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/radio-group", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/radio-group-example.tsx", + api: "https://www.radix-ui.com/docs/primitives/components/radio-group.md", + }, + }, + }, + resizable: { + name: "resizable", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/resizable.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/resizable") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "resizable" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/resizable", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/resizable-example.tsx", + api: "https://github.com/bvaughn/react-resizable-panels", + }, + }, + }, + "scroll-area": { + name: "scroll-area", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/scroll-area.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/scroll-area") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "scroll-area" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/scroll-area", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/scroll-area-example.tsx", + api: "https://www.radix-ui.com/docs/primitives/components/scroll-area.md", + }, + }, + }, + select: { + name: "select", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/select.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/select") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "select" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/select", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/select-example.tsx", + api: "https://www.radix-ui.com/docs/primitives/components/select.md", + }, + }, + }, + separator: { + name: "separator", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/separator.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/separator") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "separator" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/separator", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/separator-example.tsx", + api: "https://www.radix-ui.com/docs/primitives/components/separator.md", + }, + }, + }, + sheet: { + name: "sheet", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: ["button"], + files: [ + { + path: "registry/bases/radix/ui/sheet.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/sheet") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sheet" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/sheet", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/sheet-example.tsx", + api: "https://www.radix-ui.com/docs/primitives/components/dialog.md", + }, + }, + }, + sidebar: { + name: "sidebar", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: [ + "button", + "separator", + "sheet", + "tooltip", + "input", + "use-mobile", + "skeleton", + ], + files: [ + { + path: "registry/bases/radix/ui/sidebar.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/sidebar") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/sidebar", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/sidebar-example.tsx", + }, + }, + }, + skeleton: { + name: "skeleton", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/skeleton.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/skeleton") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "skeleton" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/skeleton", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/skeleton-example.tsx", + }, + }, + }, + slider: { + name: "slider", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/slider.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/slider") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "slider" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/slider", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/slider-example.tsx", + api: "https://www.radix-ui.com/docs/primitives/components/slider.md", + }, + }, + }, + sonner: { + name: "sonner", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/sonner.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/sonner") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sonner" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/sonner", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/sonner-example.tsx", + api: "https://sonner.emilkowal.ski", + }, + }, + }, + spinner: { + name: "spinner", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/spinner.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/spinner") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "spinner" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/spinner", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/spinner-example.tsx", + }, + }, + }, + switch: { + name: "switch", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/switch.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/switch") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "switch" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/switch", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/switch-example.tsx", + api: "https://www.radix-ui.com/docs/primitives/components/switch.md", + }, + }, + }, + table: { + name: "table", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/table.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/table") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "table" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/table", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/table-example.tsx", + }, + }, + }, + tabs: { + name: "tabs", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/tabs.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/tabs") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "tabs" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/tabs", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/tabs-example.tsx", + api: "https://www.radix-ui.com/docs/primitives/components/tabs.md", + }, + }, + }, + textarea: { + name: "textarea", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/textarea.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/textarea") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "textarea" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/textarea", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/textarea-example.tsx", + }, + }, + }, + toggle: { + name: "toggle", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/toggle.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/toggle") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "toggle" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/toggle", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/toggle-example.tsx", + api: "https://www.radix-ui.com/docs/primitives/components/toggle.md", + }, + }, + }, + "toggle-group": { + name: "toggle-group", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: ["toggle"], + files: [ + { + path: "registry/bases/radix/ui/toggle-group.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/toggle-group") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "toggle-group" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/toggle-group", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/toggle-group-example.tsx", + api: "https://www.radix-ui.com/docs/primitives/components/toggle-group.md", + }, + }, + }, + tooltip: { + name: "tooltip", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/tooltip.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/tooltip") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "tooltip" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/tooltip", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/tooltip-example.tsx", + api: "https://www.radix-ui.com/docs/primitives/components/tooltip.md", + }, + }, + }, + kbd: { + name: "kbd", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/kbd.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/kbd") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "kbd" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/kbd", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/kbd-example.tsx", + }, + }, + }, + "native-select": { + name: "native-select", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/native-select.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/native-select") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "native-select" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/native-select", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/native-select-example.tsx", + }, + }, + }, + direction: { + name: "direction", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/ui/direction.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/ui/direction") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "direction" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/radix/direction", + api: "https://www.radix-ui.com/primitives/docs/utilities/direction-provider.md", + }, + }, + }, + "accordion-example": { + name: "accordion-example", + title: "Accordion", + description: "", + type: "registry:example", + registryDependencies: ["accordion", "button", "card", "example"], + files: [ + { + path: "registry/bases/radix/examples/accordion-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/accordion-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "accordion-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "alert-example": { + name: "alert-example", + title: "Alert", + description: "", + type: "registry:example", + registryDependencies: ["alert", "badge", "button", "example"], + files: [ + { + path: "registry/bases/radix/examples/alert-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/alert-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "alert-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "alert-dialog-example": { + name: "alert-dialog-example", + title: "Alert Dialog", + description: "", + type: "registry:example", + registryDependencies: ["alert-dialog", "button", "dialog", "example"], + files: [ + { + path: "registry/bases/radix/examples/alert-dialog-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/alert-dialog-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "alert-dialog-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "aspect-ratio-example": { + name: "aspect-ratio-example", + title: "Aspect Ratio", + description: "", + type: "registry:example", + registryDependencies: ["aspect-ratio", "example"], + files: [ + { + path: "registry/bases/radix/examples/aspect-ratio-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/aspect-ratio-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "aspect-ratio-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "avatar-example": { + name: "avatar-example", + title: "Avatar", + description: "", + type: "registry:example", + registryDependencies: ["avatar", "button", "empty", "example"], + files: [ + { + path: "registry/bases/radix/examples/avatar-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/avatar-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "avatar-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "badge-example": { + name: "badge-example", + title: "Badge", + description: "", + type: "registry:example", + registryDependencies: ["badge", "spinner", "example"], + files: [ + { + path: "registry/bases/radix/examples/badge-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/badge-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "badge-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "breadcrumb-example": { + name: "breadcrumb-example", + title: "Breadcrumb", + description: "", + type: "registry:example", + registryDependencies: ["breadcrumb", "dropdown-menu", "example"], + files: [ + { + path: "registry/bases/radix/examples/breadcrumb-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/breadcrumb-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "breadcrumb-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "button-example": { + name: "button-example", + title: "Button", + description: "", + type: "registry:example", + registryDependencies: ["button", "example"], + files: [ + { + path: "registry/bases/radix/examples/button-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/button-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "button-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "button-group-example": { + name: "button-group-example", + title: "Button Group", + description: "", + type: "registry:example", + registryDependencies: [ + "button", + "button-group", + "dropdown-menu", + "field", + "input", + "input-group", + "label", + "popover", + "select", + "tooltip", + "example", + ], + files: [ + { + path: "registry/bases/radix/examples/button-group-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/button-group-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "button-group-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "calendar-example": { + name: "calendar-example", + title: "Calendar", + description: "", + type: "registry:example", + registryDependencies: [ + "button", + "calendar", + "card", + "field", + "input", + "label", + "popover", + "example", + ], + files: [ + { + path: "registry/bases/radix/examples/calendar-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/calendar-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "calendar-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "card-example": { + name: "card-example", + title: "Card", + description: "", + type: "registry:example", + registryDependencies: [ + "avatar", + "button", + "card", + "field", + "input", + "example", + ], + files: [ + { + path: "registry/bases/radix/examples/card-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/examples/card-example") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "card-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "carousel-example": { + name: "carousel-example", + title: "Carousel", + description: "", + type: "registry:example", + registryDependencies: ["card", "carousel", "example"], + files: [ + { + path: "registry/bases/radix/examples/carousel-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/carousel-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "carousel-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "chart-example": { + name: "chart-example", + title: "Chart", + description: "", + type: "registry:example", + registryDependencies: ["chart", "card", "example"], + files: [ + { + path: "registry/bases/radix/examples/chart-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/chart-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "chart-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "checkbox-example": { + name: "checkbox-example", + title: "Checkbox", + description: "", + type: "registry:example", + registryDependencies: ["checkbox", "field", "table", "example"], + files: [ + { + path: "registry/bases/radix/examples/checkbox-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/checkbox-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "checkbox-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "collapsible-example": { + name: "collapsible-example", + title: "Collapsible", + description: "", + type: "registry:example", + registryDependencies: [ + "button", + "card", + "collapsible", + "field", + "input", + "tabs", + "example", + ], + files: [ + { + path: "registry/bases/radix/examples/collapsible-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/collapsible-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "collapsible-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "combobox-example": { + name: "combobox-example", + title: "Combobox", + description: "", + type: "registry:example", + registryDependencies: [ + "button", + "card", + "combobox", + "dialog", + "field", + "input", + "input-group", + "item", + "select", + "example", + ], + files: [ + { + path: "registry/bases/radix/examples/combobox-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/combobox-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "combobox-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "command-example": { + name: "command-example", + title: "Command", + description: "", + type: "registry:example", + registryDependencies: ["button", "command", "example"], + files: [ + { + path: "registry/bases/radix/examples/command-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/command-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "command-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "context-menu-example": { + name: "context-menu-example", + title: "Context Menu", + description: "", + type: "registry:example", + registryDependencies: ["button", "context-menu", "dialog", "example"], + files: [ + { + path: "registry/bases/radix/examples/context-menu-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/context-menu-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "context-menu-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "dialog-example": { + name: "dialog-example", + title: "Dialog", + description: "", + type: "registry:example", + registryDependencies: [ + "button", + "checkbox", + "dialog", + "field", + "input", + "input-group", + "kbd", + "native-select", + "select", + "switch", + "tabs", + "textarea", + "tooltip", + "example", + ], + files: [ + { + path: "registry/bases/radix/examples/dialog-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/dialog-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "dialog-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "drawer-example": { + name: "drawer-example", + title: "Drawer", + description: "", + type: "registry:example", + registryDependencies: ["drawer", "example"], + files: [ + { + path: "registry/bases/radix/examples/drawer-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/drawer-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "drawer-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "dropdown-menu-example": { + name: "dropdown-menu-example", + title: "Dropdown Menu", + description: "", + type: "registry:example", + registryDependencies: [ + "avatar", + "button", + "dialog", + "dropdown-menu", + "example", + ], + files: [ + { + path: "registry/bases/radix/examples/dropdown-menu-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/dropdown-menu-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "dropdown-menu-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "empty-example": { + name: "empty-example", + title: "Empty", + description: "", + type: "registry:example", + registryDependencies: [ + "button", + "empty", + "input-group", + "kbd", + "example", + ], + files: [ + { + path: "registry/bases/radix/examples/empty-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/empty-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "empty-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "field-example": { + name: "field-example", + title: "Field", + description: "", + type: "registry:example", + registryDependencies: [ + "badge", + "checkbox", + "field", + "input", + "input-otp", + "native-select", + "radio-group", + "select", + "slider", + "switch", + "textarea", + "example", + ], + files: [ + { + path: "registry/bases/radix/examples/field-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/field-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "field-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "hover-card-example": { + name: "hover-card-example", + title: "Hover Card", + description: "", + type: "registry:example", + registryDependencies: ["button", "dialog", "hover-card", "example"], + files: [ + { + path: "registry/bases/radix/examples/hover-card-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/hover-card-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "hover-card-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "input-example": { + name: "input-example", + title: "Input", + description: "", + type: "registry:example", + registryDependencies: [ + "button", + "field", + "input", + "native-select", + "select", + "example", + ], + files: [ + { + path: "registry/bases/radix/examples/input-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/input-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "input-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "input-group-example": { + name: "input-group-example", + title: "Input Group", + description: "", + type: "registry:example", + registryDependencies: [ + "button", + "button-group", + "card", + "dropdown-menu", + "field", + "input", + "input-group", + "kbd", + "popover", + "spinner", + "textarea", + "tooltip", + "example", + ], + files: [ + { + path: "registry/bases/radix/examples/input-group-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/input-group-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "input-group-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "input-otp-example": { + name: "input-otp-example", + title: "Input OTP", + description: "", + type: "registry:example", + registryDependencies: ["button", "card", "field", "input-otp", "example"], + files: [ + { + path: "registry/bases/radix/examples/input-otp-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/input-otp-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "input-otp-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "item-example": { + name: "item-example", + title: "Item", + description: "", + type: "registry:example", + registryDependencies: ["button", "item", "example"], + files: [ + { + path: "registry/bases/radix/examples/item-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/examples/item-example") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "item-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "kbd-example": { + name: "kbd-example", + title: "Kbd", + description: "", + type: "registry:example", + registryDependencies: [ + "button", + "input-group", + "kbd", + "tooltip", + "example", + ], + files: [ + { + path: "registry/bases/radix/examples/kbd-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/examples/kbd-example") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "kbd-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "label-example": { + name: "label-example", + title: "Label", + description: "", + type: "registry:example", + registryDependencies: [ + "checkbox", + "field", + "input", + "label", + "textarea", + "example", + ], + files: [ + { + path: "registry/bases/radix/examples/label-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/label-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "label-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "menubar-example": { + name: "menubar-example", + title: "Menubar", + description: "", + type: "registry:example", + registryDependencies: ["button", "dialog", "menubar", "example"], + files: [ + { + path: "registry/bases/radix/examples/menubar-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/menubar-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "menubar-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "native-select-example": { + name: "native-select-example", + title: "Native Select", + description: "", + type: "registry:example", + registryDependencies: ["field", "native-select", "example"], + files: [ + { + path: "registry/bases/radix/examples/native-select-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/native-select-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "native-select-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "navigation-menu-example": { + name: "navigation-menu-example", + title: "Navigation Menu", + description: "", + type: "registry:example", + registryDependencies: ["button", "dialog", "navigation-menu", "example"], + files: [ + { + path: "registry/bases/radix/examples/navigation-menu-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/navigation-menu-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "navigation-menu-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "pagination-example": { + name: "pagination-example", + title: "Pagination", + description: "", + type: "registry:example", + registryDependencies: ["field", "pagination", "select", "example"], + files: [ + { + path: "registry/bases/radix/examples/pagination-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/pagination-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "pagination-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "popover-example": { + name: "popover-example", + title: "Popover", + description: "", + type: "registry:example", + registryDependencies: [ + "button", + "dialog", + "field", + "input", + "popover", + "example", + ], + files: [ + { + path: "registry/bases/radix/examples/popover-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/popover-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "popover-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "progress-example": { + name: "progress-example", + title: "Progress", + description: "", + type: "registry:example", + registryDependencies: ["field", "item", "progress", "slider", "example"], + files: [ + { + path: "registry/bases/radix/examples/progress-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/progress-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "progress-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "radio-group-example": { + name: "radio-group-example", + title: "Radio Group", + description: "", + type: "registry:example", + registryDependencies: ["field", "radio-group", "example"], + files: [ + { + path: "registry/bases/radix/examples/radio-group-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/radio-group-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "radio-group-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "resizable-example": { + name: "resizable-example", + title: "Resizable", + description: "", + type: "registry:example", + registryDependencies: ["resizable", "example"], + files: [ + { + path: "registry/bases/radix/examples/resizable-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/resizable-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "resizable-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "scroll-area-example": { + name: "scroll-area-example", + title: "Scroll Area", + description: "", + type: "registry:example", + registryDependencies: ["scroll-area", "separator", "example"], + files: [ + { + path: "registry/bases/radix/examples/scroll-area-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/scroll-area-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "scroll-area-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "select-example": { + name: "select-example", + title: "Select", + description: "", + type: "registry:example", + registryDependencies: [ + "button", + "dialog", + "field", + "input", + "item", + "native-select", + "select", + "example", + ], + files: [ + { + path: "registry/bases/radix/examples/select-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/select-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "select-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "separator-example": { + name: "separator-example", + title: "Separator", + description: "", + type: "registry:example", + registryDependencies: ["separator", "example"], + files: [ + { + path: "registry/bases/radix/examples/separator-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/separator-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "separator-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "sheet-example": { + name: "sheet-example", + title: "Sheet", + description: "", + type: "registry:example", + registryDependencies: ["button", "field", "input", "sheet", "example"], + files: [ + { + path: "registry/bases/radix/examples/sheet-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/sheet-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sheet-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "sidebar-example": { + name: "sidebar-example", + title: "Sidebar", + description: "", + type: "registry:example", + registryDependencies: [ + "button", + "dropdown-menu", + "item", + "label", + "sidebar", + "example", + ], + files: [ + { + path: "registry/bases/radix/examples/sidebar-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/sidebar-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "sidebar-icon-example": { + name: "sidebar-icon-example", + title: "Sidebar (Icon)", + description: "", + type: "registry:example", + registryDependencies: [ + "avatar", + "button", + "collapsible", + "dropdown-menu", + "item", + "sidebar", + "example", + ], + files: [ + { + path: "registry/bases/radix/examples/sidebar-icon-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/sidebar-icon-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-icon-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "sidebar-inset-example": { + name: "sidebar-inset-example", + title: "Sidebar (Inset)", + description: "", + type: "registry:example", + registryDependencies: ["collapsible", "sidebar", "example"], + files: [ + { + path: "registry/bases/radix/examples/sidebar-inset-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/sidebar-inset-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-inset-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "sidebar-floating-example": { + name: "sidebar-floating-example", + title: "Sidebar (Floating)", + description: "", + type: "registry:example", + registryDependencies: [ + "button", + "card", + "dropdown-menu", + "field", + "item", + "sidebar", + "example", + ], + files: [ + { + path: "registry/bases/radix/examples/sidebar-floating-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/sidebar-floating-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-floating-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "skeleton-example": { + name: "skeleton-example", + title: "Skeleton", + description: "", + type: "registry:example", + registryDependencies: ["skeleton", "example"], + files: [ + { + path: "registry/bases/radix/examples/skeleton-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/skeleton-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "skeleton-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "slider-example": { + name: "slider-example", + title: "Slider", + description: "", + type: "registry:example", + registryDependencies: ["label", "slider", "example"], + files: [ + { + path: "registry/bases/radix/examples/slider-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/slider-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "slider-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "sonner-example": { + name: "sonner-example", + title: "Sonner", + description: "", + type: "registry:example", + registryDependencies: ["sonner", "example"], + files: [ + { + path: "registry/bases/radix/examples/sonner-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/sonner-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sonner-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "spinner-example": { + name: "spinner-example", + title: "Spinner", + description: "", + type: "registry:example", + registryDependencies: [ + "badge", + "button", + "empty", + "field", + "input-group", + "spinner", + "example", + ], + files: [ + { + path: "registry/bases/radix/examples/spinner-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/spinner-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "spinner-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "switch-example": { + name: "switch-example", + title: "Switch", + description: "", + type: "registry:example", + registryDependencies: ["field", "label", "switch", "example"], + files: [ + { + path: "registry/bases/radix/examples/switch-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/switch-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "switch-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "table-example": { + name: "table-example", + title: "Table", + description: "", + type: "registry:example", + registryDependencies: [ + "button", + "dropdown-menu", + "input", + "select", + "table", + "example", + ], + files: [ + { + path: "registry/bases/radix/examples/table-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/table-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "table-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "tabs-example": { + name: "tabs-example", + title: "Tabs", + description: "", + type: "registry:example", + registryDependencies: ["button", "dropdown-menu", "tabs", "example"], + files: [ + { + path: "registry/bases/radix/examples/tabs-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/examples/tabs-example") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "tabs-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "textarea-example": { + name: "textarea-example", + title: "Textarea", + description: "", + type: "registry:example", + registryDependencies: ["field", "textarea", "example"], + files: [ + { + path: "registry/bases/radix/examples/textarea-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/textarea-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "textarea-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "toggle-example": { + name: "toggle-example", + title: "Toggle", + description: "", + type: "registry:example", + registryDependencies: ["toggle", "example"], + files: [ + { + path: "registry/bases/radix/examples/toggle-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/toggle-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "toggle-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "toggle-group-example": { + name: "toggle-group-example", + title: "Toggle Group", + description: "", + type: "registry:example", + registryDependencies: ["input", "select", "toggle-group", "example"], + files: [ + { + path: "registry/bases/radix/examples/toggle-group-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/toggle-group-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "toggle-group-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "tooltip-example": { + name: "tooltip-example", + title: "Tooltip", + description: "", + type: "registry:example", + registryDependencies: ["button", "kbd", "tooltip", "example"], + files: [ + { + path: "registry/bases/radix/examples/tooltip-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/tooltip-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "tooltip-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + demo: { + name: "demo", + title: "Demo", + description: "", + type: "registry:example", + registryDependencies: [ + "alert-dialog", + "badge", + "button", + "button-group", + "card", + "checkbox", + "dropdown-menu", + "field", + "input-group", + "item", + "radio-group", + "slider", + "switch", + "textarea", + ], + files: [ + { + path: "registry/bases/radix/examples/demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/examples/demo") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "demo" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "component-example": { + name: "component-example", + title: "Example", + description: "", + type: "registry:example", + registryDependencies: [ + "alert-dialog", + "badge", + "button", + "card", + "combobox", + "dropdown-menu", + "field", + "input", + "select", + "textarea", + "example", + ], + files: [ + { + path: "registry/bases/radix/examples/component-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/examples/component-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "component-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + utils: { + name: "utils", + title: "undefined", + description: "", + type: "registry:lib", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/lib/utils.ts", + type: "registry:lib", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/lib/utils") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "utils" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + example: { + name: "example", + title: "Example", + description: "", + type: "registry:component", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/components/example.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/components/example") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + preview: { + name: "preview", + title: "Preview", + description: "", + type: "registry:block", + registryDependencies: [ + "alert-dialog", + "avatar", + "badge", + "button", + "button-group", + "card", + "checkbox", + "combobox", + "dropdown-menu", + "empty", + "field", + "input", + "input-group", + "item", + "label", + "popover", + "radio-group", + "select", + "separator", + "sheet", + "slider", + "spinner", + "switch", + "textarea", + "tooltip", + "example", + ], + files: [ + { + path: "registry/bases/radix/blocks/preview/index.tsx", + type: "registry:block", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/blocks/preview/index") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "preview" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "preview-02": { + name: "preview-02", + title: "Preview 02", + description: "", + type: "registry:block", + registryDependencies: [ + "accordion", + "badge", + "breadcrumb", + "button", + "calendar", + "card", + "chart", + "checkbox", + "combobox", + "dropdown-menu", + "empty", + "field", + "input", + "input-group", + "item", + "label", + "native-select", + "progress", + "radio-group", + "select", + "separator", + "sidebar", + "skeleton", + "slider", + "spinner", + "switch", + "table", + "tabs", + "textarea", + "toggle-group", + ], + files: [ + { + path: "registry/bases/radix/blocks/preview-02/index.tsx", + type: "registry:block", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/blocks/preview-02/index" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "preview-02" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "login-01": { + name: "login-01", + title: "Login 01", + description: "A simple login form.", + type: "registry:block", + registryDependencies: ["button", "card", "input", "label", "field"], + files: [ + { + path: "registry/bases/radix/blocks/login-01/page.tsx", + type: "registry:page", + target: "app/login/page.tsx", + }, + { + path: "registry/bases/radix/blocks/login-01/components/login-form.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/blocks/login-01/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "login-01" + return { default: mod.default || mod[exportName] } + }), + categories: ["authentication", "login"], + meta: undefined, + }, + "login-02": { + name: "login-02", + title: "Login 02", + description: "A two column login page with a cover image.", + type: "registry:block", + registryDependencies: ["button", "input", "label", "field"], + files: [ + { + path: "registry/bases/radix/blocks/login-02/page.tsx", + type: "registry:page", + target: "app/login/page.tsx", + }, + { + path: "registry/bases/radix/blocks/login-02/components/login-form.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/blocks/login-02/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "login-02" + return { default: mod.default || mod[exportName] } + }), + categories: ["authentication", "login"], + meta: undefined, + }, + "login-03": { + name: "login-03", + title: "Login 03", + description: "A login page with a muted background color.", + type: "registry:block", + registryDependencies: ["button", "card", "input", "label", "field"], + files: [ + { + path: "registry/bases/radix/blocks/login-03/page.tsx", + type: "registry:page", + target: "app/login/page.tsx", + }, + { + path: "registry/bases/radix/blocks/login-03/components/login-form.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/blocks/login-03/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "login-03" + return { default: mod.default || mod[exportName] } + }), + categories: ["authentication", "login"], + meta: undefined, + }, + "login-04": { + name: "login-04", + title: "Login 04", + description: "A login page with form and image.", + type: "registry:block", + registryDependencies: ["button", "card", "input", "label", "field"], + files: [ + { + path: "registry/bases/radix/blocks/login-04/page.tsx", + type: "registry:page", + target: "app/login/page.tsx", + }, + { + path: "registry/bases/radix/blocks/login-04/components/login-form.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/blocks/login-04/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "login-04" + return { default: mod.default || mod[exportName] } + }), + categories: ["authentication", "login"], + meta: undefined, + }, + "login-05": { + name: "login-05", + title: "Login 05", + description: "A simple email-only login page.", + type: "registry:block", + registryDependencies: ["button", "input", "label", "field"], + files: [ + { + path: "registry/bases/radix/blocks/login-05/page.tsx", + type: "registry:page", + target: "app/login/page.tsx", + }, + { + path: "registry/bases/radix/blocks/login-05/components/login-form.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/blocks/login-05/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "login-05" + return { default: mod.default || mod[exportName] } + }), + categories: ["authentication", "login"], + meta: undefined, + }, + "signup-01": { + name: "signup-01", + title: "Signup 01", + description: "A simple signup form.", + type: "registry:block", + registryDependencies: ["button", "card", "input", "label"], + files: [ + { + path: "registry/bases/radix/blocks/signup-01/page.tsx", + type: "registry:page", + target: "app/signup/page.tsx", + }, + { + path: "registry/bases/radix/blocks/signup-01/components/signup-form.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/blocks/signup-01/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "signup-01" + return { default: mod.default || mod[exportName] } + }), + categories: ["authentication", "signup"], + meta: undefined, + }, + "signup-02": { + name: "signup-02", + title: "Signup 02", + description: "A two column signup page with a cover image.", + type: "registry:block", + registryDependencies: ["button", "input", "label", "field"], + files: [ + { + path: "registry/bases/radix/blocks/signup-02/page.tsx", + type: "registry:page", + target: "app/signup/page.tsx", + }, + { + path: "registry/bases/radix/blocks/signup-02/components/signup-form.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/blocks/signup-02/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "signup-02" + return { default: mod.default || mod[exportName] } + }), + categories: ["authentication", "signup"], + meta: undefined, + }, + "signup-03": { + name: "signup-03", + title: "Signup 03", + description: "A signup page with a muted background color.", + type: "registry:block", + registryDependencies: ["button", "card", "input", "label", "field"], + files: [ + { + path: "registry/bases/radix/blocks/signup-03/page.tsx", + type: "registry:page", + target: "app/signup/page.tsx", + }, + { + path: "registry/bases/radix/blocks/signup-03/components/signup-form.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/blocks/signup-03/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "signup-03" + return { default: mod.default || mod[exportName] } + }), + categories: ["authentication", "signup"], + meta: undefined, + }, + "signup-04": { + name: "signup-04", + title: "Signup 04", + description: "A signup page with form and image.", + type: "registry:block", + registryDependencies: ["button", "card", "input", "label", "field"], + files: [ + { + path: "registry/bases/radix/blocks/signup-04/page.tsx", + type: "registry:page", + target: "app/signup/page.tsx", + }, + { + path: "registry/bases/radix/blocks/signup-04/components/signup-form.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/blocks/signup-04/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "signup-04" + return { default: mod.default || mod[exportName] } + }), + categories: ["authentication", "signup"], + meta: undefined, + }, + "signup-05": { + name: "signup-05", + title: "Signup 05", + description: "A simple signup form with social providers.", + type: "registry:block", + registryDependencies: ["button", "input", "label"], + files: [ + { + path: "registry/bases/radix/blocks/signup-05/page.tsx", + type: "registry:page", + target: "app/signup/page.tsx", + }, + { + path: "registry/bases/radix/blocks/signup-05/components/signup-form.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/blocks/signup-05/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "signup-05" + return { default: mod.default || mod[exportName] } + }), + categories: ["authentication", "signup"], + meta: undefined, + }, + "dashboard-01": { + name: "dashboard-01", + title: "Dashboard 01", + description: "A dashboard with sidebar, charts and data table.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "label", + "chart", + "card", + "select", + "tabs", + "table", + "toggle-group", + "badge", + "button", + "checkbox", + "dropdown-menu", + "drawer", + "input", + "avatar", + "sheet", + "sonner", + ], + files: [ + { + path: "registry/bases/radix/blocks/dashboard-01/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "registry/bases/radix/blocks/dashboard-01/data.json", + type: "registry:file", + target: "app/dashboard/data.json", + }, + { + path: "registry/bases/radix/blocks/dashboard-01/components/app-sidebar.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/dashboard-01/components/chart-area-interactive.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/dashboard-01/components/data-table.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/dashboard-01/components/nav-documents.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/dashboard-01/components/nav-main.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/dashboard-01/components/nav-secondary.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/dashboard-01/components/nav-user.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/dashboard-01/components/section-cards.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/dashboard-01/components/site-header.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/blocks/dashboard-01/page" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "dashboard-01" + return { default: mod.default || mod[exportName] } + }), + categories: ["dashboard"], + meta: { iframeHeight: "1000px" }, + }, + "sidebar-01": { + name: "sidebar-01", + title: "Sidebar 01", + description: "A simple sidebar with navigation grouped by section.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "label", + "dropdown-menu", + ], + files: [ + { + path: "registry/bases/radix/blocks/sidebar-01/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "registry/bases/radix/blocks/sidebar-01/components/app-sidebar.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-01/components/search-form.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-01/components/version-switcher.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/blocks/sidebar-01/page" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-01" + return { default: mod.default || mod[exportName] } + }), + categories: ["sidebar", "dashboard"], + meta: undefined, + }, + "sidebar-02": { + name: "sidebar-02", + title: "Sidebar 02", + description: "A sidebar with collapsible sections.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "label", + "dropdown-menu", + ], + files: [ + { + path: "registry/bases/radix/blocks/sidebar-02/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "registry/bases/radix/blocks/sidebar-02/components/app-sidebar.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-02/components/search-form.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-02/components/version-switcher.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/blocks/sidebar-02/page" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-02" + return { default: mod.default || mod[exportName] } + }), + categories: ["sidebar", "dashboard"], + meta: undefined, + }, + "sidebar-03": { + name: "sidebar-03", + title: "Sidebar 03", + description: "A sidebar with submenus.", + type: "registry:block", + registryDependencies: ["sidebar", "breadcrumb"], + files: [ + { + path: "registry/bases/radix/blocks/sidebar-03/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "registry/bases/radix/blocks/sidebar-03/components/app-sidebar.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/blocks/sidebar-03/page" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-03" + return { default: mod.default || mod[exportName] } + }), + categories: ["sidebar", "dashboard"], + meta: undefined, + }, + "sidebar-04": { + name: "sidebar-04", + title: "Sidebar 04", + description: "A floating sidebar with submenus.", + type: "registry:block", + registryDependencies: ["sidebar", "breadcrumb", "separator"], + files: [ + { + path: "registry/bases/radix/blocks/sidebar-04/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "registry/bases/radix/blocks/sidebar-04/components/app-sidebar.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/blocks/sidebar-04/page" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-04" + return { default: mod.default || mod[exportName] } + }), + categories: ["sidebar", "dashboard"], + meta: undefined, + }, + "sidebar-05": { + name: "sidebar-05", + title: "Sidebar 05", + description: "A sidebar with collapsible submenus.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "label", + "collapsible", + ], + files: [ + { + path: "registry/bases/radix/blocks/sidebar-05/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "registry/bases/radix/blocks/sidebar-05/components/app-sidebar.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-05/components/search-form.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/blocks/sidebar-05/page" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-05" + return { default: mod.default || mod[exportName] } + }), + categories: ["sidebar", "dashboard"], + meta: undefined, + }, + "sidebar-06": { + name: "sidebar-06", + title: "Sidebar 06", + description: "A sidebar with submenus as dropdowns.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "card", + "dropdown-menu", + ], + files: [ + { + path: "registry/bases/radix/blocks/sidebar-06/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "registry/bases/radix/blocks/sidebar-06/components/app-sidebar.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-06/components/nav-main.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-06/components/sidebar-opt-in-form.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/blocks/sidebar-06/page" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-06" + return { default: mod.default || mod[exportName] } + }), + categories: ["sidebar", "dashboard"], + meta: undefined, + }, + "sidebar-07": { + name: "sidebar-07", + title: "Sidebar 07", + description: "A sidebar that collapses to icons.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "collapsible", + "dropdown-menu", + "avatar", + ], + files: [ + { + path: "registry/bases/radix/blocks/sidebar-07/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "registry/bases/radix/blocks/sidebar-07/components/app-sidebar.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-07/components/nav-main.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-07/components/nav-projects.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-07/components/nav-user.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-07/components/team-switcher.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/blocks/sidebar-07/page" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-07" + return { default: mod.default || mod[exportName] } + }), + categories: ["sidebar", "dashboard"], + meta: undefined, + }, + "sidebar-08": { + name: "sidebar-08", + title: "Sidebar 08", + description: "An inset sidebar with secondary navigation.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "collapsible", + "dropdown-menu", + "avatar", + ], + files: [ + { + path: "registry/bases/radix/blocks/sidebar-08/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "registry/bases/radix/blocks/sidebar-08/components/app-sidebar.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-08/components/nav-main.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-08/components/nav-projects.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-08/components/nav-secondary.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-08/components/nav-user.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/blocks/sidebar-08/page" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-08" + return { default: mod.default || mod[exportName] } + }), + categories: ["sidebar", "dashboard"], + meta: undefined, + }, + "sidebar-09": { + name: "sidebar-09", + title: "Sidebar 09", + description: "Collapsible nested sidebars.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "collapsible", + "dropdown-menu", + "avatar", + "switch", + "label", + ], + files: [ + { + path: "registry/bases/radix/blocks/sidebar-09/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "registry/bases/radix/blocks/sidebar-09/components/app-sidebar.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-09/components/nav-user.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/blocks/sidebar-09/page" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-09" + return { default: mod.default || mod[exportName] } + }), + categories: ["sidebar", "dashboard"], + meta: undefined, + }, + "sidebar-10": { + name: "sidebar-10", + title: "Sidebar 10", + description: "A sidebar in a popover.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "popover", + "collapsible", + "dropdown-menu", + ], + files: [ + { + path: "registry/bases/radix/blocks/sidebar-10/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "registry/bases/radix/blocks/sidebar-10/components/app-sidebar.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-10/components/nav-actions.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-10/components/nav-favorites.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-10/components/nav-main.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-10/components/nav-secondary.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-10/components/nav-workspaces.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-10/components/team-switcher.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/blocks/sidebar-10/page" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-10" + return { default: mod.default || mod[exportName] } + }), + categories: ["sidebar", "dashboard"], + meta: undefined, + }, + "sidebar-11": { + name: "sidebar-11", + title: "Sidebar 11", + description: "A sidebar with a collapsible file tree.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "collapsible", + ], + files: [ + { + path: "registry/bases/radix/blocks/sidebar-11/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "registry/bases/radix/blocks/sidebar-11/components/app-sidebar.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/blocks/sidebar-11/page" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-11" + return { default: mod.default || mod[exportName] } + }), + categories: ["sidebar", "dashboard"], + meta: undefined, + }, + "sidebar-12": { + name: "sidebar-12", + title: "Sidebar 12", + description: "A sidebar with a calendar.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "collapsible", + "calendar", + "dropdown-menu", + "avatar", + ], + files: [ + { + path: "registry/bases/radix/blocks/sidebar-12/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "registry/bases/radix/blocks/sidebar-12/components/app-sidebar.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-12/components/calendars.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-12/components/date-picker.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-12/components/nav-user.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/blocks/sidebar-12/page" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-12" + return { default: mod.default || mod[exportName] } + }), + categories: ["sidebar", "dashboard"], + meta: undefined, + }, + "sidebar-13": { + name: "sidebar-13", + title: "Sidebar 13", + description: "A sidebar in a dialog.", + type: "registry:block", + registryDependencies: ["sidebar", "breadcrumb", "button", "dialog"], + files: [ + { + path: "registry/bases/radix/blocks/sidebar-13/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "registry/bases/radix/blocks/sidebar-13/components/settings-dialog.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/blocks/sidebar-13/page" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-13" + return { default: mod.default || mod[exportName] } + }), + categories: ["sidebar", "dashboard"], + meta: undefined, + }, + "sidebar-14": { + name: "sidebar-14", + title: "Sidebar 14", + description: "A sidebar on the right.", + type: "registry:block", + registryDependencies: ["sidebar", "breadcrumb"], + files: [ + { + path: "registry/bases/radix/blocks/sidebar-14/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "registry/bases/radix/blocks/sidebar-14/components/app-sidebar.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/blocks/sidebar-14/page" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-14" + return { default: mod.default || mod[exportName] } + }), + categories: ["sidebar", "dashboard"], + meta: undefined, + }, + "sidebar-15": { + name: "sidebar-15", + title: "Sidebar 15", + description: "A left and right sidebar.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "popover", + "collapsible", + "dropdown-menu", + "calendar", + "avatar", + ], + files: [ + { + path: "registry/bases/radix/blocks/sidebar-15/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "registry/bases/radix/blocks/sidebar-15/components/calendars.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-15/components/date-picker.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-15/components/nav-favorites.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-15/components/nav-main.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-15/components/nav-secondary.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-15/components/nav-user.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-15/components/nav-workspaces.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-15/components/sidebar-left.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-15/components/sidebar-right.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-15/components/team-switcher.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/blocks/sidebar-15/page" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-15" + return { default: mod.default || mod[exportName] } + }), + categories: ["sidebar", "dashboard"], + meta: undefined, + }, + "sidebar-16": { + name: "sidebar-16", + title: "Sidebar 16", + description: "A sidebar with a sticky site header.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "collapsible", + "dropdown-menu", + "avatar", + "button", + "label", + ], + files: [ + { + path: "registry/bases/radix/blocks/sidebar-16/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "registry/bases/radix/blocks/sidebar-16/components/app-sidebar.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-16/components/nav-main.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-16/components/nav-projects.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-16/components/nav-secondary.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-16/components/nav-user.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-16/components/search-form.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/radix/blocks/sidebar-16/components/site-header.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/radix/blocks/sidebar-16/page" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-16" + return { default: mod.default || mod[exportName] } + }), + categories: ["sidebar", "dashboard"], + meta: undefined, + }, + "use-mobile": { + name: "use-mobile", + title: "undefined", + description: "", + type: "registry:hook", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/radix/hooks/use-mobile.ts", + type: "registry:hook", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/radix/hooks/use-mobile") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "use-mobile" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + }, + base: { + accordion: { + name: "accordion", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/accordion.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/accordion") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "accordion" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/accordion", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/accordion-example.tsx", + api: "https://base-ui.com/react/components/accordion.md", + }, + }, + }, + alert: { + name: "alert", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/alert.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/alert") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "alert" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/alert", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/alert-example.tsx", + }, + }, + }, + "alert-dialog": { + name: "alert-dialog", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: ["button"], + files: [ + { + path: "registry/bases/base/ui/alert-dialog.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/alert-dialog") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "alert-dialog" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/alert-dialog", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/alert-dialog-example.tsx", + api: "https://base-ui.com/react/components/alert-dialog.md", + }, + }, + }, + "aspect-ratio": { + name: "aspect-ratio", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/aspect-ratio.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/aspect-ratio") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "aspect-ratio" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/aspect-ratio", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/aspect-ratio-example.tsx", + }, + }, + }, + avatar: { + name: "avatar", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/avatar.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/avatar") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "avatar" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/avatar", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/avatar-example.tsx", + api: "https://base-ui.com/react/components/avatar.md", + }, + }, + }, + badge: { + name: "badge", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/badge.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/badge") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "badge" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/badge", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/badge-example.tsx", + }, + }, + }, + breadcrumb: { + name: "breadcrumb", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/breadcrumb.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/breadcrumb") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "breadcrumb" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/breadcrumb", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/breadcrumb-example.tsx", + }, + }, + }, + button: { + name: "button", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/button.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/button") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "button" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/button", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/button-example.tsx", + }, + }, + }, + "button-group": { + name: "button-group", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: ["separator"], + files: [ + { + path: "registry/bases/base/ui/button-group.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/button-group") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "button-group" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/button-group", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/button-group-example.tsx", + }, + }, + }, + calendar: { + name: "calendar", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: ["button"], + files: [ + { + path: "registry/bases/base/ui/calendar.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/calendar") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "calendar" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/calendar", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/calendar-example.tsx", + api: "https://react-day-picker.js.org", + }, + }, + }, + card: { + name: "card", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/card.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/card") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "card" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/card", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/card-example.tsx", + }, + }, + }, + carousel: { + name: "carousel", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: ["button"], + files: [ + { + path: "registry/bases/base/ui/carousel.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/carousel") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "carousel" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/carousel", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/carousel-example.tsx", + api: "https://www.embla-carousel.com/get-started/react", + }, + }, + }, + chart: { + name: "chart", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: ["card"], + files: [ + { + path: "registry/bases/base/ui/chart.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/chart") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "chart" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/chart", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/chart-example.tsx", + }, + }, + }, + checkbox: { + name: "checkbox", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/checkbox.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/checkbox") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "checkbox" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/checkbox", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/checkbox-example.tsx", + api: "https://base-ui.com/react/components/checkbox.md", + }, + }, + }, + collapsible: { + name: "collapsible", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/collapsible.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/collapsible") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "collapsible" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/collapsible", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/collapsible-example.tsx", + api: "https://base-ui.com/react/components/collapsible.md", + }, + }, + }, + combobox: { + name: "combobox", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: ["button", "input-group"], + files: [ + { + path: "registry/bases/base/ui/combobox.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/combobox") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "combobox" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/combobox", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/combobox-example.tsx", + api: "https://base-ui.com/react/components/combobox.md", + }, + }, + }, + command: { + name: "command", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: ["dialog", "input-group"], + files: [ + { + path: "registry/bases/base/ui/command.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/command") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "command" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/command", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/command-example.tsx", + api: "https://github.com/dip/cmdk", + }, + }, + }, + "context-menu": { + name: "context-menu", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/context-menu.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/context-menu") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "context-menu" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/context-menu", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/context-menu-example.tsx", + api: "https://base-ui.com/react/components/context-menu.md", + }, + }, + }, + dialog: { + name: "dialog", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: ["button"], + files: [ + { + path: "registry/bases/base/ui/dialog.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/dialog") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "dialog" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/dialog", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/dialog-example.tsx", + api: "https://base-ui.com/react/components/dialog.md", + }, + }, + }, + drawer: { + name: "drawer", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/drawer.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/drawer") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "drawer" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/drawer", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/drawer-example.tsx", + api: "https://vaul.emilkowal.ski/getting-started", + }, + }, + }, + "dropdown-menu": { + name: "dropdown-menu", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/dropdown-menu.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/dropdown-menu") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "dropdown-menu" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/dropdown-menu", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/dropdown-menu-example.tsx", + api: "https://base-ui.com/react/components/menu.md", + }, + }, + }, + empty: { + name: "empty", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/empty.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/empty") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "empty" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/empty", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/empty-example.tsx", + }, + }, + }, + field: { + name: "field", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: ["label", "separator"], + files: [ + { + path: "registry/bases/base/ui/field.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/field") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "field" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/field", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/field-example.tsx", + }, + }, + }, + "hover-card": { + name: "hover-card", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/hover-card.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/hover-card") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "hover-card" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/hover-card", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/hover-card-example.tsx", + api: "https://base-ui.com/react/components/hover-card.md", + }, + }, + }, + input: { + name: "input", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/input.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/input") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "input" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/input", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/input-example.tsx", + }, + }, + }, + "input-group": { + name: "input-group", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: ["button", "input", "textarea"], + files: [ + { + path: "registry/bases/base/ui/input-group.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/input-group") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "input-group" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/input-group", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/input-group-example.tsx", + }, + }, + }, + "input-otp": { + name: "input-otp", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/input-otp.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/input-otp") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "input-otp" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/input-otp", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/input-otp-example.tsx", + api: "https://input-otp.rodz.dev", + }, + }, + }, + item: { + name: "item", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: ["separator"], + files: [ + { + path: "registry/bases/base/ui/item.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/item") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "item" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/item", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/item-example.tsx", + }, + }, + }, + label: { + name: "label", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/label.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/label") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "label" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/label", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/label-example.tsx", + api: "https://base-ui.com/react/components/label.md", + }, + }, + }, + menubar: { + name: "menubar", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: ["dropdown-menu"], + files: [ + { + path: "registry/bases/base/ui/menubar.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/menubar") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "menubar" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/menubar", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/menubar-example.tsx", + api: "https://base-ui.com/react/components/menubar.md", + }, + }, + }, + "navigation-menu": { + name: "navigation-menu", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/navigation-menu.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/navigation-menu") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "navigation-menu" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/navigation-menu", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/navigation-menu-example.tsx", + api: "https://base-ui.com/react/components/navigation-menu.md", + }, + }, + }, + pagination: { + name: "pagination", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: ["button"], + files: [ + { + path: "registry/bases/base/ui/pagination.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/pagination") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "pagination" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/pagination", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/pagination-example.tsx", + }, + }, + }, + popover: { + name: "popover", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/popover.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/popover") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "popover" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/popover", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/popover-example.tsx", + api: "https://base-ui.com/react/components/popover.md", + }, + }, + }, + progress: { + name: "progress", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/progress.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/progress") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "progress" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/progress", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/progress-example.tsx", + api: "https://base-ui.com/react/components/progress.md", + }, + }, + }, + "radio-group": { + name: "radio-group", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/radio-group.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/radio-group") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "radio-group" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/radio-group", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/radio-group-example.tsx", + api: "https://base-ui.com/react/components/radio-group.md", + }, + }, + }, + resizable: { + name: "resizable", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/resizable.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/resizable") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "resizable" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/resizable", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/resizable-example.tsx", + api: "https://github.com/bvaughn/react-resizable-panels", + }, + }, + }, + "scroll-area": { + name: "scroll-area", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/scroll-area.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/scroll-area") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "scroll-area" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/scroll-area", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/scroll-area-example.tsx", + api: "https://base-ui.com/react/components/scroll-area.md", + }, + }, + }, + select: { + name: "select", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/select.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/select") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "select" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/select", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/select-example.tsx", + api: "https://base-ui.com/react/components/select.md", + }, + }, + }, + separator: { + name: "separator", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/separator.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/separator") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "separator" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/separator", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/separator-example.tsx", + api: "https://base-ui.com/react/components/separator.md", + }, + }, + }, + sheet: { + name: "sheet", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: ["button"], + files: [ + { + path: "registry/bases/base/ui/sheet.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/sheet") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sheet" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/sheet", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/sheet-example.tsx", + api: "https://base-ui.com/react/components/dialog.md", + }, + }, + }, + sidebar: { + name: "sidebar", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: [ + "button", + "input", + "separator", + "sheet", + "skeleton", + "tooltip", + "use-mobile", + ], + files: [ + { + path: "registry/bases/base/ui/sidebar.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/sidebar") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/sidebar", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/sidebar-example.tsx", + }, + }, + }, + skeleton: { + name: "skeleton", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/skeleton.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/skeleton") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "skeleton" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/skeleton", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/skeleton-example.tsx", + }, + }, + }, + slider: { + name: "slider", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/slider.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/slider") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "slider" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/slider", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/slider-example.tsx", + api: "https://base-ui.com/react/components/slider.md", + }, + }, + }, + sonner: { + name: "sonner", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/sonner.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/sonner") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sonner" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/sonner", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/sonner-example.tsx", + api: "https://sonner.emilkowal.ski", + }, + }, + }, + spinner: { + name: "spinner", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/spinner.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/spinner") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "spinner" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/spinner", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/spinner-example.tsx", + }, + }, + }, + switch: { + name: "switch", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/switch.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/switch") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "switch" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/switch", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/switch-example.tsx", + api: "https://base-ui.com/react/components/switch.md", + }, + }, + }, + table: { + name: "table", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/table.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/table") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "table" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/table", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/table-example.tsx", + }, + }, + }, + tabs: { + name: "tabs", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/tabs.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/tabs") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "tabs" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/tabs", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/tabs-example.tsx", + api: "https://base-ui.com/react/components/tabs.md", + }, + }, + }, + textarea: { + name: "textarea", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/textarea.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/textarea") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "textarea" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/textarea", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/textarea-example.tsx", + }, + }, + }, + toggle: { + name: "toggle", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/toggle.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/toggle") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "toggle" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/toggle", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/toggle-example.tsx", + api: "https://base-ui.com/react/components/toggle.md", + }, + }, + }, + "toggle-group": { + name: "toggle-group", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: ["toggle"], + files: [ + { + path: "registry/bases/base/ui/toggle-group.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/toggle-group") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "toggle-group" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/toggle-group", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/toggle-group-example.tsx", + api: "https://base-ui.com/react/components/toggle-group.md", + }, + }, + }, + tooltip: { + name: "tooltip", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/tooltip.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/tooltip") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "tooltip" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/tooltip", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/tooltip-example.tsx", + api: "https://base-ui.com/react/components/tooltip.md", + }, + }, + }, + kbd: { + name: "kbd", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/kbd.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/kbd") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "kbd" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/kbd", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/kbd-example.tsx", + }, + }, + }, + "native-select": { + name: "native-select", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/native-select.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/native-select") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "native-select" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/native-select", + examples: + "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/native-select-example.tsx", + }, + }, + }, + direction: { + name: "direction", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/ui/direction.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/ui/direction") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "direction" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/base/direction", + api: "https://base-ui.com/react/utils/direction-provider.md", + }, + }, + }, + "accordion-example": { + name: "accordion-example", + title: "Accordion", + description: "", + type: "registry:example", + registryDependencies: ["accordion", "button", "card", "example"], + files: [ + { + path: "registry/bases/base/examples/accordion-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/accordion-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "accordion-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "alert-example": { + name: "alert-example", + title: "Alert", + description: "", + type: "registry:example", + registryDependencies: ["alert", "badge", "example"], + files: [ + { + path: "registry/bases/base/examples/alert-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/examples/alert-example") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "alert-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "alert-dialog-example": { + name: "alert-dialog-example", + title: "Alert Dialog", + description: "", + type: "registry:example", + registryDependencies: ["alert-dialog", "button", "dialog", "example"], + files: [ + { + path: "registry/bases/base/examples/alert-dialog-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/alert-dialog-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "alert-dialog-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "aspect-ratio-example": { + name: "aspect-ratio-example", + title: "Aspect Ratio", + description: "", + type: "registry:example", + registryDependencies: ["aspect-ratio", "example"], + files: [ + { + path: "registry/bases/base/examples/aspect-ratio-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/aspect-ratio-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "aspect-ratio-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "avatar-example": { + name: "avatar-example", + title: "Avatar", + description: "", + type: "registry:example", + registryDependencies: ["avatar", "button", "empty", "example"], + files: [ + { + path: "registry/bases/base/examples/avatar-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/avatar-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "avatar-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "badge-example": { + name: "badge-example", + title: "Badge", + description: "", + type: "registry:example", + registryDependencies: ["badge", "spinner", "example"], + files: [ + { + path: "registry/bases/base/examples/badge-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/examples/badge-example") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "badge-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "breadcrumb-example": { + name: "breadcrumb-example", + title: "Breadcrumb", + description: "", + type: "registry:example", + registryDependencies: ["breadcrumb", "dropdown-menu", "example"], + files: [ + { + path: "registry/bases/base/examples/breadcrumb-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/breadcrumb-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "breadcrumb-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "button-example": { + name: "button-example", + title: "Button", + description: "", + type: "registry:example", + registryDependencies: ["button", "example"], + files: [ + { + path: "registry/bases/base/examples/button-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/button-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "button-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "button-group-example": { + name: "button-group-example", + title: "Button Group", + description: "", + type: "registry:example", + registryDependencies: [ + "button", + "button-group", + "dropdown-menu", + "field", + "input", + "input-group", + "label", + "popover", + "select", + "tooltip", + "example", + ], + files: [ + { + path: "registry/bases/base/examples/button-group-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/button-group-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "button-group-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "calendar-example": { + name: "calendar-example", + title: "Calendar", + description: "", + type: "registry:example", + registryDependencies: [ + "button", + "calendar", + "card", + "field", + "input", + "label", + "popover", + "example", + ], + files: [ + { + path: "registry/bases/base/examples/calendar-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/calendar-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "calendar-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "card-example": { + name: "card-example", + title: "Card", + description: "", + type: "registry:example", + registryDependencies: [ + "avatar", + "button", + "card", + "field", + "input", + "example", + ], + files: [ + { + path: "registry/bases/base/examples/card-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/examples/card-example") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "card-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "carousel-example": { + name: "carousel-example", + title: "Carousel", + description: "", + type: "registry:example", + registryDependencies: ["card", "carousel", "example"], + files: [ + { + path: "registry/bases/base/examples/carousel-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/carousel-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "carousel-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "chart-example": { + name: "chart-example", + title: "Chart", + description: "", + type: "registry:example", + registryDependencies: ["chart", "card", "example"], + files: [ + { + path: "registry/bases/base/examples/chart-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/examples/chart-example") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "chart-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "checkbox-example": { + name: "checkbox-example", + title: "Checkbox", + description: "", + type: "registry:example", + registryDependencies: ["checkbox", "field", "table", "example"], + files: [ + { + path: "registry/bases/base/examples/checkbox-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/checkbox-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "checkbox-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "collapsible-example": { + name: "collapsible-example", + title: "Collapsible", + description: "", + type: "registry:example", + registryDependencies: [ + "button", + "card", + "collapsible", + "field", + "input", + "tabs", + "example", + ], + files: [ + { + path: "registry/bases/base/examples/collapsible-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/collapsible-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "collapsible-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "combobox-example": { + name: "combobox-example", + title: "Combobox", + description: "", + type: "registry:example", + registryDependencies: [ + "button", + "card", + "combobox", + "dialog", + "field", + "input", + "input-group", + "item", + "select", + "example", + ], + files: [ + { + path: "registry/bases/base/examples/combobox-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/combobox-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "combobox-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "command-example": { + name: "command-example", + title: "Command", + description: "", + type: "registry:example", + registryDependencies: ["button", "command", "example"], + files: [ + { + path: "registry/bases/base/examples/command-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/command-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "command-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "context-menu-example": { + name: "context-menu-example", + title: "Context Menu", + description: "", + type: "registry:example", + registryDependencies: ["button", "context-menu", "dialog", "example"], + files: [ + { + path: "registry/bases/base/examples/context-menu-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/context-menu-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "context-menu-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "dialog-example": { + name: "dialog-example", + title: "Dialog", + description: "", + type: "registry:example", + registryDependencies: [ + "button", + "checkbox", + "dialog", + "field", + "input", + "input-group", + "kbd", + "native-select", + "select", + "switch", + "tabs", + "textarea", + "tooltip", + "example", + ], + files: [ + { + path: "registry/bases/base/examples/dialog-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/dialog-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "dialog-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "drawer-example": { + name: "drawer-example", + title: "Drawer", + description: "", + type: "registry:example", + registryDependencies: ["drawer", "example"], + files: [ + { + path: "registry/bases/base/examples/drawer-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/drawer-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "drawer-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "dropdown-menu-example": { + name: "dropdown-menu-example", + title: "Dropdown Menu", + description: "", + type: "registry:example", + registryDependencies: [ + "avatar", + "button", + "dialog", + "dropdown-menu", + "example", + ], + files: [ + { + path: "registry/bases/base/examples/dropdown-menu-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/dropdown-menu-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "dropdown-menu-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "empty-example": { + name: "empty-example", + title: "Empty", + description: "", + type: "registry:example", + registryDependencies: [ + "button", + "empty", + "input-group", + "kbd", + "example", + ], + files: [ + { + path: "registry/bases/base/examples/empty-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/examples/empty-example") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "empty-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "field-example": { + name: "field-example", + title: "Field", + description: "", + type: "registry:example", + registryDependencies: [ + "badge", + "checkbox", + "field", + "input", + "input-otp", + "native-select", + "radio-group", + "select", + "slider", + "switch", + "textarea", + "example", + ], + files: [ + { + path: "registry/bases/base/examples/field-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/examples/field-example") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "field-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "hover-card-example": { + name: "hover-card-example", + title: "Hover Card", + description: "", + type: "registry:example", + registryDependencies: ["button", "dialog", "hover-card", "example"], + files: [ + { + path: "registry/bases/base/examples/hover-card-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/hover-card-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "hover-card-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "input-example": { + name: "input-example", + title: "Input", + description: "", + type: "registry:example", + registryDependencies: [ + "button", + "field", + "input", + "native-select", + "select", + "example", + ], + files: [ + { + path: "registry/bases/base/examples/input-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/examples/input-example") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "input-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "input-group-example": { + name: "input-group-example", + title: "Input Group", + description: "", + type: "registry:example", + registryDependencies: [ + "button", + "button-group", + "card", + "dropdown-menu", + "field", + "input", + "input-group", + "kbd", + "popover", + "spinner", + "textarea", + "tooltip", + "example", + ], + files: [ + { + path: "registry/bases/base/examples/input-group-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/input-group-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "input-group-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "input-otp-example": { + name: "input-otp-example", + title: "Input OTP", + description: "", + type: "registry:example", + registryDependencies: ["button", "card", "field", "input-otp", "example"], + files: [ + { + path: "registry/bases/base/examples/input-otp-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/input-otp-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "input-otp-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "item-example": { + name: "item-example", + title: "Item", + description: "", + type: "registry:example", + registryDependencies: ["button", "item", "example"], + files: [ + { + path: "registry/bases/base/examples/item-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/examples/item-example") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "item-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "kbd-example": { + name: "kbd-example", + title: "Kbd", + description: "", + type: "registry:example", + registryDependencies: [ + "button", + "input-group", + "kbd", + "tooltip", + "example", + ], + files: [ + { + path: "registry/bases/base/examples/kbd-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/examples/kbd-example") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "kbd-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "label-example": { + name: "label-example", + title: "Label", + description: "", + type: "registry:example", + registryDependencies: [ + "checkbox", + "field", + "input", + "label", + "textarea", + "example", + ], + files: [ + { + path: "registry/bases/base/examples/label-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/examples/label-example") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "label-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "menubar-example": { + name: "menubar-example", + title: "Menubar", + description: "", + type: "registry:example", + registryDependencies: ["button", "dialog", "menubar", "example"], + files: [ + { + path: "registry/bases/base/examples/menubar-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/menubar-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "menubar-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "native-select-example": { + name: "native-select-example", + title: "Native Select", + description: "", + type: "registry:example", + registryDependencies: ["field", "native-select", "example"], + files: [ + { + path: "registry/bases/base/examples/native-select-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/native-select-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "native-select-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "navigation-menu-example": { + name: "navigation-menu-example", + title: "Navigation Menu", + description: "", + type: "registry:example", + registryDependencies: ["button", "dialog", "navigation-menu", "example"], + files: [ + { + path: "registry/bases/base/examples/navigation-menu-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/navigation-menu-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "navigation-menu-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "pagination-example": { + name: "pagination-example", + title: "Pagination", + description: "", + type: "registry:example", + registryDependencies: ["field", "pagination", "select", "example"], + files: [ + { + path: "registry/bases/base/examples/pagination-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/pagination-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "pagination-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "popover-example": { + name: "popover-example", + title: "Popover", + description: "", + type: "registry:example", + registryDependencies: [ + "button", + "dialog", + "field", + "input", + "popover", + "example", + ], + files: [ + { + path: "registry/bases/base/examples/popover-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/popover-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "popover-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "progress-example": { + name: "progress-example", + title: "Progress", + description: "", + type: "registry:example", + registryDependencies: ["field", "item", "progress", "slider", "example"], + files: [ + { + path: "registry/bases/base/examples/progress-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/progress-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "progress-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "radio-group-example": { + name: "radio-group-example", + title: "Radio Group", + description: "", + type: "registry:example", + registryDependencies: ["field", "radio-group", "example"], + files: [ + { + path: "registry/bases/base/examples/radio-group-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/radio-group-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "radio-group-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "resizable-example": { + name: "resizable-example", + title: "Resizable", + description: "", + type: "registry:example", + registryDependencies: ["resizable", "example"], + files: [ + { + path: "registry/bases/base/examples/resizable-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/resizable-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "resizable-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "scroll-area-example": { + name: "scroll-area-example", + title: "Scroll Area", + description: "", + type: "registry:example", + registryDependencies: ["scroll-area", "separator", "example"], + files: [ + { + path: "registry/bases/base/examples/scroll-area-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/scroll-area-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "scroll-area-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "select-example": { + name: "select-example", + title: "Select", + description: "", + type: "registry:example", + registryDependencies: [ + "button", + "dialog", + "field", + "input", + "item", + "native-select", + "select", + "example", + ], + files: [ + { + path: "registry/bases/base/examples/select-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/select-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "select-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "separator-example": { + name: "separator-example", + title: "Separator", + description: "", + type: "registry:example", + registryDependencies: ["separator", "example"], + files: [ + { + path: "registry/bases/base/examples/separator-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/separator-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "separator-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "sheet-example": { + name: "sheet-example", + title: "Sheet", + description: "", + type: "registry:example", + registryDependencies: ["button", "field", "input", "sheet", "example"], + files: [ + { + path: "registry/bases/base/examples/sheet-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/examples/sheet-example") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sheet-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "sidebar-example": { + name: "sidebar-example", + title: "Sidebar", + description: "", + type: "registry:example", + registryDependencies: [ + "button", + "dropdown-menu", + "item", + "label", + "sidebar", + "example", + ], + files: [ + { + path: "registry/bases/base/examples/sidebar-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/sidebar-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "sidebar-icon-example": { + name: "sidebar-icon-example", + title: "Sidebar (Icon)", + description: "", + type: "registry:example", + registryDependencies: [ + "avatar", + "button", + "collapsible", + "dropdown-menu", + "item", + "sidebar", + "example", + ], + files: [ + { + path: "registry/bases/base/examples/sidebar-icon-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/sidebar-icon-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-icon-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "sidebar-inset-example": { + name: "sidebar-inset-example", + title: "Sidebar (Inset)", + description: "", + type: "registry:example", + registryDependencies: ["collapsible", "sidebar", "example"], + files: [ + { + path: "registry/bases/base/examples/sidebar-inset-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/sidebar-inset-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-inset-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "sidebar-floating-example": { + name: "sidebar-floating-example", + title: "Sidebar (Floating)", + description: "", + type: "registry:example", + registryDependencies: [ + "button", + "card", + "dropdown-menu", + "field", + "item", + "sidebar", + "example", + ], + files: [ + { + path: "registry/bases/base/examples/sidebar-floating-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/sidebar-floating-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-floating-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "skeleton-example": { + name: "skeleton-example", + title: "Skeleton", + description: "", + type: "registry:example", + registryDependencies: ["skeleton", "example"], + files: [ + { + path: "registry/bases/base/examples/skeleton-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/skeleton-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "skeleton-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "slider-example": { + name: "slider-example", + title: "Slider", + description: "", + type: "registry:example", + registryDependencies: ["label", "slider", "example"], + files: [ + { + path: "registry/bases/base/examples/slider-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/slider-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "slider-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "sonner-example": { + name: "sonner-example", + title: "Sonner", + description: "", + type: "registry:example", + registryDependencies: ["sonner", "example"], + files: [ + { + path: "registry/bases/base/examples/sonner-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/sonner-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sonner-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "spinner-example": { + name: "spinner-example", + title: "Spinner", + description: "", + type: "registry:example", + registryDependencies: [ + "badge", + "button", + "empty", + "field", + "input-group", + "spinner", + "example", + ], + files: [ + { + path: "registry/bases/base/examples/spinner-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/spinner-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "spinner-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "switch-example": { + name: "switch-example", + title: "Switch", + description: "", + type: "registry:example", + registryDependencies: ["field", "label", "switch", "example"], + files: [ + { + path: "registry/bases/base/examples/switch-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/switch-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "switch-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "table-example": { + name: "table-example", + title: "Table", + description: "", + type: "registry:example", + registryDependencies: [ + "button", + "dropdown-menu", + "input", + "select", + "table", + "example", + ], + files: [ + { + path: "registry/bases/base/examples/table-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/examples/table-example") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "table-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "tabs-example": { + name: "tabs-example", + title: "Tabs", + description: "", + type: "registry:example", + registryDependencies: ["button", "dropdown-menu", "tabs", "example"], + files: [ + { + path: "registry/bases/base/examples/tabs-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/examples/tabs-example") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "tabs-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "textarea-example": { + name: "textarea-example", + title: "Textarea", + description: "", + type: "registry:example", + registryDependencies: ["field", "textarea", "example"], + files: [ + { + path: "registry/bases/base/examples/textarea-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/textarea-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "textarea-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "toggle-example": { + name: "toggle-example", + title: "Toggle", + description: "", + type: "registry:example", + registryDependencies: ["toggle", "example"], + files: [ + { + path: "registry/bases/base/examples/toggle-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/toggle-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "toggle-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "toggle-group-example": { + name: "toggle-group-example", + title: "Toggle Group", + description: "", + type: "registry:example", + registryDependencies: ["input", "select", "toggle-group", "example"], + files: [ + { + path: "registry/bases/base/examples/toggle-group-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/toggle-group-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "toggle-group-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "tooltip-example": { + name: "tooltip-example", + title: "Tooltip", + description: "", + type: "registry:example", + registryDependencies: ["button", "kbd", "tooltip", "example"], + files: [ + { + path: "registry/bases/base/examples/tooltip-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/tooltip-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "tooltip-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + demo: { + name: "demo", + title: "Demo", + description: "", + type: "registry:example", + registryDependencies: [ + "alert-dialog", + "badge", + "button", + "button-group", + "card", + "checkbox", + "dropdown-menu", + "field", + "input-group", + "item", + "radio-group", + "slider", + "switch", + "textarea", + ], + files: [ + { + path: "registry/bases/base/examples/demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/examples/demo") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "demo" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "component-example": { + name: "component-example", + title: "Example", + description: "", + type: "registry:example", + registryDependencies: [ + "alert-dialog", + "badge", + "button", + "card", + "combobox", + "dropdown-menu", + "field", + "input", + "select", + "textarea", + "example", + ], + files: [ + { + path: "registry/bases/base/examples/component-example.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/examples/component-example" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "component-example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + utils: { + name: "utils", + title: "undefined", + description: "", + type: "registry:lib", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/lib/utils.ts", + type: "registry:lib", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/lib/utils") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "utils" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + example: { + name: "example", + title: "Example", + description: "", + type: "registry:component", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/components/example.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/components/example") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "example" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + preview: { + name: "preview", + title: "Preview", + description: "", + type: "registry:block", + registryDependencies: [ + "alert-dialog", + "avatar", + "badge", + "button", + "button-group", + "card", + "chart", + "checkbox", + "combobox", + "dropdown-menu", + "empty", + "field", + "input", + "input-group", + "item", + "label", + "popover", + "radio-group", + "select", + "separator", + "sheet", + "slider", + "spinner", + "switch", + "textarea", + "tooltip", + "example", + ], + files: [ + { + path: "registry/bases/base/blocks/preview/index.tsx", + type: "registry:block", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/blocks/preview/index") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "preview" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "preview-02": { + name: "preview-02", + title: "Preview 02", + description: "", + type: "registry:block", + registryDependencies: [ + "accordion", + "badge", + "breadcrumb", + "button", + "calendar", + "card", + "chart", + "checkbox", + "combobox", + "dropdown-menu", + "empty", + "field", + "input", + "input-group", + "item", + "label", + "native-select", + "progress", + "radio-group", + "select", + "separator", + "sidebar", + "skeleton", + "slider", + "spinner", + "switch", + "table", + "tabs", + "textarea", + "toggle-group", + ], + files: [ + { + path: "registry/bases/base/blocks/preview-02/index.tsx", + type: "registry:block", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/blocks/preview-02/index" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "preview-02" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + "login-01": { + name: "login-01", + title: "Login 01", + description: "A simple login form.", + type: "registry:block", + registryDependencies: ["button", "card", "input", "label", "field"], + files: [ + { + path: "registry/bases/base/blocks/login-01/page.tsx", + type: "registry:page", + target: "app/login/page.tsx", + }, + { + path: "registry/bases/base/blocks/login-01/components/login-form.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/blocks/login-01/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "login-01" + return { default: mod.default || mod[exportName] } + }), + categories: ["authentication", "login"], + meta: undefined, + }, + "login-02": { + name: "login-02", + title: "Login 02", + description: "A two column login page with a cover image.", + type: "registry:block", + registryDependencies: ["button", "input", "label", "field"], + files: [ + { + path: "registry/bases/base/blocks/login-02/page.tsx", + type: "registry:page", + target: "app/login/page.tsx", + }, + { + path: "registry/bases/base/blocks/login-02/components/login-form.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/blocks/login-02/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "login-02" + return { default: mod.default || mod[exportName] } + }), + categories: ["authentication", "login"], + meta: undefined, + }, + "login-03": { + name: "login-03", + title: "Login 03", + description: "A login page with a muted background color.", + type: "registry:block", + registryDependencies: ["button", "card", "input", "label", "field"], + files: [ + { + path: "registry/bases/base/blocks/login-03/page.tsx", + type: "registry:page", + target: "app/login/page.tsx", + }, + { + path: "registry/bases/base/blocks/login-03/components/login-form.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/blocks/login-03/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "login-03" + return { default: mod.default || mod[exportName] } + }), + categories: ["authentication", "login"], + meta: undefined, + }, + "login-04": { + name: "login-04", + title: "Login 04", + description: "A login page with form and image.", + type: "registry:block", + registryDependencies: ["button", "card", "input", "label", "field"], + files: [ + { + path: "registry/bases/base/blocks/login-04/page.tsx", + type: "registry:page", + target: "app/login/page.tsx", + }, + { + path: "registry/bases/base/blocks/login-04/components/login-form.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/blocks/login-04/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "login-04" + return { default: mod.default || mod[exportName] } + }), + categories: ["authentication", "login"], + meta: undefined, + }, + "login-05": { + name: "login-05", + title: "Login 05", + description: "A simple email-only login page.", + type: "registry:block", + registryDependencies: ["button", "input", "label", "field"], + files: [ + { + path: "registry/bases/base/blocks/login-05/page.tsx", + type: "registry:page", + target: "app/login/page.tsx", + }, + { + path: "registry/bases/base/blocks/login-05/components/login-form.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/blocks/login-05/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "login-05" + return { default: mod.default || mod[exportName] } + }), + categories: ["authentication", "login"], + meta: undefined, + }, + "signup-01": { + name: "signup-01", + title: "Signup 01", + description: "A simple signup form.", + type: "registry:block", + registryDependencies: ["button", "card", "input", "label"], + files: [ + { + path: "registry/bases/base/blocks/signup-01/page.tsx", + type: "registry:page", + target: "app/signup/page.tsx", + }, + { + path: "registry/bases/base/blocks/signup-01/components/signup-form.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/blocks/signup-01/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "signup-01" + return { default: mod.default || mod[exportName] } + }), + categories: ["authentication", "signup"], + meta: undefined, + }, + "signup-02": { + name: "signup-02", + title: "Signup 02", + description: "A two column signup page with a cover image.", + type: "registry:block", + registryDependencies: ["button", "input", "label", "field"], + files: [ + { + path: "registry/bases/base/blocks/signup-02/page.tsx", + type: "registry:page", + target: "app/signup/page.tsx", + }, + { + path: "registry/bases/base/blocks/signup-02/components/signup-form.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/blocks/signup-02/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "signup-02" + return { default: mod.default || mod[exportName] } + }), + categories: ["authentication", "signup"], + meta: undefined, + }, + "signup-03": { + name: "signup-03", + title: "Signup 03", + description: "A signup page with a muted background color.", + type: "registry:block", + registryDependencies: ["button", "card", "input", "label", "field"], + files: [ + { + path: "registry/bases/base/blocks/signup-03/page.tsx", + type: "registry:page", + target: "app/signup/page.tsx", + }, + { + path: "registry/bases/base/blocks/signup-03/components/signup-form.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/blocks/signup-03/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "signup-03" + return { default: mod.default || mod[exportName] } + }), + categories: ["authentication", "signup"], + meta: undefined, + }, + "signup-04": { + name: "signup-04", + title: "Signup 04", + description: "A signup page with form and image.", + type: "registry:block", + registryDependencies: ["button", "card", "input", "label", "field"], + files: [ + { + path: "registry/bases/base/blocks/signup-04/page.tsx", + type: "registry:page", + target: "app/signup/page.tsx", + }, + { + path: "registry/bases/base/blocks/signup-04/components/signup-form.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/blocks/signup-04/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "signup-04" + return { default: mod.default || mod[exportName] } + }), + categories: ["authentication", "signup"], + meta: undefined, + }, + "signup-05": { + name: "signup-05", + title: "Signup 05", + description: "A simple signup form with social providers.", + type: "registry:block", + registryDependencies: ["button", "input", "label"], + files: [ + { + path: "registry/bases/base/blocks/signup-05/page.tsx", + type: "registry:page", + target: "app/signup/page.tsx", + }, + { + path: "registry/bases/base/blocks/signup-05/components/signup-form.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/blocks/signup-05/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "signup-05" + return { default: mod.default || mod[exportName] } + }), + categories: ["authentication", "signup"], + meta: undefined, + }, + "dashboard-01": { + name: "dashboard-01", + title: "Dashboard 01", + description: "A dashboard with sidebar, charts and data table.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "label", + "chart", + "card", + "select", + "tabs", + "table", + "toggle-group", + "badge", + "button", + "checkbox", + "dropdown-menu", + "drawer", + "input", + "avatar", + "sheet", + "sonner", + ], + files: [ + { + path: "registry/bases/base/blocks/dashboard-01/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "registry/bases/base/blocks/dashboard-01/data.json", + type: "registry:file", + target: "app/dashboard/data.json", + }, + { + path: "registry/bases/base/blocks/dashboard-01/components/app-sidebar.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/dashboard-01/components/chart-area-interactive.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/dashboard-01/components/data-table.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/dashboard-01/components/nav-documents.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/dashboard-01/components/nav-main.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/dashboard-01/components/nav-secondary.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/dashboard-01/components/nav-user.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/dashboard-01/components/section-cards.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/dashboard-01/components/site-header.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/bases/base/blocks/dashboard-01/page" + ) + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "dashboard-01" + return { default: mod.default || mod[exportName] } + }), + categories: ["dashboard"], + meta: { iframeHeight: "1000px" }, + }, + "sidebar-01": { + name: "sidebar-01", + title: "Sidebar 01", + description: "A simple sidebar with navigation grouped by section.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "label", + "dropdown-menu", + ], + files: [ + { + path: "registry/bases/base/blocks/sidebar-01/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "registry/bases/base/blocks/sidebar-01/components/app-sidebar.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-01/components/search-form.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-01/components/version-switcher.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/blocks/sidebar-01/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-01" + return { default: mod.default || mod[exportName] } + }), + categories: ["sidebar", "dashboard"], + meta: undefined, + }, + "sidebar-02": { + name: "sidebar-02", + title: "Sidebar 02", + description: "A sidebar with collapsible sections.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "label", + "dropdown-menu", + ], + files: [ + { + path: "registry/bases/base/blocks/sidebar-02/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "registry/bases/base/blocks/sidebar-02/components/app-sidebar.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-02/components/search-form.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-02/components/version-switcher.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/blocks/sidebar-02/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-02" + return { default: mod.default || mod[exportName] } + }), + categories: ["sidebar", "dashboard"], + meta: undefined, + }, + "sidebar-03": { + name: "sidebar-03", + title: "Sidebar 03", + description: "A sidebar with submenus.", + type: "registry:block", + registryDependencies: ["sidebar", "breadcrumb"], + files: [ + { + path: "registry/bases/base/blocks/sidebar-03/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "registry/bases/base/blocks/sidebar-03/components/app-sidebar.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/blocks/sidebar-03/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-03" + return { default: mod.default || mod[exportName] } + }), + categories: ["sidebar", "dashboard"], + meta: undefined, + }, + "sidebar-04": { + name: "sidebar-04", + title: "Sidebar 04", + description: "A floating sidebar with submenus.", + type: "registry:block", + registryDependencies: ["sidebar", "breadcrumb", "separator"], + files: [ + { + path: "registry/bases/base/blocks/sidebar-04/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "registry/bases/base/blocks/sidebar-04/components/app-sidebar.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/blocks/sidebar-04/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-04" + return { default: mod.default || mod[exportName] } + }), + categories: ["sidebar", "dashboard"], + meta: undefined, + }, + "sidebar-05": { + name: "sidebar-05", + title: "Sidebar 05", + description: "A sidebar with collapsible submenus.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "label", + "collapsible", + ], + files: [ + { + path: "registry/bases/base/blocks/sidebar-05/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "registry/bases/base/blocks/sidebar-05/components/app-sidebar.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-05/components/search-form.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/blocks/sidebar-05/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-05" + return { default: mod.default || mod[exportName] } + }), + categories: ["sidebar", "dashboard"], + meta: undefined, + }, + "sidebar-06": { + name: "sidebar-06", + title: "Sidebar 06", + description: "A sidebar with submenus as dropdowns.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "card", + "dropdown-menu", + ], + files: [ + { + path: "registry/bases/base/blocks/sidebar-06/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "registry/bases/base/blocks/sidebar-06/components/app-sidebar.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-06/components/nav-main.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-06/components/sidebar-opt-in-form.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/blocks/sidebar-06/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-06" + return { default: mod.default || mod[exportName] } + }), + categories: ["sidebar", "dashboard"], + meta: undefined, + }, + "sidebar-07": { + name: "sidebar-07", + title: "Sidebar 07", + description: "A sidebar that collapses to icons.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "collapsible", + "dropdown-menu", + "avatar", + ], + files: [ + { + path: "registry/bases/base/blocks/sidebar-07/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "registry/bases/base/blocks/sidebar-07/components/app-sidebar.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-07/components/nav-main.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-07/components/nav-projects.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-07/components/nav-user.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-07/components/team-switcher.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/blocks/sidebar-07/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-07" + return { default: mod.default || mod[exportName] } + }), + categories: ["sidebar", "dashboard"], + meta: undefined, + }, + "sidebar-08": { + name: "sidebar-08", + title: "Sidebar 08", + description: "An inset sidebar with secondary navigation.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "collapsible", + "dropdown-menu", + "avatar", + ], + files: [ + { + path: "registry/bases/base/blocks/sidebar-08/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "registry/bases/base/blocks/sidebar-08/components/app-sidebar.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-08/components/nav-main.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-08/components/nav-projects.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-08/components/nav-secondary.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-08/components/nav-user.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/blocks/sidebar-08/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-08" + return { default: mod.default || mod[exportName] } + }), + categories: ["sidebar", "dashboard"], + meta: undefined, + }, + "sidebar-09": { + name: "sidebar-09", + title: "Sidebar 09", + description: "Collapsible nested sidebars.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "collapsible", + "dropdown-menu", + "avatar", + "switch", + "label", + ], + files: [ + { + path: "registry/bases/base/blocks/sidebar-09/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "registry/bases/base/blocks/sidebar-09/components/app-sidebar.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-09/components/nav-user.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/blocks/sidebar-09/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-09" + return { default: mod.default || mod[exportName] } + }), + categories: ["sidebar", "dashboard"], + meta: undefined, + }, + "sidebar-10": { + name: "sidebar-10", + title: "Sidebar 10", + description: "A sidebar in a popover.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "popover", + "collapsible", + "dropdown-menu", + ], + files: [ + { + path: "registry/bases/base/blocks/sidebar-10/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "registry/bases/base/blocks/sidebar-10/components/app-sidebar.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-10/components/nav-actions.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-10/components/nav-favorites.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-10/components/nav-main.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-10/components/nav-secondary.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-10/components/nav-workspaces.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-10/components/team-switcher.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/blocks/sidebar-10/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-10" + return { default: mod.default || mod[exportName] } + }), + categories: ["sidebar", "dashboard"], + meta: undefined, + }, + "sidebar-11": { + name: "sidebar-11", + title: "Sidebar 11", + description: "A sidebar with a collapsible file tree.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "collapsible", + ], + files: [ + { + path: "registry/bases/base/blocks/sidebar-11/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "registry/bases/base/blocks/sidebar-11/components/app-sidebar.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/blocks/sidebar-11/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-11" + return { default: mod.default || mod[exportName] } + }), + categories: ["sidebar", "dashboard"], + meta: undefined, + }, + "sidebar-12": { + name: "sidebar-12", + title: "Sidebar 12", + description: "A sidebar with a calendar.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "collapsible", + "calendar", + "dropdown-menu", + "avatar", + ], + files: [ + { + path: "registry/bases/base/blocks/sidebar-12/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "registry/bases/base/blocks/sidebar-12/components/app-sidebar.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-12/components/calendars.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-12/components/date-picker.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-12/components/nav-user.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/blocks/sidebar-12/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-12" + return { default: mod.default || mod[exportName] } + }), + categories: ["sidebar", "dashboard"], + meta: undefined, + }, + "sidebar-13": { + name: "sidebar-13", + title: "Sidebar 13", + description: "A sidebar in a dialog.", + type: "registry:block", + registryDependencies: ["sidebar", "breadcrumb", "button", "dialog"], + files: [ + { + path: "registry/bases/base/blocks/sidebar-13/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "registry/bases/base/blocks/sidebar-13/components/settings-dialog.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/blocks/sidebar-13/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-13" + return { default: mod.default || mod[exportName] } + }), + categories: ["sidebar", "dashboard"], + meta: undefined, + }, + "sidebar-14": { + name: "sidebar-14", + title: "Sidebar 14", + description: "A sidebar on the right.", + type: "registry:block", + registryDependencies: ["sidebar", "breadcrumb"], + files: [ + { + path: "registry/bases/base/blocks/sidebar-14/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "registry/bases/base/blocks/sidebar-14/components/app-sidebar.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/blocks/sidebar-14/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-14" + return { default: mod.default || mod[exportName] } + }), + categories: ["sidebar", "dashboard"], + meta: undefined, + }, + "sidebar-15": { + name: "sidebar-15", + title: "Sidebar 15", + description: "A left and right sidebar.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "popover", + "collapsible", + "dropdown-menu", + "calendar", + "avatar", + ], + files: [ + { + path: "registry/bases/base/blocks/sidebar-15/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "registry/bases/base/blocks/sidebar-15/components/calendars.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-15/components/date-picker.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-15/components/nav-favorites.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-15/components/nav-main.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-15/components/nav-secondary.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-15/components/nav-user.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-15/components/nav-workspaces.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-15/components/sidebar-left.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-15/components/sidebar-right.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-15/components/team-switcher.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/blocks/sidebar-15/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-15" + return { default: mod.default || mod[exportName] } + }), + categories: ["sidebar", "dashboard"], + meta: undefined, + }, + "sidebar-16": { + name: "sidebar-16", + title: "Sidebar 16", + description: "A sidebar with a sticky site header.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "collapsible", + "dropdown-menu", + "avatar", + "button", + "label", + ], + files: [ + { + path: "registry/bases/base/blocks/sidebar-16/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "registry/bases/base/blocks/sidebar-16/components/app-sidebar.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-16/components/nav-main.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-16/components/nav-projects.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-16/components/nav-secondary.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-16/components/nav-user.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-16/components/search-form.tsx", + type: "registry:component", + target: "", + }, + { + path: "registry/bases/base/blocks/sidebar-16/components/site-header.tsx", + type: "registry:component", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/blocks/sidebar-16/page") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "sidebar-16" + return { default: mod.default || mod[exportName] } + }), + categories: ["sidebar", "dashboard"], + meta: undefined, + }, + "use-mobile": { + name: "use-mobile", + title: "undefined", + description: "", + type: "registry:hook", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/base/hooks/use-mobile.ts", + type: "registry:hook", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/bases/base/hooks/use-mobile") + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "use-mobile" + return { default: mod.default || mod[exportName] } + }), + categories: undefined, + meta: undefined, + }, + }, +} diff --git a/apps/ui/src/registry/bases/base/blocks/_registry.ts b/apps/ui/src/registry/bases/base/blocks/_registry.ts new file mode 100644 index 0000000..f6c37ad --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/_registry.ts @@ -0,0 +1,909 @@ +import { type Registry } from "shadcn/schema" + +export const blocks: Registry["items"] = [ + { + name: "preview", + title: "Preview", + type: "registry:block", + registryDependencies: [ + "alert-dialog", + "avatar", + "badge", + "button", + "button-group", + "card", + "chart", + "checkbox", + "combobox", + "dropdown-menu", + "empty", + "field", + "input", + "input-group", + "item", + "label", + "popover", + "radio-group", + "select", + "separator", + "sheet", + "slider", + "spinner", + "switch", + "textarea", + "tooltip", + "example", + ], + files: [ + { + path: "blocks/preview/index.tsx", + type: "registry:block", + }, + ], + }, + { + name: "preview-02", + title: "Preview 02", + type: "registry:block", + dependencies: ["react-qr-code"], + registryDependencies: [ + "accordion", + "badge", + "breadcrumb", + "button", + "calendar", + "card", + "chart", + "checkbox", + "combobox", + "dropdown-menu", + "empty", + "field", + "input", + "input-group", + "item", + "label", + "native-select", + "progress", + "radio-group", + "select", + "separator", + "sidebar", + "skeleton", + "slider", + "spinner", + "switch", + "table", + "tabs", + "textarea", + "toggle-group", + ], + files: [ + { + path: "blocks/preview-02/index.tsx", + type: "registry:block", + }, + ], + }, + { + name: "login-01", + title: "Login 01", + description: "A simple login form.", + type: "registry:block", + registryDependencies: ["button", "card", "input", "label", "field"], + files: [ + { + path: "blocks/login-01/page.tsx", + target: "app/login/page.tsx", + type: "registry:page", + }, + { + path: "blocks/login-01/components/login-form.tsx", + type: "registry:component", + }, + ], + categories: ["authentication", "login"], + }, + { + name: "login-02", + title: "Login 02", + description: "A two column login page with a cover image.", + type: "registry:block", + registryDependencies: ["button", "input", "label", "field"], + files: [ + { + path: "blocks/login-02/page.tsx", + target: "app/login/page.tsx", + type: "registry:page", + }, + { + path: "blocks/login-02/components/login-form.tsx", + type: "registry:component", + }, + ], + categories: ["authentication", "login"], + }, + { + name: "login-03", + title: "Login 03", + description: "A login page with a muted background color.", + type: "registry:block", + registryDependencies: ["button", "card", "input", "label", "field"], + files: [ + { + path: "blocks/login-03/page.tsx", + target: "app/login/page.tsx", + type: "registry:page", + }, + { + path: "blocks/login-03/components/login-form.tsx", + type: "registry:component", + }, + ], + categories: ["authentication", "login"], + }, + { + name: "login-04", + title: "Login 04", + description: "A login page with form and image.", + type: "registry:block", + registryDependencies: ["button", "card", "input", "label", "field"], + files: [ + { + path: "blocks/login-04/page.tsx", + target: "app/login/page.tsx", + type: "registry:page", + }, + { + path: "blocks/login-04/components/login-form.tsx", + type: "registry:component", + }, + ], + categories: ["authentication", "login"], + }, + { + name: "login-05", + title: "Login 05", + description: "A simple email-only login page.", + type: "registry:block", + registryDependencies: ["button", "input", "label", "field"], + files: [ + { + path: "blocks/login-05/page.tsx", + target: "app/login/page.tsx", + type: "registry:page", + }, + { + path: "blocks/login-05/components/login-form.tsx", + type: "registry:component", + }, + ], + categories: ["authentication", "login"], + }, + { + name: "signup-01", + title: "Signup 01", + description: "A simple signup form.", + type: "registry:block", + registryDependencies: ["button", "card", "input", "label"], + files: [ + { + path: "blocks/signup-01/page.tsx", + target: "app/signup/page.tsx", + type: "registry:page", + }, + { + path: "blocks/signup-01/components/signup-form.tsx", + type: "registry:component", + }, + ], + categories: ["authentication", "signup"], + }, + { + name: "signup-02", + title: "Signup 02", + description: "A two column signup page with a cover image.", + type: "registry:block", + registryDependencies: ["button", "input", "label", "field"], + files: [ + { + path: "blocks/signup-02/page.tsx", + target: "app/signup/page.tsx", + type: "registry:page", + }, + { + path: "blocks/signup-02/components/signup-form.tsx", + type: "registry:component", + }, + ], + categories: ["authentication", "signup"], + }, + { + name: "signup-03", + title: "Signup 03", + description: "A signup page with a muted background color.", + type: "registry:block", + registryDependencies: ["button", "card", "input", "label", "field"], + files: [ + { + path: "blocks/signup-03/page.tsx", + target: "app/signup/page.tsx", + type: "registry:page", + }, + { + path: "blocks/signup-03/components/signup-form.tsx", + type: "registry:component", + }, + ], + categories: ["authentication", "signup"], + }, + { + name: "signup-04", + title: "Signup 04", + description: "A signup page with form and image.", + type: "registry:block", + registryDependencies: ["button", "card", "input", "label", "field"], + files: [ + { + path: "blocks/signup-04/page.tsx", + target: "app/signup/page.tsx", + type: "registry:page", + }, + { + path: "blocks/signup-04/components/signup-form.tsx", + type: "registry:component", + }, + ], + categories: ["authentication", "signup"], + }, + { + name: "signup-05", + title: "Signup 05", + description: "A simple signup form with social providers.", + type: "registry:block", + registryDependencies: ["button", "input", "label"], + files: [ + { + path: "blocks/signup-05/page.tsx", + target: "app/signup/page.tsx", + type: "registry:page", + }, + { + path: "blocks/signup-05/components/signup-form.tsx", + type: "registry:component", + }, + ], + categories: ["authentication", "signup"], + }, + { + name: "dashboard-01", + title: "Dashboard 01", + type: "registry:block", + description: "A dashboard with sidebar, charts and data table.", + dependencies: [ + "@dnd-kit/core", + "@dnd-kit/modifiers", + "@dnd-kit/sortable", + "@dnd-kit/utilities", + "@tanstack/react-table", + "zod", + ], + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "label", + "chart", + "card", + "select", + "tabs", + "table", + "toggle-group", + "badge", + "button", + "checkbox", + "dropdown-menu", + "drawer", + "input", + "avatar", + "sheet", + "sonner", + ], + files: [ + { + path: "blocks/dashboard-01/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "blocks/dashboard-01/data.json", + type: "registry:file", + target: "app/dashboard/data.json", + }, + { + path: "blocks/dashboard-01/components/app-sidebar.tsx", + type: "registry:component", + }, + { + path: "blocks/dashboard-01/components/chart-area-interactive.tsx", + type: "registry:component", + }, + { + path: "blocks/dashboard-01/components/data-table.tsx", + type: "registry:component", + }, + { + path: "blocks/dashboard-01/components/nav-documents.tsx", + type: "registry:component", + }, + { + path: "blocks/dashboard-01/components/nav-main.tsx", + type: "registry:component", + }, + { + path: "blocks/dashboard-01/components/nav-secondary.tsx", + type: "registry:component", + }, + { + path: "blocks/dashboard-01/components/nav-user.tsx", + type: "registry:component", + }, + { + path: "blocks/dashboard-01/components/section-cards.tsx", + type: "registry:component", + }, + { + path: "blocks/dashboard-01/components/site-header.tsx", + type: "registry:component", + }, + ], + categories: ["dashboard"], + meta: { + iframeHeight: "1000px", + }, + }, + { + name: "sidebar-01", + title: "Sidebar 01", + type: "registry:block", + description: "A simple sidebar with navigation grouped by section.", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "label", + "dropdown-menu", + ], + files: [ + { + path: "blocks/sidebar-01/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "blocks/sidebar-01/components/app-sidebar.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-01/components/search-form.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-01/components/version-switcher.tsx", + type: "registry:component", + }, + ], + categories: ["sidebar", "dashboard"], + }, + { + name: "sidebar-02", + title: "Sidebar 02", + description: "A sidebar with collapsible sections.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "label", + "dropdown-menu", + ], + files: [ + { + path: "blocks/sidebar-02/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "blocks/sidebar-02/components/app-sidebar.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-02/components/search-form.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-02/components/version-switcher.tsx", + type: "registry:component", + }, + ], + categories: ["sidebar", "dashboard"], + }, + { + name: "sidebar-03", + title: "Sidebar 03", + description: "A sidebar with submenus.", + type: "registry:block", + registryDependencies: ["sidebar", "breadcrumb"], + files: [ + { + path: "blocks/sidebar-03/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "blocks/sidebar-03/components/app-sidebar.tsx", + type: "registry:component", + }, + ], + categories: ["sidebar", "dashboard"], + }, + { + name: "sidebar-04", + title: "Sidebar 04", + description: "A floating sidebar with submenus.", + type: "registry:block", + registryDependencies: ["sidebar", "breadcrumb", "separator"], + files: [ + { + path: "blocks/sidebar-04/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "blocks/sidebar-04/components/app-sidebar.tsx", + type: "registry:component", + }, + ], + categories: ["sidebar", "dashboard"], + }, + { + name: "sidebar-05", + title: "Sidebar 05", + description: "A sidebar with collapsible submenus.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "label", + "collapsible", + ], + files: [ + { + path: "blocks/sidebar-05/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "blocks/sidebar-05/components/app-sidebar.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-05/components/search-form.tsx", + type: "registry:component", + }, + ], + categories: ["sidebar", "dashboard"], + }, + { + name: "sidebar-06", + title: "Sidebar 06", + description: "A sidebar with submenus as dropdowns.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "card", + "dropdown-menu", + ], + files: [ + { + path: "blocks/sidebar-06/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "blocks/sidebar-06/components/app-sidebar.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-06/components/nav-main.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-06/components/sidebar-opt-in-form.tsx", + type: "registry:component", + }, + ], + categories: ["sidebar", "dashboard"], + }, + { + name: "sidebar-07", + title: "Sidebar 07", + type: "registry:block", + description: "A sidebar that collapses to icons.", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "collapsible", + "dropdown-menu", + "avatar", + ], + files: [ + { + path: "blocks/sidebar-07/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "blocks/sidebar-07/components/app-sidebar.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-07/components/nav-main.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-07/components/nav-projects.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-07/components/nav-user.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-07/components/team-switcher.tsx", + type: "registry:component", + }, + ], + categories: ["sidebar", "dashboard"], + }, + { + name: "sidebar-08", + title: "Sidebar 08", + description: "An inset sidebar with secondary navigation.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "collapsible", + "dropdown-menu", + "avatar", + ], + files: [ + { + path: "blocks/sidebar-08/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "blocks/sidebar-08/components/app-sidebar.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-08/components/nav-main.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-08/components/nav-projects.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-08/components/nav-secondary.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-08/components/nav-user.tsx", + type: "registry:component", + }, + ], + categories: ["sidebar", "dashboard"], + }, + { + name: "sidebar-09", + title: "Sidebar 09", + description: "Collapsible nested sidebars.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "collapsible", + "dropdown-menu", + "avatar", + "switch", + "label", + ], + files: [ + { + path: "blocks/sidebar-09/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "blocks/sidebar-09/components/app-sidebar.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-09/components/nav-user.tsx", + type: "registry:component", + }, + ], + categories: ["sidebar", "dashboard"], + }, + { + name: "sidebar-10", + title: "Sidebar 10", + description: "A sidebar in a popover.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "popover", + "collapsible", + "dropdown-menu", + ], + files: [ + { + path: "blocks/sidebar-10/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "blocks/sidebar-10/components/app-sidebar.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-10/components/nav-actions.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-10/components/nav-favorites.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-10/components/nav-main.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-10/components/nav-secondary.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-10/components/nav-workspaces.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-10/components/team-switcher.tsx", + type: "registry:component", + }, + ], + categories: ["sidebar", "dashboard"], + }, + { + name: "sidebar-11", + title: "Sidebar 11", + description: "A sidebar with a collapsible file tree.", + type: "registry:block", + registryDependencies: ["sidebar", "breadcrumb", "separator", "collapsible"], + files: [ + { + path: "blocks/sidebar-11/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "blocks/sidebar-11/components/app-sidebar.tsx", + type: "registry:component", + }, + ], + categories: ["sidebar", "dashboard"], + }, + { + name: "sidebar-12", + title: "Sidebar 12", + description: "A sidebar with a calendar.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "collapsible", + "calendar", + "dropdown-menu", + "avatar", + ], + files: [ + { + path: "blocks/sidebar-12/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "blocks/sidebar-12/components/app-sidebar.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-12/components/calendars.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-12/components/date-picker.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-12/components/nav-user.tsx", + type: "registry:component", + }, + ], + categories: ["sidebar", "dashboard"], + }, + { + name: "sidebar-13", + title: "Sidebar 13", + description: "A sidebar in a dialog.", + type: "registry:block", + registryDependencies: ["sidebar", "breadcrumb", "button", "dialog"], + files: [ + { + path: "blocks/sidebar-13/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "blocks/sidebar-13/components/settings-dialog.tsx", + type: "registry:component", + }, + ], + categories: ["sidebar", "dashboard"], + }, + { + name: "sidebar-14", + title: "Sidebar 14", + description: "A sidebar on the right.", + type: "registry:block", + registryDependencies: ["sidebar", "breadcrumb"], + files: [ + { + path: "blocks/sidebar-14/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "blocks/sidebar-14/components/app-sidebar.tsx", + type: "registry:component", + }, + ], + categories: ["sidebar", "dashboard"], + }, + { + name: "sidebar-15", + title: "Sidebar 15", + description: "A left and right sidebar.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "popover", + "collapsible", + "dropdown-menu", + "calendar", + "avatar", + ], + files: [ + { + path: "blocks/sidebar-15/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "blocks/sidebar-15/components/calendars.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-15/components/date-picker.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-15/components/nav-favorites.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-15/components/nav-main.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-15/components/nav-secondary.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-15/components/nav-user.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-15/components/nav-workspaces.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-15/components/sidebar-left.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-15/components/sidebar-right.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-15/components/team-switcher.tsx", + type: "registry:component", + }, + ], + categories: ["sidebar", "dashboard"], + }, + { + name: "sidebar-16", + title: "Sidebar 16", + description: "A sidebar with a sticky site header.", + type: "registry:block", + registryDependencies: [ + "sidebar", + "breadcrumb", + "separator", + "collapsible", + "dropdown-menu", + "avatar", + "button", + "label", + ], + files: [ + { + path: "blocks/sidebar-16/page.tsx", + type: "registry:page", + target: "app/dashboard/page.tsx", + }, + { + path: "blocks/sidebar-16/components/app-sidebar.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-16/components/nav-main.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-16/components/nav-projects.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-16/components/nav-secondary.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-16/components/nav-user.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-16/components/search-form.tsx", + type: "registry:component", + }, + { + path: "blocks/sidebar-16/components/site-header.tsx", + type: "registry:component", + }, + ], + categories: ["sidebar", "dashboard"], + }, +] diff --git a/apps/ui/src/registry/bases/base/blocks/dashboard-01/components/app-sidebar.tsx b/apps/ui/src/registry/bases/base/blocks/dashboard-01/components/app-sidebar.tsx new file mode 100644 index 0000000..1005b50 --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/dashboard-01/components/app-sidebar.tsx @@ -0,0 +1,280 @@ + +import * as React from "react" + +import { NavDocuments } from "@/registry/bases/base/blocks/dashboard-01/components/nav-documents" +import { NavMain } from "@/registry/bases/base/blocks/dashboard-01/components/nav-main" +import { NavSecondary } from "@/registry/bases/base/blocks/dashboard-01/components/nav-secondary" +import { NavUser } from "@/registry/bases/base/blocks/dashboard-01/components/nav-user" +import { + Sidebar, + SidebarContent, + SidebarFooter, + SidebarHeader, + SidebarMenu, + SidebarMenuButton, + SidebarMenuItem, +} from "@/registry/bases/base/ui/sidebar" +import { IconPlaceholder } from "@/routes/create/components/icon-placeholder" + +const data = { + user: { + name: "shadcn", + email: "m@example.com", + avatar: "/avatars/shadcn.jpg", + }, + navMain: [ + { + title: "Dashboard", + url: "#", + icon: ( + + ), + }, + { + title: "Lifecycle", + url: "#", + icon: ( + + ), + }, + { + title: "Analytics", + url: "#", + icon: ( + + ), + }, + { + title: "Projects", + url: "#", + icon: ( + + ), + }, + { + title: "Team", + url: "#", + icon: ( + + ), + }, + ], + navClouds: [ + { + title: "Capture", + icon: ( + + ), + isActive: true, + url: "#", + items: [ + { + title: "Active Proposals", + url: "#", + }, + { + title: "Archived", + url: "#", + }, + ], + }, + { + title: "Proposal", + icon: ( + + ), + url: "#", + items: [ + { + title: "Active Proposals", + url: "#", + }, + { + title: "Archived", + url: "#", + }, + ], + }, + { + title: "Prompts", + icon: ( + + ), + url: "#", + items: [ + { + title: "Active Proposals", + url: "#", + }, + { + title: "Archived", + url: "#", + }, + ], + }, + ], + navSecondary: [ + { + title: "Settings", + url: "#", + icon: ( + + ), + }, + { + title: "Get Help", + url: "#", + icon: ( + + ), + }, + { + title: "Search", + url: "#", + icon: ( + + ), + }, + ], + documents: [ + { + name: "Data Library", + url: "#", + icon: ( + + ), + }, + { + name: "Reports", + url: "#", + icon: ( + + ), + }, + { + name: "Word Assistant", + url: "#", + icon: ( + + ), + }, + ], +} +export function AppSidebar({ ...props }: React.ComponentProps) { + return ( + + + + + } + > + + Acme Inc. + + + + + + + + + + + + + + ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/dashboard-01/components/chart-area-interactive.tsx b/apps/ui/src/registry/bases/base/blocks/dashboard-01/components/chart-area-interactive.tsx new file mode 100644 index 0000000..e2acbd9 --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/dashboard-01/components/chart-area-interactive.tsx @@ -0,0 +1,299 @@ + +import * as React from "react" +import { Area, AreaChart, CartesianGrid, XAxis } from "recharts" + +import { useIsMobile } from "@/registry/bases/base/hooks/use-mobile" +import { + Card, + CardAction, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/registry/bases/base/ui/card" +import { + ChartContainer, + ChartTooltip, + ChartTooltipContent, + type ChartConfig, +} from "@/registry/bases/base/ui/chart" +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/registry/bases/base/ui/select" +import { + ToggleGroup, + ToggleGroupItem, +} from "@/registry/bases/base/ui/toggle-group" + +export const description = "An interactive area chart" + +const chartData = [ + { date: "2024-04-01", desktop: 222, mobile: 150 }, + { date: "2024-04-02", desktop: 97, mobile: 180 }, + { date: "2024-04-03", desktop: 167, mobile: 120 }, + { date: "2024-04-04", desktop: 242, mobile: 260 }, + { date: "2024-04-05", desktop: 373, mobile: 290 }, + { date: "2024-04-06", desktop: 301, mobile: 340 }, + { date: "2024-04-07", desktop: 245, mobile: 180 }, + { date: "2024-04-08", desktop: 409, mobile: 320 }, + { date: "2024-04-09", desktop: 59, mobile: 110 }, + { date: "2024-04-10", desktop: 261, mobile: 190 }, + { date: "2024-04-11", desktop: 327, mobile: 350 }, + { date: "2024-04-12", desktop: 292, mobile: 210 }, + { date: "2024-04-13", desktop: 342, mobile: 380 }, + { date: "2024-04-14", desktop: 137, mobile: 220 }, + { date: "2024-04-15", desktop: 120, mobile: 170 }, + { date: "2024-04-16", desktop: 138, mobile: 190 }, + { date: "2024-04-17", desktop: 446, mobile: 360 }, + { date: "2024-04-18", desktop: 364, mobile: 410 }, + { date: "2024-04-19", desktop: 243, mobile: 180 }, + { date: "2024-04-20", desktop: 89, mobile: 150 }, + { date: "2024-04-21", desktop: 137, mobile: 200 }, + { date: "2024-04-22", desktop: 224, mobile: 170 }, + { date: "2024-04-23", desktop: 138, mobile: 230 }, + { date: "2024-04-24", desktop: 387, mobile: 290 }, + { date: "2024-04-25", desktop: 215, mobile: 250 }, + { date: "2024-04-26", desktop: 75, mobile: 130 }, + { date: "2024-04-27", desktop: 383, mobile: 420 }, + { date: "2024-04-28", desktop: 122, mobile: 180 }, + { date: "2024-04-29", desktop: 315, mobile: 240 }, + { date: "2024-04-30", desktop: 454, mobile: 380 }, + { date: "2024-05-01", desktop: 165, mobile: 220 }, + { date: "2024-05-02", desktop: 293, mobile: 310 }, + { date: "2024-05-03", desktop: 247, mobile: 190 }, + { date: "2024-05-04", desktop: 385, mobile: 420 }, + { date: "2024-05-05", desktop: 481, mobile: 390 }, + { date: "2024-05-06", desktop: 498, mobile: 520 }, + { date: "2024-05-07", desktop: 388, mobile: 300 }, + { date: "2024-05-08", desktop: 149, mobile: 210 }, + { date: "2024-05-09", desktop: 227, mobile: 180 }, + { date: "2024-05-10", desktop: 293, mobile: 330 }, + { date: "2024-05-11", desktop: 335, mobile: 270 }, + { date: "2024-05-12", desktop: 197, mobile: 240 }, + { date: "2024-05-13", desktop: 197, mobile: 160 }, + { date: "2024-05-14", desktop: 448, mobile: 490 }, + { date: "2024-05-15", desktop: 473, mobile: 380 }, + { date: "2024-05-16", desktop: 338, mobile: 400 }, + { date: "2024-05-17", desktop: 499, mobile: 420 }, + { date: "2024-05-18", desktop: 315, mobile: 350 }, + { date: "2024-05-19", desktop: 235, mobile: 180 }, + { date: "2024-05-20", desktop: 177, mobile: 230 }, + { date: "2024-05-21", desktop: 82, mobile: 140 }, + { date: "2024-05-22", desktop: 81, mobile: 120 }, + { date: "2024-05-23", desktop: 252, mobile: 290 }, + { date: "2024-05-24", desktop: 294, mobile: 220 }, + { date: "2024-05-25", desktop: 201, mobile: 250 }, + { date: "2024-05-26", desktop: 213, mobile: 170 }, + { date: "2024-05-27", desktop: 420, mobile: 460 }, + { date: "2024-05-28", desktop: 233, mobile: 190 }, + { date: "2024-05-29", desktop: 78, mobile: 130 }, + { date: "2024-05-30", desktop: 340, mobile: 280 }, + { date: "2024-05-31", desktop: 178, mobile: 230 }, + { date: "2024-06-01", desktop: 178, mobile: 200 }, + { date: "2024-06-02", desktop: 470, mobile: 410 }, + { date: "2024-06-03", desktop: 103, mobile: 160 }, + { date: "2024-06-04", desktop: 439, mobile: 380 }, + { date: "2024-06-05", desktop: 88, mobile: 140 }, + { date: "2024-06-06", desktop: 294, mobile: 250 }, + { date: "2024-06-07", desktop: 323, mobile: 370 }, + { date: "2024-06-08", desktop: 385, mobile: 320 }, + { date: "2024-06-09", desktop: 438, mobile: 480 }, + { date: "2024-06-10", desktop: 155, mobile: 200 }, + { date: "2024-06-11", desktop: 92, mobile: 150 }, + { date: "2024-06-12", desktop: 492, mobile: 420 }, + { date: "2024-06-13", desktop: 81, mobile: 130 }, + { date: "2024-06-14", desktop: 426, mobile: 380 }, + { date: "2024-06-15", desktop: 307, mobile: 350 }, + { date: "2024-06-16", desktop: 371, mobile: 310 }, + { date: "2024-06-17", desktop: 475, mobile: 520 }, + { date: "2024-06-18", desktop: 107, mobile: 170 }, + { date: "2024-06-19", desktop: 341, mobile: 290 }, + { date: "2024-06-20", desktop: 408, mobile: 450 }, + { date: "2024-06-21", desktop: 169, mobile: 210 }, + { date: "2024-06-22", desktop: 317, mobile: 270 }, + { date: "2024-06-23", desktop: 480, mobile: 530 }, + { date: "2024-06-24", desktop: 132, mobile: 180 }, + { date: "2024-06-25", desktop: 141, mobile: 190 }, + { date: "2024-06-26", desktop: 434, mobile: 380 }, + { date: "2024-06-27", desktop: 448, mobile: 490 }, + { date: "2024-06-28", desktop: 149, mobile: 200 }, + { date: "2024-06-29", desktop: 103, mobile: 160 }, + { date: "2024-06-30", desktop: 446, mobile: 400 }, +] + +const chartConfig = { + visitors: { + label: "Visitors", + }, + desktop: { + label: "Desktop", + color: "var(--primary)", + }, + mobile: { + label: "Mobile", + color: "var(--primary)", + }, +} satisfies ChartConfig + +export function ChartAreaInteractive() { + const isMobile = useIsMobile() + const [timeRange, setTimeRange] = React.useState("90d") + + React.useEffect(() => { + if (isMobile) { + setTimeRange("7d") + } + }, [isMobile]) + + const filteredData = chartData.filter((item) => { + const date = new Date(item.date) + const referenceDate = new Date("2024-06-30") + let daysToSubtract = 90 + if (timeRange === "30d") { + daysToSubtract = 30 + } else if (timeRange === "7d") { + daysToSubtract = 7 + } + const startDate = new Date(referenceDate) + startDate.setDate(startDate.getDate() - daysToSubtract) + return date >= startDate + }) + + return ( + + + Total Visitors + + + Total for the last 3 months + + Last 3 months + + + { + setTimeRange(value[0] ?? "90d") + }} + variant="outline" + className="hidden *:data-[slot=toggle-group-item]:px-4! @[767px]/card:flex" + > + Last 3 months + Last 30 days + Last 7 days + + + + + + + + + + + + + + + + + + + { + const date = new Date(value) + return date.toLocaleDateString("en-US", { + month: "short", + day: "numeric", + }) + }} + /> + { + return new Date(value).toLocaleDateString("en-US", { + month: "short", + day: "numeric", + }) + }} + indicator="dot" + /> + } + /> + + + + + + + ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/dashboard-01/components/data-table.tsx b/apps/ui/src/registry/bases/base/blocks/dashboard-01/components/data-table.tsx new file mode 100644 index 0000000..c03cc08 --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/dashboard-01/components/data-table.tsx @@ -0,0 +1,940 @@ + +import * as React from "react" +import { + closestCenter, + DndContext, + KeyboardSensor, + MouseSensor, + TouchSensor, + useSensor, + useSensors, + type DragEndEvent, + type UniqueIdentifier, +} from "@dnd-kit/core" +import { restrictToVerticalAxis } from "@dnd-kit/modifiers" +import { + arrayMove, + SortableContext, + useSortable, + verticalListSortingStrategy, +} from "@dnd-kit/sortable" +import { CSS } from "@dnd-kit/utilities" +import { + flexRender, + getCoreRowModel, + getFacetedRowModel, + getFacetedUniqueValues, + getFilteredRowModel, + getPaginationRowModel, + getSortedRowModel, + useReactTable, + type ColumnDef, + type ColumnFiltersState, + type Row, + type SortingState, + type VisibilityState, +} from "@tanstack/react-table" +import { Area, AreaChart, CartesianGrid, XAxis } from "recharts" +import { toast } from "sonner" +import { z } from "zod" + +import { useIsMobile } from "@/registry/bases/base/hooks/use-mobile" +import { Badge } from "@/registry/bases/base/ui/badge" +import { Button } from "@/registry/bases/base/ui/button" +import { + ChartContainer, + ChartTooltip, + ChartTooltipContent, + type ChartConfig, +} from "@/registry/bases/base/ui/chart" +import { Checkbox } from "@/registry/bases/base/ui/checkbox" +import { + Drawer, + DrawerClose, + DrawerContent, + DrawerDescription, + DrawerFooter, + DrawerHeader, + DrawerTitle, + DrawerTrigger, +} from "@/registry/bases/base/ui/drawer" +import { + DropdownMenu, + DropdownMenuCheckboxItem, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from "@/registry/bases/base/ui/dropdown-menu" +import { Input } from "@/registry/bases/base/ui/input" +import { Label } from "@/registry/bases/base/ui/label" +import { + Select, + SelectContent, + SelectGroup, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/registry/bases/base/ui/select" +import { Separator } from "@/registry/bases/base/ui/separator" +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/registry/bases/base/ui/table" +import { + Tabs, + TabsContent, + TabsList, + TabsTrigger, +} from "@/registry/bases/base/ui/tabs" +import { IconPlaceholder } from "@/routes/create/components/icon-placeholder" + +export const schema = z.object({ + id: z.number(), + header: z.string(), + type: z.string(), + status: z.string(), + target: z.string(), + limit: z.string(), + reviewer: z.string(), +}) + +// Create a separate component for the drag handle +function DragHandle({ id }: { id: number }) { + const { attributes, listeners } = useSortable({ + id, + }) + return ( + + ) +} +const columns: ColumnDef>[] = [ + { + id: "drag", + header: () => null, + cell: ({ row }) => , + }, + { + id: "select", + header: ({ table }) => ( +
+ table.toggleAllPageRowsSelected(!!value)} + aria-label="Select all" + /> +
+ ), + cell: ({ row }) => ( +
+ row.toggleSelected(!!value)} + aria-label="Select row" + /> +
+ ), + enableSorting: false, + enableHiding: false, + }, + { + accessorKey: "header", + header: "Header", + cell: ({ row }) => { + return + }, + enableHiding: false, + }, + { + accessorKey: "type", + header: "Section Type", + cell: ({ row }) => ( +
+ + {row.original.type} + +
+ ), + }, + { + accessorKey: "status", + header: "Status", + cell: ({ row }) => ( + + {row.original.status === "Done" ? ( + + ) : ( + + )} + {row.original.status} + + ), + }, + { + accessorKey: "target", + header: () =>
Target
, + cell: ({ row }) => ( +
{ + e.preventDefault() + toast.promise(new Promise((resolve) => setTimeout(resolve, 1000)), { + loading: `Saving ${row.original.header}`, + success: "Done", + error: "Error", + }) + }} + > + + +
+ ), + }, + { + accessorKey: "limit", + header: () =>
Limit
, + cell: ({ row }) => ( +
{ + e.preventDefault() + toast.promise(new Promise((resolve) => setTimeout(resolve, 1000)), { + loading: `Saving ${row.original.header}`, + success: "Done", + error: "Error", + }) + }} + > + + +
+ ), + }, + { + accessorKey: "reviewer", + header: "Reviewer", + cell: ({ row }) => { + const isAssigned = row.original.reviewer !== "Assign reviewer" + if (isAssigned) { + return row.original.reviewer + } + return ( + <> + + + + ) + }, + }, + { + id: "actions", + cell: () => ( + + + } + > + + Open menu + + + Edit + Make a copy + Favorite + + Delete + + + ), + }, +] +function DraggableRow({ row }: { row: Row> }) { + const { transform, transition, setNodeRef, isDragging } = useSortable({ + id: row.original.id, + }) + return ( + + {row.getVisibleCells().map((cell) => ( + + {flexRender(cell.column.columnDef.cell, cell.getContext())} + + ))} + + ) +} +export function DataTable({ + data: initialData, +}: { + data: z.infer[] +}) { + const [data, setData] = React.useState(() => initialData) + const [rowSelection, setRowSelection] = React.useState({}) + const [columnVisibility, setColumnVisibility] = + React.useState({}) + const [columnFilters, setColumnFilters] = React.useState( + [] + ) + const [sorting, setSorting] = React.useState([]) + const [pagination, setPagination] = React.useState({ + pageIndex: 0, + pageSize: 10, + }) + const sortableId = React.useId() + const sensors = useSensors( + useSensor(MouseSensor, {}), + useSensor(TouchSensor, {}), + useSensor(KeyboardSensor, {}) + ) + const dataIds = React.useMemo( + () => data?.map(({ id }) => id) || [], + [data] + ) + const table = useReactTable({ + data, + columns, + state: { + sorting, + columnVisibility, + rowSelection, + columnFilters, + pagination, + }, + getRowId: (row) => row.id.toString(), + enableRowSelection: true, + onRowSelectionChange: setRowSelection, + onSortingChange: setSorting, + onColumnFiltersChange: setColumnFilters, + onColumnVisibilityChange: setColumnVisibility, + onPaginationChange: setPagination, + getCoreRowModel: getCoreRowModel(), + getFilteredRowModel: getFilteredRowModel(), + getPaginationRowModel: getPaginationRowModel(), + getSortedRowModel: getSortedRowModel(), + getFacetedRowModel: getFacetedRowModel(), + getFacetedUniqueValues: getFacetedUniqueValues(), + }) + function handleDragEnd(event: DragEndEvent) { + const { active, over } = event + if (active && over && active.id !== over.id) { + setData((data) => { + const oldIndex = dataIds.indexOf(active.id) + const newIndex = dataIds.indexOf(over.id) + return arrayMove(data, oldIndex, newIndex) + }) + } + } + return ( + +
+ + + + Outline + + Past Performance 3 + + + Key Personnel 2 + + Focus Documents + +
+ + } + > + + Columns + + + + {table + .getAllColumns() + .filter( + (column) => + typeof column.accessorFn !== "undefined" && + column.getCanHide() + ) + .map((column) => { + return ( + + column.toggleVisibility(!!value) + } + > + {column.id} + + ) + })} + + + +
+
+ +
+ + + + {table.getHeaderGroups().map((headerGroup) => ( + + {headerGroup.headers.map((header) => { + return ( + + {header.isPlaceholder + ? null + : flexRender( + header.column.columnDef.header, + header.getContext() + )} + + ) + })} + + ))} + + + {table.getRowModel().rows?.length ? ( + + {table.getRowModel().rows.map((row) => ( + + ))} + + ) : ( + + + No results. + + + )} + +
+
+
+
+
+ {table.getFilteredSelectedRowModel().rows.length} of{" "} + {table.getFilteredRowModel().rows.length} row(s) selected. +
+
+
+ + +
+
+ Page {table.getState().pagination.pageIndex + 1} of{" "} + {table.getPageCount()} +
+
+ + + + +
+
+
+
+ +
+
+ +
+
+ +
+
+
+ ) +} +const chartData = [ + { + month: "January", + desktop: 186, + mobile: 80, + }, + { + month: "February", + desktop: 305, + mobile: 200, + }, + { + month: "March", + desktop: 237, + mobile: 120, + }, + { + month: "April", + desktop: 73, + mobile: 190, + }, + { + month: "May", + desktop: 209, + mobile: 130, + }, + { + month: "June", + desktop: 214, + mobile: 140, + }, +] +const chartConfig = { + desktop: { + label: "Desktop", + color: "var(--primary)", + }, + mobile: { + label: "Mobile", + color: "var(--primary)", + }, +} satisfies ChartConfig +function TableCellViewer({ item }: { item: z.infer }) { + const isMobile = useIsMobile() + return ( + + + + + + + {item.header} + + Showing total visitors for the last 6 months + + +
+ {!isMobile && ( + <> + + + + value.slice(0, 3)} + hide + /> + } + /> + + + + + +
+
+ Trending up by 5.2% this month{" "} + +
+
+ Showing total visitors for the last 6 months. This is just + some random text to test the layout. It spans multiple lines + and should wrap around. +
+
+ + + )} +
+
+ + +
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+ + +
+
+
+ + + + + + + + {items.map((item) => ( + + + {item.icon} + {item.title} + + + ))} + + + + ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/dashboard-01/components/nav-secondary.tsx b/apps/ui/src/registry/bases/base/blocks/dashboard-01/components/nav-secondary.tsx new file mode 100644 index 0000000..bd99dfa --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/dashboard-01/components/nav-secondary.tsx @@ -0,0 +1,38 @@ + +import * as React from "react" + +import { + SidebarGroup, + SidebarGroupContent, + SidebarMenu, + SidebarMenuButton, + SidebarMenuItem, +} from "@/registry/bases/base/ui/sidebar" + +export function NavSecondary({ + items, + ...props +}: { + items: { + title: string + url: string + icon: React.ReactNode + }[] +} & React.ComponentPropsWithoutRef) { + return ( + + + + {items.map((item) => ( + + }> + {item.icon} + {item.title} + + + ))} + + + + ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/dashboard-01/components/nav-user.tsx b/apps/ui/src/registry/bases/base/blocks/dashboard-01/components/nav-user.tsx new file mode 100644 index 0000000..56e764e --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/dashboard-01/components/nav-user.tsx @@ -0,0 +1,133 @@ + +import { + Avatar, + AvatarFallback, + AvatarImage, +} from "@/registry/bases/base/ui/avatar" +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from "@/registry/bases/base/ui/dropdown-menu" +import { + SidebarMenu, + SidebarMenuButton, + SidebarMenuItem, + useSidebar, +} from "@/registry/bases/base/ui/sidebar" +import { IconPlaceholder } from "@/routes/create/components/icon-placeholder" + +export function NavUser({ + user, +}: { + user: { + name: string + email: string + avatar: string + } +}) { + const { isMobile } = useSidebar() + return ( + + + + + } + > + + + CN + +
+ {user.name} + + {user.email} + +
+ +
+ + + +
+ + + CN + +
+ {user.name} + + {user.email} + +
+
+
+
+ + + + + Account + + + + Billing + + + + Notifications + + + + + + Log out + +
+
+
+
+ ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/dashboard-01/components/section-cards.tsx b/apps/ui/src/registry/bases/base/blocks/dashboard-01/components/section-cards.tsx new file mode 100644 index 0000000..e06abdb --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/dashboard-01/components/section-cards.tsx @@ -0,0 +1,158 @@ + +import { Badge } from "@/registry/bases/base/ui/badge" +import { + Card, + CardAction, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from "@/registry/bases/base/ui/card" +import { IconPlaceholder } from "@/routes/create/components/icon-placeholder" + +export function SectionCards() { + return ( +
+ + + Total Revenue + + $1,250.00 + + + + + +12.5% + + + + +
+ Trending up this month{" "} + +
+
+ Visitors for the last 6 months +
+
+
+ + + New Customers + + 1,234 + + + + + -20% + + + + +
+ Down 20% this period{" "} + +
+
+ Acquisition needs attention +
+
+
+ + + Active Accounts + + 45,678 + + + + + +12.5% + + + + +
+ Strong user retention{" "} + +
+
Engagement exceed targets
+
+
+ + + Growth Rate + + 4.5% + + + + + +4.5% + + + + +
+ Steady performance increase{" "} + +
+
Meets growth projections
+
+
+
+ ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/dashboard-01/components/site-header.tsx b/apps/ui/src/registry/bases/base/blocks/dashboard-01/components/site-header.tsx new file mode 100644 index 0000000..22072ff --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/dashboard-01/components/site-header.tsx @@ -0,0 +1,17 @@ +import { Separator } from "@/registry/bases/base/ui/separator" +import { SidebarTrigger } from "@/registry/bases/base/ui/sidebar" + +export function SiteHeader() { + return ( +
+
+ + +

Documents

+
+
+ ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/dashboard-01/data.json b/apps/ui/src/registry/bases/base/blocks/dashboard-01/data.json new file mode 100644 index 0000000..ec08736 --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/dashboard-01/data.json @@ -0,0 +1,614 @@ +[ + { + "id": 1, + "header": "Cover page", + "type": "Cover page", + "status": "In Process", + "target": "18", + "limit": "5", + "reviewer": "Eddie Lake" + }, + { + "id": 2, + "header": "Table of contents", + "type": "Table of contents", + "status": "Done", + "target": "29", + "limit": "24", + "reviewer": "Eddie Lake" + }, + { + "id": 3, + "header": "Executive summary", + "type": "Narrative", + "status": "Done", + "target": "10", + "limit": "13", + "reviewer": "Eddie Lake" + }, + { + "id": 4, + "header": "Technical approach", + "type": "Narrative", + "status": "Done", + "target": "27", + "limit": "23", + "reviewer": "Jamik Tashpulatov" + }, + { + "id": 5, + "header": "Design", + "type": "Narrative", + "status": "In Process", + "target": "2", + "limit": "16", + "reviewer": "Jamik Tashpulatov" + }, + { + "id": 6, + "header": "Capabilities", + "type": "Narrative", + "status": "In Process", + "target": "20", + "limit": "8", + "reviewer": "Jamik Tashpulatov" + }, + { + "id": 7, + "header": "Integration with existing systems", + "type": "Narrative", + "status": "In Process", + "target": "19", + "limit": "21", + "reviewer": "Jamik Tashpulatov" + }, + { + "id": 8, + "header": "Innovation and Advantages", + "type": "Narrative", + "status": "Done", + "target": "25", + "limit": "26", + "reviewer": "Assign reviewer" + }, + { + "id": 9, + "header": "Overview of EMR's Innovative Solutions", + "type": "Technical content", + "status": "Done", + "target": "7", + "limit": "23", + "reviewer": "Assign reviewer" + }, + { + "id": 10, + "header": "Advanced Algorithms and Machine Learning", + "type": "Narrative", + "status": "Done", + "target": "30", + "limit": "28", + "reviewer": "Assign reviewer" + }, + { + "id": 11, + "header": "Adaptive Communication Protocols", + "type": "Narrative", + "status": "Done", + "target": "9", + "limit": "31", + "reviewer": "Assign reviewer" + }, + { + "id": 12, + "header": "Advantages Over Current Technologies", + "type": "Narrative", + "status": "Done", + "target": "12", + "limit": "0", + "reviewer": "Assign reviewer" + }, + { + "id": 13, + "header": "Past Performance", + "type": "Narrative", + "status": "Done", + "target": "22", + "limit": "33", + "reviewer": "Assign reviewer" + }, + { + "id": 14, + "header": "Customer Feedback and Satisfaction Levels", + "type": "Narrative", + "status": "Done", + "target": "15", + "limit": "34", + "reviewer": "Assign reviewer" + }, + { + "id": 15, + "header": "Implementation Challenges and Solutions", + "type": "Narrative", + "status": "Done", + "target": "3", + "limit": "35", + "reviewer": "Assign reviewer" + }, + { + "id": 16, + "header": "Security Measures and Data Protection Policies", + "type": "Narrative", + "status": "In Process", + "target": "6", + "limit": "36", + "reviewer": "Assign reviewer" + }, + { + "id": 17, + "header": "Scalability and Future Proofing", + "type": "Narrative", + "status": "Done", + "target": "4", + "limit": "37", + "reviewer": "Assign reviewer" + }, + { + "id": 18, + "header": "Cost-Benefit Analysis", + "type": "Plain language", + "status": "Done", + "target": "14", + "limit": "38", + "reviewer": "Assign reviewer" + }, + { + "id": 19, + "header": "User Training and Onboarding Experience", + "type": "Narrative", + "status": "Done", + "target": "17", + "limit": "39", + "reviewer": "Assign reviewer" + }, + { + "id": 20, + "header": "Future Development Roadmap", + "type": "Narrative", + "status": "Done", + "target": "11", + "limit": "40", + "reviewer": "Assign reviewer" + }, + { + "id": 21, + "header": "System Architecture Overview", + "type": "Technical content", + "status": "In Process", + "target": "24", + "limit": "18", + "reviewer": "Maya Johnson" + }, + { + "id": 22, + "header": "Risk Management Plan", + "type": "Narrative", + "status": "Done", + "target": "15", + "limit": "22", + "reviewer": "Carlos Rodriguez" + }, + { + "id": 23, + "header": "Compliance Documentation", + "type": "Legal", + "status": "In Process", + "target": "31", + "limit": "27", + "reviewer": "Sarah Chen" + }, + { + "id": 24, + "header": "API Documentation", + "type": "Technical content", + "status": "Done", + "target": "8", + "limit": "12", + "reviewer": "Raj Patel" + }, + { + "id": 25, + "header": "User Interface Mockups", + "type": "Visual", + "status": "In Process", + "target": "19", + "limit": "25", + "reviewer": "Leila Ahmadi" + }, + { + "id": 26, + "header": "Database Schema", + "type": "Technical content", + "status": "Done", + "target": "22", + "limit": "20", + "reviewer": "Thomas Wilson" + }, + { + "id": 27, + "header": "Testing Methodology", + "type": "Technical content", + "status": "In Process", + "target": "17", + "limit": "14", + "reviewer": "Assign reviewer" + }, + { + "id": 28, + "header": "Deployment Strategy", + "type": "Narrative", + "status": "Done", + "target": "26", + "limit": "30", + "reviewer": "Eddie Lake" + }, + { + "id": 29, + "header": "Budget Breakdown", + "type": "Financial", + "status": "In Process", + "target": "13", + "limit": "16", + "reviewer": "Jamik Tashpulatov" + }, + { + "id": 30, + "header": "Market Analysis", + "type": "Research", + "status": "Done", + "target": "29", + "limit": "32", + "reviewer": "Sophia Martinez" + }, + { + "id": 31, + "header": "Competitor Comparison", + "type": "Research", + "status": "In Process", + "target": "21", + "limit": "19", + "reviewer": "Assign reviewer" + }, + { + "id": 32, + "header": "Maintenance Plan", + "type": "Technical content", + "status": "Done", + "target": "16", + "limit": "23", + "reviewer": "Alex Thompson" + }, + { + "id": 33, + "header": "User Personas", + "type": "Research", + "status": "In Process", + "target": "27", + "limit": "24", + "reviewer": "Nina Patel" + }, + { + "id": 34, + "header": "Accessibility Compliance", + "type": "Legal", + "status": "Done", + "target": "18", + "limit": "21", + "reviewer": "Assign reviewer" + }, + { + "id": 35, + "header": "Performance Metrics", + "type": "Technical content", + "status": "In Process", + "target": "23", + "limit": "26", + "reviewer": "David Kim" + }, + { + "id": 36, + "header": "Disaster Recovery Plan", + "type": "Technical content", + "status": "Done", + "target": "14", + "limit": "17", + "reviewer": "Jamik Tashpulatov" + }, + { + "id": 37, + "header": "Third-party Integrations", + "type": "Technical content", + "status": "In Process", + "target": "25", + "limit": "28", + "reviewer": "Eddie Lake" + }, + { + "id": 38, + "header": "User Feedback Summary", + "type": "Research", + "status": "Done", + "target": "20", + "limit": "15", + "reviewer": "Assign reviewer" + }, + { + "id": 39, + "header": "Localization Strategy", + "type": "Narrative", + "status": "In Process", + "target": "12", + "limit": "19", + "reviewer": "Maria Garcia" + }, + { + "id": 40, + "header": "Mobile Compatibility", + "type": "Technical content", + "status": "Done", + "target": "28", + "limit": "31", + "reviewer": "James Wilson" + }, + { + "id": 41, + "header": "Data Migration Plan", + "type": "Technical content", + "status": "In Process", + "target": "19", + "limit": "22", + "reviewer": "Assign reviewer" + }, + { + "id": 42, + "header": "Quality Assurance Protocols", + "type": "Technical content", + "status": "Done", + "target": "30", + "limit": "33", + "reviewer": "Priya Singh" + }, + { + "id": 43, + "header": "Stakeholder Analysis", + "type": "Research", + "status": "In Process", + "target": "11", + "limit": "14", + "reviewer": "Eddie Lake" + }, + { + "id": 44, + "header": "Environmental Impact Assessment", + "type": "Research", + "status": "Done", + "target": "24", + "limit": "27", + "reviewer": "Assign reviewer" + }, + { + "id": 45, + "header": "Intellectual Property Rights", + "type": "Legal", + "status": "In Process", + "target": "17", + "limit": "20", + "reviewer": "Sarah Johnson" + }, + { + "id": 46, + "header": "Customer Support Framework", + "type": "Narrative", + "status": "Done", + "target": "22", + "limit": "25", + "reviewer": "Jamik Tashpulatov" + }, + { + "id": 47, + "header": "Version Control Strategy", + "type": "Technical content", + "status": "In Process", + "target": "15", + "limit": "18", + "reviewer": "Assign reviewer" + }, + { + "id": 48, + "header": "Continuous Integration Pipeline", + "type": "Technical content", + "status": "Done", + "target": "26", + "limit": "29", + "reviewer": "Michael Chen" + }, + { + "id": 49, + "header": "Regulatory Compliance", + "type": "Legal", + "status": "In Process", + "target": "13", + "limit": "16", + "reviewer": "Assign reviewer" + }, + { + "id": 50, + "header": "User Authentication System", + "type": "Technical content", + "status": "Done", + "target": "28", + "limit": "31", + "reviewer": "Eddie Lake" + }, + { + "id": 51, + "header": "Data Analytics Framework", + "type": "Technical content", + "status": "In Process", + "target": "21", + "limit": "24", + "reviewer": "Jamik Tashpulatov" + }, + { + "id": 52, + "header": "Cloud Infrastructure", + "type": "Technical content", + "status": "Done", + "target": "16", + "limit": "19", + "reviewer": "Assign reviewer" + }, + { + "id": 53, + "header": "Network Security Measures", + "type": "Technical content", + "status": "In Process", + "target": "29", + "limit": "32", + "reviewer": "Lisa Wong" + }, + { + "id": 54, + "header": "Project Timeline", + "type": "Planning", + "status": "Done", + "target": "14", + "limit": "17", + "reviewer": "Eddie Lake" + }, + { + "id": 55, + "header": "Resource Allocation", + "type": "Planning", + "status": "In Process", + "target": "27", + "limit": "30", + "reviewer": "Assign reviewer" + }, + { + "id": 56, + "header": "Team Structure and Roles", + "type": "Planning", + "status": "Done", + "target": "20", + "limit": "23", + "reviewer": "Jamik Tashpulatov" + }, + { + "id": 57, + "header": "Communication Protocols", + "type": "Planning", + "status": "In Process", + "target": "15", + "limit": "18", + "reviewer": "Assign reviewer" + }, + { + "id": 58, + "header": "Success Metrics", + "type": "Planning", + "status": "Done", + "target": "30", + "limit": "33", + "reviewer": "Eddie Lake" + }, + { + "id": 59, + "header": "Internationalization Support", + "type": "Technical content", + "status": "In Process", + "target": "23", + "limit": "26", + "reviewer": "Jamik Tashpulatov" + }, + { + "id": 60, + "header": "Backup and Recovery Procedures", + "type": "Technical content", + "status": "Done", + "target": "18", + "limit": "21", + "reviewer": "Assign reviewer" + }, + { + "id": 61, + "header": "Monitoring and Alerting System", + "type": "Technical content", + "status": "In Process", + "target": "25", + "limit": "28", + "reviewer": "Daniel Park" + }, + { + "id": 62, + "header": "Code Review Guidelines", + "type": "Technical content", + "status": "Done", + "target": "12", + "limit": "15", + "reviewer": "Eddie Lake" + }, + { + "id": 63, + "header": "Documentation Standards", + "type": "Technical content", + "status": "In Process", + "target": "27", + "limit": "30", + "reviewer": "Jamik Tashpulatov" + }, + { + "id": 64, + "header": "Release Management Process", + "type": "Planning", + "status": "Done", + "target": "22", + "limit": "25", + "reviewer": "Assign reviewer" + }, + { + "id": 65, + "header": "Feature Prioritization Matrix", + "type": "Planning", + "status": "In Process", + "target": "19", + "limit": "22", + "reviewer": "Emma Davis" + }, + { + "id": 66, + "header": "Technical Debt Assessment", + "type": "Technical content", + "status": "Done", + "target": "24", + "limit": "27", + "reviewer": "Eddie Lake" + }, + { + "id": 67, + "header": "Capacity Planning", + "type": "Planning", + "status": "In Process", + "target": "21", + "limit": "24", + "reviewer": "Jamik Tashpulatov" + }, + { + "id": 68, + "header": "Service Level Agreements", + "type": "Legal", + "status": "Done", + "target": "26", + "limit": "29", + "reviewer": "Assign reviewer" + } +] diff --git a/apps/ui/src/registry/bases/base/blocks/dashboard-01/page.tsx b/apps/ui/src/registry/bases/base/blocks/dashboard-01/page.tsx new file mode 100644 index 0000000..2f68629 --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/dashboard-01/page.tsx @@ -0,0 +1,37 @@ +import { AppSidebar } from "@/registry/bases/base/blocks/dashboard-01/components/app-sidebar" +import { ChartAreaInteractive } from "@/registry/bases/base/blocks/dashboard-01/components/chart-area-interactive" +import { DataTable } from "@/registry/bases/base/blocks/dashboard-01/components/data-table" +import { SectionCards } from "@/registry/bases/base/blocks/dashboard-01/components/section-cards" +import { SiteHeader } from "@/registry/bases/base/blocks/dashboard-01/components/site-header" +import { SidebarInset, SidebarProvider } from "@/registry/bases/base/ui/sidebar" + +import data from "./data.json" + +export default function Page() { + return ( + + + + +
+
+
+ +
+ +
+ +
+
+
+
+
+ ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/login-01/components/login-form.tsx b/apps/ui/src/registry/bases/base/blocks/login-01/components/login-form.tsx new file mode 100644 index 0000000..6687495 --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/login-01/components/login-form.tsx @@ -0,0 +1,70 @@ +import { cn } from "@/registry/bases/base/lib/utils" +import { Button } from "@/registry/bases/base/ui/button" +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/registry/bases/base/ui/card" +import { + Field, + FieldDescription, + FieldGroup, + FieldLabel, +} from "@/registry/bases/base/ui/field" +import { Input } from "@/registry/bases/base/ui/input" + +export function LoginForm({ + className, + ...props +}: React.ComponentProps<"div">) { + return ( +
+ + + Login to your account + + Enter your email below to login to your account + + + +
+ + + Email + + + + + + + + + + + Don't have an account? Sign up + + + +
+
+
+
+ ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/login-01/page.tsx b/apps/ui/src/registry/bases/base/blocks/login-01/page.tsx new file mode 100644 index 0000000..853e8b5 --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/login-01/page.tsx @@ -0,0 +1,11 @@ +import { LoginForm } from "@/registry/bases/base/blocks/login-01/components/login-form" + +export default function Page() { + return ( +
+
+ +
+
+ ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/login-02/components/login-form.tsx b/apps/ui/src/registry/bases/base/blocks/login-02/components/login-form.tsx new file mode 100644 index 0000000..18862dd --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/login-02/components/login-form.tsx @@ -0,0 +1,65 @@ +import { cn } from "@/registry/bases/base/lib/utils" +import { Button } from "@/registry/bases/base/ui/button" +import { + Field, + FieldDescription, + FieldGroup, + FieldLabel, + FieldSeparator, +} from "@/registry/bases/base/ui/field" +import { Input } from "@/registry/bases/base/ui/input" + +export function LoginForm({ + className, + ...props +}: React.ComponentProps<"form">) { + return ( +
+ +
+

Login to your account

+

+ Enter your email below to login to your account +

+
+ + Email + + + + + + + + + + Or continue with + + + + Don't have an account?{" "} + + Sign up + + + +
+
+ ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/login-02/page.tsx b/apps/ui/src/registry/bases/base/blocks/login-02/page.tsx new file mode 100644 index 0000000..2b5ddde --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/login-02/page.tsx @@ -0,0 +1,39 @@ + +import { LoginForm } from "@/registry/bases/base/blocks/login-02/components/login-form" +import { IconPlaceholder } from "@/routes/create/components/icon-placeholder" + +export default function LoginPage() { + return ( +
+
+ +
+
+ +
+
+
+
+ Image +
+
+ ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/login-03/components/login-form.tsx b/apps/ui/src/registry/bases/base/blocks/login-03/components/login-form.tsx new file mode 100644 index 0000000..b2f5ee6 --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/login-03/components/login-form.tsx @@ -0,0 +1,95 @@ +import { cn } from "@/registry/bases/base/lib/utils" +import { Button } from "@/registry/bases/base/ui/button" +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/registry/bases/base/ui/card" +import { + Field, + FieldDescription, + FieldGroup, + FieldLabel, + FieldSeparator, +} from "@/registry/bases/base/ui/field" +import { Input } from "@/registry/bases/base/ui/input" + +export function LoginForm({ + className, + ...props +}: React.ComponentProps<"div">) { + return ( +
+ + + Welcome back + + Login with your Apple or Google account + + + +
+ + + + + + + Or continue with + + + Email + + + + + + + + + + Don't have an account? Sign up + + + +
+
+
+ + By clicking continue, you agree to our Terms of Service{" "} + and Privacy Policy. + +
+ ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/login-03/page.tsx b/apps/ui/src/registry/bases/base/blocks/login-03/page.tsx new file mode 100644 index 0000000..0650aa3 --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/login-03/page.tsx @@ -0,0 +1,26 @@ + +import { LoginForm } from "@/registry/bases/base/blocks/login-03/components/login-form" +import { IconPlaceholder } from "@/routes/create/components/icon-placeholder" + +export default function LoginPage() { + return ( + + ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/login-04/components/login-form.tsx b/apps/ui/src/registry/bases/base/blocks/login-04/components/login-form.tsx new file mode 100644 index 0000000..6f05df1 --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/login-04/components/login-form.tsx @@ -0,0 +1,105 @@ +import { cn } from "@/registry/bases/base/lib/utils" +import { Button } from "@/registry/bases/base/ui/button" +import { Card, CardContent } from "@/registry/bases/base/ui/card" +import { + Field, + FieldDescription, + FieldGroup, + FieldLabel, + FieldSeparator, +} from "@/registry/bases/base/ui/field" +import { Input } from "@/registry/bases/base/ui/input" + +export function LoginForm({ + className, + ...props +}: React.ComponentProps<"div">) { + return ( +
+ + +
+ +
+

Welcome back

+

+ Login to your Acme Inc account +

+
+ + Email + + + + + + + + + + + Or continue with + + + + + + + + Don't have an account? Sign up + +
+
+
+ Image +
+
+
+ + By clicking continue, you agree to our Terms of Service{" "} + and Privacy Policy. + +
+ ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/login-04/page.tsx b/apps/ui/src/registry/bases/base/blocks/login-04/page.tsx new file mode 100644 index 0000000..4684095 --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/login-04/page.tsx @@ -0,0 +1,11 @@ +import { LoginForm } from "@/registry/bases/base/blocks/login-04/components/login-form" + +export default function LoginPage() { + return ( +
+
+ +
+
+ ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/login-05/components/login-form.tsx b/apps/ui/src/registry/bases/base/blocks/login-05/components/login-form.tsx new file mode 100644 index 0000000..483f14f --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/login-05/components/login-form.tsx @@ -0,0 +1,85 @@ + +import { cn } from "@/registry/bases/base/lib/utils" +import { Button } from "@/registry/bases/base/ui/button" +import { + Field, + FieldDescription, + FieldGroup, + FieldLabel, + FieldSeparator, +} from "@/registry/bases/base/ui/field" +import { Input } from "@/registry/bases/base/ui/input" +import { IconPlaceholder } from "@/routes/create/components/icon-placeholder" + +export function LoginForm({ + className, + ...props +}: React.ComponentProps<"div">) { + return ( +
+
+ +
+ +
+ +
+ Acme Inc. +
+

Welcome to Acme Inc.

+ + Don't have an account? Sign up + +
+ + Email + + + + + + Or + + + + +
+
+ + By clicking continue, you agree to our Terms of Service{" "} + and Privacy Policy. + +
+ ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/login-05/page.tsx b/apps/ui/src/registry/bases/base/blocks/login-05/page.tsx new file mode 100644 index 0000000..9a50159 --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/login-05/page.tsx @@ -0,0 +1,11 @@ +import { LoginForm } from "@/registry/bases/base/blocks/login-05/components/login-form" + +export default function LoginPage() { + return ( +
+
+ +
+
+ ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/preview-02/cards/account-access.tsx b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/account-access.tsx new file mode 100644 index 0000000..6dda362 --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/account-access.tsx @@ -0,0 +1,101 @@ + +import { Button } from "@/registry/bases/base/ui/button" +import { + Card, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from "@/registry/bases/base/ui/card" +import { Field, FieldGroup, FieldLabel } from "@/registry/bases/base/ui/field" +import { Input } from "@/registry/bases/base/ui/input" +import { + Item, + ItemContent, + ItemDescription, + ItemMedia, + ItemTitle, +} from "@/registry/bases/base/ui/item" +import { IconPlaceholder } from "@/routes/create/components/icon-placeholder" + +export function AccountAccess() { + return ( + + + Account Access + + Update your credentials or re-authenticate. + + + + + + Email Address + + + +
+ + Current Password + + + Forgot? + +
+ +
+
+
+ + + }> + + + + + Danger Zone + + Archive account and remove catalog + + + + + +
+ ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/preview-02/cards/album-card.tsx b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/album-card.tsx new file mode 100644 index 0000000..a7fccf7 --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/album-card.tsx @@ -0,0 +1,49 @@ +import { Badge } from "@/registry/bases/base/ui/badge" +import { + Card, + CardContent, + CardDescription, + CardFooter, + CardTitle, +} from "@/registry/bases/base/ui/card" +import { Separator } from "@/registry/bases/base/ui/separator" + +export function AlbumCard() { + return ( + + +
+ Synthetic Horizons EP cover art + $26,033.79 +
+
+ Synthetic Horizons EP + + Released Aug 14, 2023 + +
+
+ + +
+
+ + Tracks + + 6 Tracks +
+
+ + Cumulative Streams + + 6,198,524 +
+
+
+
+ ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/preview-02/cards/card-overview.tsx b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/card-overview.tsx new file mode 100644 index 0000000..e311d49 --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/card-overview.tsx @@ -0,0 +1,98 @@ + +import { Bar, BarChart, XAxis } from "recharts" + +import { Badge } from "@/registry/bases/base/ui/badge" +import { Button } from "@/registry/bases/base/ui/button" +import { + Card, + CardContent, + CardDescription, + CardTitle, +} from "@/registry/bases/base/ui/card" +import { + ChartContainer, + ChartTooltip, + ChartTooltipContent, + type ChartConfig, +} from "@/registry/bases/base/ui/chart" + +const activityData = [ + { month: "Jan", amount: 40 }, + { month: "Feb", amount: 55 }, + { month: "Mar", amount: 35 }, + { month: "Apr", amount: 60 }, + { month: "May", amount: 45 }, + { month: "Jun", amount: 50 }, + { month: "Jul", amount: 65 }, + { month: "Aug", amount: 40 }, + { month: "Sep", amount: 55 }, + { month: "Oct", amount: 70 }, + { month: "Nov", amount: 45 }, + { month: "Dec", amount: 80 }, +] + +const chartConfig = { + amount: { + label: "Activity", + color: "var(--chart-2)", + }, +} satisfies ChartConfig + +export function CardOverview() { + return ( +
+ + + Card Balance + US$12.94 + + US$11,337.06 Available + + + + + +
+ Payment Due + 1 Apr +
+ +
+
+ + +
+ Yearly Activity + +US$0.25 Daily Cash +
+ + + String(v).slice(0, 1)} + className="text-[10px]" + /> + } + /> + + + +
+
+
+ ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/preview-02/cards/catalog-toolbar.tsx b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/catalog-toolbar.tsx new file mode 100644 index 0000000..b8f3d51 --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/catalog-toolbar.tsx @@ -0,0 +1,46 @@ + +import { Button } from "@/registry/bases/base/ui/button" +import { + InputGroup, + InputGroupAddon, + InputGroupInput, +} from "@/registry/bases/base/ui/input-group" +import { + ToggleGroup, + ToggleGroupItem, +} from "@/registry/bases/base/ui/toggle-group" +import { IconPlaceholder } from "@/routes/create/components/icon-placeholder" + +export function CatalogToolbar() { + return ( +
+ + + + + + + + + All Tracks + Releases + Top Earners + +
+ ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/preview-02/cards/claimable-balance.tsx b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/claimable-balance.tsx new file mode 100644 index 0000000..16571ec --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/claimable-balance.tsx @@ -0,0 +1,59 @@ +import { Badge } from "@/registry/bases/base/ui/badge" +import { + Card, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from "@/registry/bases/base/ui/card" +import { Item, ItemContent } from "@/registry/bases/base/ui/item" +import { Separator } from "@/registry/bases/base/ui/separator" + +export function ClaimableBalance() { + return ( + + + Claimable Balance + $0.00 + + + Pending Setup + + + + + +
+ + Net Royalties + + $0.00 +
+
+ + Processing Fee + + -$0.00 +
+ +
+ + Total Ready to Claim + + + $0.00 USD + +
+
+
+
+ + + Once your bank is connected, balances over $10.00 are automatically + eligible for monthly distribution on the 15th of each month. + + +
+ ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/preview-02/cards/contribution-history.tsx b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/contribution-history.tsx new file mode 100644 index 0000000..cd53e01 --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/contribution-history.tsx @@ -0,0 +1,115 @@ + +import { Bar, BarChart, XAxis } from "recharts" + +import { Badge } from "@/registry/bases/base/ui/badge" +import { Button } from "@/registry/bases/base/ui/button" +import { + Card, + CardAction, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from "@/registry/bases/base/ui/card" +import { + ChartContainer, + ChartTooltip, + ChartTooltipContent, + type ChartConfig, +} from "@/registry/bases/base/ui/chart" +import { + Item, + ItemContent, + ItemDescription, +} from "@/registry/bases/base/ui/item" +import { useDesignSystemSearchParams } from "@/routes/create/lib/search-params" + +const chartData = [ + { month: "Dec", amount: 800 }, + { month: "Jan", amount: 1100 }, + { month: "Feb", amount: 900 }, + { month: "Mar", amount: 1300 }, + { month: "Apr", amount: 750 }, + { month: "May", amount: 1400 }, +] + +const chartConfig = { + amount: { + label: "Contribution", + color: "var(--chart-2)", + }, +} satisfies ChartConfig + +export function ContributionHistory() { + const [params] = useDesignSystemSearchParams() + const isRounded = !["lyra", "sera"].includes(params.style) + + return ( + + + Contribution History + Last 6 months of activity + + + + + + } + /> + + + + + +
+ + + + Upcoming + + + May 25, 2024 + + + $1,000 scheduled + + + + + + + Auto-Save Plan + + + Accelerated + + + Recurring weekly + + + +
+
+ + + +
+ ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/preview-02/cards/cover-art.tsx b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/cover-art.tsx new file mode 100644 index 0000000..d25ab85 --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/cover-art.tsx @@ -0,0 +1,61 @@ +import { Button } from "@/registry/bases/base/ui/button" +import { + Card, + CardContent, + CardDescription, + CardFooter, +} from "@/registry/bases/base/ui/card" +import { Item } from "@/registry/bases/base/ui/item" +import { Label } from "@/registry/bases/base/ui/label" +import { IconPlaceholder } from "@/routes/create/components/icon-placeholder" + +export function CoverArt() { + return ( + + + + + + + + + + + + Minimum 3000 × 3000px +
+ JPEG or PNG only +
+
+
+ ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/preview-02/cards/dividend-income.tsx b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/dividend-income.tsx new file mode 100644 index 0000000..218a031 --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/dividend-income.tsx @@ -0,0 +1,142 @@ + +import { Bar, BarChart, XAxis } from "recharts" + +import { Button } from "@/registry/bases/base/ui/button" +import { + Card, + CardAction, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/registry/bases/base/ui/card" +import { + ChartContainer, + ChartTooltip, + ChartTooltipContent, + type ChartConfig, +} from "@/registry/bases/base/ui/chart" +import { + Item, + ItemContent, + ItemDescription, + ItemGroup, + ItemTitle, +} from "@/registry/bases/base/ui/item" +import { useDesignSystemSearchParams } from "@/routes/create/lib/search-params" +import { IconPlaceholder } from "@/routes/create/components/icon-placeholder" + +const HOLDINGS = [ + { + name: "Vanguard VIG", + shares: "450 Shares", + amount: "$1,842.10", + data: [ + { q: "Q1", value: 380 }, + { q: "Q2", value: 420 }, + { q: "Q3", value: 390 }, + { q: "Q4", value: 652 }, + ], + }, + { + name: "S&P 500 VOO", + shares: "112 Shares", + amount: "$928.40", + data: [ + { q: "Q1", value: 180 }, + { q: "Q2", value: 210 }, + { q: "Q3", value: 320 }, + { q: "Q4", value: 218 }, + ], + }, + { + name: "Apple AAPL", + shares: "85 Shares", + amount: "$340.00", + data: [ + { q: "Q1", value: 60 }, + { q: "Q2", value: 70 }, + { q: "Q3", value: 120 }, + { q: "Q4", value: 90 }, + ], + }, + { + name: "Realty Income", + shares: "320 Shares", + amount: "$1,139.50", + data: [ + { q: "Q1", value: 240 }, + { q: "Q2", value: 260 }, + { q: "Q3", value: 280 }, + { q: "Q4", value: 360 }, + ], + }, +] + +const miniChartConfig = { + value: { + label: "Dividend", + color: "var(--chart-2)", + }, +} satisfies ChartConfig + +export function DividendIncome() { + const [params] = useDesignSystemSearchParams() + const isRounded = !["lyra", "sera"].includes(params.style) + + return ( + + + Q2 Dividend Income + + Quarterly dividend payouts across your portfolio holdings. + + + + + + + + {HOLDINGS.map((holding) => ( + + + {holding.name} + {holding.shares} + + + + } + /> + + + + + {holding.amount} + + + ))} + + + + ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/preview-02/cards/empty-connect-bank.tsx b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/empty-connect-bank.tsx new file mode 100644 index 0000000..6b9e2db --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/empty-connect-bank.tsx @@ -0,0 +1,41 @@ +import { Button } from "@/registry/bases/base/ui/button" +import { Card, CardContent } from "@/registry/bases/base/ui/card" +import { + Empty, + EmptyContent, + EmptyDescription, + EmptyHeader, + EmptyMedia, + EmptyTitle, +} from "@/registry/bases/base/ui/empty" +import { IconPlaceholder } from "@/routes/create/components/icon-placeholder" + +export function EmptyConnectBank() { + return ( + + + + + + + + Connect Bank + + Link your payout method to receive monthly royalty distributions + automatically. + + + + + + + + + ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/preview-02/cards/empty-distribute-track.tsx b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/empty-distribute-track.tsx new file mode 100644 index 0000000..e03b3ed --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/empty-distribute-track.tsx @@ -0,0 +1,41 @@ +import { Button } from "@/registry/bases/base/ui/button" +import { Card, CardContent } from "@/registry/bases/base/ui/card" +import { + Empty, + EmptyContent, + EmptyDescription, + EmptyHeader, + EmptyMedia, + EmptyTitle, +} from "@/registry/bases/base/ui/empty" +import { IconPlaceholder } from "@/routes/create/components/icon-placeholder" + +export function EmptyDistributeTrack() { + return ( + + + + + + + + Distribute Track + + Upload your first master to start reaching listeners on Spotify, + Apple Music, and more. + + + + + + + + + ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/preview-02/cards/empty-explore-catalog.tsx b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/empty-explore-catalog.tsx new file mode 100644 index 0000000..f1aa048 --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/empty-explore-catalog.tsx @@ -0,0 +1,41 @@ +import { Button } from "@/registry/bases/base/ui/button" +import { Card, CardContent } from "@/registry/bases/base/ui/card" +import { + Empty, + EmptyContent, + EmptyDescription, + EmptyHeader, + EmptyMedia, + EmptyTitle, +} from "@/registry/bases/base/ui/empty" +import { IconPlaceholder } from "@/routes/create/components/icon-placeholder" + +export function EmptyExploreCatalog() { + return ( + + + + + + + + Explore Catalog + + Check your ISRC codes, metadata, and visual assets before going + live. + + + + + + + + + ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/preview-02/cards/faq.tsx b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/faq.tsx new file mode 100644 index 0000000..cf31851 --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/faq.tsx @@ -0,0 +1,123 @@ + +import { + Accordion, + AccordionContent, + AccordionItem, + AccordionTrigger, +} from "@/registry/bases/base/ui/accordion" +import { Button } from "@/registry/bases/base/ui/button" +import { + Card, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from "@/registry/bases/base/ui/card" +import { + Tabs, + TabsContent, + TabsList, + TabsTrigger, +} from "@/registry/bases/base/ui/tabs" + +const GENERAL_QUESTIONS = [ + { + q: "How secure is my financial data with Ledger?", + a: "We use bank-level AES-256 encryption, SOC 2 Type II certified infrastructure, and never store your credentials. All connections use read-only access tokens. We are a SEC registered investment advisor.", + }, + { + q: "How do I connect my bank or investment accounts?", + a: "Go to Settings > Linked Accounts and search for your institution. We support over 12,000 banks and brokerages via Plaid and MX.", + }, + { + q: "Can I export my data for tax purposes?", + a: "Yes. Navigate to Reports > Tax Export to download a CSV or PDF summary of your transactions, dividends, and capital gains for any tax year.", + }, +] + +const BILLING_QUESTIONS = [ + { + q: "What is the difference between Basic and Pro pricing tiers?", + a: "Basic includes budgeting, goal tracking, and up to 3 linked accounts. Pro adds unlimited accounts, dividend tracking, portfolio analysis, and priority support.", + }, + { + q: "How do I cancel my subscription?", + a: "Go to Settings > Billing > Manage Plan and click Cancel. Your access continues until the end of your current billing period.", + }, + { + q: "Do you offer a free trial?", + a: "Yes. All new accounts start with a 14-day Pro trial. No credit card required.", + }, +] + +const GOALS_QUESTIONS = [ + { + q: "How do I set up a custom financial goal?", + a: "Click New Goal from the Savings Targets card. Choose a category, set a target amount and date, and we'll calculate the monthly contribution needed.", + }, + { + q: "Can I track multiple goals at once?", + a: "Yes. Pro accounts can track unlimited goals. Basic accounts support up to 3 active goals.", + }, + { + q: "How are monthly contributions calculated?", + a: "We divide the remaining amount by the number of months until your target date, adjusted for your current savings rate and any auto-transfer schedules.", + }, +] + +function QuestionList({ + questions, +}: { + questions: { q: string; a: string }[] +}) { + return ( + + {questions.map((item, index) => ( + + {item.q} + {item.a} + + ))} + + ) +} + +export function Faq() { + return ( + + + + + + General + + + Billing + + + Goals + + + + + + + + + + + + + + + + + + + ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/preview-02/cards/front-door.tsx b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/front-door.tsx new file mode 100644 index 0000000..52a49b7 --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/front-door.tsx @@ -0,0 +1,41 @@ +import { Badge } from "@/registry/bases/base/ui/badge" +import { + Card, + CardAction, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/registry/bases/base/ui/card" +import { IconPlaceholder } from "@/routes/create/components/icon-placeholder" + +export function FrontDoor() { + return ( + + + Front Door + Smart Lock Pro + +
+ Locked + +
+
+
+ +
+ + Live + +
+
+
+ ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/preview-02/cards/index-investing.tsx b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/index-investing.tsx new file mode 100644 index 0000000..4139028 --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/index-investing.tsx @@ -0,0 +1,37 @@ +import { Button } from "@/registry/bases/base/ui/button" +import { + Card, + CardAction, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/registry/bases/base/ui/card" +import { IconPlaceholder } from "@/routes/create/components/icon-placeholder" + +export function IndexInvesting() { + return ( + + + Dollar-Cost Averaging + + A strategy for building wealth over time. + + + + + + Over time + + , this smooths out the average cost of your investments. When prices + drop, your fixed amount buys more shares. When prices rise, you buy + fewer. The result is a lower average cost per share compared to + lump-sum investing during volatile periods. + + + + ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/preview-02/cards/kitchen-island.tsx b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/kitchen-island.tsx new file mode 100644 index 0000000..735cb52 --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/kitchen-island.tsx @@ -0,0 +1,188 @@ + +import * as React from "react" + +import { + Card, + CardAction, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/registry/bases/base/ui/card" +import { + Item, + ItemActions, + ItemContent, + ItemGroup, + ItemMedia, + ItemTitle, +} from "@/registry/bases/base/ui/item" +import { Slider } from "@/registry/bases/base/ui/slider" +import { Switch } from "@/registry/bases/base/ui/switch" +import { + ToggleGroup, + ToggleGroupItem, +} from "@/registry/bases/base/ui/toggle-group" +import { IconPlaceholder } from "@/routes/create/components/icon-placeholder" + +const SCENES = { + cooking: { brightness: [90], colorTemp: [70], volume: [30], fade: [0] }, + dining: { brightness: [50], colorTemp: [40], volume: [20], fade: [60] }, + nightlight: { brightness: [15], colorTemp: [20], volume: [0], fade: [80] }, + focus: { brightness: [100], colorTemp: [85], volume: [0], fade: [0] }, +} as const + +export function KitchenIsland() { + const [enabled, setEnabled] = React.useState(true) + const [scene, setScene] = React.useState("cooking") + const [brightness, setBrightness] = React.useState([90]) + const [colorTemp, setColorTemp] = React.useState([70]) + const [volume, setVolume] = React.useState([30]) + const [fade, setFade] = React.useState([0]) + + const handleSceneChange = (value: string) => { + if (!value) return + setScene(value) + const preset = SCENES[value as keyof typeof SCENES] + setBrightness([...preset.brightness]) + setColorTemp([...preset.colorTemp]) + setVolume([...preset.volume]) + setFade([...preset.fade]) + } + + return ( + + + Kitchen Island + Hue Color Ambient + + + + + +
+ Scenes + handleSceneChange(value[0] ?? "cooking")} + variant="outline" + spacing={1} + className="flex-wrap" + > + + Cooking + + + Dining + + + Nightlight + + + Focus + + +
+ + + + + + + Brightness + + + + setBrightness(Array.isArray(value) ? [...value] : [value]) + } + max={100} + disabled={!enabled} + className="w-full" + /> + + + + + + + + Color Temp + + + + setColorTemp(Array.isArray(value) ? [...value] : [value]) + } + max={100} + disabled={!enabled} + /> + + + + + + + + Volume + + + + setVolume(Array.isArray(value) ? [...value] : [value]) + } + max={100} + disabled={!enabled} + /> + + + + + + + + Fade + + + + setFade(Array.isArray(value) ? [...value] : [value]) + } + max={100} + disabled={!enabled} + /> + + + +
+
+ ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/preview-02/cards/loading-card.tsx b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/loading-card.tsx new file mode 100644 index 0000000..556ca87 --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/loading-card.tsx @@ -0,0 +1,25 @@ +import { Card, CardContent, CardHeader } from "@/registry/bases/base/ui/card" +import { Skeleton } from "@/registry/bases/base/ui/skeleton" + +export function LoadingCard() { + return ( + + + + + + + +
+ + + +
+
+ + +
+
+
+ ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/preview-02/cards/new-milestone.tsx b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/new-milestone.tsx new file mode 100644 index 0000000..be2db04 --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/new-milestone.tsx @@ -0,0 +1,53 @@ + +import { Button } from "@/registry/bases/base/ui/button" +import { + Card, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from "@/registry/bases/base/ui/card" +import { Field, FieldGroup, FieldLabel } from "@/registry/bases/base/ui/field" +import { Input } from "@/registry/bases/base/ui/input" + +export function NewMilestone() { + return ( + + + Set a new milestone + + Define your financial target and we'll help you pace your + savings. + + + + + + Goal Name + + +
+ + Target Amount + + + + Target Date + + +
+
+
+ + + + +
+ ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/preview-02/cards/notification-settings.tsx b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/notification-settings.tsx new file mode 100644 index 0000000..4090d66 --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/notification-settings.tsx @@ -0,0 +1,106 @@ + +import * as React from "react" + +import { Button } from "@/registry/bases/base/ui/button" +import { + Card, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from "@/registry/bases/base/ui/card" +import { Checkbox } from "@/registry/bases/base/ui/checkbox" +import { + Field, + FieldContent, + FieldDescription, + FieldGroup, + FieldLabel, +} from "@/registry/bases/base/ui/field" + +const NOTIFICATIONS = [ + { + id: "transactions", + label: "Transaction alerts", + description: "Deposits, withdrawals, and transfers.", + defaultChecked: true, + }, + { + id: "security", + label: "Security alerts", + description: "Login attempts and account changes.", + defaultChecked: true, + }, + { + id: "goals", + label: "Goal milestones", + description: "Updates at 25%, 50%, 75%, and 100%.", + defaultChecked: false, + }, + { + id: "market", + label: "Market updates", + description: "Daily portfolio summary and price alerts.", + defaultChecked: false, + }, +] + +export function NotificationSettings() { + const [checked, setChecked] = React.useState>( + Object.fromEntries(NOTIFICATIONS.map((n) => [n.id, n.defaultChecked])) + ) + + const allChecked = NOTIFICATIONS.every((n) => checked[n.id]) + const someChecked = NOTIFICATIONS.some((n) => checked[n.id]) && !allChecked + + const handleSelectAll = (value: boolean) => { + setChecked(Object.fromEntries(NOTIFICATIONS.map((n) => [n.id, value]))) + } + + const handleToggle = (id: string, value: boolean) => { + setChecked((prev) => ({ ...prev, [id]: value })) + } + + return ( + + + Notifications + + Choose what you want to be notified about. + + + + + + handleSelectAll(!!v)} + /> + + Select all + + + {NOTIFICATIONS.map((n) => ( + + handleToggle(n.id, !!v)} + /> + + {n.label} + {n.description} + + + ))} + + + + + + + ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/preview-02/cards/payments.tsx b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/payments.tsx new file mode 100644 index 0000000..b26ba30 --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/payments.tsx @@ -0,0 +1,175 @@ + +import { + Breadcrumb, + BreadcrumbItem, + BreadcrumbLink, + BreadcrumbList, + BreadcrumbPage, + BreadcrumbSeparator, +} from "@/registry/bases/base/ui/breadcrumb" +import { Button } from "@/registry/bases/base/ui/button" +import { Card, CardContent, CardHeader } from "@/registry/bases/base/ui/card" +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/registry/bases/base/ui/dropdown-menu" +import { + Item, + ItemContent, + ItemDescription, + ItemGroup, + ItemMedia, + ItemTitle, +} from "@/registry/bases/base/ui/item" +import { IconPlaceholder } from "@/routes/create/components/icon-placeholder" + +export function Payments() { + return ( + + + + + + Home + + + + + } + > + + Account options + + + + Profile + Statements + Documents + + + + + + + Payments + + + + + + + }> + + + + + Change transfer limit + + Adjust how much you can send from your balance. + + + + + }> + + + + + Scheduled transfers + + Set up a transfer to send at a later date. + + + + + }> + + + + + Direct Debits + + Set up and manage regular payments. + + + + + }> + + + + + Recurring card payments + + Manage your repeated card transactions. + + + + + + + + ) +} diff --git a/apps/ui/src/registry/bases/base/blocks/preview-02/cards/payout-threshold.tsx b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/payout-threshold.tsx new file mode 100644 index 0000000..059ccc7 --- /dev/null +++ b/apps/ui/src/registry/bases/base/blocks/preview-02/cards/payout-threshold.tsx @@ -0,0 +1,121 @@ + +import * as React from "react" + +import { Button } from "@/registry/bases/base/ui/button" +import { + Card, + CardAction, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from "@/registry/bases/base/ui/card" +import { + Field, + FieldDescription, + FieldGroup, + FieldLabel, +} from "@/registry/bases/base/ui/field" +import { + Select, + SelectContent, + SelectGroup, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/registry/bases/base/ui/select" +import { Slider } from "@/registry/bases/base/ui/slider" +import { Textarea } from "@/registry/bases/base/ui/textarea" +import { IconPlaceholder } from "@/routes/create/components/icon-placeholder" + +const CURRENCIES = [ + { label: "USD — United States Dollar", value: "usd" }, + { label: "EUR — Euro", value: "eur" }, + { label: "GBP — British Pound", value: "gbp" }, + { label: "JPY — Japanese Yen", value: "jpy" }, +] + +export function PayoutThreshold() { + const [amount, setAmount] = React.useState([2500]) + + return ( + + + Payout Threshold + + Set the minimum balance required before a payout is triggered. + + + + + + + + + + Preferred Currency + + + + +
+ + Minimum Payout Amount + + + ${amount[0].toFixed(2)} + +
+ + setAmount(Array.isArray(value) ? [...value] : [value]) + } + min={50} + max={10000} + step={50} + /> +
+ $50 (MIN) + $10,000 (MAX) +
+
+ + Notes +