@gradeui/ui 0.8.0 → 0.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +6 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.js +26 -26
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +26 -26
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../lib/utils.ts","../components/ui/accordion.tsx","../components/ui/alert.tsx","../components/ui/app-shell.tsx","../components/ui/badge.tsx","../components/ui/button.tsx","../components/ui/calendar.tsx","../components/ui/card.tsx","../components/ui/checkbox.tsx","../components/ui/popover.tsx","../components/ui/date-picker.tsx","../components/ui/dialog.tsx","../components/ui/dropdown-menu.tsx","../components/ui/input.tsx","../components/ui/label.tsx","../components/ui/progress.tsx","../components/ui/radio-group.tsx","../components/ui/row.tsx","../components/ui/grid.tsx","../components/ui/flex.tsx","../components/ui/scroll-area.tsx","../components/ui/select.tsx","../components/ui/separator.tsx","../components/ui/sheet.tsx","../components/ui/skeleton.tsx","../components/ui/slider.tsx","../components/ui/stack.tsx","../components/ui/switch.tsx","../components/ui/table.tsx","../components/ui/tabs.tsx","../components/ui/textarea.tsx","../components/ui/tooltip.tsx","../components/ui/side-menu.tsx","../components/ui/top-menu.tsx","../components/ui/simple-tabs.tsx","../components/ui/media-surface.tsx","../components/ui/video-player.tsx","../components/ui/rive-player.tsx","../lib/three/post-composer.ts","../lib/three/scenes/space.ts","../lib/three/scenes/plasma.ts","../lib/three/scenes/voronoi.ts","../lib/three/scenes/synthwave.ts","../lib/three/shader-presets.ts","../lib/three/post-presets.ts","../lib/three/custom-fragment.ts","../components/ui/three-scene.tsx","../components/ui/shader-preset-preview.tsx","../components/ui/shader-preset-picker.tsx","../components/lenis-provider.tsx","../lib/themes/oklch.ts","../lib/themes/types.ts","../lib/themes/generator.ts","../lib/themes/inputs.ts","../lib/themes/apply.ts","../lib/themes/oklch-to-hex.ts","../lib/themes/export-md.ts","../lib/themes/index.ts","../components/grade-theme-provider.tsx","../components/grade-theme-switcher.tsx","../components/grade-mode-switcher.tsx","../components/theme-toggle.tsx"],"names":["cn","inputs","twMerge","clsx","Accordion","AccordionItem","se","className","props","ref","AccordionTrigger","children","ChevronDown","AccordionContent","alertVariants","cva","Alert","ve","variant","AlertTitle","AlertDescription","shellVariants","navVariants","mainVariants","AppShell","be","nav","asChild","Slot","AppShellNav","placement","sticky","AppShellMain","maxWidth","badgeVariants","Badge","rounded","Ar","buttonVariants","Button","ct","size","Calendar","classNames","showOutsideDays","captionLayout","buttonVariant","formatters","components","defaultClassNames","getDefaultClassNames","re","DayPicker","date","rootRef","orientation","ChevronLeftIcon","ChevronRightIcon","ChevronDownIcon","CalendarDayButton","day","modifiers","Card","Q","CardHeader","CardTitle","CardDescription","CardContent","CardFooter","Checkbox","De","Check","Popover","PopoverTrigger","PopoverAnchor","PopoverContent","Ke","align","sideOffset","DEFAULT_FORMAT","RANGE_FORMAT","DatePicker","value","onChange","placeholder","disabled","contentClassName","side","format","icon","ariaLabel","B","CalendarIcon","formatDate","DateRangePicker","numberOfMonths","hasFrom","Dialog","DialogTrigger","DialogPortal","DialogClose","DialogOverlay","K","DialogContent","X","DialogHeader","DialogFooter","DialogTitle","DialogDescription","DropdownMenu","DropdownMenuTrigger","DropdownMenuGroup","DropdownMenuPortal","DropdownMenuSub","DropdownMenuRadioGroup","DropdownMenuSubTrigger","k","inset","ChevronRight","DropdownMenuSubContent","DropdownMenuContent","DropdownMenuItem","DropdownMenuCheckboxItem","checked","DropdownMenuRadioItem","Circle","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuShortcut","Input","ut","type","labelVariants","Label","ft","Progress","ze","RadioGroup","xe","RadioGroupItem","rowVariants","Row","gt","gap","justify","wrap","gridVariants","Grid","ht","cols","flexVariants","Flex","yt","direction","ScrollArea","me","ScrollBar","Select","SelectGroup","SelectValue","SelectTrigger","S","SelectScrollUpButton","ChevronUp","SelectScrollDownButton","SelectContent","position","SelectLabel","SelectItem","SelectSeparator","Separator","vt","decorative","Sheet","O","SheetTrigger","SheetClose","SheetPortal","SheetOverlay","z","sheetVariants","SheetContent","SheetHeader","SheetFooter","SheetTitle","SheetDescription","Skeleton","Slider","Me","stackVariants","Stack","bt","Switch","je","Table","V","TableHeader","TableBody","TableFooter","TableRow","TableHead","TableCell","TableCaption","Tabs","TabsList","Te","TabsTrigger","TabsContent","Textarea","xt","TooltipProvider","Tooltip","TooltipTrigger","TooltipContent","Ye","SideMenuContext","useSideMenu","context","DefaultLink","href","SideMenu","header","collapsedHeader","sections","items","footer","controlledCollapsed","onCollapsedChange","collapsible","defaultCollapsed","activeItem","LinkComponent","internalCollapsed","setInternalCollapsed","collapsed","handleToggle","newCollapsed","ChevronLeft","item","SideMenuItemComponent","section","SideMenuSectionComponent","expanded","setExpanded","nested","isActive","itemClasses","content","element","b","TopMenu","breadcrumbs","showMobileMenu","onMobileMenuClick","leftContent","rightContent","Menu","crumb","index","TopMenuUser","name","email","avatarUrl","avatarContent","avatarClassName","open","setOpen","menuRef","handleClickOutside","event","TopMenuUserItem","onClick","TopMenuUserSection","SimpleTabsContext","P","useSimpleTabs","SimpleTabs","tabs","controlledActiveTab","defaultTab","onTabChange","tabsClassName","internalActiveTab","setInternalActiveTab","activeTab","handleTabChange","tabId","tab","SimpleTabsPanel","id","SimpleTabsRoot","SimpleTabsList","SimpleTabsTrigger","setActiveTab","SimpleTabsContent","aspectClass","radiusVar","MediaSurface","ee","aspect","radius","border","loading","onVisibilityChange","fallback","style","innerRef","el","io","entry","usePrefersReducedMotion","reduced","setReduced","mql","handler","e","VideoPlayer","W","src","controls","autoPlay","loop","muted","pauseOffscreen","poster","label","playbackRate","objectFit","videoRef","posterVisible","setPosterVisible","effectiveMuted","effectiveAutoPlay","handleVisibilityChange","visible","RivePlayer","H","stateMachines","artboard","fit","stateMachineInputs","Mod","setMod","error","setError","cancelled","m","RiveInner","useRive","Layout","Fit","Alignment","EventType","fitMap","rive","RiveComponent","playing","setPlaying","target","togglePlay","Pause","Play","createPostComposer","renderer","scene","camera","preset","width","height","composer","EffectComposer","RenderPass","bloom","BloomEffect","KernelSize","noise","NoiseEffect","BlendFunction","scanlines","ScanlineEffect","vignette","VignetteEffect","chromatic","ChromaticAberrationEffect","Qt","glitch","GlitchEffect","EffectPass","applyPreset","p","chromaOffset","w","h","STAR_COUNT","FIELD_DEPTH","FIELD_RADIUS","spaceScene","palette","positions","colors","zOffsets","primaryColor","accentColor","resetStar","i","randomZ","theta","r","x","y","geometry","material","stars","SPEED","STREAK_LEN","_elapsed","delta","pos","baseIdx","cam","primary","accent","col","FRAGMENT","VERTEX","plasmaScene","j","uniforms","quad","elapsed","voronoiScene","q","synthwaveScene","Z","sceneRegistry","shaderPresets","shaderPresetById","postPresets","defaultPostPreset","FRAGMENT_HEADER","VERTEX_FULLSCREEN","ShaderCompileError","log","source","precompileFragment","gl","shader","ok","buildFragmentShaderScene","userFragment","combined","U","DEFAULT_PALETTE","OKLCH_TRIPLET","HSL_TRIPLET","VAR_REF","resolveCssColor","input","host","effectiveInput","varRef","raw","probe","computed","canvas","ctx","g","resolvePalette","ThreeScene","G","fragmentShader","onShaderError","postPreset","paletteProp","createSceneProp","maxDpr","hostRef","ready","setReady","resolvedFactory","resolvedPostPresetId","livePalette","we","dpr","handle","err","postPresetObj","post","clock","rafId","running","tick","ro","themeObserver","next","sceneWithMouse","onPointerMove","ev","rect","liveRef","node","ShaderPresetPreview","oe","live","hideLabel","hovered","setHovered","shouldRender","ShaderPresetPicker","filterTags","columns","presets","Pe","t","selected","LenisProvider","lenisRef","useRef","useEffect","lenis","Lenis","raf","time","RAMP_KEYS","LIGHTNESS_CURVE","CHROMA_CURVE","hueToRamp","hue","chromaScale","normalizedHue","ramp","L","C","neutralRamp","FIXED_SEMANTIC","PURE_WHITE","PURE_BLACK","deriveAlertPair","base","mode","c","v","chroma","softC","deepL","deepC","softL","FONTS","ALL_MODES","INTENSITY_MULTIPLIER","buildChartPalette","hues","intensity","pC","aC","dC","norm","n","step","a","PURE","MODE_TOKENS","resolveToken","ramps","deriveColorsForMode","map","isLightBg","fixed","alertMode","s","hi","BASE_SCALE","SCALE_MULTIPLIER","resolveTypography","mult","rem","RADIUS_BASE","resolveRadius","DENSITY_FACTOR","resolveSpacing","SHADOW_PRESETS","resolveEffects","scale","ms","generateTheme","pureGray","neutralChroma","primaryChroma","accentChroma","neutral","chart","typography","spacing","effects","calmInput","energyInput","BUILT_IN_INPUTS","colorVars","themeToCSSVars","theme","flattenRamp","out","applyThemeToRoot","root","vars","key","oklchToHex","triplet","rgb","match","rowTriplet","parts","l","oklch","hex","rampTable","lines","semanticTable","rows","lightHex","darkHex","stringifyInput","generateThemeMarkdown","mapToken","token","USAGE_HINTS","hueDerived","fixedSemantic","chartRows","feelNotes","notes","displayFont","downloadThemeMarkdown","blob","url","builtInThemes","defaultThemeId","getTheme","userInput","loadUserThemeInput","listThemes","listUserThemes","USER_THEMES_KEY","readUserThemeStore","parsed","writeUserThemeStore","store","saveUserTheme","deleteUserTheme","duplicateTheme","sourceId","newId","newName","copy","STORAGE_THEME_KEY","STORAGE_MODE_KEY","DARK_MODES","GRADE_PRE_HYDRATION_SCRIPT","GradeThemeContext","GradeThemeProvider","defaultTheme","defaultMode","themeId","setThemeIdState","setModeState","revision","setRevision","storedTheme","storedMode","prefersDark","mq","listener","setThemeId","setMode","saveAndActivate","deleteTheme","current","refresh","useGradeTheme","useMaybeGradeTheme","GradeThemeSwitcher","themes","Palette","Download","active","isBuiltIn","primary500","accent500","neutral500","Trash2","MODES","SunDim","Sun","Moon","MoonStar","GradeModeSwitcher","Ne","Icon","tooltip","ThemeToggle","isDark"],"mappings":"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","file":"index.mjs","sourcesContent":["import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as AccordionPrimitive from \"@radix-ui/react-accordion\";\nimport { ChevronDown } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\n\nconst Accordion = AccordionPrimitive.Root;\n\nconst AccordionItem = React.forwardRef<\n React.ComponentRef<typeof AccordionPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <AccordionPrimitive.Item\n ref={ref}\n className={cn(\"border-b\", className)}\n {...props}\n />\n));\nAccordionItem.displayName = \"AccordionItem\";\n\nconst AccordionTrigger = React.forwardRef<\n React.ComponentRef<typeof AccordionPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronDown className=\"h-4 w-4 shrink-0 transition-transform duration-200\" />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n));\nAccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;\n\nconst AccordionContent = React.forwardRef<\n React.ComponentRef<typeof AccordionPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <AccordionPrimitive.Content\n ref={ref}\n className=\"overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\"\n {...props}\n >\n <div className={cn(\"pb-4 pt-0\", className)}>{children}</div>\n </AccordionPrimitive.Content>\n));\nAccordionContent.displayName = AccordionPrimitive.Content.displayName;\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent };\n","import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"@/lib/utils\";\n\nconst alertVariants = cva(\n // Each variant uses the theme's semantic tokens instead of hard-coded\n // rds-* classes. Status variants reference dedicated `*-soft` (surface)\n // and `*-deep` (text + icon) tokens — those are generated from the status\n // colour by the theme pipeline, so tweaking the brand feel only requires\n // changing the mapping in one place (lib/themes/oklch.ts).\n \"relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4\",\n {\n variants: {\n variant: {\n default: \"bg-background text-foreground [&>svg]:text-foreground\",\n destructive:\n \"border-destructive/30 bg-destructive-soft text-destructive-deep [&>svg]:text-destructive-deep\",\n success:\n \"border-success/30 bg-success-soft text-success-deep [&>svg]:text-success-deep\",\n warning:\n \"border-warning/30 bg-warning-soft text-warning-deep [&>svg]:text-warning-deep\",\n info:\n \"border-info/30 bg-info-soft text-info-deep [&>svg]:text-info-deep\",\n highlight:\n // Highlight is yellow — direct yellow text is unreadable, so text\n // stays on `--foreground`; the icon picks up the deepened shade.\n \"border-highlight/30 bg-highlight-soft text-foreground [&>svg]:text-highlight-deep\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n);\n\nconst Alert = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>\n>(({ className, variant, ...props }, ref) => (\n <div\n ref={ref}\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n));\nAlert.displayName = \"Alert\";\n\nconst AlertTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h5\n ref={ref}\n className={cn(\"mb-1 font-medium leading-none tracking-tight\", className)}\n {...props}\n />\n));\nAlertTitle.displayName = \"AlertTitle\";\n\nconst AlertDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"text-sm [&_p]:leading-relaxed\", className)}\n {...props}\n />\n));\nAlertDescription.displayName = \"AlertDescription\";\n\nexport { Alert, AlertTitle, AlertDescription };\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\n\n/**\n * AppShell — top-level page scaffold for an app-like layout.\n *\n * The Studio was missing a named \"app layout\" primitive — without one,\n * agent-generated pages either freestyle grids or reinvent the nav-plus-\n * content structure every time. AppShell gives them one component with a\n * small, bounded set of layout variants so vibe-coded prototypes land in a\n * recognisable shape: a nav region (top, side, or none) plus a main region\n * that optionally constrains its content width.\n *\n * It is deliberately *just* structure: no collapse state, no context, no\n * runtime JS. Nav content is whatever the caller drops in — a SideMenu,\n * a TopMenu, or a hand-rolled `<nav>`. Keeping it dumb means it renders\n * fine on the server and can be styled by consumers without fighting a\n * behaviour model.\n *\n * Variants:\n * - `nav` — \"none\" | \"top\" | \"side\". Chooses the grid structure.\n * - `maxWidth` — \"full\" | \"container\". Caps the main region width for\n * marketing-style pages without the caller having to wrap\n * their content in a max-w-* div.\n * - `sticky` — boolean. Sticks top nav to the viewport top / side nav\n * to the viewport when the page scrolls. Sensible default\n * for app chrome.\n */\nconst shellVariants = cva(\"rds-app-shell min-h-screen w-full bg-background text-foreground\", {\n variants: {\n nav: {\n none: \"block\",\n top: \"grid grid-rows-[auto_1fr]\",\n side: \"grid grid-cols-[auto_1fr]\",\n },\n },\n defaultVariants: {\n nav: \"none\",\n },\n});\n\nconst navVariants = cva(\"rds-app-shell-nav\", {\n variants: {\n placement: {\n top: \"border-b bg-background\",\n side: \"border-r bg-background\",\n none: \"hidden\",\n },\n sticky: {\n true: \"\",\n false: \"\",\n },\n },\n compoundVariants: [\n {\n placement: \"top\",\n sticky: true,\n className: \"sticky top-0 z-30\",\n },\n {\n placement: \"side\",\n sticky: true,\n className: \"sticky top-0 h-screen self-start\",\n },\n ],\n defaultVariants: {\n placement: \"top\",\n sticky: true,\n },\n});\n\nconst mainVariants = cva(\"rds-app-shell-main min-w-0\", {\n variants: {\n maxWidth: {\n full: \"w-full\",\n container: \"w-full mx-auto max-w-7xl px-4 md:px-6 lg:px-8\",\n },\n },\n defaultVariants: {\n maxWidth: \"full\",\n },\n});\n\n// ---------- AppShell root ----------\n\nexport interface AppShellProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof shellVariants> {\n /** Render as the single child element via Radix Slot — lets you stamp the\n * shell layout onto an existing root tag without an extra wrapper. */\n asChild?: boolean;\n}\n\nconst AppShell = React.forwardRef<HTMLDivElement, AppShellProps>(\n ({ className, nav, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"div\";\n return (\n <Comp\n ref={ref}\n data-gds-part=\"app-shell\"\n data-nav={nav ?? \"none\"}\n className={cn(shellVariants({ nav, className }))}\n {...props}\n />\n );\n }\n);\nAppShell.displayName = \"AppShell\";\n\n// ---------- Nav slot ----------\n\nexport interface AppShellNavProps\n extends React.HTMLAttributes<HTMLElement>,\n VariantProps<typeof navVariants> {\n asChild?: boolean;\n}\n\nconst AppShellNav = React.forwardRef<HTMLElement, AppShellNavProps>(\n ({ className, placement, sticky, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"nav\";\n return (\n <Comp\n ref={ref as React.Ref<HTMLElement>}\n data-gds-part=\"app-shell-nav\"\n data-placement={placement ?? \"top\"}\n className={cn(navVariants({ placement, sticky, className }))}\n {...props}\n />\n );\n }\n);\nAppShellNav.displayName = \"AppShellNav\";\n\n// ---------- Main slot ----------\n\nexport interface AppShellMainProps\n extends React.HTMLAttributes<HTMLElement>,\n VariantProps<typeof mainVariants> {\n asChild?: boolean;\n}\n\nconst AppShellMain = React.forwardRef<HTMLElement, AppShellMainProps>(\n ({ className, maxWidth, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"main\";\n return (\n <Comp\n ref={ref as React.Ref<HTMLElement>}\n data-gds-part=\"app-shell-main\"\n className={cn(mainVariants({ maxWidth, className }))}\n {...props}\n />\n );\n }\n);\nAppShellMain.displayName = \"AppShellMain\";\n\nexport {\n AppShell,\n AppShellNav,\n AppShellMain,\n shellVariants,\n navVariants,\n mainVariants,\n};\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst badgeVariants = cva(\n \"inline-flex items-center gap-1 border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 [&_svg]:size-3 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n destructive:\n \"border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80\",\n outline: \"text-foreground\",\n // Semantic solid variants\n highlight:\n \"border-transparent bg-rds-yellow-400 text-rds-gray-900 shadow hover:bg-rds-yellow-500\",\n success:\n \"border-transparent bg-rds-green-500 text-rds-gray-900 shadow hover:bg-rds-green-600\",\n warning:\n \"border-transparent bg-orange-500 text-white shadow hover:bg-orange-600\",\n info:\n \"border-transparent bg-blue-500 text-white shadow hover:bg-blue-600\",\n // Semantic soft variants — colored text on tinted background\n \"success-soft\":\n \"border-rds-green-500/20 bg-rds-green-500/10 text-rds-green-600 dark:text-rds-green-400\",\n \"warning-soft\":\n \"border-orange-500/20 bg-orange-500/10 text-orange-600 dark:text-orange-400\",\n \"destructive-soft\":\n \"border-destructive/20 bg-destructive/10 text-destructive dark:text-red-400\",\n \"info-soft\":\n \"border-blue-500/20 bg-blue-500/10 text-blue-600 dark:text-blue-400\",\n \"highlight-soft\":\n \"border-rds-yellow-500/20 bg-rds-yellow-400/10 text-rds-yellow-600 dark:text-rds-yellow-400\",\n // Outline variants - just border and text, no background\n \"success-outline\":\n \"border-rds-green-500/50 bg-transparent text-rds-green-600 dark:text-rds-green-400\",\n \"warning-outline\":\n \"border-orange-500/50 bg-transparent text-orange-600 dark:text-orange-400\",\n \"destructive-outline\":\n \"border-destructive/50 bg-transparent text-destructive dark:text-red-400\",\n \"info-outline\":\n \"border-blue-500/50 bg-transparent text-blue-600 dark:text-blue-400\",\n },\n rounded: {\n default: \"rounded-md\",\n full: \"rounded-full\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n rounded: \"default\",\n },\n }\n)\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, rounded, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant, rounded }), className)} {...props} />\n )\n}\n\nexport { Badge, badgeVariants }\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-md px-8\",\n icon: \"h-9 w-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\"\n return (\n <Comp\n className={cn(\"rds-button\", buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n","\"use client\"\n\nimport * as React from \"react\"\nimport {\n ChevronDownIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n} from \"lucide-react\"\nimport { DayButton, DayPicker, getDefaultClassNames } from \"react-day-picker\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button, buttonVariants } from \"@/components/ui/button\"\n\nfunction Calendar({\n className,\n classNames,\n showOutsideDays = true,\n captionLayout = \"label\",\n buttonVariant = \"ghost\",\n formatters,\n components,\n ...props\n}: React.ComponentProps<typeof DayPicker> & {\n buttonVariant?: React.ComponentProps<typeof Button>[\"variant\"]\n}) {\n const defaultClassNames = getDefaultClassNames()\n\n return (\n <DayPicker\n showOutsideDays={showOutsideDays}\n className={cn(\n \"bg-background group/calendar p-3 [--cell-size:2rem] [[data-slot=card-content]_&]:bg-transparent [[data-slot=popover-content]_&]:bg-transparent\",\n String.raw`rtl:**:[.rdp-button\\_next>svg]:rotate-180`,\n String.raw`rtl:**:[.rdp-button\\_previous>svg]:rotate-180`,\n className\n )}\n captionLayout={captionLayout}\n formatters={{\n formatMonthDropdown: (date) =>\n date.toLocaleString(\"default\", { month: \"short\" }),\n ...formatters,\n }}\n classNames={{\n root: cn(\"w-fit\", defaultClassNames.root),\n months: cn(\n \"relative flex flex-col gap-4 md:flex-row\",\n defaultClassNames.months\n ),\n month: cn(\"flex w-full flex-col gap-4\", defaultClassNames.month),\n nav: cn(\n \"absolute inset-x-0 top-0 flex w-full items-center justify-between gap-1\",\n defaultClassNames.nav\n ),\n button_previous: cn(\n buttonVariants({ variant: buttonVariant }),\n \"h-[--cell-size] w-[--cell-size] select-none p-0 aria-disabled:opacity-50\",\n defaultClassNames.button_previous\n ),\n button_next: cn(\n buttonVariants({ variant: buttonVariant }),\n \"h-[--cell-size] w-[--cell-size] select-none p-0 aria-disabled:opacity-50\",\n defaultClassNames.button_next\n ),\n month_caption: cn(\n \"flex h-[--cell-size] w-full items-center justify-center px-[--cell-size]\",\n defaultClassNames.month_caption\n ),\n dropdowns: cn(\n \"flex h-[--cell-size] w-full items-center justify-center gap-1.5 text-sm font-medium\",\n defaultClassNames.dropdowns\n ),\n dropdown_root: cn(\n \"has-focus:border-ring border-input shadow-xs has-focus:ring-ring/50 has-focus:ring-[3px] relative rounded-md border\",\n defaultClassNames.dropdown_root\n ),\n dropdown: cn(\n \"bg-popover absolute inset-0 opacity-0\",\n defaultClassNames.dropdown\n ),\n caption_label: cn(\n \"select-none font-medium\",\n captionLayout === \"label\"\n ? \"text-sm\"\n : \"[&>svg]:text-muted-foreground flex h-8 items-center gap-1 rounded-md pl-2 pr-1 text-sm [&>svg]:size-3.5\",\n defaultClassNames.caption_label\n ),\n table: \"w-full border-collapse\",\n weekdays: cn(\"flex\", defaultClassNames.weekdays),\n weekday: cn(\n \"text-muted-foreground flex-1 select-none rounded-md text-[0.8rem] font-normal\",\n defaultClassNames.weekday\n ),\n week: cn(\"mt-2 flex w-full\", defaultClassNames.week),\n week_number_header: cn(\n \"w-[--cell-size] select-none\",\n defaultClassNames.week_number_header\n ),\n week_number: cn(\n \"text-muted-foreground select-none text-[0.8rem]\",\n defaultClassNames.week_number\n ),\n day: cn(\n \"group/day relative aspect-square h-full w-full select-none p-0 text-center [&:first-child[data-selected=true]_button]:rounded-l-md [&:last-child[data-selected=true]_button]:rounded-r-md\",\n defaultClassNames.day\n ),\n range_start: cn(\n \"bg-accent rounded-l-md\",\n defaultClassNames.range_start\n ),\n range_middle: cn(\"rounded-none\", defaultClassNames.range_middle),\n range_end: cn(\"bg-accent rounded-r-md\", defaultClassNames.range_end),\n today: cn(\n \"bg-accent text-accent-foreground rounded-md data-[selected=true]:rounded-none\",\n defaultClassNames.today\n ),\n outside: cn(\n \"text-muted-foreground aria-selected:text-muted-foreground\",\n defaultClassNames.outside\n ),\n disabled: cn(\n \"text-muted-foreground opacity-50\",\n defaultClassNames.disabled\n ),\n hidden: cn(\"invisible\", defaultClassNames.hidden),\n ...classNames,\n }}\n components={{\n Root: ({ className, rootRef, ...props }) => {\n return (\n <div\n data-slot=\"calendar\"\n ref={rootRef}\n className={cn(className)}\n {...props}\n />\n )\n },\n Chevron: ({ className, orientation, ...props }) => {\n if (orientation === \"left\") {\n return (\n <ChevronLeftIcon className={cn(\"size-4\", className)} {...props} />\n )\n }\n\n if (orientation === \"right\") {\n return (\n <ChevronRightIcon\n className={cn(\"size-4\", className)}\n {...props}\n />\n )\n }\n\n return (\n <ChevronDownIcon className={cn(\"size-4\", className)} {...props} />\n )\n },\n DayButton: CalendarDayButton,\n WeekNumber: ({ children, ...props }) => {\n return (\n <td {...props}>\n <div className=\"flex size-[--cell-size] items-center justify-center text-center\">\n {children}\n </div>\n </td>\n )\n },\n ...components,\n }}\n {...props}\n />\n )\n}\n\nfunction CalendarDayButton({\n className,\n day,\n modifiers,\n ...props\n}: React.ComponentProps<typeof DayButton>) {\n const defaultClassNames = getDefaultClassNames()\n\n const ref = React.useRef<HTMLButtonElement>(null)\n React.useEffect(() => {\n if (modifiers.focused) ref.current?.focus()\n }, [modifiers.focused])\n\n return (\n <Button\n ref={ref}\n variant=\"ghost\"\n size=\"icon\"\n data-day={`${day.date.getFullYear()}-${String(day.date.getMonth() + 1).padStart(2, \"0\")}-${String(day.date.getDate()).padStart(2, \"0\")}`}\n data-selected-single={\n modifiers.selected &&\n !modifiers.range_start &&\n !modifiers.range_end &&\n !modifiers.range_middle\n }\n data-range-start={modifiers.range_start}\n data-range-end={modifiers.range_end}\n data-range-middle={modifiers.range_middle}\n className={cn(\n \"data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground data-[range-middle=true]:bg-accent data-[range-middle=true]:text-accent-foreground data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground group-data-[focused=true]/day:border-ring group-data-[focused=true]/day:ring-ring/50 flex aspect-square h-auto w-full min-w-[--cell-size] flex-col gap-1 font-normal leading-none data-[range-end=true]:rounded-md data-[range-middle=true]:rounded-none data-[range-start=true]:rounded-md group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:ring-[3px] [&>span]:text-xs [&>span]:opacity-70\",\n defaultClassNames.day,\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Calendar, CalendarDayButton }\n","import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-gds-part=\"card\"\n className={cn(\n \"rds-card rounded-xl border bg-card text-card-foreground shadow\",\n className\n )}\n {...props}\n />\n))\nCard.displayName = \"Card\"\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-gds-part=\"card-header\"\n className={cn(\"flex flex-col space-y-1.5 p-6\", className)}\n {...props}\n />\n))\nCardHeader.displayName = \"CardHeader\"\n\nconst CardTitle = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-gds-part=\"card-title\"\n className={cn(\"font-semibold leading-none tracking-tight\", className)}\n {...props}\n />\n))\nCardTitle.displayName = \"CardTitle\"\n\nconst CardDescription = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-gds-part=\"card-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n))\nCardDescription.displayName = \"CardDescription\"\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-gds-part=\"card-content\"\n className={cn(\"p-6 pt-0\", className)}\n {...props}\n />\n))\nCardContent.displayName = \"CardContent\"\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-gds-part=\"card-footer\"\n className={cn(\"flex items-center p-6 pt-0\", className)}\n {...props}\n />\n))\nCardFooter.displayName = \"CardFooter\"\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\";\nimport { Check } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\n\nconst Checkbox = React.forwardRef<\n React.ComponentRef<typeof CheckboxPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <CheckboxPrimitive.Root\n ref={ref}\n className={cn(\n // Fixed 3px radius so the checkbox always reads as a rounded square —\n // even under \"round\"/\"pill\" themes where rounded-sm would otherwise\n // derive from a large --radius and turn it circular (a radio button\n // look). Override via className if you really want it circular.\n \"rds-checkbox peer h-4 w-4 shrink-0 rounded-[3px] border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground\",\n className\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n className={cn(\"flex items-center justify-center text-current\")}\n >\n <Check className=\"h-4 w-4\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n));\nCheckbox.displayName = CheckboxPrimitive.Root.displayName;\n\nexport { Checkbox };\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Popover = PopoverPrimitive.Root\n\nconst PopoverTrigger = PopoverPrimitive.Trigger\n\nconst PopoverAnchor = PopoverPrimitive.Anchor\n\nconst PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = \"center\", sideOffset = 4, ...props }, ref) => (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-popover-content-transform-origin]\",\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n))\nPopoverContent.displayName = PopoverPrimitive.Content.displayName\n\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor }\n","\"use client\"\n\n/**\n * DatePicker + DateRangePicker\n *\n * Sealed complex components built on top of the Popover + Button + Calendar\n * primitives. Consumers get a single import with a `value` / `onChange`\n * contract — no need to know about Popover, DayPicker, or date-fns.\n *\n * The primitives remain exported from the barrel so anyone who needs a\n * different trigger, different positioning, or a custom layout can still\n * compose their own — see `apps/docs/app/components/date-picker/page.tsx`\n * for the hand-assembled recipe.\n *\n * API:\n * <DatePicker value={date} onChange={setDate} />\n * <DatePicker value={date} onChange={setDate} format=\"PP\" placeholder=\"...\" />\n * <DateRangePicker value={range} onChange={setRange} numberOfMonths={2} />\n *\n * The `value` / `onChange` shape matches react-day-picker's `selected` /\n * `onSelect` internally — we just rename them so consumers speak form.\n */\n\nimport * as React from \"react\"\nimport { format as formatDate } from \"date-fns\"\nimport { CalendarIcon } from \"lucide-react\"\nimport type { DateRange } from \"react-day-picker\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport { Calendar } from \"@/components/ui/calendar\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@/components/ui/popover\"\n\ntype PopoverAlign = \"start\" | \"center\" | \"end\"\ntype PopoverSide = \"top\" | \"right\" | \"bottom\" | \"left\"\n\n// Props shared by both DatePicker and DateRangePicker.\ninterface DatePickerBaseProps {\n /** Placeholder text shown when no date is selected. */\n placeholder?: string\n /** Disable the trigger. */\n disabled?: boolean\n /** Classes on the outer trigger button. */\n className?: string\n /** Classes forwarded to PopoverContent. */\n contentClassName?: string\n /** Forwarded to PopoverContent — which edge to align to. Defaults to \"start\". */\n align?: PopoverAlign\n /** Forwarded to PopoverContent — which side of the trigger to render on. */\n side?: PopoverSide\n /**\n * date-fns format string for the trigger label. Defaults to \"PPP\"\n * (e.g. \"April 19th, 2026\"). Pass \"PP\" for shorter \"Apr 19, 2026\".\n */\n format?: string\n /** Forwarded to the underlying `react-day-picker` Calendar. */\n captionLayout?: React.ComponentProps<typeof Calendar>[\"captionLayout\"]\n /** Icon shown in the trigger. Defaults to lucide's CalendarIcon. */\n icon?: React.ReactNode\n /** Accessible label for screen readers when no date is selected. */\n \"aria-label\"?: string\n}\n\nexport interface DatePickerProps extends DatePickerBaseProps {\n /** The selected date, or undefined when empty. */\n value?: Date\n /** Called when the user selects or clears the date. */\n onChange?: (date: Date | undefined) => void\n}\n\nexport interface DateRangePickerProps extends DatePickerBaseProps {\n /** The selected range, or undefined when empty. */\n value?: DateRange\n /** Called when the user selects or clears the range. */\n onChange?: (range: DateRange | undefined) => void\n /** Number of months to show side-by-side. Defaults to 2. */\n numberOfMonths?: number\n}\n\nconst DEFAULT_FORMAT = \"PPP\"\nconst RANGE_FORMAT = \"LLL dd, y\"\n\nfunction DatePicker({\n value,\n onChange,\n placeholder = \"Pick a date\",\n disabled,\n className,\n contentClassName,\n align = \"start\",\n side,\n format = DEFAULT_FORMAT,\n captionLayout,\n icon,\n \"aria-label\": ariaLabel,\n}: DatePickerProps) {\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={disabled}\n aria-label={ariaLabel ?? (value ? undefined : placeholder)}\n data-empty={!value}\n className={cn(\n \"w-[280px] justify-start text-left font-normal data-[empty=true]:text-muted-foreground\",\n className\n )}\n >\n {icon ?? <CalendarIcon className=\"mr-2 h-4 w-4\" aria-hidden />}\n {value ? formatDate(value, format) : <span>{placeholder}</span>}\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className={cn(\"w-auto p-0\", contentClassName)}\n align={align}\n side={side}\n >\n <Calendar\n mode=\"single\"\n selected={value}\n onSelect={onChange}\n captionLayout={captionLayout}\n initialFocus\n />\n </PopoverContent>\n </Popover>\n )\n}\n\nfunction DateRangePicker({\n value,\n onChange,\n placeholder = \"Pick a date range\",\n disabled,\n className,\n contentClassName,\n align = \"start\",\n side,\n format = RANGE_FORMAT,\n captionLayout,\n icon,\n numberOfMonths = 2,\n \"aria-label\": ariaLabel,\n}: DateRangePickerProps) {\n const hasFrom = !!value?.from\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={disabled}\n aria-label={ariaLabel ?? (hasFrom ? undefined : placeholder)}\n data-empty={!hasFrom}\n className={cn(\n \"w-[300px] justify-start text-left font-normal data-[empty=true]:text-muted-foreground\",\n className\n )}\n >\n {icon ?? <CalendarIcon className=\"mr-2 h-4 w-4\" aria-hidden />}\n {value?.from ? (\n value.to ? (\n <>\n {formatDate(value.from, format)} –{\" \"}\n {formatDate(value.to, format)}\n </>\n ) : (\n formatDate(value.from, format)\n )\n ) : (\n <span>{placeholder}</span>\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className={cn(\"w-auto p-0\", contentClassName)}\n align={align}\n side={side}\n >\n <Calendar\n mode=\"range\"\n selected={value}\n onSelect={onChange}\n defaultMonth={value?.from}\n numberOfMonths={numberOfMonths}\n captionLayout={captionLayout}\n initialFocus\n />\n </PopoverContent>\n </Popover>\n )\n}\n\nexport { DatePicker, DateRangePicker }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Dialog = DialogPrimitive.Root\n\nconst DialogTrigger = DialogPrimitive.Trigger\n\nconst DialogPortal = DialogPrimitive.Portal\n\nconst DialogClose = DialogPrimitive.Close\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n))\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\n className\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n))\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\nconst DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n)\nDialogHeader.displayName = \"DialogHeader\"\n\nconst DialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n)\nDialogFooter.displayName = \"DialogFooter\"\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight\",\n className\n )}\n {...props}\n />\n))\nDialogTitle.displayName = DialogPrimitive.Title.displayName\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n))\nDialogDescription.displayName = DialogPrimitive.Description.displayName\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogTrigger,\n DialogClose,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst DropdownMenu = DropdownMenuPrimitive.Root\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n \"flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto\" />\n </DropdownMenuPrimitive.SubTrigger>\n))\nDropdownMenuSubTrigger.displayName =\n DropdownMenuPrimitive.SubTrigger.displayName\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuSubContent.displayName =\n DropdownMenuPrimitive.SubContent.displayName\n\nconst DropdownMenuContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 max-h-[var(--radix-dropdown-menu-content-available-height)] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]\",\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n))\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\n\nconst DropdownMenuItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&>svg]:size-4 [&>svg]:shrink-0\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n))\nDropdownMenuCheckboxItem.displayName =\n DropdownMenuPrimitive.CheckboxItem.displayName\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n))\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn(\n \"px-2 py-1.5 text-sm font-semibold\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n))\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\n\nconst DropdownMenuShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn(\"ml-auto text-xs tracking-widest opacity-60\", className)}\n {...props}\n />\n )\n}\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\"\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n}\n","import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className\n )}\n ref={ref}\n {...props}\n />\n )\n }\n)\nInput.displayName = \"Input\"\n\nexport { Input }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst labelVariants = cva(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n)\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &\n VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root\n ref={ref}\n className={cn(labelVariants(), className)}\n {...props}\n />\n))\nLabel.displayName = LabelPrimitive.Root.displayName\n\nexport { Label }\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as ProgressPrimitive from \"@radix-ui/react-progress\";\nimport { cn } from \"@/lib/utils\";\n\nconst Progress = React.forwardRef<\n React.ComponentRef<typeof ProgressPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ProgressPrimitive.Root>\n>(({ className, value, ...props }, ref) => (\n <ProgressPrimitive.Root\n ref={ref}\n className={cn(\n \"relative h-4 w-full overflow-hidden rounded-full bg-secondary\",\n className\n )}\n {...props}\n >\n <ProgressPrimitive.Indicator\n className=\"h-full w-full flex-1 bg-primary transition-all\"\n style={{ transform: `translateX(-${100 - (value || 0)}%)` }}\n />\n </ProgressPrimitive.Root>\n));\nProgress.displayName = ProgressPrimitive.Root.displayName;\n\nexport { Progress };\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as RadioGroupPrimitive from \"@radix-ui/react-radio-group\";\nimport { Circle } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\n\nconst RadioGroup = React.forwardRef<\n React.ComponentRef<typeof RadioGroupPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root>\n>(({ className, ...props }, ref) => {\n return (\n <RadioGroupPrimitive.Root\n className={cn(\"grid gap-2\", className)}\n {...props}\n ref={ref}\n />\n );\n});\nRadioGroup.displayName = RadioGroupPrimitive.Root.displayName;\n\nconst RadioGroupItem = React.forwardRef<\n React.ComponentRef<typeof RadioGroupPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item>\n>(({ className, ...props }, ref) => {\n return (\n <RadioGroupPrimitive.Item\n ref={ref}\n className={cn(\n \"aspect-square h-4 w-4 rounded-full border border-primary text-primary ring-offset-background focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n >\n <RadioGroupPrimitive.Indicator className=\"flex items-center justify-center\">\n <Circle className=\"h-2.5 w-2.5 fill-current text-current\" />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n );\n});\nRadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName;\n\nexport { RadioGroup, RadioGroupItem };\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\n\n/**\n * Row — horizontal layout primitive.\n *\n * The partner to Stack. Use for button groups, inline form layouts,\n * split hero/logo rows, anything on one line. The default `align=\"center\"`\n * matches what most real rows want — vertically-centred icon-plus-text,\n * centred button groups. `justify` covers the main-axis distribution\n * explicitly so the agent doesn't reach for `ml-auto` to push things\n * apart.\n *\n * Distinct from a two-pane Split: Row is for evenly flowing children\n * with a shared gap; Split enforces an explicit pane ratio (1/3 + 2/3\n * etc.) and is a separate primitive.\n */\nconst rowVariants = cva(\"rds-row flex flex-row\", {\n variants: {\n gap: {\n none: \"gap-0\",\n xs: \"gap-1\",\n sm: \"gap-2\",\n md: \"gap-4\",\n lg: \"gap-6\",\n xl: \"gap-8\",\n \"2xl\": \"gap-12\",\n },\n align: {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n baseline: \"items-baseline\",\n },\n justify: {\n start: \"justify-start\",\n center: \"justify-center\",\n end: \"justify-end\",\n between: \"justify-between\",\n around: \"justify-around\",\n evenly: \"justify-evenly\",\n },\n wrap: {\n true: \"flex-wrap\",\n false: \"flex-nowrap\",\n },\n },\n defaultVariants: {\n gap: \"md\",\n align: \"center\",\n justify: \"start\",\n wrap: false,\n },\n});\n\nexport interface RowProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof rowVariants> {\n /** When true, render as the single child element via Radix Slot — lets\n * you stamp Row's layout classes onto an existing semantic tag without\n * nesting an extra `<div>`. */\n asChild?: boolean;\n}\n\nconst Row = React.forwardRef<HTMLDivElement, RowProps>(\n (\n { className, gap, align, justify, wrap, asChild = false, ...props },\n ref\n ) => {\n const Comp = asChild ? Slot : \"div\";\n return (\n <Comp\n ref={ref}\n data-gds-part=\"row\"\n className={cn(rowVariants({ gap, align, justify, wrap, className }))}\n {...props}\n />\n );\n }\n);\nRow.displayName = \"Row\";\n\nexport { Row, rowVariants };\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\n\n/**\n * Grid — 2D layout primitive. The partner to Stack and Row.\n *\n * Stack handles vertical, Row handles horizontal, Grid handles the\n * responsive 2D case — most commonly a set of equal-width tiles (stat\n * cards, feature cards, pricing columns) that needs to collapse\n * gracefully on narrow viewports. Without this primitive, every\n * vibe-coded dashboard reinvents `grid grid-cols-1 md:grid-cols-2\n * lg:grid-cols-4` and the settings panel has nothing to mutate.\n *\n * `cols` names the DESIRED desktop column count. Each value is a\n * baked-in responsive ladder that matches the standard pattern for that\n * count (1→2→N for small counts, 2→3→N for denser grids) so the model\n * just writes `<Grid cols=\"4\">` and gets the same behaviour it would\n * hand-roll. If you need bespoke breakpoints, override via `className`.\n *\n * Sharing the `gap` / `align` scale with Stack and Row is deliberate:\n * when the Studio panel offers a \"switch layout type\" control between\n * Stack / Row / Grid, those props transfer cleanly — only `cols`\n * (Grid-only) and `justify` / `wrap` (Row-only) are lost.\n */\nconst gridVariants = cva(\"rds-grid grid\", {\n variants: {\n cols: {\n \"1\": \"grid-cols-1\",\n \"2\": \"grid-cols-1 md:grid-cols-2\",\n \"3\": \"grid-cols-1 sm:grid-cols-2 md:grid-cols-3\",\n \"4\": \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-4\",\n \"5\": \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-5\",\n \"6\": \"grid-cols-2 sm:grid-cols-3 lg:grid-cols-6\",\n \"12\": \"grid-cols-4 md:grid-cols-6 lg:grid-cols-12\",\n },\n gap: {\n none: \"gap-0\",\n xs: \"gap-1\",\n sm: \"gap-2\",\n md: \"gap-4\",\n lg: \"gap-6\",\n xl: \"gap-8\",\n \"2xl\": \"gap-12\",\n },\n align: {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n },\n },\n defaultVariants: {\n cols: \"3\",\n gap: \"md\",\n align: \"stretch\",\n },\n});\n\nexport interface GridProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof gridVariants> {\n /** When true, render as the single child element via Radix Slot — lets\n * you stamp Grid's layout classes onto an existing semantic tag\n * without nesting an extra `<div>`. */\n asChild?: boolean;\n}\n\nconst Grid = React.forwardRef<HTMLDivElement, GridProps>(\n ({ className, cols, gap, align, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"div\";\n return (\n <Comp\n ref={ref}\n data-gds-part=\"grid\"\n className={cn(gridVariants({ cols, gap, align, className }))}\n {...props}\n />\n );\n }\n);\nGrid.displayName = \"Grid\";\n\nexport { Grid, gridVariants };\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\n\n/**\n * Flex — the unopinionated flexbox primitive.\n *\n * The CSS-aligned partner to Stack / Row / Grid. Where Stack and Row bake in\n * a direction and a sensible gap/align default, Flex exposes the raw CSS\n * knobs and ships with CSS's own defaults — direction=row, gap=none,\n * justify=start, align=stretch, wrap=nowrap. Nothing is opinionated; you pay\n * for exactly the props you set.\n *\n * Use Flex when:\n * - You need `direction=\"col-reverse\"` or `\"row-reverse\"` — Stack and Row\n * can't express either without falling back to className.\n * - You want CSS defaults (stretch alignment, no baked-in gap) rather than\n * Row's \"items-center gap-md\" starting point.\n * - You're reaching for `className=\"flex …\"` and want the settings-panel\n * editability you lose when hand-rolling utility classes.\n *\n * Otherwise prefer Stack (vertical) / Row (horizontal) / Grid (2D) —\n * they're easier to read at a glance and have defaults tuned for the 95%\n * case. Flex is the escape hatch, not the default.\n */\nconst flexVariants = cva(\"rds-flex flex\", {\n variants: {\n direction: {\n row: \"flex-row\",\n col: \"flex-col\",\n \"row-reverse\": \"flex-row-reverse\",\n \"col-reverse\": \"flex-col-reverse\",\n },\n gap: {\n none: \"gap-0\",\n xs: \"gap-1\",\n sm: \"gap-2\",\n md: \"gap-4\",\n lg: \"gap-6\",\n xl: \"gap-8\",\n \"2xl\": \"gap-12\",\n },\n align: {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n baseline: \"items-baseline\",\n },\n justify: {\n start: \"justify-start\",\n center: \"justify-center\",\n end: \"justify-end\",\n between: \"justify-between\",\n around: \"justify-around\",\n evenly: \"justify-evenly\",\n },\n wrap: {\n nowrap: \"flex-nowrap\",\n wrap: \"flex-wrap\",\n \"wrap-reverse\": \"flex-wrap-reverse\",\n },\n },\n // CSS-aligned defaults on purpose — Flex's whole point is \"don't surprise\n // me with baked-in rhythm\". Consumers who want Row-style defaults should\n // use Row.\n defaultVariants: {\n direction: \"row\",\n gap: \"none\",\n align: \"stretch\",\n justify: \"start\",\n wrap: \"nowrap\",\n },\n});\n\nexport interface FlexProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof flexVariants> {\n /** When true, render as the single child element via Radix Slot — lets\n * you stamp Flex's layout classes onto an existing semantic tag without\n * nesting an extra `<div>`. */\n asChild?: boolean;\n}\n\nconst Flex = React.forwardRef<HTMLDivElement, FlexProps>(\n (\n {\n className,\n direction,\n gap,\n align,\n justify,\n wrap,\n asChild = false,\n ...props\n },\n ref\n ) => {\n const Comp = asChild ? Slot : \"div\";\n return (\n <Comp\n ref={ref}\n data-gds-part=\"flex\"\n className={cn(\n flexVariants({ direction, gap, align, justify, wrap, className })\n )}\n {...props}\n />\n );\n }\n);\nFlex.displayName = \"Flex\";\n\nexport { Flex, flexVariants };\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\";\nimport { cn } from \"@/lib/utils\";\n\nconst ScrollArea = React.forwardRef<\n React.ComponentRef<typeof ScrollAreaPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>\n>(({ className, children, ...props }, ref) => (\n <ScrollAreaPrimitive.Root\n ref={ref}\n className={cn(\"relative overflow-hidden\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport className=\"h-full w-full rounded-[inherit]\">\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n));\nScrollArea.displayName = ScrollAreaPrimitive.Root.displayName;\n\nconst ScrollBar = React.forwardRef<\n React.ComponentRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>\n>(({ className, orientation = \"vertical\", ...props }, ref) => (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n ref={ref}\n orientation={orientation}\n className={cn(\n \"flex touch-none select-none transition-colors\",\n orientation === \"vertical\" &&\n \"h-full w-2.5 border-l border-l-transparent p-[1px]\",\n orientation === \"horizontal\" &&\n \"h-2.5 flex-col border-t border-t-transparent p-[1px]\",\n className\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb className=\"relative flex-1 rounded-full bg-border\" />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n));\nScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName;\n\nexport { ScrollArea, ScrollBar };\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as SelectPrimitive from \"@radix-ui/react-select\";\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\n\nconst Select = SelectPrimitive.Root;\n\nconst SelectGroup = SelectPrimitive.Group;\n\nconst SelectValue = SelectPrimitive.Value;\n\nconst SelectTrigger = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n));\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName;\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n));\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n));\nSelectScrollDownButton.displayName =\n SelectPrimitive.ScrollDownButton.displayName;\n\nconst SelectContent = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = \"popper\", ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n \"relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n));\nSelectContent.displayName = SelectPrimitive.Content.displayName;\n\nconst SelectLabel = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn(\"py-1.5 pl-8 pr-2 text-sm font-semibold\", className)}\n {...props}\n />\n));\nSelectLabel.displayName = SelectPrimitive.Label.displayName;\n\nconst SelectItem = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n));\nSelectItem.displayName = SelectPrimitive.Item.displayName;\n\nconst SelectSeparator = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n));\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName;\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n};\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\";\nimport { cn } from \"@/lib/utils\";\n\nconst Separator = React.forwardRef<\n React.ComponentRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(\n (\n { className, orientation = \"horizontal\", decorative = true, ...props },\n ref\n ) => (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border\",\n orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\n className\n )}\n {...props}\n />\n )\n);\nSeparator.displayName = SeparatorPrimitive.Root.displayName;\n\nexport { Separator };\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { X } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\n\nconst Sheet = SheetPrimitive.Root;\n\nconst SheetTrigger = SheetPrimitive.Trigger;\n\nconst SheetClose = SheetPrimitive.Close;\n\nconst SheetPortal = SheetPrimitive.Portal;\n\nconst SheetOverlay = React.forwardRef<\n React.ComponentRef<typeof SheetPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Overlay\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n ref={ref}\n />\n));\nSheetOverlay.displayName = SheetPrimitive.Overlay.displayName;\n\nconst sheetVariants = cva(\n \"fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500\",\n {\n variants: {\n side: {\n top: \"inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top\",\n bottom:\n \"inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom\",\n left: \"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm\",\n right:\n \"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm\",\n },\n },\n defaultVariants: {\n side: \"right\",\n },\n }\n);\n\ninterface SheetContentProps\n extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>,\n VariantProps<typeof sheetVariants> {}\n\nconst SheetContent = React.forwardRef<\n React.ComponentRef<typeof SheetPrimitive.Content>,\n SheetContentProps\n>(({ side = \"right\", className, children, ...props }, ref) => (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n ref={ref}\n className={cn(sheetVariants({ side }), className)}\n {...props}\n >\n {children}\n <SheetPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n </SheetPrimitive.Content>\n </SheetPortal>\n));\nSheetContent.displayName = SheetPrimitive.Content.displayName;\n\nconst SheetHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-2 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n);\nSheetHeader.displayName = \"SheetHeader\";\n\nconst SheetFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n);\nSheetFooter.displayName = \"SheetFooter\";\n\nconst SheetTitle = React.forwardRef<\n React.ComponentRef<typeof SheetPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Title\n ref={ref}\n className={cn(\"text-lg font-semibold text-foreground\", className)}\n {...props}\n />\n));\nSheetTitle.displayName = SheetPrimitive.Title.displayName;\n\nconst SheetDescription = React.forwardRef<\n React.ComponentRef<typeof SheetPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nSheetDescription.displayName = SheetPrimitive.Description.displayName;\n\nexport {\n Sheet,\n SheetPortal,\n SheetOverlay,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n};\n","import { cn } from \"@/lib/utils\";\n\nfunction Skeleton({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\"animate-pulse rounded-md bg-muted\", className)}\n {...props}\n />\n );\n}\n\nexport { Skeleton };\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as SliderPrimitive from \"@radix-ui/react-slider\";\nimport { cn } from \"@/lib/utils\";\n\nconst Slider = React.forwardRef<\n React.ComponentRef<typeof SliderPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <SliderPrimitive.Root\n ref={ref}\n className={cn(\n \"relative flex w-full touch-none select-none items-center\",\n className\n )}\n {...props}\n >\n <SliderPrimitive.Track className=\"relative h-2 w-full grow overflow-hidden rounded-full bg-secondary\">\n <SliderPrimitive.Range className=\"absolute h-full bg-primary\" />\n </SliderPrimitive.Track>\n <SliderPrimitive.Thumb className=\"block h-5 w-5 rounded-full border-2 border-primary bg-background ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\" />\n </SliderPrimitive.Root>\n));\nSlider.displayName = SliderPrimitive.Root.displayName;\n\nexport { Slider };\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\n\n/**\n * Stack — vertical layout primitive.\n *\n * Reach for this as the default top-level wrapper inside the Studio main\n * slot when composing multiple regions (hero + content + footer). The\n * point is to stop the agent from freestyling `flex flex-col gap-6`\n * inline on every generation — a named layout component with a bounded\n * gap scale gives the Studio settings panel something to mutate, and\n * keeps vertical rhythm consistent across designs.\n *\n * Cross-axis default is `stretch` so Sections/Cards fill the container\n * width, which is what 95% of callers want. Override with `align=\"center\"`\n * for a centred narrow column (auth cards, marketing copy).\n */\nconst stackVariants = cva(\"rds-stack flex flex-col\", {\n variants: {\n gap: {\n none: \"gap-0\",\n xs: \"gap-1\",\n sm: \"gap-2\",\n md: \"gap-4\",\n lg: \"gap-6\",\n xl: \"gap-8\",\n \"2xl\": \"gap-12\",\n },\n align: {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n },\n },\n defaultVariants: {\n gap: \"md\",\n align: \"stretch\",\n },\n});\n\nexport interface StackProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof stackVariants> {\n /** When true, render as the single child element via Radix Slot — lets\n * you stamp Stack's layout classes onto an existing semantic tag\n * (`<section>`, `<main>`, `<nav>`) without nesting an extra `<div>`. */\n asChild?: boolean;\n}\n\nconst Stack = React.forwardRef<HTMLDivElement, StackProps>(\n ({ className, gap, align, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"div\";\n return (\n <Comp\n ref={ref}\n data-gds-part=\"stack\"\n className={cn(stackVariants({ gap, align, className }))}\n {...props}\n />\n );\n }\n);\nStack.displayName = \"Stack\";\n\nexport { Stack, stackVariants };\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as SwitchPrimitives from \"@radix-ui/react-switch\";\nimport { cn } from \"@/lib/utils\";\n\nconst Switch = React.forwardRef<\n React.ComponentRef<typeof SwitchPrimitives.Root>,\n React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>\n>(({ className, ...props }, ref) => (\n <SwitchPrimitives.Root\n className={cn(\n \"peer inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input\",\n className\n )}\n {...props}\n ref={ref}\n >\n <SwitchPrimitives.Thumb\n className={cn(\n \"pointer-events-none block h-5 w-5 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0\"\n )}\n />\n </SwitchPrimitives.Root>\n));\nSwitch.displayName = SwitchPrimitives.Root.displayName;\n\nexport { Switch };\n","import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Table = React.forwardRef<\n HTMLTableElement,\n React.HTMLAttributes<HTMLTableElement>\n>(({ className, ...props }, ref) => (\n <div className=\"relative w-full overflow-auto\">\n <table\n ref={ref}\n className={cn(\"w-full caption-bottom text-sm\", className)}\n {...props}\n />\n </div>\n))\nTable.displayName = \"Table\"\n\nconst TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <thead ref={ref} className={cn(\"[&_tr]:border-b\", className)} {...props} />\n))\nTableHeader.displayName = \"TableHeader\"\n\nconst TableBody = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tbody\n ref={ref}\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n))\nTableBody.displayName = \"TableBody\"\n\nconst TableFooter = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={cn(\n \"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\",\n className\n )}\n {...props}\n />\n))\nTableFooter.displayName = \"TableFooter\"\n\nconst TableRow = React.forwardRef<\n HTMLTableRowElement,\n React.HTMLAttributes<HTMLTableRowElement>\n>(({ className, ...props }, ref) => (\n <tr\n ref={ref}\n className={cn(\n \"border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted\",\n className\n )}\n {...props}\n />\n))\nTableRow.displayName = \"TableRow\"\n\nconst TableHead = React.forwardRef<\n HTMLTableCellElement,\n React.ThHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={cn(\n \"h-10 px-2 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\n className\n )}\n {...props}\n />\n))\nTableHead.displayName = \"TableHead\"\n\nconst TableCell = React.forwardRef<\n HTMLTableCellElement,\n React.TdHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={cn(\n \"p-2 align-middle [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\n className\n )}\n {...props}\n />\n))\nTableCell.displayName = \"TableCell\"\n\nconst TableCaption = React.forwardRef<\n HTMLTableCaptionElement,\n React.HTMLAttributes<HTMLTableCaptionElement>\n>(({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={cn(\"mt-4 text-sm text-muted-foreground\", className)}\n {...props}\n />\n))\nTableCaption.displayName = \"TableCaption\"\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Tabs = TabsPrimitive.Root\n\nconst TabsList = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n \"inline-flex h-9 items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground\",\n className\n )}\n {...props}\n />\n))\nTabsList.displayName = TabsPrimitive.List.displayName\n\nconst TabsTrigger = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground\",\n className\n )}\n {...props}\n />\n))\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName\n\nconst TabsContent = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n \"mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n className\n )}\n {...props}\n />\n))\nTabsContent.displayName = TabsPrimitive.Content.displayName\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n","import * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nconst Textarea = React.forwardRef<\n HTMLTextAreaElement,\n React.ComponentProps<\"textarea\">\n>(({ className, ...props }, ref) => {\n return (\n <textarea\n className={cn(\n \"flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n ref={ref}\n {...props}\n />\n );\n});\nTextarea.displayName = \"Textarea\";\n\nexport { Textarea };\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst TooltipProvider = TooltipPrimitive.Provider\n\nconst Tooltip = TooltipPrimitive.Root\n\nconst TooltipTrigger = TooltipPrimitive.Trigger\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]\",\n className\n )}\n {...props}\n />\n </TooltipPrimitive.Portal>\n))\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { ChevronLeft, ChevronRight, ChevronDown } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"./tooltip\"\n\n// Types\nexport interface SideMenuItem {\n id: string\n label: string\n href?: string\n icon?: React.ReactNode\n badge?: string | number\n onClick?: () => void\n disabled?: boolean\n}\n\nexport interface SideMenuSection {\n id: string\n title: string\n icon?: React.ReactNode\n items: SideMenuItem[]\n defaultExpanded?: boolean\n}\n\nexport interface SideMenuProps {\n /** Header content (logo, title, etc.) */\n header?: React.ReactNode\n /** Header content shown when collapsed (icon, etc.) */\n collapsedHeader?: React.ReactNode\n /** Navigation sections with collapsible groups */\n sections?: SideMenuSection[]\n /** Standalone items without sections */\n items?: SideMenuItem[]\n /** Footer content */\n footer?: React.ReactNode\n /** Whether the sidebar is collapsed */\n collapsed?: boolean\n /** Callback when collapsed state changes */\n onCollapsedChange?: (collapsed: boolean) => void\n /** Whether the sidebar can be collapsed */\n collapsible?: boolean\n /** Default collapsed state */\n defaultCollapsed?: boolean\n /** Currently active item id */\n activeItem?: string\n /** Custom className */\n className?: string\n /** Custom link component (e.g., Next.js Link) */\n linkComponent?: React.ComponentType<{\n href: string\n className?: string\n children: React.ReactNode\n }>\n}\n\n// Context for sharing state\ninterface SideMenuContextValue {\n collapsed: boolean\n activeItem?: string\n LinkComponent: React.ComponentType<{\n href: string\n className?: string\n children: React.ReactNode\n }>\n}\n\nconst SideMenuContext = React.createContext<SideMenuContextValue | null>(null)\n\nfunction useSideMenu() {\n const context = React.useContext(SideMenuContext)\n if (!context) {\n throw new Error(\"SideMenu components must be used within SideMenu\")\n }\n return context\n}\n\n// Default link component\nconst DefaultLink: React.FC<{\n href: string\n className?: string\n children: React.ReactNode\n}> = ({ href, className, children }) => (\n <a href={href} className={className}>\n {children}\n </a>\n)\n\n// Main SideMenu component\nconst SideMenu = React.forwardRef<HTMLElement, SideMenuProps>(\n (\n {\n header,\n collapsedHeader,\n sections,\n items,\n footer,\n collapsed: controlledCollapsed,\n onCollapsedChange,\n collapsible = true,\n defaultCollapsed = false,\n activeItem,\n className,\n linkComponent: LinkComponent = DefaultLink,\n },\n ref\n ) => {\n const [internalCollapsed, setInternalCollapsed] =\n React.useState(defaultCollapsed)\n\n // Support both controlled and uncontrolled modes\n const collapsed = controlledCollapsed ?? internalCollapsed\n\n const handleToggle = () => {\n const newCollapsed = !collapsed\n setInternalCollapsed(newCollapsed)\n onCollapsedChange?.(newCollapsed)\n }\n\n return (\n <TooltipProvider delayDuration={0}>\n <SideMenuContext.Provider\n value={{ collapsed, activeItem, LinkComponent }}\n >\n <aside\n ref={ref}\n className={cn(\n \"flex h-full flex-col transition-[width] duration-300 ease-in-out\",\n \"bg-white dark:bg-[#141414] border-r border-rds-gray-200 dark:border-[#1a1a1a]\",\n collapsed ? \"w-16\" : \"w-64\",\n className\n )}\n >\n {/* Header */}\n <div\n className={cn(\n \"flex items-center border-b border-rds-gray-200 dark:border-[#1a1a1a] flex-shrink-0 h-12\",\n collapsed\n ? \"justify-center px-2\"\n : \"justify-between px-3\"\n )}\n >\n {collapsed ? collapsedHeader || header : header}\n\n {collapsible && (\n <button\n onClick={handleToggle}\n className={cn(\n \"rounded-md h-5 w-5 flex items-center justify-center\",\n \"text-rds-gray-400 dark:text-rds-gray-500\",\n \"hover:text-rds-gray-600 dark:hover:text-rds-gray-300 transition-colors\",\n \"bg-white dark:bg-[#141414] border border-rds-gray-200 dark:border-rds-gray-700 shadow-sm\",\n collapsed && \"absolute left-[calc(4rem-10px)] top-6 -translate-y-1/2 z-50\"\n )}\n aria-label={collapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n >\n {collapsed ? (\n <ChevronRight className=\"h-3 w-3\" />\n ) : (\n <ChevronLeft className=\"h-3 w-3\" />\n )}\n </button>\n )}\n </div>\n\n {/* Navigation */}\n <nav className=\"flex-1 py-2 overflow-y-auto overflow-x-hidden\">\n {/* Standalone items */}\n {items && items.length > 0 && (\n <div className=\"px-2 mb-1 space-y-0.5\">\n {items.map((item) => (\n <SideMenuItemComponent key={item.id} item={item} />\n ))}\n </div>\n )}\n\n {/* Sections */}\n {sections?.map((section) => (\n <SideMenuSectionComponent key={section.id} section={section} />\n ))}\n </nav>\n\n {/* Footer */}\n {footer && (\n <div className=\"flex-shrink-0 border-t border-rds-gray-200 dark:border-[#1a1a1a] p-2\">\n {footer}\n </div>\n )}\n </aside>\n </SideMenuContext.Provider>\n </TooltipProvider>\n )\n }\n)\nSideMenu.displayName = \"SideMenu\"\n\n// Section component\nfunction SideMenuSectionComponent({ section }: { section: SideMenuSection }) {\n const { collapsed } = useSideMenu()\n const [expanded, setExpanded] = React.useState(\n section.defaultExpanded ?? true\n )\n\n if (collapsed) {\n // When collapsed, show items directly without section headers\n return (\n <div className=\"px-2 mb-1 space-y-0.5\">\n {section.items.map((item) => (\n <SideMenuItemComponent key={item.id} item={item} />\n ))}\n </div>\n )\n }\n\n return (\n <div className=\"px-2 mb-1\">\n <button\n onClick={() => setExpanded(!expanded)}\n className={cn(\n \"flex w-full items-center gap-2.5 rounded-md px-2 py-1.5 text-sm font-medium\",\n \"text-rds-gray-700 dark:text-rds-gray-300\",\n \"hover:bg-rds-gray-50 dark:hover:bg-rds-gray-900\",\n \"hover:text-rds-gray-900 dark:hover:text-white transition-colors\"\n )}\n >\n {section.icon && (\n <span className=\"h-3.5 w-3.5 flex-shrink-0\">{section.icon}</span>\n )}\n <span className=\"flex-1 text-left\">{section.title}</span>\n {expanded ? (\n <ChevronDown className=\"h-3 w-3\" strokeWidth={1.5} />\n ) : (\n <ChevronRight className=\"h-3 w-3\" strokeWidth={1.5} />\n )}\n </button>\n\n {expanded && (\n <div className=\"mt-0.5 space-y-0.5 relative pl-5\">\n <div className=\"absolute left-[1.1rem] top-0 bottom-0 w-px bg-rds-gray-200 dark:bg-rds-gray-700\" />\n {section.items.map((item) => (\n <SideMenuItemComponent key={item.id} item={item} nested />\n ))}\n </div>\n )}\n </div>\n )\n}\n\n// Item component\nfunction SideMenuItemComponent({\n item,\n nested = false,\n}: {\n item: SideMenuItem\n nested?: boolean\n}) {\n const { collapsed, activeItem, LinkComponent } = useSideMenu()\n const isActive = activeItem === item.id\n\n const itemClasses = cn(\n \"flex items-center gap-2.5 rounded-md text-sm font-medium transition-colors\",\n collapsed ? \"justify-center px-2 py-2.5\" : \"px-2 py-1.5\",\n isActive\n ? nested\n ? \"bg-rds-gray-100 dark:bg-[#1a1a1a] text-rds-gray-900 dark:text-white\"\n : \"bg-rds-green-50 dark:bg-rds-green-950 text-rds-green-700 dark:text-rds-green-400\"\n : \"text-rds-gray-700 dark:text-rds-gray-300 hover:bg-rds-gray-50 dark:hover:bg-rds-gray-900 hover:text-rds-gray-900 dark:hover:text-white\",\n item.disabled && \"opacity-50 pointer-events-none\"\n )\n\n const content = (\n <>\n {item.icon && (\n <span\n className={cn(\"flex-shrink-0\", collapsed ? \"h-5 w-5\" : \"h-3.5 w-3.5\")}\n >\n {item.icon}\n </span>\n )}\n {!collapsed && <span>{item.label}</span>}\n {!collapsed && item.badge && (\n <span className=\"ml-auto text-xs bg-rds-gray-100 dark:bg-rds-gray-800 px-1.5 py-0.5 rounded\">\n {item.badge}\n </span>\n )}\n </>\n )\n\n const element = item.href ? (\n <LinkComponent href={item.href} className={itemClasses}>\n {content}\n </LinkComponent>\n ) : (\n <button\n onClick={item.onClick}\n disabled={item.disabled}\n className={cn(itemClasses, \"w-full\")}\n >\n {content}\n </button>\n )\n\n if (collapsed) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>{element}</TooltipTrigger>\n <TooltipContent side=\"right\" sideOffset={8}>\n {item.label}\n </TooltipContent>\n </Tooltip>\n )\n }\n\n return element\n}\n\nexport { SideMenu }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Menu } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\n\n// Types\nexport interface BreadcrumbItem {\n label: string\n href?: string\n}\n\nexport interface TopMenuProps {\n /** Breadcrumb navigation items */\n breadcrumbs?: BreadcrumbItem[]\n /** Show mobile menu button */\n showMobileMenu?: boolean\n /** Mobile menu button click handler */\n onMobileMenuClick?: () => void\n /** Left side content (appears after breadcrumbs) */\n leftContent?: React.ReactNode\n /** Right side content (actions, user menu, etc.) */\n rightContent?: React.ReactNode\n /** Custom className */\n className?: string\n /** Custom link component (e.g., Next.js Link) */\n linkComponent?: React.ComponentType<{\n href: string\n className?: string\n children: React.ReactNode\n }>\n}\n\n// Default link component\nconst DefaultLink: React.FC<{\n href: string\n className?: string\n children: React.ReactNode\n}> = ({ href, className, children }) => (\n <a href={href} className={className}>\n {children}\n </a>\n)\n\nconst TopMenu = React.forwardRef<HTMLElement, TopMenuProps>(\n (\n {\n breadcrumbs = [],\n showMobileMenu = false,\n onMobileMenuClick,\n leftContent,\n rightContent,\n className,\n linkComponent: LinkComponent = DefaultLink,\n },\n ref\n ) => {\n return (\n <header\n ref={ref}\n className={cn(\n \"sticky top-0 z-30 flex h-12 items-center gap-3\",\n \"border-b border-rds-gray-200 dark:border-[#1a1a1a]\",\n \"bg-white dark:bg-[#141414] px-4\",\n className\n )}\n >\n {/* Mobile Menu Button */}\n {showMobileMenu && (\n <button\n onClick={onMobileMenuClick}\n className=\"lg:hidden rounded-md p-1.5 text-rds-gray-600 hover:bg-rds-gray-100 dark:text-rds-gray-400 dark:hover:bg-rds-gray-800\"\n aria-label=\"Toggle menu\"\n >\n <Menu className=\"h-4 w-4\" />\n </button>\n )}\n\n {/* Breadcrumbs */}\n {breadcrumbs.length > 0 && (\n <nav\n className=\"hidden md:flex items-center gap-1.5 text-sm\"\n aria-label=\"Breadcrumb\"\n >\n {breadcrumbs.map((crumb, index) => (\n <React.Fragment key={index}>\n {index > 0 && (\n <span className=\"text-rds-gray-400 dark:text-rds-gray-500 text-xs\">\n /\n </span>\n )}\n {crumb.href ? (\n <LinkComponent\n href={crumb.href}\n className=\"text-rds-gray-600 dark:text-rds-gray-400 hover:text-rds-gray-900 dark:hover:text-white transition-colors text-sm\"\n >\n {crumb.label}\n </LinkComponent>\n ) : (\n <span className=\"text-rds-gray-900 dark:text-white font-medium text-sm\">\n {crumb.label}\n </span>\n )}\n </React.Fragment>\n ))}\n </nav>\n )}\n\n {/* Left Content */}\n {leftContent}\n\n {/* Spacer */}\n <div className=\"flex-1\" />\n\n {/* Right Content */}\n {rightContent && (\n <div className=\"flex items-center gap-1.5\">{rightContent}</div>\n )}\n </header>\n )\n }\n)\nTopMenu.displayName = \"TopMenu\"\n\n// User Menu Component\nexport interface TopMenuUserProps {\n /** User name */\n name?: string\n /** User email */\n email?: string\n /** User avatar URL */\n avatarUrl?: string\n /** Custom avatar content (icon, initials, etc.) */\n avatarContent?: React.ReactNode\n /** Avatar background color class */\n avatarClassName?: string\n /** Menu items */\n children?: React.ReactNode\n /** Custom className */\n className?: string\n}\n\nconst TopMenuUser = React.forwardRef<HTMLDivElement, TopMenuUserProps>(\n (\n {\n name,\n email,\n avatarUrl,\n avatarContent,\n avatarClassName,\n children,\n className,\n },\n ref\n ) => {\n const [open, setOpen] = React.useState(false)\n const menuRef = React.useRef<HTMLDivElement>(null)\n\n // Close menu when clicking outside\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n menuRef.current &&\n !menuRef.current.contains(event.target as Node)\n ) {\n setOpen(false)\n }\n }\n\n if (open) {\n document.addEventListener(\"mousedown\", handleClickOutside)\n }\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside)\n }\n }, [open])\n\n return (\n <div ref={ref} className={cn(\"relative\", className)}>\n <div ref={menuRef}>\n <button\n onClick={() => setOpen(!open)}\n className=\"flex items-center gap-1.5 rounded-full p-0.5 hover:ring-2 hover:ring-rds-green-500 hover:ring-offset-2 dark:hover:ring-offset-[#141414] transition-all\"\n aria-label=\"Account menu\"\n >\n <div\n className={cn(\n \"h-8 w-8 rounded-full overflow-hidden flex items-center justify-center\",\n avatarClassName ||\n \"bg-gradient-to-br from-rds-yellow-400 to-rds-yellow-600\"\n )}\n >\n {avatarUrl ? (\n <img\n src={avatarUrl}\n alt={name || \"User\"}\n className=\"h-full w-full object-cover\"\n />\n ) : (\n avatarContent\n )}\n </div>\n </button>\n\n {/* Dropdown Menu */}\n {open && (\n <div className=\"absolute right-0 mt-2 w-64 rounded-lg border border-rds-gray-200 dark:border-[#1a1a1a] bg-white dark:bg-[#141414] shadow-lg overflow-hidden z-50\">\n {/* User Info */}\n {(name || email) && (\n <div className=\"px-4 py-3 border-b border-rds-gray-200 dark:border-[#1a1a1a]\">\n <div className=\"flex items-center gap-3\">\n <div\n className={cn(\n \"h-10 w-10 rounded-full overflow-hidden flex items-center justify-center\",\n avatarClassName ||\n \"bg-gradient-to-br from-rds-yellow-400 to-rds-yellow-600\"\n )}\n >\n {avatarUrl ? (\n <img\n src={avatarUrl}\n alt={name || \"User\"}\n className=\"h-full w-full object-cover\"\n />\n ) : (\n avatarContent\n )}\n </div>\n <div className=\"flex-1 min-w-0\">\n {name && (\n <p className=\"text-sm font-medium text-rds-gray-900 dark:text-white truncate\">\n {name}\n </p>\n )}\n {email && (\n <p className=\"text-xs text-rds-gray-500 dark:text-rds-gray-400 truncate\">\n {email}\n </p>\n )}\n </div>\n </div>\n </div>\n )}\n\n {/* Menu Items */}\n {children}\n </div>\n )}\n </div>\n </div>\n )\n }\n)\nTopMenuUser.displayName = \"TopMenuUser\"\n\n// User Menu Item\nexport interface TopMenuUserItemProps {\n /** Item icon */\n icon?: React.ReactNode\n /** Item label */\n children: React.ReactNode\n /** Click handler */\n onClick?: () => void\n /** Href for link items */\n href?: string\n /** Variant */\n variant?: \"default\" | \"danger\" | \"success\"\n /** Custom className */\n className?: string\n}\n\nconst TopMenuUserItem = React.forwardRef<\n HTMLButtonElement,\n TopMenuUserItemProps\n>(({ icon, children, onClick, href, variant = \"default\", className }, ref) => {\n const variantClasses = {\n default:\n \"text-rds-gray-700 dark:text-rds-gray-300 hover:bg-rds-gray-50 dark:hover:bg-[#1a1a1a]\",\n danger:\n \"text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-950/20\",\n success:\n \"text-rds-green-600 dark:text-rds-green-400 hover:bg-rds-green-50 dark:hover:bg-rds-green-950/20\",\n }\n\n const Component = href ? \"a\" : \"button\"\n\n return (\n <Component\n ref={ref as React.Ref<HTMLButtonElement & HTMLAnchorElement>}\n onClick={onClick}\n href={href}\n className={cn(\n \"w-full flex items-center gap-3 px-4 py-2 text-sm transition-colors\",\n variantClasses[variant],\n className\n )}\n >\n {icon && <span className=\"h-4 w-4\">{icon}</span>}\n <span>{children}</span>\n </Component>\n )\n})\nTopMenuUserItem.displayName = \"TopMenuUserItem\"\n\n// User Menu Section (for grouping items with borders)\nconst TopMenuUserSection = React.forwardRef<\n HTMLDivElement,\n { children: React.ReactNode; className?: string }\n>(({ children, className }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"py-1 border-t border-rds-gray-200 dark:border-[#1a1a1a] first:border-t-0\",\n className\n )}\n >\n {children}\n </div>\n))\nTopMenuUserSection.displayName = \"TopMenuUserSection\"\n\nexport { TopMenu, TopMenuUser, TopMenuUserItem, TopMenuUserSection }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"@/lib/utils\"\n\n// Types\nexport interface SimpleTab {\n id: string\n label: string\n icon?: React.ReactNode\n disabled?: boolean\n}\n\nexport interface SimpleTabsProps {\n /** Array of tab definitions */\n tabs: SimpleTab[]\n /** Currently active tab id */\n activeTab?: string\n /** Default active tab id (for uncontrolled mode) */\n defaultTab?: string\n /** Callback when tab changes */\n onTabChange?: (tabId: string) => void\n /** Tab panel children */\n children?: React.ReactNode\n /** Custom className for the container */\n className?: string\n /** Custom className for the tabs list */\n tabsClassName?: string\n}\n\nexport interface SimpleTabsPanelProps {\n /** Tab id this panel corresponds to */\n id: string\n /** Panel content */\n children: React.ReactNode\n /** Custom className */\n className?: string\n}\n\n// Context for sharing state\ninterface SimpleTabsContextValue {\n activeTab: string\n setActiveTab: (tab: string) => void\n}\n\nconst SimpleTabsContext = React.createContext<SimpleTabsContextValue | null>(\n null\n)\n\nfunction useSimpleTabs() {\n const context = React.useContext(SimpleTabsContext)\n if (!context) {\n throw new Error(\"SimpleTabsPanel must be used within SimpleTabs\")\n }\n return context\n}\n\n// Main SimpleTabs component\nconst SimpleTabs = React.forwardRef<HTMLDivElement, SimpleTabsProps>(\n (\n {\n tabs,\n activeTab: controlledActiveTab,\n defaultTab,\n onTabChange,\n children,\n className,\n tabsClassName,\n },\n ref\n ) => {\n const [internalActiveTab, setInternalActiveTab] = React.useState(\n defaultTab || tabs[0]?.id || \"\"\n )\n\n // Support both controlled and uncontrolled modes\n const activeTab = controlledActiveTab ?? internalActiveTab\n\n const handleTabChange = (tabId: string) => {\n setInternalActiveTab(tabId)\n onTabChange?.(tabId)\n }\n\n return (\n <SimpleTabsContext.Provider\n value={{ activeTab, setActiveTab: handleTabChange }}\n >\n <div ref={ref} className={cn(\"space-y-6\", className)}>\n {/* Tab Navigation */}\n <div className=\"border-b border-rds-gray-200 dark:border-rds-gray-800\">\n <nav\n className={cn(\n \"-mb-px flex gap-1 overflow-x-auto scrollbar-hide\",\n tabsClassName\n )}\n aria-label=\"Tabs\"\n >\n {tabs.map((tab) => {\n const isActive = activeTab === tab.id\n\n return (\n <button\n key={tab.id}\n onClick={() => !tab.disabled && handleTabChange(tab.id)}\n disabled={tab.disabled}\n className={cn(\n \"relative flex items-center gap-2 px-4 py-3 text-sm font-medium transition-colors whitespace-nowrap\",\n isActive\n ? \"text-primary\"\n : \"text-muted-foreground hover:text-foreground\",\n tab.disabled && \"opacity-50 cursor-not-allowed\"\n )}\n >\n {tab.icon && <span className=\"h-4 w-4\">{tab.icon}</span>}\n {tab.label}\n {isActive && (\n <span\n className=\"absolute bottom-0 left-0 right-0 h-0.5 bg-primary\"\n aria-hidden=\"true\"\n />\n )}\n </button>\n )\n })}\n </nav>\n </div>\n\n {/* Tab Content */}\n {children && <div>{children}</div>}\n </div>\n </SimpleTabsContext.Provider>\n )\n }\n)\nSimpleTabs.displayName = \"SimpleTabs\"\n\n// Tab Panel component\nconst SimpleTabsPanel = React.forwardRef<HTMLDivElement, SimpleTabsPanelProps>(\n ({ id, children, className }, ref) => {\n const { activeTab } = useSimpleTabs()\n\n if (activeTab !== id) return null\n\n return (\n <div\n ref={ref}\n role=\"tabpanel\"\n aria-labelledby={`tab-${id}`}\n className={className}\n >\n {children}\n </div>\n )\n }\n)\nSimpleTabsPanel.displayName = \"SimpleTabsPanel\"\n\n// Compound component for more flexible usage\nexport interface SimpleTabsRootProps {\n /** Currently active tab id */\n activeTab?: string\n /** Default active tab id (for uncontrolled mode) */\n defaultTab?: string\n /** Callback when tab changes */\n onTabChange?: (tabId: string) => void\n /** Children (SimpleTabsList and SimpleTabsPanel components) */\n children: React.ReactNode\n /** Custom className */\n className?: string\n}\n\nconst SimpleTabsRoot = React.forwardRef<HTMLDivElement, SimpleTabsRootProps>(\n (\n { activeTab: controlledActiveTab, defaultTab, onTabChange, children, className },\n ref\n ) => {\n const [internalActiveTab, setInternalActiveTab] = React.useState(\n defaultTab || \"\"\n )\n\n const activeTab = controlledActiveTab ?? internalActiveTab\n\n const handleTabChange = (tabId: string) => {\n setInternalActiveTab(tabId)\n onTabChange?.(tabId)\n }\n\n return (\n <SimpleTabsContext.Provider\n value={{ activeTab, setActiveTab: handleTabChange }}\n >\n <div ref={ref} className={cn(\"space-y-6\", className)}>\n {children}\n </div>\n </SimpleTabsContext.Provider>\n )\n }\n)\nSimpleTabsRoot.displayName = \"SimpleTabsRoot\"\n\n// Tabs List for compound component pattern\nexport interface SimpleTabsListProps {\n children: React.ReactNode\n className?: string\n}\n\nconst SimpleTabsList = React.forwardRef<HTMLDivElement, SimpleTabsListProps>(\n ({ children, className }, ref) => {\n return (\n <div\n ref={ref}\n className=\"border-b border-rds-gray-200 dark:border-rds-gray-800\"\n >\n <nav\n className={cn(\n \"-mb-px flex gap-1 overflow-x-auto scrollbar-hide\",\n className\n )}\n role=\"tablist\"\n aria-label=\"Tabs\"\n >\n {children}\n </nav>\n </div>\n )\n }\n)\nSimpleTabsList.displayName = \"SimpleTabsList\"\n\n// Tab Trigger for compound component pattern\nexport interface SimpleTabsTriggerProps {\n /** Tab id */\n value: string\n /** Tab content */\n children: React.ReactNode\n /** Tab icon */\n icon?: React.ReactNode\n /** Disabled state */\n disabled?: boolean\n /** Custom className */\n className?: string\n}\n\nconst SimpleTabsTrigger = React.forwardRef<\n HTMLButtonElement,\n SimpleTabsTriggerProps\n>(({ value, children, icon, disabled, className }, ref) => {\n const { activeTab, setActiveTab } = useSimpleTabs()\n const isActive = activeTab === value\n\n return (\n <button\n ref={ref}\n role=\"tab\"\n id={`tab-${value}`}\n aria-selected={isActive}\n aria-controls={`panel-${value}`}\n onClick={() => !disabled && setActiveTab(value)}\n disabled={disabled}\n className={cn(\n \"relative flex items-center gap-2 px-4 py-3 text-sm font-medium transition-colors whitespace-nowrap\",\n isActive\n ? \"text-primary\"\n : \"text-muted-foreground hover:text-foreground\",\n disabled && \"opacity-50 cursor-not-allowed\",\n className\n )}\n >\n {icon && <span className=\"h-4 w-4\">{icon}</span>}\n {children}\n {isActive && (\n <span\n className=\"absolute bottom-0 left-0 right-0 h-0.5 bg-primary\"\n aria-hidden=\"true\"\n />\n )}\n </button>\n )\n})\nSimpleTabsTrigger.displayName = \"SimpleTabsTrigger\"\n\n// Tab Content for compound component pattern\nconst SimpleTabsContent = React.forwardRef<\n HTMLDivElement,\n { value: string; children: React.ReactNode; className?: string }\n>(({ value, children, className }, ref) => {\n const { activeTab } = useSimpleTabs()\n\n if (activeTab !== value) return null\n\n return (\n <div\n ref={ref}\n role=\"tabpanel\"\n id={`panel-${value}`}\n aria-labelledby={`tab-${value}`}\n className={className}\n >\n {children}\n </div>\n )\n})\nSimpleTabsContent.displayName = \"SimpleTabsContent\"\n\nexport {\n SimpleTabs,\n SimpleTabsPanel,\n SimpleTabsRoot,\n SimpleTabsList,\n SimpleTabsTrigger,\n SimpleTabsContent,\n}\n","\"use client\";\n\n/**\n * MediaSurface — the shared shell used by VideoPlayer, RivePlayer,\n * and ThreeScene. Not exported publicly.\n *\n * Handles the surface area that's identical across all media types:\n * - aspect ratio / radius / border (driven by CSS variables for theming)\n * - loading skeleton\n * - intersection-observer (for pause-when-offscreen)\n * - reduced-motion query\n *\n * Design-system note: all visual dimensions are backed by CSS vars so\n * consumers can retheme via `--rds-media-radius`, `--rds-media-border`, etc.\n * (These will rename to `--gds-*` when the broader codebase rename lands.)\n */\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport type MediaAspect = \"video\" | \"square\" | \"portrait\" | \"wide\" | \"auto\";\nexport type MediaRadius = \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nconst aspectClass: Record<MediaAspect, string> = {\n video: \"aspect-video\",\n square: \"aspect-square\",\n portrait: \"aspect-[3/4]\",\n wide: \"aspect-[21/9]\",\n auto: \"\",\n};\n\nconst radiusVar: Record<MediaRadius, string> = {\n none: \"0\",\n sm: \"var(--radius, 0.25rem)\",\n md: \"calc(var(--radius, 0.375rem) * 1.25)\",\n lg: \"calc(var(--radius, 0.5rem) * 1.5)\",\n xl: \"calc(var(--radius, 0.75rem) * 2)\",\n};\n\nexport interface MediaSurfaceProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n aspect?: MediaAspect;\n radius?: MediaRadius;\n border?: boolean;\n loading?: boolean;\n /** Callback fires when the surface enters / leaves the viewport. */\n onVisibilityChange?: (visible: boolean) => void;\n /** Fallback shown before `onReady` is signalled by the child. */\n fallback?: React.ReactNode;\n children?: React.ReactNode;\n}\n\nexport const MediaSurface = React.forwardRef<HTMLDivElement, MediaSurfaceProps>(\n (\n {\n className,\n aspect = \"video\",\n radius = \"lg\",\n border = false,\n loading = false,\n onVisibilityChange,\n fallback,\n style,\n children,\n ...props\n },\n ref,\n ) => {\n const innerRef = React.useRef<HTMLDivElement | null>(null);\n\n // merge forwarded + internal refs\n React.useImperativeHandle(ref, () => innerRef.current as HTMLDivElement);\n\n React.useEffect(() => {\n if (!onVisibilityChange || !innerRef.current) return;\n const el = innerRef.current;\n const io = new IntersectionObserver(\n ([entry]) => onVisibilityChange(entry.isIntersecting),\n { threshold: 0.05 },\n );\n io.observe(el);\n return () => io.disconnect();\n }, [onVisibilityChange]);\n\n return (\n <div\n ref={innerRef}\n data-gds-part=\"media-surface\"\n className={cn(\n // `w-full` is the default so the surface fills its parent — without\n // it, a flex parent (e.g. items-center justify-center) collapses the\n // surface to the intrinsic width of its children, which for Rive /\n // WebGL canvases is 0. Override via `className=\"w-96\"` etc.\n \"rds-media-surface relative w-full overflow-hidden bg-muted\",\n aspectClass[aspect],\n border && \"border border-border\",\n className,\n )}\n style={{\n borderRadius: `var(--rds-media-radius, ${radiusVar[radius]})`,\n ...style,\n }}\n {...props}\n >\n {children}\n {loading && (\n <div\n className=\"absolute inset-0 flex items-center justify-center bg-muted animate-pulse\"\n aria-hidden\n >\n {fallback}\n </div>\n )}\n </div>\n );\n },\n);\nMediaSurface.displayName = \"MediaSurface\";\n\n/** Shared prop interface extended by each media primitive. */\nexport interface BaseMediaProps {\n /** src for the media — url or path. */\n src?: string;\n /** Show native-ish play/pause/scrubber controls. Default: `true` for video, `false` for Rive/three. */\n controls?: boolean;\n /** Autoplay when mounted (respects reduced-motion). */\n autoPlay?: boolean;\n /** Loop on end. */\n loop?: boolean;\n /** Pause rendering / playback when offscreen. Default `true` (big perf win for WebGL). */\n pauseOffscreen?: boolean;\n /** Aspect ratio of the surface. */\n aspect?: MediaAspect;\n /** Corner radius. */\n radius?: MediaRadius;\n /** Draw a subtle border around the surface. */\n border?: boolean;\n /** Poster / fallback image while loading. */\n poster?: string;\n /** Accessible label — used as `aria-label` on the surface. */\n label?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/** Hook — returns `true` when the OS reports reduced-motion preference. */\nexport function usePrefersReducedMotion(): boolean {\n const [reduced, setReduced] = React.useState(false);\n React.useEffect(() => {\n const mql = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n setReduced(mql.matches);\n const handler = (e: MediaQueryListEvent) => setReduced(e.matches);\n mql.addEventListener(\"change\", handler);\n return () => mql.removeEventListener(\"change\", handler);\n }, []);\n return reduced;\n}\n","\"use client\";\n\n/**\n * VideoPlayer — native HTML5 video wrapped in a MediaSurface.\n *\n * Modes:\n * controls={true} (default) — shows native video controls\n * controls={false} — bare viewer: hides chrome, muted autoplay/loop\n */\n\nimport * as React from \"react\";\nimport {\n MediaSurface,\n type BaseMediaProps,\n usePrefersReducedMotion,\n} from \"./media-surface\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface VideoPlayerProps extends BaseMediaProps {\n /** Mute audio. Required `true` if `autoPlay` (browser restriction). */\n muted?: boolean;\n /** Playback rate. Defaults to 1. */\n playbackRate?: number;\n /** Object-fit. Defaults to \"cover\" — matches typical hero/background use. */\n objectFit?: \"cover\" | \"contain\" | \"fill\";\n}\n\nexport const VideoPlayer = React.forwardRef<\n HTMLVideoElement,\n VideoPlayerProps\n>(\n (\n {\n src,\n controls = true,\n autoPlay = false,\n loop = false,\n muted,\n pauseOffscreen = true,\n aspect = \"video\",\n radius = \"lg\",\n border = false,\n poster,\n label,\n className,\n style,\n playbackRate = 1,\n objectFit = \"cover\",\n },\n ref,\n ) => {\n const videoRef = React.useRef<HTMLVideoElement | null>(null);\n const reduced = usePrefersReducedMotion();\n // Poster is rendered as a lazy-loaded <img> overlay rather than using the\n // native `poster` attribute, which fetches eagerly even when the video is\n // offscreen. We hide it once the video starts playing.\n const [posterVisible, setPosterVisible] = React.useState<boolean>(!!poster);\n\n React.useImperativeHandle(ref, () => videoRef.current as HTMLVideoElement);\n\n // autoplay must be muted unless consumer explicitly opted out\n const effectiveMuted = muted ?? autoPlay;\n const effectiveAutoPlay = autoPlay && !reduced;\n\n React.useEffect(() => {\n if (videoRef.current) videoRef.current.playbackRate = playbackRate;\n }, [playbackRate]);\n\n React.useEffect(() => {\n setPosterVisible(!!poster);\n }, [poster]);\n\n const handleVisibilityChange = React.useCallback(\n (visible: boolean) => {\n if (!pauseOffscreen || !videoRef.current) return;\n if (visible && effectiveAutoPlay) {\n videoRef.current.play().catch(() => {\n // autoplay blocked — leave paused\n });\n } else {\n videoRef.current.pause();\n }\n },\n [pauseOffscreen, effectiveAutoPlay],\n );\n\n return (\n <MediaSurface\n aspect={aspect}\n radius={radius}\n border={border}\n aria-label={label}\n className={className}\n style={style}\n onVisibilityChange={pauseOffscreen ? handleVisibilityChange : undefined}\n >\n <video\n ref={videoRef}\n src={src}\n controls={controls}\n autoPlay={effectiveAutoPlay}\n loop={loop}\n muted={effectiveMuted}\n playsInline\n preload={effectiveAutoPlay ? \"auto\" : \"metadata\"}\n onPlaying={() => setPosterVisible(false)}\n className={cn(\n \"w-full h-full\",\n objectFit === \"cover\" && \"object-cover\",\n objectFit === \"contain\" && \"object-contain\",\n objectFit === \"fill\" && \"object-fill\",\n )}\n >\n Your browser does not support the video tag.\n </video>\n {poster && posterVisible && (\n // Always lazy-loaded — the native `poster` attribute fetches\n // eagerly, which undoes the rest of our offscreen-pause work.\n // eslint-disable-next-line @next/next/no-img-element\n <img\n src={poster}\n alt=\"\"\n aria-hidden=\"true\"\n loading=\"lazy\"\n decoding=\"async\"\n data-gds-part=\"video-poster\"\n className={cn(\n \"absolute inset-0 w-full h-full pointer-events-none transition-opacity duration-200\",\n objectFit === \"cover\" && \"object-cover\",\n objectFit === \"contain\" && \"object-contain\",\n objectFit === \"fill\" && \"object-fill\",\n )}\n />\n )}\n </MediaSurface>\n );\n },\n);\nVideoPlayer.displayName = \"VideoPlayer\";\n","\"use client\";\n\n/**\n * RivePlayer — Rive runtime wrapped in a MediaSurface.\n *\n * The @rive-app/react-canvas dep is marked `optional` in package.json — this\n * component lazy-imports it so consumers who don't use Rive don't fail at\n * install time and don't pay the bundle cost unless they render one.\n *\n * Modes:\n * controls={true} — shows a small play/pause overlay\n * controls={false} (default) — bare viewer: zero chrome\n */\n\nimport * as React from \"react\";\nimport { Play, Pause } from \"lucide-react\";\nimport {\n MediaSurface,\n type BaseMediaProps,\n usePrefersReducedMotion,\n} from \"./media-surface\";\nimport { cn } from \"@/lib/utils\";\nimport { Button } from \"./button\";\n\nexport interface RivePlayerProps extends BaseMediaProps {\n /** State machine to run. */\n stateMachines?: string | string[];\n /** Artboard name — omit to use the default. */\n artboard?: string;\n /** Object-fit equivalent — how the art sits inside the surface. */\n fit?: \"contain\" | \"cover\" | \"fill\" | \"fitWidth\" | \"fitHeight\" | \"none\";\n /** Inputs to pass to the state machine. */\n stateMachineInputs?: Record<string, number | boolean | string>;\n}\n\nexport const RivePlayer = React.forwardRef<HTMLDivElement, RivePlayerProps>(\n (\n {\n src,\n controls = false,\n autoPlay = true,\n loop = true,\n pauseOffscreen = true,\n aspect = \"square\",\n radius = \"lg\",\n border = false,\n poster,\n label,\n className,\n style,\n stateMachines,\n artboard,\n fit = \"contain\",\n stateMachineInputs,\n },\n ref,\n ) => {\n const reduced = usePrefersReducedMotion();\n const [Mod, setMod] = React.useState<\n typeof import(\"@rive-app/react-canvas\") | null\n >(null);\n const [error, setError] = React.useState<string | null>(null);\n\n React.useEffect(() => {\n let cancelled = false;\n import(\"@rive-app/react-canvas\")\n .then((m) => {\n if (!cancelled) setMod(m);\n })\n .catch(() => {\n if (!cancelled)\n setError(\n \"Rive runtime not installed. Run `npm install @rive-app/react-canvas`.\",\n );\n });\n return () => {\n cancelled = true;\n };\n }, []);\n\n return (\n <MediaSurface\n ref={ref}\n aspect={aspect}\n radius={radius}\n border={border}\n aria-label={label}\n className={className}\n style={style}\n >\n {error ? (\n <div className=\"flex items-center justify-center h-full text-sm text-muted-foreground p-4 text-center\">\n {error}\n </div>\n ) : Mod && src ? (\n <RiveInner\n Mod={Mod}\n src={src}\n stateMachines={stateMachines}\n artboard={artboard}\n fit={fit}\n stateMachineInputs={stateMachineInputs}\n autoPlay={autoPlay && !reduced}\n loop={loop}\n pauseOffscreen={pauseOffscreen}\n controls={controls}\n poster={poster}\n />\n ) : (\n poster && (\n // eslint-disable-next-line @next/next/no-img-element\n <img\n src={poster}\n alt=\"\"\n className=\"w-full h-full object-contain\"\n />\n )\n )}\n </MediaSurface>\n );\n },\n);\nRivePlayer.displayName = \"RivePlayer\";\n\ninterface InnerProps {\n Mod: typeof import(\"@rive-app/react-canvas\");\n src: string;\n stateMachines?: string | string[];\n artboard?: string;\n fit: NonNullable<RivePlayerProps[\"fit\"]>;\n stateMachineInputs?: Record<string, number | boolean | string>;\n autoPlay: boolean;\n loop: boolean;\n pauseOffscreen: boolean;\n controls: boolean;\n poster?: string;\n}\n\nfunction RiveInner({\n Mod,\n src,\n stateMachines,\n artboard,\n fit,\n autoPlay,\n loop,\n pauseOffscreen,\n controls,\n poster,\n}: InnerProps) {\n const { useRive, Layout, Fit, Alignment, EventType } = Mod;\n\n const fitMap: Record<string, unknown> = {\n contain: Fit.Contain,\n cover: Fit.Cover,\n fill: Fit.Fill,\n fitWidth: Fit.FitWidth,\n fitHeight: Fit.FitHeight,\n none: Fit.None,\n };\n\n const { rive, RiveComponent } = useRive({\n src,\n stateMachines,\n artboard,\n autoplay: autoPlay,\n layout: new Layout({\n fit: fitMap[fit] as never,\n alignment: Alignment.Center,\n }),\n });\n\n const [playing, setPlaying] = React.useState(autoPlay);\n\n // The Rive instance has no `loop` setter — animations carry their loop mode\n // in the .riv file itself. To force-loop from a prop we listen for Stop and\n // replay. No-op if the file already loops (Stop never fires).\n React.useEffect(() => {\n if (!rive || !loop) return;\n const handler = () => {\n rive.play();\n };\n rive.on(EventType.Stop, handler);\n return () => {\n rive.off(EventType.Stop, handler);\n };\n }, [rive, loop, EventType]);\n\n // pause-when-offscreen\n React.useEffect(() => {\n if (!pauseOffscreen || !rive) return;\n const target = (rive as unknown as { canvas?: HTMLCanvasElement }).canvas;\n if (!target) return;\n const io = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting && autoPlay) rive.play();\n else rive.pause();\n },\n { threshold: 0.05 },\n );\n io.observe(target);\n return () => io.disconnect();\n }, [rive, pauseOffscreen, autoPlay]);\n\n const togglePlay = () => {\n if (!rive) return;\n if (playing) {\n rive.pause();\n setPlaying(false);\n } else {\n rive.play();\n setPlaying(true);\n }\n };\n\n return (\n <>\n <RiveComponent className=\"w-full h-full\" />\n {!rive && poster && (\n // eslint-disable-next-line @next/next/no-img-element\n <img\n src={poster}\n alt=\"\"\n className=\"absolute inset-0 w-full h-full object-contain pointer-events-none\"\n />\n )}\n {controls && (\n <div\n className={cn(\n \"absolute inset-0 flex items-end justify-end p-2\",\n \"opacity-0 hover:opacity-100 transition-opacity\",\n \"bg-gradient-to-t from-black/40 to-transparent\",\n )}\n >\n <Button size=\"icon\" variant=\"secondary\" onClick={togglePlay}>\n {playing ? <Pause className=\"h-4 w-4\" /> : <Play className=\"h-4 w-4\" />}\n </Button>\n </div>\n )}\n </>\n );\n}\n","/**\n * Post-FX composer factory.\n *\n * Wraps a three.js scene in an EffectComposer with a configurable stack\n * of effects: bloom, film grain, scanlines, vignette, chromatic aberration,\n * glitch. Effects are toggled in/out based on what the preset declares.\n */\n\nimport * as THREE from \"three\";\nimport {\n EffectComposer,\n RenderPass,\n EffectPass,\n BloomEffect,\n NoiseEffect,\n ScanlineEffect,\n VignetteEffect,\n ChromaticAberrationEffect,\n GlitchEffect,\n BlendFunction,\n KernelSize,\n} from \"postprocessing\";\nimport type { PostPreset, PostComposerFactory } from \"./types\";\n\nexport const createPostComposer: PostComposerFactory = ({\n renderer,\n scene,\n camera,\n preset,\n width,\n height,\n}) => {\n const composer = new EffectComposer(renderer);\n composer.setSize(width, height);\n composer.addPass(new RenderPass(scene, camera));\n\n // Effects are instantiated once; `setPreset` mutates their params.\n const bloom = new BloomEffect({\n intensity: 0,\n luminanceThreshold: 0.6,\n radius: 0.6,\n kernelSize: KernelSize.MEDIUM,\n });\n const noise = new NoiseEffect({\n blendFunction: BlendFunction.OVERLAY,\n });\n noise.blendMode.opacity.value = 0;\n\n const scanlines = new ScanlineEffect({\n blendFunction: BlendFunction.OVERLAY,\n density: 1.25,\n });\n scanlines.blendMode.opacity.value = 0;\n\n const vignette = new VignetteEffect({\n darkness: 0,\n offset: 0.5,\n });\n\n const chromatic = new ChromaticAberrationEffect({\n offset: new THREE.Vector2(0, 0),\n radialModulation: false,\n modulationOffset: 0.15,\n });\n\n const glitch = new GlitchEffect({\n chromaticAberrationOffset: new THREE.Vector2(0, 0),\n columns: 0.05,\n });\n glitch.minStrength = 0;\n glitch.maxStrength = 0;\n\n // Passes must separate convolution effects (Bloom) from UV-transforming\n // effects (Chromatic Aberration, Glitch). The library throws at construction\n // time if these mix. Four passes keeps everything happy.\n composer.addPass(new EffectPass(camera, bloom));\n composer.addPass(new EffectPass(camera, noise, scanlines, vignette));\n composer.addPass(new EffectPass(camera, chromatic));\n composer.addPass(new EffectPass(camera, glitch));\n\n function applyPreset(p: PostPreset) {\n const e = p.effects;\n\n bloom.intensity = e.bloom?.intensity ?? 0;\n if (bloom.luminanceMaterial && e.bloom?.luminanceThreshold !== undefined) {\n bloom.luminanceMaterial.threshold = e.bloom.luminanceThreshold;\n }\n\n noise.blendMode.opacity.value = e.noise?.intensity ?? 0;\n\n scanlines.density = e.scanlines?.density ?? 1.25;\n scanlines.blendMode.opacity.value = e.scanlines?.opacity ?? 0;\n\n vignette.darkness = e.vignette?.darkness ?? 0;\n vignette.offset = e.vignette?.offset ?? 0.5;\n\n const chromaOffset = e.chromatic?.offset ?? 0;\n chromatic.offset?.set(chromaOffset, chromaOffset);\n\n if (e.glitch) {\n glitch.minStrength = e.glitch.strength?.[0] ?? 0;\n glitch.maxStrength = e.glitch.strength?.[1] ?? 0;\n } else {\n glitch.minStrength = 0;\n glitch.maxStrength = 0;\n }\n }\n\n applyPreset(preset);\n\n return {\n composer,\n setPreset: applyPreset,\n resize: (w, h) => composer.setSize(w, h),\n dispose: () => {\n composer.dispose();\n },\n };\n};\n","/**\n * \"space\" scene — hyperspace starfield.\n *\n * Thousands of point-lines streaking past the camera in perspective.\n * Maps `primary` → core, `accent` → streak tail, `background` → clear color.\n * Shines under the VHS + Cinematic post presets (bloom + afterimage).\n */\n\nimport * as THREE from \"three\";\nimport type { SceneFactory, Palette } from \"../types\";\n\nconst STAR_COUNT = 3000;\nconst FIELD_DEPTH = 400;\nconst FIELD_RADIUS = 80;\n\nexport const spaceScene: SceneFactory = ({ width, height, palette }) => {\n const scene = new THREE.Scene();\n scene.background = new THREE.Color(palette.background);\n\n const camera = new THREE.PerspectiveCamera(\n 70,\n width / height,\n 0.1,\n FIELD_DEPTH * 2,\n );\n camera.position.z = 0;\n\n // Each star is a short line-segment from tail to head along +Z.\n const positions = new Float32Array(STAR_COUNT * 6); // 2 points per segment\n const colors = new Float32Array(STAR_COUNT * 6);\n const zOffsets = new Float32Array(STAR_COUNT);\n\n const primaryColor = new THREE.Color(palette.primary);\n const accentColor = new THREE.Color(palette.accent);\n\n function resetStar(i: number, randomZ: boolean) {\n // Radial distribution — denser near centre for a tunnel feel.\n const theta = Math.random() * Math.PI * 2;\n const r = FIELD_RADIUS * Math.pow(Math.random(), 0.6);\n const x = Math.cos(theta) * r;\n const y = Math.sin(theta) * r;\n const z = randomZ\n ? -Math.random() * FIELD_DEPTH\n : -FIELD_DEPTH;\n\n zOffsets[i] = z;\n\n // head\n positions[i * 6 + 0] = x;\n positions[i * 6 + 1] = y;\n positions[i * 6 + 2] = z;\n // tail — short streak, will grow at runtime based on speed\n positions[i * 6 + 3] = x;\n positions[i * 6 + 4] = y;\n positions[i * 6 + 5] = z - 2;\n\n // head = primary (bright core), tail = accent fading\n colors[i * 6 + 0] = primaryColor.r;\n colors[i * 6 + 1] = primaryColor.g;\n colors[i * 6 + 2] = primaryColor.b;\n colors[i * 6 + 3] = accentColor.r;\n colors[i * 6 + 4] = accentColor.g;\n colors[i * 6 + 5] = accentColor.b;\n }\n\n for (let i = 0; i < STAR_COUNT; i++) resetStar(i, true);\n\n const geometry = new THREE.BufferGeometry();\n geometry.setAttribute(\"position\", new THREE.BufferAttribute(positions, 3));\n geometry.setAttribute(\"color\", new THREE.BufferAttribute(colors, 3));\n\n const material = new THREE.LineBasicMaterial({\n vertexColors: true,\n transparent: true,\n opacity: 0.95,\n blending: THREE.AdditiveBlending,\n });\n\n const stars = new THREE.LineSegments(geometry, material);\n scene.add(stars);\n\n const SPEED = 60; // units per second\n const STREAK_LEN = 6;\n\n return {\n scene,\n camera,\n update: (_elapsed, delta) => {\n const pos = geometry.attributes.position.array as Float32Array;\n\n for (let i = 0; i < STAR_COUNT; i++) {\n const baseIdx = i * 6;\n // advance head Z\n pos[baseIdx + 2] += SPEED * delta;\n // keep tail behind the head by STREAK_LEN\n pos[baseIdx + 5] = pos[baseIdx + 2] - STREAK_LEN;\n\n // recycle past the camera\n if (pos[baseIdx + 2] > 5) {\n resetStar(i, false);\n }\n }\n\n geometry.attributes.position.needsUpdate = true;\n },\n resize: (w, h) => {\n const cam = camera as THREE.PerspectiveCamera;\n cam.aspect = w / h;\n cam.updateProjectionMatrix();\n },\n setPalette: (palette: Palette) => {\n scene.background = new THREE.Color(palette.background);\n const primary = new THREE.Color(palette.primary);\n const accent = new THREE.Color(palette.accent);\n const col = geometry.attributes.color.array as Float32Array;\n for (let i = 0; i < STAR_COUNT; i++) {\n col[i * 6 + 0] = primary.r;\n col[i * 6 + 1] = primary.g;\n col[i * 6 + 2] = primary.b;\n col[i * 6 + 3] = accent.r;\n col[i * 6 + 4] = accent.g;\n col[i * 6 + 5] = accent.b;\n }\n geometry.attributes.color.needsUpdate = true;\n },\n dispose: () => {\n geometry.dispose();\n material.dispose();\n },\n };\n};\n","/**\n * \"plasma\" scene — classic demoscene plasma field.\n *\n * Fullscreen-quad fragment shader. Overlapping sine waves modulate a palette\n * ramp, producing soft rolling colour clouds. Cheap on GPU — every pixel\n * runs a handful of sin() calls per frame, no geometry to speak of.\n *\n * Maps `background` → darkest end, `secondary` → midtone, `primary` → highlight,\n * `accent` → speckle tint. Works beautifully under Synthwave or Cinematic post-FX.\n */\n\nimport * as THREE from \"three\";\nimport type { SceneFactory, SceneHandle, Palette } from \"../types\";\n\nconst FRAGMENT = /* glsl */ `\n precision highp float;\n varying vec2 vUv;\n uniform float uTime;\n uniform vec2 uResolution;\n uniform vec3 uBackground;\n uniform vec3 uPrimary;\n uniform vec3 uSecondary;\n uniform vec3 uAccent;\n\n // 3-stop palette ramp driven by a scalar in [0,1].\n vec3 palette(float t) {\n t = clamp(t, 0.0, 1.0);\n vec3 lo = mix(uBackground, uSecondary, smoothstep(0.0, 0.5, t));\n vec3 hi = mix(uSecondary, uPrimary, smoothstep(0.5, 1.0, t));\n return mix(lo, hi, step(0.5, t));\n }\n\n void main() {\n // Normalise to centre-origin coords, preserving aspect.\n vec2 uv = (vUv - 0.5) * (uResolution.xy / min(uResolution.x, uResolution.y)) * 4.0;\n\n float t = uTime * 0.35;\n float v = 0.0;\n v += sin(uv.x * 1.2 + t);\n v += sin(uv.y * 1.6 + t * 1.3);\n v += sin((uv.x + uv.y) * 1.1 + t * 0.7);\n v += sin(length(uv) * 2.4 - t * 0.9);\n v = v * 0.125 + 0.5; // remap from [-4,4] → [0,1]\n\n vec3 col = palette(v);\n\n // Subtle accent shimmer along diagonal.\n float shimmer = sin((uv.x - uv.y) * 3.0 + uTime * 1.5) * 0.5 + 0.5;\n col = mix(col, uAccent, shimmer * 0.08);\n\n gl_FragColor = vec4(col, 1.0);\n }\n`;\n\nconst VERTEX = /* glsl */ `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = vec4(position.xy, 0.0, 1.0);\n }\n`;\n\nexport const plasmaScene: SceneFactory = ({ width, height, palette }) => {\n const scene = new THREE.Scene();\n const camera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1);\n\n const uniforms = {\n uTime: { value: 0 },\n uResolution: { value: new THREE.Vector2(width, height) },\n uBackground: { value: new THREE.Color(palette.background) },\n uPrimary: { value: new THREE.Color(palette.primary) },\n uSecondary: { value: new THREE.Color(palette.secondary) },\n uAccent: { value: new THREE.Color(palette.accent) },\n };\n\n const material = new THREE.ShaderMaterial({\n uniforms,\n vertexShader: VERTEX,\n fragmentShader: FRAGMENT,\n depthTest: false,\n depthWrite: false,\n });\n\n const geometry = new THREE.PlaneGeometry(2, 2);\n const quad = new THREE.Mesh(geometry, material);\n scene.add(quad);\n\n const handle: SceneHandle = {\n scene,\n camera,\n update: (elapsed) => {\n uniforms.uTime.value = elapsed;\n },\n resize: (w, h) => {\n uniforms.uResolution.value.set(w, h);\n },\n setPalette: (p: Palette) => {\n uniforms.uBackground.value.set(p.background);\n uniforms.uPrimary.value.set(p.primary);\n uniforms.uSecondary.value.set(p.secondary);\n uniforms.uAccent.value.set(p.accent);\n },\n dispose: () => {\n geometry.dispose();\n material.dispose();\n },\n };\n\n return handle;\n};\n","/**\n * \"voronoi\" scene — animated Voronoi cells.\n *\n * Fullscreen-quad fragment shader. A jittered grid where each cell's seed\n * point orbits slowly over time; pixels colour by their distance to the\n * nearest seed and by which cell they fall inside. Cell edges pulse in the\n * accent colour.\n *\n * Maps `background` → cell interiors, `primary` → cell fills, `secondary` → depth tint,\n * `accent` → edge glow. Looks great under CRT or VHS post-FX.\n */\n\nimport * as THREE from \"three\";\nimport type { SceneFactory, SceneHandle, Palette } from \"../types\";\n\nconst VERTEX = /* glsl */ `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = vec4(position.xy, 0.0, 1.0);\n }\n`;\n\nconst FRAGMENT = /* glsl */ `\n precision highp float;\n varying vec2 vUv;\n uniform float uTime;\n uniform vec2 uResolution;\n uniform vec3 uBackground;\n uniform vec3 uPrimary;\n uniform vec3 uSecondary;\n uniform vec3 uAccent;\n\n // Cheap 2D hash → vec2 in [0,1].\n vec2 hash2(vec2 p) {\n p = vec2(\n dot(p, vec2(127.1, 311.7)),\n dot(p, vec2(269.5, 183.3))\n );\n return fract(sin(p) * 43758.5453);\n }\n\n void main() {\n vec2 uv = vUv * (uResolution.xy / min(uResolution.x, uResolution.y)) * 6.0;\n\n vec2 ipos = floor(uv);\n vec2 fpos = fract(uv);\n\n float minDist = 1e9;\n float secondDist = 1e9;\n vec2 closestCell = vec2(0.0);\n\n for (int y = -1; y <= 1; y++) {\n for (int x = -1; x <= 1; x++) {\n vec2 neighbour = vec2(float(x), float(y));\n vec2 seed = hash2(ipos + neighbour);\n // Orbit each seed around its cell centre for gentle motion.\n vec2 offset = 0.5 + 0.5 * sin(uTime * 0.5 + seed * 6.283);\n vec2 diff = neighbour + offset - fpos;\n float d = dot(diff, diff);\n if (d < minDist) {\n secondDist = minDist;\n minDist = d;\n closestCell = ipos + neighbour;\n } else if (d < secondDist) {\n secondDist = d;\n }\n }\n }\n\n float cellShade = hash2(closestCell).x; // per-cell random 0..1\n float edge = sqrt(secondDist) - sqrt(minDist); // 0 at borders, grows inward\n float edgeGlow = 1.0 - smoothstep(0.0, 0.08, edge);\n\n vec3 fill = mix(uBackground, uPrimary, cellShade);\n fill = mix(fill, uSecondary, 0.25 * sin(uTime * 0.3 + cellShade * 6.28) + 0.25);\n vec3 col = mix(fill, uAccent, edgeGlow);\n\n gl_FragColor = vec4(col, 1.0);\n }\n`;\n\nexport const voronoiScene: SceneFactory = ({ width, height, palette }) => {\n const scene = new THREE.Scene();\n const camera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1);\n\n const uniforms = {\n uTime: { value: 0 },\n uResolution: { value: new THREE.Vector2(width, height) },\n uBackground: { value: new THREE.Color(palette.background) },\n uPrimary: { value: new THREE.Color(palette.primary) },\n uSecondary: { value: new THREE.Color(palette.secondary) },\n uAccent: { value: new THREE.Color(palette.accent) },\n };\n\n const material = new THREE.ShaderMaterial({\n uniforms,\n vertexShader: VERTEX,\n fragmentShader: FRAGMENT,\n depthTest: false,\n depthWrite: false,\n });\n\n const geometry = new THREE.PlaneGeometry(2, 2);\n const quad = new THREE.Mesh(geometry, material);\n scene.add(quad);\n\n const handle: SceneHandle = {\n scene,\n camera,\n update: (elapsed) => {\n uniforms.uTime.value = elapsed;\n },\n resize: (w, h) => {\n uniforms.uResolution.value.set(w, h);\n },\n setPalette: (p: Palette) => {\n uniforms.uBackground.value.set(p.background);\n uniforms.uPrimary.value.set(p.primary);\n uniforms.uSecondary.value.set(p.secondary);\n uniforms.uAccent.value.set(p.accent);\n },\n dispose: () => {\n geometry.dispose();\n material.dispose();\n },\n };\n\n return handle;\n};\n","/**\n * \"synthwave\" scene — retro-future grid with sun.\n *\n * Fullscreen-quad fragment shader that paints a perspective grid receding\n * to a horizon, a banded sun disc above it, and a soft sky gradient.\n * Chose fragment-only over real perspective geometry so the aspect ratio\n * adapts cleanly and there's nothing to dispose on resize.\n *\n * Maps `background` → sky base, `primary` → grid lines + sun bands,\n * `secondary` → sky fade, `accent` → horizon glow. Shines under Synthwave\n * or VHS post-FX.\n */\n\nimport * as THREE from \"three\";\nimport type { SceneFactory, SceneHandle, Palette } from \"../types\";\n\nconst VERTEX = /* glsl */ `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = vec4(position.xy, 0.0, 1.0);\n }\n`;\n\nconst FRAGMENT = /* glsl */ `\n precision highp float;\n varying vec2 vUv;\n uniform float uTime;\n uniform vec3 uBackground;\n uniform vec3 uPrimary;\n uniform vec3 uSecondary;\n uniform vec3 uAccent;\n\n // Horizon at y = 0.45 (upper band for sky + sun, lower band for grid).\n const float HORIZON = 0.45;\n\n // Perspective-projected grid in the lower half.\n // Returns grid intensity in [0,1].\n float grid(vec2 uv) {\n // Perspective: nearer rows get larger spacing. z grows as we go toward horizon.\n float z = 1.0 / max(uv.y, 0.001); // uv.y ∈ (0, HORIZON]\n vec2 gpos = vec2(uv.x * z, z - uTime * 2.0); // scroll lines toward camera\n\n vec2 g = fract(gpos * vec2(1.0, 0.25));\n vec2 lw = fwidth(gpos * vec2(1.0, 0.25)) * 1.5; // anti-aliased line width\n vec2 lines = smoothstep(vec2(0.0), lw, g)\n - smoothstep(1.0 - lw, vec2(1.0), g);\n // \"lines\" is ~1 between lines, ~0 on a line → invert.\n float l = 1.0 - min(lines.x, lines.y);\n\n // Fade grid as it approaches horizon (z → ∞ means very far).\n float fade = clamp(1.0 - z * 0.02, 0.0, 1.0);\n return l * fade;\n }\n\n void main() {\n vec2 uv = vUv - vec2(0.5, HORIZON);\n\n vec3 col;\n\n if (vUv.y >= HORIZON) {\n // Sky half.\n float skyT = (vUv.y - HORIZON) / (1.0 - HORIZON);\n col = mix(uBackground, uSecondary, skyT);\n\n // Sun disc — centred above horizon with horizontal bands.\n vec2 sunUv = uv;\n sunUv.y -= 0.05;\n float d = length(sunUv * vec2(1.0, 1.2));\n float disc = smoothstep(0.22, 0.21, d);\n // Horizontal bands across the lower half of the sun.\n float bandY = (sunUv.y - 0.05) * 25.0;\n float bands = step(0.0, sin(bandY));\n float bandMask = smoothstep(0.05, -0.05, sunUv.y); // only bands below sun centre\n disc *= mix(1.0, bands, bandMask);\n col = mix(col, uPrimary, disc);\n\n // Horizon glow.\n float glow = smoothstep(0.08, 0.0, vUv.y - HORIZON);\n col = mix(col, uAccent, glow * 0.6);\n } else {\n // Ground half.\n float floorUv = HORIZON - vUv.y; // 0 at horizon, grows down\n float g = grid(vec2(uv.x, floorUv));\n vec3 ground = mix(uBackground * 0.3, uBackground * 0.7, floorUv / HORIZON);\n col = mix(ground, uPrimary, g);\n\n // Horizon glow bleeding into ground.\n float glow = smoothstep(0.06, 0.0, floorUv);\n col = mix(col, uAccent, glow * 0.8);\n }\n\n gl_FragColor = vec4(col, 1.0);\n }\n`;\n\nexport const synthwaveScene: SceneFactory = ({ palette }) => {\n const scene = new THREE.Scene();\n const camera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1);\n\n const uniforms = {\n uTime: { value: 0 },\n uBackground: { value: new THREE.Color(palette.background) },\n uPrimary: { value: new THREE.Color(palette.primary) },\n uSecondary: { value: new THREE.Color(palette.secondary) },\n uAccent: { value: new THREE.Color(palette.accent) },\n };\n\n const material = new THREE.ShaderMaterial({\n uniforms,\n vertexShader: VERTEX,\n fragmentShader: FRAGMENT,\n depthTest: false,\n depthWrite: false,\n });\n\n const geometry = new THREE.PlaneGeometry(2, 2);\n const quad = new THREE.Mesh(geometry, material);\n scene.add(quad);\n\n const handle: SceneHandle = {\n scene,\n camera,\n update: (elapsed) => {\n uniforms.uTime.value = elapsed;\n },\n setPalette: (p: Palette) => {\n uniforms.uBackground.value.set(p.background);\n uniforms.uPrimary.value.set(p.primary);\n uniforms.uSecondary.value.set(p.secondary);\n uniforms.uAccent.value.set(p.accent);\n },\n dispose: () => {\n geometry.dispose();\n material.dispose();\n },\n };\n\n return handle;\n};\n","/**\n * Shader preset registry — maps semantic preset ids to scene factories\n * plus metadata for the picker UI.\n *\n * Adding a new preset:\n * 1. Write a SceneFactory in `./scenes/<name>.ts`\n * 2. Register it in `sceneRegistry` below\n * 3. Add a `ShaderPreset` entry in `shaderPresets`\n *\n * Both `<ThreeScene preset=\"space\" />` and `<ShaderPresetPicker />` read\n * from this registry so they stay in lockstep.\n */\n\nimport type { ShaderPreset, SceneFactory } from \"./types\";\nimport { spaceScene } from \"./scenes/space\";\nimport { plasmaScene } from \"./scenes/plasma\";\nimport { voronoiScene } from \"./scenes/voronoi\";\nimport { synthwaveScene } from \"./scenes/synthwave\";\n\nexport const sceneRegistry: Record<string, SceneFactory> = {\n space: spaceScene,\n plasma: plasmaScene,\n voronoi: voronoiScene,\n synthwave: synthwaveScene,\n // Further candidates: icosa, oscilloscope, retro-sunset, sdf\n};\n\nexport const shaderPresets: ShaderPreset[] = [\n {\n id: \"space\",\n label: \"Hyperspace\",\n description:\n \"Classic 'jump to hyperspace' — streaking stars flying past camera. Pairs well with VHS or Cinematic post-FX.\",\n tags: [\"space\", \"retro\", \"motion\", \"hero\", \"background\"],\n scene: \"space\",\n defaultPostPreset: \"vhs\",\n },\n {\n id: \"plasma\",\n label: \"Plasma\",\n description:\n \"Soft rolling colour clouds — overlapping sines warping a palette ramp. Classic demoscene vibe. Pairs well with Synthwave or Cinematic.\",\n tags: [\"abstract\", \"soft\", \"ambient\", \"hero\", \"background\", \"gradient\"],\n scene: \"plasma\",\n defaultPostPreset: \"synthwave\",\n },\n {\n id: \"voronoi\",\n label: \"Voronoi\",\n description:\n \"Jittered cellular grid — orbiting seed points form animated cells with glowing edges. Great for data / organic / network moods. Pairs well with CRT or VHS.\",\n tags: [\"abstract\", \"cells\", \"organic\", \"network\", \"hero\", \"background\"],\n scene: \"voronoi\",\n defaultPostPreset: \"crt\",\n },\n {\n id: \"synthwave\",\n label: \"Synthwave Grid\",\n description:\n \"Retro-future perspective grid receding to a banded sun disc on the horizon. Pairs beautifully with the Synthwave post preset (its namesake).\",\n tags: [\"retro\", \"synthwave\", \"80s\", \"hero\", \"background\", \"grid\", \"sun\"],\n scene: \"synthwave\",\n defaultPostPreset: \"synthwave\",\n },\n];\n\nexport const shaderPresetById = Object.fromEntries(\n shaderPresets.map((p) => [p.id, p]),\n) as Record<string, ShaderPreset>;\n\nexport type ShaderPresetId = (typeof shaderPresets)[number][\"id\"];\n","/**\n * Post-FX preset registry.\n *\n * Each preset is a tunable description of the post-FX stack. Lives as data\n * so the same registry drives `<ThreeScene postPreset=\"vhs\" />` and the\n * preset picker's preview thumbnails.\n */\n\nimport type { PostPreset } from \"./types\";\n\nexport const postPresets: Record<string, PostPreset> = {\n none: {\n id: \"none\",\n label: \"Clean\",\n effects: {},\n },\n vhs: {\n id: \"vhs\",\n label: \"VHS\",\n effects: {\n bloom: { intensity: 0.35, luminanceThreshold: 0.5, radius: 0.7 },\n noise: { intensity: 0.04 }, // dialled down per user feedback\n scanlines: { density: 1.5, opacity: 0.12 },\n vignette: { darkness: 0.4, offset: 0.45 },\n chromatic: { offset: 0.0015 },\n },\n },\n cinematic: {\n id: \"cinematic\",\n label: \"Cinematic\",\n effects: {\n bloom: { intensity: 0.5, luminanceThreshold: 0.55, radius: 0.8 },\n vignette: { darkness: 0.5, offset: 0.5 },\n },\n },\n synthwave: {\n id: \"synthwave\",\n label: \"Synthwave\",\n effects: {\n bloom: { intensity: 0.8, luminanceThreshold: 0.3, radius: 0.9 },\n chromatic: { offset: 0.002 },\n vignette: { darkness: 0.3, offset: 0.55 },\n },\n },\n crt: {\n id: \"crt\",\n label: \"CRT\",\n effects: {\n bloom: { intensity: 0.2, luminanceThreshold: 0.7, radius: 0.4 },\n scanlines: { density: 2.0, opacity: 0.25 },\n vignette: { darkness: 0.6, offset: 0.4 },\n chromatic: { offset: 0.0025 },\n },\n },\n};\n\nexport type PostPresetId = keyof typeof postPresets;\n\nexport const defaultPostPreset: PostPresetId = \"vhs\";\n","/**\n * Custom fragment shader scene — runs a user-supplied GLSL fragment shader\n * on a fullscreen quad with a standardised uniform set.\n *\n * This is the \"write me a shader from a prompt\" surface. Instead of asking\n * an LLM to author a full three.js SceneFactory (imports, geometry, etc.),\n * it only has to write `void main()` against a known uniform contract.\n *\n * The uniforms ARE the design contract — mirror the same palette slots\n * that presets use, so custom shaders pick up theming for free.\n */\n\nimport * as THREE from \"three\";\nimport type { SceneFactory, SceneHandle, Palette } from \"./types\";\n\n/**\n * Auto-injected prelude — defines every uniform and varying the user's\n * fragment can reference. Users should NOT redeclare these. Their shader\n * source is appended verbatim to this header.\n *\n * Kept as glsl100 (varying / gl_FragColor) since that's the syntax\n * dominant in LLM training data; three.js auto-upgrades it for WebGL2.\n */\nexport const FRAGMENT_HEADER = /* glsl */ `\n precision highp float;\n varying vec2 vUv;\n uniform float uTime;\n uniform vec2 uResolution;\n uniform vec2 uMouse;\n uniform vec3 uPrimary;\n uniform vec3 uSecondary;\n uniform vec3 uAccent;\n uniform vec3 uBackground;\n`;\n\nconst VERTEX_FULLSCREEN = /* glsl */ `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = vec4(position.xy, 0.0, 1.0);\n }\n`;\n\n/**\n * Thrown when the user's fragment shader fails to compile. Carries both the\n * GL info log and the original source so callers can surface it or fall back.\n */\nexport class ShaderCompileError extends Error {\n readonly log: string;\n readonly source: string;\n constructor(log: string, source: string) {\n super(`Fragment shader failed to compile:\\n${log.trim()}`);\n this.name = \"ShaderCompileError\";\n this.log = log;\n this.source = source;\n }\n}\n\n/**\n * Pre-compile a fragment shader against the renderer's live GL context so we\n * can surface errors BEFORE attaching the material to a scene. three.js's own\n * compile path logs to console and silently renders black — not what we want\n * when the user expects either a working shader or a clear fallback.\n */\nfunction precompileFragment(renderer: THREE.WebGLRenderer, source: string): void {\n const gl = renderer.getContext() as WebGLRenderingContext | WebGL2RenderingContext;\n const shader = gl.createShader(gl.FRAGMENT_SHADER);\n if (!shader) throw new Error(\"Unable to allocate fragment shader\");\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n const ok = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n const log = gl.getShaderInfoLog(shader) || \"\";\n gl.deleteShader(shader);\n if (!ok) throw new ShaderCompileError(log, source);\n}\n\n/**\n * Build a SceneFactory from a user-supplied fragment shader body.\n *\n * Throws `ShaderCompileError` synchronously (from the SceneContext call) if\n * the GLSL doesn't compile. ThreeScene catches this and falls back to\n * `preset=\"space\"` so the UI stays populated.\n */\nexport function buildFragmentShaderScene(userFragment: string): SceneFactory {\n return ({ renderer, width, height, palette }) => {\n const combined = `${FRAGMENT_HEADER}\\n${userFragment}`;\n\n // Surfaces compile errors up to the caller with the GL info log attached.\n precompileFragment(renderer, combined);\n\n const scene = new THREE.Scene();\n const camera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1);\n\n const uniforms: Record<string, THREE.IUniform> = {\n uTime: { value: 0 },\n uResolution: { value: new THREE.Vector2(width, height) },\n uMouse: { value: new THREE.Vector2(0.5, 0.5) },\n uPrimary: { value: new THREE.Color(palette.primary) },\n uSecondary: { value: new THREE.Color(palette.secondary) },\n uAccent: { value: new THREE.Color(palette.accent) },\n uBackground: { value: new THREE.Color(palette.background) },\n };\n\n const material = new THREE.ShaderMaterial({\n uniforms,\n vertexShader: VERTEX_FULLSCREEN,\n fragmentShader: combined,\n depthTest: false,\n depthWrite: false,\n });\n\n const geometry = new THREE.PlaneGeometry(2, 2);\n const quad = new THREE.Mesh(geometry, material);\n scene.add(quad);\n\n const handle: SceneHandle & { setMouse?: (x: number, y: number) => void } = {\n scene,\n camera,\n update: (elapsed) => {\n uniforms.uTime.value = elapsed;\n },\n resize: (w, h) => {\n (uniforms.uResolution.value as THREE.Vector2).set(w, h);\n },\n setPalette: (p: Palette) => {\n (uniforms.uPrimary.value as THREE.Color).set(p.primary);\n (uniforms.uSecondary.value as THREE.Color).set(p.secondary);\n (uniforms.uAccent.value as THREE.Color).set(p.accent);\n (uniforms.uBackground.value as THREE.Color).set(p.background);\n },\n setMouse: (x, y) => {\n (uniforms.uMouse.value as THREE.Vector2).set(x, y);\n },\n dispose: () => {\n geometry.dispose();\n material.dispose();\n },\n };\n\n return handle;\n };\n}\n\n/** Public handle type — ThreeScene uses the optional `setMouse` for pointer tracking. */\nexport interface FragmentSceneHandle extends SceneHandle {\n setMouse?: (x: number, y: number) => void;\n}\n","\"use client\";\n\n/**\n * ThreeScene — the WebGL media primitive.\n *\n * Supports two modes:\n * 1. Preset mode: <ThreeScene preset=\"space\" postPreset=\"vhs\" />\n * 2. Custom mode: <ThreeScene createScene={({ renderer, width, height, palette }) => ({ scene, camera, update, dispose })} />\n *\n * Post-FX composer is always applied; use postPreset=\"none\" for a clean render.\n *\n * Zero-chrome viewer mode: the default. Pass `controls` to show a minimal\n * play/pause overlay. Scene pauses when offscreen (pauseOffscreen default `true`).\n */\n\nimport * as React from \"react\";\nimport * as THREE from \"three\";\nimport { Play, Pause } from \"lucide-react\";\nimport {\n MediaSurface,\n type BaseMediaProps,\n usePrefersReducedMotion,\n} from \"./media-surface\";\nimport { Button } from \"./button\";\nimport { cn } from \"@/lib/utils\";\n\nimport type {\n SceneFactory,\n SceneHandle,\n Palette,\n} from \"@/lib/three/types\";\nimport { createPostComposer } from \"@/lib/three/post-composer\";\nimport { sceneRegistry, shaderPresetById } from \"@/lib/three/shader-presets\";\nimport { postPresets, defaultPostPreset } from \"@/lib/three/post-presets\";\nimport {\n buildFragmentShaderScene,\n ShaderCompileError,\n} from \"@/lib/three/custom-fragment\";\n\n/** Theme-friendly default palette. Consumers override per-tile if they want. */\nconst DEFAULT_PALETTE: Palette = {\n primary: \"#ff5fb9\",\n secondary: \"#9fe8ff\",\n accent: \"#ffc857\",\n background: \"#0a0a14\",\n};\n\n// Shadcn / gradeui store their design tokens as bare channel triplets so the\n// same custom property can be composed into `oklch()`, `hsl()`, or relative\n// colour expressions at the use-site. But that means `var(--primary)` on its\n// own expands to something like `\"0.610 0.128 20\"` which is NOT a valid CSS\n// <color>, so the browser silently falls back to the inherited colour —\n// usually black. We detect that pattern here and re-wrap before handing the\n// value to the DOM probe.\nconst OKLCH_TRIPLET =\n /^[\\d.]+\\s+[\\d.]+\\s+[\\d.]+(?:\\s*\\/\\s*[\\d.%]+)?$/; // \"0.61 0.13 20\" — no % signs\nconst HSL_TRIPLET =\n /^[\\d.]+\\s+[\\d.]+%\\s+[\\d.]+%(?:\\s*\\/\\s*[\\d.%]+)?$/; // \"20 90% 48%\" — shadcn HSL\nconst VAR_REF = /^\\s*var\\(\\s*(--[^,)\\s]+)(?:\\s*,[^)]*)?\\s*\\)\\s*$/;\n\n/**\n * Resolve any CSS-legal colour expression to a THREE-parseable string.\n *\n * Three-step resolution:\n *\n * 1. Design-token unwrap — if the input is a `var(--token)` reference,\n * read the raw custom-property value off the host. If that value is a\n * bare channel triplet (shadcn/gradeui convention), re-wrap it as\n * `oklch(...)` / `hsl(...)` so the DOM probe gets a valid colour.\n *\n * 2. DOM probe — assign to a detached span's inline colour and read\n * `getComputedStyle(probe).color`. Resolves remaining var() and\n * validates syntax.\n *\n * 3. Canvas rasterisation — the computed form may be `oklch(...)`,\n * `oklab(...)` or `color(srgb ...)`. `THREE.Color.setStyle()` only\n * parses `rgb()`/`hsl()`/hex/named, so we paint the computed colour\n * into a 1×1 canvas and read the rasterised sRGB bytes. Canvas is\n * guaranteed to gamut-convert any CSS colour, so the round-trip\n * always yields a THREE-parseable `rgb()`.\n */\nfunction resolveCssColor(\n input: string,\n host: HTMLElement,\n fallback: string,\n): string {\n if (typeof document === \"undefined\") return fallback;\n\n // Step 1: detect bare-triplet design tokens and re-wrap.\n let effectiveInput = input;\n const varRef = VAR_REF.exec(input);\n if (varRef) {\n const raw = getComputedStyle(host).getPropertyValue(varRef[1]).trim();\n if (raw) {\n if (OKLCH_TRIPLET.test(raw)) {\n effectiveInput = `oklch(${raw})`;\n } else if (HSL_TRIPLET.test(raw)) {\n effectiveInput = `hsl(${raw})`;\n }\n }\n }\n\n // Step 2: resolve remaining var() and validate via DOM probe.\n const probe = document.createElement(\"span\");\n probe.style.color = \"\";\n probe.style.color = effectiveInput;\n if (probe.style.color === \"\") return fallback;\n probe.style.display = \"none\";\n host.appendChild(probe);\n const computed = getComputedStyle(probe).color;\n host.removeChild(probe);\n if (!computed) return fallback;\n\n // Fast path: already in rgb()/rgba() form — skip canvas round-trip.\n if (computed.startsWith(\"rgb\")) return computed;\n\n // Step 3: gamut-convert oklch()/oklab()/color(...) via canvas rasterisation.\n try {\n const canvas = document.createElement(\"canvas\");\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return computed;\n ctx.clearRect(0, 0, 1, 1);\n ctx.fillStyle = computed;\n ctx.fillRect(0, 0, 1, 1);\n const [r, g, b] = ctx.getImageData(0, 0, 1, 1).data;\n return `rgb(${r}, ${g}, ${b})`;\n } catch {\n // Bail gracefully — return whatever the DOM probe gave us and let\n // THREE.Color fall back to its own default on an unparseable input.\n return computed;\n }\n}\n\nfunction resolvePalette(palette: Palette, host: HTMLElement): Palette {\n return {\n primary: resolveCssColor(palette.primary, host, DEFAULT_PALETTE.primary),\n secondary: resolveCssColor(\n palette.secondary,\n host,\n DEFAULT_PALETTE.secondary,\n ),\n accent: resolveCssColor(palette.accent, host, DEFAULT_PALETTE.accent),\n background: resolveCssColor(\n palette.background,\n host,\n DEFAULT_PALETTE.background,\n ),\n };\n}\n\nexport interface ThreeSceneProps\n extends Omit<BaseMediaProps, \"src\" | \"poster\"> {\n /** Preset id from the shader preset registry. */\n preset?: string;\n /**\n * User-authored GLSL fragment shader body. Runs on a fullscreen quad with\n * a standardised uniform contract (uTime, uResolution, uMouse, uPrimary,\n * uSecondary, uAccent, uBackground + varying vUv). Header is auto-injected\n * — DO NOT redeclare the uniforms. Write `void main()` only.\n *\n * Precedence: `createScene` > `fragmentShader` > `preset`. On compile\n * failure the component falls back to `preset=\"space\"` and fires\n * `onShaderError`.\n */\n fragmentShader?: string;\n /** Called when a supplied `fragmentShader` fails to compile. */\n onShaderError?: (error: ShaderCompileError) => void;\n /** Post-FX preset id. Defaults to the preset's `defaultPostPreset` or \"vhs\". */\n postPreset?: string;\n /** Palette overrides. Unset slots fall back to `DEFAULT_PALETTE`. */\n palette?: Partial<Palette>;\n /**\n * Custom scene factory. Takes precedence over `preset` and `fragmentShader`.\n * Use for bespoke three.js scenes that don't fit a preset or fullscreen quad.\n */\n createScene?: SceneFactory;\n /** Static poster to show while the GL context warms up. */\n poster?: string;\n /** Pixel-ratio cap. Defaults to `Math.min(window.devicePixelRatio, 2)`. */\n maxDpr?: number;\n}\n\nexport const ThreeScene = React.forwardRef<HTMLDivElement, ThreeSceneProps>(\n (\n {\n preset,\n fragmentShader,\n onShaderError,\n postPreset,\n palette: paletteProp,\n createScene: createSceneProp,\n controls = false,\n autoPlay = true,\n pauseOffscreen = true,\n aspect = \"video\",\n radius = \"lg\",\n border = false,\n poster,\n label,\n className,\n style,\n maxDpr,\n },\n ref,\n ) => {\n const hostRef = React.useRef<HTMLDivElement | null>(null);\n const [playing, setPlaying] = React.useState(autoPlay);\n const [ready, setReady] = React.useState(false);\n const reduced = usePrefersReducedMotion();\n\n // Merge palette prop with defaults\n const palette = React.useMemo<Palette>(\n () => ({ ...DEFAULT_PALETTE, ...paletteProp }),\n [paletteProp],\n );\n\n // Resolve scene factory.\n // 1. Explicit createScene wins (power-user escape hatch).\n // 2. fragmentShader — user wrote GLSL; build a fullscreen-quad scene.\n // We wrap in an outer arrow so compile errors throw inside the effect\n // and can be caught + surfaced, rather than bubbling out of useMemo.\n // 3. Preset id from the registry.\n const resolvedFactory: SceneFactory | null = React.useMemo(() => {\n if (createSceneProp) return createSceneProp;\n if (fragmentShader) return buildFragmentShaderScene(fragmentShader);\n if (preset && sceneRegistry[preset]) return sceneRegistry[preset];\n return null;\n }, [createSceneProp, fragmentShader, preset]);\n\n // Resolve post preset id\n const resolvedPostPresetId = React.useMemo(() => {\n if (postPreset) return postPreset;\n if (preset) {\n const p = shaderPresetById[preset];\n if (p?.defaultPostPreset) return p.defaultPostPreset;\n }\n return defaultPostPreset;\n }, [postPreset, preset]);\n\n React.useEffect(() => {\n const host = hostRef.current;\n if (!host || !resolvedFactory) return;\n\n const width = host.clientWidth || 1;\n const height = host.clientHeight || 1;\n\n // Resolve palette CSS expressions (var(), oklch(), lab(), hex, rgb(),\n // named colours) into THREE-parseable rgb() strings via a DOM probe.\n // Done AFTER host is in the document so custom properties resolve.\n const livePalette = resolvePalette(palette, host);\n\n const renderer = new THREE.WebGLRenderer({\n antialias: true,\n alpha: false,\n powerPreference: \"high-performance\",\n });\n const dpr = maxDpr ?? Math.min(window.devicePixelRatio || 1, 2);\n renderer.setPixelRatio(dpr);\n renderer.setSize(width, height);\n renderer.setClearColor(new THREE.Color(livePalette.background), 1);\n renderer.domElement.dataset.gdsPart = \"shader-canvas\";\n renderer.domElement.style.width = \"100%\";\n renderer.domElement.style.height = \"100%\";\n renderer.domElement.style.display = \"block\";\n host.appendChild(renderer.domElement);\n\n // Instantiate the scene. A user-supplied fragment shader can fail to\n // compile here — we catch, fire onShaderError, and fall back to the\n // \"space\" preset so the surface is never left blank.\n let handle: SceneHandle;\n try {\n handle = resolvedFactory({\n renderer,\n width,\n height,\n palette: livePalette,\n });\n } catch (err) {\n if (err instanceof ShaderCompileError) {\n onShaderError?.(err);\n handle = sceneRegistry.space({\n renderer,\n width,\n height,\n palette: livePalette,\n });\n } else {\n // Unknown failure — tear down and re-throw so the app sees it.\n renderer.dispose();\n if (renderer.domElement.parentElement === host) {\n host.removeChild(renderer.domElement);\n }\n throw err;\n }\n }\n\n const postPresetObj =\n postPresets[resolvedPostPresetId] ?? postPresets[defaultPostPreset];\n\n const post = createPostComposer({\n renderer,\n scene: handle.scene,\n camera: handle.camera,\n preset: postPresetObj,\n width,\n height,\n });\n\n const clock = new THREE.Clock();\n let rafId = 0;\n let running = autoPlay && !reduced;\n let visible = true;\n\n const tick = () => {\n rafId = requestAnimationFrame(tick);\n if (!running || (pauseOffscreen && !visible)) return;\n const delta = clock.getDelta();\n const elapsed = clock.getElapsedTime();\n handle.update?.(elapsed, delta);\n post.composer.render(delta);\n };\n tick();\n if (running) setReady(true);\n\n // ResizeObserver for responsive canvas\n const ro = new ResizeObserver(([entry]) => {\n const w = Math.max(1, Math.floor(entry.contentRect.width));\n const h = Math.max(1, Math.floor(entry.contentRect.height));\n renderer.setSize(w, h);\n post.resize(w, h);\n handle.resize?.(w, h);\n });\n ro.observe(host);\n\n // Visibility — intersection observer\n const io = new IntersectionObserver(\n ([entry]) => {\n visible = entry.isIntersecting;\n },\n { threshold: 0.05 },\n );\n io.observe(host);\n\n // Theme-change observer — when a consumer flips the root class / data-theme\n // attr (GradeThemeProvider, dark-mode toggle, custom theme swap), re-resolve\n // any CSS-var-driven palette entries and push them into the live scene\n // without remounting WebGL.\n const themeObserver = new MutationObserver(() => {\n if (!hostRef.current) return;\n const next = resolvePalette(palette, hostRef.current);\n renderer.setClearColor(new THREE.Color(next.background), 1);\n handle.setPalette?.(next);\n });\n themeObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\n \"class\",\n \"style\",\n \"data-theme\",\n \"data-gds-theme\",\n \"data-grade-mode\",\n ],\n });\n\n // Pointer tracking — only wired up if the scene exposes `setMouse`\n // (currently just fragment-shader scenes). Normalised to [0,1] with\n // y flipped so the coordinates match GLSL's origin-at-bottom-left.\n const sceneWithMouse = handle as SceneHandle & {\n setMouse?: (x: number, y: number) => void;\n };\n const onPointerMove = sceneWithMouse.setMouse\n ? (ev: PointerEvent) => {\n const rect = host.getBoundingClientRect();\n const x = (ev.clientX - rect.left) / rect.width;\n const y = 1 - (ev.clientY - rect.top) / rect.height;\n sceneWithMouse.setMouse!(x, y);\n }\n : null;\n if (onPointerMove) host.addEventListener(\"pointermove\", onPointerMove);\n\n // Expose a live handle for the controls overlay + palette updates\n liveRef.current = {\n toggle: () => {\n running = !running;\n setPlaying(running);\n },\n setPalette: (p: Palette) => {\n renderer.setClearColor(new THREE.Color(p.background), 1);\n handle.setPalette?.(p);\n },\n setPostPreset: (id: string) => {\n const next = postPresets[id];\n if (next) post.setPreset(next);\n },\n };\n\n return () => {\n cancelAnimationFrame(rafId);\n ro.disconnect();\n io.disconnect();\n themeObserver.disconnect();\n if (onPointerMove) host.removeEventListener(\"pointermove\", onPointerMove);\n post.dispose();\n handle.dispose?.();\n renderer.dispose();\n if (renderer.domElement.parentElement === host) {\n host.removeChild(renderer.domElement);\n }\n liveRef.current = null;\n };\n // Factory/palette/post-preset changes remount the whole thing (simpler than\n // rebuilding in place, and palette changes are rare enough that it's fine).\n }, [\n resolvedFactory,\n resolvedPostPresetId,\n palette,\n autoPlay,\n reduced,\n pauseOffscreen,\n maxDpr,\n onShaderError,\n ]);\n\n const liveRef = React.useRef<{\n toggle: () => void;\n setPalette: (p: Palette) => void;\n setPostPreset: (id: string) => void;\n } | null>(null);\n\n const togglePlay = () => liveRef.current?.toggle();\n\n return (\n <MediaSurface\n ref={(node) => {\n hostRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n }}\n aspect={aspect}\n radius={radius}\n border={border}\n aria-label={label}\n className={className}\n style={style}\n data-gds-part=\"three-scene\"\n >\n {!ready && poster && (\n // eslint-disable-next-line @next/next/no-img-element\n <img\n src={poster}\n alt=\"\"\n className=\"absolute inset-0 w-full h-full object-cover\"\n data-gds-part=\"scene-poster\"\n />\n )}\n {controls && (\n <div\n data-gds-part=\"scene-controls\"\n className={cn(\n \"absolute inset-0 flex items-end justify-end p-2\",\n \"opacity-0 hover:opacity-100 transition-opacity\",\n \"bg-gradient-to-t from-black/30 to-transparent\",\n )}\n >\n <Button size=\"icon\" variant=\"secondary\" onClick={togglePlay}>\n {playing ? (\n <Pause className=\"h-4 w-4\" />\n ) : (\n <Play className=\"h-4 w-4\" />\n )}\n </Button>\n </div>\n )}\n </MediaSurface>\n );\n },\n);\nThreeScene.displayName = \"ThreeScene\";\n","\"use client\";\n\n/**\n * ShaderPresetPreview — a thumbnail-sized preview of a shader preset.\n *\n * Default behaviour: static poster until hovered, then kick in a live\n * `<ThreeScene>` render. Keeps gallery pages cheap (ten live shaders on\n * one page eats FPS fast, Safari caps WebGL contexts ~8).\n *\n * Props:\n * live: \"never\" → always show poster, no canvas\n * live: \"hover\" → (default) canvas spins up on hover, tears down on leave\n * live: \"always\" → canvas always rendering\n */\n\nimport * as React from \"react\";\nimport { ThreeScene } from \"./three-scene\";\nimport { MediaSurface } from \"./media-surface\";\nimport { shaderPresetById } from \"@/lib/three/shader-presets\";\nimport { cn } from \"@/lib/utils\";\nimport type { Palette } from \"@/lib/three/types\";\n\nexport interface ShaderPresetPreviewProps {\n preset: string;\n live?: \"never\" | \"hover\" | \"always\";\n postPreset?: string;\n palette?: Partial<Palette>;\n className?: string;\n aspect?: \"video\" | \"square\" | \"portrait\" | \"wide\";\n radius?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n /** Text label shown on the card. Defaults to preset label. */\n label?: string;\n /** Hide the label strip. */\n hideLabel?: boolean;\n onClick?: () => void;\n}\n\nexport const ShaderPresetPreview = React.forwardRef<\n HTMLDivElement,\n ShaderPresetPreviewProps\n>(\n (\n {\n preset,\n live = \"hover\",\n postPreset,\n palette,\n className,\n aspect = \"video\",\n radius = \"lg\",\n label,\n hideLabel = false,\n onClick,\n },\n ref,\n ) => {\n const entry = shaderPresetById[preset];\n const [hovered, setHovered] = React.useState(false);\n const shouldRender = live === \"always\" || (live === \"hover\" && hovered);\n\n return (\n <div\n ref={ref}\n data-gds-part=\"picker-card\"\n data-gds-preset={preset}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n onClick={onClick}\n className={cn(\n \"group cursor-pointer flex flex-col gap-2\",\n className,\n )}\n >\n {shouldRender ? (\n <ThreeScene\n preset={preset}\n postPreset={postPreset}\n palette={palette}\n aspect={aspect}\n radius={radius}\n autoPlay\n controls={false}\n pauseOffscreen\n poster={entry?.poster}\n maxDpr={1} // thumbnails — keep GPU work low\n />\n ) : (\n <MediaSurface\n aspect={aspect}\n radius={radius}\n data-gds-part=\"preset-poster\"\n className=\"bg-gradient-to-br from-muted to-muted/50\"\n >\n {entry?.poster ? (\n // eslint-disable-next-line @next/next/no-img-element\n <img\n src={entry.poster}\n alt={entry.label}\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center text-xs text-muted-foreground\">\n {entry?.label ?? preset}\n </div>\n )}\n </MediaSurface>\n )}\n {!hideLabel && (\n <div className=\"flex items-baseline justify-between text-xs\">\n <span\n className=\"font-medium text-foreground\"\n data-gds-part=\"preset-label\"\n >\n {label ?? entry?.label ?? preset}\n </span>\n {entry?.tags?.[0] && (\n <span className=\"text-muted-foreground\">{entry.tags[0]}</span>\n )}\n </div>\n )}\n </div>\n );\n },\n);\nShaderPresetPreview.displayName = \"ShaderPresetPreview\";\n","\"use client\";\n\n/**\n * ShaderPresetPicker — runtime preset gallery + selection.\n *\n * A grid of `<ShaderPresetPreview>` cards. Click to select. Used for\n * things like \"pick a vibe for your course background\".\n *\n * For a browsing-only catalogue with no selection, just lay out\n * `<ShaderPresetPreview>` directly.\n *\n * TODO(phase 2): static catalogue page for the docs site mirroring this.\n */\n\nimport * as React from \"react\";\nimport { ShaderPresetPreview } from \"./shader-preset-preview\";\nimport { shaderPresets } from \"@/lib/three/shader-presets\";\nimport { cn } from \"@/lib/utils\";\nimport { Check } from \"lucide-react\";\nimport type { Palette } from \"@/lib/three/types\";\n\nexport interface ShaderPresetPickerProps {\n /** Currently selected preset id (controlled). */\n value?: string;\n /** Called when the user clicks a preset. */\n onChange?: (presetId: string) => void;\n /** Filter by tag — e.g. only show `\"space\"` or `\"retro\"` presets. */\n filterTags?: string[];\n /** Live-render mode for thumbnails. Default \"hover\". */\n live?: \"never\" | \"hover\" | \"always\";\n /** Shared post-FX preset applied to all thumbnails. Default: each preset's own. */\n postPreset?: string;\n /** Shared palette for all thumbnails. */\n palette?: Partial<Palette>;\n /** Columns at md+ breakpoint. Default 3. */\n columns?: 2 | 3 | 4;\n className?: string;\n}\n\nexport function ShaderPresetPicker({\n value,\n onChange,\n filterTags,\n live = \"hover\",\n postPreset,\n palette,\n columns = 3,\n className,\n}: ShaderPresetPickerProps) {\n const presets = React.useMemo(() => {\n if (!filterTags?.length) return shaderPresets;\n return shaderPresets.filter((p) =>\n filterTags.some((t) => p.tags.includes(t)),\n );\n }, [filterTags]);\n\n const colsClass =\n columns === 2\n ? \"md:grid-cols-2\"\n : columns === 4\n ? \"md:grid-cols-4\"\n : \"md:grid-cols-3\";\n\n return (\n <div\n data-gds-part=\"preset-grid\"\n role=\"radiogroup\"\n className={cn(\"grid grid-cols-2 gap-3\", colsClass, className)}\n >\n {presets.map((preset) => {\n const selected = value === preset.id;\n return (\n <div key={preset.id} className=\"relative\" role=\"radio\" aria-checked={selected}>\n <ShaderPresetPreview\n preset={preset.id}\n postPreset={postPreset}\n palette={palette}\n live={live}\n onClick={() => onChange?.(preset.id)}\n className={cn(\n \"transition-all\",\n selected && \"ring-2 ring-primary ring-offset-2 ring-offset-background rounded-lg\",\n )}\n />\n {selected && (\n <div\n data-gds-part=\"picker-selected-badge\"\n className=\"absolute top-2 right-2 rounded-full bg-primary text-primary-foreground p-1 shadow-sm\"\n >\n <Check className=\"h-3.5 w-3.5\" />\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef } from \"react\";\nimport Lenis from \"lenis\";\n\ninterface LenisProviderProps {\n children: React.ReactNode;\n}\n\nexport function LenisProvider({ children }: LenisProviderProps) {\n const lenisRef = useRef<Lenis | null>(null);\n\n useEffect(() => {\n const lenis = new Lenis({\n duration: 1.2,\n easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)),\n orientation: \"vertical\",\n gestureOrientation: \"vertical\",\n smoothWheel: true,\n });\n\n lenisRef.current = lenis;\n\n function raf(time: number) {\n lenis.raf(time);\n requestAnimationFrame(raf);\n }\n\n requestAnimationFrame(raf);\n\n return () => {\n lenis.destroy();\n lenisRef.current = null;\n };\n }, []);\n\n return <>{children}</>;\n}\n","/**\n * OKLCH ramp generation.\n *\n * OKLCH (Oklab in cylindrical coords) is a perceptually uniform color space —\n * the same `L` value looks equally light across all hues, which HSL does not\n * give you. That makes it ideal for generating color ramps programmatically:\n * pin the L curve, vary the hue, and every ramp looks like a sibling.\n *\n * We output space-separated `\"L C H\"` triplets (not `oklch(L C H)` strings),\n * because the CSS variables are consumed via Tailwind as\n * `oklch(var(--primary) / <alpha-value>)`\n * which needs the bare components inside the function call to get the\n * `/alpha` shortcut (`bg-primary/50`) working.\n */\n\n/** One of four brightness modes the theme system supports. */\nexport type ModeName = \"superLight\" | \"light\" | \"dark\" | \"superDark\";\n\n/** A bare OKLCH triplet — \"L C H\" space-separated. Consumed inside oklch(). */\nexport type OKLCHTriplet = string;\n\n/** A full 11-stop color ramp, Tailwind-style. */\nexport interface Ramp {\n 50: OKLCHTriplet;\n 100: OKLCHTriplet;\n 200: OKLCHTriplet;\n 300: OKLCHTriplet;\n 400: OKLCHTriplet;\n 500: OKLCHTriplet;\n 600: OKLCHTriplet;\n 700: OKLCHTriplet;\n 800: OKLCHTriplet;\n 900: OKLCHTriplet;\n 950: OKLCHTriplet;\n}\n\nexport type RampKey = keyof Ramp;\n\nexport const RAMP_KEYS: RampKey[] = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950];\n\n/**\n * Lightness curve across the 11-stop ramp. Index matches RAMP_KEYS order\n * (0 → L for stop 50, 10 → L for stop 950). Chosen so that:\n * - Adjacent steps are perceptually distinct\n * - Step 500 lands around the \"canonical\" brand-base lightness (0.60)\n * - Step 50 is near-white without being pure white (keeps a hint of hue)\n * - Step 950 is near-black without being pure black (same)\n *\n * These values are mode-agnostic — the same ramp is used in every mode.\n * What changes per mode is which stop maps to which semantic token (see\n * generator.ts / MODE_TOKEN_MAP).\n */\nconst LIGHTNESS_CURVE: readonly number[] = [\n 0.985, // 50\n 0.955, // 100\n 0.895, // 200\n 0.820, // 300\n 0.720, // 400\n 0.610, // 500 — base\n 0.510, // 600\n 0.415, // 700\n 0.325, // 800\n 0.245, // 900\n 0.170, // 950\n];\n\n/**\n * Chroma curve. Peaks in the middle of the ramp (around 500-600, where\n * sRGB gamut allows the most saturation) and tapers at the extremes.\n * Multiplied by the `chromaScale` at call time so we can dial neutrals\n * down to near-gray without changing the shape.\n */\nconst CHROMA_CURVE: readonly number[] = [\n 0.015, // 50\n 0.040, // 100\n 0.075, // 200\n 0.110, // 300\n 0.140, // 400\n 0.170, // 500 — peak\n 0.170, // 600 — peak\n 0.150, // 700\n 0.120, // 800\n 0.080, // 900\n 0.040, // 950\n];\n\n/** Arguments to hueToRamp. */\nexport interface HueToRampOptions {\n /** Hue in degrees, 0–360. */\n hue: number;\n /**\n * Multiplier on the default chroma curve. Defaults to 1.\n * - Neutrals: ~0.06–0.12 (subtle tint toward the hue)\n * - Standard brand: 1.0\n * - Muted / desaturated: 0.5–0.7\n * - Vibrant: 1.1–1.3 (may fall outside sRGB at high L, but browsers clip)\n */\n chromaScale?: number;\n}\n\n/**\n * Generate an 11-stop ramp from a single hue.\n *\n * The output is mode-agnostic: each stop gets the same lightness and chroma\n * regardless of which mode the theme ends up being applied in. The mode\n * selects which stops are used for semantic tokens (see generator).\n */\nexport function hueToRamp({ hue, chromaScale = 1 }: HueToRampOptions): Ramp {\n const normalizedHue = ((hue % 360) + 360) % 360; // clamp to 0–360\n const ramp = {} as Ramp;\n for (let i = 0; i < RAMP_KEYS.length; i++) {\n const L = LIGHTNESS_CURVE[i];\n const C = CHROMA_CURVE[i] * chromaScale;\n ramp[RAMP_KEYS[i]] = `${L.toFixed(4)} ${C.toFixed(4)} ${normalizedHue.toFixed(2)}`;\n }\n return ramp;\n}\n\n/**\n * Build a fully neutral (achromatic) ramp — chroma forced to zero.\n * Used when the user picks \"pure gray\" for the neutral axis.\n */\nexport function neutralRamp(): Ramp {\n const ramp = {} as Ramp;\n for (let i = 0; i < RAMP_KEYS.length; i++) {\n const L = LIGHTNESS_CURVE[i];\n ramp[RAMP_KEYS[i]] = `${L.toFixed(4)} 0 0`;\n }\n return ramp;\n}\n\n/**\n * Fixed OKLCH triplets for semantic colors that should NOT vary with the\n * brand hue (for accessibility and convention). Tuned to look equally\n * balanced on light and dark backgrounds.\n */\nexport const FIXED_SEMANTIC: Record<\"light\" | \"dark\", {\n destructive: OKLCHTriplet;\n destructiveFg: OKLCHTriplet;\n success: OKLCHTriplet;\n warning: OKLCHTriplet;\n info: OKLCHTriplet;\n highlight: OKLCHTriplet;\n}> = {\n light: {\n destructive: \"0.560 0.220 27.0\", // red\n destructiveFg: \"0.990 0.005 27.0\",\n success: \"0.610 0.180 145.0\", // green\n warning: \"0.720 0.180 60.0\", // orange\n info: \"0.580 0.200 240.0\", // blue\n highlight: \"0.860 0.180 95.0\", // yellow\n },\n dark: {\n destructive: \"0.680 0.220 27.0\",\n destructiveFg: \"0.990 0.005 27.0\",\n success: \"0.720 0.180 145.0\",\n warning: \"0.800 0.180 60.0\",\n info: \"0.700 0.200 240.0\",\n highlight: \"0.880 0.180 95.0\",\n },\n};\n\n/** Absolute-white/black OKLCH triplets, used for card/popover surfaces. */\nexport const PURE_WHITE: OKLCHTriplet = \"1 0 0\";\nexport const PURE_BLACK: OKLCHTriplet = \"0 0 0\";\n\n/**\n * Derive the `*-soft` / `*-deep` pair for a status colour — the paler tinted\n * surface and the deeper on-surface text we use for Alert, Badge, and any\n * future status banners.\n *\n * The hue is preserved so the derivative colours still feel like \"that\n * status colour\". Chroma is trimmed on the soft variant (a very pale\n * background with full chroma reads as neon) and lightness is retargeted:\n *\n * - Light mode: soft ≈ 0.96 L / 0.25× chroma (a whisper of tint), deep\n * ≈ 0.38 L / full chroma (matches the 700-step of an implicit ramp).\n * - Dark mode: soft ≈ 0.22 L / 0.45× chroma (sits just above the dark\n * background without becoming gray), deep ≈ 0.82 L / 0.9× chroma\n * (bright but not eye-watering on the tinted surface).\n *\n * Returns a pair of OKLCH triplets in the same \"L C H\" string form as the\n * rest of the theme tokens.\n */\nexport function deriveAlertPair(\n base: OKLCHTriplet,\n mode: \"light\" | \"dark\"\n): { soft: OKLCHTriplet; deep: OKLCHTriplet } {\n const [, c, h] = base.split(/\\s+/).map((v) => v.trim());\n const chroma = Number(c);\n const hue = h;\n\n if (mode === \"light\") {\n const softL = 0.965;\n const softC = Math.min(chroma * 0.22, 0.045);\n const deepL = 0.38;\n const deepC = chroma;\n return {\n soft: `${softL.toFixed(3)} ${softC.toFixed(3)} ${hue}`,\n deep: `${deepL.toFixed(3)} ${deepC.toFixed(3)} ${hue}`,\n };\n }\n\n const softL = 0.22;\n const softC = Math.min(chroma * 0.45, 0.075);\n const deepL = 0.82;\n const deepC = chroma * 0.9;\n return {\n soft: `${softL.toFixed(3)} ${softC.toFixed(3)} ${hue}`,\n deep: `${deepL.toFixed(3)} ${deepC.toFixed(3)} ${hue}`,\n };\n}\n","/**\n * GradeTheme — a single object capturing every skinnable dimension of the\n * design system. A theme is a complete \"skin\": colors, typography, radius,\n * spacing feel, effects, and optional experimental (shader/WebGL) hooks.\n *\n * Themes are applied at runtime by the GradeThemeProvider, which writes the\n * resolved values to CSS custom properties on :root. Components already read\n * from those variables (via the shadcn semantic layer + RDS tokens), so no\n * component code has to change per theme.\n *\n * HSL strings use the space-separated shadcn format: \"175 84% 32%\".\n * They are wrapped in hsl() at the call site (e.g. oklch(var(--primary))).\n */\n\nexport type HSL = string;\n\nexport interface ThemeColorsMode {\n // Core shadcn semantic tokens\n background: HSL;\n foreground: HSL;\n card: HSL;\n cardForeground: HSL;\n popover: HSL;\n popoverForeground: HSL;\n primary: HSL;\n primaryForeground: HSL;\n secondary: HSL;\n secondaryForeground: HSL;\n muted: HSL;\n mutedForeground: HSL;\n accent: HSL;\n accentForeground: HSL;\n destructive: HSL;\n destructiveForeground: HSL;\n border: HSL;\n input: HSL;\n ring: HSL;\n\n // Grade semantic extras\n success: HSL;\n warning: HSL;\n info: HSL;\n energy: HSL;\n}\n\nexport interface ThemeTypography {\n /** CSS font-family string for the default sans. Can reference a CSS var. */\n fontSans: string;\n /** CSS font-family string for monospace. */\n fontMono: string;\n /** Optional distinct font for display/hero headings. Defaults to fontSans. */\n fontDisplay?: string;\n /** Optional weight used for headings. Defaults: 600. */\n headingWeight?: number;\n /** Optional weight used for body. Defaults: 400. */\n bodyWeight?: number;\n /** Letter-spacing applied to headings. */\n headingTracking?: string;\n /** Optional scale overrides — any subset. Falls back to RDS defaults. */\n scale?: Partial<{\n display: string;\n h1: string;\n h2: string;\n h3: string;\n h4: string;\n h5: string;\n h6: string;\n body: string;\n bodySm: string;\n }>;\n}\n\nexport interface ThemeRadius {\n /** The shadcn --radius base value. Button/input radius derive from this. */\n base: string;\n /** Optional full-scale overrides. */\n sm?: string;\n md?: string;\n lg?: string;\n xl?: string;\n \"2xl\"?: string;\n full?: string;\n /** Shorthand feel: sharp = 0, soft = default, pill = full. */\n style?: \"sharp\" | \"soft\" | \"rounded\" | \"pill\";\n}\n\nexport interface ThemeSpacing {\n /** Base unit for the spacing scale. Default \"1rem\" (16px). */\n baseUnit?: string;\n /** Density preset: tight = 0.75x, default = 1x, roomy = 1.25x. */\n density?: \"tight\" | \"default\" | \"roomy\";\n}\n\nexport interface ThemeEffects {\n shadows?: {\n sm?: string;\n md?: string;\n lg?: string;\n xl?: string;\n \"2xl\"?: string;\n inner?: string;\n };\n motion?: {\n fast?: string;\n base?: string;\n slow?: string;\n slower?: string;\n easeIn?: string;\n easeOut?: string;\n easeInOut?: string;\n /** Global motion intensity multiplier — 0 = instant, 1 = default, >1 = slower. */\n intensity?: number;\n };\n borders?: {\n width?: string;\n style?: \"solid\" | \"dashed\" | \"dotted\";\n };\n}\n\nexport interface ThemeComponents {\n /** Shape of button corners. Mapped to a data attribute components can key off. */\n buttonShape?: \"default\" | \"pill\" | \"square\" | \"sharp\";\n /** Input rendering style. */\n inputStyle?: \"outlined\" | \"filled\" | \"underline\";\n /** Card rendering style. */\n cardStyle?: \"flat\" | \"elevated\" | \"outlined\" | \"glass\";\n}\n\nexport interface ThemeExperimental {\n /** Named shader references; resolved by <ThemeCanvas> / <ShaderSurface>. */\n shaders?: {\n background?: string;\n buttonGlow?: string;\n cardEffect?: string;\n };\n effects?: {\n noise?: boolean;\n grain?: boolean;\n scanlines?: boolean;\n bloom?: boolean;\n };\n}\n\nexport interface GradeTheme {\n id: string;\n name: string;\n description: string;\n /** Optional tagline for the switcher UI. */\n tagline?: string;\n\n colors: {\n light: ThemeColorsMode;\n dark: ThemeColorsMode;\n };\n typography: ThemeTypography;\n radius: ThemeRadius;\n spacing: ThemeSpacing;\n effects?: ThemeEffects;\n components?: ThemeComponents;\n experimental?: ThemeExperimental;\n}\n\n/** Convenience: a theme registry entry. */\nexport interface ThemeRegistryEntry {\n id: string;\n theme: GradeTheme;\n}\n\n/* ═════════════════════════════════════════════════════════════════════════\n GENERATOR-FIRST TYPES (Phase 1 of the OKLCH theme builder)\n ═════════════════════════════════════════════════════════════════════════\n\n Everything below drives the new generator-based theme system. A theme is\n now defined primarily by a compact ThemeInput (hues + a handful of\n config knobs) and generated into a full GeneratedTheme via generator.ts.\n\n The existing GradeTheme / ThemeColorsMode types above still work for the\n legacy Grade + Paper themes. Phase 2 replaces them with GeneratedTheme.\n ───────────────────────────────────────────────────────────────────────── */\n\nimport type { ModeName, OKLCHTriplet, Ramp } from \"./oklch\";\nexport type { ModeName, OKLCHTriplet, Ramp } from \"./oklch\";\n\n/**\n * The CSS font-family string for each available font. Keys match the CSS\n * variables set by app/layout.tsx's font loaders. Adding a new font means\n * loading it in the root layout AND registering it here.\n *\n * Geist is the recommended default sans (replaces Satoshi). Jetbrains Mono\n * is the default mono. Serif and alternative options round out the list for\n * the theme builder's font picker — expected to grow as we allow dynamic\n * Google Font loading later.\n */\nexport const FONTS = {\n // Sans\n geist: \"var(--font-geist), system-ui, sans-serif\",\n inter: \"var(--font-inter), system-ui, sans-serif\",\n manrope: \"var(--font-manrope), system-ui, sans-serif\",\n figtree: \"var(--font-figtree), system-ui, sans-serif\",\n dmSans: \"var(--font-dm-sans), system-ui, sans-serif\",\n lexend: \"var(--font-lexend), system-ui, sans-serif\",\n outfit: \"var(--font-outfit), system-ui, sans-serif\",\n plusJakarta: \"var(--font-plus-jakarta), system-ui, sans-serif\",\n spaceGrotesk: \"var(--font-space-grotesk), system-ui, sans-serif\",\n // Serif\n fraunces: \"var(--font-fraunces), Georgia, serif\",\n instrumentSerif: \"var(--font-instrument-serif), Georgia, serif\",\n sourceSerif: \"var(--font-source-serif), Georgia, serif\",\n // Mono\n jetbrainsMono: \"var(--font-jetbrains-mono), ui-monospace, monospace\",\n geistMono: \"var(--font-geist-mono), ui-monospace, monospace\",\n ibmPlexMono: \"var(--font-ibm-plex-mono), ui-monospace, monospace\",\n // System fallbacks\n system: \"system-ui, -apple-system, sans-serif\",\n serif: \"Georgia, 'Times New Roman', serif\",\n mono: \"ui-monospace, Menlo, monospace\",\n} as const;\n\nexport type FontKey = keyof typeof FONTS;\n\n/** Human-readable labels for the font picker. */\nexport const FONT_LABELS: Record<FontKey, string> = {\n geist: \"Geist\",\n inter: \"Inter\",\n manrope: \"Manrope\",\n figtree: \"Figtree\",\n dmSans: \"DM Sans\",\n lexend: \"Lexend\",\n outfit: \"Outfit\",\n plusJakarta: \"Plus Jakarta Sans\",\n spaceGrotesk: \"Space Grotesk\",\n fraunces: \"Fraunces\",\n instrumentSerif: \"Instrument Serif\",\n sourceSerif: \"Source Serif 4\",\n jetbrainsMono: \"JetBrains Mono\",\n geistMono: \"Geist Mono\",\n ibmPlexMono: \"IBM Plex Mono\",\n system: \"System sans\",\n serif: \"System serif\",\n mono: \"System mono\",\n};\n\n/** Categorization used to filter the picker (serif/sans/mono). */\nexport const FONT_CATEGORY: Record<FontKey, \"sans\" | \"serif\" | \"mono\"> = {\n geist: \"sans\",\n inter: \"sans\",\n manrope: \"sans\",\n figtree: \"sans\",\n dmSans: \"sans\",\n lexend: \"sans\",\n outfit: \"sans\",\n plusJakarta: \"sans\",\n spaceGrotesk: \"sans\",\n fraunces: \"serif\",\n instrumentSerif: \"serif\",\n sourceSerif: \"serif\",\n jetbrainsMono: \"mono\",\n geistMono: \"mono\",\n ibmPlexMono: \"mono\",\n system: \"sans\",\n serif: \"serif\",\n mono: \"mono\",\n};\n\n/** Type scale preset — controls how generous the size ladder is. */\nexport type TypeScalePreset = \"compact\" | \"default\" | \"spacious\";\n\n/** Density preset — controls spacing tightness. */\nexport type SpacingDensity = \"tight\" | \"default\" | \"roomy\";\n\n/** Radius preset — controls how rounded corners are across the system. */\nexport type RadiusStyle = \"sharp\" | \"subtle\" | \"soft\" | \"round\" | \"pill\";\n\n/** Shadow intensity preset. */\nexport type ShadowIntensity = \"none\" | \"subtle\" | \"default\" | \"dramatic\";\n\n/**\n * Chroma intensity — applied globally on top of per-ramp chroma multipliers.\n * \"muted\" dials all ramps down (pastel / editorial feel).\n * \"vibrant\" pushes them past the defaults (popping / marketing feel).\n */\nexport type ColorIntensity = \"muted\" | \"default\" | \"vibrant\";\n\n/** Button rendering shape (orthogonal to radius). */\nexport type ButtonShape = \"default\" | \"pill\" | \"square\";\n\n/** Input rendering style. */\nexport type InputStyle = \"outlined\" | \"filled\" | \"underline\";\n\n/** Card rendering style. */\nexport type CardStyle = \"flat\" | \"outlined\" | \"elevated\" | \"glass\";\n\n/**\n * The user-facing theme definition. This is what gets saved to\n * localStorage, exported as JSON, and shared via URL. The generator\n * consumes this and produces a full GeneratedTheme.\n */\nexport interface ThemeInput {\n /** Stable id. For user themes: \"user:<uuid>\"; for built-ins: short slug. */\n id: string;\n /** Display name. */\n name: string;\n /** Optional one-line description for the switcher. */\n description?: string;\n /** Optional tagline (category tag). */\n tagline?: string;\n\n /** The three hues that drive the entire color system. */\n hues: {\n /** 0–360. The gray ramp's tint. Low chroma, subtle. */\n neutral: number;\n /** 0–360. The brand primary. */\n primary: number;\n /** 0–360. The secondary brand accent. Often primary ± 30–180°. */\n accent: number;\n };\n\n /**\n * Optional chroma overrides. Defaults tuned to produce pleasant ramps:\n * neutrals get a subtle tint (0.1× peak), primary/accent get full chroma.\n * Raise above 1.0 for vibrant; lower for muted.\n */\n chroma?: {\n neutral?: number; // default 0.08\n primary?: number; // default 1.0\n accent?: number; // default 1.0\n };\n\n /** If true, the neutral ramp is pure gray regardless of neutral hue. */\n neutralPureGray?: boolean;\n\n /**\n * Global chroma intensity. Multiplies every ramp's chroma — a quick way to\n * flip the whole theme between muted / default / vibrant without touching\n * the per-ramp chroma values.\n */\n intensity?: ColorIntensity;\n\n typography: {\n display: FontKey;\n body: FontKey;\n mono: FontKey;\n scale: TypeScalePreset;\n /** Override heading weight. Defaults to 600 for sans, 500 for serif. */\n headingWeight?: number;\n /** Override body weight. Defaults to 400. */\n bodyWeight?: number;\n /** Letter-spacing applied to headings. Default \"-0.01em\". */\n headingTracking?: string;\n };\n\n spacing: {\n density: SpacingDensity;\n };\n\n radius: {\n style: RadiusStyle;\n };\n\n effects?: {\n shadows?: ShadowIntensity;\n /** 0 = instant, 1 = default, 2 = luxurious. */\n motionIntensity?: number;\n borderWidth?: string;\n };\n\n components?: {\n buttonShape?: ButtonShape;\n inputStyle?: InputStyle;\n cardStyle?: CardStyle;\n };\n}\n\n/**\n * Per-mode semantic token mapping. Each token holds a bare OKLCH triplet\n * (not an `oklch(…)` string) — the consumer wraps it with oklch(var(--x) /\n * <alpha-value>) via Tailwind config.\n */\nexport interface GeneratedColorsMode {\n background: OKLCHTriplet;\n foreground: OKLCHTriplet;\n card: OKLCHTriplet;\n cardForeground: OKLCHTriplet;\n popover: OKLCHTriplet;\n popoverForeground: OKLCHTriplet;\n primary: OKLCHTriplet;\n primaryForeground: OKLCHTriplet;\n secondary: OKLCHTriplet;\n secondaryForeground: OKLCHTriplet;\n muted: OKLCHTriplet;\n mutedForeground: OKLCHTriplet;\n accent: OKLCHTriplet;\n accentForeground: OKLCHTriplet;\n destructive: OKLCHTriplet;\n destructiveForeground: OKLCHTriplet;\n border: OKLCHTriplet;\n input: OKLCHTriplet;\n ring: OKLCHTriplet;\n\n // Grade extras\n success: OKLCHTriplet;\n warning: OKLCHTriplet;\n info: OKLCHTriplet;\n highlight: OKLCHTriplet;\n\n // Alert / badge surface pairs — derived from the status colours. `*-soft`\n // is the pale tinted surface for alerts, badges, and banners; `*-deep` is\n // the readable text/icon colour that pairs with it. Generated per-mode so\n // a dark mode tint is still dark, but the text stays bright.\n destructiveSoft: OKLCHTriplet;\n destructiveDeep: OKLCHTriplet;\n successSoft: OKLCHTriplet;\n successDeep: OKLCHTriplet;\n warningSoft: OKLCHTriplet;\n warningDeep: OKLCHTriplet;\n infoSoft: OKLCHTriplet;\n infoDeep: OKLCHTriplet;\n highlightSoft: OKLCHTriplet;\n highlightDeep: OKLCHTriplet;\n}\n\n/** Concrete resolved CSS values for the typography dimension. */\nexport interface GeneratedTypography {\n fontSans: string;\n fontMono: string;\n fontDisplay: string;\n headingWeight: number;\n bodyWeight: number;\n headingTracking: string;\n /** Explicit font-size for each step in the scale. */\n scale: {\n display: string;\n h1: string;\n h2: string;\n h3: string;\n h4: string;\n h5: string;\n h6: string;\n body: string;\n bodySm: string;\n };\n}\n\n/** Concrete resolved CSS values for radius. */\nexport interface GeneratedRadius {\n base: string;\n sm: string;\n md: string;\n lg: string;\n xl: string;\n \"2xl\": string;\n full: string;\n}\n\n/** Concrete resolved spacing values. */\nexport interface GeneratedSpacing {\n baseUnit: string;\n densityFactor: number;\n}\n\n/** Concrete resolved effects values. */\nexport interface GeneratedEffects {\n shadows: {\n sm: string;\n md: string;\n lg: string;\n xl: string;\n \"2xl\": string;\n inner: string;\n };\n motion: {\n fast: string;\n base: string;\n slow: string;\n slower: string;\n };\n borderWidth: string;\n}\n\n/**\n * A 5-stop categorical chart palette derived from the theme hues. Each\n * entry is an OKLCH triplet. Written to --chart-1 through --chart-5 at\n * :root — chart components (recharts) read them via var(--chart-N).\n */\nexport interface ChartPalette {\n 1: OKLCHTriplet;\n 2: OKLCHTriplet;\n 3: OKLCHTriplet;\n 4: OKLCHTriplet;\n 5: OKLCHTriplet;\n}\n\n/**\n * The full output of the generator. This is what gets applied to :root by\n * the provider, written to CSS vars, and used for rendering previews.\n *\n * The original ThemeInput is preserved on `input` so the theme can be\n * round-tripped back into the builder UI for editing.\n */\nexport interface GeneratedTheme {\n id: string;\n name: string;\n description?: string;\n tagline?: string;\n\n /** The original input, preserved for round-trip editing. */\n input: ThemeInput;\n\n /** The three base ramps. Same content regardless of which mode is active. */\n ramps: {\n neutral: Ramp;\n primary: Ramp;\n accent: Ramp;\n };\n\n /** Semantic tokens for all four modes. */\n colors: Record<ModeName, GeneratedColorsMode>;\n\n /** 5-stop palette for chart series. */\n chart: ChartPalette;\n\n typography: GeneratedTypography;\n radius: GeneratedRadius;\n spacing: GeneratedSpacing;\n effects: GeneratedEffects;\n components: NonNullable<ThemeInput[\"components\"]>;\n}\n","/**\n * Theme generator — the one true source for producing themes.\n *\n * Takes a compact ThemeInput (hues + a handful of presets) and returns a\n * fully resolved GeneratedTheme with three OKLCH color ramps, semantic\n * tokens for all four brightness modes, and concrete values for typography,\n * radius, spacing, and effects.\n *\n * Every theme in the system — built-in or user-built — flows through here.\n * Built-ins are just curated ThemeInputs; user themes live in localStorage\n * as ThemeInputs and get re-generated on load.\n */\n\nimport {\n deriveAlertPair,\n FIXED_SEMANTIC,\n hueToRamp,\n neutralRamp,\n PURE_BLACK,\n PURE_WHITE,\n type ModeName,\n type OKLCHTriplet,\n type Ramp,\n type RampKey,\n} from \"./oklch\";\nimport {\n FONTS,\n type ChartPalette,\n type ColorIntensity,\n type FontKey,\n type GeneratedColorsMode,\n type GeneratedEffects,\n type GeneratedRadius,\n type GeneratedSpacing,\n type GeneratedTheme,\n type GeneratedTypography,\n type RadiusStyle,\n type ShadowIntensity,\n type SpacingDensity,\n type ThemeInput,\n type TypeScalePreset,\n} from \"./types\";\n\nconst ALL_MODES: ModeName[] = [\"superLight\", \"light\", \"dark\", \"superDark\"];\n\n/** Global chroma multipliers — applied on top of per-ramp chroma scales. */\nconst INTENSITY_MULTIPLIER: Record<ColorIntensity, number> = {\n muted: 0.6,\n default: 1,\n vibrant: 1.3,\n};\n\n/**\n * Build the 5-stop chart palette derived from theme hues. The 5 stops are\n * tuned to be visually distinct but tonally cohesive — they reuse the\n * theme's primary, accent, and neutral, then fill the remaining slots with\n * hue-rotated variants of the primary so the series stay in the theme's\n * family. Lightness lands around 0.55 so colors read well in both light\n * and dark mode without needing a dark variant (charts rarely swap per\n * mode in practice).\n */\nfunction buildChartPalette(\n hues: { neutral: number; primary: number; accent: number },\n chroma: { primary: number; accent: number },\n intensity: number\n): ChartPalette {\n const pC = chroma.primary * intensity;\n const aC = chroma.accent * intensity;\n // Baseline chroma for the derived slots — sits between primary + accent.\n const dC = ((pC + aC) / 2) * 0.8;\n const norm = (h: number) => ((h % 360) + 360) % 360;\n // Order matters: chart-1 is the hero (primary), then two hue-rotated\n // variants for maximum visual distinction, then neutral, and accent\n // ends the series. Keeps adjacent series colors from blending —\n // accent next to primary can look nearly identical when hues are close.\n return {\n 1: `0.600 ${(0.17 * pC).toFixed(4)} ${hues.primary.toFixed(2)}`,\n 2: `0.640 ${(0.17 * dC).toFixed(4)} ${norm(hues.primary + 140).toFixed(2)}`,\n 3: `0.580 ${(0.17 * dC).toFixed(4)} ${norm(hues.primary + 220).toFixed(2)}`,\n 4: `0.510 0.0250 ${hues.neutral.toFixed(2)}`,\n 5: `0.620 ${(0.17 * aC).toFixed(4)} ${hues.accent.toFixed(2)}`,\n };\n}\n\n/**\n * Per-mode mapping from semantic token → ramp step.\n * \"neutral\" picks from the neutral ramp, \"primary\" from primary, \"accent\"\n * from accent. Special values PURE_WHITE / PURE_BLACK bypass the ramps.\n */\ntype TokenRef =\n | { source: \"neutral\" | \"primary\" | \"accent\"; step: RampKey }\n | { source: \"pure\"; value: OKLCHTriplet };\n\nconst n = (step: RampKey): TokenRef => ({ source: \"neutral\", step });\nconst p = (step: RampKey): TokenRef => ({ source: \"primary\", step });\nconst a = (step: RampKey): TokenRef => ({ source: \"accent\", step });\nconst PURE = (value: OKLCHTriplet): TokenRef => ({ source: \"pure\", value });\n\ninterface TokenMap {\n background: TokenRef;\n foreground: TokenRef;\n card: TokenRef;\n cardForeground: TokenRef;\n popover: TokenRef;\n popoverForeground: TokenRef;\n primary: TokenRef;\n primaryForeground: TokenRef;\n secondary: TokenRef;\n secondaryForeground: TokenRef;\n muted: TokenRef;\n mutedForeground: TokenRef;\n accent: TokenRef;\n accentForeground: TokenRef;\n border: TokenRef;\n input: TokenRef;\n ring: TokenRef;\n}\n\n/**\n * The mapping that makes each mode feel like itself. This is the heart of\n * the 4-mode system — tune these if a mode ends up too dim / too bright.\n */\nconst MODE_TOKENS: Record<ModeName, TokenMap> = {\n superLight: {\n // Airy: low contrast foreground, off-white surfaces, richer primary to stand out.\n background: n(50),\n foreground: n(800),\n card: PURE(PURE_WHITE),\n cardForeground: n(800),\n popover: PURE(PURE_WHITE),\n popoverForeground: n(800),\n primary: p(600),\n primaryForeground: p(50),\n secondary: n(100),\n secondaryForeground: n(700),\n muted: n(100),\n mutedForeground: n(500),\n accent: a(600),\n accentForeground: a(50),\n border: n(200),\n input: n(200),\n ring: p(500),\n },\n light: {\n // Standard light.\n background: n(50),\n foreground: n(950),\n card: PURE(PURE_WHITE),\n cardForeground: n(950),\n popover: PURE(PURE_WHITE),\n popoverForeground: n(950),\n primary: p(500),\n primaryForeground: p(50),\n secondary: n(100),\n secondaryForeground: n(700),\n muted: n(100),\n mutedForeground: n(500),\n accent: a(500),\n accentForeground: a(50),\n border: n(200),\n input: n(200),\n ring: p(500),\n },\n dark: {\n // Standard dark.\n background: n(950),\n foreground: n(50),\n card: n(900),\n cardForeground: n(50),\n popover: n(900),\n popoverForeground: n(50),\n primary: p(400),\n primaryForeground: p(950),\n secondary: n(800),\n secondaryForeground: n(200),\n muted: n(800),\n mutedForeground: n(400),\n accent: a(400),\n accentForeground: a(950),\n border: n(800),\n input: n(800),\n ring: p(400),\n },\n superDark: {\n // OLED-deep: pure black surface, brighter primary, tighter borders.\n background: PURE(PURE_BLACK),\n foreground: n(100),\n card: n(950),\n cardForeground: n(100),\n popover: n(950),\n popoverForeground: n(100),\n primary: p(300),\n primaryForeground: p(950),\n secondary: n(900),\n secondaryForeground: n(300),\n muted: n(900),\n mutedForeground: n(500),\n accent: a(300),\n accentForeground: a(950),\n border: n(900),\n input: n(900),\n ring: p(300),\n },\n};\n\nfunction resolveToken(\n ref: TokenRef,\n ramps: { neutral: Ramp; primary: Ramp; accent: Ramp }\n): OKLCHTriplet {\n if (ref.source === \"pure\") return ref.value;\n return ramps[ref.source][ref.step];\n}\n\nfunction deriveColorsForMode(\n ramps: { neutral: Ramp; primary: Ramp; accent: Ramp },\n mode: ModeName\n): GeneratedColorsMode {\n const map = MODE_TOKENS[mode];\n // Fixed semantic colors don't change with the brand hue — they use the\n // light/dark set because the 4 modes split cleanly into \"has light bg\"\n // and \"has dark bg\" for contrast purposes.\n const isLightBg = mode === \"superLight\" || mode === \"light\";\n const fixed = isLightBg ? FIXED_SEMANTIC.light : FIXED_SEMANTIC.dark;\n\n return {\n background: resolveToken(map.background, ramps),\n foreground: resolveToken(map.foreground, ramps),\n card: resolveToken(map.card, ramps),\n cardForeground: resolveToken(map.cardForeground, ramps),\n popover: resolveToken(map.popover, ramps),\n popoverForeground: resolveToken(map.popoverForeground, ramps),\n primary: resolveToken(map.primary, ramps),\n primaryForeground: resolveToken(map.primaryForeground, ramps),\n secondary: resolveToken(map.secondary, ramps),\n secondaryForeground: resolveToken(map.secondaryForeground, ramps),\n muted: resolveToken(map.muted, ramps),\n mutedForeground: resolveToken(map.mutedForeground, ramps),\n accent: resolveToken(map.accent, ramps),\n accentForeground: resolveToken(map.accentForeground, ramps),\n border: resolveToken(map.border, ramps),\n input: resolveToken(map.input, ramps),\n ring: resolveToken(map.ring, ramps),\n destructive: fixed.destructive,\n destructiveForeground: fixed.destructiveFg,\n success: fixed.success,\n warning: fixed.warning,\n info: fixed.info,\n highlight: fixed.highlight,\n\n // `-soft` / `-deep` derivatives are computed per mode from the base\n // status triplet. The \"alert mode\" only distinguishes light vs. dark;\n // superLight and superDark collapse onto the same pair as their\n // neighbour because the tinted alert surface doesn't need more than two\n // contrast-calibrated variants.\n ...(() => {\n const alertMode: \"light\" | \"dark\" = isLightBg ? \"light\" : \"dark\";\n const d = deriveAlertPair(fixed.destructive, alertMode);\n const s = deriveAlertPair(fixed.success, alertMode);\n const w = deriveAlertPair(fixed.warning, alertMode);\n const i = deriveAlertPair(fixed.info, alertMode);\n const hi = deriveAlertPair(fixed.highlight, alertMode);\n return {\n destructiveSoft: d.soft,\n destructiveDeep: d.deep,\n successSoft: s.soft,\n successDeep: s.deep,\n warningSoft: w.soft,\n warningDeep: w.deep,\n infoSoft: i.soft,\n infoDeep: i.deep,\n highlightSoft: hi.soft,\n highlightDeep: hi.deep,\n };\n })(),\n };\n}\n\n/* ─────────────────────────── Typography ─────────────────────────── */\n\n/** Base type ladder (the \"default\" scale). Other scales multiply these. */\nconst BASE_SCALE = {\n display: 3.75, // rem\n h1: 2.5,\n h2: 2,\n h3: 1.5,\n h4: 1.25,\n h5: 1.125,\n h6: 1,\n body: 1,\n bodySm: 0.875,\n};\n\nconst SCALE_MULTIPLIER: Record<TypeScalePreset, number> = {\n compact: 0.85,\n default: 1,\n spacious: 1.18,\n};\n\nfunction resolveTypography(\n input: ThemeInput[\"typography\"]\n): GeneratedTypography {\n const mult = SCALE_MULTIPLIER[input.scale];\n const rem = (n: number) => `${(n * mult).toFixed(3)}rem`;\n return {\n fontSans: FONTS[input.body],\n fontMono: FONTS[input.mono],\n fontDisplay: FONTS[input.display],\n headingWeight: input.headingWeight ?? 600,\n bodyWeight: input.bodyWeight ?? 400,\n headingTracking: input.headingTracking ?? \"-0.01em\",\n scale: {\n display: rem(BASE_SCALE.display),\n h1: rem(BASE_SCALE.h1),\n h2: rem(BASE_SCALE.h2),\n h3: rem(BASE_SCALE.h3),\n h4: rem(BASE_SCALE.h4),\n h5: rem(BASE_SCALE.h5),\n h6: rem(BASE_SCALE.h6),\n body: rem(BASE_SCALE.body),\n bodySm: rem(BASE_SCALE.bodySm),\n },\n };\n}\n\n/* ─────────────────────────── Radius ─────────────────────────── */\n\n/**\n * Each preset defines the \"base\" radius (what --radius resolves to). The\n * sm/md/lg/xl/2xl derive from it. \"pill\" snaps the base reasonably low\n * (components like buttons override to full-pill via data-button-shape).\n */\nconst RADIUS_BASE: Record<RadiusStyle, number> = {\n sharp: 0,\n subtle: 0.25, // rem\n soft: 0.5,\n round: 0.875,\n pill: 1.25, // components override as needed\n};\n\nfunction resolveRadius(input: ThemeInput[\"radius\"]): GeneratedRadius {\n const base = RADIUS_BASE[input.style];\n const r = (n: number) => `${n.toFixed(3)}rem`;\n return {\n base: r(base),\n sm: r(Math.max(0, base - 0.25)),\n md: r(base),\n lg: r(base + 0.25),\n xl: r(base + 0.5),\n \"2xl\": r(base + 1),\n full: \"9999px\",\n };\n}\n\n/* ─────────────────────────── Spacing ─────────────────────────── */\n\nconst DENSITY_FACTOR: Record<SpacingDensity, number> = {\n tight: 0.85,\n default: 1,\n roomy: 1.2,\n};\n\nfunction resolveSpacing(input: ThemeInput[\"spacing\"]): GeneratedSpacing {\n return {\n baseUnit: \"1rem\",\n densityFactor: DENSITY_FACTOR[input.density],\n };\n}\n\n/* ─────────────────────────── Effects ─────────────────────────── */\n\nconst SHADOW_PRESETS: Record<ShadowIntensity, GeneratedEffects[\"shadows\"]> = {\n none: {\n sm: \"none\",\n md: \"none\",\n lg: \"none\",\n xl: \"none\",\n \"2xl\": \"none\",\n inner: \"none\",\n },\n subtle: {\n sm: \"0 1px 2px 0 rgb(0 0 0 / 0.03)\",\n md: \"0 2px 4px -1px rgb(0 0 0 / 0.04), 0 1px 2px -1px rgb(0 0 0 / 0.03)\",\n lg: \"0 6px 14px -2px rgb(0 0 0 / 0.05)\",\n xl: \"0 12px 24px -4px rgb(0 0 0 / 0.06)\",\n \"2xl\": \"0 24px 48px -12px rgb(0 0 0 / 0.12)\",\n inner: \"inset 0 1px 2px 0 rgb(0 0 0 / 0.03)\",\n },\n default: {\n sm: \"0 1px 2px 0 rgb(0 0 0 / 0.05)\",\n md: \"0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)\",\n lg: \"0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)\",\n xl: \"0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)\",\n \"2xl\": \"0 25px 50px -12px rgb(0 0 0 / 0.25)\",\n inner: \"inset 0 2px 4px 0 rgb(0 0 0 / 0.05)\",\n },\n dramatic: {\n sm: \"0 2px 4px 0 rgb(0 0 0 / 0.12)\",\n md: \"0 8px 16px -2px rgb(0 0 0 / 0.18), 0 4px 8px -4px rgb(0 0 0 / 0.12)\",\n lg: \"0 20px 32px -4px rgb(0 0 0 / 0.22), 0 8px 16px -8px rgb(0 0 0 / 0.18)\",\n xl: \"0 32px 48px -6px rgb(0 0 0 / 0.28), 0 12px 24px -10px rgb(0 0 0 / 0.22)\",\n \"2xl\": \"0 48px 80px -16px rgb(0 0 0 / 0.45)\",\n inner: \"inset 0 4px 8px 0 rgb(0 0 0 / 0.1)\",\n },\n};\n\nfunction resolveEffects(input: ThemeInput[\"effects\"]): GeneratedEffects {\n const preset = input?.shadows ?? \"default\";\n const intensity = input?.motionIntensity ?? 1;\n const scale = (ms: number) => `${Math.round(ms * intensity)}ms`;\n return {\n shadows: SHADOW_PRESETS[preset],\n motion: {\n fast: scale(150),\n base: scale(200),\n slow: scale(300),\n slower: scale(500),\n },\n borderWidth: input?.borderWidth ?? \"1px\",\n };\n}\n\n/* ─────────────────────────── Main generator ─────────────────────────── */\n\n/**\n * Turn a compact ThemeInput into a fully resolved GeneratedTheme.\n * Pure function — safe to run on the client, server, or at build time.\n */\nexport function generateTheme(input: ThemeInput): GeneratedTheme {\n // 0. Global intensity multiplier — flips everything muted/default/vibrant.\n const intensity = INTENSITY_MULTIPLIER[input.intensity ?? \"default\"];\n\n // 1. Build the three base ramps — per-ramp chroma scales multiply by the\n // global intensity so muted/vibrant affect everything cohesively.\n const pureGray = input.neutralPureGray ?? false;\n const neutralChroma = (input.chroma?.neutral ?? 0.08) * intensity;\n const primaryChroma = (input.chroma?.primary ?? 1) * intensity;\n const accentChroma = (input.chroma?.accent ?? 1) * intensity;\n\n const neutral = pureGray\n ? neutralRamp()\n : hueToRamp({ hue: input.hues.neutral, chromaScale: neutralChroma });\n const primary = hueToRamp({ hue: input.hues.primary, chromaScale: primaryChroma });\n const accent = hueToRamp({ hue: input.hues.accent, chromaScale: accentChroma });\n\n const ramps = { neutral, primary, accent };\n\n const chart = buildChartPalette(\n input.hues,\n { primary: primaryChroma, accent: accentChroma },\n intensity\n );\n\n // 2. Derive semantic tokens for all four modes\n const colors = Object.fromEntries(\n ALL_MODES.map((mode) => [mode, deriveColorsForMode(ramps, mode)])\n ) as Record<ModeName, GeneratedColorsMode>;\n\n // 3. Resolve non-color config into concrete CSS values\n const typography = resolveTypography(input.typography);\n const radius = resolveRadius(input.radius);\n const spacing = resolveSpacing(input.spacing);\n const effects = resolveEffects(input.effects);\n\n // 4. Apply component defaults\n const components: GeneratedTheme[\"components\"] = {\n buttonShape: input.components?.buttonShape ?? \"default\",\n inputStyle: input.components?.inputStyle ?? \"outlined\",\n cardStyle: input.components?.cardStyle ?? \"flat\",\n };\n\n return {\n id: input.id,\n name: input.name,\n description: input.description,\n tagline: input.tagline,\n input,\n ramps,\n colors,\n chart,\n typography,\n radius,\n spacing,\n effects,\n components,\n };\n}\n","import type { ThemeInput } from \"./types\";\n\n/**\n * Built-in ThemeInputs. Every theme — built-in or user-built — is a\n * ThemeInput. Built-ins are just curated ones we ship as starting points.\n *\n * \"Calm\" is the canonical Grade DS look: warm neutrals, terracotta primary,\n * serif display + body, roomier spacing, rounded corners, pill buttons,\n * subtle shadows. \"Energy\" is a bolder alternate — teal primary, Geist\n * sans, tighter feel.\n *\n * To add a new built-in: define a ThemeInput here, import it in index.ts,\n * and add it to the registry.\n */\n\n/**\n * Calm — the canonical Grade DS theme.\n *\n * Warm neutral tint (~40° amber), terracotta primary (~20°), amber accent.\n * Serif display and body (Fraunces with its full variable weight range),\n * roomier spacing, rounder corners, pill buttons, outlined cards, subtle\n * shadows, slower motion.\n */\nexport const calmInput: ThemeInput = {\n id: \"calm\",\n name: \"Calm\",\n description: \"Warm neutrals, terracotta primary, serif typography.\",\n tagline: \"Signature\",\n hues: {\n neutral: 40,\n primary: 20,\n accent: 40,\n },\n chroma: {\n neutral: 0.15,\n primary: 0.75,\n accent: 0.8,\n },\n // Calm leans muted — it's a quiet editorial theme by design.\n intensity: \"muted\",\n typography: {\n // Fraunces has proper variable weights, so bold headings look like serif\n // bold (Instrument Serif only ships in 400 and synthesizes awkwardly when\n // something like `font-bold` on an h1 forces 700).\n display: \"fraunces\",\n body: \"fraunces\",\n mono: \"jetbrainsMono\",\n scale: \"default\",\n headingWeight: 600,\n headingTracking: \"-0.02em\",\n },\n spacing: { density: \"roomy\" },\n radius: { style: \"round\" },\n effects: {\n shadows: \"subtle\",\n motionIntensity: 1.25,\n },\n components: {\n buttonShape: \"pill\",\n inputStyle: \"outlined\",\n cardStyle: \"outlined\",\n },\n};\n\n/**\n * Energy — bolder alternate theme.\n *\n * Teal primary + indigo accent (complementary-cool pairing). Neutral gets\n * a whisper of chroma (0.08× default curve) so grays read cool against\n * both brand colors rather than clinical. Modern sans (Geist) with\n * tighter spacing and standard corners.\n */\nexport const energyInput: ThemeInput = {\n id: \"energy\",\n name: \"Energy\",\n description: \"Teal + indigo — punchy, cool-tone, modern sans.\",\n tagline: \"Alternate\",\n hues: {\n neutral: 175,\n primary: 175,\n accent: 235, // indigo — distinct from teal primary, stays cool-tone\n },\n chroma: {\n neutral: 0.08,\n primary: 1.0,\n accent: 1.0,\n },\n // Energy is loud — bump intensity so the teal pops.\n intensity: \"vibrant\",\n typography: {\n display: \"geist\",\n body: \"geist\",\n mono: \"geistMono\",\n scale: \"default\",\n headingWeight: 600,\n },\n spacing: { density: \"default\" },\n radius: { style: \"soft\" },\n effects: {\n shadows: \"default\",\n motionIntensity: 1,\n },\n components: {\n buttonShape: \"default\",\n inputStyle: \"outlined\",\n cardStyle: \"flat\",\n },\n};\n\nexport const BUILT_IN_INPUTS: ThemeInput[] = [calmInput, energyInput];\n","import type { GeneratedColorsMode, GeneratedTheme } from \"./types\";\nimport { RAMP_KEYS, type ModeName, type Ramp } from \"./oklch\";\n\n/**\n * Runtime theme application.\n *\n * Writes a GeneratedTheme to :root as CSS custom properties. The consuming\n * CSS (globals.css + tailwind.config.ts) wraps each var with\n * oklch(var(--x) / <alpha-value>)\n * so Tailwind opacity shortcuts keep working.\n *\n * Apart from color tokens, this also writes:\n * - Typography CSS vars (--font-sans, --font-display, --font-mono,\n * --font-heading-weight, --font-heading-tracking, plus the type scale)\n * - Radius vars (--radius + --rds-radius-*)\n * - Spacing density (--rds-density multiplier)\n * - Shadow, motion, and border vars (--rds-shadow-*, --rds-transition-*)\n * - Ramp swatches (--ramp-neutral-50…950, etc.) for the theme builder UI\n * - data-* attributes driving component shape CSS rules\n */\n\nexport type { ModeName } from \"./oklch\";\n\n/** Expand a GeneratedColorsMode into a flat { --var: value } map. */\nfunction colorVars(c: GeneratedColorsMode): Record<string, string> {\n return {\n \"--background\": c.background,\n \"--foreground\": c.foreground,\n \"--card\": c.card,\n \"--card-foreground\": c.cardForeground,\n \"--popover\": c.popover,\n \"--popover-foreground\": c.popoverForeground,\n \"--primary\": c.primary,\n \"--primary-foreground\": c.primaryForeground,\n \"--secondary\": c.secondary,\n \"--secondary-foreground\": c.secondaryForeground,\n \"--muted\": c.muted,\n \"--muted-foreground\": c.mutedForeground,\n \"--accent\": c.accent,\n \"--accent-foreground\": c.accentForeground,\n \"--destructive\": c.destructive,\n \"--destructive-foreground\": c.destructiveForeground,\n \"--border\": c.border,\n \"--input\": c.input,\n \"--ring\": c.ring,\n \"--success\": c.success,\n \"--warning\": c.warning,\n \"--info\": c.info,\n \"--highlight\": c.highlight,\n\n // Alert surface pairs — paler tinted surface + deeper on-surface text\n // for each status colour. Consumed by Alert, Badge (soft variants), and\n // anywhere a banner needs a status tint without going full-saturation.\n \"--destructive-soft\": c.destructiveSoft,\n \"--destructive-deep\": c.destructiveDeep,\n \"--success-soft\": c.successSoft,\n \"--success-deep\": c.successDeep,\n \"--warning-soft\": c.warningSoft,\n \"--warning-deep\": c.warningDeep,\n \"--info-soft\": c.infoSoft,\n \"--info-deep\": c.infoDeep,\n \"--highlight-soft\": c.highlightSoft,\n \"--highlight-deep\": c.highlightDeep,\n };\n}\n\n/**\n * Produce every CSS custom property a given GeneratedTheme + mode implies,\n * as a flat { key: value } map. Useful for the provider (applies to :root)\n * and the builder preview pane (applies to a scoped wrapper).\n */\nexport function themeToCSSVars(\n theme: GeneratedTheme,\n mode: ModeName\n): Record<string, string> {\n const colors = theme.colors[mode];\n const vars: Record<string, string> = {\n ...colorVars(colors),\n\n // --- Ramp swatches (useful for token previews + future palette tools) ---\n // Each ramp stop is exposed as --ramp-<name>-<step> so the builder can\n // render live palette chips without re-running the generator.\n ...flattenRamp(\"neutral\", theme.ramps.neutral),\n ...flattenRamp(\"primary\", theme.ramps.primary),\n ...flattenRamp(\"accent\", theme.ramps.accent),\n\n // --- Chart palette — 5 tonally-cohesive series colors derived from hues.\n \"--chart-1\": theme.chart[1],\n \"--chart-2\": theme.chart[2],\n \"--chart-3\": theme.chart[3],\n \"--chart-4\": theme.chart[4],\n \"--chart-5\": theme.chart[5],\n\n // --- Typography ---\n \"--font-sans\": theme.typography.fontSans,\n \"--font-mono\": theme.typography.fontMono,\n \"--font-display\": theme.typography.fontDisplay,\n \"--font-heading-weight\": String(theme.typography.headingWeight),\n \"--font-body-weight\": String(theme.typography.bodyWeight),\n \"--font-heading-tracking\": theme.typography.headingTracking,\n \"--text-display\": theme.typography.scale.display,\n \"--text-h1\": theme.typography.scale.h1,\n \"--text-h2\": theme.typography.scale.h2,\n \"--text-h3\": theme.typography.scale.h3,\n \"--text-h4\": theme.typography.scale.h4,\n \"--text-h5\": theme.typography.scale.h5,\n \"--text-h6\": theme.typography.scale.h6,\n \"--text-body\": theme.typography.scale.body,\n \"--text-body-sm\": theme.typography.scale.bodySm,\n\n // --- Radius ---\n \"--radius\": theme.radius.base,\n \"--rds-radius-sm\": theme.radius.sm,\n \"--rds-radius-md\": theme.radius.md,\n \"--rds-radius-lg\": theme.radius.lg,\n \"--rds-radius-xl\": theme.radius.xl,\n \"--rds-radius-2xl\": theme.radius[\"2xl\"],\n \"--rds-radius-full\": theme.radius.full,\n\n // --- Spacing density multiplier (consumed via calc()) ---\n \"--rds-density\": String(theme.spacing.densityFactor),\n\n // --- Shadows ---\n \"--rds-shadow-sm\": theme.effects.shadows.sm,\n \"--rds-shadow-md\": theme.effects.shadows.md,\n \"--rds-shadow-lg\": theme.effects.shadows.lg,\n \"--rds-shadow-xl\": theme.effects.shadows.xl,\n \"--rds-shadow-2xl\": theme.effects.shadows[\"2xl\"],\n \"--rds-shadow-inner\": theme.effects.shadows.inner,\n\n // --- Motion ---\n \"--rds-transition-fast\": theme.effects.motion.fast,\n \"--rds-transition-base\": theme.effects.motion.base,\n \"--rds-transition-slow\": theme.effects.motion.slow,\n \"--rds-transition-slower\": theme.effects.motion.slower,\n\n // --- Borders ---\n \"--rds-border-width\": theme.effects.borderWidth,\n };\n return vars;\n}\n\nfunction flattenRamp(\n name: \"neutral\" | \"primary\" | \"accent\",\n ramp: Ramp\n): Record<string, string> {\n const out: Record<string, string> = {};\n for (const step of RAMP_KEYS) {\n out[`--ramp-${name}-${step}`] = ramp[step];\n }\n return out;\n}\n\n/**\n * Apply a theme to the document root. Writes every CSS variable produced by\n * themeToCSSVars and sets a set of data attributes that component-shape\n * CSS rules key off of.\n *\n * Safe to call repeatedly — each call fully resets the vars the theme\n * controls. Vars the theme doesn't touch (e.g. --rds-green-500 in\n * globals.css) are left alone.\n */\nexport function applyThemeToRoot(theme: GeneratedTheme, mode: ModeName): void {\n if (typeof document === \"undefined\") return;\n const root = document.documentElement;\n const vars = themeToCSSVars(theme, mode);\n for (const [key, value] of Object.entries(vars)) {\n root.style.setProperty(key, value);\n }\n\n // Metadata attributes — components key styles off these.\n // Fall back to sensible defaults if a field is missing (shouldn't happen\n // for generator output, but keeps this safe if called with a partial).\n root.setAttribute(\"data-ramp-theme\", theme.id);\n root.setAttribute(\"data-mode\", mode);\n root.setAttribute(\"data-button-shape\", theme.components.buttonShape ?? \"default\");\n root.setAttribute(\"data-input-style\", theme.components.inputStyle ?? \"outlined\");\n root.setAttribute(\"data-card-style\", theme.components.cardStyle ?? \"flat\");\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\n\n/**\n * Convert an OKLCH triplet (e.g. \"0.610 0.128 20\") to its sRGB hex equivalent.\n *\n * Implemented by asking the browser to compute the color — we set the\n * oklch() value on a throwaway element, read the resolved rgb() string,\n * and format to hex. This sidesteps having to reimplement the OKLCH → Lab\n * → XYZ → sRGB conversion chain by hand, and picks up the browser's own\n * gamut-mapping behaviour for free.\n *\n * Returns \"\" during SSR (no document), so callers should gate on truthy.\n */\nexport function oklchToHex(triplet: string): string {\n if (typeof document === \"undefined\") return \"\";\n const probe = document.createElement(\"span\");\n probe.style.color = `oklch(${triplet})`;\n // Must be in the DOM for getComputedStyle to resolve. Keep it invisible.\n probe.style.position = \"absolute\";\n probe.style.visibility = \"hidden\";\n document.body.appendChild(probe);\n const rgb = getComputedStyle(probe).color; // \"rgb(r, g, b)\" or \"rgba(...)\"\n document.body.removeChild(probe);\n const match = rgb.match(/\\d+/g);\n if (!match || match.length < 3) return \"\";\n const [r, g, b] = match.slice(0, 3).map(Number);\n return (\n \"#\" +\n [r, g, b]\n .map((x) => Math.max(0, Math.min(255, x)).toString(16).padStart(2, \"0\"))\n .join(\"\")\n .toUpperCase()\n );\n}\n\n/**\n * React hook: convert a list of OKLCH triplets to hex values on the client.\n * Returns an empty array during SSR and the resolved hexes after mount.\n */\nexport function useOklchHexes(triplets: readonly string[]): string[] {\n const key = useMemo(() => triplets.join(\"|\"), [triplets]);\n const [hexes, setHexes] = useState<string[]>([]);\n useEffect(() => {\n setHexes(triplets.map(oklchToHex));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [key]);\n return hexes;\n}\n\n/**\n * Format an OKLCH triplet compactly for display. Strips excess decimals\n * from the ugly 0.00225 40 looks and trims to something like 0.99 0.002 40.\n */\nexport function formatOklch(triplet: string): string {\n const parts = triplet.trim().split(/\\s+/);\n if (parts.length < 3) return triplet;\n const [lRaw, cRaw, hRaw] = parts;\n const l = Number(lRaw);\n const c = Number(cRaw);\n const h = Number(hRaw);\n if (Number.isNaN(l) || Number.isNaN(c) || Number.isNaN(h)) return triplet;\n // L: 2 decimals, C: 3 (or 2 if very small), H: nearest integer.\n const lStr = l.toFixed(2);\n const cStr = c < 0.01 ? c.toFixed(3) : c.toFixed(2);\n const hStr = String(Math.round(h));\n return `${lStr} ${cStr} ${hStr}°`;\n}\n","/**\n * Theme → Markdown exporter.\n *\n * Produces a self-contained spec document for a GeneratedTheme. The output\n * is designed to be pasted into a fresh LLM prompt (Claude, ChatGPT, Cursor,\n * whatever) alongside a design brief, so the model produces UI that looks\n * exactly like the theme even with zero other project context.\n *\n * What it includes:\n * - Theme summary + full ThemeInput config (round-trippable)\n * - All three 11-stop ramps as OKLCH triplets + hex equivalents\n * - Semantic tokens for light + dark modes\n * - Fixed semantic colors (success / warning / etc.)\n * - 5-stop chart palette\n * - Typography resolution (font-family strings, scale, weights, tracking)\n * - Radius + spacing + effects values\n * - Component-level defaults\n * - Tailwind / CSS var conventions\n * - Component API summary (just enough for an LLM to hand-compose)\n * - Feel / voice guidance so generated UI matches the theme's character\n *\n * Intentionally ASCII/markdown only — no images, no code that needs to\n * execute. Paste it anywhere.\n */\n\nimport { oklchToHex } from \"./oklch-to-hex\";\nimport type { GeneratedTheme, Ramp } from \"./types\";\nimport { RAMP_KEYS, type RampKey } from \"./oklch\";\n\n/** Format a single OKLCH triplet compactly, with hex lookup. */\nfunction rowTriplet(triplet: string): { oklch: string; hex: string } {\n const parts = triplet.trim().split(/\\s+/);\n if (parts.length < 3) return { oklch: triplet, hex: \"\" };\n const [l, c, h] = parts.map(Number);\n const oklch = `${l.toFixed(3)} ${c.toFixed(3)} ${Math.round(h)}`;\n const hex = oklchToHex(triplet);\n return { oklch, hex };\n}\n\n/** Render an 11-row table for a ramp. */\nfunction rampTable(name: string, ramp: Ramp, hue: number): string {\n const lines = [\n `### ${name} ramp (hue ${Math.round(hue)}°)`,\n ``,\n `| Step | OKLCH | Hex |`,\n `|------|-------|-----|`,\n ];\n for (const step of RAMP_KEYS) {\n const { oklch, hex } = rowTriplet(ramp[step as RampKey]);\n lines.push(`| ${step} | \\`${oklch}\\` | \\`${hex || \"—\"}\\` |`);\n }\n return lines.join(\"\\n\");\n}\n\n/** Render a semantic token table (light + dark side by side). */\nfunction semanticTable(\n label: string,\n rows: Array<{ token: string; light: string; dark: string; usage: string }>\n): string {\n const lines = [\n `### ${label}`,\n ``,\n `| Token | Usage | Light (hex) | Dark (hex) |`,\n `|-------|-------|-------------|------------|`,\n ];\n for (const r of rows) {\n const lightHex = oklchToHex(r.light) || \"—\";\n const darkHex = oklchToHex(r.dark) || \"—\";\n lines.push(\n `| \\`--${r.token}\\` | ${r.usage} | \\`${lightHex}\\` (\\`${r.light}\\`) | \\`${darkHex}\\` (\\`${r.dark}\\`) |`\n );\n }\n return lines.join(\"\\n\");\n}\n\n/** Stable JSON pretty-printer for the input snapshot. */\nfunction stringifyInput(theme: GeneratedTheme): string {\n return JSON.stringify(theme.input, null, 2);\n}\n\n/** The full template. */\nexport function generateThemeMarkdown(theme: GeneratedTheme): string {\n const { input, ramps, colors, chart, typography, radius, spacing, effects, components } = theme;\n const intensity = input.intensity ?? \"default\";\n\n // Core / derived semantic tokens — two columns (light / dark).\n const mapToken = (token: string) => ({\n token,\n usage: USAGE_HINTS[token] ?? \"\",\n light: (colors.light as unknown as Record<string, string>)[token],\n dark: (colors.dark as unknown as Record<string, string>)[token],\n });\n\n const hueDerived = [\n \"background\",\n \"foreground\",\n \"card\",\n \"cardForeground\",\n \"popover\",\n \"popoverForeground\",\n \"primary\",\n \"primaryForeground\",\n \"secondary\",\n \"secondaryForeground\",\n \"muted\",\n \"mutedForeground\",\n \"accent\",\n \"accentForeground\",\n \"border\",\n \"input\",\n \"ring\",\n ].map(mapToken);\n\n const fixedSemantic = [\n \"destructive\",\n \"destructiveForeground\",\n \"success\",\n \"warning\",\n \"info\",\n \"highlight\",\n ].map(mapToken);\n\n // Chart palette row with hex.\n const chartRows = ([1, 2, 3, 4, 5] as const).map((i) => {\n const triplet = chart[i];\n return { slot: i, triplet, hex: oklchToHex(triplet) || \"—\" };\n });\n\n return `# ${theme.name} — Grade Design System Theme\n\n> **Portable theme spec.** Paste this entire file into a fresh LLM prompt along with your design brief. The model will have everything it needs to produce UI that matches this exact theme — colors, typography, spacing, shapes, and the \"feel\" we're after.\n\n## At a glance\n\n- **Name**: ${theme.name}\n- **ID**: \\`${input.id}\\`\n${input.description ? `- **Description**: ${input.description}\\n` : \"\"}- **Hues**: neutral \\`${input.hues.neutral}°\\` · primary \\`${input.hues.primary}°\\` · accent \\`${input.hues.accent}°\\`\n- **Intensity**: \\`${intensity}\\` ${intensity === \"muted\" ? \"(quieter chroma across the board)\" : intensity === \"vibrant\" ? \"(punchier chroma across the board)\" : \"(balanced)\"}\n- **Typography**: ${input.typography.display} display · ${input.typography.body} body · ${input.typography.mono} mono · scale \\`${input.typography.scale}\\`\n- **Spacing density**: \\`${input.spacing.density}\\`\n- **Radius style**: \\`${input.radius.style}\\` (base \\`${radius.base}\\`)\n- **Button shape**: \\`${components.buttonShape}\\` · **Input style**: \\`${components.inputStyle}\\` · **Card style**: \\`${components.cardStyle}\\`\n- **Shadow preset**: \\`${input.effects?.shadows ?? \"default\"}\\` · **Motion intensity**: \\`${input.effects?.motionIntensity ?? 1}\\`\n\n## How themes work\n\nEvery theme in Grade DS is produced by a pure function:\n\n\\`\\`\\`ts\ngenerateTheme(input: ThemeInput) => GeneratedTheme\n\\`\\`\\`\n\nA \\`ThemeInput\\` is a small object (three hues plus a handful of presets). The generator turns it into three 11-stop **OKLCH** color ramps, semantic tokens for four brightness modes (superLight / light / dark / superDark), a chart palette, and concrete values for typography, radius, spacing, and effects. Everything downstream reads from CSS variables set on \\`:root\\`.\n\n## Full ThemeInput (round-trippable)\n\n\\`\\`\\`json\n${stringifyInput(theme)}\n\\`\\`\\`\n\n## Color ramps\n\nThree 11-stop OKLCH ramps, generated from the input hues + chromas + global intensity. Every color elsewhere in the theme resolves back to one of these stops.\n\n${rampTable(\"Neutral\", ramps.neutral, input.hues.neutral)}\n\n${rampTable(\"Primary\", ramps.primary, input.hues.primary)}\n\n${rampTable(\"Accent\", ramps.accent, input.hues.accent)}\n\n## Semantic tokens (hue-derived)\n\nPurpose-based tokens drawn from the ramps. Two values per token — the generator produces them for all four brightness modes, but only light + dark are shown here for brevity.\n\n${semanticTable(\"Core semantic tokens\", hueDerived)}\n\n## Fixed semantic tokens (not hue-derived)\n\nStatus colors stay consistent across themes so users always read green as success, red as destructive, etc. Accessibility wins over brand cohesion.\n\n${semanticTable(\"Status colors\", fixedSemantic)}\n\n## Chart palette\n\n5-stop categorical palette derived from theme hues. Primary leads, then two hue-rotated variants, then neutral, then accent. Adjacent slots are guaranteed to be visually distinct.\n\n| Slot | OKLCH | Hex |\n|------|-------|-----|\n${chartRows.map((r) => `| \\`--chart-${r.slot}\\` | \\`${r.triplet}\\` | \\`${r.hex}\\` |`).join(\"\\n\")}\n\n## Typography\n\n- **Display font**: \\`${typography.fontDisplay}\\`\n- **Body font**: \\`${typography.fontSans}\\`\n- **Mono font**: \\`${typography.fontMono}\\`\n- **Heading weight**: \\`${typography.headingWeight}\\`\n- **Body weight**: \\`${typography.bodyWeight}\\`\n- **Heading letter-spacing**: \\`${typography.headingTracking}\\`\n\n### Type scale\n\n| Step | Size |\n|------|------|\n| \\`text-display\\` | \\`${typography.scale.display}\\` |\n| \\`text-h1\\` | \\`${typography.scale.h1}\\` |\n| \\`text-h2\\` | \\`${typography.scale.h2}\\` |\n| \\`text-h3\\` | \\`${typography.scale.h3}\\` |\n| \\`text-h4\\` | \\`${typography.scale.h4}\\` |\n| \\`text-h5\\` | \\`${typography.scale.h5}\\` |\n| \\`text-h6\\` | \\`${typography.scale.h6}\\` |\n| body | \\`${typography.scale.body}\\` |\n| body-sm | \\`${typography.scale.bodySm}\\` |\n\n## Radius, spacing, effects\n\n### Radius\n\n| Step | Value |\n|------|-------|\n| \\`--radius\\` (base) | \\`${radius.base}\\` |\n| \\`--rds-radius-sm\\` | \\`${radius.sm}\\` |\n| \\`--rds-radius-md\\` | \\`${radius.md}\\` |\n| \\`--rds-radius-lg\\` | \\`${radius.lg}\\` |\n| \\`--rds-radius-xl\\` | \\`${radius.xl}\\` |\n| \\`--rds-radius-2xl\\` | \\`${radius[\"2xl\"]}\\` |\n| \\`--rds-radius-full\\` | \\`${radius.full}\\` |\n\n### Spacing\n\n- **Density factor**: \\`${spacing.densityFactor}\\` (applied as \\`var(--rds-density)\\` on components that opt in)\n- **Base unit**: \\`${spacing.baseUnit}\\`\n\n### Motion\n\n| Var | Duration |\n|-----|----------|\n| \\`--rds-transition-fast\\` | \\`${effects.motion.fast}\\` |\n| \\`--rds-transition-base\\` | \\`${effects.motion.base}\\` |\n| \\`--rds-transition-slow\\` | \\`${effects.motion.slow}\\` |\n| \\`--rds-transition-slower\\` | \\`${effects.motion.slower}\\` |\n\n### Shadows\n\nAll shadows are applied via Tailwind's \\`shadow-*\\` utilities mapped to these var values.\n\n| Var | Value |\n|-----|-------|\n| \\`--rds-shadow-sm\\` | \\`${effects.shadows.sm}\\` |\n| \\`--rds-shadow-md\\` | \\`${effects.shadows.md}\\` |\n| \\`--rds-shadow-lg\\` | \\`${effects.shadows.lg}\\` |\n| \\`--rds-shadow-xl\\` | \\`${effects.shadows.xl}\\` |\n\n## CSS variable conventions\n\nEvery color is stored as a bare \\`L C H\\` OKLCH triplet and wrapped at call time:\n\n\\`\\`\\`css\n:root {\n --primary: ${colors.light.primary};\n --background: ${colors.light.background};\n}\n\\`\\`\\`\n\nTailwind config wraps these with \\`oklch(var(--x) / <alpha-value>)\\` so Tailwind's opacity shortcuts work:\n\n\\`\\`\\`html\n<div class=\"bg-primary text-primary-foreground\">...</div>\n<div class=\"bg-primary/50 hover:bg-primary/80\">...</div>\n<div class=\"text-muted-foreground border-border/40\">...</div>\n\\`\\`\\`\n\n## Tailwind class cheat sheet\n\n| Utility | Token |\n|---------|-------|\n| \\`bg-background\\`, \\`text-foreground\\` | page bg + primary text |\n| \\`bg-card\\`, \\`text-card-foreground\\` | elevated surfaces |\n| \\`bg-popover\\`, \\`text-popover-foreground\\` | floating menus |\n| \\`bg-primary\\`, \\`text-primary-foreground\\` | primary action / brand |\n| \\`bg-secondary\\`, \\`text-secondary-foreground\\` | secondary surface |\n| \\`bg-muted\\`, \\`text-muted-foreground\\` | subtle surface + subtext |\n| \\`bg-accent\\`, \\`text-accent-foreground\\` | highlight / hover |\n| \\`border-border\\`, \\`border-input\\` | default + form borders |\n| \\`ring-ring\\` | focus ring |\n| \\`bg-destructive\\`, \\`bg-success\\`, \\`bg-warning\\`, \\`bg-info\\`, \\`bg-highlight\\` | status colors |\n| \\`bg-chart-1\\` … \\`bg-chart-5\\` | chart series |\n\n## Components the theme styles\n\nImport from \\`@gradeui/ui\\` — all components read theme vars and re-skin automatically:\n\n\\`\\`\\`tsx\nimport {\n Button, Input, Textarea, Label, Select, Checkbox, RadioGroup, Switch,\n Slider, Toggle, Calendar, Card, Badge, Alert, Skeleton, Separator,\n HoverCard, Popover, Dialog, Sheet, Tooltip, Progress, DropdownMenu,\n Command, Tabs, SimpleTabs, Accordion, Collapsible, ScrollArea, Table,\n Avatar, AIChat, Logo, SectionBlock, CardBlock, MediaBlock, FAQBlock,\n} from \"@gradeui/ui\";\nimport \"@gradeui/ui/styles.css\";\n\\`\\`\\`\n\nEvery component accepts a \\`className\\` for layout tweaks. Variants are passed via a \\`variant\\` prop: \\`<Button variant=\"outline\">\\`, \\`<Alert variant=\"success\">\\`, \\`<Badge variant=\"destructive-soft\">\\`.\n\n## Feel and voice\n\nWhen generating UI in the ${theme.name} theme, match this character:\n\n${feelNotes(theme)}\n\n## Instructions for the generating LLM\n\n1. **Use semantic tokens first**. Prefer \\`bg-primary\\`, \\`text-foreground\\`, \\`border-border\\` over raw ramp classes. Reach for \\`bg-primary-500\\` / \\`bg-neutral-200\\` only when you need a specific shade unavailable as a semantic token.\n2. **Status colors are fixed**. Do not use \\`success\\` for a generic success-feeling visual — it's always green-ish. Use \\`primary\\` / \\`accent\\` for brand flavor; \\`success\\` / \\`warning\\` / \\`destructive\\` for actual state.\n3. **Respect the shape presets**. If the theme's buttonShape is \\`pill\\`, don't add \\`rounded-none\\` to a Button. The component already matches the theme.\n4. **Typography scales with the theme**. Heading utilities \\`.text-h1\\`–\\`.text-h6\\` pick up the theme's display font automatically; body text inherits the body font. Only override with \\`font-mono\\` for code-like content.\n5. **Charts get theme palette**. Use \\`var(--chart-1)\\` through \\`var(--chart-5)\\` for series colors. Don't hardcode hex in charts.\n6. **Dark mode is one class**. Add \\`dark\\` to \\`<html>\\` (or toggle with the provider's \\`setMode(\"dark\")\\`). All tokens have dark variants already — no \\`dark:\\` prefixes needed on most components.\n7. **Layout freely**. The theme controls look-and-feel; composition is up to you. Use Tailwind for grids, spacing, flex layout exactly as normal.\n\n## Quick regeneration\n\nTo recreate this theme in code:\n\n\\`\\`\\`ts\nimport { generateTheme, applyThemeToRoot, type ThemeInput } from \"@gradeui/ui\";\n\nconst input: ThemeInput = ${stringifyInput(theme).replace(/\\n/g, \"\\n\")};\n\nconst theme = generateTheme(input);\napplyThemeToRoot(theme, \"light\"); // or \"dark\" / \"superLight\" / \"superDark\"\n\\`\\`\\`\n\n---\n*Generated from Grade Design System v1 · ${new Date().toISOString()}*\n`;\n}\n\n/** One-line usage hints for each semantic token — populates the table. */\nconst USAGE_HINTS: Record<string, string> = {\n background: \"Page / body background\",\n foreground: \"Primary text\",\n card: \"Elevated surface background\",\n cardForeground: \"Text on cards\",\n popover: \"Floating menu background\",\n popoverForeground: \"Text inside floating menus\",\n primary: \"Primary actions, links, default button\",\n primaryForeground: \"Text on primary-tinted fills\",\n secondary: \"Secondary surfaces + quiet buttons\",\n secondaryForeground: \"Text on secondary surfaces\",\n muted: \"Subtle surfaces (hover states, skeletons)\",\n mutedForeground: \"Secondary / less-important text\",\n accent: \"Highlights, hover accents\",\n accentForeground: \"Text on accent surfaces\",\n border: \"Default borders\",\n input: \"Form input borders\",\n ring: \"Focus ring color\",\n destructive: \"Destructive actions, errors\",\n destructiveForeground: \"Text on destructive surfaces\",\n success: \"Success states\",\n warning: \"Warning states\",\n info: \"Informational states\",\n highlight: \"Emphasis, new features, callouts\",\n};\n\n/**\n * Heuristic feel notes per theme — tuned by input.intensity + components\n * + typography. Gives the generating LLM concrete direction for voice +\n * composition, not just colors.\n */\nfunction feelNotes(theme: GeneratedTheme): string {\n const notes: string[] = [];\n const { input, components } = theme;\n\n if (input.intensity === \"muted\") {\n notes.push(\n \"- **Quiet and restrained.** Avoid heavy saturation, glowing effects, or loud contrast jumps. Let whitespace do the work.\"\n );\n } else if (input.intensity === \"vibrant\") {\n notes.push(\n \"- **Loud and confident.** Primary color wants to lead. Use it on hero CTAs, key metrics, empty states. Don't be shy.\"\n );\n } else {\n notes.push(\n \"- **Balanced.** Neither shouty nor sleepy — a workhorse feel suited to product interfaces.\"\n );\n }\n\n if (input.spacing.density === \"roomy\") {\n notes.push(\n \"- **Generous spacing.** Stretch things out — reach for \\`gap-6\\`, \\`gap-8\\`, \\`p-6\\`, \\`p-8\\`. Airy is the vibe.\"\n );\n } else if (input.spacing.density === \"tight\") {\n notes.push(\n \"- **Dense layouts.** Pack information in — \\`gap-2\\`, \\`gap-3\\`, \\`p-3\\`, \\`p-4\\`. Scan-friendly dashboard energy.\"\n );\n } else {\n notes.push(\"- **Standard density.** Use Tailwind's default spacing ladder.\");\n }\n\n if (input.radius.style === \"pill\") {\n notes.push(\n \"- **Fully rounded.** Controls are pill-shaped. Use \\`rounded-full\\` on custom chips / pills too.\"\n );\n } else if (input.radius.style === \"sharp\") {\n notes.push(\n \"- **Square corners.** Zero radius everywhere — very architectural. Do not add curves.\"\n );\n } else if (input.radius.style === \"round\") {\n notes.push(\n \"- **Rounded and friendly.** Corner radius is noticeable (≈14px base). Avoid sharp edges.\"\n );\n } else {\n notes.push(\"- **Standard rounded corners.**\");\n }\n\n const displayFont = input.typography.display;\n if (displayFont === \"fraunces\" || displayFont === \"instrumentSerif\" || displayFont === \"sourceSerif\") {\n notes.push(\n \"- **Editorial serif headings.** Treat headings like magazine titles — give them space and weight. Serifs reward larger sizes.\"\n );\n } else if (displayFont === \"geist\" || displayFont === \"inter\") {\n notes.push(\n \"- **Modern technical sans.** Clean, functional, neutral. Good for product UIs.\"\n );\n }\n\n if (components.cardStyle === \"outlined\") {\n notes.push(\n \"- **Cards are outlined**, not shadowed. Rely on borders + spacing for hierarchy.\"\n );\n } else if (components.cardStyle === \"elevated\") {\n notes.push(\n \"- **Cards have real elevation.** Use shadows to stack content visually.\"\n );\n } else if (components.cardStyle === \"glass\") {\n notes.push(\n \"- **Glass / frosted cards.** Use translucent surfaces over background imagery or gradients.\"\n );\n }\n\n if (components.buttonShape === \"pill\") {\n notes.push(\"- **Buttons are pills** — don't override with square corners.\");\n }\n\n return notes.join(\"\\n\");\n}\n\n/**\n * Trigger a browser download of the theme's markdown spec.\n * Client-side only — no-ops during SSR.\n */\nexport function downloadThemeMarkdown(theme: GeneratedTheme): void {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") return;\n const content = generateThemeMarkdown(theme);\n const blob = new Blob([content], { type: \"text/markdown;charset=utf-8\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `ramp-theme-${theme.input.id}.md`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n}\n","/**\n * Theme system public API.\n *\n * Every theme — built-in or user-built — is a ThemeInput that flows\n * through generateTheme() to produce a GeneratedTheme. The provider\n * consumes GeneratedThemes and writes them to :root via applyThemeToRoot.\n *\n * Built-in themes are defined in inputs.ts and generated on module load.\n * User themes are persisted as ThemeInputs in localStorage (phase 4) and\n * generated on demand.\n */\n\nimport { generateTheme } from \"./generator\";\nimport { BUILT_IN_INPUTS, calmInput } from \"./inputs\";\nimport type { GeneratedTheme, ThemeInput } from \"./types\";\n\n// Public re-exports\nexport * from \"./types\";\nexport { generateTheme } from \"./generator\";\nexport { themeToCSSVars, applyThemeToRoot } from \"./apply\";\nexport type { ModeName } from \"./oklch\";\nexport { BUILT_IN_INPUTS, calmInput, energyInput } from \"./inputs\";\nexport { generateThemeMarkdown, downloadThemeMarkdown } from \"./export-md\";\nexport { oklchToHex, useOklchHexes, formatOklch } from \"./oklch-to-hex\";\n\n/**\n * Generated built-in themes, keyed by id. These are pure — generated once\n * at module load and shared across the app. Adding a new built-in means\n * updating inputs.ts; this map follows automatically.\n */\nexport const builtInThemes: Record<string, GeneratedTheme> = Object.fromEntries(\n BUILT_IN_INPUTS.map((input) => [input.id, generateTheme(input)])\n);\n\nexport const defaultThemeId = calmInput.id;\n\n/**\n * Look up a theme by id — built-in or user-built. User themes are read\n * from localStorage lazily (only called from client code).\n *\n * Returns undefined if no theme matches.\n */\nexport function getTheme(id: string): GeneratedTheme | undefined {\n if (id in builtInThemes) return builtInThemes[id];\n const userInput = loadUserThemeInput(id);\n if (userInput) return generateTheme(userInput);\n return undefined;\n}\n\n/** Enumerate every theme — built-in first, then user themes. */\nexport function listThemes(): GeneratedTheme[] {\n return [...Object.values(builtInThemes), ...listUserThemes()];\n}\n\n/* ═══════════════════════════ User-theme storage ═══════════════════════════\n Minimal CRUD against localStorage for phase 2. Phase 4 will expand on\n this (export/import/URL sharing). Keyed under a single storage slot that\n holds { [id]: ThemeInput }.\n ─────────────────────────────────────────────────────────────────────── */\n\nconst USER_THEMES_KEY = \"ramp-user-themes\";\n\nfunction readUserThemeStore(): Record<string, ThemeInput> {\n if (typeof localStorage === \"undefined\") return {};\n try {\n const raw = localStorage.getItem(USER_THEMES_KEY);\n if (!raw) return {};\n const parsed = JSON.parse(raw);\n if (parsed && typeof parsed === \"object\") return parsed as Record<string, ThemeInput>;\n return {};\n } catch {\n return {};\n }\n}\n\nfunction writeUserThemeStore(store: Record<string, ThemeInput>): void {\n if (typeof localStorage === \"undefined\") return;\n try {\n localStorage.setItem(USER_THEMES_KEY, JSON.stringify(store));\n } catch {\n // Quota exceeded or storage disabled — silent fallback.\n }\n}\n\n/** Return every user-saved theme (generated from the stored inputs). */\nexport function listUserThemes(): GeneratedTheme[] {\n return Object.values(readUserThemeStore()).map(generateTheme);\n}\n\n/** Load a single user theme's input by id, if present. */\nexport function loadUserThemeInput(id: string): ThemeInput | undefined {\n return readUserThemeStore()[id];\n}\n\n/** Save (create or replace) a user theme. */\nexport function saveUserTheme(input: ThemeInput): GeneratedTheme {\n const store = readUserThemeStore();\n store[input.id] = input;\n writeUserThemeStore(store);\n return generateTheme(input);\n}\n\n/** Remove a user theme. Built-in ids are ignored. */\nexport function deleteUserTheme(id: string): void {\n if (id in builtInThemes) return;\n const store = readUserThemeStore();\n delete store[id];\n writeUserThemeStore(store);\n}\n\n/** Duplicate an existing theme (built-in or user) as a new user theme. */\nexport function duplicateTheme(sourceId: string, newId: string, newName: string): ThemeInput | undefined {\n const source = builtInThemes[sourceId]?.input ?? loadUserThemeInput(sourceId);\n if (!source) return undefined;\n const copy: ThemeInput = { ...source, id: newId, name: newName };\n saveUserTheme(copy);\n return copy;\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport {\n applyThemeToRoot,\n builtInThemes,\n defaultThemeId,\n getTheme,\n listThemes,\n saveUserTheme,\n deleteUserTheme,\n type GeneratedTheme,\n type ModeName,\n type ThemeInput,\n} from \"@/lib/themes\";\n\n/**\n * Runtime theme + mode provider.\n *\n * Owns the active theme id and brightness mode directly — no dependency on\n * next-themes any more. Writes CSS variables to :root on every change,\n * persists the selection to localStorage, and toggles the `.dark` class on\n * <html> so any Tailwind `dark:` utilities still scoped to the old two-mode\n * model continue to work.\n *\n * First-paint behaviour is driven by the inline pre-hydration script in\n * app/layout.tsx (see GRADE_PRE_HYDRATION_SCRIPT below), which reads\n * localStorage + prefers-color-scheme before React hydrates.\n */\n\nconst STORAGE_THEME_KEY = \"ramp-theme\";\nconst STORAGE_MODE_KEY = \"ramp-mode\";\n\nexport const ALL_MODES: ModeName[] = [\n \"superLight\",\n \"light\",\n \"dark\",\n \"superDark\",\n];\n\nconst DARK_MODES: ReadonlySet<ModeName> = new Set([\"dark\", \"superDark\"]);\n\n/**\n * Inline script body (no React, no imports) that runs in <head> before\n * hydration. Applies the `.dark` class and `data-mode` attribute so the\n * initial paint matches the stored mode / system preference — prevents\n * the classic dark-mode FOUC.\n *\n * NOTE: this string is embedded directly into the <head> via\n * dangerouslySetInnerHTML. Keep it self-contained and dependency-free.\n */\nexport const GRADE_PRE_HYDRATION_SCRIPT = `\n(function() {\n try {\n var mode = localStorage.getItem('${STORAGE_MODE_KEY}');\n var valid = ['superLight','light','dark','superDark'];\n if (!mode || valid.indexOf(mode) === -1) {\n mode = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n if (mode === 'dark' || mode === 'superDark') {\n document.documentElement.classList.add('dark');\n }\n document.documentElement.setAttribute('data-mode', mode);\n var themeId = localStorage.getItem('${STORAGE_THEME_KEY}');\n if (themeId) document.documentElement.setAttribute('data-ramp-theme', themeId);\n } catch(e) {}\n})();\n`;\n\ntype GradeThemeContextValue = {\n /** The currently active theme object. */\n theme: GeneratedTheme;\n /** The active theme's id. */\n themeId: string;\n /** Active brightness mode. */\n mode: ModeName;\n /** True if the active mode is dark or super-dark. Convenience for\n * components that only care about a binary light/dark split. */\n isDark: boolean;\n /** Switch active theme by id (built-in or user). Persists. */\n setThemeId: (id: string) => void;\n /** Switch active brightness mode. Persists. */\n setMode: (mode: ModeName) => void;\n /** Every theme visible in the switcher (built-ins + user themes). */\n themes: GeneratedTheme[];\n /** Save (create/replace) a user theme and switch to it. */\n saveAndActivate: (input: ThemeInput) => void;\n /** Delete a user theme (built-ins are no-ops). Falls back to default if active. */\n deleteTheme: (id: string) => void;\n /** Refresh the themes list (call after external user-theme mutations). */\n refresh: () => void;\n};\n\nconst GradeThemeContext = React.createContext<GradeThemeContextValue | null>(null);\n\nexport interface GradeThemeProviderProps {\n children: React.ReactNode;\n defaultTheme?: string;\n defaultMode?: ModeName;\n}\n\nexport function GradeThemeProvider({\n children,\n defaultTheme = defaultThemeId,\n defaultMode = \"light\",\n}: GradeThemeProviderProps) {\n // SSR-safe defaults; the real values come from localStorage on mount.\n const [themeId, setThemeIdState] = React.useState<string>(defaultTheme);\n const [mode, setModeState] = React.useState<ModeName>(defaultMode);\n const [revision, setRevision] = React.useState(0);\n\n // Hydrate from localStorage on mount. The pre-hydration script already\n // applied the correct .dark class, so there's no visible flicker here.\n React.useEffect(() => {\n try {\n const storedTheme = localStorage.getItem(STORAGE_THEME_KEY);\n if (storedTheme && getTheme(storedTheme)) {\n setThemeIdState(storedTheme);\n }\n const storedMode = localStorage.getItem(STORAGE_MODE_KEY) as ModeName | null;\n if (storedMode && ALL_MODES.includes(storedMode)) {\n setModeState(storedMode);\n } else if (typeof window !== \"undefined\") {\n // No stored mode — follow system preference for the light/dark split.\n const prefersDark = window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n setModeState(prefersDark ? \"dark\" : \"light\");\n }\n } catch {\n /* storage may be disabled */\n }\n }, []);\n\n // Apply the resolved theme whenever anything changes.\n React.useEffect(() => {\n const theme = getTheme(themeId) ?? getTheme(defaultThemeId);\n if (!theme) return;\n applyThemeToRoot(theme, mode);\n if (typeof document !== \"undefined\") {\n document.documentElement.classList.toggle(\"dark\", DARK_MODES.has(mode));\n }\n }, [themeId, mode, revision]);\n\n // Watch the system preference — if the user hasn't explicitly picked a\n // mode yet (nothing in localStorage), follow OS changes live.\n React.useEffect(() => {\n if (typeof window === \"undefined\") return;\n const mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const listener = (e: MediaQueryListEvent) => {\n try {\n if (localStorage.getItem(STORAGE_MODE_KEY)) return; // user-chosen, skip\n } catch {\n return;\n }\n setModeState(e.matches ? \"dark\" : \"light\");\n };\n mq.addEventListener(\"change\", listener);\n return () => mq.removeEventListener(\"change\", listener);\n }, []);\n\n const setThemeId = React.useCallback((id: string) => {\n setThemeIdState(id);\n try {\n localStorage.setItem(STORAGE_THEME_KEY, id);\n } catch {}\n }, []);\n\n const setMode = React.useCallback((next: ModeName) => {\n setModeState(next);\n try {\n localStorage.setItem(STORAGE_MODE_KEY, next);\n } catch {}\n }, []);\n\n const saveAndActivate = React.useCallback((input: ThemeInput) => {\n saveUserTheme(input);\n setRevision((r) => r + 1);\n setThemeId(input.id);\n }, [setThemeId]);\n\n const deleteTheme = React.useCallback((id: string) => {\n if (id in builtInThemes) return;\n deleteUserTheme(id);\n setRevision((r) => r + 1);\n setThemeIdState((current) => (current === id ? defaultThemeId : current));\n }, []);\n\n const refresh = React.useCallback(() => {\n setRevision((r) => r + 1);\n }, []);\n\n const value = React.useMemo<GradeThemeContextValue>(() => {\n const theme = getTheme(themeId) ?? getTheme(defaultThemeId)!;\n return {\n theme,\n themeId: theme.id,\n mode,\n isDark: DARK_MODES.has(mode),\n setThemeId,\n setMode,\n themes: listThemes(),\n saveAndActivate,\n deleteTheme,\n refresh,\n };\n }, [themeId, mode, revision, setThemeId, setMode, saveAndActivate, deleteTheme, refresh]);\n\n return (\n <GradeThemeContext.Provider value={value}>\n {children}\n </GradeThemeContext.Provider>\n );\n}\n\n/** Read the active theme + mode. Must be used inside <GradeThemeProvider>. */\nexport function useGradeTheme(): GradeThemeContextValue {\n const ctx = React.useContext(GradeThemeContext);\n if (!ctx) {\n throw new Error(\n \"useGradeTheme must be used inside <GradeThemeProvider>. Wrap your app (typically in app/layout.tsx).\"\n );\n }\n return ctx;\n}\n\n/** Safe variant — returns null outside a provider instead of throwing. */\nexport function useMaybeGradeTheme(): GradeThemeContextValue | null {\n return React.useContext(GradeThemeContext);\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Palette, Check, Trash2, Download } from \"lucide-react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@/components/ui/popover\";\nimport { useMaybeGradeTheme } from \"@/components/grade-theme-provider\";\nimport { cn } from \"@/lib/utils\";\nimport { builtInThemes, downloadThemeMarkdown } from \"@/lib/themes\";\n\n/**\n * Theme switcher — iterates every registered theme (built-in + user) and\n * lets you pick one. User themes get a delete button on hover.\n *\n * Renders nothing when no <GradeThemeProvider> is mounted, so it's safe to\n * drop into any layout.\n */\nexport function GradeThemeSwitcher({ className }: { className?: string }) {\n const ctx = useMaybeGradeTheme();\n if (!ctx) return null;\n\n const { theme, themes, setThemeId, deleteTheme } = ctx;\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\"gap-2\", className)}\n aria-label=\"Switch theme\"\n >\n <Palette className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">{theme.name}</span>\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-80 p-2\" align=\"end\">\n <div className=\"flex items-start justify-between gap-2 px-2 py-1.5 mb-1\">\n <div>\n <div className=\"text-xs font-medium text-muted-foreground\">Theme</div>\n <div className=\"text-xs text-muted-foreground/80\">\n Switch the skin applied site-wide.\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => downloadThemeMarkdown(theme)}\n className=\"flex items-center gap-1 rounded-md border border-border px-2 py-1 text-[10px] font-medium text-muted-foreground hover:bg-muted hover:text-foreground transition-colors\"\n title=\"Download the active theme as a markdown spec — paste into a fresh LLM prompt\"\n >\n <Download className=\"h-3 w-3\" />\n .md\n </button>\n </div>\n <div className=\"flex flex-col gap-0.5\">\n {themes.map((t) => {\n const active = t.id === theme.id;\n const isBuiltIn = t.id in builtInThemes;\n // Swatch previews the three ramps at step 500 — primary, accent, neutral.\n const primary500 = t.ramps.primary[500];\n const accent500 = t.ramps.accent[500];\n const neutral500 = t.ramps.neutral[500];\n return (\n <div\n key={t.id}\n className={cn(\n // Subtle muted hover, no accent-color tint — avoids the\n // problem where a strongly tinted background strands the\n // muted-foreground description text inside as grey-on-tint.\n \"group flex items-start gap-3 rounded-md px-2 py-2 text-left transition-colors\",\n \"hover:bg-muted\",\n active && \"bg-muted\"\n )}\n >\n <button\n type=\"button\"\n onClick={() => setThemeId(t.id)}\n className=\"flex items-start gap-3 flex-1 min-w-0 text-left\"\n >\n {/* 3-stop swatch: primary, accent, neutral (at step 500) */}\n <div className=\"mt-0.5 flex shrink-0 overflow-hidden rounded-md border border-border\">\n <div\n className=\"h-5 w-2.5\"\n style={{ background: `oklch(${primary500})` }}\n aria-hidden\n />\n <div\n className=\"h-5 w-2.5\"\n style={{ background: `oklch(${accent500})` }}\n aria-hidden\n />\n <div\n className=\"h-5 w-2.5\"\n style={{ background: `oklch(${neutral500})` }}\n aria-hidden\n />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium truncate text-foreground\">\n {t.name}\n </span>\n {t.tagline && (\n <span className=\"text-[10px] uppercase tracking-wide text-muted-foreground shrink-0\">\n {t.tagline}\n </span>\n )}\n </div>\n {t.description && (\n <div className=\"text-xs text-muted-foreground line-clamp-2\">\n {t.description}\n </div>\n )}\n </div>\n </button>\n {active && (\n <Check className=\"mt-2 h-4 w-4 shrink-0 text-primary\" />\n )}\n {!isBuiltIn && !active && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n deleteTheme(t.id);\n }}\n className=\"mt-1 opacity-0 group-hover:opacity-100 transition-opacity rounded p-1 hover:bg-destructive/10 hover:text-destructive\"\n aria-label={`Delete theme ${t.name}`}\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </div>\n );\n })}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Sun, SunDim, Moon, MoonStar } from \"lucide-react\";\n\nimport { useMaybeGradeTheme } from \"@/components/grade-theme-provider\";\nimport { cn } from \"@/lib/utils\";\nimport type { ModeName } from \"@/lib/themes\";\n\n/**\n * 4-way mode switcher. Segmented control: super-light / light / dark / super-dark.\n *\n * Renders nothing without a GradeThemeProvider. Default layout is a compact\n * 4-icon row suitable for a header; the `variant=\"labeled\"` form adds\n * text labels for settings pages.\n */\nexport interface GradeModeSwitcherProps {\n className?: string;\n variant?: \"icons\" | \"labeled\";\n}\n\nconst MODES: Array<{\n mode: ModeName;\n label: string;\n icon: React.ComponentType<{ className?: string }>;\n tooltip: string;\n}> = [\n { mode: \"superLight\", label: \"Super light\", icon: SunDim, tooltip: \"Super light — airy, low contrast\" },\n { mode: \"light\", label: \"Light\", icon: Sun, tooltip: \"Light\" },\n { mode: \"dark\", label: \"Dark\", icon: Moon, tooltip: \"Dark\" },\n { mode: \"superDark\", label: \"Super dark\", icon: MoonStar, tooltip: \"Super dark — OLED, high contrast\" },\n];\n\nexport function GradeModeSwitcher({ className, variant = \"icons\" }: GradeModeSwitcherProps) {\n const ctx = useMaybeGradeTheme();\n if (!ctx) return null;\n const { mode, setMode } = ctx;\n\n if (variant === \"labeled\") {\n return (\n <div\n role=\"radiogroup\"\n aria-label=\"Brightness mode\"\n className={cn(\n \"inline-flex flex-wrap gap-1 rounded-md border border-border bg-background p-1\",\n className\n )}\n >\n {MODES.map(({ mode: m, label, icon: Icon }) => {\n const active = mode === m;\n return (\n <button\n key={m}\n type=\"button\"\n role=\"radio\"\n aria-checked={active}\n onClick={() => setMode(m)}\n className={cn(\n \"flex items-center gap-2 rounded px-3 py-1.5 text-sm transition-colors\",\n active\n ? \"bg-primary text-primary-foreground\"\n : \"hover:bg-accent hover:text-accent-foreground\"\n )}\n >\n <Icon className=\"h-4 w-4\" />\n <span>{label}</span>\n </button>\n );\n })}\n </div>\n );\n }\n\n return (\n <div\n role=\"radiogroup\"\n aria-label=\"Brightness mode\"\n className={cn(\n \"inline-flex items-center gap-0.5 rounded-md border border-border bg-background p-0.5\",\n className\n )}\n >\n {MODES.map(({ mode: m, icon: Icon, tooltip }) => {\n const active = mode === m;\n return (\n <button\n key={m}\n type=\"button\"\n role=\"radio\"\n aria-checked={active}\n aria-label={tooltip}\n title={tooltip}\n onClick={() => setMode(m)}\n className={cn(\n \"flex h-7 w-7 items-center justify-center rounded transition-colors\",\n active\n ? \"bg-primary text-primary-foreground\"\n : \"text-muted-foreground hover:bg-accent hover:text-accent-foreground\"\n )}\n >\n <Icon className=\"h-3.5 w-3.5\" />\n </button>\n );\n })}\n </div>\n );\n}\n","\"use client\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Sun, Moon } from \"lucide-react\";\nimport { useGradeTheme } from \"@/components/grade-theme-provider\";\n\n/**\n * Binary light/dark toggle — flips between `light` and `dark` modes.\n * For the full 4-way picker (including super-light / super-dark), use\n * <GradeModeSwitcher /> instead.\n */\nexport function ThemeToggle() {\n const { isDark, setMode } = useGradeTheme();\n return (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setMode(isDark ? \"light\" : \"dark\")}\n className=\"gap-2\"\n aria-label={isDark ? \"Switch to light mode\" : \"Switch to dark mode\"}\n >\n {isDark ? (\n <>\n <Sun className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">Light</span>\n </>\n ) : (\n <>\n <Moon className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">Dark</span>\n </>\n )}\n </Button>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../lib/utils.ts","../components/ui/accordion.tsx","../components/ui/alert.tsx","../components/ui/app-shell.tsx","../components/ui/avatar.tsx","../components/ui/badge.tsx","../components/ui/button.tsx","../components/ui/calendar.tsx","../components/ui/card.tsx","../components/ui/checkbox.tsx","../components/ui/popover.tsx","../components/ui/date-picker.tsx","../components/ui/dialog.tsx","../components/ui/dropdown-menu.tsx","../components/ui/input.tsx","../components/ui/label.tsx","../components/ui/progress.tsx","../components/ui/radio-group.tsx","../components/ui/row.tsx","../components/ui/grid.tsx","../components/ui/flex.tsx","../components/ui/scroll-area.tsx","../components/ui/select.tsx","../components/ui/separator.tsx","../components/ui/sheet.tsx","../components/ui/skeleton.tsx","../components/ui/slider.tsx","../components/ui/stack.tsx","../components/ui/switch.tsx","../components/ui/table.tsx","../components/ui/tabs.tsx","../components/ui/textarea.tsx","../components/ui/tooltip.tsx","../components/ui/side-menu.tsx","../components/ui/top-menu.tsx","../components/ui/simple-tabs.tsx","../components/ui/media-surface.tsx","../components/ui/video-player.tsx","../components/ui/rive-player.tsx","../lib/three/post-composer.ts","../lib/three/scenes/space.ts","../lib/three/scenes/plasma.ts","../lib/three/scenes/voronoi.ts","../lib/three/scenes/synthwave.ts","../lib/three/shader-presets.ts","../lib/three/post-presets.ts","../lib/three/custom-fragment.ts","../components/ui/three-scene.tsx","../components/ui/shader-preset-preview.tsx","../components/ui/shader-preset-picker.tsx","../components/lenis-provider.tsx","../lib/themes/oklch.ts","../lib/themes/types.ts","../lib/themes/generator.ts","../lib/themes/inputs.ts","../lib/themes/apply.ts","../lib/themes/oklch-to-hex.ts","../lib/themes/export-md.ts","../lib/themes/index.ts","../components/grade-theme-provider.tsx","../components/grade-theme-switcher.tsx","../components/grade-mode-switcher.tsx","../components/theme-toggle.tsx"],"names":["cn","inputs","twMerge","clsx","Accordion","AccordionItem","se","className","props","ref","AccordionTrigger","children","ChevronDown","AccordionContent","alertVariants","cva","Alert","be","variant","AlertTitle","AlertDescription","shellVariants","navVariants","mainVariants","AppShell","xe","nav","asChild","Slot","AppShellNav","placement","sticky","AppShellMain","maxWidth","Avatar","Re","AvatarImage","AvatarFallback","badgeVariants","Badge","rounded","Vr","buttonVariants","Button","mt","size","Calendar","classNames","showOutsideDays","captionLayout","buttonVariant","formatters","components","defaultClassNames","getDefaultClassNames","re","DayPicker","date","rootRef","orientation","ChevronLeftIcon","ChevronRightIcon","ChevronDownIcon","CalendarDayButton","day","modifiers","Card","Q","CardHeader","CardTitle","CardDescription","CardContent","CardFooter","Checkbox","Ae","Check","Popover","PopoverTrigger","PopoverAnchor","PopoverContent","We","align","sideOffset","DEFAULT_FORMAT","RANGE_FORMAT","DatePicker","value","onChange","placeholder","disabled","contentClassName","side","format","icon","ariaLabel","B","CalendarIcon","formatDate","DateRangePicker","numberOfMonths","hasFrom","Dialog","DialogTrigger","DialogPortal","DialogClose","DialogOverlay","K","DialogContent","X","DialogHeader","DialogFooter","DialogTitle","DialogDescription","DropdownMenu","DropdownMenuTrigger","DropdownMenuGroup","DropdownMenuPortal","DropdownMenuSub","DropdownMenuRadioGroup","DropdownMenuSubTrigger","k","inset","ChevronRight","DropdownMenuSubContent","DropdownMenuContent","DropdownMenuItem","DropdownMenuCheckboxItem","checked","DropdownMenuRadioItem","Circle","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuShortcut","Input","gt","type","labelVariants","Label","ht","Progress","je","RadioGroup","Te","RadioGroupItem","rowVariants","Row","yt","gap","justify","wrap","gridVariants","Grid","vt","cols","flexVariants","Flex","bt","direction","ScrollArea","me","ScrollBar","Select","SelectGroup","SelectValue","SelectTrigger","S","SelectScrollUpButton","ChevronUp","SelectScrollDownButton","SelectContent","position","SelectLabel","SelectItem","SelectSeparator","Separator","xt","decorative","Sheet","O","SheetTrigger","SheetClose","SheetPortal","SheetOverlay","z","sheetVariants","SheetContent","SheetHeader","SheetFooter","SheetTitle","SheetDescription","Skeleton","Slider","He","stackVariants","Stack","Rt","Switch","Ye","Table","V","TableHeader","TableBody","TableFooter","TableRow","TableHead","TableCell","TableCaption","Tabs","TabsList","Pe","TabsTrigger","TabsContent","Textarea","Tt","TooltipProvider","Tooltip","TooltipTrigger","TooltipContent","Ze","SideMenuContext","useSideMenu","context","DefaultLink","href","SideMenu","header","collapsedHeader","sections","items","footer","controlledCollapsed","onCollapsedChange","collapsible","defaultCollapsed","activeItem","LinkComponent","internalCollapsed","setInternalCollapsed","collapsed","handleToggle","newCollapsed","ChevronLeft","item","SideMenuItemComponent","section","SideMenuSectionComponent","expanded","setExpanded","nested","isActive","itemClasses","content","element","b","TopMenu","breadcrumbs","showMobileMenu","onMobileMenuClick","leftContent","rightContent","Menu","crumb","index","TopMenuUser","name","email","avatarUrl","avatarContent","avatarClassName","open","setOpen","menuRef","handleClickOutside","event","TopMenuUserItem","onClick","TopMenuUserSection","SimpleTabsContext","P","useSimpleTabs","SimpleTabs","tabs","controlledActiveTab","defaultTab","onTabChange","tabsClassName","internalActiveTab","setInternalActiveTab","activeTab","handleTabChange","tabId","tab","SimpleTabsPanel","id","SimpleTabsRoot","SimpleTabsList","SimpleTabsTrigger","setActiveTab","SimpleTabsContent","aspectClass","radiusVar","MediaSurface","ee","aspect","radius","border","loading","onVisibilityChange","fallback","style","innerRef","el","io","entry","usePrefersReducedMotion","reduced","setReduced","mql","handler","e","VideoPlayer","W","src","controls","autoPlay","loop","muted","pauseOffscreen","poster","label","playbackRate","objectFit","videoRef","posterVisible","setPosterVisible","effectiveMuted","effectiveAutoPlay","handleVisibilityChange","visible","RivePlayer","H","stateMachines","artboard","fit","stateMachineInputs","Mod","setMod","error","setError","cancelled","m","RiveInner","useRive","Layout","Fit","Alignment","EventType","fitMap","rive","RiveComponent","playing","setPlaying","target","togglePlay","Pause","Play","createPostComposer","renderer","scene","camera","preset","width","height","composer","EffectComposer","RenderPass","bloom","BloomEffect","KernelSize","noise","NoiseEffect","BlendFunction","scanlines","ScanlineEffect","vignette","VignetteEffect","chromatic","ChromaticAberrationEffect","tr","glitch","GlitchEffect","EffectPass","applyPreset","p","chromaOffset","w","h","STAR_COUNT","FIELD_DEPTH","FIELD_RADIUS","spaceScene","palette","positions","colors","zOffsets","primaryColor","accentColor","resetStar","i","randomZ","theta","r","x","y","geometry","material","stars","SPEED","STREAK_LEN","_elapsed","delta","pos","baseIdx","cam","primary","accent","col","FRAGMENT","VERTEX","plasmaScene","j","uniforms","quad","elapsed","voronoiScene","q","synthwaveScene","Z","sceneRegistry","shaderPresets","shaderPresetById","postPresets","defaultPostPreset","FRAGMENT_HEADER","VERTEX_FULLSCREEN","ShaderCompileError","log","source","precompileFragment","gl","shader","ok","buildFragmentShaderScene","userFragment","combined","U","DEFAULT_PALETTE","OKLCH_TRIPLET","HSL_TRIPLET","VAR_REF","resolveCssColor","input","host","effectiveInput","varRef","raw","probe","computed","canvas","ctx","g","resolvePalette","ThreeScene","G","fragmentShader","onShaderError","postPreset","paletteProp","createSceneProp","maxDpr","hostRef","ready","setReady","resolvedFactory","resolvedPostPresetId","livePalette","Se","dpr","handle","err","postPresetObj","post","clock","rafId","running","tick","ro","themeObserver","next","sceneWithMouse","onPointerMove","ev","rect","liveRef","node","ShaderPresetPreview","oe","live","hideLabel","hovered","setHovered","shouldRender","ShaderPresetPicker","filterTags","columns","presets","Ce","t","selected","LenisProvider","lenisRef","useRef","useEffect","lenis","Lenis","raf","time","RAMP_KEYS","LIGHTNESS_CURVE","CHROMA_CURVE","hueToRamp","hue","chromaScale","normalizedHue","ramp","L","C","neutralRamp","FIXED_SEMANTIC","PURE_WHITE","PURE_BLACK","deriveAlertPair","base","mode","c","v","chroma","softC","deepL","deepC","softL","FONTS","ALL_MODES","INTENSITY_MULTIPLIER","buildChartPalette","hues","intensity","pC","aC","dC","norm","n","step","a","PURE","MODE_TOKENS","resolveToken","ramps","deriveColorsForMode","map","isLightBg","fixed","alertMode","s","hi","BASE_SCALE","SCALE_MULTIPLIER","resolveTypography","mult","rem","RADIUS_BASE","resolveRadius","DENSITY_FACTOR","resolveSpacing","SHADOW_PRESETS","resolveEffects","scale","ms","generateTheme","pureGray","neutralChroma","primaryChroma","accentChroma","neutral","chart","typography","spacing","effects","calmInput","energyInput","BUILT_IN_INPUTS","colorVars","themeToCSSVars","theme","flattenRamp","out","applyThemeToRoot","root","vars","key","oklchToHex","triplet","rgb","match","rowTriplet","parts","l","oklch","hex","rampTable","lines","semanticTable","rows","lightHex","darkHex","stringifyInput","generateThemeMarkdown","mapToken","token","USAGE_HINTS","hueDerived","fixedSemantic","chartRows","feelNotes","notes","displayFont","downloadThemeMarkdown","blob","url","builtInThemes","defaultThemeId","getTheme","userInput","loadUserThemeInput","listThemes","listUserThemes","USER_THEMES_KEY","readUserThemeStore","parsed","writeUserThemeStore","store","saveUserTheme","deleteUserTheme","duplicateTheme","sourceId","newId","newName","copy","STORAGE_THEME_KEY","STORAGE_MODE_KEY","DARK_MODES","GRADE_PRE_HYDRATION_SCRIPT","GradeThemeContext","GradeThemeProvider","defaultTheme","defaultMode","themeId","setThemeIdState","setModeState","revision","setRevision","storedTheme","storedMode","prefersDark","mq","listener","setThemeId","setMode","saveAndActivate","deleteTheme","current","refresh","useGradeTheme","useMaybeGradeTheme","GradeThemeSwitcher","themes","Palette","Download","active","isBuiltIn","primary500","accent500","neutral500","Trash2","MODES","SunDim","Sun","Moon","MoonStar","GradeModeSwitcher","Me","Icon","tooltip","ThemeToggle","isDark"],"mappings":"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","file":"index.mjs","sourcesContent":["import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as AccordionPrimitive from \"@radix-ui/react-accordion\";\nimport { ChevronDown } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\n\nconst Accordion = AccordionPrimitive.Root;\n\nconst AccordionItem = React.forwardRef<\n React.ComponentRef<typeof AccordionPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <AccordionPrimitive.Item\n ref={ref}\n className={cn(\"border-b\", className)}\n {...props}\n />\n));\nAccordionItem.displayName = \"AccordionItem\";\n\nconst AccordionTrigger = React.forwardRef<\n React.ComponentRef<typeof AccordionPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronDown className=\"h-4 w-4 shrink-0 transition-transform duration-200\" />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n));\nAccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;\n\nconst AccordionContent = React.forwardRef<\n React.ComponentRef<typeof AccordionPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <AccordionPrimitive.Content\n ref={ref}\n className=\"overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\"\n {...props}\n >\n <div className={cn(\"pb-4 pt-0\", className)}>{children}</div>\n </AccordionPrimitive.Content>\n));\nAccordionContent.displayName = AccordionPrimitive.Content.displayName;\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent };\n","import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"@/lib/utils\";\n\nconst alertVariants = cva(\n // Each variant uses the theme's semantic tokens instead of hard-coded\n // rds-* classes. Status variants reference dedicated `*-soft` (surface)\n // and `*-deep` (text + icon) tokens — those are generated from the status\n // colour by the theme pipeline, so tweaking the brand feel only requires\n // changing the mapping in one place (lib/themes/oklch.ts).\n \"relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4\",\n {\n variants: {\n variant: {\n default: \"bg-background text-foreground [&>svg]:text-foreground\",\n destructive:\n \"border-destructive/30 bg-destructive-soft text-destructive-deep [&>svg]:text-destructive-deep\",\n success:\n \"border-success/30 bg-success-soft text-success-deep [&>svg]:text-success-deep\",\n warning:\n \"border-warning/30 bg-warning-soft text-warning-deep [&>svg]:text-warning-deep\",\n info:\n \"border-info/30 bg-info-soft text-info-deep [&>svg]:text-info-deep\",\n highlight:\n // Highlight is yellow — direct yellow text is unreadable, so text\n // stays on `--foreground`; the icon picks up the deepened shade.\n \"border-highlight/30 bg-highlight-soft text-foreground [&>svg]:text-highlight-deep\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n);\n\nconst Alert = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>\n>(({ className, variant, ...props }, ref) => (\n <div\n ref={ref}\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n));\nAlert.displayName = \"Alert\";\n\nconst AlertTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h5\n ref={ref}\n className={cn(\"mb-1 font-medium leading-none tracking-tight\", className)}\n {...props}\n />\n));\nAlertTitle.displayName = \"AlertTitle\";\n\nconst AlertDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"text-sm [&_p]:leading-relaxed\", className)}\n {...props}\n />\n));\nAlertDescription.displayName = \"AlertDescription\";\n\nexport { Alert, AlertTitle, AlertDescription };\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\n\n/**\n * AppShell — top-level page scaffold for an app-like layout.\n *\n * The Studio was missing a named \"app layout\" primitive — without one,\n * agent-generated pages either freestyle grids or reinvent the nav-plus-\n * content structure every time. AppShell gives them one component with a\n * small, bounded set of layout variants so vibe-coded prototypes land in a\n * recognisable shape: a nav region (top, side, or none) plus a main region\n * that optionally constrains its content width.\n *\n * It is deliberately *just* structure: no collapse state, no context, no\n * runtime JS. Nav content is whatever the caller drops in — a SideMenu,\n * a TopMenu, or a hand-rolled `<nav>`. Keeping it dumb means it renders\n * fine on the server and can be styled by consumers without fighting a\n * behaviour model.\n *\n * Variants:\n * - `nav` — \"none\" | \"top\" | \"side\". Chooses the grid structure.\n * - `maxWidth` — \"full\" | \"container\". Caps the main region width for\n * marketing-style pages without the caller having to wrap\n * their content in a max-w-* div.\n * - `sticky` — boolean. Sticks top nav to the viewport top / side nav\n * to the viewport when the page scrolls. Sensible default\n * for app chrome.\n */\nconst shellVariants = cva(\"rds-app-shell min-h-screen w-full bg-background text-foreground\", {\n variants: {\n nav: {\n none: \"block\",\n top: \"grid grid-rows-[auto_1fr]\",\n side: \"grid grid-cols-[auto_1fr]\",\n },\n },\n defaultVariants: {\n nav: \"none\",\n },\n});\n\nconst navVariants = cva(\"rds-app-shell-nav\", {\n variants: {\n placement: {\n top: \"border-b bg-background\",\n side: \"border-r bg-background\",\n none: \"hidden\",\n },\n sticky: {\n true: \"\",\n false: \"\",\n },\n },\n compoundVariants: [\n {\n placement: \"top\",\n sticky: true,\n className: \"sticky top-0 z-30\",\n },\n {\n placement: \"side\",\n sticky: true,\n className: \"sticky top-0 h-screen self-start\",\n },\n ],\n defaultVariants: {\n placement: \"top\",\n sticky: true,\n },\n});\n\nconst mainVariants = cva(\"rds-app-shell-main min-w-0\", {\n variants: {\n maxWidth: {\n full: \"w-full\",\n container: \"w-full mx-auto max-w-7xl px-4 md:px-6 lg:px-8\",\n },\n },\n defaultVariants: {\n maxWidth: \"full\",\n },\n});\n\n// ---------- AppShell root ----------\n\nexport interface AppShellProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof shellVariants> {\n /** Render as the single child element via Radix Slot — lets you stamp the\n * shell layout onto an existing root tag without an extra wrapper. */\n asChild?: boolean;\n}\n\nconst AppShell = React.forwardRef<HTMLDivElement, AppShellProps>(\n ({ className, nav, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"div\";\n return (\n <Comp\n ref={ref}\n data-gds-part=\"app-shell\"\n data-nav={nav ?? \"none\"}\n className={cn(shellVariants({ nav, className }))}\n {...props}\n />\n );\n }\n);\nAppShell.displayName = \"AppShell\";\n\n// ---------- Nav slot ----------\n\nexport interface AppShellNavProps\n extends React.HTMLAttributes<HTMLElement>,\n VariantProps<typeof navVariants> {\n asChild?: boolean;\n}\n\nconst AppShellNav = React.forwardRef<HTMLElement, AppShellNavProps>(\n ({ className, placement, sticky, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"nav\";\n return (\n <Comp\n ref={ref as React.Ref<HTMLElement>}\n data-gds-part=\"app-shell-nav\"\n data-placement={placement ?? \"top\"}\n className={cn(navVariants({ placement, sticky, className }))}\n {...props}\n />\n );\n }\n);\nAppShellNav.displayName = \"AppShellNav\";\n\n// ---------- Main slot ----------\n\nexport interface AppShellMainProps\n extends React.HTMLAttributes<HTMLElement>,\n VariantProps<typeof mainVariants> {\n asChild?: boolean;\n}\n\nconst AppShellMain = React.forwardRef<HTMLElement, AppShellMainProps>(\n ({ className, maxWidth, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"main\";\n return (\n <Comp\n ref={ref as React.Ref<HTMLElement>}\n data-gds-part=\"app-shell-main\"\n className={cn(mainVariants({ maxWidth, className }))}\n {...props}\n />\n );\n }\n);\nAppShellMain.displayName = \"AppShellMain\";\n\nexport {\n AppShell,\n AppShellNav,\n AppShellMain,\n shellVariants,\n navVariants,\n mainVariants,\n};\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Avatar = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Root\n ref={ref}\n className={cn(\n \"relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full\",\n className\n )}\n {...props}\n />\n))\nAvatar.displayName = AvatarPrimitive.Root.displayName\n\nconst AvatarImage = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Image>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image\n ref={ref}\n className={cn(\"aspect-square h-full w-full\", className)}\n {...props}\n />\n))\nAvatarImage.displayName = AvatarPrimitive.Image.displayName\n\nconst AvatarFallback = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Fallback>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn(\n \"flex h-full w-full items-center justify-center rounded-full bg-muted\",\n className\n )}\n {...props}\n />\n))\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName\n\nexport { Avatar, AvatarImage, AvatarFallback }\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst badgeVariants = cva(\n \"inline-flex items-center gap-1 border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 [&_svg]:size-3 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n destructive:\n \"border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80\",\n outline: \"text-foreground\",\n // Semantic solid variants\n highlight:\n \"border-transparent bg-rds-yellow-400 text-rds-gray-900 shadow hover:bg-rds-yellow-500\",\n success:\n \"border-transparent bg-rds-green-500 text-rds-gray-900 shadow hover:bg-rds-green-600\",\n warning:\n \"border-transparent bg-orange-500 text-white shadow hover:bg-orange-600\",\n info:\n \"border-transparent bg-blue-500 text-white shadow hover:bg-blue-600\",\n // Semantic soft variants — colored text on tinted background\n \"success-soft\":\n \"border-rds-green-500/20 bg-rds-green-500/10 text-rds-green-600 dark:text-rds-green-400\",\n \"warning-soft\":\n \"border-orange-500/20 bg-orange-500/10 text-orange-600 dark:text-orange-400\",\n \"destructive-soft\":\n \"border-destructive/20 bg-destructive/10 text-destructive dark:text-red-400\",\n \"info-soft\":\n \"border-blue-500/20 bg-blue-500/10 text-blue-600 dark:text-blue-400\",\n \"highlight-soft\":\n \"border-rds-yellow-500/20 bg-rds-yellow-400/10 text-rds-yellow-600 dark:text-rds-yellow-400\",\n // Outline variants - just border and text, no background\n \"success-outline\":\n \"border-rds-green-500/50 bg-transparent text-rds-green-600 dark:text-rds-green-400\",\n \"warning-outline\":\n \"border-orange-500/50 bg-transparent text-orange-600 dark:text-orange-400\",\n \"destructive-outline\":\n \"border-destructive/50 bg-transparent text-destructive dark:text-red-400\",\n \"info-outline\":\n \"border-blue-500/50 bg-transparent text-blue-600 dark:text-blue-400\",\n },\n rounded: {\n default: \"rounded-md\",\n full: \"rounded-full\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n rounded: \"default\",\n },\n }\n)\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, rounded, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant, rounded }), className)} {...props} />\n )\n}\n\nexport { Badge, badgeVariants }\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-md px-8\",\n icon: \"h-9 w-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\"\n return (\n <Comp\n className={cn(\"rds-button\", buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n","\"use client\"\n\nimport * as React from \"react\"\nimport {\n ChevronDownIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n} from \"lucide-react\"\nimport { DayButton, DayPicker, getDefaultClassNames } from \"react-day-picker\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button, buttonVariants } from \"@/components/ui/button\"\n\nfunction Calendar({\n className,\n classNames,\n showOutsideDays = true,\n captionLayout = \"label\",\n buttonVariant = \"ghost\",\n formatters,\n components,\n ...props\n}: React.ComponentProps<typeof DayPicker> & {\n buttonVariant?: React.ComponentProps<typeof Button>[\"variant\"]\n}) {\n const defaultClassNames = getDefaultClassNames()\n\n return (\n <DayPicker\n showOutsideDays={showOutsideDays}\n className={cn(\n \"bg-background group/calendar p-3 [--cell-size:2rem] [[data-slot=card-content]_&]:bg-transparent [[data-slot=popover-content]_&]:bg-transparent\",\n String.raw`rtl:**:[.rdp-button\\_next>svg]:rotate-180`,\n String.raw`rtl:**:[.rdp-button\\_previous>svg]:rotate-180`,\n className\n )}\n captionLayout={captionLayout}\n formatters={{\n formatMonthDropdown: (date) =>\n date.toLocaleString(\"default\", { month: \"short\" }),\n ...formatters,\n }}\n classNames={{\n root: cn(\"w-fit\", defaultClassNames.root),\n months: cn(\n \"relative flex flex-col gap-4 md:flex-row\",\n defaultClassNames.months\n ),\n month: cn(\"flex w-full flex-col gap-4\", defaultClassNames.month),\n nav: cn(\n \"absolute inset-x-0 top-0 flex w-full items-center justify-between gap-1\",\n defaultClassNames.nav\n ),\n button_previous: cn(\n buttonVariants({ variant: buttonVariant }),\n \"h-[--cell-size] w-[--cell-size] select-none p-0 aria-disabled:opacity-50\",\n defaultClassNames.button_previous\n ),\n button_next: cn(\n buttonVariants({ variant: buttonVariant }),\n \"h-[--cell-size] w-[--cell-size] select-none p-0 aria-disabled:opacity-50\",\n defaultClassNames.button_next\n ),\n month_caption: cn(\n \"flex h-[--cell-size] w-full items-center justify-center px-[--cell-size]\",\n defaultClassNames.month_caption\n ),\n dropdowns: cn(\n \"flex h-[--cell-size] w-full items-center justify-center gap-1.5 text-sm font-medium\",\n defaultClassNames.dropdowns\n ),\n dropdown_root: cn(\n \"has-focus:border-ring border-input shadow-xs has-focus:ring-ring/50 has-focus:ring-[3px] relative rounded-md border\",\n defaultClassNames.dropdown_root\n ),\n dropdown: cn(\n \"bg-popover absolute inset-0 opacity-0\",\n defaultClassNames.dropdown\n ),\n caption_label: cn(\n \"select-none font-medium\",\n captionLayout === \"label\"\n ? \"text-sm\"\n : \"[&>svg]:text-muted-foreground flex h-8 items-center gap-1 rounded-md pl-2 pr-1 text-sm [&>svg]:size-3.5\",\n defaultClassNames.caption_label\n ),\n table: \"w-full border-collapse\",\n weekdays: cn(\"flex\", defaultClassNames.weekdays),\n weekday: cn(\n \"text-muted-foreground flex-1 select-none rounded-md text-[0.8rem] font-normal\",\n defaultClassNames.weekday\n ),\n week: cn(\"mt-2 flex w-full\", defaultClassNames.week),\n week_number_header: cn(\n \"w-[--cell-size] select-none\",\n defaultClassNames.week_number_header\n ),\n week_number: cn(\n \"text-muted-foreground select-none text-[0.8rem]\",\n defaultClassNames.week_number\n ),\n day: cn(\n \"group/day relative aspect-square h-full w-full select-none p-0 text-center [&:first-child[data-selected=true]_button]:rounded-l-md [&:last-child[data-selected=true]_button]:rounded-r-md\",\n defaultClassNames.day\n ),\n range_start: cn(\n \"bg-accent rounded-l-md\",\n defaultClassNames.range_start\n ),\n range_middle: cn(\"rounded-none\", defaultClassNames.range_middle),\n range_end: cn(\"bg-accent rounded-r-md\", defaultClassNames.range_end),\n today: cn(\n \"bg-accent text-accent-foreground rounded-md data-[selected=true]:rounded-none\",\n defaultClassNames.today\n ),\n outside: cn(\n \"text-muted-foreground aria-selected:text-muted-foreground\",\n defaultClassNames.outside\n ),\n disabled: cn(\n \"text-muted-foreground opacity-50\",\n defaultClassNames.disabled\n ),\n hidden: cn(\"invisible\", defaultClassNames.hidden),\n ...classNames,\n }}\n components={{\n Root: ({ className, rootRef, ...props }) => {\n return (\n <div\n data-slot=\"calendar\"\n ref={rootRef}\n className={cn(className)}\n {...props}\n />\n )\n },\n Chevron: ({ className, orientation, ...props }) => {\n if (orientation === \"left\") {\n return (\n <ChevronLeftIcon className={cn(\"size-4\", className)} {...props} />\n )\n }\n\n if (orientation === \"right\") {\n return (\n <ChevronRightIcon\n className={cn(\"size-4\", className)}\n {...props}\n />\n )\n }\n\n return (\n <ChevronDownIcon className={cn(\"size-4\", className)} {...props} />\n )\n },\n DayButton: CalendarDayButton,\n WeekNumber: ({ children, ...props }) => {\n return (\n <td {...props}>\n <div className=\"flex size-[--cell-size] items-center justify-center text-center\">\n {children}\n </div>\n </td>\n )\n },\n ...components,\n }}\n {...props}\n />\n )\n}\n\nfunction CalendarDayButton({\n className,\n day,\n modifiers,\n ...props\n}: React.ComponentProps<typeof DayButton>) {\n const defaultClassNames = getDefaultClassNames()\n\n const ref = React.useRef<HTMLButtonElement>(null)\n React.useEffect(() => {\n if (modifiers.focused) ref.current?.focus()\n }, [modifiers.focused])\n\n return (\n <Button\n ref={ref}\n variant=\"ghost\"\n size=\"icon\"\n data-day={`${day.date.getFullYear()}-${String(day.date.getMonth() + 1).padStart(2, \"0\")}-${String(day.date.getDate()).padStart(2, \"0\")}`}\n data-selected-single={\n modifiers.selected &&\n !modifiers.range_start &&\n !modifiers.range_end &&\n !modifiers.range_middle\n }\n data-range-start={modifiers.range_start}\n data-range-end={modifiers.range_end}\n data-range-middle={modifiers.range_middle}\n className={cn(\n \"data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground data-[range-middle=true]:bg-accent data-[range-middle=true]:text-accent-foreground data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground group-data-[focused=true]/day:border-ring group-data-[focused=true]/day:ring-ring/50 flex aspect-square h-auto w-full min-w-[--cell-size] flex-col gap-1 font-normal leading-none data-[range-end=true]:rounded-md data-[range-middle=true]:rounded-none data-[range-start=true]:rounded-md group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:ring-[3px] [&>span]:text-xs [&>span]:opacity-70\",\n defaultClassNames.day,\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Calendar, CalendarDayButton }\n","import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-gds-part=\"card\"\n className={cn(\n \"rds-card rounded-xl border bg-card text-card-foreground shadow\",\n className\n )}\n {...props}\n />\n))\nCard.displayName = \"Card\"\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-gds-part=\"card-header\"\n className={cn(\"flex flex-col space-y-1.5 p-6\", className)}\n {...props}\n />\n))\nCardHeader.displayName = \"CardHeader\"\n\nconst CardTitle = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-gds-part=\"card-title\"\n className={cn(\"font-semibold leading-none tracking-tight\", className)}\n {...props}\n />\n))\nCardTitle.displayName = \"CardTitle\"\n\nconst CardDescription = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-gds-part=\"card-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n))\nCardDescription.displayName = \"CardDescription\"\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-gds-part=\"card-content\"\n className={cn(\"p-6 pt-0\", className)}\n {...props}\n />\n))\nCardContent.displayName = \"CardContent\"\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-gds-part=\"card-footer\"\n className={cn(\"flex items-center p-6 pt-0\", className)}\n {...props}\n />\n))\nCardFooter.displayName = \"CardFooter\"\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\";\nimport { Check } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\n\nconst Checkbox = React.forwardRef<\n React.ComponentRef<typeof CheckboxPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <CheckboxPrimitive.Root\n ref={ref}\n className={cn(\n // Fixed 3px radius so the checkbox always reads as a rounded square —\n // even under \"round\"/\"pill\" themes where rounded-sm would otherwise\n // derive from a large --radius and turn it circular (a radio button\n // look). Override via className if you really want it circular.\n \"rds-checkbox peer h-4 w-4 shrink-0 rounded-[3px] border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground\",\n className\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n className={cn(\"flex items-center justify-center text-current\")}\n >\n <Check className=\"h-4 w-4\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n));\nCheckbox.displayName = CheckboxPrimitive.Root.displayName;\n\nexport { Checkbox };\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Popover = PopoverPrimitive.Root\n\nconst PopoverTrigger = PopoverPrimitive.Trigger\n\nconst PopoverAnchor = PopoverPrimitive.Anchor\n\nconst PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = \"center\", sideOffset = 4, ...props }, ref) => (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-popover-content-transform-origin]\",\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n))\nPopoverContent.displayName = PopoverPrimitive.Content.displayName\n\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor }\n","\"use client\"\n\n/**\n * DatePicker + DateRangePicker\n *\n * Sealed complex components built on top of the Popover + Button + Calendar\n * primitives. Consumers get a single import with a `value` / `onChange`\n * contract — no need to know about Popover, DayPicker, or date-fns.\n *\n * The primitives remain exported from the barrel so anyone who needs a\n * different trigger, different positioning, or a custom layout can still\n * compose their own — see `apps/docs/app/components/date-picker/page.tsx`\n * for the hand-assembled recipe.\n *\n * API:\n * <DatePicker value={date} onChange={setDate} />\n * <DatePicker value={date} onChange={setDate} format=\"PP\" placeholder=\"...\" />\n * <DateRangePicker value={range} onChange={setRange} numberOfMonths={2} />\n *\n * The `value` / `onChange` shape matches react-day-picker's `selected` /\n * `onSelect` internally — we just rename them so consumers speak form.\n */\n\nimport * as React from \"react\"\nimport { format as formatDate } from \"date-fns\"\nimport { CalendarIcon } from \"lucide-react\"\nimport type { DateRange } from \"react-day-picker\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport { Calendar } from \"@/components/ui/calendar\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@/components/ui/popover\"\n\ntype PopoverAlign = \"start\" | \"center\" | \"end\"\ntype PopoverSide = \"top\" | \"right\" | \"bottom\" | \"left\"\n\n// Props shared by both DatePicker and DateRangePicker.\ninterface DatePickerBaseProps {\n /** Placeholder text shown when no date is selected. */\n placeholder?: string\n /** Disable the trigger. */\n disabled?: boolean\n /** Classes on the outer trigger button. */\n className?: string\n /** Classes forwarded to PopoverContent. */\n contentClassName?: string\n /** Forwarded to PopoverContent — which edge to align to. Defaults to \"start\". */\n align?: PopoverAlign\n /** Forwarded to PopoverContent — which side of the trigger to render on. */\n side?: PopoverSide\n /**\n * date-fns format string for the trigger label. Defaults to \"PPP\"\n * (e.g. \"April 19th, 2026\"). Pass \"PP\" for shorter \"Apr 19, 2026\".\n */\n format?: string\n /** Forwarded to the underlying `react-day-picker` Calendar. */\n captionLayout?: React.ComponentProps<typeof Calendar>[\"captionLayout\"]\n /** Icon shown in the trigger. Defaults to lucide's CalendarIcon. */\n icon?: React.ReactNode\n /** Accessible label for screen readers when no date is selected. */\n \"aria-label\"?: string\n}\n\nexport interface DatePickerProps extends DatePickerBaseProps {\n /** The selected date, or undefined when empty. */\n value?: Date\n /** Called when the user selects or clears the date. */\n onChange?: (date: Date | undefined) => void\n}\n\nexport interface DateRangePickerProps extends DatePickerBaseProps {\n /** The selected range, or undefined when empty. */\n value?: DateRange\n /** Called when the user selects or clears the range. */\n onChange?: (range: DateRange | undefined) => void\n /** Number of months to show side-by-side. Defaults to 2. */\n numberOfMonths?: number\n}\n\nconst DEFAULT_FORMAT = \"PPP\"\nconst RANGE_FORMAT = \"LLL dd, y\"\n\nfunction DatePicker({\n value,\n onChange,\n placeholder = \"Pick a date\",\n disabled,\n className,\n contentClassName,\n align = \"start\",\n side,\n format = DEFAULT_FORMAT,\n captionLayout,\n icon,\n \"aria-label\": ariaLabel,\n}: DatePickerProps) {\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={disabled}\n aria-label={ariaLabel ?? (value ? undefined : placeholder)}\n data-empty={!value}\n className={cn(\n \"w-[280px] justify-start text-left font-normal data-[empty=true]:text-muted-foreground\",\n className\n )}\n >\n {icon ?? <CalendarIcon className=\"mr-2 h-4 w-4\" aria-hidden />}\n {value ? formatDate(value, format) : <span>{placeholder}</span>}\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className={cn(\"w-auto p-0\", contentClassName)}\n align={align}\n side={side}\n >\n <Calendar\n mode=\"single\"\n selected={value}\n onSelect={onChange}\n captionLayout={captionLayout}\n initialFocus\n />\n </PopoverContent>\n </Popover>\n )\n}\n\nfunction DateRangePicker({\n value,\n onChange,\n placeholder = \"Pick a date range\",\n disabled,\n className,\n contentClassName,\n align = \"start\",\n side,\n format = RANGE_FORMAT,\n captionLayout,\n icon,\n numberOfMonths = 2,\n \"aria-label\": ariaLabel,\n}: DateRangePickerProps) {\n const hasFrom = !!value?.from\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={disabled}\n aria-label={ariaLabel ?? (hasFrom ? undefined : placeholder)}\n data-empty={!hasFrom}\n className={cn(\n \"w-[300px] justify-start text-left font-normal data-[empty=true]:text-muted-foreground\",\n className\n )}\n >\n {icon ?? <CalendarIcon className=\"mr-2 h-4 w-4\" aria-hidden />}\n {value?.from ? (\n value.to ? (\n <>\n {formatDate(value.from, format)} –{\" \"}\n {formatDate(value.to, format)}\n </>\n ) : (\n formatDate(value.from, format)\n )\n ) : (\n <span>{placeholder}</span>\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className={cn(\"w-auto p-0\", contentClassName)}\n align={align}\n side={side}\n >\n <Calendar\n mode=\"range\"\n selected={value}\n onSelect={onChange}\n defaultMonth={value?.from}\n numberOfMonths={numberOfMonths}\n captionLayout={captionLayout}\n initialFocus\n />\n </PopoverContent>\n </Popover>\n )\n}\n\nexport { DatePicker, DateRangePicker }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Dialog = DialogPrimitive.Root\n\nconst DialogTrigger = DialogPrimitive.Trigger\n\nconst DialogPortal = DialogPrimitive.Portal\n\nconst DialogClose = DialogPrimitive.Close\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n))\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\n className\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n))\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\nconst DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n)\nDialogHeader.displayName = \"DialogHeader\"\n\nconst DialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n)\nDialogFooter.displayName = \"DialogFooter\"\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight\",\n className\n )}\n {...props}\n />\n))\nDialogTitle.displayName = DialogPrimitive.Title.displayName\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n))\nDialogDescription.displayName = DialogPrimitive.Description.displayName\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogTrigger,\n DialogClose,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst DropdownMenu = DropdownMenuPrimitive.Root\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n \"flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto\" />\n </DropdownMenuPrimitive.SubTrigger>\n))\nDropdownMenuSubTrigger.displayName =\n DropdownMenuPrimitive.SubTrigger.displayName\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuSubContent.displayName =\n DropdownMenuPrimitive.SubContent.displayName\n\nconst DropdownMenuContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 max-h-[var(--radix-dropdown-menu-content-available-height)] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]\",\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n))\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\n\nconst DropdownMenuItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&>svg]:size-4 [&>svg]:shrink-0\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n))\nDropdownMenuCheckboxItem.displayName =\n DropdownMenuPrimitive.CheckboxItem.displayName\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n))\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn(\n \"px-2 py-1.5 text-sm font-semibold\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n))\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\n\nconst DropdownMenuShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn(\"ml-auto text-xs tracking-widest opacity-60\", className)}\n {...props}\n />\n )\n}\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\"\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n}\n","import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className\n )}\n ref={ref}\n {...props}\n />\n )\n }\n)\nInput.displayName = \"Input\"\n\nexport { Input }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst labelVariants = cva(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n)\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &\n VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root\n ref={ref}\n className={cn(labelVariants(), className)}\n {...props}\n />\n))\nLabel.displayName = LabelPrimitive.Root.displayName\n\nexport { Label }\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as ProgressPrimitive from \"@radix-ui/react-progress\";\nimport { cn } from \"@/lib/utils\";\n\nconst Progress = React.forwardRef<\n React.ComponentRef<typeof ProgressPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ProgressPrimitive.Root>\n>(({ className, value, ...props }, ref) => (\n <ProgressPrimitive.Root\n ref={ref}\n className={cn(\n \"relative h-4 w-full overflow-hidden rounded-full bg-secondary\",\n className\n )}\n {...props}\n >\n <ProgressPrimitive.Indicator\n className=\"h-full w-full flex-1 bg-primary transition-all\"\n style={{ transform: `translateX(-${100 - (value || 0)}%)` }}\n />\n </ProgressPrimitive.Root>\n));\nProgress.displayName = ProgressPrimitive.Root.displayName;\n\nexport { Progress };\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as RadioGroupPrimitive from \"@radix-ui/react-radio-group\";\nimport { Circle } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\n\nconst RadioGroup = React.forwardRef<\n React.ComponentRef<typeof RadioGroupPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root>\n>(({ className, ...props }, ref) => {\n return (\n <RadioGroupPrimitive.Root\n className={cn(\"grid gap-2\", className)}\n {...props}\n ref={ref}\n />\n );\n});\nRadioGroup.displayName = RadioGroupPrimitive.Root.displayName;\n\nconst RadioGroupItem = React.forwardRef<\n React.ComponentRef<typeof RadioGroupPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item>\n>(({ className, ...props }, ref) => {\n return (\n <RadioGroupPrimitive.Item\n ref={ref}\n className={cn(\n \"aspect-square h-4 w-4 rounded-full border border-primary text-primary ring-offset-background focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n >\n <RadioGroupPrimitive.Indicator className=\"flex items-center justify-center\">\n <Circle className=\"h-2.5 w-2.5 fill-current text-current\" />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n );\n});\nRadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName;\n\nexport { RadioGroup, RadioGroupItem };\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\n\n/**\n * Row — horizontal layout primitive.\n *\n * The partner to Stack. Use for button groups, inline form layouts,\n * split hero/logo rows, anything on one line. The default `align=\"center\"`\n * matches what most real rows want — vertically-centred icon-plus-text,\n * centred button groups. `justify` covers the main-axis distribution\n * explicitly so the agent doesn't reach for `ml-auto` to push things\n * apart.\n *\n * Distinct from a two-pane Split: Row is for evenly flowing children\n * with a shared gap; Split enforces an explicit pane ratio (1/3 + 2/3\n * etc.) and is a separate primitive.\n */\nconst rowVariants = cva(\"rds-row flex flex-row\", {\n variants: {\n gap: {\n none: \"gap-0\",\n xs: \"gap-1\",\n sm: \"gap-2\",\n md: \"gap-4\",\n lg: \"gap-6\",\n xl: \"gap-8\",\n \"2xl\": \"gap-12\",\n },\n align: {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n baseline: \"items-baseline\",\n },\n justify: {\n start: \"justify-start\",\n center: \"justify-center\",\n end: \"justify-end\",\n between: \"justify-between\",\n around: \"justify-around\",\n evenly: \"justify-evenly\",\n },\n wrap: {\n true: \"flex-wrap\",\n false: \"flex-nowrap\",\n },\n },\n defaultVariants: {\n gap: \"md\",\n align: \"center\",\n justify: \"start\",\n wrap: false,\n },\n});\n\nexport interface RowProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof rowVariants> {\n /** When true, render as the single child element via Radix Slot — lets\n * you stamp Row's layout classes onto an existing semantic tag without\n * nesting an extra `<div>`. */\n asChild?: boolean;\n}\n\nconst Row = React.forwardRef<HTMLDivElement, RowProps>(\n (\n { className, gap, align, justify, wrap, asChild = false, ...props },\n ref\n ) => {\n const Comp = asChild ? Slot : \"div\";\n return (\n <Comp\n ref={ref}\n data-gds-part=\"row\"\n className={cn(rowVariants({ gap, align, justify, wrap, className }))}\n {...props}\n />\n );\n }\n);\nRow.displayName = \"Row\";\n\nexport { Row, rowVariants };\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\n\n/**\n * Grid — 2D layout primitive. The partner to Stack and Row.\n *\n * Stack handles vertical, Row handles horizontal, Grid handles the\n * responsive 2D case — most commonly a set of equal-width tiles (stat\n * cards, feature cards, pricing columns) that needs to collapse\n * gracefully on narrow viewports. Without this primitive, every\n * vibe-coded dashboard reinvents `grid grid-cols-1 md:grid-cols-2\n * lg:grid-cols-4` and the settings panel has nothing to mutate.\n *\n * `cols` names the DESIRED desktop column count. Each value is a\n * baked-in responsive ladder that matches the standard pattern for that\n * count (1→2→N for small counts, 2→3→N for denser grids) so the model\n * just writes `<Grid cols=\"4\">` and gets the same behaviour it would\n * hand-roll. If you need bespoke breakpoints, override via `className`.\n *\n * Sharing the `gap` / `align` scale with Stack and Row is deliberate:\n * when the Studio panel offers a \"switch layout type\" control between\n * Stack / Row / Grid, those props transfer cleanly — only `cols`\n * (Grid-only) and `justify` / `wrap` (Row-only) are lost.\n */\nconst gridVariants = cva(\"rds-grid grid\", {\n variants: {\n cols: {\n \"1\": \"grid-cols-1\",\n \"2\": \"grid-cols-1 md:grid-cols-2\",\n \"3\": \"grid-cols-1 sm:grid-cols-2 md:grid-cols-3\",\n \"4\": \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-4\",\n \"5\": \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-5\",\n \"6\": \"grid-cols-2 sm:grid-cols-3 lg:grid-cols-6\",\n \"12\": \"grid-cols-4 md:grid-cols-6 lg:grid-cols-12\",\n },\n gap: {\n none: \"gap-0\",\n xs: \"gap-1\",\n sm: \"gap-2\",\n md: \"gap-4\",\n lg: \"gap-6\",\n xl: \"gap-8\",\n \"2xl\": \"gap-12\",\n },\n align: {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n },\n },\n defaultVariants: {\n cols: \"3\",\n gap: \"md\",\n align: \"stretch\",\n },\n});\n\nexport interface GridProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof gridVariants> {\n /** When true, render as the single child element via Radix Slot — lets\n * you stamp Grid's layout classes onto an existing semantic tag\n * without nesting an extra `<div>`. */\n asChild?: boolean;\n}\n\nconst Grid = React.forwardRef<HTMLDivElement, GridProps>(\n ({ className, cols, gap, align, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"div\";\n return (\n <Comp\n ref={ref}\n data-gds-part=\"grid\"\n className={cn(gridVariants({ cols, gap, align, className }))}\n {...props}\n />\n );\n }\n);\nGrid.displayName = \"Grid\";\n\nexport { Grid, gridVariants };\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\n\n/**\n * Flex — the unopinionated flexbox primitive.\n *\n * The CSS-aligned partner to Stack / Row / Grid. Where Stack and Row bake in\n * a direction and a sensible gap/align default, Flex exposes the raw CSS\n * knobs and ships with CSS's own defaults — direction=row, gap=none,\n * justify=start, align=stretch, wrap=nowrap. Nothing is opinionated; you pay\n * for exactly the props you set.\n *\n * Use Flex when:\n * - You need `direction=\"col-reverse\"` or `\"row-reverse\"` — Stack and Row\n * can't express either without falling back to className.\n * - You want CSS defaults (stretch alignment, no baked-in gap) rather than\n * Row's \"items-center gap-md\" starting point.\n * - You're reaching for `className=\"flex …\"` and want the settings-panel\n * editability you lose when hand-rolling utility classes.\n *\n * Otherwise prefer Stack (vertical) / Row (horizontal) / Grid (2D) —\n * they're easier to read at a glance and have defaults tuned for the 95%\n * case. Flex is the escape hatch, not the default.\n */\nconst flexVariants = cva(\"rds-flex flex\", {\n variants: {\n direction: {\n row: \"flex-row\",\n col: \"flex-col\",\n \"row-reverse\": \"flex-row-reverse\",\n \"col-reverse\": \"flex-col-reverse\",\n },\n gap: {\n none: \"gap-0\",\n xs: \"gap-1\",\n sm: \"gap-2\",\n md: \"gap-4\",\n lg: \"gap-6\",\n xl: \"gap-8\",\n \"2xl\": \"gap-12\",\n },\n align: {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n baseline: \"items-baseline\",\n },\n justify: {\n start: \"justify-start\",\n center: \"justify-center\",\n end: \"justify-end\",\n between: \"justify-between\",\n around: \"justify-around\",\n evenly: \"justify-evenly\",\n },\n wrap: {\n nowrap: \"flex-nowrap\",\n wrap: \"flex-wrap\",\n \"wrap-reverse\": \"flex-wrap-reverse\",\n },\n },\n // CSS-aligned defaults on purpose — Flex's whole point is \"don't surprise\n // me with baked-in rhythm\". Consumers who want Row-style defaults should\n // use Row.\n defaultVariants: {\n direction: \"row\",\n gap: \"none\",\n align: \"stretch\",\n justify: \"start\",\n wrap: \"nowrap\",\n },\n});\n\nexport interface FlexProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof flexVariants> {\n /** When true, render as the single child element via Radix Slot — lets\n * you stamp Flex's layout classes onto an existing semantic tag without\n * nesting an extra `<div>`. */\n asChild?: boolean;\n}\n\nconst Flex = React.forwardRef<HTMLDivElement, FlexProps>(\n (\n {\n className,\n direction,\n gap,\n align,\n justify,\n wrap,\n asChild = false,\n ...props\n },\n ref\n ) => {\n const Comp = asChild ? Slot : \"div\";\n return (\n <Comp\n ref={ref}\n data-gds-part=\"flex\"\n className={cn(\n flexVariants({ direction, gap, align, justify, wrap, className })\n )}\n {...props}\n />\n );\n }\n);\nFlex.displayName = \"Flex\";\n\nexport { Flex, flexVariants };\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\";\nimport { cn } from \"@/lib/utils\";\n\nconst ScrollArea = React.forwardRef<\n React.ComponentRef<typeof ScrollAreaPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>\n>(({ className, children, ...props }, ref) => (\n <ScrollAreaPrimitive.Root\n ref={ref}\n className={cn(\"relative overflow-hidden\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport className=\"h-full w-full rounded-[inherit]\">\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n));\nScrollArea.displayName = ScrollAreaPrimitive.Root.displayName;\n\nconst ScrollBar = React.forwardRef<\n React.ComponentRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>\n>(({ className, orientation = \"vertical\", ...props }, ref) => (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n ref={ref}\n orientation={orientation}\n className={cn(\n \"flex touch-none select-none transition-colors\",\n orientation === \"vertical\" &&\n \"h-full w-2.5 border-l border-l-transparent p-[1px]\",\n orientation === \"horizontal\" &&\n \"h-2.5 flex-col border-t border-t-transparent p-[1px]\",\n className\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb className=\"relative flex-1 rounded-full bg-border\" />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n));\nScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName;\n\nexport { ScrollArea, ScrollBar };\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as SelectPrimitive from \"@radix-ui/react-select\";\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\n\nconst Select = SelectPrimitive.Root;\n\nconst SelectGroup = SelectPrimitive.Group;\n\nconst SelectValue = SelectPrimitive.Value;\n\nconst SelectTrigger = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n));\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName;\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n));\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n));\nSelectScrollDownButton.displayName =\n SelectPrimitive.ScrollDownButton.displayName;\n\nconst SelectContent = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = \"popper\", ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n \"relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n));\nSelectContent.displayName = SelectPrimitive.Content.displayName;\n\nconst SelectLabel = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn(\"py-1.5 pl-8 pr-2 text-sm font-semibold\", className)}\n {...props}\n />\n));\nSelectLabel.displayName = SelectPrimitive.Label.displayName;\n\nconst SelectItem = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n));\nSelectItem.displayName = SelectPrimitive.Item.displayName;\n\nconst SelectSeparator = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n));\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName;\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n};\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\";\nimport { cn } from \"@/lib/utils\";\n\nconst Separator = React.forwardRef<\n React.ComponentRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(\n (\n { className, orientation = \"horizontal\", decorative = true, ...props },\n ref\n ) => (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border\",\n orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\n className\n )}\n {...props}\n />\n )\n);\nSeparator.displayName = SeparatorPrimitive.Root.displayName;\n\nexport { Separator };\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { X } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\n\nconst Sheet = SheetPrimitive.Root;\n\nconst SheetTrigger = SheetPrimitive.Trigger;\n\nconst SheetClose = SheetPrimitive.Close;\n\nconst SheetPortal = SheetPrimitive.Portal;\n\nconst SheetOverlay = React.forwardRef<\n React.ComponentRef<typeof SheetPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Overlay\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n ref={ref}\n />\n));\nSheetOverlay.displayName = SheetPrimitive.Overlay.displayName;\n\nconst sheetVariants = cva(\n \"fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500\",\n {\n variants: {\n side: {\n top: \"inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top\",\n bottom:\n \"inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom\",\n left: \"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm\",\n right:\n \"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm\",\n },\n },\n defaultVariants: {\n side: \"right\",\n },\n }\n);\n\ninterface SheetContentProps\n extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>,\n VariantProps<typeof sheetVariants> {}\n\nconst SheetContent = React.forwardRef<\n React.ComponentRef<typeof SheetPrimitive.Content>,\n SheetContentProps\n>(({ side = \"right\", className, children, ...props }, ref) => (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n ref={ref}\n className={cn(sheetVariants({ side }), className)}\n {...props}\n >\n {children}\n <SheetPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n </SheetPrimitive.Content>\n </SheetPortal>\n));\nSheetContent.displayName = SheetPrimitive.Content.displayName;\n\nconst SheetHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-2 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n);\nSheetHeader.displayName = \"SheetHeader\";\n\nconst SheetFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n);\nSheetFooter.displayName = \"SheetFooter\";\n\nconst SheetTitle = React.forwardRef<\n React.ComponentRef<typeof SheetPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Title\n ref={ref}\n className={cn(\"text-lg font-semibold text-foreground\", className)}\n {...props}\n />\n));\nSheetTitle.displayName = SheetPrimitive.Title.displayName;\n\nconst SheetDescription = React.forwardRef<\n React.ComponentRef<typeof SheetPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nSheetDescription.displayName = SheetPrimitive.Description.displayName;\n\nexport {\n Sheet,\n SheetPortal,\n SheetOverlay,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n};\n","import { cn } from \"@/lib/utils\";\n\nfunction Skeleton({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\"animate-pulse rounded-md bg-muted\", className)}\n {...props}\n />\n );\n}\n\nexport { Skeleton };\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as SliderPrimitive from \"@radix-ui/react-slider\";\nimport { cn } from \"@/lib/utils\";\n\nconst Slider = React.forwardRef<\n React.ComponentRef<typeof SliderPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <SliderPrimitive.Root\n ref={ref}\n className={cn(\n \"relative flex w-full touch-none select-none items-center\",\n className\n )}\n {...props}\n >\n <SliderPrimitive.Track className=\"relative h-2 w-full grow overflow-hidden rounded-full bg-secondary\">\n <SliderPrimitive.Range className=\"absolute h-full bg-primary\" />\n </SliderPrimitive.Track>\n <SliderPrimitive.Thumb className=\"block h-5 w-5 rounded-full border-2 border-primary bg-background ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\" />\n </SliderPrimitive.Root>\n));\nSlider.displayName = SliderPrimitive.Root.displayName;\n\nexport { Slider };\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\n\n/**\n * Stack — vertical layout primitive.\n *\n * Reach for this as the default top-level wrapper inside the Studio main\n * slot when composing multiple regions (hero + content + footer). The\n * point is to stop the agent from freestyling `flex flex-col gap-6`\n * inline on every generation — a named layout component with a bounded\n * gap scale gives the Studio settings panel something to mutate, and\n * keeps vertical rhythm consistent across designs.\n *\n * Cross-axis default is `stretch` so Sections/Cards fill the container\n * width, which is what 95% of callers want. Override with `align=\"center\"`\n * for a centred narrow column (auth cards, marketing copy).\n */\nconst stackVariants = cva(\"rds-stack flex flex-col\", {\n variants: {\n gap: {\n none: \"gap-0\",\n xs: \"gap-1\",\n sm: \"gap-2\",\n md: \"gap-4\",\n lg: \"gap-6\",\n xl: \"gap-8\",\n \"2xl\": \"gap-12\",\n },\n align: {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n },\n },\n defaultVariants: {\n gap: \"md\",\n align: \"stretch\",\n },\n});\n\nexport interface StackProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof stackVariants> {\n /** When true, render as the single child element via Radix Slot — lets\n * you stamp Stack's layout classes onto an existing semantic tag\n * (`<section>`, `<main>`, `<nav>`) without nesting an extra `<div>`. */\n asChild?: boolean;\n}\n\nconst Stack = React.forwardRef<HTMLDivElement, StackProps>(\n ({ className, gap, align, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"div\";\n return (\n <Comp\n ref={ref}\n data-gds-part=\"stack\"\n className={cn(stackVariants({ gap, align, className }))}\n {...props}\n />\n );\n }\n);\nStack.displayName = \"Stack\";\n\nexport { Stack, stackVariants };\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as SwitchPrimitives from \"@radix-ui/react-switch\";\nimport { cn } from \"@/lib/utils\";\n\nconst Switch = React.forwardRef<\n React.ComponentRef<typeof SwitchPrimitives.Root>,\n React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>\n>(({ className, ...props }, ref) => (\n <SwitchPrimitives.Root\n className={cn(\n \"peer inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input\",\n className\n )}\n {...props}\n ref={ref}\n >\n <SwitchPrimitives.Thumb\n className={cn(\n \"pointer-events-none block h-5 w-5 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0\"\n )}\n />\n </SwitchPrimitives.Root>\n));\nSwitch.displayName = SwitchPrimitives.Root.displayName;\n\nexport { Switch };\n","import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Table = React.forwardRef<\n HTMLTableElement,\n React.HTMLAttributes<HTMLTableElement>\n>(({ className, ...props }, ref) => (\n <div className=\"relative w-full overflow-auto\">\n <table\n ref={ref}\n className={cn(\"w-full caption-bottom text-sm\", className)}\n {...props}\n />\n </div>\n))\nTable.displayName = \"Table\"\n\nconst TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <thead ref={ref} className={cn(\"[&_tr]:border-b\", className)} {...props} />\n))\nTableHeader.displayName = \"TableHeader\"\n\nconst TableBody = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tbody\n ref={ref}\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n))\nTableBody.displayName = \"TableBody\"\n\nconst TableFooter = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={cn(\n \"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\",\n className\n )}\n {...props}\n />\n))\nTableFooter.displayName = \"TableFooter\"\n\nconst TableRow = React.forwardRef<\n HTMLTableRowElement,\n React.HTMLAttributes<HTMLTableRowElement>\n>(({ className, ...props }, ref) => (\n <tr\n ref={ref}\n className={cn(\n \"border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted\",\n className\n )}\n {...props}\n />\n))\nTableRow.displayName = \"TableRow\"\n\nconst TableHead = React.forwardRef<\n HTMLTableCellElement,\n React.ThHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={cn(\n \"h-10 px-2 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\n className\n )}\n {...props}\n />\n))\nTableHead.displayName = \"TableHead\"\n\nconst TableCell = React.forwardRef<\n HTMLTableCellElement,\n React.TdHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={cn(\n \"p-2 align-middle [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\n className\n )}\n {...props}\n />\n))\nTableCell.displayName = \"TableCell\"\n\nconst TableCaption = React.forwardRef<\n HTMLTableCaptionElement,\n React.HTMLAttributes<HTMLTableCaptionElement>\n>(({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={cn(\"mt-4 text-sm text-muted-foreground\", className)}\n {...props}\n />\n))\nTableCaption.displayName = \"TableCaption\"\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Tabs = TabsPrimitive.Root\n\nconst TabsList = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n \"inline-flex h-9 items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground\",\n className\n )}\n {...props}\n />\n))\nTabsList.displayName = TabsPrimitive.List.displayName\n\nconst TabsTrigger = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground\",\n className\n )}\n {...props}\n />\n))\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName\n\nconst TabsContent = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n \"mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n className\n )}\n {...props}\n />\n))\nTabsContent.displayName = TabsPrimitive.Content.displayName\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n","import * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nconst Textarea = React.forwardRef<\n HTMLTextAreaElement,\n React.ComponentProps<\"textarea\">\n>(({ className, ...props }, ref) => {\n return (\n <textarea\n className={cn(\n \"flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n ref={ref}\n {...props}\n />\n );\n});\nTextarea.displayName = \"Textarea\";\n\nexport { Textarea };\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst TooltipProvider = TooltipPrimitive.Provider\n\nconst Tooltip = TooltipPrimitive.Root\n\nconst TooltipTrigger = TooltipPrimitive.Trigger\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]\",\n className\n )}\n {...props}\n />\n </TooltipPrimitive.Portal>\n))\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { ChevronLeft, ChevronRight, ChevronDown } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"./tooltip\"\n\n// Types\nexport interface SideMenuItem {\n id: string\n label: string\n href?: string\n icon?: React.ReactNode\n badge?: string | number\n onClick?: () => void\n disabled?: boolean\n}\n\nexport interface SideMenuSection {\n id: string\n title: string\n icon?: React.ReactNode\n items: SideMenuItem[]\n defaultExpanded?: boolean\n}\n\nexport interface SideMenuProps {\n /** Header content (logo, title, etc.) */\n header?: React.ReactNode\n /** Header content shown when collapsed (icon, etc.) */\n collapsedHeader?: React.ReactNode\n /** Navigation sections with collapsible groups */\n sections?: SideMenuSection[]\n /** Standalone items without sections */\n items?: SideMenuItem[]\n /** Footer content */\n footer?: React.ReactNode\n /** Whether the sidebar is collapsed */\n collapsed?: boolean\n /** Callback when collapsed state changes */\n onCollapsedChange?: (collapsed: boolean) => void\n /** Whether the sidebar can be collapsed */\n collapsible?: boolean\n /** Default collapsed state */\n defaultCollapsed?: boolean\n /** Currently active item id */\n activeItem?: string\n /** Custom className */\n className?: string\n /** Custom link component (e.g., Next.js Link) */\n linkComponent?: React.ComponentType<{\n href: string\n className?: string\n children: React.ReactNode\n }>\n}\n\n// Context for sharing state\ninterface SideMenuContextValue {\n collapsed: boolean\n activeItem?: string\n LinkComponent: React.ComponentType<{\n href: string\n className?: string\n children: React.ReactNode\n }>\n}\n\nconst SideMenuContext = React.createContext<SideMenuContextValue | null>(null)\n\nfunction useSideMenu() {\n const context = React.useContext(SideMenuContext)\n if (!context) {\n throw new Error(\"SideMenu components must be used within SideMenu\")\n }\n return context\n}\n\n// Default link component\nconst DefaultLink: React.FC<{\n href: string\n className?: string\n children: React.ReactNode\n}> = ({ href, className, children }) => (\n <a href={href} className={className}>\n {children}\n </a>\n)\n\n// Main SideMenu component\nconst SideMenu = React.forwardRef<HTMLElement, SideMenuProps>(\n (\n {\n header,\n collapsedHeader,\n sections,\n items,\n footer,\n collapsed: controlledCollapsed,\n onCollapsedChange,\n collapsible = true,\n defaultCollapsed = false,\n activeItem,\n className,\n linkComponent: LinkComponent = DefaultLink,\n },\n ref\n ) => {\n const [internalCollapsed, setInternalCollapsed] =\n React.useState(defaultCollapsed)\n\n // Support both controlled and uncontrolled modes\n const collapsed = controlledCollapsed ?? internalCollapsed\n\n const handleToggle = () => {\n const newCollapsed = !collapsed\n setInternalCollapsed(newCollapsed)\n onCollapsedChange?.(newCollapsed)\n }\n\n return (\n <TooltipProvider delayDuration={0}>\n <SideMenuContext.Provider\n value={{ collapsed, activeItem, LinkComponent }}\n >\n <aside\n ref={ref}\n className={cn(\n \"flex h-full flex-col transition-[width] duration-300 ease-in-out\",\n \"bg-white dark:bg-[#141414] border-r border-rds-gray-200 dark:border-[#1a1a1a]\",\n collapsed ? \"w-16\" : \"w-64\",\n className\n )}\n >\n {/* Header */}\n <div\n className={cn(\n \"flex items-center border-b border-rds-gray-200 dark:border-[#1a1a1a] flex-shrink-0 h-12\",\n collapsed\n ? \"justify-center px-2\"\n : \"justify-between px-3\"\n )}\n >\n {collapsed ? collapsedHeader || header : header}\n\n {collapsible && (\n <button\n onClick={handleToggle}\n className={cn(\n \"rounded-md h-5 w-5 flex items-center justify-center\",\n \"text-rds-gray-400 dark:text-rds-gray-500\",\n \"hover:text-rds-gray-600 dark:hover:text-rds-gray-300 transition-colors\",\n \"bg-white dark:bg-[#141414] border border-rds-gray-200 dark:border-rds-gray-700 shadow-sm\",\n collapsed && \"absolute left-[calc(4rem-10px)] top-6 -translate-y-1/2 z-50\"\n )}\n aria-label={collapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n >\n {collapsed ? (\n <ChevronRight className=\"h-3 w-3\" />\n ) : (\n <ChevronLeft className=\"h-3 w-3\" />\n )}\n </button>\n )}\n </div>\n\n {/* Navigation */}\n <nav className=\"flex-1 py-2 overflow-y-auto overflow-x-hidden\">\n {/* Standalone items */}\n {items && items.length > 0 && (\n <div className=\"px-2 mb-1 space-y-0.5\">\n {items.map((item) => (\n <SideMenuItemComponent key={item.id} item={item} />\n ))}\n </div>\n )}\n\n {/* Sections */}\n {sections?.map((section) => (\n <SideMenuSectionComponent key={section.id} section={section} />\n ))}\n </nav>\n\n {/* Footer */}\n {footer && (\n <div className=\"flex-shrink-0 border-t border-rds-gray-200 dark:border-[#1a1a1a] p-2\">\n {footer}\n </div>\n )}\n </aside>\n </SideMenuContext.Provider>\n </TooltipProvider>\n )\n }\n)\nSideMenu.displayName = \"SideMenu\"\n\n// Section component\nfunction SideMenuSectionComponent({ section }: { section: SideMenuSection }) {\n const { collapsed } = useSideMenu()\n const [expanded, setExpanded] = React.useState(\n section.defaultExpanded ?? true\n )\n\n if (collapsed) {\n // When collapsed, show items directly without section headers\n return (\n <div className=\"px-2 mb-1 space-y-0.5\">\n {section.items.map((item) => (\n <SideMenuItemComponent key={item.id} item={item} />\n ))}\n </div>\n )\n }\n\n return (\n <div className=\"px-2 mb-1\">\n <button\n onClick={() => setExpanded(!expanded)}\n className={cn(\n \"flex w-full items-center gap-2.5 rounded-md px-2 py-1.5 text-sm font-medium\",\n \"text-rds-gray-700 dark:text-rds-gray-300\",\n \"hover:bg-rds-gray-50 dark:hover:bg-rds-gray-900\",\n \"hover:text-rds-gray-900 dark:hover:text-white transition-colors\"\n )}\n >\n {section.icon && (\n <span className=\"h-3.5 w-3.5 flex-shrink-0\">{section.icon}</span>\n )}\n <span className=\"flex-1 text-left\">{section.title}</span>\n {expanded ? (\n <ChevronDown className=\"h-3 w-3\" strokeWidth={1.5} />\n ) : (\n <ChevronRight className=\"h-3 w-3\" strokeWidth={1.5} />\n )}\n </button>\n\n {expanded && (\n <div className=\"mt-0.5 space-y-0.5 relative pl-5\">\n <div className=\"absolute left-[1.1rem] top-0 bottom-0 w-px bg-rds-gray-200 dark:bg-rds-gray-700\" />\n {section.items.map((item) => (\n <SideMenuItemComponent key={item.id} item={item} nested />\n ))}\n </div>\n )}\n </div>\n )\n}\n\n// Item component\nfunction SideMenuItemComponent({\n item,\n nested = false,\n}: {\n item: SideMenuItem\n nested?: boolean\n}) {\n const { collapsed, activeItem, LinkComponent } = useSideMenu()\n const isActive = activeItem === item.id\n\n const itemClasses = cn(\n \"flex items-center gap-2.5 rounded-md text-sm font-medium transition-colors\",\n collapsed ? \"justify-center px-2 py-2.5\" : \"px-2 py-1.5\",\n isActive\n ? nested\n ? \"bg-rds-gray-100 dark:bg-[#1a1a1a] text-rds-gray-900 dark:text-white\"\n : \"bg-rds-green-50 dark:bg-rds-green-950 text-rds-green-700 dark:text-rds-green-400\"\n : \"text-rds-gray-700 dark:text-rds-gray-300 hover:bg-rds-gray-50 dark:hover:bg-rds-gray-900 hover:text-rds-gray-900 dark:hover:text-white\",\n item.disabled && \"opacity-50 pointer-events-none\"\n )\n\n const content = (\n <>\n {item.icon && (\n <span\n className={cn(\"flex-shrink-0\", collapsed ? \"h-5 w-5\" : \"h-3.5 w-3.5\")}\n >\n {item.icon}\n </span>\n )}\n {!collapsed && <span>{item.label}</span>}\n {!collapsed && item.badge && (\n <span className=\"ml-auto text-xs bg-rds-gray-100 dark:bg-rds-gray-800 px-1.5 py-0.5 rounded\">\n {item.badge}\n </span>\n )}\n </>\n )\n\n const element = item.href ? (\n <LinkComponent href={item.href} className={itemClasses}>\n {content}\n </LinkComponent>\n ) : (\n <button\n onClick={item.onClick}\n disabled={item.disabled}\n className={cn(itemClasses, \"w-full\")}\n >\n {content}\n </button>\n )\n\n if (collapsed) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>{element}</TooltipTrigger>\n <TooltipContent side=\"right\" sideOffset={8}>\n {item.label}\n </TooltipContent>\n </Tooltip>\n )\n }\n\n return element\n}\n\nexport { SideMenu }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Menu } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\n\n// Types\nexport interface BreadcrumbItem {\n label: string\n href?: string\n}\n\nexport interface TopMenuProps {\n /** Breadcrumb navigation items */\n breadcrumbs?: BreadcrumbItem[]\n /** Show mobile menu button */\n showMobileMenu?: boolean\n /** Mobile menu button click handler */\n onMobileMenuClick?: () => void\n /** Left side content (appears after breadcrumbs) */\n leftContent?: React.ReactNode\n /** Right side content (actions, user menu, etc.) */\n rightContent?: React.ReactNode\n /** Custom className */\n className?: string\n /** Custom link component (e.g., Next.js Link) */\n linkComponent?: React.ComponentType<{\n href: string\n className?: string\n children: React.ReactNode\n }>\n}\n\n// Default link component\nconst DefaultLink: React.FC<{\n href: string\n className?: string\n children: React.ReactNode\n}> = ({ href, className, children }) => (\n <a href={href} className={className}>\n {children}\n </a>\n)\n\nconst TopMenu = React.forwardRef<HTMLElement, TopMenuProps>(\n (\n {\n breadcrumbs = [],\n showMobileMenu = false,\n onMobileMenuClick,\n leftContent,\n rightContent,\n className,\n linkComponent: LinkComponent = DefaultLink,\n },\n ref\n ) => {\n return (\n <header\n ref={ref}\n className={cn(\n \"sticky top-0 z-30 flex h-12 items-center gap-3\",\n \"border-b border-rds-gray-200 dark:border-[#1a1a1a]\",\n \"bg-white dark:bg-[#141414] px-4\",\n className\n )}\n >\n {/* Mobile Menu Button */}\n {showMobileMenu && (\n <button\n onClick={onMobileMenuClick}\n className=\"lg:hidden rounded-md p-1.5 text-rds-gray-600 hover:bg-rds-gray-100 dark:text-rds-gray-400 dark:hover:bg-rds-gray-800\"\n aria-label=\"Toggle menu\"\n >\n <Menu className=\"h-4 w-4\" />\n </button>\n )}\n\n {/* Breadcrumbs */}\n {breadcrumbs.length > 0 && (\n <nav\n className=\"hidden md:flex items-center gap-1.5 text-sm\"\n aria-label=\"Breadcrumb\"\n >\n {breadcrumbs.map((crumb, index) => (\n <React.Fragment key={index}>\n {index > 0 && (\n <span className=\"text-rds-gray-400 dark:text-rds-gray-500 text-xs\">\n /\n </span>\n )}\n {crumb.href ? (\n <LinkComponent\n href={crumb.href}\n className=\"text-rds-gray-600 dark:text-rds-gray-400 hover:text-rds-gray-900 dark:hover:text-white transition-colors text-sm\"\n >\n {crumb.label}\n </LinkComponent>\n ) : (\n <span className=\"text-rds-gray-900 dark:text-white font-medium text-sm\">\n {crumb.label}\n </span>\n )}\n </React.Fragment>\n ))}\n </nav>\n )}\n\n {/* Left Content */}\n {leftContent}\n\n {/* Spacer */}\n <div className=\"flex-1\" />\n\n {/* Right Content */}\n {rightContent && (\n <div className=\"flex items-center gap-1.5\">{rightContent}</div>\n )}\n </header>\n )\n }\n)\nTopMenu.displayName = \"TopMenu\"\n\n// User Menu Component\nexport interface TopMenuUserProps {\n /** User name */\n name?: string\n /** User email */\n email?: string\n /** User avatar URL */\n avatarUrl?: string\n /** Custom avatar content (icon, initials, etc.) */\n avatarContent?: React.ReactNode\n /** Avatar background color class */\n avatarClassName?: string\n /** Menu items */\n children?: React.ReactNode\n /** Custom className */\n className?: string\n}\n\nconst TopMenuUser = React.forwardRef<HTMLDivElement, TopMenuUserProps>(\n (\n {\n name,\n email,\n avatarUrl,\n avatarContent,\n avatarClassName,\n children,\n className,\n },\n ref\n ) => {\n const [open, setOpen] = React.useState(false)\n const menuRef = React.useRef<HTMLDivElement>(null)\n\n // Close menu when clicking outside\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n menuRef.current &&\n !menuRef.current.contains(event.target as Node)\n ) {\n setOpen(false)\n }\n }\n\n if (open) {\n document.addEventListener(\"mousedown\", handleClickOutside)\n }\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside)\n }\n }, [open])\n\n return (\n <div ref={ref} className={cn(\"relative\", className)}>\n <div ref={menuRef}>\n <button\n onClick={() => setOpen(!open)}\n className=\"flex items-center gap-1.5 rounded-full p-0.5 hover:ring-2 hover:ring-rds-green-500 hover:ring-offset-2 dark:hover:ring-offset-[#141414] transition-all\"\n aria-label=\"Account menu\"\n >\n <div\n className={cn(\n \"h-8 w-8 rounded-full overflow-hidden flex items-center justify-center\",\n avatarClassName ||\n \"bg-gradient-to-br from-rds-yellow-400 to-rds-yellow-600\"\n )}\n >\n {avatarUrl ? (\n <img\n src={avatarUrl}\n alt={name || \"User\"}\n className=\"h-full w-full object-cover\"\n />\n ) : (\n avatarContent\n )}\n </div>\n </button>\n\n {/* Dropdown Menu */}\n {open && (\n <div className=\"absolute right-0 mt-2 w-64 rounded-lg border border-rds-gray-200 dark:border-[#1a1a1a] bg-white dark:bg-[#141414] shadow-lg overflow-hidden z-50\">\n {/* User Info */}\n {(name || email) && (\n <div className=\"px-4 py-3 border-b border-rds-gray-200 dark:border-[#1a1a1a]\">\n <div className=\"flex items-center gap-3\">\n <div\n className={cn(\n \"h-10 w-10 rounded-full overflow-hidden flex items-center justify-center\",\n avatarClassName ||\n \"bg-gradient-to-br from-rds-yellow-400 to-rds-yellow-600\"\n )}\n >\n {avatarUrl ? (\n <img\n src={avatarUrl}\n alt={name || \"User\"}\n className=\"h-full w-full object-cover\"\n />\n ) : (\n avatarContent\n )}\n </div>\n <div className=\"flex-1 min-w-0\">\n {name && (\n <p className=\"text-sm font-medium text-rds-gray-900 dark:text-white truncate\">\n {name}\n </p>\n )}\n {email && (\n <p className=\"text-xs text-rds-gray-500 dark:text-rds-gray-400 truncate\">\n {email}\n </p>\n )}\n </div>\n </div>\n </div>\n )}\n\n {/* Menu Items */}\n {children}\n </div>\n )}\n </div>\n </div>\n )\n }\n)\nTopMenuUser.displayName = \"TopMenuUser\"\n\n// User Menu Item\nexport interface TopMenuUserItemProps {\n /** Item icon */\n icon?: React.ReactNode\n /** Item label */\n children: React.ReactNode\n /** Click handler */\n onClick?: () => void\n /** Href for link items */\n href?: string\n /** Variant */\n variant?: \"default\" | \"danger\" | \"success\"\n /** Custom className */\n className?: string\n}\n\nconst TopMenuUserItem = React.forwardRef<\n HTMLButtonElement,\n TopMenuUserItemProps\n>(({ icon, children, onClick, href, variant = \"default\", className }, ref) => {\n const variantClasses = {\n default:\n \"text-rds-gray-700 dark:text-rds-gray-300 hover:bg-rds-gray-50 dark:hover:bg-[#1a1a1a]\",\n danger:\n \"text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-950/20\",\n success:\n \"text-rds-green-600 dark:text-rds-green-400 hover:bg-rds-green-50 dark:hover:bg-rds-green-950/20\",\n }\n\n const Component = href ? \"a\" : \"button\"\n\n return (\n <Component\n ref={ref as React.Ref<HTMLButtonElement & HTMLAnchorElement>}\n onClick={onClick}\n href={href}\n className={cn(\n \"w-full flex items-center gap-3 px-4 py-2 text-sm transition-colors\",\n variantClasses[variant],\n className\n )}\n >\n {icon && <span className=\"h-4 w-4\">{icon}</span>}\n <span>{children}</span>\n </Component>\n )\n})\nTopMenuUserItem.displayName = \"TopMenuUserItem\"\n\n// User Menu Section (for grouping items with borders)\nconst TopMenuUserSection = React.forwardRef<\n HTMLDivElement,\n { children: React.ReactNode; className?: string }\n>(({ children, className }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"py-1 border-t border-rds-gray-200 dark:border-[#1a1a1a] first:border-t-0\",\n className\n )}\n >\n {children}\n </div>\n))\nTopMenuUserSection.displayName = \"TopMenuUserSection\"\n\nexport { TopMenu, TopMenuUser, TopMenuUserItem, TopMenuUserSection }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"@/lib/utils\"\n\n// Types\nexport interface SimpleTab {\n id: string\n label: string\n icon?: React.ReactNode\n disabled?: boolean\n}\n\nexport interface SimpleTabsProps {\n /** Array of tab definitions */\n tabs: SimpleTab[]\n /** Currently active tab id */\n activeTab?: string\n /** Default active tab id (for uncontrolled mode) */\n defaultTab?: string\n /** Callback when tab changes */\n onTabChange?: (tabId: string) => void\n /** Tab panel children */\n children?: React.ReactNode\n /** Custom className for the container */\n className?: string\n /** Custom className for the tabs list */\n tabsClassName?: string\n}\n\nexport interface SimpleTabsPanelProps {\n /** Tab id this panel corresponds to */\n id: string\n /** Panel content */\n children: React.ReactNode\n /** Custom className */\n className?: string\n}\n\n// Context for sharing state\ninterface SimpleTabsContextValue {\n activeTab: string\n setActiveTab: (tab: string) => void\n}\n\nconst SimpleTabsContext = React.createContext<SimpleTabsContextValue | null>(\n null\n)\n\nfunction useSimpleTabs() {\n const context = React.useContext(SimpleTabsContext)\n if (!context) {\n throw new Error(\"SimpleTabsPanel must be used within SimpleTabs\")\n }\n return context\n}\n\n// Main SimpleTabs component\nconst SimpleTabs = React.forwardRef<HTMLDivElement, SimpleTabsProps>(\n (\n {\n tabs,\n activeTab: controlledActiveTab,\n defaultTab,\n onTabChange,\n children,\n className,\n tabsClassName,\n },\n ref\n ) => {\n const [internalActiveTab, setInternalActiveTab] = React.useState(\n defaultTab || tabs[0]?.id || \"\"\n )\n\n // Support both controlled and uncontrolled modes\n const activeTab = controlledActiveTab ?? internalActiveTab\n\n const handleTabChange = (tabId: string) => {\n setInternalActiveTab(tabId)\n onTabChange?.(tabId)\n }\n\n return (\n <SimpleTabsContext.Provider\n value={{ activeTab, setActiveTab: handleTabChange }}\n >\n <div ref={ref} className={cn(\"space-y-6\", className)}>\n {/* Tab Navigation */}\n <div className=\"border-b border-rds-gray-200 dark:border-rds-gray-800\">\n <nav\n className={cn(\n \"-mb-px flex gap-1 overflow-x-auto scrollbar-hide\",\n tabsClassName\n )}\n aria-label=\"Tabs\"\n >\n {tabs.map((tab) => {\n const isActive = activeTab === tab.id\n\n return (\n <button\n key={tab.id}\n onClick={() => !tab.disabled && handleTabChange(tab.id)}\n disabled={tab.disabled}\n className={cn(\n \"relative flex items-center gap-2 px-4 py-3 text-sm font-medium transition-colors whitespace-nowrap\",\n isActive\n ? \"text-primary\"\n : \"text-muted-foreground hover:text-foreground\",\n tab.disabled && \"opacity-50 cursor-not-allowed\"\n )}\n >\n {tab.icon && <span className=\"h-4 w-4\">{tab.icon}</span>}\n {tab.label}\n {isActive && (\n <span\n className=\"absolute bottom-0 left-0 right-0 h-0.5 bg-primary\"\n aria-hidden=\"true\"\n />\n )}\n </button>\n )\n })}\n </nav>\n </div>\n\n {/* Tab Content */}\n {children && <div>{children}</div>}\n </div>\n </SimpleTabsContext.Provider>\n )\n }\n)\nSimpleTabs.displayName = \"SimpleTabs\"\n\n// Tab Panel component\nconst SimpleTabsPanel = React.forwardRef<HTMLDivElement, SimpleTabsPanelProps>(\n ({ id, children, className }, ref) => {\n const { activeTab } = useSimpleTabs()\n\n if (activeTab !== id) return null\n\n return (\n <div\n ref={ref}\n role=\"tabpanel\"\n aria-labelledby={`tab-${id}`}\n className={className}\n >\n {children}\n </div>\n )\n }\n)\nSimpleTabsPanel.displayName = \"SimpleTabsPanel\"\n\n// Compound component for more flexible usage\nexport interface SimpleTabsRootProps {\n /** Currently active tab id */\n activeTab?: string\n /** Default active tab id (for uncontrolled mode) */\n defaultTab?: string\n /** Callback when tab changes */\n onTabChange?: (tabId: string) => void\n /** Children (SimpleTabsList and SimpleTabsPanel components) */\n children: React.ReactNode\n /** Custom className */\n className?: string\n}\n\nconst SimpleTabsRoot = React.forwardRef<HTMLDivElement, SimpleTabsRootProps>(\n (\n { activeTab: controlledActiveTab, defaultTab, onTabChange, children, className },\n ref\n ) => {\n const [internalActiveTab, setInternalActiveTab] = React.useState(\n defaultTab || \"\"\n )\n\n const activeTab = controlledActiveTab ?? internalActiveTab\n\n const handleTabChange = (tabId: string) => {\n setInternalActiveTab(tabId)\n onTabChange?.(tabId)\n }\n\n return (\n <SimpleTabsContext.Provider\n value={{ activeTab, setActiveTab: handleTabChange }}\n >\n <div ref={ref} className={cn(\"space-y-6\", className)}>\n {children}\n </div>\n </SimpleTabsContext.Provider>\n )\n }\n)\nSimpleTabsRoot.displayName = \"SimpleTabsRoot\"\n\n// Tabs List for compound component pattern\nexport interface SimpleTabsListProps {\n children: React.ReactNode\n className?: string\n}\n\nconst SimpleTabsList = React.forwardRef<HTMLDivElement, SimpleTabsListProps>(\n ({ children, className }, ref) => {\n return (\n <div\n ref={ref}\n className=\"border-b border-rds-gray-200 dark:border-rds-gray-800\"\n >\n <nav\n className={cn(\n \"-mb-px flex gap-1 overflow-x-auto scrollbar-hide\",\n className\n )}\n role=\"tablist\"\n aria-label=\"Tabs\"\n >\n {children}\n </nav>\n </div>\n )\n }\n)\nSimpleTabsList.displayName = \"SimpleTabsList\"\n\n// Tab Trigger for compound component pattern\nexport interface SimpleTabsTriggerProps {\n /** Tab id */\n value: string\n /** Tab content */\n children: React.ReactNode\n /** Tab icon */\n icon?: React.ReactNode\n /** Disabled state */\n disabled?: boolean\n /** Custom className */\n className?: string\n}\n\nconst SimpleTabsTrigger = React.forwardRef<\n HTMLButtonElement,\n SimpleTabsTriggerProps\n>(({ value, children, icon, disabled, className }, ref) => {\n const { activeTab, setActiveTab } = useSimpleTabs()\n const isActive = activeTab === value\n\n return (\n <button\n ref={ref}\n role=\"tab\"\n id={`tab-${value}`}\n aria-selected={isActive}\n aria-controls={`panel-${value}`}\n onClick={() => !disabled && setActiveTab(value)}\n disabled={disabled}\n className={cn(\n \"relative flex items-center gap-2 px-4 py-3 text-sm font-medium transition-colors whitespace-nowrap\",\n isActive\n ? \"text-primary\"\n : \"text-muted-foreground hover:text-foreground\",\n disabled && \"opacity-50 cursor-not-allowed\",\n className\n )}\n >\n {icon && <span className=\"h-4 w-4\">{icon}</span>}\n {children}\n {isActive && (\n <span\n className=\"absolute bottom-0 left-0 right-0 h-0.5 bg-primary\"\n aria-hidden=\"true\"\n />\n )}\n </button>\n )\n})\nSimpleTabsTrigger.displayName = \"SimpleTabsTrigger\"\n\n// Tab Content for compound component pattern\nconst SimpleTabsContent = React.forwardRef<\n HTMLDivElement,\n { value: string; children: React.ReactNode; className?: string }\n>(({ value, children, className }, ref) => {\n const { activeTab } = useSimpleTabs()\n\n if (activeTab !== value) return null\n\n return (\n <div\n ref={ref}\n role=\"tabpanel\"\n id={`panel-${value}`}\n aria-labelledby={`tab-${value}`}\n className={className}\n >\n {children}\n </div>\n )\n})\nSimpleTabsContent.displayName = \"SimpleTabsContent\"\n\nexport {\n SimpleTabs,\n SimpleTabsPanel,\n SimpleTabsRoot,\n SimpleTabsList,\n SimpleTabsTrigger,\n SimpleTabsContent,\n}\n","\"use client\";\n\n/**\n * MediaSurface — the shared shell used by VideoPlayer, RivePlayer,\n * and ThreeScene. Not exported publicly.\n *\n * Handles the surface area that's identical across all media types:\n * - aspect ratio / radius / border (driven by CSS variables for theming)\n * - loading skeleton\n * - intersection-observer (for pause-when-offscreen)\n * - reduced-motion query\n *\n * Design-system note: all visual dimensions are backed by CSS vars so\n * consumers can retheme via `--rds-media-radius`, `--rds-media-border`, etc.\n * (These will rename to `--gds-*` when the broader codebase rename lands.)\n */\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport type MediaAspect = \"video\" | \"square\" | \"portrait\" | \"wide\" | \"auto\";\nexport type MediaRadius = \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nconst aspectClass: Record<MediaAspect, string> = {\n video: \"aspect-video\",\n square: \"aspect-square\",\n portrait: \"aspect-[3/4]\",\n wide: \"aspect-[21/9]\",\n auto: \"\",\n};\n\nconst radiusVar: Record<MediaRadius, string> = {\n none: \"0\",\n sm: \"var(--radius, 0.25rem)\",\n md: \"calc(var(--radius, 0.375rem) * 1.25)\",\n lg: \"calc(var(--radius, 0.5rem) * 1.5)\",\n xl: \"calc(var(--radius, 0.75rem) * 2)\",\n};\n\nexport interface MediaSurfaceProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n aspect?: MediaAspect;\n radius?: MediaRadius;\n border?: boolean;\n loading?: boolean;\n /** Callback fires when the surface enters / leaves the viewport. */\n onVisibilityChange?: (visible: boolean) => void;\n /** Fallback shown before `onReady` is signalled by the child. */\n fallback?: React.ReactNode;\n children?: React.ReactNode;\n}\n\nexport const MediaSurface = React.forwardRef<HTMLDivElement, MediaSurfaceProps>(\n (\n {\n className,\n aspect = \"video\",\n radius = \"lg\",\n border = false,\n loading = false,\n onVisibilityChange,\n fallback,\n style,\n children,\n ...props\n },\n ref,\n ) => {\n const innerRef = React.useRef<HTMLDivElement | null>(null);\n\n // merge forwarded + internal refs\n React.useImperativeHandle(ref, () => innerRef.current as HTMLDivElement);\n\n React.useEffect(() => {\n if (!onVisibilityChange || !innerRef.current) return;\n const el = innerRef.current;\n const io = new IntersectionObserver(\n ([entry]) => onVisibilityChange(entry.isIntersecting),\n { threshold: 0.05 },\n );\n io.observe(el);\n return () => io.disconnect();\n }, [onVisibilityChange]);\n\n return (\n <div\n ref={innerRef}\n data-gds-part=\"media-surface\"\n className={cn(\n // `w-full` is the default so the surface fills its parent — without\n // it, a flex parent (e.g. items-center justify-center) collapses the\n // surface to the intrinsic width of its children, which for Rive /\n // WebGL canvases is 0. Override via `className=\"w-96\"` etc.\n \"rds-media-surface relative w-full overflow-hidden bg-muted\",\n aspectClass[aspect],\n border && \"border border-border\",\n className,\n )}\n style={{\n borderRadius: `var(--rds-media-radius, ${radiusVar[radius]})`,\n ...style,\n }}\n {...props}\n >\n {children}\n {loading && (\n <div\n className=\"absolute inset-0 flex items-center justify-center bg-muted animate-pulse\"\n aria-hidden\n >\n {fallback}\n </div>\n )}\n </div>\n );\n },\n);\nMediaSurface.displayName = \"MediaSurface\";\n\n/** Shared prop interface extended by each media primitive. */\nexport interface BaseMediaProps {\n /** src for the media — url or path. */\n src?: string;\n /** Show native-ish play/pause/scrubber controls. Default: `true` for video, `false` for Rive/three. */\n controls?: boolean;\n /** Autoplay when mounted (respects reduced-motion). */\n autoPlay?: boolean;\n /** Loop on end. */\n loop?: boolean;\n /** Pause rendering / playback when offscreen. Default `true` (big perf win for WebGL). */\n pauseOffscreen?: boolean;\n /** Aspect ratio of the surface. */\n aspect?: MediaAspect;\n /** Corner radius. */\n radius?: MediaRadius;\n /** Draw a subtle border around the surface. */\n border?: boolean;\n /** Poster / fallback image while loading. */\n poster?: string;\n /** Accessible label — used as `aria-label` on the surface. */\n label?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/** Hook — returns `true` when the OS reports reduced-motion preference. */\nexport function usePrefersReducedMotion(): boolean {\n const [reduced, setReduced] = React.useState(false);\n React.useEffect(() => {\n const mql = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n setReduced(mql.matches);\n const handler = (e: MediaQueryListEvent) => setReduced(e.matches);\n mql.addEventListener(\"change\", handler);\n return () => mql.removeEventListener(\"change\", handler);\n }, []);\n return reduced;\n}\n","\"use client\";\n\n/**\n * VideoPlayer — native HTML5 video wrapped in a MediaSurface.\n *\n * Modes:\n * controls={true} (default) — shows native video controls\n * controls={false} — bare viewer: hides chrome, muted autoplay/loop\n */\n\nimport * as React from \"react\";\nimport {\n MediaSurface,\n type BaseMediaProps,\n usePrefersReducedMotion,\n} from \"./media-surface\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface VideoPlayerProps extends BaseMediaProps {\n /** Mute audio. Required `true` if `autoPlay` (browser restriction). */\n muted?: boolean;\n /** Playback rate. Defaults to 1. */\n playbackRate?: number;\n /** Object-fit. Defaults to \"cover\" — matches typical hero/background use. */\n objectFit?: \"cover\" | \"contain\" | \"fill\";\n}\n\nexport const VideoPlayer = React.forwardRef<\n HTMLVideoElement,\n VideoPlayerProps\n>(\n (\n {\n src,\n controls = true,\n autoPlay = false,\n loop = false,\n muted,\n pauseOffscreen = true,\n aspect = \"video\",\n radius = \"lg\",\n border = false,\n poster,\n label,\n className,\n style,\n playbackRate = 1,\n objectFit = \"cover\",\n },\n ref,\n ) => {\n const videoRef = React.useRef<HTMLVideoElement | null>(null);\n const reduced = usePrefersReducedMotion();\n // Poster is rendered as a lazy-loaded <img> overlay rather than using the\n // native `poster` attribute, which fetches eagerly even when the video is\n // offscreen. We hide it once the video starts playing.\n const [posterVisible, setPosterVisible] = React.useState<boolean>(!!poster);\n\n React.useImperativeHandle(ref, () => videoRef.current as HTMLVideoElement);\n\n // autoplay must be muted unless consumer explicitly opted out\n const effectiveMuted = muted ?? autoPlay;\n const effectiveAutoPlay = autoPlay && !reduced;\n\n React.useEffect(() => {\n if (videoRef.current) videoRef.current.playbackRate = playbackRate;\n }, [playbackRate]);\n\n React.useEffect(() => {\n setPosterVisible(!!poster);\n }, [poster]);\n\n const handleVisibilityChange = React.useCallback(\n (visible: boolean) => {\n if (!pauseOffscreen || !videoRef.current) return;\n if (visible && effectiveAutoPlay) {\n videoRef.current.play().catch(() => {\n // autoplay blocked — leave paused\n });\n } else {\n videoRef.current.pause();\n }\n },\n [pauseOffscreen, effectiveAutoPlay],\n );\n\n return (\n <MediaSurface\n aspect={aspect}\n radius={radius}\n border={border}\n aria-label={label}\n className={className}\n style={style}\n onVisibilityChange={pauseOffscreen ? handleVisibilityChange : undefined}\n >\n <video\n ref={videoRef}\n src={src}\n controls={controls}\n autoPlay={effectiveAutoPlay}\n loop={loop}\n muted={effectiveMuted}\n playsInline\n preload={effectiveAutoPlay ? \"auto\" : \"metadata\"}\n onPlaying={() => setPosterVisible(false)}\n className={cn(\n \"w-full h-full\",\n objectFit === \"cover\" && \"object-cover\",\n objectFit === \"contain\" && \"object-contain\",\n objectFit === \"fill\" && \"object-fill\",\n )}\n >\n Your browser does not support the video tag.\n </video>\n {poster && posterVisible && (\n // Always lazy-loaded — the native `poster` attribute fetches\n // eagerly, which undoes the rest of our offscreen-pause work.\n // eslint-disable-next-line @next/next/no-img-element\n <img\n src={poster}\n alt=\"\"\n aria-hidden=\"true\"\n loading=\"lazy\"\n decoding=\"async\"\n data-gds-part=\"video-poster\"\n className={cn(\n \"absolute inset-0 w-full h-full pointer-events-none transition-opacity duration-200\",\n objectFit === \"cover\" && \"object-cover\",\n objectFit === \"contain\" && \"object-contain\",\n objectFit === \"fill\" && \"object-fill\",\n )}\n />\n )}\n </MediaSurface>\n );\n },\n);\nVideoPlayer.displayName = \"VideoPlayer\";\n","\"use client\";\n\n/**\n * RivePlayer — Rive runtime wrapped in a MediaSurface.\n *\n * The @rive-app/react-canvas dep is marked `optional` in package.json — this\n * component lazy-imports it so consumers who don't use Rive don't fail at\n * install time and don't pay the bundle cost unless they render one.\n *\n * Modes:\n * controls={true} — shows a small play/pause overlay\n * controls={false} (default) — bare viewer: zero chrome\n */\n\nimport * as React from \"react\";\nimport { Play, Pause } from \"lucide-react\";\nimport {\n MediaSurface,\n type BaseMediaProps,\n usePrefersReducedMotion,\n} from \"./media-surface\";\nimport { cn } from \"@/lib/utils\";\nimport { Button } from \"./button\";\n\nexport interface RivePlayerProps extends BaseMediaProps {\n /** State machine to run. */\n stateMachines?: string | string[];\n /** Artboard name — omit to use the default. */\n artboard?: string;\n /** Object-fit equivalent — how the art sits inside the surface. */\n fit?: \"contain\" | \"cover\" | \"fill\" | \"fitWidth\" | \"fitHeight\" | \"none\";\n /** Inputs to pass to the state machine. */\n stateMachineInputs?: Record<string, number | boolean | string>;\n}\n\nexport const RivePlayer = React.forwardRef<HTMLDivElement, RivePlayerProps>(\n (\n {\n src,\n controls = false,\n autoPlay = true,\n loop = true,\n pauseOffscreen = true,\n aspect = \"square\",\n radius = \"lg\",\n border = false,\n poster,\n label,\n className,\n style,\n stateMachines,\n artboard,\n fit = \"contain\",\n stateMachineInputs,\n },\n ref,\n ) => {\n const reduced = usePrefersReducedMotion();\n const [Mod, setMod] = React.useState<\n typeof import(\"@rive-app/react-canvas\") | null\n >(null);\n const [error, setError] = React.useState<string | null>(null);\n\n React.useEffect(() => {\n let cancelled = false;\n import(\"@rive-app/react-canvas\")\n .then((m) => {\n if (!cancelled) setMod(m);\n })\n .catch(() => {\n if (!cancelled)\n setError(\n \"Rive runtime not installed. Run `npm install @rive-app/react-canvas`.\",\n );\n });\n return () => {\n cancelled = true;\n };\n }, []);\n\n return (\n <MediaSurface\n ref={ref}\n aspect={aspect}\n radius={radius}\n border={border}\n aria-label={label}\n className={className}\n style={style}\n >\n {error ? (\n <div className=\"flex items-center justify-center h-full text-sm text-muted-foreground p-4 text-center\">\n {error}\n </div>\n ) : Mod && src ? (\n <RiveInner\n Mod={Mod}\n src={src}\n stateMachines={stateMachines}\n artboard={artboard}\n fit={fit}\n stateMachineInputs={stateMachineInputs}\n autoPlay={autoPlay && !reduced}\n loop={loop}\n pauseOffscreen={pauseOffscreen}\n controls={controls}\n poster={poster}\n />\n ) : (\n poster && (\n // eslint-disable-next-line @next/next/no-img-element\n <img\n src={poster}\n alt=\"\"\n className=\"w-full h-full object-contain\"\n />\n )\n )}\n </MediaSurface>\n );\n },\n);\nRivePlayer.displayName = \"RivePlayer\";\n\ninterface InnerProps {\n Mod: typeof import(\"@rive-app/react-canvas\");\n src: string;\n stateMachines?: string | string[];\n artboard?: string;\n fit: NonNullable<RivePlayerProps[\"fit\"]>;\n stateMachineInputs?: Record<string, number | boolean | string>;\n autoPlay: boolean;\n loop: boolean;\n pauseOffscreen: boolean;\n controls: boolean;\n poster?: string;\n}\n\nfunction RiveInner({\n Mod,\n src,\n stateMachines,\n artboard,\n fit,\n autoPlay,\n loop,\n pauseOffscreen,\n controls,\n poster,\n}: InnerProps) {\n const { useRive, Layout, Fit, Alignment, EventType } = Mod;\n\n const fitMap: Record<string, unknown> = {\n contain: Fit.Contain,\n cover: Fit.Cover,\n fill: Fit.Fill,\n fitWidth: Fit.FitWidth,\n fitHeight: Fit.FitHeight,\n none: Fit.None,\n };\n\n const { rive, RiveComponent } = useRive({\n src,\n stateMachines,\n artboard,\n autoplay: autoPlay,\n layout: new Layout({\n fit: fitMap[fit] as never,\n alignment: Alignment.Center,\n }),\n });\n\n const [playing, setPlaying] = React.useState(autoPlay);\n\n // The Rive instance has no `loop` setter — animations carry their loop mode\n // in the .riv file itself. To force-loop from a prop we listen for Stop and\n // replay. No-op if the file already loops (Stop never fires).\n React.useEffect(() => {\n if (!rive || !loop) return;\n const handler = () => {\n rive.play();\n };\n rive.on(EventType.Stop, handler);\n return () => {\n rive.off(EventType.Stop, handler);\n };\n }, [rive, loop, EventType]);\n\n // pause-when-offscreen\n React.useEffect(() => {\n if (!pauseOffscreen || !rive) return;\n const target = (rive as unknown as { canvas?: HTMLCanvasElement }).canvas;\n if (!target) return;\n const io = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting && autoPlay) rive.play();\n else rive.pause();\n },\n { threshold: 0.05 },\n );\n io.observe(target);\n return () => io.disconnect();\n }, [rive, pauseOffscreen, autoPlay]);\n\n const togglePlay = () => {\n if (!rive) return;\n if (playing) {\n rive.pause();\n setPlaying(false);\n } else {\n rive.play();\n setPlaying(true);\n }\n };\n\n return (\n <>\n <RiveComponent className=\"w-full h-full\" />\n {!rive && poster && (\n // eslint-disable-next-line @next/next/no-img-element\n <img\n src={poster}\n alt=\"\"\n className=\"absolute inset-0 w-full h-full object-contain pointer-events-none\"\n />\n )}\n {controls && (\n <div\n className={cn(\n \"absolute inset-0 flex items-end justify-end p-2\",\n \"opacity-0 hover:opacity-100 transition-opacity\",\n \"bg-gradient-to-t from-black/40 to-transparent\",\n )}\n >\n <Button size=\"icon\" variant=\"secondary\" onClick={togglePlay}>\n {playing ? <Pause className=\"h-4 w-4\" /> : <Play className=\"h-4 w-4\" />}\n </Button>\n </div>\n )}\n </>\n );\n}\n","/**\n * Post-FX composer factory.\n *\n * Wraps a three.js scene in an EffectComposer with a configurable stack\n * of effects: bloom, film grain, scanlines, vignette, chromatic aberration,\n * glitch. Effects are toggled in/out based on what the preset declares.\n */\n\nimport * as THREE from \"three\";\nimport {\n EffectComposer,\n RenderPass,\n EffectPass,\n BloomEffect,\n NoiseEffect,\n ScanlineEffect,\n VignetteEffect,\n ChromaticAberrationEffect,\n GlitchEffect,\n BlendFunction,\n KernelSize,\n} from \"postprocessing\";\nimport type { PostPreset, PostComposerFactory } from \"./types\";\n\nexport const createPostComposer: PostComposerFactory = ({\n renderer,\n scene,\n camera,\n preset,\n width,\n height,\n}) => {\n const composer = new EffectComposer(renderer);\n composer.setSize(width, height);\n composer.addPass(new RenderPass(scene, camera));\n\n // Effects are instantiated once; `setPreset` mutates their params.\n const bloom = new BloomEffect({\n intensity: 0,\n luminanceThreshold: 0.6,\n radius: 0.6,\n kernelSize: KernelSize.MEDIUM,\n });\n const noise = new NoiseEffect({\n blendFunction: BlendFunction.OVERLAY,\n });\n noise.blendMode.opacity.value = 0;\n\n const scanlines = new ScanlineEffect({\n blendFunction: BlendFunction.OVERLAY,\n density: 1.25,\n });\n scanlines.blendMode.opacity.value = 0;\n\n const vignette = new VignetteEffect({\n darkness: 0,\n offset: 0.5,\n });\n\n const chromatic = new ChromaticAberrationEffect({\n offset: new THREE.Vector2(0, 0),\n radialModulation: false,\n modulationOffset: 0.15,\n });\n\n const glitch = new GlitchEffect({\n chromaticAberrationOffset: new THREE.Vector2(0, 0),\n columns: 0.05,\n });\n glitch.minStrength = 0;\n glitch.maxStrength = 0;\n\n // Passes must separate convolution effects (Bloom) from UV-transforming\n // effects (Chromatic Aberration, Glitch). The library throws at construction\n // time if these mix. Four passes keeps everything happy.\n composer.addPass(new EffectPass(camera, bloom));\n composer.addPass(new EffectPass(camera, noise, scanlines, vignette));\n composer.addPass(new EffectPass(camera, chromatic));\n composer.addPass(new EffectPass(camera, glitch));\n\n function applyPreset(p: PostPreset) {\n const e = p.effects;\n\n bloom.intensity = e.bloom?.intensity ?? 0;\n if (bloom.luminanceMaterial && e.bloom?.luminanceThreshold !== undefined) {\n bloom.luminanceMaterial.threshold = e.bloom.luminanceThreshold;\n }\n\n noise.blendMode.opacity.value = e.noise?.intensity ?? 0;\n\n scanlines.density = e.scanlines?.density ?? 1.25;\n scanlines.blendMode.opacity.value = e.scanlines?.opacity ?? 0;\n\n vignette.darkness = e.vignette?.darkness ?? 0;\n vignette.offset = e.vignette?.offset ?? 0.5;\n\n const chromaOffset = e.chromatic?.offset ?? 0;\n chromatic.offset?.set(chromaOffset, chromaOffset);\n\n if (e.glitch) {\n glitch.minStrength = e.glitch.strength?.[0] ?? 0;\n glitch.maxStrength = e.glitch.strength?.[1] ?? 0;\n } else {\n glitch.minStrength = 0;\n glitch.maxStrength = 0;\n }\n }\n\n applyPreset(preset);\n\n return {\n composer,\n setPreset: applyPreset,\n resize: (w, h) => composer.setSize(w, h),\n dispose: () => {\n composer.dispose();\n },\n };\n};\n","/**\n * \"space\" scene — hyperspace starfield.\n *\n * Thousands of point-lines streaking past the camera in perspective.\n * Maps `primary` → core, `accent` → streak tail, `background` → clear color.\n * Shines under the VHS + Cinematic post presets (bloom + afterimage).\n */\n\nimport * as THREE from \"three\";\nimport type { SceneFactory, Palette } from \"../types\";\n\nconst STAR_COUNT = 3000;\nconst FIELD_DEPTH = 400;\nconst FIELD_RADIUS = 80;\n\nexport const spaceScene: SceneFactory = ({ width, height, palette }) => {\n const scene = new THREE.Scene();\n scene.background = new THREE.Color(palette.background);\n\n const camera = new THREE.PerspectiveCamera(\n 70,\n width / height,\n 0.1,\n FIELD_DEPTH * 2,\n );\n camera.position.z = 0;\n\n // Each star is a short line-segment from tail to head along +Z.\n const positions = new Float32Array(STAR_COUNT * 6); // 2 points per segment\n const colors = new Float32Array(STAR_COUNT * 6);\n const zOffsets = new Float32Array(STAR_COUNT);\n\n const primaryColor = new THREE.Color(palette.primary);\n const accentColor = new THREE.Color(palette.accent);\n\n function resetStar(i: number, randomZ: boolean) {\n // Radial distribution — denser near centre for a tunnel feel.\n const theta = Math.random() * Math.PI * 2;\n const r = FIELD_RADIUS * Math.pow(Math.random(), 0.6);\n const x = Math.cos(theta) * r;\n const y = Math.sin(theta) * r;\n const z = randomZ\n ? -Math.random() * FIELD_DEPTH\n : -FIELD_DEPTH;\n\n zOffsets[i] = z;\n\n // head\n positions[i * 6 + 0] = x;\n positions[i * 6 + 1] = y;\n positions[i * 6 + 2] = z;\n // tail — short streak, will grow at runtime based on speed\n positions[i * 6 + 3] = x;\n positions[i * 6 + 4] = y;\n positions[i * 6 + 5] = z - 2;\n\n // head = primary (bright core), tail = accent fading\n colors[i * 6 + 0] = primaryColor.r;\n colors[i * 6 + 1] = primaryColor.g;\n colors[i * 6 + 2] = primaryColor.b;\n colors[i * 6 + 3] = accentColor.r;\n colors[i * 6 + 4] = accentColor.g;\n colors[i * 6 + 5] = accentColor.b;\n }\n\n for (let i = 0; i < STAR_COUNT; i++) resetStar(i, true);\n\n const geometry = new THREE.BufferGeometry();\n geometry.setAttribute(\"position\", new THREE.BufferAttribute(positions, 3));\n geometry.setAttribute(\"color\", new THREE.BufferAttribute(colors, 3));\n\n const material = new THREE.LineBasicMaterial({\n vertexColors: true,\n transparent: true,\n opacity: 0.95,\n blending: THREE.AdditiveBlending,\n });\n\n const stars = new THREE.LineSegments(geometry, material);\n scene.add(stars);\n\n const SPEED = 60; // units per second\n const STREAK_LEN = 6;\n\n return {\n scene,\n camera,\n update: (_elapsed, delta) => {\n const pos = geometry.attributes.position.array as Float32Array;\n\n for (let i = 0; i < STAR_COUNT; i++) {\n const baseIdx = i * 6;\n // advance head Z\n pos[baseIdx + 2] += SPEED * delta;\n // keep tail behind the head by STREAK_LEN\n pos[baseIdx + 5] = pos[baseIdx + 2] - STREAK_LEN;\n\n // recycle past the camera\n if (pos[baseIdx + 2] > 5) {\n resetStar(i, false);\n }\n }\n\n geometry.attributes.position.needsUpdate = true;\n },\n resize: (w, h) => {\n const cam = camera as THREE.PerspectiveCamera;\n cam.aspect = w / h;\n cam.updateProjectionMatrix();\n },\n setPalette: (palette: Palette) => {\n scene.background = new THREE.Color(palette.background);\n const primary = new THREE.Color(palette.primary);\n const accent = new THREE.Color(palette.accent);\n const col = geometry.attributes.color.array as Float32Array;\n for (let i = 0; i < STAR_COUNT; i++) {\n col[i * 6 + 0] = primary.r;\n col[i * 6 + 1] = primary.g;\n col[i * 6 + 2] = primary.b;\n col[i * 6 + 3] = accent.r;\n col[i * 6 + 4] = accent.g;\n col[i * 6 + 5] = accent.b;\n }\n geometry.attributes.color.needsUpdate = true;\n },\n dispose: () => {\n geometry.dispose();\n material.dispose();\n },\n };\n};\n","/**\n * \"plasma\" scene — classic demoscene plasma field.\n *\n * Fullscreen-quad fragment shader. Overlapping sine waves modulate a palette\n * ramp, producing soft rolling colour clouds. Cheap on GPU — every pixel\n * runs a handful of sin() calls per frame, no geometry to speak of.\n *\n * Maps `background` → darkest end, `secondary` → midtone, `primary` → highlight,\n * `accent` → speckle tint. Works beautifully under Synthwave or Cinematic post-FX.\n */\n\nimport * as THREE from \"three\";\nimport type { SceneFactory, SceneHandle, Palette } from \"../types\";\n\nconst FRAGMENT = /* glsl */ `\n precision highp float;\n varying vec2 vUv;\n uniform float uTime;\n uniform vec2 uResolution;\n uniform vec3 uBackground;\n uniform vec3 uPrimary;\n uniform vec3 uSecondary;\n uniform vec3 uAccent;\n\n // 3-stop palette ramp driven by a scalar in [0,1].\n vec3 palette(float t) {\n t = clamp(t, 0.0, 1.0);\n vec3 lo = mix(uBackground, uSecondary, smoothstep(0.0, 0.5, t));\n vec3 hi = mix(uSecondary, uPrimary, smoothstep(0.5, 1.0, t));\n return mix(lo, hi, step(0.5, t));\n }\n\n void main() {\n // Normalise to centre-origin coords, preserving aspect.\n vec2 uv = (vUv - 0.5) * (uResolution.xy / min(uResolution.x, uResolution.y)) * 4.0;\n\n float t = uTime * 0.35;\n float v = 0.0;\n v += sin(uv.x * 1.2 + t);\n v += sin(uv.y * 1.6 + t * 1.3);\n v += sin((uv.x + uv.y) * 1.1 + t * 0.7);\n v += sin(length(uv) * 2.4 - t * 0.9);\n v = v * 0.125 + 0.5; // remap from [-4,4] → [0,1]\n\n vec3 col = palette(v);\n\n // Subtle accent shimmer along diagonal.\n float shimmer = sin((uv.x - uv.y) * 3.0 + uTime * 1.5) * 0.5 + 0.5;\n col = mix(col, uAccent, shimmer * 0.08);\n\n gl_FragColor = vec4(col, 1.0);\n }\n`;\n\nconst VERTEX = /* glsl */ `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = vec4(position.xy, 0.0, 1.0);\n }\n`;\n\nexport const plasmaScene: SceneFactory = ({ width, height, palette }) => {\n const scene = new THREE.Scene();\n const camera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1);\n\n const uniforms = {\n uTime: { value: 0 },\n uResolution: { value: new THREE.Vector2(width, height) },\n uBackground: { value: new THREE.Color(palette.background) },\n uPrimary: { value: new THREE.Color(palette.primary) },\n uSecondary: { value: new THREE.Color(palette.secondary) },\n uAccent: { value: new THREE.Color(palette.accent) },\n };\n\n const material = new THREE.ShaderMaterial({\n uniforms,\n vertexShader: VERTEX,\n fragmentShader: FRAGMENT,\n depthTest: false,\n depthWrite: false,\n });\n\n const geometry = new THREE.PlaneGeometry(2, 2);\n const quad = new THREE.Mesh(geometry, material);\n scene.add(quad);\n\n const handle: SceneHandle = {\n scene,\n camera,\n update: (elapsed) => {\n uniforms.uTime.value = elapsed;\n },\n resize: (w, h) => {\n uniforms.uResolution.value.set(w, h);\n },\n setPalette: (p: Palette) => {\n uniforms.uBackground.value.set(p.background);\n uniforms.uPrimary.value.set(p.primary);\n uniforms.uSecondary.value.set(p.secondary);\n uniforms.uAccent.value.set(p.accent);\n },\n dispose: () => {\n geometry.dispose();\n material.dispose();\n },\n };\n\n return handle;\n};\n","/**\n * \"voronoi\" scene — animated Voronoi cells.\n *\n * Fullscreen-quad fragment shader. A jittered grid where each cell's seed\n * point orbits slowly over time; pixels colour by their distance to the\n * nearest seed and by which cell they fall inside. Cell edges pulse in the\n * accent colour.\n *\n * Maps `background` → cell interiors, `primary` → cell fills, `secondary` → depth tint,\n * `accent` → edge glow. Looks great under CRT or VHS post-FX.\n */\n\nimport * as THREE from \"three\";\nimport type { SceneFactory, SceneHandle, Palette } from \"../types\";\n\nconst VERTEX = /* glsl */ `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = vec4(position.xy, 0.0, 1.0);\n }\n`;\n\nconst FRAGMENT = /* glsl */ `\n precision highp float;\n varying vec2 vUv;\n uniform float uTime;\n uniform vec2 uResolution;\n uniform vec3 uBackground;\n uniform vec3 uPrimary;\n uniform vec3 uSecondary;\n uniform vec3 uAccent;\n\n // Cheap 2D hash → vec2 in [0,1].\n vec2 hash2(vec2 p) {\n p = vec2(\n dot(p, vec2(127.1, 311.7)),\n dot(p, vec2(269.5, 183.3))\n );\n return fract(sin(p) * 43758.5453);\n }\n\n void main() {\n vec2 uv = vUv * (uResolution.xy / min(uResolution.x, uResolution.y)) * 6.0;\n\n vec2 ipos = floor(uv);\n vec2 fpos = fract(uv);\n\n float minDist = 1e9;\n float secondDist = 1e9;\n vec2 closestCell = vec2(0.0);\n\n for (int y = -1; y <= 1; y++) {\n for (int x = -1; x <= 1; x++) {\n vec2 neighbour = vec2(float(x), float(y));\n vec2 seed = hash2(ipos + neighbour);\n // Orbit each seed around its cell centre for gentle motion.\n vec2 offset = 0.5 + 0.5 * sin(uTime * 0.5 + seed * 6.283);\n vec2 diff = neighbour + offset - fpos;\n float d = dot(diff, diff);\n if (d < minDist) {\n secondDist = minDist;\n minDist = d;\n closestCell = ipos + neighbour;\n } else if (d < secondDist) {\n secondDist = d;\n }\n }\n }\n\n float cellShade = hash2(closestCell).x; // per-cell random 0..1\n float edge = sqrt(secondDist) - sqrt(minDist); // 0 at borders, grows inward\n float edgeGlow = 1.0 - smoothstep(0.0, 0.08, edge);\n\n vec3 fill = mix(uBackground, uPrimary, cellShade);\n fill = mix(fill, uSecondary, 0.25 * sin(uTime * 0.3 + cellShade * 6.28) + 0.25);\n vec3 col = mix(fill, uAccent, edgeGlow);\n\n gl_FragColor = vec4(col, 1.0);\n }\n`;\n\nexport const voronoiScene: SceneFactory = ({ width, height, palette }) => {\n const scene = new THREE.Scene();\n const camera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1);\n\n const uniforms = {\n uTime: { value: 0 },\n uResolution: { value: new THREE.Vector2(width, height) },\n uBackground: { value: new THREE.Color(palette.background) },\n uPrimary: { value: new THREE.Color(palette.primary) },\n uSecondary: { value: new THREE.Color(palette.secondary) },\n uAccent: { value: new THREE.Color(palette.accent) },\n };\n\n const material = new THREE.ShaderMaterial({\n uniforms,\n vertexShader: VERTEX,\n fragmentShader: FRAGMENT,\n depthTest: false,\n depthWrite: false,\n });\n\n const geometry = new THREE.PlaneGeometry(2, 2);\n const quad = new THREE.Mesh(geometry, material);\n scene.add(quad);\n\n const handle: SceneHandle = {\n scene,\n camera,\n update: (elapsed) => {\n uniforms.uTime.value = elapsed;\n },\n resize: (w, h) => {\n uniforms.uResolution.value.set(w, h);\n },\n setPalette: (p: Palette) => {\n uniforms.uBackground.value.set(p.background);\n uniforms.uPrimary.value.set(p.primary);\n uniforms.uSecondary.value.set(p.secondary);\n uniforms.uAccent.value.set(p.accent);\n },\n dispose: () => {\n geometry.dispose();\n material.dispose();\n },\n };\n\n return handle;\n};\n","/**\n * \"synthwave\" scene — retro-future grid with sun.\n *\n * Fullscreen-quad fragment shader that paints a perspective grid receding\n * to a horizon, a banded sun disc above it, and a soft sky gradient.\n * Chose fragment-only over real perspective geometry so the aspect ratio\n * adapts cleanly and there's nothing to dispose on resize.\n *\n * Maps `background` → sky base, `primary` → grid lines + sun bands,\n * `secondary` → sky fade, `accent` → horizon glow. Shines under Synthwave\n * or VHS post-FX.\n */\n\nimport * as THREE from \"three\";\nimport type { SceneFactory, SceneHandle, Palette } from \"../types\";\n\nconst VERTEX = /* glsl */ `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = vec4(position.xy, 0.0, 1.0);\n }\n`;\n\nconst FRAGMENT = /* glsl */ `\n precision highp float;\n varying vec2 vUv;\n uniform float uTime;\n uniform vec3 uBackground;\n uniform vec3 uPrimary;\n uniform vec3 uSecondary;\n uniform vec3 uAccent;\n\n // Horizon at y = 0.45 (upper band for sky + sun, lower band for grid).\n const float HORIZON = 0.45;\n\n // Perspective-projected grid in the lower half.\n // Returns grid intensity in [0,1].\n float grid(vec2 uv) {\n // Perspective: nearer rows get larger spacing. z grows as we go toward horizon.\n float z = 1.0 / max(uv.y, 0.001); // uv.y ∈ (0, HORIZON]\n vec2 gpos = vec2(uv.x * z, z - uTime * 2.0); // scroll lines toward camera\n\n vec2 g = fract(gpos * vec2(1.0, 0.25));\n vec2 lw = fwidth(gpos * vec2(1.0, 0.25)) * 1.5; // anti-aliased line width\n vec2 lines = smoothstep(vec2(0.0), lw, g)\n - smoothstep(1.0 - lw, vec2(1.0), g);\n // \"lines\" is ~1 between lines, ~0 on a line → invert.\n float l = 1.0 - min(lines.x, lines.y);\n\n // Fade grid as it approaches horizon (z → ∞ means very far).\n float fade = clamp(1.0 - z * 0.02, 0.0, 1.0);\n return l * fade;\n }\n\n void main() {\n vec2 uv = vUv - vec2(0.5, HORIZON);\n\n vec3 col;\n\n if (vUv.y >= HORIZON) {\n // Sky half.\n float skyT = (vUv.y - HORIZON) / (1.0 - HORIZON);\n col = mix(uBackground, uSecondary, skyT);\n\n // Sun disc — centred above horizon with horizontal bands.\n vec2 sunUv = uv;\n sunUv.y -= 0.05;\n float d = length(sunUv * vec2(1.0, 1.2));\n float disc = smoothstep(0.22, 0.21, d);\n // Horizontal bands across the lower half of the sun.\n float bandY = (sunUv.y - 0.05) * 25.0;\n float bands = step(0.0, sin(bandY));\n float bandMask = smoothstep(0.05, -0.05, sunUv.y); // only bands below sun centre\n disc *= mix(1.0, bands, bandMask);\n col = mix(col, uPrimary, disc);\n\n // Horizon glow.\n float glow = smoothstep(0.08, 0.0, vUv.y - HORIZON);\n col = mix(col, uAccent, glow * 0.6);\n } else {\n // Ground half.\n float floorUv = HORIZON - vUv.y; // 0 at horizon, grows down\n float g = grid(vec2(uv.x, floorUv));\n vec3 ground = mix(uBackground * 0.3, uBackground * 0.7, floorUv / HORIZON);\n col = mix(ground, uPrimary, g);\n\n // Horizon glow bleeding into ground.\n float glow = smoothstep(0.06, 0.0, floorUv);\n col = mix(col, uAccent, glow * 0.8);\n }\n\n gl_FragColor = vec4(col, 1.0);\n }\n`;\n\nexport const synthwaveScene: SceneFactory = ({ palette }) => {\n const scene = new THREE.Scene();\n const camera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1);\n\n const uniforms = {\n uTime: { value: 0 },\n uBackground: { value: new THREE.Color(palette.background) },\n uPrimary: { value: new THREE.Color(palette.primary) },\n uSecondary: { value: new THREE.Color(palette.secondary) },\n uAccent: { value: new THREE.Color(palette.accent) },\n };\n\n const material = new THREE.ShaderMaterial({\n uniforms,\n vertexShader: VERTEX,\n fragmentShader: FRAGMENT,\n depthTest: false,\n depthWrite: false,\n });\n\n const geometry = new THREE.PlaneGeometry(2, 2);\n const quad = new THREE.Mesh(geometry, material);\n scene.add(quad);\n\n const handle: SceneHandle = {\n scene,\n camera,\n update: (elapsed) => {\n uniforms.uTime.value = elapsed;\n },\n setPalette: (p: Palette) => {\n uniforms.uBackground.value.set(p.background);\n uniforms.uPrimary.value.set(p.primary);\n uniforms.uSecondary.value.set(p.secondary);\n uniforms.uAccent.value.set(p.accent);\n },\n dispose: () => {\n geometry.dispose();\n material.dispose();\n },\n };\n\n return handle;\n};\n","/**\n * Shader preset registry — maps semantic preset ids to scene factories\n * plus metadata for the picker UI.\n *\n * Adding a new preset:\n * 1. Write a SceneFactory in `./scenes/<name>.ts`\n * 2. Register it in `sceneRegistry` below\n * 3. Add a `ShaderPreset` entry in `shaderPresets`\n *\n * Both `<ThreeScene preset=\"space\" />` and `<ShaderPresetPicker />` read\n * from this registry so they stay in lockstep.\n */\n\nimport type { ShaderPreset, SceneFactory } from \"./types\";\nimport { spaceScene } from \"./scenes/space\";\nimport { plasmaScene } from \"./scenes/plasma\";\nimport { voronoiScene } from \"./scenes/voronoi\";\nimport { synthwaveScene } from \"./scenes/synthwave\";\n\nexport const sceneRegistry: Record<string, SceneFactory> = {\n space: spaceScene,\n plasma: plasmaScene,\n voronoi: voronoiScene,\n synthwave: synthwaveScene,\n // Further candidates: icosa, oscilloscope, retro-sunset, sdf\n};\n\nexport const shaderPresets: ShaderPreset[] = [\n {\n id: \"space\",\n label: \"Hyperspace\",\n description:\n \"Classic 'jump to hyperspace' — streaking stars flying past camera. Pairs well with VHS or Cinematic post-FX.\",\n tags: [\"space\", \"retro\", \"motion\", \"hero\", \"background\"],\n scene: \"space\",\n defaultPostPreset: \"vhs\",\n },\n {\n id: \"plasma\",\n label: \"Plasma\",\n description:\n \"Soft rolling colour clouds — overlapping sines warping a palette ramp. Classic demoscene vibe. Pairs well with Synthwave or Cinematic.\",\n tags: [\"abstract\", \"soft\", \"ambient\", \"hero\", \"background\", \"gradient\"],\n scene: \"plasma\",\n defaultPostPreset: \"synthwave\",\n },\n {\n id: \"voronoi\",\n label: \"Voronoi\",\n description:\n \"Jittered cellular grid — orbiting seed points form animated cells with glowing edges. Great for data / organic / network moods. Pairs well with CRT or VHS.\",\n tags: [\"abstract\", \"cells\", \"organic\", \"network\", \"hero\", \"background\"],\n scene: \"voronoi\",\n defaultPostPreset: \"crt\",\n },\n {\n id: \"synthwave\",\n label: \"Synthwave Grid\",\n description:\n \"Retro-future perspective grid receding to a banded sun disc on the horizon. Pairs beautifully with the Synthwave post preset (its namesake).\",\n tags: [\"retro\", \"synthwave\", \"80s\", \"hero\", \"background\", \"grid\", \"sun\"],\n scene: \"synthwave\",\n defaultPostPreset: \"synthwave\",\n },\n];\n\nexport const shaderPresetById = Object.fromEntries(\n shaderPresets.map((p) => [p.id, p]),\n) as Record<string, ShaderPreset>;\n\nexport type ShaderPresetId = (typeof shaderPresets)[number][\"id\"];\n","/**\n * Post-FX preset registry.\n *\n * Each preset is a tunable description of the post-FX stack. Lives as data\n * so the same registry drives `<ThreeScene postPreset=\"vhs\" />` and the\n * preset picker's preview thumbnails.\n */\n\nimport type { PostPreset } from \"./types\";\n\nexport const postPresets: Record<string, PostPreset> = {\n none: {\n id: \"none\",\n label: \"Clean\",\n effects: {},\n },\n vhs: {\n id: \"vhs\",\n label: \"VHS\",\n effects: {\n bloom: { intensity: 0.35, luminanceThreshold: 0.5, radius: 0.7 },\n noise: { intensity: 0.04 }, // dialled down per user feedback\n scanlines: { density: 1.5, opacity: 0.12 },\n vignette: { darkness: 0.4, offset: 0.45 },\n chromatic: { offset: 0.0015 },\n },\n },\n cinematic: {\n id: \"cinematic\",\n label: \"Cinematic\",\n effects: {\n bloom: { intensity: 0.5, luminanceThreshold: 0.55, radius: 0.8 },\n vignette: { darkness: 0.5, offset: 0.5 },\n },\n },\n synthwave: {\n id: \"synthwave\",\n label: \"Synthwave\",\n effects: {\n bloom: { intensity: 0.8, luminanceThreshold: 0.3, radius: 0.9 },\n chromatic: { offset: 0.002 },\n vignette: { darkness: 0.3, offset: 0.55 },\n },\n },\n crt: {\n id: \"crt\",\n label: \"CRT\",\n effects: {\n bloom: { intensity: 0.2, luminanceThreshold: 0.7, radius: 0.4 },\n scanlines: { density: 2.0, opacity: 0.25 },\n vignette: { darkness: 0.6, offset: 0.4 },\n chromatic: { offset: 0.0025 },\n },\n },\n};\n\nexport type PostPresetId = keyof typeof postPresets;\n\nexport const defaultPostPreset: PostPresetId = \"vhs\";\n","/**\n * Custom fragment shader scene — runs a user-supplied GLSL fragment shader\n * on a fullscreen quad with a standardised uniform set.\n *\n * This is the \"write me a shader from a prompt\" surface. Instead of asking\n * an LLM to author a full three.js SceneFactory (imports, geometry, etc.),\n * it only has to write `void main()` against a known uniform contract.\n *\n * The uniforms ARE the design contract — mirror the same palette slots\n * that presets use, so custom shaders pick up theming for free.\n */\n\nimport * as THREE from \"three\";\nimport type { SceneFactory, SceneHandle, Palette } from \"./types\";\n\n/**\n * Auto-injected prelude — defines every uniform and varying the user's\n * fragment can reference. Users should NOT redeclare these. Their shader\n * source is appended verbatim to this header.\n *\n * Kept as glsl100 (varying / gl_FragColor) since that's the syntax\n * dominant in LLM training data; three.js auto-upgrades it for WebGL2.\n */\nexport const FRAGMENT_HEADER = /* glsl */ `\n precision highp float;\n varying vec2 vUv;\n uniform float uTime;\n uniform vec2 uResolution;\n uniform vec2 uMouse;\n uniform vec3 uPrimary;\n uniform vec3 uSecondary;\n uniform vec3 uAccent;\n uniform vec3 uBackground;\n`;\n\nconst VERTEX_FULLSCREEN = /* glsl */ `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = vec4(position.xy, 0.0, 1.0);\n }\n`;\n\n/**\n * Thrown when the user's fragment shader fails to compile. Carries both the\n * GL info log and the original source so callers can surface it or fall back.\n */\nexport class ShaderCompileError extends Error {\n readonly log: string;\n readonly source: string;\n constructor(log: string, source: string) {\n super(`Fragment shader failed to compile:\\n${log.trim()}`);\n this.name = \"ShaderCompileError\";\n this.log = log;\n this.source = source;\n }\n}\n\n/**\n * Pre-compile a fragment shader against the renderer's live GL context so we\n * can surface errors BEFORE attaching the material to a scene. three.js's own\n * compile path logs to console and silently renders black — not what we want\n * when the user expects either a working shader or a clear fallback.\n */\nfunction precompileFragment(renderer: THREE.WebGLRenderer, source: string): void {\n const gl = renderer.getContext() as WebGLRenderingContext | WebGL2RenderingContext;\n const shader = gl.createShader(gl.FRAGMENT_SHADER);\n if (!shader) throw new Error(\"Unable to allocate fragment shader\");\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n const ok = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n const log = gl.getShaderInfoLog(shader) || \"\";\n gl.deleteShader(shader);\n if (!ok) throw new ShaderCompileError(log, source);\n}\n\n/**\n * Build a SceneFactory from a user-supplied fragment shader body.\n *\n * Throws `ShaderCompileError` synchronously (from the SceneContext call) if\n * the GLSL doesn't compile. ThreeScene catches this and falls back to\n * `preset=\"space\"` so the UI stays populated.\n */\nexport function buildFragmentShaderScene(userFragment: string): SceneFactory {\n return ({ renderer, width, height, palette }) => {\n const combined = `${FRAGMENT_HEADER}\\n${userFragment}`;\n\n // Surfaces compile errors up to the caller with the GL info log attached.\n precompileFragment(renderer, combined);\n\n const scene = new THREE.Scene();\n const camera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1);\n\n const uniforms: Record<string, THREE.IUniform> = {\n uTime: { value: 0 },\n uResolution: { value: new THREE.Vector2(width, height) },\n uMouse: { value: new THREE.Vector2(0.5, 0.5) },\n uPrimary: { value: new THREE.Color(palette.primary) },\n uSecondary: { value: new THREE.Color(palette.secondary) },\n uAccent: { value: new THREE.Color(palette.accent) },\n uBackground: { value: new THREE.Color(palette.background) },\n };\n\n const material = new THREE.ShaderMaterial({\n uniforms,\n vertexShader: VERTEX_FULLSCREEN,\n fragmentShader: combined,\n depthTest: false,\n depthWrite: false,\n });\n\n const geometry = new THREE.PlaneGeometry(2, 2);\n const quad = new THREE.Mesh(geometry, material);\n scene.add(quad);\n\n const handle: SceneHandle & { setMouse?: (x: number, y: number) => void } = {\n scene,\n camera,\n update: (elapsed) => {\n uniforms.uTime.value = elapsed;\n },\n resize: (w, h) => {\n (uniforms.uResolution.value as THREE.Vector2).set(w, h);\n },\n setPalette: (p: Palette) => {\n (uniforms.uPrimary.value as THREE.Color).set(p.primary);\n (uniforms.uSecondary.value as THREE.Color).set(p.secondary);\n (uniforms.uAccent.value as THREE.Color).set(p.accent);\n (uniforms.uBackground.value as THREE.Color).set(p.background);\n },\n setMouse: (x, y) => {\n (uniforms.uMouse.value as THREE.Vector2).set(x, y);\n },\n dispose: () => {\n geometry.dispose();\n material.dispose();\n },\n };\n\n return handle;\n };\n}\n\n/** Public handle type — ThreeScene uses the optional `setMouse` for pointer tracking. */\nexport interface FragmentSceneHandle extends SceneHandle {\n setMouse?: (x: number, y: number) => void;\n}\n","\"use client\";\n\n/**\n * ThreeScene — the WebGL media primitive.\n *\n * Supports two modes:\n * 1. Preset mode: <ThreeScene preset=\"space\" postPreset=\"vhs\" />\n * 2. Custom mode: <ThreeScene createScene={({ renderer, width, height, palette }) => ({ scene, camera, update, dispose })} />\n *\n * Post-FX composer is always applied; use postPreset=\"none\" for a clean render.\n *\n * Zero-chrome viewer mode: the default. Pass `controls` to show a minimal\n * play/pause overlay. Scene pauses when offscreen (pauseOffscreen default `true`).\n */\n\nimport * as React from \"react\";\nimport * as THREE from \"three\";\nimport { Play, Pause } from \"lucide-react\";\nimport {\n MediaSurface,\n type BaseMediaProps,\n usePrefersReducedMotion,\n} from \"./media-surface\";\nimport { Button } from \"./button\";\nimport { cn } from \"@/lib/utils\";\n\nimport type {\n SceneFactory,\n SceneHandle,\n Palette,\n} from \"@/lib/three/types\";\nimport { createPostComposer } from \"@/lib/three/post-composer\";\nimport { sceneRegistry, shaderPresetById } from \"@/lib/three/shader-presets\";\nimport { postPresets, defaultPostPreset } from \"@/lib/three/post-presets\";\nimport {\n buildFragmentShaderScene,\n ShaderCompileError,\n} from \"@/lib/three/custom-fragment\";\n\n/** Theme-friendly default palette. Consumers override per-tile if they want. */\nconst DEFAULT_PALETTE: Palette = {\n primary: \"#ff5fb9\",\n secondary: \"#9fe8ff\",\n accent: \"#ffc857\",\n background: \"#0a0a14\",\n};\n\n// Shadcn / gradeui store their design tokens as bare channel triplets so the\n// same custom property can be composed into `oklch()`, `hsl()`, or relative\n// colour expressions at the use-site. But that means `var(--primary)` on its\n// own expands to something like `\"0.610 0.128 20\"` which is NOT a valid CSS\n// <color>, so the browser silently falls back to the inherited colour —\n// usually black. We detect that pattern here and re-wrap before handing the\n// value to the DOM probe.\nconst OKLCH_TRIPLET =\n /^[\\d.]+\\s+[\\d.]+\\s+[\\d.]+(?:\\s*\\/\\s*[\\d.%]+)?$/; // \"0.61 0.13 20\" — no % signs\nconst HSL_TRIPLET =\n /^[\\d.]+\\s+[\\d.]+%\\s+[\\d.]+%(?:\\s*\\/\\s*[\\d.%]+)?$/; // \"20 90% 48%\" — shadcn HSL\nconst VAR_REF = /^\\s*var\\(\\s*(--[^,)\\s]+)(?:\\s*,[^)]*)?\\s*\\)\\s*$/;\n\n/**\n * Resolve any CSS-legal colour expression to a THREE-parseable string.\n *\n * Three-step resolution:\n *\n * 1. Design-token unwrap — if the input is a `var(--token)` reference,\n * read the raw custom-property value off the host. If that value is a\n * bare channel triplet (shadcn/gradeui convention), re-wrap it as\n * `oklch(...)` / `hsl(...)` so the DOM probe gets a valid colour.\n *\n * 2. DOM probe — assign to a detached span's inline colour and read\n * `getComputedStyle(probe).color`. Resolves remaining var() and\n * validates syntax.\n *\n * 3. Canvas rasterisation — the computed form may be `oklch(...)`,\n * `oklab(...)` or `color(srgb ...)`. `THREE.Color.setStyle()` only\n * parses `rgb()`/`hsl()`/hex/named, so we paint the computed colour\n * into a 1×1 canvas and read the rasterised sRGB bytes. Canvas is\n * guaranteed to gamut-convert any CSS colour, so the round-trip\n * always yields a THREE-parseable `rgb()`.\n */\nfunction resolveCssColor(\n input: string,\n host: HTMLElement,\n fallback: string,\n): string {\n if (typeof document === \"undefined\") return fallback;\n\n // Step 1: detect bare-triplet design tokens and re-wrap.\n let effectiveInput = input;\n const varRef = VAR_REF.exec(input);\n if (varRef) {\n const raw = getComputedStyle(host).getPropertyValue(varRef[1]).trim();\n if (raw) {\n if (OKLCH_TRIPLET.test(raw)) {\n effectiveInput = `oklch(${raw})`;\n } else if (HSL_TRIPLET.test(raw)) {\n effectiveInput = `hsl(${raw})`;\n }\n }\n }\n\n // Step 2: resolve remaining var() and validate via DOM probe.\n const probe = document.createElement(\"span\");\n probe.style.color = \"\";\n probe.style.color = effectiveInput;\n if (probe.style.color === \"\") return fallback;\n probe.style.display = \"none\";\n host.appendChild(probe);\n const computed = getComputedStyle(probe).color;\n host.removeChild(probe);\n if (!computed) return fallback;\n\n // Fast path: already in rgb()/rgba() form — skip canvas round-trip.\n if (computed.startsWith(\"rgb\")) return computed;\n\n // Step 3: gamut-convert oklch()/oklab()/color(...) via canvas rasterisation.\n try {\n const canvas = document.createElement(\"canvas\");\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return computed;\n ctx.clearRect(0, 0, 1, 1);\n ctx.fillStyle = computed;\n ctx.fillRect(0, 0, 1, 1);\n const [r, g, b] = ctx.getImageData(0, 0, 1, 1).data;\n return `rgb(${r}, ${g}, ${b})`;\n } catch {\n // Bail gracefully — return whatever the DOM probe gave us and let\n // THREE.Color fall back to its own default on an unparseable input.\n return computed;\n }\n}\n\nfunction resolvePalette(palette: Palette, host: HTMLElement): Palette {\n return {\n primary: resolveCssColor(palette.primary, host, DEFAULT_PALETTE.primary),\n secondary: resolveCssColor(\n palette.secondary,\n host,\n DEFAULT_PALETTE.secondary,\n ),\n accent: resolveCssColor(palette.accent, host, DEFAULT_PALETTE.accent),\n background: resolveCssColor(\n palette.background,\n host,\n DEFAULT_PALETTE.background,\n ),\n };\n}\n\nexport interface ThreeSceneProps\n extends Omit<BaseMediaProps, \"src\" | \"poster\"> {\n /** Preset id from the shader preset registry. */\n preset?: string;\n /**\n * User-authored GLSL fragment shader body. Runs on a fullscreen quad with\n * a standardised uniform contract (uTime, uResolution, uMouse, uPrimary,\n * uSecondary, uAccent, uBackground + varying vUv). Header is auto-injected\n * — DO NOT redeclare the uniforms. Write `void main()` only.\n *\n * Precedence: `createScene` > `fragmentShader` > `preset`. On compile\n * failure the component falls back to `preset=\"space\"` and fires\n * `onShaderError`.\n */\n fragmentShader?: string;\n /** Called when a supplied `fragmentShader` fails to compile. */\n onShaderError?: (error: ShaderCompileError) => void;\n /** Post-FX preset id. Defaults to the preset's `defaultPostPreset` or \"vhs\". */\n postPreset?: string;\n /** Palette overrides. Unset slots fall back to `DEFAULT_PALETTE`. */\n palette?: Partial<Palette>;\n /**\n * Custom scene factory. Takes precedence over `preset` and `fragmentShader`.\n * Use for bespoke three.js scenes that don't fit a preset or fullscreen quad.\n */\n createScene?: SceneFactory;\n /** Static poster to show while the GL context warms up. */\n poster?: string;\n /** Pixel-ratio cap. Defaults to `Math.min(window.devicePixelRatio, 2)`. */\n maxDpr?: number;\n}\n\nexport const ThreeScene = React.forwardRef<HTMLDivElement, ThreeSceneProps>(\n (\n {\n preset,\n fragmentShader,\n onShaderError,\n postPreset,\n palette: paletteProp,\n createScene: createSceneProp,\n controls = false,\n autoPlay = true,\n pauseOffscreen = true,\n aspect = \"video\",\n radius = \"lg\",\n border = false,\n poster,\n label,\n className,\n style,\n maxDpr,\n },\n ref,\n ) => {\n const hostRef = React.useRef<HTMLDivElement | null>(null);\n const [playing, setPlaying] = React.useState(autoPlay);\n const [ready, setReady] = React.useState(false);\n const reduced = usePrefersReducedMotion();\n\n // Merge palette prop with defaults\n const palette = React.useMemo<Palette>(\n () => ({ ...DEFAULT_PALETTE, ...paletteProp }),\n [paletteProp],\n );\n\n // Resolve scene factory.\n // 1. Explicit createScene wins (power-user escape hatch).\n // 2. fragmentShader — user wrote GLSL; build a fullscreen-quad scene.\n // We wrap in an outer arrow so compile errors throw inside the effect\n // and can be caught + surfaced, rather than bubbling out of useMemo.\n // 3. Preset id from the registry.\n const resolvedFactory: SceneFactory | null = React.useMemo(() => {\n if (createSceneProp) return createSceneProp;\n if (fragmentShader) return buildFragmentShaderScene(fragmentShader);\n if (preset && sceneRegistry[preset]) return sceneRegistry[preset];\n return null;\n }, [createSceneProp, fragmentShader, preset]);\n\n // Resolve post preset id\n const resolvedPostPresetId = React.useMemo(() => {\n if (postPreset) return postPreset;\n if (preset) {\n const p = shaderPresetById[preset];\n if (p?.defaultPostPreset) return p.defaultPostPreset;\n }\n return defaultPostPreset;\n }, [postPreset, preset]);\n\n React.useEffect(() => {\n const host = hostRef.current;\n if (!host || !resolvedFactory) return;\n\n const width = host.clientWidth || 1;\n const height = host.clientHeight || 1;\n\n // Resolve palette CSS expressions (var(), oklch(), lab(), hex, rgb(),\n // named colours) into THREE-parseable rgb() strings via a DOM probe.\n // Done AFTER host is in the document so custom properties resolve.\n const livePalette = resolvePalette(palette, host);\n\n const renderer = new THREE.WebGLRenderer({\n antialias: true,\n alpha: false,\n powerPreference: \"high-performance\",\n });\n const dpr = maxDpr ?? Math.min(window.devicePixelRatio || 1, 2);\n renderer.setPixelRatio(dpr);\n renderer.setSize(width, height);\n renderer.setClearColor(new THREE.Color(livePalette.background), 1);\n renderer.domElement.dataset.gdsPart = \"shader-canvas\";\n renderer.domElement.style.width = \"100%\";\n renderer.domElement.style.height = \"100%\";\n renderer.domElement.style.display = \"block\";\n host.appendChild(renderer.domElement);\n\n // Instantiate the scene. A user-supplied fragment shader can fail to\n // compile here — we catch, fire onShaderError, and fall back to the\n // \"space\" preset so the surface is never left blank.\n let handle: SceneHandle;\n try {\n handle = resolvedFactory({\n renderer,\n width,\n height,\n palette: livePalette,\n });\n } catch (err) {\n if (err instanceof ShaderCompileError) {\n onShaderError?.(err);\n handle = sceneRegistry.space({\n renderer,\n width,\n height,\n palette: livePalette,\n });\n } else {\n // Unknown failure — tear down and re-throw so the app sees it.\n renderer.dispose();\n if (renderer.domElement.parentElement === host) {\n host.removeChild(renderer.domElement);\n }\n throw err;\n }\n }\n\n const postPresetObj =\n postPresets[resolvedPostPresetId] ?? postPresets[defaultPostPreset];\n\n const post = createPostComposer({\n renderer,\n scene: handle.scene,\n camera: handle.camera,\n preset: postPresetObj,\n width,\n height,\n });\n\n const clock = new THREE.Clock();\n let rafId = 0;\n let running = autoPlay && !reduced;\n let visible = true;\n\n const tick = () => {\n rafId = requestAnimationFrame(tick);\n if (!running || (pauseOffscreen && !visible)) return;\n const delta = clock.getDelta();\n const elapsed = clock.getElapsedTime();\n handle.update?.(elapsed, delta);\n post.composer.render(delta);\n };\n tick();\n if (running) setReady(true);\n\n // ResizeObserver for responsive canvas\n const ro = new ResizeObserver(([entry]) => {\n const w = Math.max(1, Math.floor(entry.contentRect.width));\n const h = Math.max(1, Math.floor(entry.contentRect.height));\n renderer.setSize(w, h);\n post.resize(w, h);\n handle.resize?.(w, h);\n });\n ro.observe(host);\n\n // Visibility — intersection observer\n const io = new IntersectionObserver(\n ([entry]) => {\n visible = entry.isIntersecting;\n },\n { threshold: 0.05 },\n );\n io.observe(host);\n\n // Theme-change observer — when a consumer flips the root class / data-theme\n // attr (GradeThemeProvider, dark-mode toggle, custom theme swap), re-resolve\n // any CSS-var-driven palette entries and push them into the live scene\n // without remounting WebGL.\n const themeObserver = new MutationObserver(() => {\n if (!hostRef.current) return;\n const next = resolvePalette(palette, hostRef.current);\n renderer.setClearColor(new THREE.Color(next.background), 1);\n handle.setPalette?.(next);\n });\n themeObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\n \"class\",\n \"style\",\n \"data-theme\",\n \"data-gds-theme\",\n \"data-grade-mode\",\n ],\n });\n\n // Pointer tracking — only wired up if the scene exposes `setMouse`\n // (currently just fragment-shader scenes). Normalised to [0,1] with\n // y flipped so the coordinates match GLSL's origin-at-bottom-left.\n const sceneWithMouse = handle as SceneHandle & {\n setMouse?: (x: number, y: number) => void;\n };\n const onPointerMove = sceneWithMouse.setMouse\n ? (ev: PointerEvent) => {\n const rect = host.getBoundingClientRect();\n const x = (ev.clientX - rect.left) / rect.width;\n const y = 1 - (ev.clientY - rect.top) / rect.height;\n sceneWithMouse.setMouse!(x, y);\n }\n : null;\n if (onPointerMove) host.addEventListener(\"pointermove\", onPointerMove);\n\n // Expose a live handle for the controls overlay + palette updates\n liveRef.current = {\n toggle: () => {\n running = !running;\n setPlaying(running);\n },\n setPalette: (p: Palette) => {\n renderer.setClearColor(new THREE.Color(p.background), 1);\n handle.setPalette?.(p);\n },\n setPostPreset: (id: string) => {\n const next = postPresets[id];\n if (next) post.setPreset(next);\n },\n };\n\n return () => {\n cancelAnimationFrame(rafId);\n ro.disconnect();\n io.disconnect();\n themeObserver.disconnect();\n if (onPointerMove) host.removeEventListener(\"pointermove\", onPointerMove);\n post.dispose();\n handle.dispose?.();\n renderer.dispose();\n if (renderer.domElement.parentElement === host) {\n host.removeChild(renderer.domElement);\n }\n liveRef.current = null;\n };\n // Factory/palette/post-preset changes remount the whole thing (simpler than\n // rebuilding in place, and palette changes are rare enough that it's fine).\n }, [\n resolvedFactory,\n resolvedPostPresetId,\n palette,\n autoPlay,\n reduced,\n pauseOffscreen,\n maxDpr,\n onShaderError,\n ]);\n\n const liveRef = React.useRef<{\n toggle: () => void;\n setPalette: (p: Palette) => void;\n setPostPreset: (id: string) => void;\n } | null>(null);\n\n const togglePlay = () => liveRef.current?.toggle();\n\n return (\n <MediaSurface\n ref={(node) => {\n hostRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n }}\n aspect={aspect}\n radius={radius}\n border={border}\n aria-label={label}\n className={className}\n style={style}\n data-gds-part=\"three-scene\"\n >\n {!ready && poster && (\n // eslint-disable-next-line @next/next/no-img-element\n <img\n src={poster}\n alt=\"\"\n className=\"absolute inset-0 w-full h-full object-cover\"\n data-gds-part=\"scene-poster\"\n />\n )}\n {controls && (\n <div\n data-gds-part=\"scene-controls\"\n className={cn(\n \"absolute inset-0 flex items-end justify-end p-2\",\n \"opacity-0 hover:opacity-100 transition-opacity\",\n \"bg-gradient-to-t from-black/30 to-transparent\",\n )}\n >\n <Button size=\"icon\" variant=\"secondary\" onClick={togglePlay}>\n {playing ? (\n <Pause className=\"h-4 w-4\" />\n ) : (\n <Play className=\"h-4 w-4\" />\n )}\n </Button>\n </div>\n )}\n </MediaSurface>\n );\n },\n);\nThreeScene.displayName = \"ThreeScene\";\n","\"use client\";\n\n/**\n * ShaderPresetPreview — a thumbnail-sized preview of a shader preset.\n *\n * Default behaviour: static poster until hovered, then kick in a live\n * `<ThreeScene>` render. Keeps gallery pages cheap (ten live shaders on\n * one page eats FPS fast, Safari caps WebGL contexts ~8).\n *\n * Props:\n * live: \"never\" → always show poster, no canvas\n * live: \"hover\" → (default) canvas spins up on hover, tears down on leave\n * live: \"always\" → canvas always rendering\n */\n\nimport * as React from \"react\";\nimport { ThreeScene } from \"./three-scene\";\nimport { MediaSurface } from \"./media-surface\";\nimport { shaderPresetById } from \"@/lib/three/shader-presets\";\nimport { cn } from \"@/lib/utils\";\nimport type { Palette } from \"@/lib/three/types\";\n\nexport interface ShaderPresetPreviewProps {\n preset: string;\n live?: \"never\" | \"hover\" | \"always\";\n postPreset?: string;\n palette?: Partial<Palette>;\n className?: string;\n aspect?: \"video\" | \"square\" | \"portrait\" | \"wide\";\n radius?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n /** Text label shown on the card. Defaults to preset label. */\n label?: string;\n /** Hide the label strip. */\n hideLabel?: boolean;\n onClick?: () => void;\n}\n\nexport const ShaderPresetPreview = React.forwardRef<\n HTMLDivElement,\n ShaderPresetPreviewProps\n>(\n (\n {\n preset,\n live = \"hover\",\n postPreset,\n palette,\n className,\n aspect = \"video\",\n radius = \"lg\",\n label,\n hideLabel = false,\n onClick,\n },\n ref,\n ) => {\n const entry = shaderPresetById[preset];\n const [hovered, setHovered] = React.useState(false);\n const shouldRender = live === \"always\" || (live === \"hover\" && hovered);\n\n return (\n <div\n ref={ref}\n data-gds-part=\"picker-card\"\n data-gds-preset={preset}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n onClick={onClick}\n className={cn(\n \"group cursor-pointer flex flex-col gap-2\",\n className,\n )}\n >\n {shouldRender ? (\n <ThreeScene\n preset={preset}\n postPreset={postPreset}\n palette={palette}\n aspect={aspect}\n radius={radius}\n autoPlay\n controls={false}\n pauseOffscreen\n poster={entry?.poster}\n maxDpr={1} // thumbnails — keep GPU work low\n />\n ) : (\n <MediaSurface\n aspect={aspect}\n radius={radius}\n data-gds-part=\"preset-poster\"\n className=\"bg-gradient-to-br from-muted to-muted/50\"\n >\n {entry?.poster ? (\n // eslint-disable-next-line @next/next/no-img-element\n <img\n src={entry.poster}\n alt={entry.label}\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center text-xs text-muted-foreground\">\n {entry?.label ?? preset}\n </div>\n )}\n </MediaSurface>\n )}\n {!hideLabel && (\n <div className=\"flex items-baseline justify-between text-xs\">\n <span\n className=\"font-medium text-foreground\"\n data-gds-part=\"preset-label\"\n >\n {label ?? entry?.label ?? preset}\n </span>\n {entry?.tags?.[0] && (\n <span className=\"text-muted-foreground\">{entry.tags[0]}</span>\n )}\n </div>\n )}\n </div>\n );\n },\n);\nShaderPresetPreview.displayName = \"ShaderPresetPreview\";\n","\"use client\";\n\n/**\n * ShaderPresetPicker — runtime preset gallery + selection.\n *\n * A grid of `<ShaderPresetPreview>` cards. Click to select. Used for\n * things like \"pick a vibe for your course background\".\n *\n * For a browsing-only catalogue with no selection, just lay out\n * `<ShaderPresetPreview>` directly.\n *\n * TODO(phase 2): static catalogue page for the docs site mirroring this.\n */\n\nimport * as React from \"react\";\nimport { ShaderPresetPreview } from \"./shader-preset-preview\";\nimport { shaderPresets } from \"@/lib/three/shader-presets\";\nimport { cn } from \"@/lib/utils\";\nimport { Check } from \"lucide-react\";\nimport type { Palette } from \"@/lib/three/types\";\n\nexport interface ShaderPresetPickerProps {\n /** Currently selected preset id (controlled). */\n value?: string;\n /** Called when the user clicks a preset. */\n onChange?: (presetId: string) => void;\n /** Filter by tag — e.g. only show `\"space\"` or `\"retro\"` presets. */\n filterTags?: string[];\n /** Live-render mode for thumbnails. Default \"hover\". */\n live?: \"never\" | \"hover\" | \"always\";\n /** Shared post-FX preset applied to all thumbnails. Default: each preset's own. */\n postPreset?: string;\n /** Shared palette for all thumbnails. */\n palette?: Partial<Palette>;\n /** Columns at md+ breakpoint. Default 3. */\n columns?: 2 | 3 | 4;\n className?: string;\n}\n\nexport function ShaderPresetPicker({\n value,\n onChange,\n filterTags,\n live = \"hover\",\n postPreset,\n palette,\n columns = 3,\n className,\n}: ShaderPresetPickerProps) {\n const presets = React.useMemo(() => {\n if (!filterTags?.length) return shaderPresets;\n return shaderPresets.filter((p) =>\n filterTags.some((t) => p.tags.includes(t)),\n );\n }, [filterTags]);\n\n const colsClass =\n columns === 2\n ? \"md:grid-cols-2\"\n : columns === 4\n ? \"md:grid-cols-4\"\n : \"md:grid-cols-3\";\n\n return (\n <div\n data-gds-part=\"preset-grid\"\n role=\"radiogroup\"\n className={cn(\"grid grid-cols-2 gap-3\", colsClass, className)}\n >\n {presets.map((preset) => {\n const selected = value === preset.id;\n return (\n <div key={preset.id} className=\"relative\" role=\"radio\" aria-checked={selected}>\n <ShaderPresetPreview\n preset={preset.id}\n postPreset={postPreset}\n palette={palette}\n live={live}\n onClick={() => onChange?.(preset.id)}\n className={cn(\n \"transition-all\",\n selected && \"ring-2 ring-primary ring-offset-2 ring-offset-background rounded-lg\",\n )}\n />\n {selected && (\n <div\n data-gds-part=\"picker-selected-badge\"\n className=\"absolute top-2 right-2 rounded-full bg-primary text-primary-foreground p-1 shadow-sm\"\n >\n <Check className=\"h-3.5 w-3.5\" />\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef } from \"react\";\nimport Lenis from \"lenis\";\n\ninterface LenisProviderProps {\n children: React.ReactNode;\n}\n\nexport function LenisProvider({ children }: LenisProviderProps) {\n const lenisRef = useRef<Lenis | null>(null);\n\n useEffect(() => {\n const lenis = new Lenis({\n duration: 1.2,\n easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)),\n orientation: \"vertical\",\n gestureOrientation: \"vertical\",\n smoothWheel: true,\n });\n\n lenisRef.current = lenis;\n\n function raf(time: number) {\n lenis.raf(time);\n requestAnimationFrame(raf);\n }\n\n requestAnimationFrame(raf);\n\n return () => {\n lenis.destroy();\n lenisRef.current = null;\n };\n }, []);\n\n return <>{children}</>;\n}\n","/**\n * OKLCH ramp generation.\n *\n * OKLCH (Oklab in cylindrical coords) is a perceptually uniform color space —\n * the same `L` value looks equally light across all hues, which HSL does not\n * give you. That makes it ideal for generating color ramps programmatically:\n * pin the L curve, vary the hue, and every ramp looks like a sibling.\n *\n * We output space-separated `\"L C H\"` triplets (not `oklch(L C H)` strings),\n * because the CSS variables are consumed via Tailwind as\n * `oklch(var(--primary) / <alpha-value>)`\n * which needs the bare components inside the function call to get the\n * `/alpha` shortcut (`bg-primary/50`) working.\n */\n\n/** One of four brightness modes the theme system supports. */\nexport type ModeName = \"superLight\" | \"light\" | \"dark\" | \"superDark\";\n\n/** A bare OKLCH triplet — \"L C H\" space-separated. Consumed inside oklch(). */\nexport type OKLCHTriplet = string;\n\n/** A full 11-stop color ramp, Tailwind-style. */\nexport interface Ramp {\n 50: OKLCHTriplet;\n 100: OKLCHTriplet;\n 200: OKLCHTriplet;\n 300: OKLCHTriplet;\n 400: OKLCHTriplet;\n 500: OKLCHTriplet;\n 600: OKLCHTriplet;\n 700: OKLCHTriplet;\n 800: OKLCHTriplet;\n 900: OKLCHTriplet;\n 950: OKLCHTriplet;\n}\n\nexport type RampKey = keyof Ramp;\n\nexport const RAMP_KEYS: RampKey[] = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950];\n\n/**\n * Lightness curve across the 11-stop ramp. Index matches RAMP_KEYS order\n * (0 → L for stop 50, 10 → L for stop 950). Chosen so that:\n * - Adjacent steps are perceptually distinct\n * - Step 500 lands around the \"canonical\" brand-base lightness (0.60)\n * - Step 50 is near-white without being pure white (keeps a hint of hue)\n * - Step 950 is near-black without being pure black (same)\n *\n * These values are mode-agnostic — the same ramp is used in every mode.\n * What changes per mode is which stop maps to which semantic token (see\n * generator.ts / MODE_TOKEN_MAP).\n */\nconst LIGHTNESS_CURVE: readonly number[] = [\n 0.985, // 50\n 0.955, // 100\n 0.895, // 200\n 0.820, // 300\n 0.720, // 400\n 0.610, // 500 — base\n 0.510, // 600\n 0.415, // 700\n 0.325, // 800\n 0.245, // 900\n 0.170, // 950\n];\n\n/**\n * Chroma curve. Peaks in the middle of the ramp (around 500-600, where\n * sRGB gamut allows the most saturation) and tapers at the extremes.\n * Multiplied by the `chromaScale` at call time so we can dial neutrals\n * down to near-gray without changing the shape.\n */\nconst CHROMA_CURVE: readonly number[] = [\n 0.015, // 50\n 0.040, // 100\n 0.075, // 200\n 0.110, // 300\n 0.140, // 400\n 0.170, // 500 — peak\n 0.170, // 600 — peak\n 0.150, // 700\n 0.120, // 800\n 0.080, // 900\n 0.040, // 950\n];\n\n/** Arguments to hueToRamp. */\nexport interface HueToRampOptions {\n /** Hue in degrees, 0–360. */\n hue: number;\n /**\n * Multiplier on the default chroma curve. Defaults to 1.\n * - Neutrals: ~0.06–0.12 (subtle tint toward the hue)\n * - Standard brand: 1.0\n * - Muted / desaturated: 0.5–0.7\n * - Vibrant: 1.1–1.3 (may fall outside sRGB at high L, but browsers clip)\n */\n chromaScale?: number;\n}\n\n/**\n * Generate an 11-stop ramp from a single hue.\n *\n * The output is mode-agnostic: each stop gets the same lightness and chroma\n * regardless of which mode the theme ends up being applied in. The mode\n * selects which stops are used for semantic tokens (see generator).\n */\nexport function hueToRamp({ hue, chromaScale = 1 }: HueToRampOptions): Ramp {\n const normalizedHue = ((hue % 360) + 360) % 360; // clamp to 0–360\n const ramp = {} as Ramp;\n for (let i = 0; i < RAMP_KEYS.length; i++) {\n const L = LIGHTNESS_CURVE[i];\n const C = CHROMA_CURVE[i] * chromaScale;\n ramp[RAMP_KEYS[i]] = `${L.toFixed(4)} ${C.toFixed(4)} ${normalizedHue.toFixed(2)}`;\n }\n return ramp;\n}\n\n/**\n * Build a fully neutral (achromatic) ramp — chroma forced to zero.\n * Used when the user picks \"pure gray\" for the neutral axis.\n */\nexport function neutralRamp(): Ramp {\n const ramp = {} as Ramp;\n for (let i = 0; i < RAMP_KEYS.length; i++) {\n const L = LIGHTNESS_CURVE[i];\n ramp[RAMP_KEYS[i]] = `${L.toFixed(4)} 0 0`;\n }\n return ramp;\n}\n\n/**\n * Fixed OKLCH triplets for semantic colors that should NOT vary with the\n * brand hue (for accessibility and convention). Tuned to look equally\n * balanced on light and dark backgrounds.\n */\nexport const FIXED_SEMANTIC: Record<\"light\" | \"dark\", {\n destructive: OKLCHTriplet;\n destructiveFg: OKLCHTriplet;\n success: OKLCHTriplet;\n warning: OKLCHTriplet;\n info: OKLCHTriplet;\n highlight: OKLCHTriplet;\n}> = {\n light: {\n destructive: \"0.560 0.220 27.0\", // red\n destructiveFg: \"0.990 0.005 27.0\",\n success: \"0.610 0.180 145.0\", // green\n warning: \"0.720 0.180 60.0\", // orange\n info: \"0.580 0.200 240.0\", // blue\n highlight: \"0.860 0.180 95.0\", // yellow\n },\n dark: {\n destructive: \"0.680 0.220 27.0\",\n destructiveFg: \"0.990 0.005 27.0\",\n success: \"0.720 0.180 145.0\",\n warning: \"0.800 0.180 60.0\",\n info: \"0.700 0.200 240.0\",\n highlight: \"0.880 0.180 95.0\",\n },\n};\n\n/** Absolute-white/black OKLCH triplets, used for card/popover surfaces. */\nexport const PURE_WHITE: OKLCHTriplet = \"1 0 0\";\nexport const PURE_BLACK: OKLCHTriplet = \"0 0 0\";\n\n/**\n * Derive the `*-soft` / `*-deep` pair for a status colour — the paler tinted\n * surface and the deeper on-surface text we use for Alert, Badge, and any\n * future status banners.\n *\n * The hue is preserved so the derivative colours still feel like \"that\n * status colour\". Chroma is trimmed on the soft variant (a very pale\n * background with full chroma reads as neon) and lightness is retargeted:\n *\n * - Light mode: soft ≈ 0.96 L / 0.25× chroma (a whisper of tint), deep\n * ≈ 0.38 L / full chroma (matches the 700-step of an implicit ramp).\n * - Dark mode: soft ≈ 0.22 L / 0.45× chroma (sits just above the dark\n * background without becoming gray), deep ≈ 0.82 L / 0.9× chroma\n * (bright but not eye-watering on the tinted surface).\n *\n * Returns a pair of OKLCH triplets in the same \"L C H\" string form as the\n * rest of the theme tokens.\n */\nexport function deriveAlertPair(\n base: OKLCHTriplet,\n mode: \"light\" | \"dark\"\n): { soft: OKLCHTriplet; deep: OKLCHTriplet } {\n const [, c, h] = base.split(/\\s+/).map((v) => v.trim());\n const chroma = Number(c);\n const hue = h;\n\n if (mode === \"light\") {\n const softL = 0.965;\n const softC = Math.min(chroma * 0.22, 0.045);\n const deepL = 0.38;\n const deepC = chroma;\n return {\n soft: `${softL.toFixed(3)} ${softC.toFixed(3)} ${hue}`,\n deep: `${deepL.toFixed(3)} ${deepC.toFixed(3)} ${hue}`,\n };\n }\n\n const softL = 0.22;\n const softC = Math.min(chroma * 0.45, 0.075);\n const deepL = 0.82;\n const deepC = chroma * 0.9;\n return {\n soft: `${softL.toFixed(3)} ${softC.toFixed(3)} ${hue}`,\n deep: `${deepL.toFixed(3)} ${deepC.toFixed(3)} ${hue}`,\n };\n}\n","/**\n * GradeTheme — a single object capturing every skinnable dimension of the\n * design system. A theme is a complete \"skin\": colors, typography, radius,\n * spacing feel, effects, and optional experimental (shader/WebGL) hooks.\n *\n * Themes are applied at runtime by the GradeThemeProvider, which writes the\n * resolved values to CSS custom properties on :root. Components already read\n * from those variables (via the shadcn semantic layer + RDS tokens), so no\n * component code has to change per theme.\n *\n * HSL strings use the space-separated shadcn format: \"175 84% 32%\".\n * They are wrapped in hsl() at the call site (e.g. oklch(var(--primary))).\n */\n\nexport type HSL = string;\n\nexport interface ThemeColorsMode {\n // Core shadcn semantic tokens\n background: HSL;\n foreground: HSL;\n card: HSL;\n cardForeground: HSL;\n popover: HSL;\n popoverForeground: HSL;\n primary: HSL;\n primaryForeground: HSL;\n secondary: HSL;\n secondaryForeground: HSL;\n muted: HSL;\n mutedForeground: HSL;\n accent: HSL;\n accentForeground: HSL;\n destructive: HSL;\n destructiveForeground: HSL;\n border: HSL;\n input: HSL;\n ring: HSL;\n\n // Grade semantic extras\n success: HSL;\n warning: HSL;\n info: HSL;\n energy: HSL;\n}\n\nexport interface ThemeTypography {\n /** CSS font-family string for the default sans. Can reference a CSS var. */\n fontSans: string;\n /** CSS font-family string for monospace. */\n fontMono: string;\n /** Optional distinct font for display/hero headings. Defaults to fontSans. */\n fontDisplay?: string;\n /** Optional weight used for headings. Defaults: 600. */\n headingWeight?: number;\n /** Optional weight used for body. Defaults: 400. */\n bodyWeight?: number;\n /** Letter-spacing applied to headings. */\n headingTracking?: string;\n /** Optional scale overrides — any subset. Falls back to RDS defaults. */\n scale?: Partial<{\n display: string;\n h1: string;\n h2: string;\n h3: string;\n h4: string;\n h5: string;\n h6: string;\n body: string;\n bodySm: string;\n }>;\n}\n\nexport interface ThemeRadius {\n /** The shadcn --radius base value. Button/input radius derive from this. */\n base: string;\n /** Optional full-scale overrides. */\n sm?: string;\n md?: string;\n lg?: string;\n xl?: string;\n \"2xl\"?: string;\n full?: string;\n /** Shorthand feel: sharp = 0, soft = default, pill = full. */\n style?: \"sharp\" | \"soft\" | \"rounded\" | \"pill\";\n}\n\nexport interface ThemeSpacing {\n /** Base unit for the spacing scale. Default \"1rem\" (16px). */\n baseUnit?: string;\n /** Density preset: tight = 0.75x, default = 1x, roomy = 1.25x. */\n density?: \"tight\" | \"default\" | \"roomy\";\n}\n\nexport interface ThemeEffects {\n shadows?: {\n sm?: string;\n md?: string;\n lg?: string;\n xl?: string;\n \"2xl\"?: string;\n inner?: string;\n };\n motion?: {\n fast?: string;\n base?: string;\n slow?: string;\n slower?: string;\n easeIn?: string;\n easeOut?: string;\n easeInOut?: string;\n /** Global motion intensity multiplier — 0 = instant, 1 = default, >1 = slower. */\n intensity?: number;\n };\n borders?: {\n width?: string;\n style?: \"solid\" | \"dashed\" | \"dotted\";\n };\n}\n\nexport interface ThemeComponents {\n /** Shape of button corners. Mapped to a data attribute components can key off. */\n buttonShape?: \"default\" | \"pill\" | \"square\" | \"sharp\";\n /** Input rendering style. */\n inputStyle?: \"outlined\" | \"filled\" | \"underline\";\n /** Card rendering style. */\n cardStyle?: \"flat\" | \"elevated\" | \"outlined\" | \"glass\";\n}\n\nexport interface ThemeExperimental {\n /** Named shader references; resolved by <ThemeCanvas> / <ShaderSurface>. */\n shaders?: {\n background?: string;\n buttonGlow?: string;\n cardEffect?: string;\n };\n effects?: {\n noise?: boolean;\n grain?: boolean;\n scanlines?: boolean;\n bloom?: boolean;\n };\n}\n\nexport interface GradeTheme {\n id: string;\n name: string;\n description: string;\n /** Optional tagline for the switcher UI. */\n tagline?: string;\n\n colors: {\n light: ThemeColorsMode;\n dark: ThemeColorsMode;\n };\n typography: ThemeTypography;\n radius: ThemeRadius;\n spacing: ThemeSpacing;\n effects?: ThemeEffects;\n components?: ThemeComponents;\n experimental?: ThemeExperimental;\n}\n\n/** Convenience: a theme registry entry. */\nexport interface ThemeRegistryEntry {\n id: string;\n theme: GradeTheme;\n}\n\n/* ═════════════════════════════════════════════════════════════════════════\n GENERATOR-FIRST TYPES (Phase 1 of the OKLCH theme builder)\n ═════════════════════════════════════════════════════════════════════════\n\n Everything below drives the new generator-based theme system. A theme is\n now defined primarily by a compact ThemeInput (hues + a handful of\n config knobs) and generated into a full GeneratedTheme via generator.ts.\n\n The existing GradeTheme / ThemeColorsMode types above still work for the\n legacy Grade + Paper themes. Phase 2 replaces them with GeneratedTheme.\n ───────────────────────────────────────────────────────────────────────── */\n\nimport type { ModeName, OKLCHTriplet, Ramp } from \"./oklch\";\nexport type { ModeName, OKLCHTriplet, Ramp } from \"./oklch\";\n\n/**\n * The CSS font-family string for each available font. Keys match the CSS\n * variables set by app/layout.tsx's font loaders. Adding a new font means\n * loading it in the root layout AND registering it here.\n *\n * Geist is the recommended default sans (replaces Satoshi). Jetbrains Mono\n * is the default mono. Serif and alternative options round out the list for\n * the theme builder's font picker — expected to grow as we allow dynamic\n * Google Font loading later.\n */\nexport const FONTS = {\n // Sans\n geist: \"var(--font-geist), system-ui, sans-serif\",\n inter: \"var(--font-inter), system-ui, sans-serif\",\n manrope: \"var(--font-manrope), system-ui, sans-serif\",\n figtree: \"var(--font-figtree), system-ui, sans-serif\",\n dmSans: \"var(--font-dm-sans), system-ui, sans-serif\",\n lexend: \"var(--font-lexend), system-ui, sans-serif\",\n outfit: \"var(--font-outfit), system-ui, sans-serif\",\n plusJakarta: \"var(--font-plus-jakarta), system-ui, sans-serif\",\n spaceGrotesk: \"var(--font-space-grotesk), system-ui, sans-serif\",\n // Serif\n fraunces: \"var(--font-fraunces), Georgia, serif\",\n instrumentSerif: \"var(--font-instrument-serif), Georgia, serif\",\n sourceSerif: \"var(--font-source-serif), Georgia, serif\",\n // Mono\n jetbrainsMono: \"var(--font-jetbrains-mono), ui-monospace, monospace\",\n geistMono: \"var(--font-geist-mono), ui-monospace, monospace\",\n ibmPlexMono: \"var(--font-ibm-plex-mono), ui-monospace, monospace\",\n // System fallbacks\n system: \"system-ui, -apple-system, sans-serif\",\n serif: \"Georgia, 'Times New Roman', serif\",\n mono: \"ui-monospace, Menlo, monospace\",\n} as const;\n\nexport type FontKey = keyof typeof FONTS;\n\n/** Human-readable labels for the font picker. */\nexport const FONT_LABELS: Record<FontKey, string> = {\n geist: \"Geist\",\n inter: \"Inter\",\n manrope: \"Manrope\",\n figtree: \"Figtree\",\n dmSans: \"DM Sans\",\n lexend: \"Lexend\",\n outfit: \"Outfit\",\n plusJakarta: \"Plus Jakarta Sans\",\n spaceGrotesk: \"Space Grotesk\",\n fraunces: \"Fraunces\",\n instrumentSerif: \"Instrument Serif\",\n sourceSerif: \"Source Serif 4\",\n jetbrainsMono: \"JetBrains Mono\",\n geistMono: \"Geist Mono\",\n ibmPlexMono: \"IBM Plex Mono\",\n system: \"System sans\",\n serif: \"System serif\",\n mono: \"System mono\",\n};\n\n/** Categorization used to filter the picker (serif/sans/mono). */\nexport const FONT_CATEGORY: Record<FontKey, \"sans\" | \"serif\" | \"mono\"> = {\n geist: \"sans\",\n inter: \"sans\",\n manrope: \"sans\",\n figtree: \"sans\",\n dmSans: \"sans\",\n lexend: \"sans\",\n outfit: \"sans\",\n plusJakarta: \"sans\",\n spaceGrotesk: \"sans\",\n fraunces: \"serif\",\n instrumentSerif: \"serif\",\n sourceSerif: \"serif\",\n jetbrainsMono: \"mono\",\n geistMono: \"mono\",\n ibmPlexMono: \"mono\",\n system: \"sans\",\n serif: \"serif\",\n mono: \"mono\",\n};\n\n/** Type scale preset — controls how generous the size ladder is. */\nexport type TypeScalePreset = \"compact\" | \"default\" | \"spacious\";\n\n/** Density preset — controls spacing tightness. */\nexport type SpacingDensity = \"tight\" | \"default\" | \"roomy\";\n\n/** Radius preset — controls how rounded corners are across the system. */\nexport type RadiusStyle = \"sharp\" | \"subtle\" | \"soft\" | \"round\" | \"pill\";\n\n/** Shadow intensity preset. */\nexport type ShadowIntensity = \"none\" | \"subtle\" | \"default\" | \"dramatic\";\n\n/**\n * Chroma intensity — applied globally on top of per-ramp chroma multipliers.\n * \"muted\" dials all ramps down (pastel / editorial feel).\n * \"vibrant\" pushes them past the defaults (popping / marketing feel).\n */\nexport type ColorIntensity = \"muted\" | \"default\" | \"vibrant\";\n\n/** Button rendering shape (orthogonal to radius). */\nexport type ButtonShape = \"default\" | \"pill\" | \"square\";\n\n/** Input rendering style. */\nexport type InputStyle = \"outlined\" | \"filled\" | \"underline\";\n\n/** Card rendering style. */\nexport type CardStyle = \"flat\" | \"outlined\" | \"elevated\" | \"glass\";\n\n/**\n * The user-facing theme definition. This is what gets saved to\n * localStorage, exported as JSON, and shared via URL. The generator\n * consumes this and produces a full GeneratedTheme.\n */\nexport interface ThemeInput {\n /** Stable id. For user themes: \"user:<uuid>\"; for built-ins: short slug. */\n id: string;\n /** Display name. */\n name: string;\n /** Optional one-line description for the switcher. */\n description?: string;\n /** Optional tagline (category tag). */\n tagline?: string;\n\n /** The three hues that drive the entire color system. */\n hues: {\n /** 0–360. The gray ramp's tint. Low chroma, subtle. */\n neutral: number;\n /** 0–360. The brand primary. */\n primary: number;\n /** 0–360. The secondary brand accent. Often primary ± 30–180°. */\n accent: number;\n };\n\n /**\n * Optional chroma overrides. Defaults tuned to produce pleasant ramps:\n * neutrals get a subtle tint (0.1× peak), primary/accent get full chroma.\n * Raise above 1.0 for vibrant; lower for muted.\n */\n chroma?: {\n neutral?: number; // default 0.08\n primary?: number; // default 1.0\n accent?: number; // default 1.0\n };\n\n /** If true, the neutral ramp is pure gray regardless of neutral hue. */\n neutralPureGray?: boolean;\n\n /**\n * Global chroma intensity. Multiplies every ramp's chroma — a quick way to\n * flip the whole theme between muted / default / vibrant without touching\n * the per-ramp chroma values.\n */\n intensity?: ColorIntensity;\n\n typography: {\n display: FontKey;\n body: FontKey;\n mono: FontKey;\n scale: TypeScalePreset;\n /** Override heading weight. Defaults to 600 for sans, 500 for serif. */\n headingWeight?: number;\n /** Override body weight. Defaults to 400. */\n bodyWeight?: number;\n /** Letter-spacing applied to headings. Default \"-0.01em\". */\n headingTracking?: string;\n };\n\n spacing: {\n density: SpacingDensity;\n };\n\n radius: {\n style: RadiusStyle;\n };\n\n effects?: {\n shadows?: ShadowIntensity;\n /** 0 = instant, 1 = default, 2 = luxurious. */\n motionIntensity?: number;\n borderWidth?: string;\n };\n\n components?: {\n buttonShape?: ButtonShape;\n inputStyle?: InputStyle;\n cardStyle?: CardStyle;\n };\n}\n\n/**\n * Per-mode semantic token mapping. Each token holds a bare OKLCH triplet\n * (not an `oklch(…)` string) — the consumer wraps it with oklch(var(--x) /\n * <alpha-value>) via Tailwind config.\n */\nexport interface GeneratedColorsMode {\n background: OKLCHTriplet;\n foreground: OKLCHTriplet;\n card: OKLCHTriplet;\n cardForeground: OKLCHTriplet;\n popover: OKLCHTriplet;\n popoverForeground: OKLCHTriplet;\n primary: OKLCHTriplet;\n primaryForeground: OKLCHTriplet;\n secondary: OKLCHTriplet;\n secondaryForeground: OKLCHTriplet;\n muted: OKLCHTriplet;\n mutedForeground: OKLCHTriplet;\n accent: OKLCHTriplet;\n accentForeground: OKLCHTriplet;\n destructive: OKLCHTriplet;\n destructiveForeground: OKLCHTriplet;\n border: OKLCHTriplet;\n input: OKLCHTriplet;\n ring: OKLCHTriplet;\n\n // Grade extras\n success: OKLCHTriplet;\n warning: OKLCHTriplet;\n info: OKLCHTriplet;\n highlight: OKLCHTriplet;\n\n // Alert / badge surface pairs — derived from the status colours. `*-soft`\n // is the pale tinted surface for alerts, badges, and banners; `*-deep` is\n // the readable text/icon colour that pairs with it. Generated per-mode so\n // a dark mode tint is still dark, but the text stays bright.\n destructiveSoft: OKLCHTriplet;\n destructiveDeep: OKLCHTriplet;\n successSoft: OKLCHTriplet;\n successDeep: OKLCHTriplet;\n warningSoft: OKLCHTriplet;\n warningDeep: OKLCHTriplet;\n infoSoft: OKLCHTriplet;\n infoDeep: OKLCHTriplet;\n highlightSoft: OKLCHTriplet;\n highlightDeep: OKLCHTriplet;\n}\n\n/** Concrete resolved CSS values for the typography dimension. */\nexport interface GeneratedTypography {\n fontSans: string;\n fontMono: string;\n fontDisplay: string;\n headingWeight: number;\n bodyWeight: number;\n headingTracking: string;\n /** Explicit font-size for each step in the scale. */\n scale: {\n display: string;\n h1: string;\n h2: string;\n h3: string;\n h4: string;\n h5: string;\n h6: string;\n body: string;\n bodySm: string;\n };\n}\n\n/** Concrete resolved CSS values for radius. */\nexport interface GeneratedRadius {\n base: string;\n sm: string;\n md: string;\n lg: string;\n xl: string;\n \"2xl\": string;\n full: string;\n}\n\n/** Concrete resolved spacing values. */\nexport interface GeneratedSpacing {\n baseUnit: string;\n densityFactor: number;\n}\n\n/** Concrete resolved effects values. */\nexport interface GeneratedEffects {\n shadows: {\n sm: string;\n md: string;\n lg: string;\n xl: string;\n \"2xl\": string;\n inner: string;\n };\n motion: {\n fast: string;\n base: string;\n slow: string;\n slower: string;\n };\n borderWidth: string;\n}\n\n/**\n * A 5-stop categorical chart palette derived from the theme hues. Each\n * entry is an OKLCH triplet. Written to --chart-1 through --chart-5 at\n * :root — chart components (recharts) read them via var(--chart-N).\n */\nexport interface ChartPalette {\n 1: OKLCHTriplet;\n 2: OKLCHTriplet;\n 3: OKLCHTriplet;\n 4: OKLCHTriplet;\n 5: OKLCHTriplet;\n}\n\n/**\n * The full output of the generator. This is what gets applied to :root by\n * the provider, written to CSS vars, and used for rendering previews.\n *\n * The original ThemeInput is preserved on `input` so the theme can be\n * round-tripped back into the builder UI for editing.\n */\nexport interface GeneratedTheme {\n id: string;\n name: string;\n description?: string;\n tagline?: string;\n\n /** The original input, preserved for round-trip editing. */\n input: ThemeInput;\n\n /** The three base ramps. Same content regardless of which mode is active. */\n ramps: {\n neutral: Ramp;\n primary: Ramp;\n accent: Ramp;\n };\n\n /** Semantic tokens for all four modes. */\n colors: Record<ModeName, GeneratedColorsMode>;\n\n /** 5-stop palette for chart series. */\n chart: ChartPalette;\n\n typography: GeneratedTypography;\n radius: GeneratedRadius;\n spacing: GeneratedSpacing;\n effects: GeneratedEffects;\n components: NonNullable<ThemeInput[\"components\"]>;\n}\n","/**\n * Theme generator — the one true source for producing themes.\n *\n * Takes a compact ThemeInput (hues + a handful of presets) and returns a\n * fully resolved GeneratedTheme with three OKLCH color ramps, semantic\n * tokens for all four brightness modes, and concrete values for typography,\n * radius, spacing, and effects.\n *\n * Every theme in the system — built-in or user-built — flows through here.\n * Built-ins are just curated ThemeInputs; user themes live in localStorage\n * as ThemeInputs and get re-generated on load.\n */\n\nimport {\n deriveAlertPair,\n FIXED_SEMANTIC,\n hueToRamp,\n neutralRamp,\n PURE_BLACK,\n PURE_WHITE,\n type ModeName,\n type OKLCHTriplet,\n type Ramp,\n type RampKey,\n} from \"./oklch\";\nimport {\n FONTS,\n type ChartPalette,\n type ColorIntensity,\n type FontKey,\n type GeneratedColorsMode,\n type GeneratedEffects,\n type GeneratedRadius,\n type GeneratedSpacing,\n type GeneratedTheme,\n type GeneratedTypography,\n type RadiusStyle,\n type ShadowIntensity,\n type SpacingDensity,\n type ThemeInput,\n type TypeScalePreset,\n} from \"./types\";\n\nconst ALL_MODES: ModeName[] = [\"superLight\", \"light\", \"dark\", \"superDark\"];\n\n/** Global chroma multipliers — applied on top of per-ramp chroma scales. */\nconst INTENSITY_MULTIPLIER: Record<ColorIntensity, number> = {\n muted: 0.6,\n default: 1,\n vibrant: 1.3,\n};\n\n/**\n * Build the 5-stop chart palette derived from theme hues. The 5 stops are\n * tuned to be visually distinct but tonally cohesive — they reuse the\n * theme's primary, accent, and neutral, then fill the remaining slots with\n * hue-rotated variants of the primary so the series stay in the theme's\n * family. Lightness lands around 0.55 so colors read well in both light\n * and dark mode without needing a dark variant (charts rarely swap per\n * mode in practice).\n */\nfunction buildChartPalette(\n hues: { neutral: number; primary: number; accent: number },\n chroma: { primary: number; accent: number },\n intensity: number\n): ChartPalette {\n const pC = chroma.primary * intensity;\n const aC = chroma.accent * intensity;\n // Baseline chroma for the derived slots — sits between primary + accent.\n const dC = ((pC + aC) / 2) * 0.8;\n const norm = (h: number) => ((h % 360) + 360) % 360;\n // Order matters: chart-1 is the hero (primary), then two hue-rotated\n // variants for maximum visual distinction, then neutral, and accent\n // ends the series. Keeps adjacent series colors from blending —\n // accent next to primary can look nearly identical when hues are close.\n return {\n 1: `0.600 ${(0.17 * pC).toFixed(4)} ${hues.primary.toFixed(2)}`,\n 2: `0.640 ${(0.17 * dC).toFixed(4)} ${norm(hues.primary + 140).toFixed(2)}`,\n 3: `0.580 ${(0.17 * dC).toFixed(4)} ${norm(hues.primary + 220).toFixed(2)}`,\n 4: `0.510 0.0250 ${hues.neutral.toFixed(2)}`,\n 5: `0.620 ${(0.17 * aC).toFixed(4)} ${hues.accent.toFixed(2)}`,\n };\n}\n\n/**\n * Per-mode mapping from semantic token → ramp step.\n * \"neutral\" picks from the neutral ramp, \"primary\" from primary, \"accent\"\n * from accent. Special values PURE_WHITE / PURE_BLACK bypass the ramps.\n */\ntype TokenRef =\n | { source: \"neutral\" | \"primary\" | \"accent\"; step: RampKey }\n | { source: \"pure\"; value: OKLCHTriplet };\n\nconst n = (step: RampKey): TokenRef => ({ source: \"neutral\", step });\nconst p = (step: RampKey): TokenRef => ({ source: \"primary\", step });\nconst a = (step: RampKey): TokenRef => ({ source: \"accent\", step });\nconst PURE = (value: OKLCHTriplet): TokenRef => ({ source: \"pure\", value });\n\ninterface TokenMap {\n background: TokenRef;\n foreground: TokenRef;\n card: TokenRef;\n cardForeground: TokenRef;\n popover: TokenRef;\n popoverForeground: TokenRef;\n primary: TokenRef;\n primaryForeground: TokenRef;\n secondary: TokenRef;\n secondaryForeground: TokenRef;\n muted: TokenRef;\n mutedForeground: TokenRef;\n accent: TokenRef;\n accentForeground: TokenRef;\n border: TokenRef;\n input: TokenRef;\n ring: TokenRef;\n}\n\n/**\n * The mapping that makes each mode feel like itself. This is the heart of\n * the 4-mode system — tune these if a mode ends up too dim / too bright.\n */\nconst MODE_TOKENS: Record<ModeName, TokenMap> = {\n superLight: {\n // Airy: low contrast foreground, off-white surfaces, richer primary to stand out.\n background: n(50),\n foreground: n(800),\n card: PURE(PURE_WHITE),\n cardForeground: n(800),\n popover: PURE(PURE_WHITE),\n popoverForeground: n(800),\n primary: p(600),\n primaryForeground: p(50),\n secondary: n(100),\n secondaryForeground: n(700),\n muted: n(100),\n mutedForeground: n(500),\n accent: a(600),\n accentForeground: a(50),\n border: n(200),\n input: n(200),\n ring: p(500),\n },\n light: {\n // Standard light.\n background: n(50),\n foreground: n(950),\n card: PURE(PURE_WHITE),\n cardForeground: n(950),\n popover: PURE(PURE_WHITE),\n popoverForeground: n(950),\n primary: p(500),\n primaryForeground: p(50),\n secondary: n(100),\n secondaryForeground: n(700),\n muted: n(100),\n mutedForeground: n(500),\n accent: a(500),\n accentForeground: a(50),\n border: n(200),\n input: n(200),\n ring: p(500),\n },\n dark: {\n // Standard dark.\n background: n(950),\n foreground: n(50),\n card: n(900),\n cardForeground: n(50),\n popover: n(900),\n popoverForeground: n(50),\n primary: p(400),\n primaryForeground: p(950),\n secondary: n(800),\n secondaryForeground: n(200),\n muted: n(800),\n mutedForeground: n(400),\n accent: a(400),\n accentForeground: a(950),\n border: n(800),\n input: n(800),\n ring: p(400),\n },\n superDark: {\n // OLED-deep: pure black surface, brighter primary, tighter borders.\n background: PURE(PURE_BLACK),\n foreground: n(100),\n card: n(950),\n cardForeground: n(100),\n popover: n(950),\n popoverForeground: n(100),\n primary: p(300),\n primaryForeground: p(950),\n secondary: n(900),\n secondaryForeground: n(300),\n muted: n(900),\n mutedForeground: n(500),\n accent: a(300),\n accentForeground: a(950),\n border: n(900),\n input: n(900),\n ring: p(300),\n },\n};\n\nfunction resolveToken(\n ref: TokenRef,\n ramps: { neutral: Ramp; primary: Ramp; accent: Ramp }\n): OKLCHTriplet {\n if (ref.source === \"pure\") return ref.value;\n return ramps[ref.source][ref.step];\n}\n\nfunction deriveColorsForMode(\n ramps: { neutral: Ramp; primary: Ramp; accent: Ramp },\n mode: ModeName\n): GeneratedColorsMode {\n const map = MODE_TOKENS[mode];\n // Fixed semantic colors don't change with the brand hue — they use the\n // light/dark set because the 4 modes split cleanly into \"has light bg\"\n // and \"has dark bg\" for contrast purposes.\n const isLightBg = mode === \"superLight\" || mode === \"light\";\n const fixed = isLightBg ? FIXED_SEMANTIC.light : FIXED_SEMANTIC.dark;\n\n return {\n background: resolveToken(map.background, ramps),\n foreground: resolveToken(map.foreground, ramps),\n card: resolveToken(map.card, ramps),\n cardForeground: resolveToken(map.cardForeground, ramps),\n popover: resolveToken(map.popover, ramps),\n popoverForeground: resolveToken(map.popoverForeground, ramps),\n primary: resolveToken(map.primary, ramps),\n primaryForeground: resolveToken(map.primaryForeground, ramps),\n secondary: resolveToken(map.secondary, ramps),\n secondaryForeground: resolveToken(map.secondaryForeground, ramps),\n muted: resolveToken(map.muted, ramps),\n mutedForeground: resolveToken(map.mutedForeground, ramps),\n accent: resolveToken(map.accent, ramps),\n accentForeground: resolveToken(map.accentForeground, ramps),\n border: resolveToken(map.border, ramps),\n input: resolveToken(map.input, ramps),\n ring: resolveToken(map.ring, ramps),\n destructive: fixed.destructive,\n destructiveForeground: fixed.destructiveFg,\n success: fixed.success,\n warning: fixed.warning,\n info: fixed.info,\n highlight: fixed.highlight,\n\n // `-soft` / `-deep` derivatives are computed per mode from the base\n // status triplet. The \"alert mode\" only distinguishes light vs. dark;\n // superLight and superDark collapse onto the same pair as their\n // neighbour because the tinted alert surface doesn't need more than two\n // contrast-calibrated variants.\n ...(() => {\n const alertMode: \"light\" | \"dark\" = isLightBg ? \"light\" : \"dark\";\n const d = deriveAlertPair(fixed.destructive, alertMode);\n const s = deriveAlertPair(fixed.success, alertMode);\n const w = deriveAlertPair(fixed.warning, alertMode);\n const i = deriveAlertPair(fixed.info, alertMode);\n const hi = deriveAlertPair(fixed.highlight, alertMode);\n return {\n destructiveSoft: d.soft,\n destructiveDeep: d.deep,\n successSoft: s.soft,\n successDeep: s.deep,\n warningSoft: w.soft,\n warningDeep: w.deep,\n infoSoft: i.soft,\n infoDeep: i.deep,\n highlightSoft: hi.soft,\n highlightDeep: hi.deep,\n };\n })(),\n };\n}\n\n/* ─────────────────────────── Typography ─────────────────────────── */\n\n/** Base type ladder (the \"default\" scale). Other scales multiply these. */\nconst BASE_SCALE = {\n display: 3.75, // rem\n h1: 2.5,\n h2: 2,\n h3: 1.5,\n h4: 1.25,\n h5: 1.125,\n h6: 1,\n body: 1,\n bodySm: 0.875,\n};\n\nconst SCALE_MULTIPLIER: Record<TypeScalePreset, number> = {\n compact: 0.85,\n default: 1,\n spacious: 1.18,\n};\n\nfunction resolveTypography(\n input: ThemeInput[\"typography\"]\n): GeneratedTypography {\n const mult = SCALE_MULTIPLIER[input.scale];\n const rem = (n: number) => `${(n * mult).toFixed(3)}rem`;\n return {\n fontSans: FONTS[input.body],\n fontMono: FONTS[input.mono],\n fontDisplay: FONTS[input.display],\n headingWeight: input.headingWeight ?? 600,\n bodyWeight: input.bodyWeight ?? 400,\n headingTracking: input.headingTracking ?? \"-0.01em\",\n scale: {\n display: rem(BASE_SCALE.display),\n h1: rem(BASE_SCALE.h1),\n h2: rem(BASE_SCALE.h2),\n h3: rem(BASE_SCALE.h3),\n h4: rem(BASE_SCALE.h4),\n h5: rem(BASE_SCALE.h5),\n h6: rem(BASE_SCALE.h6),\n body: rem(BASE_SCALE.body),\n bodySm: rem(BASE_SCALE.bodySm),\n },\n };\n}\n\n/* ─────────────────────────── Radius ─────────────────────────── */\n\n/**\n * Each preset defines the \"base\" radius (what --radius resolves to). The\n * sm/md/lg/xl/2xl derive from it. \"pill\" snaps the base reasonably low\n * (components like buttons override to full-pill via data-button-shape).\n */\nconst RADIUS_BASE: Record<RadiusStyle, number> = {\n sharp: 0,\n subtle: 0.25, // rem\n soft: 0.5,\n round: 0.875,\n pill: 1.25, // components override as needed\n};\n\nfunction resolveRadius(input: ThemeInput[\"radius\"]): GeneratedRadius {\n const base = RADIUS_BASE[input.style];\n const r = (n: number) => `${n.toFixed(3)}rem`;\n return {\n base: r(base),\n sm: r(Math.max(0, base - 0.25)),\n md: r(base),\n lg: r(base + 0.25),\n xl: r(base + 0.5),\n \"2xl\": r(base + 1),\n full: \"9999px\",\n };\n}\n\n/* ─────────────────────────── Spacing ─────────────────────────── */\n\nconst DENSITY_FACTOR: Record<SpacingDensity, number> = {\n tight: 0.85,\n default: 1,\n roomy: 1.2,\n};\n\nfunction resolveSpacing(input: ThemeInput[\"spacing\"]): GeneratedSpacing {\n return {\n baseUnit: \"1rem\",\n densityFactor: DENSITY_FACTOR[input.density],\n };\n}\n\n/* ─────────────────────────── Effects ─────────────────────────── */\n\nconst SHADOW_PRESETS: Record<ShadowIntensity, GeneratedEffects[\"shadows\"]> = {\n none: {\n sm: \"none\",\n md: \"none\",\n lg: \"none\",\n xl: \"none\",\n \"2xl\": \"none\",\n inner: \"none\",\n },\n subtle: {\n sm: \"0 1px 2px 0 rgb(0 0 0 / 0.03)\",\n md: \"0 2px 4px -1px rgb(0 0 0 / 0.04), 0 1px 2px -1px rgb(0 0 0 / 0.03)\",\n lg: \"0 6px 14px -2px rgb(0 0 0 / 0.05)\",\n xl: \"0 12px 24px -4px rgb(0 0 0 / 0.06)\",\n \"2xl\": \"0 24px 48px -12px rgb(0 0 0 / 0.12)\",\n inner: \"inset 0 1px 2px 0 rgb(0 0 0 / 0.03)\",\n },\n default: {\n sm: \"0 1px 2px 0 rgb(0 0 0 / 0.05)\",\n md: \"0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)\",\n lg: \"0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)\",\n xl: \"0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)\",\n \"2xl\": \"0 25px 50px -12px rgb(0 0 0 / 0.25)\",\n inner: \"inset 0 2px 4px 0 rgb(0 0 0 / 0.05)\",\n },\n dramatic: {\n sm: \"0 2px 4px 0 rgb(0 0 0 / 0.12)\",\n md: \"0 8px 16px -2px rgb(0 0 0 / 0.18), 0 4px 8px -4px rgb(0 0 0 / 0.12)\",\n lg: \"0 20px 32px -4px rgb(0 0 0 / 0.22), 0 8px 16px -8px rgb(0 0 0 / 0.18)\",\n xl: \"0 32px 48px -6px rgb(0 0 0 / 0.28), 0 12px 24px -10px rgb(0 0 0 / 0.22)\",\n \"2xl\": \"0 48px 80px -16px rgb(0 0 0 / 0.45)\",\n inner: \"inset 0 4px 8px 0 rgb(0 0 0 / 0.1)\",\n },\n};\n\nfunction resolveEffects(input: ThemeInput[\"effects\"]): GeneratedEffects {\n const preset = input?.shadows ?? \"default\";\n const intensity = input?.motionIntensity ?? 1;\n const scale = (ms: number) => `${Math.round(ms * intensity)}ms`;\n return {\n shadows: SHADOW_PRESETS[preset],\n motion: {\n fast: scale(150),\n base: scale(200),\n slow: scale(300),\n slower: scale(500),\n },\n borderWidth: input?.borderWidth ?? \"1px\",\n };\n}\n\n/* ─────────────────────────── Main generator ─────────────────────────── */\n\n/**\n * Turn a compact ThemeInput into a fully resolved GeneratedTheme.\n * Pure function — safe to run on the client, server, or at build time.\n */\nexport function generateTheme(input: ThemeInput): GeneratedTheme {\n // 0. Global intensity multiplier — flips everything muted/default/vibrant.\n const intensity = INTENSITY_MULTIPLIER[input.intensity ?? \"default\"];\n\n // 1. Build the three base ramps — per-ramp chroma scales multiply by the\n // global intensity so muted/vibrant affect everything cohesively.\n const pureGray = input.neutralPureGray ?? false;\n const neutralChroma = (input.chroma?.neutral ?? 0.08) * intensity;\n const primaryChroma = (input.chroma?.primary ?? 1) * intensity;\n const accentChroma = (input.chroma?.accent ?? 1) * intensity;\n\n const neutral = pureGray\n ? neutralRamp()\n : hueToRamp({ hue: input.hues.neutral, chromaScale: neutralChroma });\n const primary = hueToRamp({ hue: input.hues.primary, chromaScale: primaryChroma });\n const accent = hueToRamp({ hue: input.hues.accent, chromaScale: accentChroma });\n\n const ramps = { neutral, primary, accent };\n\n const chart = buildChartPalette(\n input.hues,\n { primary: primaryChroma, accent: accentChroma },\n intensity\n );\n\n // 2. Derive semantic tokens for all four modes\n const colors = Object.fromEntries(\n ALL_MODES.map((mode) => [mode, deriveColorsForMode(ramps, mode)])\n ) as Record<ModeName, GeneratedColorsMode>;\n\n // 3. Resolve non-color config into concrete CSS values\n const typography = resolveTypography(input.typography);\n const radius = resolveRadius(input.radius);\n const spacing = resolveSpacing(input.spacing);\n const effects = resolveEffects(input.effects);\n\n // 4. Apply component defaults\n const components: GeneratedTheme[\"components\"] = {\n buttonShape: input.components?.buttonShape ?? \"default\",\n inputStyle: input.components?.inputStyle ?? \"outlined\",\n cardStyle: input.components?.cardStyle ?? \"flat\",\n };\n\n return {\n id: input.id,\n name: input.name,\n description: input.description,\n tagline: input.tagline,\n input,\n ramps,\n colors,\n chart,\n typography,\n radius,\n spacing,\n effects,\n components,\n };\n}\n","import type { ThemeInput } from \"./types\";\n\n/**\n * Built-in ThemeInputs. Every theme — built-in or user-built — is a\n * ThemeInput. Built-ins are just curated ones we ship as starting points.\n *\n * \"Calm\" is the canonical Grade DS look: warm neutrals, terracotta primary,\n * serif display + body, roomier spacing, rounded corners, pill buttons,\n * subtle shadows. \"Energy\" is a bolder alternate — teal primary, Geist\n * sans, tighter feel.\n *\n * To add a new built-in: define a ThemeInput here, import it in index.ts,\n * and add it to the registry.\n */\n\n/**\n * Calm — the canonical Grade DS theme.\n *\n * Warm neutral tint (~40° amber), terracotta primary (~20°), amber accent.\n * Serif display and body (Fraunces with its full variable weight range),\n * roomier spacing, rounder corners, pill buttons, outlined cards, subtle\n * shadows, slower motion.\n */\nexport const calmInput: ThemeInput = {\n id: \"calm\",\n name: \"Calm\",\n description: \"Warm neutrals, terracotta primary, serif typography.\",\n tagline: \"Signature\",\n hues: {\n neutral: 40,\n primary: 20,\n accent: 40,\n },\n chroma: {\n neutral: 0.15,\n primary: 0.75,\n accent: 0.8,\n },\n // Calm leans muted — it's a quiet editorial theme by design.\n intensity: \"muted\",\n typography: {\n // Fraunces has proper variable weights, so bold headings look like serif\n // bold (Instrument Serif only ships in 400 and synthesizes awkwardly when\n // something like `font-bold` on an h1 forces 700).\n display: \"fraunces\",\n body: \"fraunces\",\n mono: \"jetbrainsMono\",\n scale: \"default\",\n headingWeight: 600,\n headingTracking: \"-0.02em\",\n },\n spacing: { density: \"roomy\" },\n radius: { style: \"round\" },\n effects: {\n shadows: \"subtle\",\n motionIntensity: 1.25,\n },\n components: {\n buttonShape: \"pill\",\n inputStyle: \"outlined\",\n cardStyle: \"outlined\",\n },\n};\n\n/**\n * Energy — bolder alternate theme.\n *\n * Teal primary + indigo accent (complementary-cool pairing). Neutral gets\n * a whisper of chroma (0.08× default curve) so grays read cool against\n * both brand colors rather than clinical. Modern sans (Geist) with\n * tighter spacing and standard corners.\n */\nexport const energyInput: ThemeInput = {\n id: \"energy\",\n name: \"Energy\",\n description: \"Teal + indigo — punchy, cool-tone, modern sans.\",\n tagline: \"Alternate\",\n hues: {\n neutral: 175,\n primary: 175,\n accent: 235, // indigo — distinct from teal primary, stays cool-tone\n },\n chroma: {\n neutral: 0.08,\n primary: 1.0,\n accent: 1.0,\n },\n // Energy is loud — bump intensity so the teal pops.\n intensity: \"vibrant\",\n typography: {\n display: \"geist\",\n body: \"geist\",\n mono: \"geistMono\",\n scale: \"default\",\n headingWeight: 600,\n },\n spacing: { density: \"default\" },\n radius: { style: \"soft\" },\n effects: {\n shadows: \"default\",\n motionIntensity: 1,\n },\n components: {\n buttonShape: \"default\",\n inputStyle: \"outlined\",\n cardStyle: \"flat\",\n },\n};\n\nexport const BUILT_IN_INPUTS: ThemeInput[] = [calmInput, energyInput];\n","import type { GeneratedColorsMode, GeneratedTheme } from \"./types\";\nimport { RAMP_KEYS, type ModeName, type Ramp } from \"./oklch\";\n\n/**\n * Runtime theme application.\n *\n * Writes a GeneratedTheme to :root as CSS custom properties. The consuming\n * CSS (globals.css + tailwind.config.ts) wraps each var with\n * oklch(var(--x) / <alpha-value>)\n * so Tailwind opacity shortcuts keep working.\n *\n * Apart from color tokens, this also writes:\n * - Typography CSS vars (--font-sans, --font-display, --font-mono,\n * --font-heading-weight, --font-heading-tracking, plus the type scale)\n * - Radius vars (--radius + --rds-radius-*)\n * - Spacing density (--rds-density multiplier)\n * - Shadow, motion, and border vars (--rds-shadow-*, --rds-transition-*)\n * - Ramp swatches (--ramp-neutral-50…950, etc.) for the theme builder UI\n * - data-* attributes driving component shape CSS rules\n */\n\nexport type { ModeName } from \"./oklch\";\n\n/** Expand a GeneratedColorsMode into a flat { --var: value } map. */\nfunction colorVars(c: GeneratedColorsMode): Record<string, string> {\n return {\n \"--background\": c.background,\n \"--foreground\": c.foreground,\n \"--card\": c.card,\n \"--card-foreground\": c.cardForeground,\n \"--popover\": c.popover,\n \"--popover-foreground\": c.popoverForeground,\n \"--primary\": c.primary,\n \"--primary-foreground\": c.primaryForeground,\n \"--secondary\": c.secondary,\n \"--secondary-foreground\": c.secondaryForeground,\n \"--muted\": c.muted,\n \"--muted-foreground\": c.mutedForeground,\n \"--accent\": c.accent,\n \"--accent-foreground\": c.accentForeground,\n \"--destructive\": c.destructive,\n \"--destructive-foreground\": c.destructiveForeground,\n \"--border\": c.border,\n \"--input\": c.input,\n \"--ring\": c.ring,\n \"--success\": c.success,\n \"--warning\": c.warning,\n \"--info\": c.info,\n \"--highlight\": c.highlight,\n\n // Alert surface pairs — paler tinted surface + deeper on-surface text\n // for each status colour. Consumed by Alert, Badge (soft variants), and\n // anywhere a banner needs a status tint without going full-saturation.\n \"--destructive-soft\": c.destructiveSoft,\n \"--destructive-deep\": c.destructiveDeep,\n \"--success-soft\": c.successSoft,\n \"--success-deep\": c.successDeep,\n \"--warning-soft\": c.warningSoft,\n \"--warning-deep\": c.warningDeep,\n \"--info-soft\": c.infoSoft,\n \"--info-deep\": c.infoDeep,\n \"--highlight-soft\": c.highlightSoft,\n \"--highlight-deep\": c.highlightDeep,\n };\n}\n\n/**\n * Produce every CSS custom property a given GeneratedTheme + mode implies,\n * as a flat { key: value } map. Useful for the provider (applies to :root)\n * and the builder preview pane (applies to a scoped wrapper).\n */\nexport function themeToCSSVars(\n theme: GeneratedTheme,\n mode: ModeName\n): Record<string, string> {\n const colors = theme.colors[mode];\n const vars: Record<string, string> = {\n ...colorVars(colors),\n\n // --- Ramp swatches (useful for token previews + future palette tools) ---\n // Each ramp stop is exposed as --ramp-<name>-<step> so the builder can\n // render live palette chips without re-running the generator.\n ...flattenRamp(\"neutral\", theme.ramps.neutral),\n ...flattenRamp(\"primary\", theme.ramps.primary),\n ...flattenRamp(\"accent\", theme.ramps.accent),\n\n // --- Chart palette — 5 tonally-cohesive series colors derived from hues.\n \"--chart-1\": theme.chart[1],\n \"--chart-2\": theme.chart[2],\n \"--chart-3\": theme.chart[3],\n \"--chart-4\": theme.chart[4],\n \"--chart-5\": theme.chart[5],\n\n // --- Typography ---\n \"--font-sans\": theme.typography.fontSans,\n \"--font-mono\": theme.typography.fontMono,\n \"--font-display\": theme.typography.fontDisplay,\n \"--font-heading-weight\": String(theme.typography.headingWeight),\n \"--font-body-weight\": String(theme.typography.bodyWeight),\n \"--font-heading-tracking\": theme.typography.headingTracking,\n \"--text-display\": theme.typography.scale.display,\n \"--text-h1\": theme.typography.scale.h1,\n \"--text-h2\": theme.typography.scale.h2,\n \"--text-h3\": theme.typography.scale.h3,\n \"--text-h4\": theme.typography.scale.h4,\n \"--text-h5\": theme.typography.scale.h5,\n \"--text-h6\": theme.typography.scale.h6,\n \"--text-body\": theme.typography.scale.body,\n \"--text-body-sm\": theme.typography.scale.bodySm,\n\n // --- Radius ---\n \"--radius\": theme.radius.base,\n \"--rds-radius-sm\": theme.radius.sm,\n \"--rds-radius-md\": theme.radius.md,\n \"--rds-radius-lg\": theme.radius.lg,\n \"--rds-radius-xl\": theme.radius.xl,\n \"--rds-radius-2xl\": theme.radius[\"2xl\"],\n \"--rds-radius-full\": theme.radius.full,\n\n // --- Spacing density multiplier (consumed via calc()) ---\n \"--rds-density\": String(theme.spacing.densityFactor),\n\n // --- Shadows ---\n \"--rds-shadow-sm\": theme.effects.shadows.sm,\n \"--rds-shadow-md\": theme.effects.shadows.md,\n \"--rds-shadow-lg\": theme.effects.shadows.lg,\n \"--rds-shadow-xl\": theme.effects.shadows.xl,\n \"--rds-shadow-2xl\": theme.effects.shadows[\"2xl\"],\n \"--rds-shadow-inner\": theme.effects.shadows.inner,\n\n // --- Motion ---\n \"--rds-transition-fast\": theme.effects.motion.fast,\n \"--rds-transition-base\": theme.effects.motion.base,\n \"--rds-transition-slow\": theme.effects.motion.slow,\n \"--rds-transition-slower\": theme.effects.motion.slower,\n\n // --- Borders ---\n \"--rds-border-width\": theme.effects.borderWidth,\n };\n return vars;\n}\n\nfunction flattenRamp(\n name: \"neutral\" | \"primary\" | \"accent\",\n ramp: Ramp\n): Record<string, string> {\n const out: Record<string, string> = {};\n for (const step of RAMP_KEYS) {\n out[`--ramp-${name}-${step}`] = ramp[step];\n }\n return out;\n}\n\n/**\n * Apply a theme to the document root. Writes every CSS variable produced by\n * themeToCSSVars and sets a set of data attributes that component-shape\n * CSS rules key off of.\n *\n * Safe to call repeatedly — each call fully resets the vars the theme\n * controls. Vars the theme doesn't touch (e.g. --rds-green-500 in\n * globals.css) are left alone.\n */\nexport function applyThemeToRoot(theme: GeneratedTheme, mode: ModeName): void {\n if (typeof document === \"undefined\") return;\n const root = document.documentElement;\n const vars = themeToCSSVars(theme, mode);\n for (const [key, value] of Object.entries(vars)) {\n root.style.setProperty(key, value);\n }\n\n // Metadata attributes — components key styles off these.\n // Fall back to sensible defaults if a field is missing (shouldn't happen\n // for generator output, but keeps this safe if called with a partial).\n root.setAttribute(\"data-ramp-theme\", theme.id);\n root.setAttribute(\"data-mode\", mode);\n root.setAttribute(\"data-button-shape\", theme.components.buttonShape ?? \"default\");\n root.setAttribute(\"data-input-style\", theme.components.inputStyle ?? \"outlined\");\n root.setAttribute(\"data-card-style\", theme.components.cardStyle ?? \"flat\");\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\n\n/**\n * Convert an OKLCH triplet (e.g. \"0.610 0.128 20\") to its sRGB hex equivalent.\n *\n * Implemented by asking the browser to compute the color — we set the\n * oklch() value on a throwaway element, read the resolved rgb() string,\n * and format to hex. This sidesteps having to reimplement the OKLCH → Lab\n * → XYZ → sRGB conversion chain by hand, and picks up the browser's own\n * gamut-mapping behaviour for free.\n *\n * Returns \"\" during SSR (no document), so callers should gate on truthy.\n */\nexport function oklchToHex(triplet: string): string {\n if (typeof document === \"undefined\") return \"\";\n const probe = document.createElement(\"span\");\n probe.style.color = `oklch(${triplet})`;\n // Must be in the DOM for getComputedStyle to resolve. Keep it invisible.\n probe.style.position = \"absolute\";\n probe.style.visibility = \"hidden\";\n document.body.appendChild(probe);\n const rgb = getComputedStyle(probe).color; // \"rgb(r, g, b)\" or \"rgba(...)\"\n document.body.removeChild(probe);\n const match = rgb.match(/\\d+/g);\n if (!match || match.length < 3) return \"\";\n const [r, g, b] = match.slice(0, 3).map(Number);\n return (\n \"#\" +\n [r, g, b]\n .map((x) => Math.max(0, Math.min(255, x)).toString(16).padStart(2, \"0\"))\n .join(\"\")\n .toUpperCase()\n );\n}\n\n/**\n * React hook: convert a list of OKLCH triplets to hex values on the client.\n * Returns an empty array during SSR and the resolved hexes after mount.\n */\nexport function useOklchHexes(triplets: readonly string[]): string[] {\n const key = useMemo(() => triplets.join(\"|\"), [triplets]);\n const [hexes, setHexes] = useState<string[]>([]);\n useEffect(() => {\n setHexes(triplets.map(oklchToHex));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [key]);\n return hexes;\n}\n\n/**\n * Format an OKLCH triplet compactly for display. Strips excess decimals\n * from the ugly 0.00225 40 looks and trims to something like 0.99 0.002 40.\n */\nexport function formatOklch(triplet: string): string {\n const parts = triplet.trim().split(/\\s+/);\n if (parts.length < 3) return triplet;\n const [lRaw, cRaw, hRaw] = parts;\n const l = Number(lRaw);\n const c = Number(cRaw);\n const h = Number(hRaw);\n if (Number.isNaN(l) || Number.isNaN(c) || Number.isNaN(h)) return triplet;\n // L: 2 decimals, C: 3 (or 2 if very small), H: nearest integer.\n const lStr = l.toFixed(2);\n const cStr = c < 0.01 ? c.toFixed(3) : c.toFixed(2);\n const hStr = String(Math.round(h));\n return `${lStr} ${cStr} ${hStr}°`;\n}\n","/**\n * Theme → Markdown exporter.\n *\n * Produces a self-contained spec document for a GeneratedTheme. The output\n * is designed to be pasted into a fresh LLM prompt (Claude, ChatGPT, Cursor,\n * whatever) alongside a design brief, so the model produces UI that looks\n * exactly like the theme even with zero other project context.\n *\n * What it includes:\n * - Theme summary + full ThemeInput config (round-trippable)\n * - All three 11-stop ramps as OKLCH triplets + hex equivalents\n * - Semantic tokens for light + dark modes\n * - Fixed semantic colors (success / warning / etc.)\n * - 5-stop chart palette\n * - Typography resolution (font-family strings, scale, weights, tracking)\n * - Radius + spacing + effects values\n * - Component-level defaults\n * - Tailwind / CSS var conventions\n * - Component API summary (just enough for an LLM to hand-compose)\n * - Feel / voice guidance so generated UI matches the theme's character\n *\n * Intentionally ASCII/markdown only — no images, no code that needs to\n * execute. Paste it anywhere.\n */\n\nimport { oklchToHex } from \"./oklch-to-hex\";\nimport type { GeneratedTheme, Ramp } from \"./types\";\nimport { RAMP_KEYS, type RampKey } from \"./oklch\";\n\n/** Format a single OKLCH triplet compactly, with hex lookup. */\nfunction rowTriplet(triplet: string): { oklch: string; hex: string } {\n const parts = triplet.trim().split(/\\s+/);\n if (parts.length < 3) return { oklch: triplet, hex: \"\" };\n const [l, c, h] = parts.map(Number);\n const oklch = `${l.toFixed(3)} ${c.toFixed(3)} ${Math.round(h)}`;\n const hex = oklchToHex(triplet);\n return { oklch, hex };\n}\n\n/** Render an 11-row table for a ramp. */\nfunction rampTable(name: string, ramp: Ramp, hue: number): string {\n const lines = [\n `### ${name} ramp (hue ${Math.round(hue)}°)`,\n ``,\n `| Step | OKLCH | Hex |`,\n `|------|-------|-----|`,\n ];\n for (const step of RAMP_KEYS) {\n const { oklch, hex } = rowTriplet(ramp[step as RampKey]);\n lines.push(`| ${step} | \\`${oklch}\\` | \\`${hex || \"—\"}\\` |`);\n }\n return lines.join(\"\\n\");\n}\n\n/** Render a semantic token table (light + dark side by side). */\nfunction semanticTable(\n label: string,\n rows: Array<{ token: string; light: string; dark: string; usage: string }>\n): string {\n const lines = [\n `### ${label}`,\n ``,\n `| Token | Usage | Light (hex) | Dark (hex) |`,\n `|-------|-------|-------------|------------|`,\n ];\n for (const r of rows) {\n const lightHex = oklchToHex(r.light) || \"—\";\n const darkHex = oklchToHex(r.dark) || \"—\";\n lines.push(\n `| \\`--${r.token}\\` | ${r.usage} | \\`${lightHex}\\` (\\`${r.light}\\`) | \\`${darkHex}\\` (\\`${r.dark}\\`) |`\n );\n }\n return lines.join(\"\\n\");\n}\n\n/** Stable JSON pretty-printer for the input snapshot. */\nfunction stringifyInput(theme: GeneratedTheme): string {\n return JSON.stringify(theme.input, null, 2);\n}\n\n/** The full template. */\nexport function generateThemeMarkdown(theme: GeneratedTheme): string {\n const { input, ramps, colors, chart, typography, radius, spacing, effects, components } = theme;\n const intensity = input.intensity ?? \"default\";\n\n // Core / derived semantic tokens — two columns (light / dark).\n const mapToken = (token: string) => ({\n token,\n usage: USAGE_HINTS[token] ?? \"\",\n light: (colors.light as unknown as Record<string, string>)[token],\n dark: (colors.dark as unknown as Record<string, string>)[token],\n });\n\n const hueDerived = [\n \"background\",\n \"foreground\",\n \"card\",\n \"cardForeground\",\n \"popover\",\n \"popoverForeground\",\n \"primary\",\n \"primaryForeground\",\n \"secondary\",\n \"secondaryForeground\",\n \"muted\",\n \"mutedForeground\",\n \"accent\",\n \"accentForeground\",\n \"border\",\n \"input\",\n \"ring\",\n ].map(mapToken);\n\n const fixedSemantic = [\n \"destructive\",\n \"destructiveForeground\",\n \"success\",\n \"warning\",\n \"info\",\n \"highlight\",\n ].map(mapToken);\n\n // Chart palette row with hex.\n const chartRows = ([1, 2, 3, 4, 5] as const).map((i) => {\n const triplet = chart[i];\n return { slot: i, triplet, hex: oklchToHex(triplet) || \"—\" };\n });\n\n return `# ${theme.name} — Grade Design System Theme\n\n> **Portable theme spec.** Paste this entire file into a fresh LLM prompt along with your design brief. The model will have everything it needs to produce UI that matches this exact theme — colors, typography, spacing, shapes, and the \"feel\" we're after.\n\n## At a glance\n\n- **Name**: ${theme.name}\n- **ID**: \\`${input.id}\\`\n${input.description ? `- **Description**: ${input.description}\\n` : \"\"}- **Hues**: neutral \\`${input.hues.neutral}°\\` · primary \\`${input.hues.primary}°\\` · accent \\`${input.hues.accent}°\\`\n- **Intensity**: \\`${intensity}\\` ${intensity === \"muted\" ? \"(quieter chroma across the board)\" : intensity === \"vibrant\" ? \"(punchier chroma across the board)\" : \"(balanced)\"}\n- **Typography**: ${input.typography.display} display · ${input.typography.body} body · ${input.typography.mono} mono · scale \\`${input.typography.scale}\\`\n- **Spacing density**: \\`${input.spacing.density}\\`\n- **Radius style**: \\`${input.radius.style}\\` (base \\`${radius.base}\\`)\n- **Button shape**: \\`${components.buttonShape}\\` · **Input style**: \\`${components.inputStyle}\\` · **Card style**: \\`${components.cardStyle}\\`\n- **Shadow preset**: \\`${input.effects?.shadows ?? \"default\"}\\` · **Motion intensity**: \\`${input.effects?.motionIntensity ?? 1}\\`\n\n## How themes work\n\nEvery theme in Grade DS is produced by a pure function:\n\n\\`\\`\\`ts\ngenerateTheme(input: ThemeInput) => GeneratedTheme\n\\`\\`\\`\n\nA \\`ThemeInput\\` is a small object (three hues plus a handful of presets). The generator turns it into three 11-stop **OKLCH** color ramps, semantic tokens for four brightness modes (superLight / light / dark / superDark), a chart palette, and concrete values for typography, radius, spacing, and effects. Everything downstream reads from CSS variables set on \\`:root\\`.\n\n## Full ThemeInput (round-trippable)\n\n\\`\\`\\`json\n${stringifyInput(theme)}\n\\`\\`\\`\n\n## Color ramps\n\nThree 11-stop OKLCH ramps, generated from the input hues + chromas + global intensity. Every color elsewhere in the theme resolves back to one of these stops.\n\n${rampTable(\"Neutral\", ramps.neutral, input.hues.neutral)}\n\n${rampTable(\"Primary\", ramps.primary, input.hues.primary)}\n\n${rampTable(\"Accent\", ramps.accent, input.hues.accent)}\n\n## Semantic tokens (hue-derived)\n\nPurpose-based tokens drawn from the ramps. Two values per token — the generator produces them for all four brightness modes, but only light + dark are shown here for brevity.\n\n${semanticTable(\"Core semantic tokens\", hueDerived)}\n\n## Fixed semantic tokens (not hue-derived)\n\nStatus colors stay consistent across themes so users always read green as success, red as destructive, etc. Accessibility wins over brand cohesion.\n\n${semanticTable(\"Status colors\", fixedSemantic)}\n\n## Chart palette\n\n5-stop categorical palette derived from theme hues. Primary leads, then two hue-rotated variants, then neutral, then accent. Adjacent slots are guaranteed to be visually distinct.\n\n| Slot | OKLCH | Hex |\n|------|-------|-----|\n${chartRows.map((r) => `| \\`--chart-${r.slot}\\` | \\`${r.triplet}\\` | \\`${r.hex}\\` |`).join(\"\\n\")}\n\n## Typography\n\n- **Display font**: \\`${typography.fontDisplay}\\`\n- **Body font**: \\`${typography.fontSans}\\`\n- **Mono font**: \\`${typography.fontMono}\\`\n- **Heading weight**: \\`${typography.headingWeight}\\`\n- **Body weight**: \\`${typography.bodyWeight}\\`\n- **Heading letter-spacing**: \\`${typography.headingTracking}\\`\n\n### Type scale\n\n| Step | Size |\n|------|------|\n| \\`text-display\\` | \\`${typography.scale.display}\\` |\n| \\`text-h1\\` | \\`${typography.scale.h1}\\` |\n| \\`text-h2\\` | \\`${typography.scale.h2}\\` |\n| \\`text-h3\\` | \\`${typography.scale.h3}\\` |\n| \\`text-h4\\` | \\`${typography.scale.h4}\\` |\n| \\`text-h5\\` | \\`${typography.scale.h5}\\` |\n| \\`text-h6\\` | \\`${typography.scale.h6}\\` |\n| body | \\`${typography.scale.body}\\` |\n| body-sm | \\`${typography.scale.bodySm}\\` |\n\n## Radius, spacing, effects\n\n### Radius\n\n| Step | Value |\n|------|-------|\n| \\`--radius\\` (base) | \\`${radius.base}\\` |\n| \\`--rds-radius-sm\\` | \\`${radius.sm}\\` |\n| \\`--rds-radius-md\\` | \\`${radius.md}\\` |\n| \\`--rds-radius-lg\\` | \\`${radius.lg}\\` |\n| \\`--rds-radius-xl\\` | \\`${radius.xl}\\` |\n| \\`--rds-radius-2xl\\` | \\`${radius[\"2xl\"]}\\` |\n| \\`--rds-radius-full\\` | \\`${radius.full}\\` |\n\n### Spacing\n\n- **Density factor**: \\`${spacing.densityFactor}\\` (applied as \\`var(--rds-density)\\` on components that opt in)\n- **Base unit**: \\`${spacing.baseUnit}\\`\n\n### Motion\n\n| Var | Duration |\n|-----|----------|\n| \\`--rds-transition-fast\\` | \\`${effects.motion.fast}\\` |\n| \\`--rds-transition-base\\` | \\`${effects.motion.base}\\` |\n| \\`--rds-transition-slow\\` | \\`${effects.motion.slow}\\` |\n| \\`--rds-transition-slower\\` | \\`${effects.motion.slower}\\` |\n\n### Shadows\n\nAll shadows are applied via Tailwind's \\`shadow-*\\` utilities mapped to these var values.\n\n| Var | Value |\n|-----|-------|\n| \\`--rds-shadow-sm\\` | \\`${effects.shadows.sm}\\` |\n| \\`--rds-shadow-md\\` | \\`${effects.shadows.md}\\` |\n| \\`--rds-shadow-lg\\` | \\`${effects.shadows.lg}\\` |\n| \\`--rds-shadow-xl\\` | \\`${effects.shadows.xl}\\` |\n\n## CSS variable conventions\n\nEvery color is stored as a bare \\`L C H\\` OKLCH triplet and wrapped at call time:\n\n\\`\\`\\`css\n:root {\n --primary: ${colors.light.primary};\n --background: ${colors.light.background};\n}\n\\`\\`\\`\n\nTailwind config wraps these with \\`oklch(var(--x) / <alpha-value>)\\` so Tailwind's opacity shortcuts work:\n\n\\`\\`\\`html\n<div class=\"bg-primary text-primary-foreground\">...</div>\n<div class=\"bg-primary/50 hover:bg-primary/80\">...</div>\n<div class=\"text-muted-foreground border-border/40\">...</div>\n\\`\\`\\`\n\n## Tailwind class cheat sheet\n\n| Utility | Token |\n|---------|-------|\n| \\`bg-background\\`, \\`text-foreground\\` | page bg + primary text |\n| \\`bg-card\\`, \\`text-card-foreground\\` | elevated surfaces |\n| \\`bg-popover\\`, \\`text-popover-foreground\\` | floating menus |\n| \\`bg-primary\\`, \\`text-primary-foreground\\` | primary action / brand |\n| \\`bg-secondary\\`, \\`text-secondary-foreground\\` | secondary surface |\n| \\`bg-muted\\`, \\`text-muted-foreground\\` | subtle surface + subtext |\n| \\`bg-accent\\`, \\`text-accent-foreground\\` | highlight / hover |\n| \\`border-border\\`, \\`border-input\\` | default + form borders |\n| \\`ring-ring\\` | focus ring |\n| \\`bg-destructive\\`, \\`bg-success\\`, \\`bg-warning\\`, \\`bg-info\\`, \\`bg-highlight\\` | status colors |\n| \\`bg-chart-1\\` … \\`bg-chart-5\\` | chart series |\n\n## Components the theme styles\n\nImport from \\`@gradeui/ui\\` — all components read theme vars and re-skin automatically:\n\n\\`\\`\\`tsx\nimport {\n Button, Input, Textarea, Label, Select, Checkbox, RadioGroup, Switch,\n Slider, Toggle, Calendar, Card, Badge, Alert, Skeleton, Separator,\n HoverCard, Popover, Dialog, Sheet, Tooltip, Progress, DropdownMenu,\n Command, Tabs, SimpleTabs, Accordion, Collapsible, ScrollArea, Table,\n Avatar, AIChat, Logo, SectionBlock, CardBlock, MediaBlock, FAQBlock,\n} from \"@gradeui/ui\";\nimport \"@gradeui/ui/styles.css\";\n\\`\\`\\`\n\nEvery component accepts a \\`className\\` for layout tweaks. Variants are passed via a \\`variant\\` prop: \\`<Button variant=\"outline\">\\`, \\`<Alert variant=\"success\">\\`, \\`<Badge variant=\"destructive-soft\">\\`.\n\n## Feel and voice\n\nWhen generating UI in the ${theme.name} theme, match this character:\n\n${feelNotes(theme)}\n\n## Instructions for the generating LLM\n\n1. **Use semantic tokens first**. Prefer \\`bg-primary\\`, \\`text-foreground\\`, \\`border-border\\` over raw ramp classes. Reach for \\`bg-primary-500\\` / \\`bg-neutral-200\\` only when you need a specific shade unavailable as a semantic token.\n2. **Status colors are fixed**. Do not use \\`success\\` for a generic success-feeling visual — it's always green-ish. Use \\`primary\\` / \\`accent\\` for brand flavor; \\`success\\` / \\`warning\\` / \\`destructive\\` for actual state.\n3. **Respect the shape presets**. If the theme's buttonShape is \\`pill\\`, don't add \\`rounded-none\\` to a Button. The component already matches the theme.\n4. **Typography scales with the theme**. Heading utilities \\`.text-h1\\`–\\`.text-h6\\` pick up the theme's display font automatically; body text inherits the body font. Only override with \\`font-mono\\` for code-like content.\n5. **Charts get theme palette**. Use \\`var(--chart-1)\\` through \\`var(--chart-5)\\` for series colors. Don't hardcode hex in charts.\n6. **Dark mode is one class**. Add \\`dark\\` to \\`<html>\\` (or toggle with the provider's \\`setMode(\"dark\")\\`). All tokens have dark variants already — no \\`dark:\\` prefixes needed on most components.\n7. **Layout freely**. The theme controls look-and-feel; composition is up to you. Use Tailwind for grids, spacing, flex layout exactly as normal.\n\n## Quick regeneration\n\nTo recreate this theme in code:\n\n\\`\\`\\`ts\nimport { generateTheme, applyThemeToRoot, type ThemeInput } from \"@gradeui/ui\";\n\nconst input: ThemeInput = ${stringifyInput(theme).replace(/\\n/g, \"\\n\")};\n\nconst theme = generateTheme(input);\napplyThemeToRoot(theme, \"light\"); // or \"dark\" / \"superLight\" / \"superDark\"\n\\`\\`\\`\n\n---\n*Generated from Grade Design System v1 · ${new Date().toISOString()}*\n`;\n}\n\n/** One-line usage hints for each semantic token — populates the table. */\nconst USAGE_HINTS: Record<string, string> = {\n background: \"Page / body background\",\n foreground: \"Primary text\",\n card: \"Elevated surface background\",\n cardForeground: \"Text on cards\",\n popover: \"Floating menu background\",\n popoverForeground: \"Text inside floating menus\",\n primary: \"Primary actions, links, default button\",\n primaryForeground: \"Text on primary-tinted fills\",\n secondary: \"Secondary surfaces + quiet buttons\",\n secondaryForeground: \"Text on secondary surfaces\",\n muted: \"Subtle surfaces (hover states, skeletons)\",\n mutedForeground: \"Secondary / less-important text\",\n accent: \"Highlights, hover accents\",\n accentForeground: \"Text on accent surfaces\",\n border: \"Default borders\",\n input: \"Form input borders\",\n ring: \"Focus ring color\",\n destructive: \"Destructive actions, errors\",\n destructiveForeground: \"Text on destructive surfaces\",\n success: \"Success states\",\n warning: \"Warning states\",\n info: \"Informational states\",\n highlight: \"Emphasis, new features, callouts\",\n};\n\n/**\n * Heuristic feel notes per theme — tuned by input.intensity + components\n * + typography. Gives the generating LLM concrete direction for voice +\n * composition, not just colors.\n */\nfunction feelNotes(theme: GeneratedTheme): string {\n const notes: string[] = [];\n const { input, components } = theme;\n\n if (input.intensity === \"muted\") {\n notes.push(\n \"- **Quiet and restrained.** Avoid heavy saturation, glowing effects, or loud contrast jumps. Let whitespace do the work.\"\n );\n } else if (input.intensity === \"vibrant\") {\n notes.push(\n \"- **Loud and confident.** Primary color wants to lead. Use it on hero CTAs, key metrics, empty states. Don't be shy.\"\n );\n } else {\n notes.push(\n \"- **Balanced.** Neither shouty nor sleepy — a workhorse feel suited to product interfaces.\"\n );\n }\n\n if (input.spacing.density === \"roomy\") {\n notes.push(\n \"- **Generous spacing.** Stretch things out — reach for \\`gap-6\\`, \\`gap-8\\`, \\`p-6\\`, \\`p-8\\`. Airy is the vibe.\"\n );\n } else if (input.spacing.density === \"tight\") {\n notes.push(\n \"- **Dense layouts.** Pack information in — \\`gap-2\\`, \\`gap-3\\`, \\`p-3\\`, \\`p-4\\`. Scan-friendly dashboard energy.\"\n );\n } else {\n notes.push(\"- **Standard density.** Use Tailwind's default spacing ladder.\");\n }\n\n if (input.radius.style === \"pill\") {\n notes.push(\n \"- **Fully rounded.** Controls are pill-shaped. Use \\`rounded-full\\` on custom chips / pills too.\"\n );\n } else if (input.radius.style === \"sharp\") {\n notes.push(\n \"- **Square corners.** Zero radius everywhere — very architectural. Do not add curves.\"\n );\n } else if (input.radius.style === \"round\") {\n notes.push(\n \"- **Rounded and friendly.** Corner radius is noticeable (≈14px base). Avoid sharp edges.\"\n );\n } else {\n notes.push(\"- **Standard rounded corners.**\");\n }\n\n const displayFont = input.typography.display;\n if (displayFont === \"fraunces\" || displayFont === \"instrumentSerif\" || displayFont === \"sourceSerif\") {\n notes.push(\n \"- **Editorial serif headings.** Treat headings like magazine titles — give them space and weight. Serifs reward larger sizes.\"\n );\n } else if (displayFont === \"geist\" || displayFont === \"inter\") {\n notes.push(\n \"- **Modern technical sans.** Clean, functional, neutral. Good for product UIs.\"\n );\n }\n\n if (components.cardStyle === \"outlined\") {\n notes.push(\n \"- **Cards are outlined**, not shadowed. Rely on borders + spacing for hierarchy.\"\n );\n } else if (components.cardStyle === \"elevated\") {\n notes.push(\n \"- **Cards have real elevation.** Use shadows to stack content visually.\"\n );\n } else if (components.cardStyle === \"glass\") {\n notes.push(\n \"- **Glass / frosted cards.** Use translucent surfaces over background imagery or gradients.\"\n );\n }\n\n if (components.buttonShape === \"pill\") {\n notes.push(\"- **Buttons are pills** — don't override with square corners.\");\n }\n\n return notes.join(\"\\n\");\n}\n\n/**\n * Trigger a browser download of the theme's markdown spec.\n * Client-side only — no-ops during SSR.\n */\nexport function downloadThemeMarkdown(theme: GeneratedTheme): void {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") return;\n const content = generateThemeMarkdown(theme);\n const blob = new Blob([content], { type: \"text/markdown;charset=utf-8\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `ramp-theme-${theme.input.id}.md`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n}\n","/**\n * Theme system public API.\n *\n * Every theme — built-in or user-built — is a ThemeInput that flows\n * through generateTheme() to produce a GeneratedTheme. The provider\n * consumes GeneratedThemes and writes them to :root via applyThemeToRoot.\n *\n * Built-in themes are defined in inputs.ts and generated on module load.\n * User themes are persisted as ThemeInputs in localStorage (phase 4) and\n * generated on demand.\n */\n\nimport { generateTheme } from \"./generator\";\nimport { BUILT_IN_INPUTS, calmInput } from \"./inputs\";\nimport type { GeneratedTheme, ThemeInput } from \"./types\";\n\n// Public re-exports\nexport * from \"./types\";\nexport { generateTheme } from \"./generator\";\nexport { themeToCSSVars, applyThemeToRoot } from \"./apply\";\nexport type { ModeName } from \"./oklch\";\nexport { BUILT_IN_INPUTS, calmInput, energyInput } from \"./inputs\";\nexport { generateThemeMarkdown, downloadThemeMarkdown } from \"./export-md\";\nexport { oklchToHex, useOklchHexes, formatOklch } from \"./oklch-to-hex\";\n\n/**\n * Generated built-in themes, keyed by id. These are pure — generated once\n * at module load and shared across the app. Adding a new built-in means\n * updating inputs.ts; this map follows automatically.\n */\nexport const builtInThemes: Record<string, GeneratedTheme> = Object.fromEntries(\n BUILT_IN_INPUTS.map((input) => [input.id, generateTheme(input)])\n);\n\nexport const defaultThemeId = calmInput.id;\n\n/**\n * Look up a theme by id — built-in or user-built. User themes are read\n * from localStorage lazily (only called from client code).\n *\n * Returns undefined if no theme matches.\n */\nexport function getTheme(id: string): GeneratedTheme | undefined {\n if (id in builtInThemes) return builtInThemes[id];\n const userInput = loadUserThemeInput(id);\n if (userInput) return generateTheme(userInput);\n return undefined;\n}\n\n/** Enumerate every theme — built-in first, then user themes. */\nexport function listThemes(): GeneratedTheme[] {\n return [...Object.values(builtInThemes), ...listUserThemes()];\n}\n\n/* ═══════════════════════════ User-theme storage ═══════════════════════════\n Minimal CRUD against localStorage for phase 2. Phase 4 will expand on\n this (export/import/URL sharing). Keyed under a single storage slot that\n holds { [id]: ThemeInput }.\n ─────────────────────────────────────────────────────────────────────── */\n\nconst USER_THEMES_KEY = \"ramp-user-themes\";\n\nfunction readUserThemeStore(): Record<string, ThemeInput> {\n if (typeof localStorage === \"undefined\") return {};\n try {\n const raw = localStorage.getItem(USER_THEMES_KEY);\n if (!raw) return {};\n const parsed = JSON.parse(raw);\n if (parsed && typeof parsed === \"object\") return parsed as Record<string, ThemeInput>;\n return {};\n } catch {\n return {};\n }\n}\n\nfunction writeUserThemeStore(store: Record<string, ThemeInput>): void {\n if (typeof localStorage === \"undefined\") return;\n try {\n localStorage.setItem(USER_THEMES_KEY, JSON.stringify(store));\n } catch {\n // Quota exceeded or storage disabled — silent fallback.\n }\n}\n\n/** Return every user-saved theme (generated from the stored inputs). */\nexport function listUserThemes(): GeneratedTheme[] {\n return Object.values(readUserThemeStore()).map(generateTheme);\n}\n\n/** Load a single user theme's input by id, if present. */\nexport function loadUserThemeInput(id: string): ThemeInput | undefined {\n return readUserThemeStore()[id];\n}\n\n/** Save (create or replace) a user theme. */\nexport function saveUserTheme(input: ThemeInput): GeneratedTheme {\n const store = readUserThemeStore();\n store[input.id] = input;\n writeUserThemeStore(store);\n return generateTheme(input);\n}\n\n/** Remove a user theme. Built-in ids are ignored. */\nexport function deleteUserTheme(id: string): void {\n if (id in builtInThemes) return;\n const store = readUserThemeStore();\n delete store[id];\n writeUserThemeStore(store);\n}\n\n/** Duplicate an existing theme (built-in or user) as a new user theme. */\nexport function duplicateTheme(sourceId: string, newId: string, newName: string): ThemeInput | undefined {\n const source = builtInThemes[sourceId]?.input ?? loadUserThemeInput(sourceId);\n if (!source) return undefined;\n const copy: ThemeInput = { ...source, id: newId, name: newName };\n saveUserTheme(copy);\n return copy;\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport {\n applyThemeToRoot,\n builtInThemes,\n defaultThemeId,\n getTheme,\n listThemes,\n saveUserTheme,\n deleteUserTheme,\n type GeneratedTheme,\n type ModeName,\n type ThemeInput,\n} from \"@/lib/themes\";\n\n/**\n * Runtime theme + mode provider.\n *\n * Owns the active theme id and brightness mode directly — no dependency on\n * next-themes any more. Writes CSS variables to :root on every change,\n * persists the selection to localStorage, and toggles the `.dark` class on\n * <html> so any Tailwind `dark:` utilities still scoped to the old two-mode\n * model continue to work.\n *\n * First-paint behaviour is driven by the inline pre-hydration script in\n * app/layout.tsx (see GRADE_PRE_HYDRATION_SCRIPT below), which reads\n * localStorage + prefers-color-scheme before React hydrates.\n */\n\nconst STORAGE_THEME_KEY = \"ramp-theme\";\nconst STORAGE_MODE_KEY = \"ramp-mode\";\n\nexport const ALL_MODES: ModeName[] = [\n \"superLight\",\n \"light\",\n \"dark\",\n \"superDark\",\n];\n\nconst DARK_MODES: ReadonlySet<ModeName> = new Set([\"dark\", \"superDark\"]);\n\n/**\n * Inline script body (no React, no imports) that runs in <head> before\n * hydration. Applies the `.dark` class and `data-mode` attribute so the\n * initial paint matches the stored mode / system preference — prevents\n * the classic dark-mode FOUC.\n *\n * NOTE: this string is embedded directly into the <head> via\n * dangerouslySetInnerHTML. Keep it self-contained and dependency-free.\n */\nexport const GRADE_PRE_HYDRATION_SCRIPT = `\n(function() {\n try {\n var mode = localStorage.getItem('${STORAGE_MODE_KEY}');\n var valid = ['superLight','light','dark','superDark'];\n if (!mode || valid.indexOf(mode) === -1) {\n mode = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n if (mode === 'dark' || mode === 'superDark') {\n document.documentElement.classList.add('dark');\n }\n document.documentElement.setAttribute('data-mode', mode);\n var themeId = localStorage.getItem('${STORAGE_THEME_KEY}');\n if (themeId) document.documentElement.setAttribute('data-ramp-theme', themeId);\n } catch(e) {}\n})();\n`;\n\ntype GradeThemeContextValue = {\n /** The currently active theme object. */\n theme: GeneratedTheme;\n /** The active theme's id. */\n themeId: string;\n /** Active brightness mode. */\n mode: ModeName;\n /** True if the active mode is dark or super-dark. Convenience for\n * components that only care about a binary light/dark split. */\n isDark: boolean;\n /** Switch active theme by id (built-in or user). Persists. */\n setThemeId: (id: string) => void;\n /** Switch active brightness mode. Persists. */\n setMode: (mode: ModeName) => void;\n /** Every theme visible in the switcher (built-ins + user themes). */\n themes: GeneratedTheme[];\n /** Save (create/replace) a user theme and switch to it. */\n saveAndActivate: (input: ThemeInput) => void;\n /** Delete a user theme (built-ins are no-ops). Falls back to default if active. */\n deleteTheme: (id: string) => void;\n /** Refresh the themes list (call after external user-theme mutations). */\n refresh: () => void;\n};\n\nconst GradeThemeContext = React.createContext<GradeThemeContextValue | null>(null);\n\nexport interface GradeThemeProviderProps {\n children: React.ReactNode;\n defaultTheme?: string;\n defaultMode?: ModeName;\n}\n\nexport function GradeThemeProvider({\n children,\n defaultTheme = defaultThemeId,\n defaultMode = \"light\",\n}: GradeThemeProviderProps) {\n // SSR-safe defaults; the real values come from localStorage on mount.\n const [themeId, setThemeIdState] = React.useState<string>(defaultTheme);\n const [mode, setModeState] = React.useState<ModeName>(defaultMode);\n const [revision, setRevision] = React.useState(0);\n\n // Hydrate from localStorage on mount. The pre-hydration script already\n // applied the correct .dark class, so there's no visible flicker here.\n React.useEffect(() => {\n try {\n const storedTheme = localStorage.getItem(STORAGE_THEME_KEY);\n if (storedTheme && getTheme(storedTheme)) {\n setThemeIdState(storedTheme);\n }\n const storedMode = localStorage.getItem(STORAGE_MODE_KEY) as ModeName | null;\n if (storedMode && ALL_MODES.includes(storedMode)) {\n setModeState(storedMode);\n } else if (typeof window !== \"undefined\") {\n // No stored mode — follow system preference for the light/dark split.\n const prefersDark = window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n setModeState(prefersDark ? \"dark\" : \"light\");\n }\n } catch {\n /* storage may be disabled */\n }\n }, []);\n\n // Apply the resolved theme whenever anything changes.\n React.useEffect(() => {\n const theme = getTheme(themeId) ?? getTheme(defaultThemeId);\n if (!theme) return;\n applyThemeToRoot(theme, mode);\n if (typeof document !== \"undefined\") {\n document.documentElement.classList.toggle(\"dark\", DARK_MODES.has(mode));\n }\n }, [themeId, mode, revision]);\n\n // Watch the system preference — if the user hasn't explicitly picked a\n // mode yet (nothing in localStorage), follow OS changes live.\n React.useEffect(() => {\n if (typeof window === \"undefined\") return;\n const mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const listener = (e: MediaQueryListEvent) => {\n try {\n if (localStorage.getItem(STORAGE_MODE_KEY)) return; // user-chosen, skip\n } catch {\n return;\n }\n setModeState(e.matches ? \"dark\" : \"light\");\n };\n mq.addEventListener(\"change\", listener);\n return () => mq.removeEventListener(\"change\", listener);\n }, []);\n\n const setThemeId = React.useCallback((id: string) => {\n setThemeIdState(id);\n try {\n localStorage.setItem(STORAGE_THEME_KEY, id);\n } catch {}\n }, []);\n\n const setMode = React.useCallback((next: ModeName) => {\n setModeState(next);\n try {\n localStorage.setItem(STORAGE_MODE_KEY, next);\n } catch {}\n }, []);\n\n const saveAndActivate = React.useCallback((input: ThemeInput) => {\n saveUserTheme(input);\n setRevision((r) => r + 1);\n setThemeId(input.id);\n }, [setThemeId]);\n\n const deleteTheme = React.useCallback((id: string) => {\n if (id in builtInThemes) return;\n deleteUserTheme(id);\n setRevision((r) => r + 1);\n setThemeIdState((current) => (current === id ? defaultThemeId : current));\n }, []);\n\n const refresh = React.useCallback(() => {\n setRevision((r) => r + 1);\n }, []);\n\n const value = React.useMemo<GradeThemeContextValue>(() => {\n const theme = getTheme(themeId) ?? getTheme(defaultThemeId)!;\n return {\n theme,\n themeId: theme.id,\n mode,\n isDark: DARK_MODES.has(mode),\n setThemeId,\n setMode,\n themes: listThemes(),\n saveAndActivate,\n deleteTheme,\n refresh,\n };\n }, [themeId, mode, revision, setThemeId, setMode, saveAndActivate, deleteTheme, refresh]);\n\n return (\n <GradeThemeContext.Provider value={value}>\n {children}\n </GradeThemeContext.Provider>\n );\n}\n\n/** Read the active theme + mode. Must be used inside <GradeThemeProvider>. */\nexport function useGradeTheme(): GradeThemeContextValue {\n const ctx = React.useContext(GradeThemeContext);\n if (!ctx) {\n throw new Error(\n \"useGradeTheme must be used inside <GradeThemeProvider>. Wrap your app (typically in app/layout.tsx).\"\n );\n }\n return ctx;\n}\n\n/** Safe variant — returns null outside a provider instead of throwing. */\nexport function useMaybeGradeTheme(): GradeThemeContextValue | null {\n return React.useContext(GradeThemeContext);\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Palette, Check, Trash2, Download } from \"lucide-react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@/components/ui/popover\";\nimport { useMaybeGradeTheme } from \"@/components/grade-theme-provider\";\nimport { cn } from \"@/lib/utils\";\nimport { builtInThemes, downloadThemeMarkdown } from \"@/lib/themes\";\n\n/**\n * Theme switcher — iterates every registered theme (built-in + user) and\n * lets you pick one. User themes get a delete button on hover.\n *\n * Renders nothing when no <GradeThemeProvider> is mounted, so it's safe to\n * drop into any layout.\n */\nexport function GradeThemeSwitcher({ className }: { className?: string }) {\n const ctx = useMaybeGradeTheme();\n if (!ctx) return null;\n\n const { theme, themes, setThemeId, deleteTheme } = ctx;\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\"gap-2\", className)}\n aria-label=\"Switch theme\"\n >\n <Palette className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">{theme.name}</span>\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-80 p-2\" align=\"end\">\n <div className=\"flex items-start justify-between gap-2 px-2 py-1.5 mb-1\">\n <div>\n <div className=\"text-xs font-medium text-muted-foreground\">Theme</div>\n <div className=\"text-xs text-muted-foreground/80\">\n Switch the skin applied site-wide.\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => downloadThemeMarkdown(theme)}\n className=\"flex items-center gap-1 rounded-md border border-border px-2 py-1 text-[10px] font-medium text-muted-foreground hover:bg-muted hover:text-foreground transition-colors\"\n title=\"Download the active theme as a markdown spec — paste into a fresh LLM prompt\"\n >\n <Download className=\"h-3 w-3\" />\n .md\n </button>\n </div>\n <div className=\"flex flex-col gap-0.5\">\n {themes.map((t) => {\n const active = t.id === theme.id;\n const isBuiltIn = t.id in builtInThemes;\n // Swatch previews the three ramps at step 500 — primary, accent, neutral.\n const primary500 = t.ramps.primary[500];\n const accent500 = t.ramps.accent[500];\n const neutral500 = t.ramps.neutral[500];\n return (\n <div\n key={t.id}\n className={cn(\n // Subtle muted hover, no accent-color tint — avoids the\n // problem where a strongly tinted background strands the\n // muted-foreground description text inside as grey-on-tint.\n \"group flex items-start gap-3 rounded-md px-2 py-2 text-left transition-colors\",\n \"hover:bg-muted\",\n active && \"bg-muted\"\n )}\n >\n <button\n type=\"button\"\n onClick={() => setThemeId(t.id)}\n className=\"flex items-start gap-3 flex-1 min-w-0 text-left\"\n >\n {/* 3-stop swatch: primary, accent, neutral (at step 500) */}\n <div className=\"mt-0.5 flex shrink-0 overflow-hidden rounded-md border border-border\">\n <div\n className=\"h-5 w-2.5\"\n style={{ background: `oklch(${primary500})` }}\n aria-hidden\n />\n <div\n className=\"h-5 w-2.5\"\n style={{ background: `oklch(${accent500})` }}\n aria-hidden\n />\n <div\n className=\"h-5 w-2.5\"\n style={{ background: `oklch(${neutral500})` }}\n aria-hidden\n />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium truncate text-foreground\">\n {t.name}\n </span>\n {t.tagline && (\n <span className=\"text-[10px] uppercase tracking-wide text-muted-foreground shrink-0\">\n {t.tagline}\n </span>\n )}\n </div>\n {t.description && (\n <div className=\"text-xs text-muted-foreground line-clamp-2\">\n {t.description}\n </div>\n )}\n </div>\n </button>\n {active && (\n <Check className=\"mt-2 h-4 w-4 shrink-0 text-primary\" />\n )}\n {!isBuiltIn && !active && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n deleteTheme(t.id);\n }}\n className=\"mt-1 opacity-0 group-hover:opacity-100 transition-opacity rounded p-1 hover:bg-destructive/10 hover:text-destructive\"\n aria-label={`Delete theme ${t.name}`}\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </div>\n );\n })}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Sun, SunDim, Moon, MoonStar } from \"lucide-react\";\n\nimport { useMaybeGradeTheme } from \"@/components/grade-theme-provider\";\nimport { cn } from \"@/lib/utils\";\nimport type { ModeName } from \"@/lib/themes\";\n\n/**\n * 4-way mode switcher. Segmented control: super-light / light / dark / super-dark.\n *\n * Renders nothing without a GradeThemeProvider. Default layout is a compact\n * 4-icon row suitable for a header; the `variant=\"labeled\"` form adds\n * text labels for settings pages.\n */\nexport interface GradeModeSwitcherProps {\n className?: string;\n variant?: \"icons\" | \"labeled\";\n}\n\nconst MODES: Array<{\n mode: ModeName;\n label: string;\n icon: React.ComponentType<{ className?: string }>;\n tooltip: string;\n}> = [\n { mode: \"superLight\", label: \"Super light\", icon: SunDim, tooltip: \"Super light — airy, low contrast\" },\n { mode: \"light\", label: \"Light\", icon: Sun, tooltip: \"Light\" },\n { mode: \"dark\", label: \"Dark\", icon: Moon, tooltip: \"Dark\" },\n { mode: \"superDark\", label: \"Super dark\", icon: MoonStar, tooltip: \"Super dark — OLED, high contrast\" },\n];\n\nexport function GradeModeSwitcher({ className, variant = \"icons\" }: GradeModeSwitcherProps) {\n const ctx = useMaybeGradeTheme();\n if (!ctx) return null;\n const { mode, setMode } = ctx;\n\n if (variant === \"labeled\") {\n return (\n <div\n role=\"radiogroup\"\n aria-label=\"Brightness mode\"\n className={cn(\n \"inline-flex flex-wrap gap-1 rounded-md border border-border bg-background p-1\",\n className\n )}\n >\n {MODES.map(({ mode: m, label, icon: Icon }) => {\n const active = mode === m;\n return (\n <button\n key={m}\n type=\"button\"\n role=\"radio\"\n aria-checked={active}\n onClick={() => setMode(m)}\n className={cn(\n \"flex items-center gap-2 rounded px-3 py-1.5 text-sm transition-colors\",\n active\n ? \"bg-primary text-primary-foreground\"\n : \"hover:bg-accent hover:text-accent-foreground\"\n )}\n >\n <Icon className=\"h-4 w-4\" />\n <span>{label}</span>\n </button>\n );\n })}\n </div>\n );\n }\n\n return (\n <div\n role=\"radiogroup\"\n aria-label=\"Brightness mode\"\n className={cn(\n \"inline-flex items-center gap-0.5 rounded-md border border-border bg-background p-0.5\",\n className\n )}\n >\n {MODES.map(({ mode: m, icon: Icon, tooltip }) => {\n const active = mode === m;\n return (\n <button\n key={m}\n type=\"button\"\n role=\"radio\"\n aria-checked={active}\n aria-label={tooltip}\n title={tooltip}\n onClick={() => setMode(m)}\n className={cn(\n \"flex h-7 w-7 items-center justify-center rounded transition-colors\",\n active\n ? \"bg-primary text-primary-foreground\"\n : \"text-muted-foreground hover:bg-accent hover:text-accent-foreground\"\n )}\n >\n <Icon className=\"h-3.5 w-3.5\" />\n </button>\n );\n })}\n </div>\n );\n}\n","\"use client\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Sun, Moon } from \"lucide-react\";\nimport { useGradeTheme } from \"@/components/grade-theme-provider\";\n\n/**\n * Binary light/dark toggle — flips between `light` and `dark` modes.\n * For the full 4-way picker (including super-light / super-dark), use\n * <GradeModeSwitcher /> instead.\n */\nexport function ThemeToggle() {\n const { isDark, setMode } = useGradeTheme();\n return (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setMode(isDark ? \"light\" : \"dark\")}\n className=\"gap-2\"\n aria-label={isDark ? \"Switch to light mode\" : \"Switch to dark mode\"}\n >\n {isDark ? (\n <>\n <Sun className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">Light</span>\n </>\n ) : (\n <>\n <Moon className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">Dark</span>\n </>\n )}\n </Button>\n );\n}\n"]}
|