@gradeui/ui 0.9.0 → 1.0.0

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.
Files changed (88) hide show
  1. package/components/ui/accordion.md +30 -0
  2. package/components/ui/ai-chat-composer.md +37 -0
  3. package/components/ui/ai-chat.md +81 -0
  4. package/components/ui/alert.md +0 -0
  5. package/components/ui/app-shell.md +178 -0
  6. package/components/ui/avatar.md +29 -0
  7. package/components/ui/badge.md +18 -0
  8. package/components/ui/breadcrumb.md +101 -0
  9. package/components/ui/button.md +63 -0
  10. package/components/ui/calendar.md +39 -0
  11. package/components/ui/callout.md +45 -0
  12. package/components/ui/card.md +40 -0
  13. package/components/ui/carousel.md +56 -0
  14. package/components/ui/chart.md +48 -0
  15. package/components/ui/checkbox.md +20 -0
  16. package/components/ui/collapsible.md +28 -0
  17. package/components/ui/command.md +38 -0
  18. package/components/ui/date-picker.md +52 -0
  19. package/components/ui/dialog.md +40 -0
  20. package/components/ui/dropdown-menu.md +45 -0
  21. package/components/ui/flex.md +41 -0
  22. package/components/ui/grid.md +44 -0
  23. package/components/ui/hover-card.md +35 -0
  24. package/components/ui/input.md +17 -0
  25. package/components/ui/label.md +15 -0
  26. package/components/ui/map.md +80 -0
  27. package/components/ui/media-surface.md +61 -0
  28. package/components/ui/multi-select.md +114 -0
  29. package/components/ui/popover.md +43 -0
  30. package/components/ui/progress.md +15 -0
  31. package/components/ui/radio-group.md +37 -0
  32. package/components/ui/resizable.md +30 -0
  33. package/components/ui/rive-player.md +38 -0
  34. package/components/ui/row.md +32 -0
  35. package/components/ui/scroll-area.md +27 -0
  36. package/components/ui/select.md +24 -0
  37. package/components/ui/separator.md +16 -0
  38. package/components/ui/shader-preset-picker.md +26 -0
  39. package/components/ui/shader-preset-preview.md +24 -0
  40. package/components/ui/sheet.md +52 -0
  41. package/components/ui/side-menu.md +0 -0
  42. package/components/ui/sidebar.md +121 -0
  43. package/components/ui/simple-tabs.md +0 -0
  44. package/components/ui/skeleton.md +17 -0
  45. package/components/ui/slider.md +48 -0
  46. package/components/ui/sortable.md +101 -0
  47. package/components/ui/stack.md +50 -0
  48. package/components/ui/switch.md +20 -0
  49. package/components/ui/table.md +28 -0
  50. package/components/ui/tabs.md +56 -0
  51. package/components/ui/textarea.md +14 -0
  52. package/components/ui/three-scene.md +226 -0
  53. package/components/ui/toast.md +38 -0
  54. package/components/ui/toggle-group.md +43 -0
  55. package/components/ui/toggle.md +36 -0
  56. package/components/ui/toolbar.md +167 -0
  57. package/components/ui/tooltip.md +28 -0
  58. package/components/ui/video-player.md +27 -0
  59. package/dist/contracts.d.mts +14 -0
  60. package/dist/contracts.d.ts +14 -0
  61. package/dist/contracts.js +63 -0
  62. package/dist/contracts.js.map +1 -0
  63. package/dist/contracts.mjs +63 -0
  64. package/dist/contracts.mjs.map +1 -0
  65. package/dist/index.d.mts +1339 -191
  66. package/dist/index.d.ts +1339 -191
  67. package/dist/index.js +111 -49
  68. package/dist/index.js.map +1 -1
  69. package/dist/index.mjs +111 -49
  70. package/dist/index.mjs.map +1 -1
  71. package/dist/map/google.js +1 -0
  72. package/dist/map/google.js.map +1 -1
  73. package/dist/map/google.mjs +1 -0
  74. package/dist/map/google.mjs.map +1 -1
  75. package/dist/map/mapbox.js +1 -0
  76. package/dist/map/mapbox.js.map +1 -1
  77. package/dist/map/mapbox.mjs +1 -0
  78. package/dist/map/mapbox.mjs.map +1 -1
  79. package/dist/map/maplibre.js +1 -0
  80. package/dist/map/maplibre.js.map +1 -1
  81. package/dist/map/maplibre.mjs +1 -0
  82. package/dist/map/maplibre.mjs.map +1 -1
  83. package/dist/styles.css +1 -1
  84. package/dist/tailwind-preset.js +1 -1
  85. package/dist/tailwind-preset.js.map +1 -1
  86. package/dist/tailwind-preset.mjs +1 -1
  87. package/dist/tailwind-preset.mjs.map +1 -1
  88. package/package.json +26 -10
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../components/ui/map/demo-config.ts","../components/ui/map/adapters/maplibre.ts","../components/ui/map/adapters/mapbox.ts","../components/ui/map/adapters/google.ts","../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/resizable.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/breadcrumb.tsx","../components/ui/tooltip.tsx","../components/ui/tabs.tsx","../components/ui/textarea.tsx","../components/ui/toggle.tsx","../components/ui/toggle-group.tsx","../components/ui/side-menu.tsx","../components/ui/simple-tabs.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/ui/map/context.ts","../components/ui/map/map.tsx","../components/ui/map/map-marker.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","../components/grade-theme-switcher.tsx","../components/grade-mode-switcher.tsx","../components/theme-toggle.tsx"],"names":["GRADE_DEMO_MAPTILER_KEY","isDemoKeyConfigured","init_demo_config","__esmMin","maplibre_exports","__export","createMaplibreAdapter","ensureMaplibreCss","CSS_LINK_ID","link","MAPLIBRE_CSS_HREF","MAPTILER_STYLES","buildMaptilerStyleUrl","init_maplibre","appearance","key","container","opts","callbacks","maplibregl","err","tilerKey","styleUrl","map","resolve","e","msg","isStyle","markers","coords","zoom","sw","ne","next","enabled","handlers","k","ctl","fopts","popts","list","fbopts","west","south","east","north","lng","lat","b","id","anchor","element","handle","marker","hovered","mapbox_exports","createMapboxAdapter","ensureMapboxCss","MAPBOX_CSS_HREF","MAPBOX_STYLES","init_mapbox","mapboxgl","c","google_exports","createGoogleAdapter","GOOGLE_LIGHT_STYLES","GOOGLE_DARK_STYLES","stylesFor","init_google","LoaderCtor","mod","loader","google","isSat","cn","inputs","twMerge","clsx","Accordion","me","AccordionItem","ye","className","props","ref","AccordionTrigger","children","ChevronDown","AccordionContent","alertVariants","cva","Alert","Ee","variant","AlertTitle","AlertDescription","shellVariants","headerVariants","navVariants","asideVariants","mainVariants","footerVariants","AppShell","ae","nav","asChild","Slot","AppShellHeader","sticky","AppShellNav","placement","AppShellAside","AppShellMain","maxWidth","AppShellFooter","Avatar","He","Ce","AvatarImage","AvatarFallback","badgeVariants","Badge","rounded","mo","buttonVariants","Button","Dt","size","Calendar","classNames","showOutsideDays","captionLayout","buttonVariant","formatters","components","defaultClassNames","getDefaultClassNames","le","DayPicker","date","rootRef","orientation","ChevronLeftIcon","ChevronRightIcon","ChevronDownIcon","CalendarDayButton","day","modifiers","Card","CardHeader","CardTitle","CardDescription","CardContent","CardFooter","Checkbox","Xe","ct","Check","Popover","ve","PopoverTrigger","PopoverAnchor","PopoverContent","pt","align","sideOffset","DEFAULT_FORMAT","RANGE_FORMAT","DatePicker","value","onChange","placeholder","disabled","contentClassName","side","format","icon","ariaLabel","U","CalendarIcon","formatDate","DateRangePicker","numberOfMonths","hasFrom","Dialog","B","DialogTrigger","DialogPortal","DialogClose","DialogOverlay","Z","DialogContent","X","DialogHeader","DialogFooter","DialogTitle","DialogDescription","DropdownMenu","x","DropdownMenuTrigger","DropdownMenuGroup","DropdownMenuPortal","DropdownMenuSub","DropdownMenuRadioGroup","DropdownMenuSubTrigger","N","inset","ChevronRight","DropdownMenuSubContent","DropdownMenuContent","DropdownMenuItem","DropdownMenuCheckboxItem","checked","DropdownMenuRadioItem","Circle","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuShortcut","Input","Ft","type","labelVariants","Label","Gt","lr","Progress","mt","ut","RadioGroup","Le","De","RadioGroupItem","ResizablePanelGroup","ft","et","ResizablePanel","ResizableHandle","withHandle","GripVertical","rowVariants","Row","Ot","gap","justify","wrap","gridVariants","Grid","Bt","cols","flexVariants","Flex","Vt","direction","ScrollArea","Te","ue","ScrollBar","Select","T","SelectGroup","SelectValue","SelectTrigger","C","SelectScrollUpButton","ChevronUp","SelectScrollDownButton","SelectContent","position","SelectLabel","SelectItem","SelectSeparator","Separator","zt","decorative","mr","Sheet","V","SheetTrigger","SheetClose","SheetPortal","SheetOverlay","q","sheetVariants","SheetContent","SheetHeader","SheetFooter","SheetTitle","SheetDescription","Skeleton","Slider","ze","Me","stackVariants","Stack","_t","Switch","gt","ht","Table","$","TableHeader","TableBody","TableFooter","TableRow","TableHead","TableCell","TableCaption","Breadcrumb","K","BreadcrumbList","BreadcrumbItem","breadcrumbLinkClasses","BreadcrumbLink","href","BreadcrumbPage","BreadcrumbSeparator","BreadcrumbEllipsis","MoreHorizontal","TooltipProvider","be","Tooltip","TooltipTrigger","TooltipContent","yt","TabsSizeContext","ee","Tabs","xe","tabsListVariants","tabsTriggerVariants","TabsList","TabsTrigger","tooltip","inheritedSize","resolvedSize","trigger","TabsContent","Textarea","$t","toggleVariants","Toggle","Kt","hr","ToggleGroupSizeContext","Re","toggleGroupVariants","toggleGroupItemVariants","ToggleGroup","rt","ToggleGroupItem","inherited","SideMenuContext","v","useSideMenu","context","DefaultLink","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","SimpleTabsContext","P","useSimpleTabs","SimpleTabs","tabs","controlledActiveTab","defaultTab","onTabChange","tabsClassName","internalActiveTab","setInternalActiveTab","activeTab","handleTabChange","tabId","tab","SimpleTabsPanel","SimpleTabsRoot","SimpleTabsList","SimpleTabsTrigger","setActiveTab","SimpleTabsContent","RAMP_KEYS","LIGHTNESS_CURVE","CHROMA_CURVE","hueToRamp","hue","chromaScale","normalizedHue","ramp","i","L","neutralRamp","FIXED_SEMANTIC","PURE_WHITE","PURE_BLACK","deriveAlertPair","base","mode","h","chroma","softC","deepL","deepC","softL","FONTS","ALL_MODES","INTENSITY_MULTIPLIER","buildChartPalette","hues","intensity","pC","aC","dC","norm","n","step","p","a","PURE","MODE_TOKENS","resolveToken","ramps","deriveColorsForMode","isLightBg","fixed","alertMode","s","w","hi","BASE_SCALE","SCALE_MULTIPLIER","resolveTypography","input","mult","rem","RADIUS_BASE","resolveRadius","DENSITY_FACTOR","resolveSpacing","SHADOW_PRESETS","resolveEffects","preset","scale","ms","generateTheme","pureGray","neutralChroma","primaryChroma","accentChroma","neutral","primary","accent","chart","colors","typography","radius","spacing","effects","calmInput","energyInput","BUILT_IN_INPUTS","colorVars","themeToCSSVars","theme","flattenRamp","name","out","applyThemeToRoot","root","vars","oklchToHex","triplet","probe","rgb","match","r","g","rowTriplet","parts","l","oklch","hex","rampTable","lines","semanticTable","label","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","raw","parsed","writeUserThemeStore","store","saveUserTheme","deleteUserTheme","duplicateTheme","sourceId","newId","newName","source","copy","STORAGE_THEME_KEY","STORAGE_MODE_KEY","DARK_MODES","GRADE_PRE_HYDRATION_SCRIPT","GradeThemeContext","I","GradeThemeProvider","defaultTheme","defaultMode","themeId","setThemeIdState","setModeState","revision","setRevision","storedTheme","storedMode","prefersDark","mq","listener","setThemeId","setMode","saveAndActivate","deleteTheme","current","refresh","useGradeTheme","ctx","useMaybeGradeTheme","MapContext","Jt","useMapContext","ADAPTER_LOADERS","m","MARKER_WARN_THRESHOLD","Map","E","center","bounds","interactive","hoveredId","onHoveredIdChange","onLoad","onError","style","rest","provider","accessToken","apiKey","mapId","containerRef","adapterRef","markerRegistryRef","lastHoveredRef","adapterReady","setAdapterReady","onHoveredChangeRef","onErrorRef","onLoadRef","isDark","resolvedAppearance","cancelled","initialAppearance","factory","adapter","buildHandle","prev","contextValue","originalRemove","registryRef","noop","idOrCoords","target","MapMarker","de","at","onClick","el","setEl","handleRef","onClickRef","onDomClick","createPortal","aspectClass","radiusVar","MediaSurface","te","aspect","border","loading","onVisibilityChange","fallback","emptyState","innerRef","io","entry","ImageIcon","usePrefersReducedMotion","reduced","setReduced","mql","handler","VideoPlayer","src","controls","autoPlay","loop","muted","pauseOffscreen","poster","playbackRate","objectFit","videoRef","posterVisible","setPosterVisible","effectiveMuted","effectiveAutoPlay","handleVisibilityChange","visible","RivePlayer","D","stateMachines","artboard","fit","stateMachineInputs","Mod","setMod","error","setError","RiveInner","useRive","Layout","Fit","Alignment","EventType","fitMap","rive","RiveComponent","playing","setPlaying","togglePlay","Pause","Play","createPostComposer","renderer","scene","camera","width","height","composer","EffectComposer","RenderPass","bloom","BloomEffect","KernelSize","noise","NoiseEffect","BlendFunction","scanlines","ScanlineEffect","vignette","VignetteEffect","chromatic","ChromaticAberrationEffect","Ir","glitch","GlitchEffect","EffectPass","applyPreset","chromaOffset","STAR_COUNT","FIELD_DEPTH","FIELD_RADIUS","spaceScene","palette","G","positions","zOffsets","primaryColor","accentColor","resetStar","randomZ","theta","y","z","geometry","material","stars","SPEED","STREAK_LEN","_elapsed","delta","pos","baseIdx","cam","col","FRAGMENT","VERTEX","plasmaScene","J","uniforms","quad","elapsed","voronoiScene","Q","synthwaveScene","oe","sceneRegistry","shaderPresets","shaderPresetById","postPresets","defaultPostPreset","FRAGMENT_HEADER","VERTEX_FULLSCREEN","ShaderCompileError","log","precompileFragment","gl","shader","ok","buildFragmentShaderScene","userFragment","combined","W","DEFAULT_PALETTE","OKLCH_TRIPLET","HSL_TRIPLET","VAR_REF","resolveCssColor","host","effectiveInput","varRef","computed","canvas","resolvePalette","ThreeScene","fragmentShader","onShaderError","postPreset","paletteProp","createSceneProp","maxDpr","hostRef","ready","setReady","resolvedFactory","resolvedPostPresetId","livePalette","Fe","dpr","postPresetObj","post","clock","rafId","running","tick","ro","themeObserver","sceneWithMouse","onPointerMove","ev","rect","liveRef","node","ShaderPresetPreview","ce","live","hideLabel","setHovered","shouldRender","ShaderPresetPicker","filterTags","columns","presets","Ge","t","selected","LenisProvider","lenisRef","useRef","useEffect","lenis","Lenis","raf","time","GradeThemeSwitcher","themes","M","Palette","Download","active","isBuiltIn","primary500","accent500","neutral500","Trash2","MODES","SunDim","Sun","Moon","MoonStar","GradeModeSwitcher","Oe","Icon","ThemeToggle"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Public, referrer-locked MapTiler API key for the @gradeui/ui demo.\n *\n * This key is intentionally hard-coded and ships in the published bundle.\n * Safety comes from MapTiler's referrer restriction — the key only works\n * for requests originating from `gradeui.com`, `*.gradeui.com`, and\n * `localhost`. Outside those origins MapTiler returns 403 and the\n * adapter emits `onError({ code: \"tile-load-failed\", ... })`.\n *\n * Consumers using `<Map provider=\"maplibre\">` from any other domain\n * MUST supply their own MapTiler key via the `tilerKey` prop:\n *\n * <Map provider=\"maplibre\" tilerKey={env.MAPTILER_KEY} ... />\n *\n * Rotating: replace the value below, run `pnpm changeset` (patch bump),\n * publish. No env vars, no CI secrets, one-line PR.\n *\n * Setup checklist when registering the key:\n * 1. Create a MapTiler account (free tier — 100k req/mo).\n * 2. Dashboard → Account → Keys → Create new key.\n * 3. Set \"Allowed origins\" — MapTiler wants BARE HOSTNAMES (not full URLs;\n * no protocol, no port). Add each on its own line:\n * - localhost\n * - 127.0.0.1\n * - gradeui.com\n * - *.gradeui.com\n * 4. Paste below, replacing `YOUR_KEY_HERE`.\n * 5. Commit + changeset.\n */\n// Annotated as `string` (not the inferred literal type) so the runtime\n// comparisons in `isDemoKeyConfigured` aren't flagged by TypeScript as\n// tautologies. Without this, `KEY !== \"YOUR_KEY_HERE\"` narrows to a\n// constant boolean at compile time.\nexport const GRADE_DEMO_MAPTILER_KEY: string = \"2pMfyvhpuKonkf7h8HzH\";\n\n/**\n * Whether the demo key has actually been pasted in (vs left as the\n * `YOUR_KEY_HERE` placeholder). Used by the adapter to emit a\n * dev-only console warning when the placeholder is detected.\n */\nexport const isDemoKeyConfigured = (): boolean =>\n GRADE_DEMO_MAPTILER_KEY !== \"YOUR_KEY_HERE\" && GRADE_DEMO_MAPTILER_KEY.length > 0;\n","import type {\n AdapterFactory,\n AdapterInstance,\n Coords,\n MarkerHandle,\n} from \"../types\";\nimport { GRADE_DEMO_MAPTILER_KEY, isDemoKeyConfigured } from \"../demo-config\";\n\nconst MAPTILER_STYLES: Record<\"light\" | \"dark\" | \"satellite\", string> = {\n light: \"dataviz-light\",\n dark: \"dataviz-dark\",\n satellite: \"satellite\",\n};\n\nconst buildMaptilerStyleUrl = (\n appearance: \"light\" | \"dark\" | \"satellite\",\n key: string\n): string =>\n `https://api.maptiler.com/maps/${MAPTILER_STYLES[appearance]}/style.json?key=${encodeURIComponent(key)}`;\n\nconst MAPLIBRE_CSS_HREF = \"https://unpkg.com/maplibre-gl@4/dist/maplibre-gl.css\";\nconst CSS_LINK_ID = \"gds-maplibre-gl-css\";\n\nfunction ensureMaplibreCss() {\n if (typeof document === \"undefined\") return;\n if (document.getElementById(CSS_LINK_ID)) return;\n const link = document.createElement(\"link\");\n link.id = CSS_LINK_ID;\n link.rel = \"stylesheet\";\n link.href = MAPLIBRE_CSS_HREF;\n document.head.appendChild(link);\n}\n\nexport const createMaplibreAdapter: AdapterFactory = async (\n container,\n opts,\n callbacks\n) => {\n ensureMaplibreCss();\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let maplibregl: any;\n try {\n maplibregl = await import(/* webpackIgnore: true */ \"maplibre-gl\");\n // ESM/CJS interop\n if (maplibregl.default) maplibregl = maplibregl.default;\n } catch (err) {\n callbacks.onError({\n code: \"sdk-missing\",\n message:\n '@gradeui/ui Map: `maplibre-gl` is not installed. Run `pnpm add maplibre-gl` (or your package manager\\'s equivalent) to use provider=\"maplibre\".',\n cause: err,\n });\n throw err;\n }\n\n const tilerKey = opts.tilerKey ?? GRADE_DEMO_MAPTILER_KEY;\n\n if (\n process.env.NODE_ENV !== \"production\" &&\n !opts.tilerKey &&\n !isDemoKeyConfigured()\n ) {\n // eslint-disable-next-line no-console\n console.warn(\n \"@gradeui/ui Map: no `tilerKey` prop and the bundled MapTiler demo key is unset. \" +\n \"Tile requests will 403. Set `tilerKey` or paste a key into demo-config.ts.\"\n );\n }\n\n const styleUrl = opts.styleUrl ?? buildMaptilerStyleUrl(opts.appearance, tilerKey);\n\n const map = new maplibregl.Map({\n container,\n style: styleUrl,\n center: opts.center,\n zoom: opts.zoom,\n interactive: opts.interactive,\n attributionControl: { compact: true },\n });\n\n if (opts.bounds) {\n map.fitBounds([opts.bounds[0], opts.bounds[1]], { animate: false });\n }\n\n await new Promise<void>((resolve) => {\n map.once(\"load\", () => resolve());\n });\n callbacks.onLoad();\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n map.on(\"error\", (e: any) => {\n const msg = String(e?.error?.message ?? e?.message ?? \"MapLibre error\");\n const isStyle = msg.toLowerCase().includes(\"style\");\n callbacks.onError({\n code: isStyle ? \"style-load-failed\" : \"tile-load-failed\",\n message: msg,\n cause: e?.error ?? e,\n });\n });\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const markers = new globalThis.Map<string, { marker: any; handle: MarkerHandle }>();\n\n const adapter: AdapterInstance = {\n setCenter: (coords) => map.setCenter(coords),\n setZoom: (zoom) => map.setZoom(zoom),\n setBounds: (sw, ne) => map.fitBounds([sw, ne], { animate: false }),\n setAppearance: (appearance) => {\n const next = opts.styleUrl ?? buildMaptilerStyleUrl(appearance, tilerKey);\n // setStyle keeps existing markers (they're not source-attached).\n map.setStyle(next, { diff: false });\n },\n setInteractive: (enabled) => {\n const handlers = [\n \"scrollZoom\",\n \"boxZoom\",\n \"dragRotate\",\n \"dragPan\",\n \"keyboard\",\n \"doubleClickZoom\",\n \"touchZoomRotate\",\n ] as const;\n for (const k of handlers) {\n const ctl = map[k];\n if (ctl) (enabled ? ctl.enable() : ctl.disable());\n }\n },\n flyTo: (coords, fopts) =>\n map.flyTo({\n center: coords,\n zoom: fopts?.zoom,\n duration: fopts?.durationMs ?? 800,\n }),\n panTo: (coords, popts) =>\n map.panTo(coords, { duration: popts?.durationMs ?? 600 }),\n fitBounds: (list, fbopts) => {\n if (list.length === 0) return;\n let west = Infinity,\n south = Infinity,\n east = -Infinity,\n north = -Infinity;\n for (const [lng, lat] of list) {\n if (lng < west) west = lng;\n if (lat < south) south = lat;\n if (lng > east) east = lng;\n if (lat > north) north = lat;\n }\n map.fitBounds(\n [\n [west, south],\n [east, north],\n ],\n {\n padding: fbopts?.paddingPx ?? 40,\n duration: fbopts?.durationMs ?? 800,\n }\n );\n },\n getCenter: () => {\n const c = map.getCenter();\n return [c.lng, c.lat];\n },\n getZoom: () => map.getZoom(),\n getBounds: () => {\n const b = map.getBounds();\n return [\n [b.getWest(), b.getSouth()],\n [b.getEast(), b.getNorth()],\n ];\n },\n addMarker: (id, coords, anchor) => {\n const element = document.createElement(\"div\");\n element.dataset.gdsPart = \"map-marker\";\n element.dataset.gdsState = \"idle\";\n element.style.cursor = \"pointer\";\n\n element.addEventListener(\"mouseenter\", () => callbacks.onMarkerHover(id));\n element.addEventListener(\"mouseleave\", () => callbacks.onMarkerHover(null));\n element.addEventListener(\"click\", (e) => {\n callbacks.onMarkerClick(id, handle.coords, e);\n });\n\n const marker = new maplibregl.Marker({\n element,\n anchor: anchor === \"center\" ? \"center\" : \"bottom\",\n })\n .setLngLat(coords)\n .addTo(map);\n\n const handle: MarkerHandle = {\n element,\n coords,\n setHovered: (hovered) => {\n element.dataset.gdsState = hovered ? \"hovered\" : \"idle\";\n element.style.zIndex = hovered ? \"10\" : \"1\";\n },\n setPosition: (next) => {\n handle.coords = next;\n marker.setLngLat(next);\n },\n remove: () => {\n marker.remove();\n markers.delete(id);\n },\n };\n\n markers.set(id, { marker, handle });\n return handle;\n },\n destroy: () => {\n markers.forEach(({ marker }) => marker.remove());\n markers.clear();\n map.remove();\n },\n instance: map,\n };\n\n return adapter;\n};\n","import type {\n AdapterFactory,\n AdapterInstance,\n Coords,\n MarkerHandle,\n} from \"../types\";\n\nconst MAPBOX_STYLES: Record<\"light\" | \"dark\" | \"satellite\", string> = {\n light: \"mapbox://styles/mapbox/light-v11\",\n dark: \"mapbox://styles/mapbox/dark-v11\",\n satellite: \"mapbox://styles/mapbox/satellite-streets-v12\",\n};\n\nconst MAPBOX_CSS_HREF = \"https://unpkg.com/mapbox-gl@3/dist/mapbox-gl.css\";\nconst CSS_LINK_ID = \"gds-mapbox-gl-css\";\n\nfunction ensureMapboxCss() {\n if (typeof document === \"undefined\") return;\n if (document.getElementById(CSS_LINK_ID)) return;\n const link = document.createElement(\"link\");\n link.id = CSS_LINK_ID;\n link.rel = \"stylesheet\";\n link.href = MAPBOX_CSS_HREF;\n document.head.appendChild(link);\n}\n\nexport const createMapboxAdapter: AdapterFactory = async (\n container,\n opts,\n callbacks\n) => {\n if (!opts.accessToken) {\n callbacks.onError({\n code: \"api-key-missing\",\n message:\n '@gradeui/ui Map: provider=\"mapbox\" requires an `accessToken` prop.',\n });\n throw new Error(\"mapbox accessToken missing\");\n }\n\n ensureMapboxCss();\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let mapboxgl: any;\n try {\n mapboxgl = await import(/* webpackIgnore: true */ \"mapbox-gl\");\n if (mapboxgl.default) mapboxgl = mapboxgl.default;\n } catch (err) {\n callbacks.onError({\n code: \"sdk-missing\",\n message:\n '@gradeui/ui Map: `mapbox-gl` is not installed. Run `pnpm add mapbox-gl` to use provider=\"mapbox\".',\n cause: err,\n });\n throw err;\n }\n\n mapboxgl.accessToken = opts.accessToken;\n\n const styleUrl = opts.styleUrl ?? MAPBOX_STYLES[opts.appearance];\n\n const map = new mapboxgl.Map({\n container,\n style: styleUrl,\n center: opts.center,\n zoom: opts.zoom,\n interactive: opts.interactive,\n });\n\n if (opts.bounds) {\n map.fitBounds([opts.bounds[0], opts.bounds[1]], { animate: false });\n }\n\n await new Promise<void>((resolve) => {\n map.once(\"load\", () => resolve());\n });\n callbacks.onLoad();\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n map.on(\"error\", (e: any) => {\n const msg = String(e?.error?.message ?? e?.message ?? \"Mapbox error\");\n const isStyle = msg.toLowerCase().includes(\"style\");\n callbacks.onError({\n code: isStyle ? \"style-load-failed\" : \"tile-load-failed\",\n message: msg,\n cause: e?.error ?? e,\n });\n });\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const markers = new globalThis.Map<string, { marker: any; handle: MarkerHandle }>();\n\n const adapter: AdapterInstance = {\n setCenter: (coords) => map.setCenter(coords),\n setZoom: (zoom) => map.setZoom(zoom),\n setBounds: (sw, ne) => map.fitBounds([sw, ne], { animate: false }),\n setAppearance: (appearance) => {\n const next = opts.styleUrl ?? MAPBOX_STYLES[appearance];\n map.setStyle(next, { diff: false });\n },\n setInteractive: (enabled) => {\n const handlers = [\n \"scrollZoom\",\n \"boxZoom\",\n \"dragRotate\",\n \"dragPan\",\n \"keyboard\",\n \"doubleClickZoom\",\n \"touchZoomRotate\",\n ] as const;\n for (const k of handlers) {\n const ctl = map[k];\n if (ctl) (enabled ? ctl.enable() : ctl.disable());\n }\n },\n flyTo: (coords, fopts) =>\n map.flyTo({\n center: coords,\n zoom: fopts?.zoom,\n duration: fopts?.durationMs ?? 800,\n }),\n panTo: (coords, popts) =>\n map.panTo(coords, { duration: popts?.durationMs ?? 600 }),\n fitBounds: (list, fbopts) => {\n if (list.length === 0) return;\n let west = Infinity,\n south = Infinity,\n east = -Infinity,\n north = -Infinity;\n for (const [lng, lat] of list) {\n if (lng < west) west = lng;\n if (lat < south) south = lat;\n if (lng > east) east = lng;\n if (lat > north) north = lat;\n }\n map.fitBounds(\n [\n [west, south],\n [east, north],\n ],\n {\n padding: fbopts?.paddingPx ?? 40,\n duration: fbopts?.durationMs ?? 800,\n }\n );\n },\n getCenter: () => {\n const c = map.getCenter();\n return [c.lng, c.lat];\n },\n getZoom: () => map.getZoom(),\n getBounds: () => {\n const b = map.getBounds();\n return [\n [b.getWest(), b.getSouth()],\n [b.getEast(), b.getNorth()],\n ];\n },\n addMarker: (id, coords, anchor) => {\n const element = document.createElement(\"div\");\n element.dataset.gdsPart = \"map-marker\";\n element.dataset.gdsState = \"idle\";\n element.style.cursor = \"pointer\";\n\n element.addEventListener(\"mouseenter\", () => callbacks.onMarkerHover(id));\n element.addEventListener(\"mouseleave\", () => callbacks.onMarkerHover(null));\n element.addEventListener(\"click\", (e) => {\n callbacks.onMarkerClick(id, handle.coords, e);\n });\n\n const marker = new mapboxgl.Marker({\n element,\n anchor: anchor === \"center\" ? \"center\" : \"bottom\",\n })\n .setLngLat(coords)\n .addTo(map);\n\n const handle: MarkerHandle = {\n element,\n coords,\n setHovered: (hovered) => {\n element.dataset.gdsState = hovered ? \"hovered\" : \"idle\";\n element.style.zIndex = hovered ? \"10\" : \"1\";\n },\n setPosition: (next) => {\n handle.coords = next;\n marker.setLngLat(next);\n },\n remove: () => {\n marker.remove();\n markers.delete(id);\n },\n };\n\n markers.set(id, { marker, handle });\n return handle;\n },\n destroy: () => {\n markers.forEach(({ marker }) => marker.remove());\n markers.clear();\n map.remove();\n },\n instance: map,\n };\n\n return adapter;\n};\n","import type {\n AdapterFactory,\n AdapterInstance,\n Coords,\n MarkerHandle,\n} from \"../types\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyStyles = any[];\n\nconst GOOGLE_LIGHT_STYLES: AnyStyles = [\n // Neutral light preset — POIs hidden, transit muted.\n { featureType: \"poi\", stylers: [{ visibility: \"off\" }] },\n { featureType: \"transit\", stylers: [{ visibility: \"simplified\" }] },\n];\n\nconst GOOGLE_DARK_STYLES: AnyStyles = [\n { elementType: \"geometry\", stylers: [{ color: \"#1a1a1a\" }] },\n { elementType: \"labels.text.stroke\", stylers: [{ color: \"#1a1a1a\" }] },\n { elementType: \"labels.text.fill\", stylers: [{ color: \"#9ca3af\" }] },\n { featureType: \"poi\", stylers: [{ visibility: \"off\" }] },\n {\n featureType: \"road\",\n elementType: \"geometry\",\n stylers: [{ color: \"#262626\" }],\n },\n {\n featureType: \"road\",\n elementType: \"labels.text.fill\",\n stylers: [{ color: \"#9ca3af\" }],\n },\n {\n featureType: \"water\",\n elementType: \"geometry\",\n stylers: [{ color: \"#0f172a\" }],\n },\n {\n featureType: \"transit\",\n stylers: [{ visibility: \"simplified\" }, { color: \"#3a3a3a\" }],\n },\n];\n\nconst stylesFor = (appearance: \"light\" | \"dark\"): AnyStyles =>\n appearance === \"dark\" ? GOOGLE_DARK_STYLES : GOOGLE_LIGHT_STYLES;\n\nexport const createGoogleAdapter: AdapterFactory = async (\n container,\n opts,\n callbacks\n) => {\n if (!opts.apiKey) {\n callbacks.onError({\n code: \"api-key-missing\",\n message:\n '@gradeui/ui Map: provider=\"google\" requires an `apiKey` prop.',\n });\n throw new Error(\"google apiKey missing\");\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let LoaderCtor: any;\n try {\n const mod = await import(/* webpackIgnore: true */ \"@googlemaps/js-api-loader\");\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n LoaderCtor = (mod as any).Loader ?? (mod as any).default?.Loader;\n } catch (err) {\n callbacks.onError({\n code: \"sdk-missing\",\n message:\n '@gradeui/ui Map: `@googlemaps/js-api-loader` is not installed. Run `pnpm add @googlemaps/js-api-loader` to use provider=\"google\".',\n cause: err,\n });\n throw err;\n }\n\n const loader = new LoaderCtor({\n apiKey: opts.apiKey,\n version: \"weekly\",\n libraries: [\"maps\", \"marker\"],\n });\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let google: any;\n try {\n google = await loader.load();\n } catch (err) {\n callbacks.onError({\n code: \"provider-init-failed\",\n message: \"@gradeui/ui Map: Google Maps loader failed.\",\n cause: err,\n });\n throw err;\n }\n\n const isSat = opts.appearance === \"satellite\";\n\n const map = new google.maps.Map(container, {\n center: { lat: opts.center[1], lng: opts.center[0] },\n zoom: opts.zoom,\n mapTypeId: isSat\n ? google.maps.MapTypeId.HYBRID\n : google.maps.MapTypeId.ROADMAP,\n mapId: opts.mapId,\n styles: isSat\n ? undefined\n : stylesFor(opts.appearance === \"dark\" ? \"dark\" : \"light\"),\n disableDefaultUI: !opts.interactive,\n gestureHandling: opts.interactive ? \"auto\" : \"none\",\n keyboardShortcuts: opts.interactive,\n });\n\n if (opts.bounds) {\n const b = new google.maps.LatLngBounds(\n { lat: opts.bounds[0][1], lng: opts.bounds[0][0] },\n { lat: opts.bounds[1][1], lng: opts.bounds[1][0] }\n );\n map.fitBounds(b);\n }\n\n await new Promise<void>((resolve) => {\n google.maps.event.addListenerOnce(map, \"idle\", () => resolve());\n });\n callbacks.onLoad();\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const markers = new globalThis.Map<string, { marker: any; handle: MarkerHandle }>();\n\n const adapter: AdapterInstance = {\n setCenter: (coords) =>\n map.setCenter({ lat: coords[1], lng: coords[0] }),\n setZoom: (zoom) => map.setZoom(zoom),\n setBounds: (sw, ne) => {\n const b = new google.maps.LatLngBounds(\n { lat: sw[1], lng: sw[0] },\n { lat: ne[1], lng: ne[0] }\n );\n map.fitBounds(b);\n },\n setAppearance: (appearance) => {\n if (appearance === \"satellite\") {\n map.setMapTypeId(google.maps.MapTypeId.HYBRID);\n map.setOptions({ styles: undefined });\n } else {\n map.setMapTypeId(google.maps.MapTypeId.ROADMAP);\n map.setOptions({ styles: stylesFor(appearance) });\n }\n },\n setInteractive: (enabled) => {\n map.setOptions({\n disableDefaultUI: !enabled,\n gestureHandling: enabled ? \"auto\" : \"none\",\n keyboardShortcuts: enabled,\n });\n },\n flyTo: (coords, fopts) => {\n map.panTo({ lat: coords[1], lng: coords[0] });\n if (fopts?.zoom != null) map.setZoom(fopts.zoom);\n },\n panTo: (coords) => map.panTo({ lat: coords[1], lng: coords[0] }),\n fitBounds: (list, fbopts) => {\n if (list.length === 0) return;\n const b = new google.maps.LatLngBounds();\n for (const [lng, lat] of list) b.extend({ lat, lng });\n map.fitBounds(b, fbopts?.paddingPx ?? 40);\n },\n getCenter: () => {\n const c = map.getCenter();\n return c ? [c.lng(), c.lat()] : [0, 0];\n },\n getZoom: () => map.getZoom() ?? 0,\n getBounds: () => {\n const b = map.getBounds();\n if (!b) return [\n [0, 0],\n [0, 0],\n ];\n const sw = b.getSouthWest();\n const ne = b.getNorthEast();\n return [\n [sw.lng(), sw.lat()],\n [ne.lng(), ne.lat()],\n ];\n },\n addMarker: (id, coords, anchor) => {\n const element = document.createElement(\"div\");\n element.dataset.gdsPart = \"map-marker\";\n element.dataset.gdsState = \"idle\";\n element.style.cursor = \"pointer\";\n // Google AdvancedMarker anchors the *bottom-center* of `content` to\n // the coord by default. For \"center\" anchor, shift content down so\n // the visual midpoint lands on the coord.\n if (anchor === \"center\") {\n element.style.transform = \"translateY(50%)\";\n }\n\n element.addEventListener(\"mouseenter\", () => callbacks.onMarkerHover(id));\n element.addEventListener(\"mouseleave\", () => callbacks.onMarkerHover(null));\n element.addEventListener(\"click\", (e) => {\n callbacks.onMarkerClick(id, handle.coords, e);\n });\n\n const marker = new google.maps.marker.AdvancedMarkerElement({\n map,\n position: { lat: coords[1], lng: coords[0] },\n content: element,\n });\n\n const handle: MarkerHandle = {\n element,\n coords,\n setHovered: (hovered) => {\n element.dataset.gdsState = hovered ? \"hovered\" : \"idle\";\n marker.zIndex = hovered ? 10 : 1;\n },\n setPosition: (next) => {\n handle.coords = next;\n marker.position = { lat: next[1], lng: next[0] };\n },\n remove: () => {\n marker.map = null;\n markers.delete(id);\n },\n };\n\n markers.set(id, { marker, handle });\n return handle;\n },\n destroy: () => {\n markers.forEach(({ marker }) => {\n marker.map = null;\n });\n markers.clear();\n // Google Map has no explicit destroy(); GC handles it once the\n // container DOM node is removed.\n },\n instance: map,\n };\n\n return adapter;\n};\n","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 or marketing layout.\n *\n * Provides five slots arranged via CSS-grid template areas:\n *\n * ┌─────────── Header (full bleed) ───────────┐\n * │ Nav │ Aside │ Main │\n * └─────────── Footer (full bleed) ───────────┘\n *\n * Header and Footer always span the full width and sit at the very top /\n * very bottom of the shell — useful for marketing pages, brand bars, site\n * chrome. `nav` chooses how the body row is split:\n *\n * - `none` — Main only (a marketing page or a single-column app)\n * - `top` — Main below an in-app top-nav row (TopMenu)\n * - `side` — Nav rail + Main (classic app layout)\n * - `three-pane` — Nav rail + fixed Aside + flex Main (Slack/Mail/Notion\n * shape; aside width via --rds-app-shell-aside, default 320px)\n *\n * Each slot is assigned a fixed `grid-area` (header/nav/aside/main/footer),\n * so the **JSX child order doesn't matter** — drop slots in any order and\n * the grid sorts them.\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, a\n * TopMenu, a hand-rolled `<nav>`. For drag-to-resize columns inside the\n * body, compose this with `Resizable` instead of using a static grid.\n *\n * Variants:\n * - `nav` — \"none\" | \"top\" | \"side\" | \"three-pane\"\n * - `maxWidth` — Main slot only: \"full\" | \"container\" caps reading width\n * for marketing-style content.\n * - `sticky` — Nav slot, Header slot. Pin to the viewport on scroll.\n */\nconst shellVariants = cva(\n \"rds-app-shell min-h-screen w-full bg-background text-foreground grid\",\n {\n variants: {\n nav: {\n none: \"\",\n top: \"\",\n side: \"\",\n \"three-pane\": \"\",\n },\n },\n defaultVariants: {\n nav: \"none\",\n },\n }\n);\n\nconst headerVariants = cva(\"rds-app-shell-header\", {\n variants: {\n sticky: {\n true: \"sticky top-0 z-30\",\n false: \"\",\n },\n },\n defaultVariants: {\n sticky: false,\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 asideVariants = cva(\"rds-app-shell-aside min-w-0 border-r bg-background\", {\n variants: {\n sticky: {\n true: \"sticky top-0 h-screen self-start\",\n false: \"\",\n },\n },\n defaultVariants: {\n sticky: false,\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\nconst footerVariants = cva(\"rds-app-shell-footer border-t bg-background\");\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// ---------- Header slot ----------\n\nexport interface AppShellHeaderProps\n extends React.HTMLAttributes<HTMLElement>,\n VariantProps<typeof headerVariants> {\n asChild?: boolean;\n}\n\nconst AppShellHeader = React.forwardRef<HTMLElement, AppShellHeaderProps>(\n ({ className, sticky, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"header\";\n return (\n <Comp\n ref={ref as React.Ref<HTMLElement>}\n data-gds-part=\"app-shell-header\"\n className={cn(headerVariants({ sticky, className }))}\n {...props}\n />\n );\n }\n);\nAppShellHeader.displayName = \"AppShellHeader\";\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// ---------- Aside slot (middle column for nav=\"three-pane\") ----------\n\nexport interface AppShellAsideProps\n extends React.HTMLAttributes<HTMLElement>,\n VariantProps<typeof asideVariants> {\n asChild?: boolean;\n}\n\nconst AppShellAside = React.forwardRef<HTMLElement, AppShellAsideProps>(\n ({ className, sticky, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"aside\";\n return (\n <Comp\n ref={ref as React.Ref<HTMLElement>}\n data-gds-part=\"app-shell-aside\"\n className={cn(asideVariants({ sticky, className }))}\n {...props}\n />\n );\n }\n);\nAppShellAside.displayName = \"AppShellAside\";\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\n// ---------- Footer slot ----------\n\nexport interface AppShellFooterProps\n extends React.HTMLAttributes<HTMLElement>,\n VariantProps<typeof footerVariants> {\n asChild?: boolean;\n}\n\nconst AppShellFooter = React.forwardRef<HTMLElement, AppShellFooterProps>(\n ({ className, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"footer\";\n return (\n <Comp\n ref={ref as React.Ref<HTMLElement>}\n data-gds-part=\"app-shell-footer\"\n className={cn(footerVariants({ className }))}\n {...props}\n />\n );\n }\n);\nAppShellFooter.displayName = \"AppShellFooter\";\n\nexport {\n AppShell,\n AppShellHeader,\n AppShellNav,\n AppShellAside,\n AppShellMain,\n AppShellFooter,\n shellVariants,\n headerVariants,\n navVariants,\n asideVariants,\n mainVariants,\n footerVariants,\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\n/**\n * Button — primary action primitive.\n *\n * Sizes (t-shirt scale) align EXACTLY to Tabs / ToggleGroup outer\n * heights so a button placed next to a tab strip lines up without\n * any per-call className overrides:\n *\n * sm: h-7 (28px) — matches `<TabsList size=\"sm\">` height\n * md: h-8 (32px) — matches `<TabsList size=\"md\">` height (default)\n * lg: h-10 (40px) — matches `<TabsList size=\"lg\">` height\n * icon: h-8 w-8 — square variant, md height\n *\n * `default` is preserved as an alias for `md` so existing call sites\n * keep working through the rename.\n *\n * Type and icon sizes also follow the Tabs scale (text-xs + size-3.5\n * at sm/md, text-sm + size-4 at lg) so the visual rhythm reads\n * consistent across primitives.\n */\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md 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]: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 sm: \"h-7 gap-1.5 px-2.5 text-xs [&_svg]:size-3.5\",\n md: \"h-8 gap-1.5 px-3 text-xs [&_svg]:size-3.5\",\n // Alias for md — back-compat with usages that predate the\n // t-shirt rename. Same classes as md verbatim.\n default: \"h-8 gap-1.5 px-3 text-xs [&_svg]:size-3.5\",\n lg: \"h-10 gap-2 px-4 text-sm [&_svg]:size-4\",\n icon: \"h-8 w-8 [&_svg]:size-3.5\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\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","\"use client\";\n\nimport * as React from \"react\";\nimport { GripVertical } from \"lucide-react\";\nimport * as ResizablePrimitive from \"react-resizable-panels\";\n\nimport { cn } from \"@/lib/utils\";\n\n/**\n * Resizable — drag-to-adjust panel groups.\n *\n * Thin wrapper over `react-resizable-panels` so consumers can compose\n * persistently-sized splits (e.g. nav + main, list + detail, three-pane\n * with adjustable middle column) without owning the layout primitives.\n *\n * Use this when you want USER-adjustable column widths. For static layouts\n * with a fixed-width middle column, prefer `<AppShell nav=\"three-pane\">`\n * — that's a plain CSS grid with no JS.\n *\n * Layout-shape parity:\n * - `direction=\"horizontal\"` → ResizableHandle is vertical (the divider\n * between two columns)\n * - `direction=\"vertical\"` → ResizableHandle is horizontal (the divider\n * between two rows)\n *\n * Persisting layout: pass `id` to ResizablePanelGroup and `id` to each\n * ResizablePanel; react-resizable-panels writes layout to localStorage\n * under that id so the user's preferred sizes survive reloads.\n *\n * Example:\n *\n * <ResizablePanelGroup direction=\"horizontal\" id=\"inbox-shell\">\n * <ResizablePanel defaultSize={20} minSize={15} id=\"nav\">\n * <SideMenu />\n * </ResizablePanel>\n * <ResizableHandle withHandle />\n * <ResizablePanel defaultSize={30} minSize={20} id=\"list\">\n * <ThreadList />\n * </ResizablePanel>\n * <ResizableHandle />\n * <ResizablePanel defaultSize={50} id=\"detail\">\n * <ThreadDetail />\n * </ResizablePanel>\n * </ResizablePanelGroup>\n */\nconst ResizablePanelGroup = ({\n className,\n ...props\n}: React.ComponentProps<typeof ResizablePrimitive.PanelGroup>) => (\n <ResizablePrimitive.PanelGroup\n data-gds-part=\"resizable-panel-group\"\n className={cn(\n \"flex h-full w-full data-[panel-group-direction=vertical]:flex-col\",\n className\n )}\n {...props}\n />\n);\n\nconst ResizablePanel = ResizablePrimitive.Panel;\n\nconst ResizableHandle = ({\n withHandle,\n className,\n ...props\n}: React.ComponentProps<typeof ResizablePrimitive.PanelResizeHandle> & {\n /** When true, render a visible grip handle in the middle of the divider\n * for affordance. Without this, the handle is just a 1px hit area —\n * fine for power-user tools, harder to discover for everyone else. */\n withHandle?: boolean;\n}) => (\n <ResizablePrimitive.PanelResizeHandle\n data-gds-part=\"resizable-handle\"\n className={cn(\n \"relative flex w-px items-center justify-center bg-border after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 data-[panel-group-direction=vertical]:h-px data-[panel-group-direction=vertical]:w-full data-[panel-group-direction=vertical]:after:left-0 data-[panel-group-direction=vertical]:after:h-1 data-[panel-group-direction=vertical]:after:w-full data-[panel-group-direction=vertical]:after:-translate-y-1/2 data-[panel-group-direction=vertical]:after:translate-x-0 [&[data-panel-group-direction=vertical]>div]:rotate-90\",\n className\n )}\n {...props}\n >\n {withHandle && (\n <div className=\"z-10 flex h-4 w-3 items-center justify-center rounded-sm border bg-border\">\n <GripVertical className=\"h-2.5 w-2.5\" />\n </div>\n )}\n </ResizablePrimitive.PanelResizeHandle>\n);\n\nexport { ResizablePanelGroup, ResizablePanel, ResizableHandle };\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 { ChevronRight, MoreHorizontal } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\n/**\n * Breadcrumb — composable navigation primitive.\n *\n * Pure surface-less component (no background, no border, no sticky\n * positioning). Density matches `TabsTrigger` so a breadcrumb row\n * placed above a tab strip — or alongside one — reads at the same\n * scale.\n *\n * Composition is shadcn-flavoured:\n *\n * <Breadcrumb>\n * <BreadcrumbList>\n * <BreadcrumbItem>\n * <BreadcrumbLink onClick={onBack}>All screens</BreadcrumbLink>\n * </BreadcrumbItem>\n * <BreadcrumbSeparator />\n * <BreadcrumbItem>\n * <BreadcrumbPage>Pricing</BreadcrumbPage>\n * </BreadcrumbItem>\n * </BreadcrumbList>\n * </Breadcrumb>\n *\n * Note: the `TopMenu` component in this package wraps the same\n * breadcrumb idea in an app-bar surface (sticky, bordered, padded).\n * Use TopMenu when you want the full app-shell chrome; use\n * Breadcrumb on its own when you want navigation embedded inside an\n * existing surface (e.g. inside the Studio canvas).\n */\n\nconst Breadcrumb = React.forwardRef<\n HTMLElement,\n React.ComponentPropsWithoutRef<\"nav\"> & {\n separator?: React.ReactNode\n }\n>(({ ...props }, ref) => (\n <nav ref={ref} aria-label=\"breadcrumb\" {...props} />\n))\nBreadcrumb.displayName = \"Breadcrumb\"\n\nconst BreadcrumbList = React.forwardRef<\n HTMLOListElement,\n React.ComponentPropsWithoutRef<\"ol\">\n>(({ className, ...props }, ref) => (\n <ol\n ref={ref}\n className={cn(\n \"flex flex-wrap items-center gap-1.5 break-words text-xs text-muted-foreground\",\n className\n )}\n {...props}\n />\n))\nBreadcrumbList.displayName = \"BreadcrumbList\"\n\nconst BreadcrumbItem = React.forwardRef<\n HTMLLIElement,\n React.ComponentPropsWithoutRef<\"li\">\n>(({ className, ...props }, ref) => (\n <li\n ref={ref}\n className={cn(\"inline-flex items-center gap-1.5\", className)}\n {...props}\n />\n))\nBreadcrumbItem.displayName = \"BreadcrumbItem\"\n\n// Shared link/button classes — the visual is identical regardless of\n// whether the underlying element is an <a> (has href) or a <button>\n// (in-app navigation via onClick).\nconst breadcrumbLinkClasses = cn(\n \"inline-flex items-center gap-1.5 rounded-md px-1.5 py-0.5 text-xs\",\n \"transition-colors hover:text-foreground hover:bg-muted/60\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n \"[&_svg]:pointer-events-none [&_svg]:size-3.5 [&_svg]:shrink-0\",\n)\n\ninterface BreadcrumbLinkProps extends React.HTMLAttributes<HTMLElement> {\n /** Anchor href. When set, renders an <a>; otherwise renders a <button>. */\n href?: string\n /** Use a <span> instead of <a>/<button> — useful when wrapping in a\n * framework-specific Link component yourself. */\n asChild?: boolean\n}\n\n// Split into three forwardRefs (one per element) so TypeScript can\n// type the ref correctly. A polymorphic forwardRef would need a\n// generic ref type — more ceremony than the API needs.\nconst BreadcrumbLink = React.forwardRef<HTMLElement, BreadcrumbLinkProps>(\n ({ asChild, className, href, ...props }, ref) => {\n if (asChild) {\n return (\n <span\n ref={ref as React.Ref<HTMLSpanElement>}\n className={cn(breadcrumbLinkClasses, className)}\n {...props}\n />\n )\n }\n if (href) {\n return (\n <a\n ref={ref as React.Ref<HTMLAnchorElement>}\n href={href}\n className={cn(breadcrumbLinkClasses, className)}\n {...props}\n />\n )\n }\n return (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n type=\"button\"\n className={cn(breadcrumbLinkClasses, className)}\n {...props}\n />\n )\n }\n)\nBreadcrumbLink.displayName = \"BreadcrumbLink\"\n\nconst BreadcrumbPage = React.forwardRef<\n HTMLSpanElement,\n React.ComponentPropsWithoutRef<\"span\">\n>(({ className, ...props }, ref) => (\n <span\n ref={ref}\n role=\"link\"\n aria-disabled=\"true\"\n aria-current=\"page\"\n className={cn(\n \"inline-flex items-center gap-1.5 px-0.5 text-xs font-medium text-foreground\",\n \"[&_svg]:pointer-events-none [&_svg]:size-3.5 [&_svg]:shrink-0\",\n className\n )}\n {...props}\n />\n))\nBreadcrumbPage.displayName = \"BreadcrumbPage\"\n\nconst BreadcrumbSeparator = ({\n children,\n className,\n ...props\n}: React.ComponentProps<\"li\">) => (\n <li\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\n \"[&_svg]:size-3 [&_svg]:shrink-0 text-muted-foreground/60\",\n className\n )}\n {...props}\n >\n {children ?? <ChevronRight />}\n </li>\n)\nBreadcrumbSeparator.displayName = \"BreadcrumbSeparator\"\n\nconst BreadcrumbEllipsis = ({\n className,\n ...props\n}: React.ComponentProps<\"span\">) => (\n <span\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\"flex h-5 w-5 items-center justify-center\", className)}\n {...props}\n >\n <MoreHorizontal className=\"h-3.5 w-3.5\" />\n <span className=\"sr-only\">More</span>\n </span>\n)\nBreadcrumbEllipsis.displayName = \"BreadcrumbEllipsis\"\n\nexport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbPage,\n BreadcrumbSeparator,\n BreadcrumbEllipsis,\n}\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 * as TabsPrimitive from \"@radix-ui/react-tabs\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\"\n\n/**\n * Tabs — accessible tab strip + content switcher built on Radix.\n *\n * Sizing is a t-shirt scale: `sm` / `md` / `lg`. Set on `TabsList`;\n * cascades to every `TabsTrigger` inside via a small context. Triggers\n * may also opt out per-call with their own `size` prop if a row needs\n * a one-off override.\n *\n * Icons: pass an `<svg>` (lucide etc.) as a sibling of the label inside\n * `TabsTrigger`. The variant rules apply `[&_svg]:size-*` to auto-size\n * any child icon to the right scale, plus `gap-*` between icon and\n * label. No icon prop needed.\n *\n * <Tabs defaultValue=\"preview\">\n * <TabsList size=\"md\">\n * <TabsTrigger value=\"preview\"><Eye /> Preview</TabsTrigger>\n * <TabsTrigger value=\"code\"><Code2 /> Code</TabsTrigger>\n * </TabsList>\n * <TabsContent value=\"preview\">…</TabsContent>\n * <TabsContent value=\"code\">…</TabsContent>\n * </Tabs>\n */\n\nexport type TabsSize = \"sm\" | \"md\" | \"lg\"\n\nconst TabsSizeContext = React.createContext<TabsSize>(\"md\")\n\nconst Tabs = TabsPrimitive.Root\n\n// ─── Variants ───────────────────────────────────────────────────────────\n//\n// Sizing math (so the visible whitespace stays roughly symmetric on\n// both axes — that was the v1 papercut):\n//\n// sm: list h-7 p-0.5 → inner 24px. Trigger h-6 (24px) fits exactly.\n// Text 11px + size-3 icon (12px) ~ 12px content; vertical air\n// = (24-12)/2 = 6px. Horizontal px-1.5 = 6px. ≈ symmetric.\n// md: list h-8 p-0.5 → inner 28px. Trigger h-7 (28px). text-xs\n// (12px) + size-3.5 icon (14px) ~ 14px content; vertical air\n// = (28-14)/2 = 7px. Horizontal px-2 = 8px. Within 1px.\n// lg: list h-10 p-1 → inner 32px. Trigger h-8 (32px). text-sm\n// (14px) + size-4 icon (16px) ~ 16px content; vertical air\n// = (32-16)/2 = 8px. Horizontal px-2.5 = 10px. Within 2px.\n\nconst tabsListVariants = cva(\n \"inline-flex items-center justify-center rounded-lg bg-muted text-muted-foreground\",\n {\n variants: {\n size: {\n sm: \"h-7 p-0.5\",\n md: \"h-8 p-0.5\",\n lg: \"h-10 p-1\",\n },\n },\n defaultVariants: { size: \"md\" },\n }\n)\n\nconst tabsTriggerVariants = cva(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md 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 [&_svg]:pointer-events-none [&_svg]:shrink-0 data-[state=active]:bg-background data-[state=active]:text-foreground\",\n {\n variants: {\n size: {\n sm: \"h-6 px-1.5 text-[11px] gap-1 [&_svg]:size-3\",\n md: \"h-7 px-2 text-xs gap-1.5 [&_svg]:size-3.5\",\n lg: \"h-8 px-2.5 text-sm gap-2 [&_svg]:size-4\",\n },\n },\n defaultVariants: { size: \"md\" },\n }\n)\n\n// ─── TabsList ───────────────────────────────────────────────────────────\n\nexport interface TabsListProps\n extends React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>,\n VariantProps<typeof tabsListVariants> {}\n\nconst TabsList = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.List>,\n TabsListProps\n>(({ className, size = \"md\", children, ...props }, ref) => (\n // Provide the size to every nested TabsTrigger so consumers only\n // set it once on the list. Individual triggers can still override\n // by passing their own `size` prop.\n <TabsSizeContext.Provider value={size ?? \"md\"}>\n <TabsPrimitive.List\n ref={ref}\n className={cn(tabsListVariants({ size }), className)}\n {...props}\n >\n {children}\n </TabsPrimitive.List>\n </TabsSizeContext.Provider>\n))\nTabsList.displayName = TabsPrimitive.List.displayName\n\n// ─── TabsTrigger ────────────────────────────────────────────────────────\n\nexport interface TabsTriggerProps\n extends React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>,\n VariantProps<typeof tabsTriggerVariants> {\n /**\n * Tooltip text shown on hover / focus. Designed for icon-only\n * triggers: pass `<TabsTrigger value=\"preview\" tooltip=\"Preview\">`\n * with an icon child, and the component handles the rest. If\n * `aria-label` is not set explicitly, the tooltip string is also\n * applied as `aria-label` so screen readers can name the choice.\n *\n * Requires a `<TooltipProvider>` somewhere above the tabs. The\n * design system's root layout mounts one app-wide.\n */\n tooltip?: React.ReactNode\n}\n\nconst TabsTrigger = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Trigger>,\n TabsTriggerProps\n>(({ className, size, tooltip, ...props }, ref) => {\n const inheritedSize = React.useContext(TabsSizeContext)\n const resolvedSize = size ?? inheritedSize\n\n // Auto-apply aria-label from tooltip when it's a plain string and\n // the consumer didn't already set one. Icon-only triggers need an\n // accessible name; tooltip text is the natural source.\n const ariaLabel =\n props[\"aria-label\"] ??\n (typeof tooltip === \"string\" ? tooltip : undefined)\n\n const trigger = (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(tabsTriggerVariants({ size: resolvedSize }), className)}\n aria-label={ariaLabel}\n {...props}\n />\n )\n\n if (!tooltip) return trigger\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{trigger}</TooltipTrigger>\n <TooltipContent>{tooltip}</TooltipContent>\n </Tooltip>\n )\n})\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName\n\n// ─── TabsContent ────────────────────────────────────────────────────────\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 {\n Tabs,\n TabsList,\n TabsTrigger,\n TabsContent,\n tabsListVariants,\n tabsTriggerVariants,\n}\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 TogglePrimitive from \"@radix-ui/react-toggle\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst toggleVariants = cva(\n \"inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n outline:\n \"border border-input bg-transparent shadow-sm hover:bg-accent hover:text-accent-foreground\",\n },\n size: {\n default: \"h-9 px-2 min-w-9\",\n sm: \"h-8 px-1.5 min-w-8\",\n lg: \"h-10 px-2.5 min-w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nconst Toggle = React.forwardRef<\n React.ElementRef<typeof TogglePrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof TogglePrimitive.Root> &\n VariantProps<typeof toggleVariants>\n>(({ className, variant, size, ...props }, ref) => (\n <TogglePrimitive.Root\n ref={ref}\n className={cn(toggleVariants({ variant, size, className }))}\n {...props}\n />\n))\n\nToggle.displayName = TogglePrimitive.Root.displayName\n\nexport { Toggle, toggleVariants }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as ToggleGroupPrimitive from \"@radix-ui/react-toggle-group\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\n/**\n * ToggleGroup — segmented control / mutually-exclusive picker.\n *\n * Visually identical to `Tabs` (same pill chrome, same active-state\n * treatment, same density). Use ToggleGroup when the value is a\n * picked option (no per-tab content panel); use Tabs when each\n * option owns a content region.\n *\n * Sized via the t-shirt scale (sm / md / lg) — cascades from the\n * group to every item through context, matching the Tabs pattern.\n *\n * Self-contained: does NOT compose `toggleVariants` from `Toggle`.\n * The standalone Toggle and the in-group ToggleGroupItem have\n * different intents (single on/off vs picker item) and shouldn't\n * share styling — keeping each component's variants in one place\n * avoids the \"two layers of classes fighting each other\" trap.\n */\n\nexport type ToggleGroupSize = \"sm\" | \"md\" | \"lg\"\n\nconst ToggleGroupSizeContext = React.createContext<ToggleGroupSize>(\"md\")\n\nconst toggleGroupVariants = cva(\n \"inline-flex items-center justify-center rounded-lg bg-muted text-muted-foreground\",\n {\n variants: {\n size: {\n sm: \"h-7 p-0.5\",\n md: \"h-8 p-0.5\",\n lg: \"h-10 p-1\",\n },\n },\n defaultVariants: { size: \"md\" },\n }\n)\n\nconst toggleGroupItemVariants = cva(\n // Same base shape as TabsTrigger so a placed ToggleGroup reads\n // as the same primitive in the chrome regardless of which one\n // a designer reached for.\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md 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 [&_svg]:pointer-events-none [&_svg]:shrink-0 data-[state=on]:bg-background data-[state=on]:text-foreground\",\n {\n variants: {\n size: {\n sm: \"h-6 px-1.5 text-[11px] gap-1 [&_svg]:size-3\",\n md: \"h-7 px-2 text-xs gap-1.5 [&_svg]:size-3.5\",\n lg: \"h-8 px-2.5 text-sm gap-2 [&_svg]:size-4\",\n },\n },\n defaultVariants: { size: \"md\" },\n }\n)\n\n// `ToggleGroupPrimitive.Root`'s props are a discriminated union\n// (`type=\"single\"` vs `type=\"multiple\"`) so we use `type` + `&`\n// rather than `interface ... extends` — TypeScript won't allow\n// extending a union via interface, but intersecting is fine.\nexport type ToggleGroupProps =\n React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Root> &\n VariantProps<typeof toggleGroupVariants>\n\nconst ToggleGroup = React.forwardRef<\n React.ElementRef<typeof ToggleGroupPrimitive.Root>,\n ToggleGroupProps\n>(({ className, size = \"md\", children, ...props }, ref) => (\n <ToggleGroupSizeContext.Provider value={size ?? \"md\"}>\n <ToggleGroupPrimitive.Root\n ref={ref}\n className={cn(toggleGroupVariants({ size }), className)}\n {...(props as React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Root>)}\n >\n {children}\n </ToggleGroupPrimitive.Root>\n </ToggleGroupSizeContext.Provider>\n))\nToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName\n\nexport type ToggleGroupItemProps =\n React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Item> &\n VariantProps<typeof toggleGroupItemVariants>\n\nconst ToggleGroupItem = React.forwardRef<\n React.ElementRef<typeof ToggleGroupPrimitive.Item>,\n ToggleGroupItemProps\n>(({ className, size, ...props }, ref) => {\n const inherited = React.useContext(ToggleGroupSizeContext)\n const resolved = size ?? inherited\n return (\n <ToggleGroupPrimitive.Item\n ref={ref}\n className={cn(toggleGroupItemVariants({ size: resolved }), className)}\n {...props}\n />\n )\n})\nToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName\n\nexport { ToggleGroup, ToggleGroupItem, toggleGroupVariants, toggleGroupItemVariants }\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 { 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","/**\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","import * as React from \"react\";\nimport type { Coords, MarkerHandle } from \"./types\";\n\nexport type MapContextValue = {\n /**\n * Called by `<MapMarker>` on mount. Returns null if the adapter\n * isn't ready yet (the marker will retry on the next render via\n * effect re-run).\n */\n registerMarker: (\n id: string,\n coords: Coords,\n anchor: \"center\" | \"bottom\"\n ) => MarkerHandle | null;\n};\n\nexport const MapContext = React.createContext<MapContextValue | null>(null);\n\nexport function useMapContext(): MapContextValue | null {\n return React.useContext(MapContext);\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { useMaybeGradeTheme } from \"../../grade-theme-provider\";\nimport { MapContext, type MapContextValue } from \"./context\";\nimport type {\n AdapterFactory,\n AdapterInstance,\n Coords,\n MapHandle,\n MapProps,\n MarkerHandle,\n} from \"./types\";\n\nconst ADAPTER_LOADERS: Record<\n \"maplibre\" | \"mapbox\" | \"google\",\n () => Promise<AdapterFactory>\n> = {\n maplibre: () =>\n import(\"./adapters/maplibre\").then((m) => m.createMaplibreAdapter),\n mapbox: () =>\n import(\"./adapters/mapbox\").then((m) => m.createMapboxAdapter),\n google: () =>\n import(\"./adapters/google\").then((m) => m.createGoogleAdapter),\n};\n\nconst MARKER_WARN_THRESHOLD = 500;\n\nconst Map = React.forwardRef<MapHandle, MapProps>(function Map(props, ref) {\n const {\n center,\n zoom,\n bounds,\n appearance = \"auto\",\n interactive = true,\n hoveredId,\n onHoveredIdChange,\n onLoad,\n onError,\n className,\n style,\n children,\n ...rest\n } = props;\n\n // Provider + provider-specific config (narrowed at the type level by MapProps,\n // erased here so the runtime can read them uniformly).\n const provider =\n (rest as { provider?: \"maplibre\" | \"mapbox\" | \"google\" }).provider ??\n \"maplibre\";\n const styleUrl = (rest as { styleUrl?: string }).styleUrl;\n const tilerKey = (rest as { tilerKey?: string }).tilerKey;\n const accessToken = (rest as { accessToken?: string }).accessToken;\n const apiKey = (rest as { apiKey?: string }).apiKey;\n const mapId = (rest as { mapId?: string }).mapId;\n\n const containerRef = React.useRef<HTMLDivElement | null>(null);\n const adapterRef = React.useRef<AdapterInstance | null>(null);\n const markerRegistryRef = React.useRef<globalThis.Map<string, MarkerHandle>>(\n new globalThis.Map()\n );\n const lastHoveredRef = React.useRef<string | null>(null);\n\n // `adapterReady` is the signal MapMarker effects watch via the context\n // value's identity. When the adapter finishes its async init we flip\n // this true; the contextValue useMemo below has [adapterReady] as a\n // dep, so a fresh context object propagates to every <MapMarker>,\n // their `useEffect(..., [ctx, id])` re-runs, and `registerMarker`\n // fires the second time with adapterRef.current populated. Without\n // this signal markers race the adapter init and stay unregistered.\n const [adapterReady, setAdapterReady] = React.useState(false);\n\n // Latest-callback refs so the adapter init effect doesn't churn on prop changes.\n const onHoveredChangeRef = React.useRef(onHoveredIdChange);\n const onErrorRef = React.useRef(onError);\n const onLoadRef = React.useRef(onLoad);\n React.useEffect(() => {\n onHoveredChangeRef.current = onHoveredIdChange;\n onErrorRef.current = onError;\n onLoadRef.current = onLoad;\n });\n\n const themeCtx = useMaybeGradeTheme();\n const isDark = themeCtx?.isDark ?? false;\n\n const resolvedAppearance: \"light\" | \"dark\" | \"satellite\" =\n appearance === \"auto\" ? (isDark ? \"dark\" : \"light\") : appearance;\n\n // -------- adapter init (re-runs only on identity-changing config) --------\n React.useEffect(() => {\n let cancelled = false;\n const container = containerRef.current;\n if (!container) return;\n\n const initialAppearance =\n appearance === \"auto\" ? (isDark ? \"dark\" : \"light\") : appearance;\n\n (async () => {\n try {\n const factory = await ADAPTER_LOADERS[provider]();\n if (cancelled) return;\n\n const adapter = await factory(\n container,\n {\n center,\n zoom,\n bounds,\n appearance: initialAppearance,\n interactive,\n styleUrl,\n tilerKey,\n accessToken,\n apiKey,\n mapId,\n },\n {\n onLoad: () => {\n /* called by adapter once it's ready; we use the return value below */\n },\n onError: (err) => onErrorRef.current?.(err),\n onMarkerHover: (id) => onHoveredChangeRef.current?.(id),\n onMarkerClick: () => {\n /* per-marker onClick is dispatched via DOM listeners on the marker element */\n },\n }\n );\n\n if (cancelled) {\n adapter.destroy();\n return;\n }\n\n adapterRef.current = adapter;\n setAdapterReady(true);\n onLoadRef.current?.(buildHandle(adapterRef, markerRegistryRef));\n } catch (err) {\n if (cancelled) return;\n // sdk-missing / api-key-missing / provider-init-failed are already\n // reported via onError inside the adapter. Anything else: report.\n const code = (err as { code?: string })?.code;\n if (!code) {\n onErrorRef.current?.({\n code: \"provider-init-failed\",\n message: (err as Error)?.message ?? \"Map init failed\",\n cause: err,\n });\n }\n }\n })();\n\n return () => {\n cancelled = true;\n adapterRef.current?.destroy();\n adapterRef.current = null;\n setAdapterReady(false);\n markerRegistryRef.current.clear();\n lastHoveredRef.current = null;\n };\n // Only re-init on provider/key/style changes — center/zoom/etc. are imperative.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [provider, styleUrl, accessToken, apiKey, mapId, tilerKey]);\n\n // -------- imperative prop sync --------\n React.useEffect(() => {\n adapterRef.current?.setAppearance(resolvedAppearance);\n }, [resolvedAppearance]);\n\n React.useEffect(() => {\n adapterRef.current?.setInteractive(interactive);\n }, [interactive]);\n\n React.useEffect(() => {\n if (!adapterRef.current) return;\n if (bounds) {\n adapterRef.current.setBounds(bounds[0], bounds[1]);\n } else {\n adapterRef.current.setCenter(center);\n adapterRef.current.setZoom(zoom);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n center[0],\n center[1],\n zoom,\n bounds?.[0]?.[0],\n bounds?.[0]?.[1],\n bounds?.[1]?.[0],\n bounds?.[1]?.[1],\n ]);\n\n // -------- hovered-id sync (controlled) --------\n React.useEffect(() => {\n const prev = lastHoveredRef.current;\n if (prev && prev !== hoveredId) {\n markerRegistryRef.current.get(prev)?.setHovered(false);\n }\n if (hoveredId) {\n markerRegistryRef.current.get(hoveredId)?.setHovered(true);\n }\n lastHoveredRef.current = hoveredId ?? null;\n }, [hoveredId]);\n\n // -------- imperative ref handle --------\n React.useImperativeHandle(\n ref,\n () => buildHandle(adapterRef, markerRegistryRef),\n []\n );\n\n // -------- marker registration context --------\n // Deps include `adapterReady` so the context value's identity changes\n // when the adapter finishes loading — MapMarker effects re-run and\n // get a non-null handle from registerMarker on the second pass.\n const contextValue = React.useMemo<MapContextValue>(\n () => ({\n registerMarker: (id, coords, anchor) => {\n const adapter = adapterRef.current;\n if (!adapter) return null;\n\n const handle = adapter.addMarker(id, coords, anchor);\n markerRegistryRef.current.set(id, handle);\n\n if (\n process.env.NODE_ENV !== \"production\" &&\n markerRegistryRef.current.size === MARKER_WARN_THRESHOLD + 1\n ) {\n // eslint-disable-next-line no-console\n console.warn(\n `@gradeui/ui Map: rendering ${markerRegistryRef.current.size} markers. ` +\n \"DOM markers degrade past ~1k. Consider clustering via the .instance escape hatch.\"\n );\n }\n\n // Wrap remove so registry stays in sync.\n const originalRemove = handle.remove;\n handle.remove = () => {\n originalRemove();\n markerRegistryRef.current.delete(id);\n if (lastHoveredRef.current === id) lastHoveredRef.current = null;\n };\n // Apply current hover state immediately if this id is the hovered one.\n if (hoveredId === id) handle.setHovered(true);\n return handle;\n },\n }),\n // hoveredId omitted intentionally — registerMarker reads from closure on call,\n // but since `<MapMarker>` only registers once on mount and hoveredId sync\n // happens via the dedicated effect, this is safe.\n [adapterReady]\n );\n\n return (\n <div\n ref={containerRef}\n data-gds-part=\"map\"\n className={cn(\"rds-map relative isolate overflow-hidden\", className)}\n style={{\n borderRadius: \"var(--rds-map-radius, var(--radius, 0.5rem))\",\n border: \"var(--rds-map-border, 1px solid var(--border, transparent))\",\n ...style,\n }}\n >\n <MapContext.Provider value={contextValue}>{children}</MapContext.Provider>\n </div>\n );\n});\n\nMap.displayName = \"Map\";\n\nfunction buildHandle(\n adapterRef: React.MutableRefObject<AdapterInstance | null>,\n registryRef: React.MutableRefObject<globalThis.Map<string, MarkerHandle>>\n): MapHandle {\n const noop = () => undefined;\n return {\n flyTo: (idOrCoords, opts) => {\n const adapter = adapterRef.current;\n if (!adapter) return;\n let target: Coords | null;\n if (typeof idOrCoords === \"string\") {\n target = registryRef.current.get(idOrCoords)?.coords ?? null;\n if (!target) {\n // eslint-disable-next-line no-console\n console.warn(\n `@gradeui/ui Map.flyTo: no marker registered with id \"${idOrCoords}\".`\n );\n return;\n }\n } else {\n target = idOrCoords;\n }\n adapter.flyTo(target, opts);\n },\n panTo: (coords, opts) => adapterRef.current?.panTo(coords, opts) ?? noop(),\n fitBounds: (coords, opts) =>\n adapterRef.current?.fitBounds(coords, opts) ?? noop(),\n getCenter: () => adapterRef.current?.getCenter() ?? [0, 0],\n getZoom: () => adapterRef.current?.getZoom() ?? 0,\n getBounds: () =>\n adapterRef.current?.getBounds() ?? [\n [0, 0],\n [0, 0],\n ],\n get instance() {\n return adapterRef.current?.instance ?? null;\n },\n };\n}\n\nexport { Map };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { cn } from \"@/lib/utils\";\nimport { useMapContext } from \"./context\";\nimport type { Coords, MapMarkerProps, MarkerHandle } from \"./types\";\n\nconst MapMarker = React.memo(function MapMarker({\n id,\n at,\n anchor = \"bottom\",\n className,\n children,\n onClick,\n}: MapMarkerProps) {\n const ctx = useMapContext();\n const [el, setEl] = React.useState<HTMLElement | null>(null);\n const handleRef = React.useRef<MarkerHandle | null>(null);\n const onClickRef = React.useRef(onClick);\n React.useEffect(() => {\n onClickRef.current = onClick;\n });\n\n // Register on mount; re-register if context becomes available later.\n // We deliberately don't depend on `at` / `anchor` here — those are pushed\n // imperatively below to avoid expensive re-registration on every move.\n React.useEffect(() => {\n if (!ctx) return;\n const handle = ctx.registerMarker(id, at, anchor);\n if (handle) {\n handleRef.current = handle;\n setEl(handle.element);\n\n const onDomClick = (e: MouseEvent) => {\n onClickRef.current?.({ id, coords: handle.coords, native: e });\n };\n handle.element.addEventListener(\"click\", onDomClick);\n\n return () => {\n handle.element.removeEventListener(\"click\", onDomClick);\n handle.remove();\n handleRef.current = null;\n setEl(null);\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ctx, id]);\n\n // Update marker position when `at` changes — no re-register.\n React.useEffect(() => {\n handleRef.current?.setPosition(at as Coords);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [at[0], at[1]]);\n\n if (!el) return null;\n\n return createPortal(\n <div\n data-gds-part=\"map-marker-content\"\n className={cn(\"pointer-events-auto\", className)}\n >\n {children}\n </div>,\n el\n );\n});\n\nMapMarker.displayName = \"MapMarker\";\n\nexport { MapMarker };\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`,\n * `--rds-media-placeholder-bg`, `--rds-media-placeholder-fg`. The\n * placeholder pair drives the empty-state treatment — it's the\n * canonical \"image not yet loaded\" surface across Grade until the\n * image-generation pipeline replaces empty slots with real pictures.\n * Custom placeholder UI elsewhere in the product should consume the\n * same vars so we stay visually coherent.\n * (These will rename to `--gds-*` when the broader codebase rename lands.)\n */\n\nimport * as React from \"react\";\nimport { ImageIcon } from \"lucide-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 /**\n * Controls the empty-state placeholder shown when no `children` and no\n * `loading` state are provided. Default `\"icon\"` renders a subtle\n * image-icon centered on the muted surface so the slot reads as\n * \"media goes here\" rather than blank. Use `\"none\"` for cases where\n * the consumer wants a truly empty surface (e.g. a custom decorative\n * overlay that needs the surface clean), or pass a node to fully\n * override.\n */\n emptyState?: \"icon\" | \"none\" | 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 emptyState = \"icon\",\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 {/* Empty-state placeholder — only shown when there's no media\n content to render and no loading skeleton is active. Without\n this the surface defaults to a flat `bg-muted` that blends\n into nearby `bg-card` surfaces (e.g. when MediaSurface sits\n inside a Card list-item) and reads as transparent.\n\n Surface and icon colours come from a token pair —\n `--rds-media-placeholder-bg` and `--rds-media-placeholder-fg`\n (declared in `packages/ui/styles/globals.css`). This is the\n canonical \"image not yet loaded\" treatment across Grade —\n consumers rolling their own placeholder UI should use the\n same vars so we stay coherent until the image-generation\n pipeline replaces every empty slot with a real picture. */}\n {!children && !loading && emptyState !== \"none\" && (\n <div\n data-gds-part=\"media-surface-placeholder\"\n className=\"absolute inset-0 flex items-center justify-center pointer-events-none\"\n style={{\n background: \"var(--rds-media-placeholder-bg)\",\n color: \"var(--rds-media-placeholder-fg)\",\n }}\n aria-hidden\n >\n {emptyState === \"icon\" ? (\n <ImageIcon className=\"h-1/3 w-1/3 max-h-10 max-w-10\" />\n ) : (\n emptyState\n )}\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","\"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":["../components/ui/map/demo-config.ts","../components/ui/map/adapters/maplibre.ts","../components/ui/map/adapters/mapbox.ts","../components/ui/map/adapters/google.ts","../components/ui/accordion.contract.ts","../components/ui/ai-chat.contract.ts","../components/ui/ai-chat-composer.contract.ts","../components/ui/app-shell.contract.ts","../components/ui/avatar.contract.ts","../components/ui/badge.contract.ts","../components/ui/breadcrumb.contract.ts","../components/ui/button.contract.ts","../components/ui/calendar.contract.ts","../components/ui/callout.contract.ts","../components/ui/card.contract.ts","../components/ui/carousel.contract.ts","../components/ui/chart.contract.ts","../components/ui/checkbox.contract.ts","../components/ui/collapsible.contract.ts","../components/ui/command.contract.ts","../components/ui/date-picker.contract.ts","../components/ui/dialog.contract.ts","../components/ui/dropdown-menu.contract.ts","../components/ui/flex.contract.ts","../components/ui/grid.contract.ts","../components/ui/hover-card.contract.ts","../components/ui/input.contract.ts","../components/ui/label.contract.ts","../components/ui/map.contract.ts","../components/ui/media-surface.contract.ts","../components/ui/multi-select.contract.ts","../components/ui/popover.contract.ts","../components/ui/progress.contract.ts","../components/ui/radio-group.contract.ts","../components/ui/resizable.contract.ts","../components/ui/rive-player.contract.ts","../components/ui/row.contract.ts","../components/ui/scroll-area.contract.ts","../components/ui/select.contract.ts","../components/ui/separator.contract.ts","../components/ui/shader-preset-picker.contract.ts","../components/ui/shader-preset-preview.contract.ts","../components/ui/sheet.contract.ts","../components/ui/sidebar.contract.ts","../components/ui/skeleton.contract.ts","../components/ui/slider.contract.ts","../components/ui/sortable.contract.ts","../components/ui/stack.contract.ts","../components/ui/switch.contract.ts","../components/ui/table.contract.ts","../components/ui/tabs.contract.ts","../components/ui/textarea.contract.ts","../components/ui/three-scene.contract.ts","../components/ui/toast.contract.ts","../components/ui/toggle.contract.ts","../components/ui/toggle-group.contract.ts","../components/ui/toolbar.contract.ts","../components/ui/tooltip.contract.ts","../components/ui/video-player.contract.ts","../lib/contracts.ts","../lib/utils.ts","../components/ui/accordion.tsx","../components/ui/callout.tsx","../components/ui/app-shell.tsx","../components/ui/avatar.tsx","../components/ui/badge.tsx","../components/ui/button.tsx","../components/ui/calendar.tsx","../components/ui/carousel.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/command.tsx","../components/ui/separator.tsx","../components/ui/multi-select.tsx","../components/ui/radio-group.tsx","../components/ui/resizable.tsx","../components/ui/row.tsx","../components/ui/grid.tsx","../components/ui/flex.tsx","../components/ui/scroll-area.tsx","../components/ui/select.tsx","../components/ui/sheet.tsx","../components/ui/skeleton.tsx","../components/ui/slider.tsx","../components/ui/sortable.tsx","../components/ui/stack.tsx","../components/ui/switch.tsx","../components/ui/table.tsx","../components/ui/breadcrumb.tsx","../components/ui/tooltip.tsx","../components/ui/tabs.tsx","../components/ui/textarea.tsx","../components/ui/toggle.tsx","../components/ui/toggle-group.tsx","../components/ui/toolbar.tsx","../components/ui/sidebar.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/ui/map/context.ts","../components/ui/map/map.tsx","../components/ui/map/map-marker.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","../components/grade-theme-switcher.tsx","../components/grade-mode-switcher.tsx","../components/theme-toggle.tsx"],"names":["GRADE_DEMO_MAPTILER_KEY","isDemoKeyConfigured","init_demo_config","__esmMin","maplibre_exports","__export","createMaplibreAdapter","ensureMaplibreCss","CSS_LINK_ID","link","MAPLIBRE_CSS_HREF","MAPTILER_STYLES","buildMaptilerStyleUrl","init_maplibre","appearance","key","container","opts","callbacks","maplibregl","err","tilerKey","styleUrl","map","resolve","e","msg","isStyle","markers","coords","zoom","sw","ne","next","enabled","handlers","k","ctl","fopts","popts","list","fbopts","west","south","east","north","lng","lat","b","id","anchor","element","handle","marker","hovered","mapbox_exports","createMapboxAdapter","ensureMapboxCss","MAPBOX_CSS_HREF","MAPBOX_STYLES","init_mapbox","mapboxgl","c","google_exports","createGoogleAdapter","GOOGLE_LIGHT_STYLES","GOOGLE_DARK_STYLES","stylesFor","init_google","LoaderCtor","mod","loader","google","isSat","AccordionContract","z","AiChatContract","AiChatComposerContract","AppShellContract","AvatarContract","BadgeContract","BreadcrumbContract","ButtonContract","CalendarContract","CalloutContract","CardContract","AlignSchema","AutoplayConfigSchema","AutoplaySchema","CarouselContract","ChartContract","CheckboxContract","CollapsibleContract","CommandContract","DatePickerContract","DialogContract","DropdownMenuContract","FlexContract","GridContract","HoverCardContract","InputContract","LabelContract","MapContract","AlbumSource","TvShowSource","MovieSource","GameSource","BookSource","PosterSource","PortraitSource","LandscapeSource","ProductSource","FoodSource","GenericSource","NoSubFieldsSource","MediaSourceSchema","AspectSchema","RadiusSchema","HintSchema","EmptyStateSchema","MediaSurfaceContract","MultiSelectContract","PopoverContract","ProgressContract","RadioGroupContract","ResizableContract","RivePlayerContract","RowContract","ScrollAreaContract","SelectContract","SeparatorContract","ShaderPresetPickerContract","ShaderPresetPreviewContract","SheetContract","SidebarContract","SkeletonContract","SliderContract","SortableContract","StackContract","SwitchContract","TableContract","TabsContract","TextareaContract","ThreeSceneContract","ToastContract","ToggleContract","ToggleGroupContract","ToolbarContract","TooltipContract","VideoPlayerContract","COMPONENT_CONTRACTS","getComponentContract","componentName","listContractedComponents","cn","inputs","twMerge","clsx","Accordion","Be","AccordionItem","$e","className","props","ref","AccordionTrigger","children","ChevronDown","AccordionContent","calloutVariants","cva","ROLE_BY_VARIANT","Callout","mt","variant","role","CalloutTitle","CalloutDescription","shellVariants","headerVariants","navVariants","asideVariants","mainVariants","footerVariants","AppShell","Ce","nav","asChild","Slot","AppShellHeader","sticky","AppShellNav","placement","AppShellAside","AppShellMain","maxWidth","AppShellFooter","Avatar","ut","nt","AvatarImage","AvatarFallback","badgeVariants","Badge","rounded","Zn","buttonVariants","Button","_o","size","Calendar","classNames","showOutsideDays","captionLayout","buttonVariant","formatters","components","defaultClassNames","getDefaultClassNames","Le","DayPicker","date","rootRef","orientation","ChevronLeftIcon","ChevronRightIcon","ChevronDownIcon","CalendarDayButton","day","modifiers","CarouselContext","x","useCarousel","ctx","DEFAULT_AUTOPLAY_DELAY","CarouselRoot","loop","align","slidesPerView","autoplay","draggable","onSlideChange","style","rest","options","viewportRef","api","useEmblaCarousel","selectedIndex","setSelectedIndex","slideCount","setSlideCount","canScrollPrev","setCanScrollPrev","canScrollNext","setCanScrollNext","durationsRef","onSlideChangeRef","autoplayConfig","sync","advanceFromSlide","slideIndex","hoveredRef","visibleRef","node","io","entries","timer","schedule","idx","delay","onSelect","onPointerDown","onSettle","handleMouseEnter","handleMouseLeave","basis","CarouselSlide","duration","slideRef","el","CarouselVideoSlide","src","poster","alt","controls","fit","videoRef","setSlideIndex","isActive","video","p","CarouselDots","position","renderDot","dots","_","i","overlayStyles","active","onClick","CarouselArrows","CarouselPrev","CarouselNext","ChevronLeft","ChevronRight","Carousel","useCarouselApi","Card","ke","CardHeader","CardTitle","CardDescription","CardContent","CardFooter","Checkbox","Ut","mo","Check","Popover","Ue","PopoverTrigger","PopoverAnchor","PopoverContent","uo","sideOffset","DEFAULT_FORMAT","RANGE_FORMAT","DatePicker","value","onChange","placeholder","disabled","contentClassName","side","format","icon","ariaLabel","ie","CalendarIcon","formatDate","DateRangePicker","numberOfMonths","hasFrom","Dialog","X","DialogTrigger","DialogPortal","DialogClose","DialogOverlay","le","DialogContent","DialogHeader","DialogFooter","DialogTitle","DialogDescription","DropdownMenu","A","DropdownMenuTrigger","DropdownMenuGroup","DropdownMenuPortal","DropdownMenuSub","DropdownMenuRadioGroup","DropdownMenuSubTrigger","$","inset","DropdownMenuSubContent","DropdownMenuContent","DropdownMenuItem","DropdownMenuCheckboxItem","checked","DropdownMenuRadioItem","Circle","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuShortcut","inputVariants","Input","jo","type","labelVariants","Label","Ko","Lr","Progress","go","fo","Command","re","CommandPrimitive","CommandInput","Search","CommandList","CommandEmpty","CommandGroup","CommandSeparator","CommandItem","Separator","Yo","decorative","zr","DEFAULT_MAX_COUNT","MultiSelect","N","controlledValue","defaultValue","onValueChange","searchPlaceholder","emptyMessage","maxCount","searchable","badgeDismissible","modalPopover","isControlled","internalValue","setInternalValue","open","setOpen","optionByValue","opt","commit","toggle","removeOne","v","clearAll","selectAll","o","allSelected","visibleBadgeValues","overflowCount","Icon","XCircle","selected","RadioGroup","ft","ht","RadioGroupItem","ResizablePanelGroup","bo","Kt","ResizablePanel","ResizableHandle","withHandle","GripVertical","rowVariants","Row","Zo","gap","justify","wrap","gridVariants","Grid","Xo","cols","flexVariants","Flex","Jo","direction","ScrollArea","et","Ge","ScrollBar","Select","F","SelectGroup","SelectValue","selectTriggerVariants","SelectTrigger","SelectScrollUpButton","ChevronUp","SelectScrollDownButton","SelectContent","SelectLabel","SelectItem","SelectSeparator","Sheet","J","SheetTrigger","SheetClose","SheetPortal","SheetOverlay","de","sheetVariants","SheetContent","SheetHeader","SheetFooter","SheetTitle","SheetDescription","Skeleton","Slider","Et","it","STRATEGY_BY_NAME","verticalListSortingStrategy","horizontalListSortingStrategy","rectSortingStrategy","SortableRootContext","M","SortableGroupContext","SortableGroup","registryRef","registerContainer","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","findContainerForId","registry","direct","handleDragEnd","event","over","source","dest","oldIndex","newIndex","arrayMove","sourceNext","destIndex","destNext","DndContext","closestCorners","SortableImpl","values","onReorder","strategy","group","inGroup","fallbackId","containerId","handleStandaloneDragEnd","body","SortableContext","ContainerDroppable","closestCenter","forwardedRef","droppable","useDroppable","composedRef","SortableItemInternalContext","SortableItem","itemDisabled","root","attributes","listeners","setNodeRef","setActivatorNodeRef","transform","transition","isDragging","useSortable","hasHandleRef","itemCtx","composedStyle","CSS","Comp","SortableHandle","sharedProps","Sortable","stackVariants","Stack","er","Switch","yo","wo","Table","ae","TableHeader","TableBody","TableFooter","TableRow","TableHead","TableCell","TableCaption","BreadcrumbSeparatorContext","E","Breadcrumb","separator","BreadcrumbList","BreadcrumbItem","breadcrumbLinkClasses","BreadcrumbLink","href","BreadcrumbPage","BreadcrumbSeparator","fromContext","BreadcrumbEllipsis","MoreHorizontal","BreadcrumbMenuTrigger","label","items","onSelectLabel","current","item","TooltipProvider","Ke","Tooltip","TooltipTrigger","TooltipContent","xo","TabsStyleContext","ve","Tabs","qe","tabsListVariants","tabsTriggerVariants","TabsList","TabsTrigger","tooltip","inherited","resolvedSize","resolvedVariant","trigger","TabsContent","Textarea","or","toggleVariants","Toggle","rr","qr","ToggleGroupSizeContext","Re","toggleGroupVariants","toggleGroupItemVariants","ToggleGroup","qt","ToggleGroupItem","tooltipSide","tooltipDelay","resolved","resolvedAriaLabel","toolbarVariants","Toolbar","Oe","leading","center","trailing","usingSlots","ToolbarSlot","SidebarContext","w","SidebarTreeDepthContext","useTreeDepth","useSidebar","Sidebar","controlledCollapsed","defaultCollapsed","onCollapsedChange","collapsible","internal","setInternal","collapsed","isPanel","SidebarHeader","SidebarContent","SidebarFooter","SidebarSection","title","defaultExpanded","expanded","setExpanded","canCollapse","SidebarItem","badge","asButton","collapsedLabel","description","depth","depthStyle","isSm","sizeClasses","weightClass","stateColor","hasDescription","sharedClass","labelStack","_href","_target","_rel","_download","_hrefLang","_ping","_referrerPolicy","_type","buttonRest","tooltipLabel","SidebarTreeItem","controlledExpanded","onExpandedChange","internalExpanded","setInternalExpanded","depthInset","RAMP_KEYS","LIGHTNESS_CURVE","CHROMA_CURVE","hueToRamp","hue","chromaScale","normalizedHue","ramp","L","C","neutralRamp","FIXED_SEMANTIC","PURE_WHITE","PURE_BLACK","deriveAlertPair","base","mode","h","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","isLightBg","fixed","alertMode","s","hi","BASE_SCALE","SCALE_MULTIPLIER","resolveTypography","input","mult","rem","RADIUS_BASE","resolveRadius","r","DENSITY_FACTOR","resolveSpacing","SHADOW_PRESETS","resolveEffects","preset","scale","ms","generateTheme","pureGray","neutralChroma","primaryChroma","accentChroma","neutral","primary","accent","chart","colors","typography","radius","spacing","effects","calmInput","energyInput","BUILT_IN_INPUTS","colorVars","themeToCSSVars","theme","flattenRamp","name","out","applyThemeToRoot","vars","oklchToHex","triplet","probe","rgb","match","g","rowTriplet","parts","l","oklch","hex","rampTable","lines","semanticTable","rows","lightHex","darkHex","stringifyInput","generateThemeMarkdown","mapToken","token","USAGE_HINTS","hueDerived","fixedSemantic","chartRows","feelNotes","notes","displayFont","downloadThemeMarkdown","content","blob","url","builtInThemes","defaultThemeId","getTheme","userInput","loadUserThemeInput","listThemes","listUserThemes","USER_THEMES_KEY","readUserThemeStore","raw","parsed","writeUserThemeStore","store","saveUserTheme","deleteUserTheme","duplicateTheme","sourceId","newId","newName","copy","STORAGE_THEME_KEY","STORAGE_MODE_KEY","DARK_MODES","GRADE_PRE_HYDRATION_SCRIPT","GradeThemeContext","q","GradeThemeProvider","defaultTheme","defaultMode","themeId","setThemeIdState","setModeState","revision","setRevision","storedTheme","storedMode","prefersDark","mq","listener","setThemeId","setMode","saveAndActivate","deleteTheme","refresh","useGradeTheme","useMaybeGradeTheme","MapContext","pr","useMapContext","ADAPTER_LOADERS","m","MARKER_WARN_THRESHOLD","Map","U","bounds","interactive","hoveredId","onHoveredIdChange","onLoad","onError","provider","accessToken","apiKey","mapId","containerRef","adapterRef","markerRegistryRef","lastHoveredRef","adapterReady","setAdapterReady","onHoveredChangeRef","onErrorRef","onLoadRef","isDark","resolvedAppearance","cancelled","initialAppearance","factory","adapter","buildHandle","prev","contextValue","originalRemove","noop","idOrCoords","target","MapMarker","He","at","setEl","handleRef","onClickRef","onDomClick","createPortal","aspectClass","radiusVar","HINT_GLYPH","Disc3","Tv","Clapperboard","Gamepad2","Book","User","Mountain","Film","Package","UtensilsCrossed","Video","Music","Code2","Box","ImageIcon","HINT_DEFAULT_ASPECT","deriveInitials","stop","words","tierFromWidth","MediaSurface","aspectProp","radiusProp","borderProp","loadingProp","onVisibilityChange","fallback","emptyStateProp","hintProp","altProp","srcProp","glyph","overlay","instanceId","innerRef","hint","aspect","border","loading","emptyState","resolvedAspect","entry","hasPlaceholder","tier","setTier","ro","initials","HintGlyph","useAutoPlaceholder","candidateSrc","sourceJson","imgErrored","setImgErrored","effectiveSrc","usePrefersReducedMotion","reduced","setReduced","mql","handler","VideoPlayer","pe","autoPlay","muted","pauseOffscreen","playbackRate","objectFit","posterVisible","setPosterVisible","effectiveMuted","effectiveAutoPlay","handleVisibilityChange","visible","RivePlayer","K","stateMachines","artboard","stateMachineInputs","Mod","setMod","error","setError","RiveInner","useRive","Layout","Fit","Alignment","EventType","fitMap","rive","RiveComponent","playing","setPlaying","togglePlay","Pause","Play","createPostComposer","renderer","scene","camera","width","height","composer","EffectComposer","RenderPass","bloom","BloomEffect","KernelSize","noise","NoiseEffect","BlendFunction","scanlines","ScanlineEffect","vignette","VignetteEffect","chromatic","ChromaticAberrationEffect","va","glitch","GlitchEffect","EffectPass","applyPreset","chromaOffset","STAR_COUNT","FIELD_DEPTH","FIELD_RADIUS","spaceScene","palette","Z","positions","zOffsets","primaryColor","accentColor","resetStar","randomZ","theta","y","geometry","material","stars","SPEED","STREAK_LEN","_elapsed","delta","pos","baseIdx","cam","col","FRAGMENT","VERTEX","plasmaScene","me","uniforms","quad","elapsed","voronoiScene","ue","synthwaveScene","Se","sceneRegistry","shaderPresets","shaderPresetById","postPresets","defaultPostPreset","FRAGMENT_HEADER","VERTEX_FULLSCREEN","ShaderCompileError","log","precompileFragment","gl","shader","ok","buildFragmentShaderScene","userFragment","combined","se","DEFAULT_PALETTE","OKLCH_TRIPLET","HSL_TRIPLET","VAR_REF","resolveCssColor","host","effectiveInput","varRef","computed","canvas","resolvePalette","ThreeScene","Q","fragmentShader","onShaderError","postPreset","paletteProp","createSceneProp","maxDpr","hostRef","ready","setReady","resolvedFactory","resolvedPostPresetId","livePalette","xt","dpr","postPresetObj","post","clock","rafId","running","tick","themeObserver","sceneWithMouse","onPointerMove","ev","rect","liveRef","ShaderPresetPreview","De","live","hideLabel","setHovered","shouldRender","ShaderPresetPicker","filterTags","columns","presets","Rt","t","LenisProvider","lenisRef","useRef","useEffect","lenis","Lenis","raf","time","GradeThemeSwitcher","themes","W","Palette","Download","isBuiltIn","primary500","accent500","neutral500","Trash2","MODES","SunDim","Sun","Moon","MoonStar","GradeModeSwitcher","St","ThemeToggle"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Public, referrer-locked MapTiler API key for the @gradeui/ui demo.\n *\n * This key is intentionally hard-coded and ships in the published bundle.\n * Safety comes from MapTiler's referrer restriction — the key only works\n * for requests originating from `gradeui.com`, `*.gradeui.com`, and\n * `localhost`. Outside those origins MapTiler returns 403 and the\n * adapter emits `onError({ code: \"tile-load-failed\", ... })`.\n *\n * Consumers using `<Map provider=\"maplibre\">` from any other domain\n * MUST supply their own MapTiler key via the `tilerKey` prop:\n *\n * <Map provider=\"maplibre\" tilerKey={env.MAPTILER_KEY} ... />\n *\n * Rotating: replace the value below, run `pnpm changeset` (patch bump),\n * publish. No env vars, no CI secrets, one-line PR.\n *\n * Setup checklist when registering the key:\n * 1. Create a MapTiler account (free tier — 100k req/mo).\n * 2. Dashboard → Account → Keys → Create new key.\n * 3. Set \"Allowed origins\" — MapTiler wants BARE HOSTNAMES (not full URLs;\n * no protocol, no port). Add each on its own line:\n * - localhost\n * - 127.0.0.1\n * - gradeui.com\n * - *.gradeui.com\n * 4. Paste below, replacing `YOUR_KEY_HERE`.\n * 5. Commit + changeset.\n */\n// Annotated as `string` (not the inferred literal type) so the runtime\n// comparisons in `isDemoKeyConfigured` aren't flagged by TypeScript as\n// tautologies. Without this, `KEY !== \"YOUR_KEY_HERE\"` narrows to a\n// constant boolean at compile time.\nexport const GRADE_DEMO_MAPTILER_KEY: string = \"2pMfyvhpuKonkf7h8HzH\";\n\n/**\n * Whether the demo key has actually been pasted in (vs left as the\n * `YOUR_KEY_HERE` placeholder). Used by the adapter to emit a\n * dev-only console warning when the placeholder is detected.\n */\nexport const isDemoKeyConfigured = (): boolean =>\n GRADE_DEMO_MAPTILER_KEY !== \"YOUR_KEY_HERE\" && GRADE_DEMO_MAPTILER_KEY.length > 0;\n","import type {\n AdapterFactory,\n AdapterInstance,\n Coords,\n MarkerHandle,\n} from \"../types\";\nimport { GRADE_DEMO_MAPTILER_KEY, isDemoKeyConfigured } from \"../demo-config\";\n\nconst MAPTILER_STYLES: Record<\"light\" | \"dark\" | \"satellite\", string> = {\n light: \"dataviz-light\",\n dark: \"dataviz-dark\",\n satellite: \"satellite\",\n};\n\nconst buildMaptilerStyleUrl = (\n appearance: \"light\" | \"dark\" | \"satellite\",\n key: string\n): string =>\n `https://api.maptiler.com/maps/${MAPTILER_STYLES[appearance]}/style.json?key=${encodeURIComponent(key)}`;\n\nconst MAPLIBRE_CSS_HREF = \"https://unpkg.com/maplibre-gl@4/dist/maplibre-gl.css\";\nconst CSS_LINK_ID = \"gds-maplibre-gl-css\";\n\nfunction ensureMaplibreCss() {\n if (typeof document === \"undefined\") return;\n if (document.getElementById(CSS_LINK_ID)) return;\n const link = document.createElement(\"link\");\n link.id = CSS_LINK_ID;\n link.rel = \"stylesheet\";\n link.href = MAPLIBRE_CSS_HREF;\n document.head.appendChild(link);\n}\n\nexport const createMaplibreAdapter: AdapterFactory = async (\n container,\n opts,\n callbacks\n) => {\n ensureMaplibreCss();\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let maplibregl: any;\n try {\n maplibregl = await import(\"maplibre-gl\");\n // ESM/CJS interop\n if (maplibregl.default) maplibregl = maplibregl.default;\n } catch (err) {\n callbacks.onError({\n code: \"sdk-missing\",\n message:\n '@gradeui/ui Map: `maplibre-gl` is not installed. Run `pnpm add maplibre-gl` (or your package manager\\'s equivalent) to use provider=\"maplibre\".',\n cause: err,\n });\n throw err;\n }\n\n const tilerKey = opts.tilerKey ?? GRADE_DEMO_MAPTILER_KEY;\n\n if (\n process.env.NODE_ENV !== \"production\" &&\n !opts.tilerKey &&\n !isDemoKeyConfigured()\n ) {\n // eslint-disable-next-line no-console\n console.warn(\n \"@gradeui/ui Map: no `tilerKey` prop and the bundled MapTiler demo key is unset. \" +\n \"Tile requests will 403. Set `tilerKey` or paste a key into demo-config.ts.\"\n );\n }\n\n const styleUrl = opts.styleUrl ?? buildMaptilerStyleUrl(opts.appearance, tilerKey);\n\n const map = new maplibregl.Map({\n container,\n style: styleUrl,\n center: opts.center,\n zoom: opts.zoom,\n interactive: opts.interactive,\n attributionControl: { compact: true },\n });\n\n if (opts.bounds) {\n map.fitBounds([opts.bounds[0], opts.bounds[1]], { animate: false });\n }\n\n await new Promise<void>((resolve) => {\n map.once(\"load\", () => resolve());\n });\n callbacks.onLoad();\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n map.on(\"error\", (e: any) => {\n const msg = String(e?.error?.message ?? e?.message ?? \"MapLibre error\");\n const isStyle = msg.toLowerCase().includes(\"style\");\n callbacks.onError({\n code: isStyle ? \"style-load-failed\" : \"tile-load-failed\",\n message: msg,\n cause: e?.error ?? e,\n });\n });\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const markers = new globalThis.Map<string, { marker: any; handle: MarkerHandle }>();\n\n const adapter: AdapterInstance = {\n setCenter: (coords) => map.setCenter(coords),\n setZoom: (zoom) => map.setZoom(zoom),\n setBounds: (sw, ne) => map.fitBounds([sw, ne], { animate: false }),\n setAppearance: (appearance) => {\n const next = opts.styleUrl ?? buildMaptilerStyleUrl(appearance, tilerKey);\n // setStyle keeps existing markers (they're not source-attached).\n map.setStyle(next, { diff: false });\n },\n setInteractive: (enabled) => {\n const handlers = [\n \"scrollZoom\",\n \"boxZoom\",\n \"dragRotate\",\n \"dragPan\",\n \"keyboard\",\n \"doubleClickZoom\",\n \"touchZoomRotate\",\n ] as const;\n for (const k of handlers) {\n const ctl = map[k];\n if (ctl) (enabled ? ctl.enable() : ctl.disable());\n }\n },\n flyTo: (coords, fopts) =>\n map.flyTo({\n center: coords,\n zoom: fopts?.zoom,\n duration: fopts?.durationMs ?? 800,\n }),\n panTo: (coords, popts) =>\n map.panTo(coords, { duration: popts?.durationMs ?? 600 }),\n fitBounds: (list, fbopts) => {\n if (list.length === 0) return;\n let west = Infinity,\n south = Infinity,\n east = -Infinity,\n north = -Infinity;\n for (const [lng, lat] of list) {\n if (lng < west) west = lng;\n if (lat < south) south = lat;\n if (lng > east) east = lng;\n if (lat > north) north = lat;\n }\n map.fitBounds(\n [\n [west, south],\n [east, north],\n ],\n {\n padding: fbopts?.paddingPx ?? 40,\n duration: fbopts?.durationMs ?? 800,\n }\n );\n },\n getCenter: () => {\n const c = map.getCenter();\n return [c.lng, c.lat];\n },\n getZoom: () => map.getZoom(),\n getBounds: () => {\n const b = map.getBounds();\n return [\n [b.getWest(), b.getSouth()],\n [b.getEast(), b.getNorth()],\n ];\n },\n addMarker: (id, coords, anchor) => {\n const element = document.createElement(\"div\");\n element.dataset.gdsPart = \"map-marker\";\n element.dataset.gdsState = \"idle\";\n element.style.cursor = \"pointer\";\n\n element.addEventListener(\"mouseenter\", () => callbacks.onMarkerHover(id));\n element.addEventListener(\"mouseleave\", () => callbacks.onMarkerHover(null));\n element.addEventListener(\"click\", (e) => {\n callbacks.onMarkerClick(id, handle.coords, e);\n });\n\n const marker = new maplibregl.Marker({\n element,\n anchor: anchor === \"center\" ? \"center\" : \"bottom\",\n })\n .setLngLat(coords)\n .addTo(map);\n\n const handle: MarkerHandle = {\n element,\n coords,\n setHovered: (hovered) => {\n element.dataset.gdsState = hovered ? \"hovered\" : \"idle\";\n element.style.zIndex = hovered ? \"10\" : \"1\";\n },\n setPosition: (next) => {\n handle.coords = next;\n marker.setLngLat(next);\n },\n remove: () => {\n marker.remove();\n markers.delete(id);\n },\n };\n\n markers.set(id, { marker, handle });\n return handle;\n },\n destroy: () => {\n markers.forEach(({ marker }) => marker.remove());\n markers.clear();\n map.remove();\n },\n instance: map,\n };\n\n return adapter;\n};\n","import type {\n AdapterFactory,\n AdapterInstance,\n Coords,\n MarkerHandle,\n} from \"../types\";\n\nconst MAPBOX_STYLES: Record<\"light\" | \"dark\" | \"satellite\", string> = {\n light: \"mapbox://styles/mapbox/light-v11\",\n dark: \"mapbox://styles/mapbox/dark-v11\",\n satellite: \"mapbox://styles/mapbox/satellite-streets-v12\",\n};\n\nconst MAPBOX_CSS_HREF = \"https://unpkg.com/mapbox-gl@3/dist/mapbox-gl.css\";\nconst CSS_LINK_ID = \"gds-mapbox-gl-css\";\n\nfunction ensureMapboxCss() {\n if (typeof document === \"undefined\") return;\n if (document.getElementById(CSS_LINK_ID)) return;\n const link = document.createElement(\"link\");\n link.id = CSS_LINK_ID;\n link.rel = \"stylesheet\";\n link.href = MAPBOX_CSS_HREF;\n document.head.appendChild(link);\n}\n\nexport const createMapboxAdapter: AdapterFactory = async (\n container,\n opts,\n callbacks\n) => {\n if (!opts.accessToken) {\n callbacks.onError({\n code: \"api-key-missing\",\n message:\n '@gradeui/ui Map: provider=\"mapbox\" requires an `accessToken` prop.',\n });\n throw new Error(\"mapbox accessToken missing\");\n }\n\n ensureMapboxCss();\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let mapboxgl: any;\n try {\n mapboxgl = await import(\"mapbox-gl\");\n if (mapboxgl.default) mapboxgl = mapboxgl.default;\n } catch (err) {\n callbacks.onError({\n code: \"sdk-missing\",\n message:\n '@gradeui/ui Map: `mapbox-gl` is not installed. Run `pnpm add mapbox-gl` to use provider=\"mapbox\".',\n cause: err,\n });\n throw err;\n }\n\n mapboxgl.accessToken = opts.accessToken;\n\n const styleUrl = opts.styleUrl ?? MAPBOX_STYLES[opts.appearance];\n\n const map = new mapboxgl.Map({\n container,\n style: styleUrl,\n center: opts.center,\n zoom: opts.zoom,\n interactive: opts.interactive,\n });\n\n if (opts.bounds) {\n map.fitBounds([opts.bounds[0], opts.bounds[1]], { animate: false });\n }\n\n await new Promise<void>((resolve) => {\n map.once(\"load\", () => resolve());\n });\n callbacks.onLoad();\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n map.on(\"error\", (e: any) => {\n const msg = String(e?.error?.message ?? e?.message ?? \"Mapbox error\");\n const isStyle = msg.toLowerCase().includes(\"style\");\n callbacks.onError({\n code: isStyle ? \"style-load-failed\" : \"tile-load-failed\",\n message: msg,\n cause: e?.error ?? e,\n });\n });\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const markers = new globalThis.Map<string, { marker: any; handle: MarkerHandle }>();\n\n const adapter: AdapterInstance = {\n setCenter: (coords) => map.setCenter(coords),\n setZoom: (zoom) => map.setZoom(zoom),\n setBounds: (sw, ne) => map.fitBounds([sw, ne], { animate: false }),\n setAppearance: (appearance) => {\n const next = opts.styleUrl ?? MAPBOX_STYLES[appearance];\n map.setStyle(next, { diff: false });\n },\n setInteractive: (enabled) => {\n const handlers = [\n \"scrollZoom\",\n \"boxZoom\",\n \"dragRotate\",\n \"dragPan\",\n \"keyboard\",\n \"doubleClickZoom\",\n \"touchZoomRotate\",\n ] as const;\n for (const k of handlers) {\n const ctl = map[k];\n if (ctl) (enabled ? ctl.enable() : ctl.disable());\n }\n },\n flyTo: (coords, fopts) =>\n map.flyTo({\n center: coords,\n zoom: fopts?.zoom,\n duration: fopts?.durationMs ?? 800,\n }),\n panTo: (coords, popts) =>\n map.panTo(coords, { duration: popts?.durationMs ?? 600 }),\n fitBounds: (list, fbopts) => {\n if (list.length === 0) return;\n let west = Infinity,\n south = Infinity,\n east = -Infinity,\n north = -Infinity;\n for (const [lng, lat] of list) {\n if (lng < west) west = lng;\n if (lat < south) south = lat;\n if (lng > east) east = lng;\n if (lat > north) north = lat;\n }\n map.fitBounds(\n [\n [west, south],\n [east, north],\n ],\n {\n padding: fbopts?.paddingPx ?? 40,\n duration: fbopts?.durationMs ?? 800,\n }\n );\n },\n getCenter: () => {\n const c = map.getCenter();\n return [c.lng, c.lat];\n },\n getZoom: () => map.getZoom(),\n getBounds: () => {\n const b = map.getBounds();\n return [\n [b.getWest(), b.getSouth()],\n [b.getEast(), b.getNorth()],\n ];\n },\n addMarker: (id, coords, anchor) => {\n const element = document.createElement(\"div\");\n element.dataset.gdsPart = \"map-marker\";\n element.dataset.gdsState = \"idle\";\n element.style.cursor = \"pointer\";\n\n element.addEventListener(\"mouseenter\", () => callbacks.onMarkerHover(id));\n element.addEventListener(\"mouseleave\", () => callbacks.onMarkerHover(null));\n element.addEventListener(\"click\", (e) => {\n callbacks.onMarkerClick(id, handle.coords, e);\n });\n\n const marker = new mapboxgl.Marker({\n element,\n anchor: anchor === \"center\" ? \"center\" : \"bottom\",\n })\n .setLngLat(coords)\n .addTo(map);\n\n const handle: MarkerHandle = {\n element,\n coords,\n setHovered: (hovered) => {\n element.dataset.gdsState = hovered ? \"hovered\" : \"idle\";\n element.style.zIndex = hovered ? \"10\" : \"1\";\n },\n setPosition: (next) => {\n handle.coords = next;\n marker.setLngLat(next);\n },\n remove: () => {\n marker.remove();\n markers.delete(id);\n },\n };\n\n markers.set(id, { marker, handle });\n return handle;\n },\n destroy: () => {\n markers.forEach(({ marker }) => marker.remove());\n markers.clear();\n map.remove();\n },\n instance: map,\n };\n\n return adapter;\n};\n","import type {\n AdapterFactory,\n AdapterInstance,\n Coords,\n MarkerHandle,\n} from \"../types\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyStyles = any[];\n\nconst GOOGLE_LIGHT_STYLES: AnyStyles = [\n // Neutral light preset — POIs hidden, transit muted.\n { featureType: \"poi\", stylers: [{ visibility: \"off\" }] },\n { featureType: \"transit\", stylers: [{ visibility: \"simplified\" }] },\n];\n\nconst GOOGLE_DARK_STYLES: AnyStyles = [\n { elementType: \"geometry\", stylers: [{ color: \"#1a1a1a\" }] },\n { elementType: \"labels.text.stroke\", stylers: [{ color: \"#1a1a1a\" }] },\n { elementType: \"labels.text.fill\", stylers: [{ color: \"#9ca3af\" }] },\n { featureType: \"poi\", stylers: [{ visibility: \"off\" }] },\n {\n featureType: \"road\",\n elementType: \"geometry\",\n stylers: [{ color: \"#262626\" }],\n },\n {\n featureType: \"road\",\n elementType: \"labels.text.fill\",\n stylers: [{ color: \"#9ca3af\" }],\n },\n {\n featureType: \"water\",\n elementType: \"geometry\",\n stylers: [{ color: \"#0f172a\" }],\n },\n {\n featureType: \"transit\",\n stylers: [{ visibility: \"simplified\" }, { color: \"#3a3a3a\" }],\n },\n];\n\nconst stylesFor = (appearance: \"light\" | \"dark\"): AnyStyles =>\n appearance === \"dark\" ? GOOGLE_DARK_STYLES : GOOGLE_LIGHT_STYLES;\n\nexport const createGoogleAdapter: AdapterFactory = async (\n container,\n opts,\n callbacks\n) => {\n if (!opts.apiKey) {\n callbacks.onError({\n code: \"api-key-missing\",\n message:\n '@gradeui/ui Map: provider=\"google\" requires an `apiKey` prop.',\n });\n throw new Error(\"google apiKey missing\");\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let LoaderCtor: any;\n try {\n const mod = await import(\"@googlemaps/js-api-loader\");\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n LoaderCtor = (mod as any).Loader ?? (mod as any).default?.Loader;\n } catch (err) {\n callbacks.onError({\n code: \"sdk-missing\",\n message:\n '@gradeui/ui Map: `@googlemaps/js-api-loader` is not installed. Run `pnpm add @googlemaps/js-api-loader` to use provider=\"google\".',\n cause: err,\n });\n throw err;\n }\n\n const loader = new LoaderCtor({\n apiKey: opts.apiKey,\n version: \"weekly\",\n libraries: [\"maps\", \"marker\"],\n });\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let google: any;\n try {\n google = await loader.load();\n } catch (err) {\n callbacks.onError({\n code: \"provider-init-failed\",\n message: \"@gradeui/ui Map: Google Maps loader failed.\",\n cause: err,\n });\n throw err;\n }\n\n const isSat = opts.appearance === \"satellite\";\n\n const map = new google.maps.Map(container, {\n center: { lat: opts.center[1], lng: opts.center[0] },\n zoom: opts.zoom,\n mapTypeId: isSat\n ? google.maps.MapTypeId.HYBRID\n : google.maps.MapTypeId.ROADMAP,\n mapId: opts.mapId,\n styles: isSat\n ? undefined\n : stylesFor(opts.appearance === \"dark\" ? \"dark\" : \"light\"),\n disableDefaultUI: !opts.interactive,\n gestureHandling: opts.interactive ? \"auto\" : \"none\",\n keyboardShortcuts: opts.interactive,\n });\n\n if (opts.bounds) {\n const b = new google.maps.LatLngBounds(\n { lat: opts.bounds[0][1], lng: opts.bounds[0][0] },\n { lat: opts.bounds[1][1], lng: opts.bounds[1][0] }\n );\n map.fitBounds(b);\n }\n\n await new Promise<void>((resolve) => {\n google.maps.event.addListenerOnce(map, \"idle\", () => resolve());\n });\n callbacks.onLoad();\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const markers = new globalThis.Map<string, { marker: any; handle: MarkerHandle }>();\n\n const adapter: AdapterInstance = {\n setCenter: (coords) =>\n map.setCenter({ lat: coords[1], lng: coords[0] }),\n setZoom: (zoom) => map.setZoom(zoom),\n setBounds: (sw, ne) => {\n const b = new google.maps.LatLngBounds(\n { lat: sw[1], lng: sw[0] },\n { lat: ne[1], lng: ne[0] }\n );\n map.fitBounds(b);\n },\n setAppearance: (appearance) => {\n if (appearance === \"satellite\") {\n map.setMapTypeId(google.maps.MapTypeId.HYBRID);\n map.setOptions({ styles: undefined });\n } else {\n map.setMapTypeId(google.maps.MapTypeId.ROADMAP);\n map.setOptions({ styles: stylesFor(appearance) });\n }\n },\n setInteractive: (enabled) => {\n map.setOptions({\n disableDefaultUI: !enabled,\n gestureHandling: enabled ? \"auto\" : \"none\",\n keyboardShortcuts: enabled,\n });\n },\n flyTo: (coords, fopts) => {\n map.panTo({ lat: coords[1], lng: coords[0] });\n if (fopts?.zoom != null) map.setZoom(fopts.zoom);\n },\n panTo: (coords) => map.panTo({ lat: coords[1], lng: coords[0] }),\n fitBounds: (list, fbopts) => {\n if (list.length === 0) return;\n const b = new google.maps.LatLngBounds();\n for (const [lng, lat] of list) b.extend({ lat, lng });\n map.fitBounds(b, fbopts?.paddingPx ?? 40);\n },\n getCenter: () => {\n const c = map.getCenter();\n return c ? [c.lng(), c.lat()] : [0, 0];\n },\n getZoom: () => map.getZoom() ?? 0,\n getBounds: () => {\n const b = map.getBounds();\n if (!b) return [\n [0, 0],\n [0, 0],\n ];\n const sw = b.getSouthWest();\n const ne = b.getNorthEast();\n return [\n [sw.lng(), sw.lat()],\n [ne.lng(), ne.lat()],\n ];\n },\n addMarker: (id, coords, anchor) => {\n const element = document.createElement(\"div\");\n element.dataset.gdsPart = \"map-marker\";\n element.dataset.gdsState = \"idle\";\n element.style.cursor = \"pointer\";\n // Google AdvancedMarker anchors the *bottom-center* of `content` to\n // the coord by default. For \"center\" anchor, shift content down so\n // the visual midpoint lands on the coord.\n if (anchor === \"center\") {\n element.style.transform = \"translateY(50%)\";\n }\n\n element.addEventListener(\"mouseenter\", () => callbacks.onMarkerHover(id));\n element.addEventListener(\"mouseleave\", () => callbacks.onMarkerHover(null));\n element.addEventListener(\"click\", (e) => {\n callbacks.onMarkerClick(id, handle.coords, e);\n });\n\n const marker = new google.maps.marker.AdvancedMarkerElement({\n map,\n position: { lat: coords[1], lng: coords[0] },\n content: element,\n });\n\n const handle: MarkerHandle = {\n element,\n coords,\n setHovered: (hovered) => {\n element.dataset.gdsState = hovered ? \"hovered\" : \"idle\";\n marker.zIndex = hovered ? 10 : 1;\n },\n setPosition: (next) => {\n handle.coords = next;\n marker.position = { lat: next[1], lng: next[0] };\n },\n remove: () => {\n marker.map = null;\n markers.delete(id);\n },\n };\n\n markers.set(id, { marker, handle });\n return handle;\n },\n destroy: () => {\n markers.forEach(({ marker }) => {\n marker.map = null;\n });\n markers.clear();\n // Google Map has no explicit destroy(); GC handles it once the\n // container DOM node is removed.\n },\n instance: map,\n };\n\n return adapter;\n};\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const AccordionContract = contract({\n name: \"Accordion\",\n description: \"Long-form content that would overwhelm if shown all at once — FAQs, settings groups, \\\"what's included\\\" sections, nested help. For tab-style peer views with one always visible, reach for Tabs. For a single show/hide reveal use Collapsible.\",\n import: \"@gradeui/ui\",\n aliases: [\"accordion\",\"faq\",\"expand\",\"collapse list\",\"disclosure list\",\"disclosure group\",\"outline group\",\"expandable list\",\"sectionlist\"],\n subcomponents: [\"AccordionItem\",\"AccordionTrigger\",\"AccordionContent\"],\n composesWith: [\"Card (as a faq inside a card body)\",\"Section primitives\"],\n props: {\n \"type\": {\n schema: z.enum([\"single\", \"multiple\"]),\n design: \"knob\",\n description: \"single keeps one open at a time, multiple lets several be open at once\",\n },\n \"collapsible\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"only valid with type=\\\"single\\\"; allows the open item to be toggled shut\",\n },\n \"defaultValue\": {\n schema: z.string().optional(),\n design: \"content\",\n description: \"initial open item(s)\",\n },\n \"value\": {\n schema: z.string().optional(),\n design: \"content\",\n description: \"controlled\",\n },\n \"onValueChange\": {\n schema: z.unknown().optional(),\n design: \"event\",\n },\n \"children\": {\n schema: z.unknown(),\n design: \"plumbing\",\n description: \"the row label users click to expand\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const AiChatContract = contract({\n name: \"AiChat\",\n description: \"A flexible chat block — header + scrollable message list + composer. Out of the box it looks like a polished \\\"AI panel\\\"; under it, every region is a slot so hosts can compose richer chat surfaces (e.g. Studio's left column with selection chip + settings panel above the composer, an error banner inline, per-message usage / refs / actions). Per-turn token usage, refs, and actions are optional and gated by `showUsage` / `showRefs` / `showActions` — leave them off for product-facing chats, turn them on for developer-facing ones where transparency matters. Composes with [[AIChatComposer]] (rendered internally; can be slotted in with custom props via `composerSlot`).\",\n import: \"@gradeui/ui\",\n aliases: [\"ai chat\",\"chat panel\",\"chat block\",\"llm chat\",\"assistant panel\",\"copilot chat\",\"ai assistant\"],\n composesWith: [\"Card (host in a sidebar panel)\",\"Sheet (mobile drawer)\",\"Stack (place above other content)\",\"AIChatComposer (internal composer; slot to override)\"],\n props: {\n \"messages\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"`{ id, role: \\\"user\\\" | \\\"assistant\\\", content, timestamp, thinking?, steps?, usage?, refs?, actions?, duration? }`; defaults to empty\",\n },\n \"onSendMessage\": {\n schema: z.unknown().optional(),\n design: \"event\",\n description: \"fires when the user submits via the default composer; ignored if `composerSlot` is set\",\n },\n \"isLoading\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"shows a typing indicator at the bottom of the message list\",\n },\n \"placeholder\": {\n schema: z.string().optional(),\n design: \"content\",\n description: \"composer placeholder text (ignored if `composerSlot` is set)\",\n },\n \"title\": {\n schema: z.string().optional(),\n design: \"plumbing\",\n description: \"header title; defaults to \\\"AI Assistant\\\"\",\n },\n \"titleIcon\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"optional icon rendered before the title (e.g. `<Sparkles />`)\",\n },\n \"headerTokens\": {\n schema: z.number().optional(),\n design: \"knob\",\n description: \"optional session-level token total shown on the right of the header; rendered as \\\"N tokens\\\" with a small gauge icon when set\",\n },\n \"headerEnd\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"optional arbitrary content appended after `headerTokens` on the right of the header\",\n },\n \"showUsage\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"show the per-turn `usage` strip below the assistant bubble; default false\",\n },\n \"showRefs\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"show the per-turn `refs` strip below the assistant bubble; default false\",\n },\n \"showActions\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"render per-turn `actions` chips when a message has them; default true\",\n },\n \"showDuration\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"render the per-turn wall-clock duration (\\\"2.3s\\\") below the assistant bubble when a message carries `duration`; default false\",\n },\n \"showThinking\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"render the per-turn reasoning (\\\"Thoughts\\\") disclosure above the assistant prose when a message carries `thinking`; collapsed by default, click to expand; default false\",\n },\n \"showSteps\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"render the per-turn step timeline above the assistant prose when a message carries `steps`; collapsed view shows the current running step (or \\\"N steps completed\\\"), click to expand the vertical timeline with status glyphs; default false\",\n },\n \"thinkingPhrase\": {\n schema: z.string().optional(),\n design: \"content\",\n description: \"override the \\\"Thinking\\\" label in the loading indicator\",\n },\n \"suggestedPrompts\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"empty-state quick prompts (ignored if `emptyStateSlot` is set)\",\n },\n \"emptyStateSlot\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"replaces the default empty state entirely\",\n },\n \"errorSlot\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"rendered after the messages list (typically an error banner)\",\n },\n \"composerAboveSlot\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"rendered between the messages and the composer (selection chip, settings panel)\",\n },\n \"composerBelowSlot\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"rendered below the composer (disclaimer, char counter)\",\n },\n \"composerSlot\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"full override of the composer; when provided, `onSendMessage` + `placeholder` are unused\",\n },\n \"bare\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"strip the outer card chrome (background, border, rounded corners) so the chat takes the surface of its container; default false (keeps the canned card look)\",\n },\n \"assistantBubble\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"whether assistant messages render with a bubble (background + border + padding + rounded corners); default true. Set false for a Claude.ai-style chromeless transcript where assistant text sits on the surface and only user turns wear a bubble.\",\n },\n \"className\": {\n schema: z.string().optional(),\n design: \"plumbing\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const AiChatComposerContract = contract({\n name: \"AiChatComposer\",\n description: \"The reusable \\\"input card\\\" for any chat surface — auto-growing textarea, image attachments via paperclip and clipboard paste, attachment chips with previews, Send/Stop toggle, controlled value. Drop in below any messages list. Use this when you want the input affordances of `<AIChat>` but you're rendering your own messages list / scrollarea / header (e.g. Studio's left-column chat, where SelectionChip and SettingsPanel sit between messages and composer). For the full canned chat block, use `<AIChat>` instead.\",\n import: \"@gradeui/ui\",\n aliases: [\"chat composer\",\"chat input\",\"prompt composer\",\"message input\"],\n composesWith: [\"AIChat (uses this internally)\",\"Card (host above)\",\"ScrollArea (place messages above)\"],\n props: {\n \"value\": {\n schema: z.string(),\n design: \"content\",\n description: \"controlled textarea value\",\n },\n \"onChange\": {\n schema: z.unknown(),\n design: \"event\",\n description: \"fires for every textarea change\",\n },\n \"onSend\": {\n schema: z.unknown(),\n design: \"event\",\n description: \"fires when the user submits (Enter or click Send); composer validates that text or attachments exist before firing\",\n },\n \"isLoading\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"disables the textarea + paperclip and swaps Send for Stop\",\n },\n \"onStop\": {\n schema: z.unknown().optional(),\n design: \"event\",\n description: \"fires when the user clicks Stop; without this, Stop renders disabled\",\n },\n \"placeholder\": {\n schema: z.string().optional(),\n design: \"content\",\n },\n \"maxLength\": {\n schema: z.number().optional(),\n design: \"knob\",\n description: \"hard cap passed to the underlying `<textarea>`\",\n },\n \"showHint\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"show the \\\"Press Enter… · Paste images\\\" hint below the card; default true, set false when the host renders its own footer\",\n },\n \"className\": {\n schema: z.string().optional(),\n design: \"plumbing\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const AppShellContract = contract({\n name: \"AppShell\",\n description: \"The top-level page scaffold for any app-like or marketing layout. Reach for AppShell\\ninstead of hand-rolling `grid grid-cols-[auto_1fr]` so the layout shape (top nav,\\nside nav, three-pane Slack/Mail/Notion shape, constrained vs full-width main) is a\\nprop the settings panel can mutate. Don't compose top-level layouts from raw grid\\ntemplates — the four variants below cover most app shapes.\\n\\nPick the `nav` variant from the source:\\n nav=\\\"none\\\" — Single column. Marketing landing, login, splash.\\n nav=\\\"top\\\" — Top bar + content. Reddit, Twitter chrome.\\n nav=\\\"side\\\" — Left nav + content. Linear, Notion sidebar shape.\\n nav=\\\"three-pane\\\" — **Narrow icon rail + Aside + Main.** The Slack /\\n WhatsApp / Mail / Plane / Discord / Notion-with-pages\\n shape. ANY time you see a vertical icon rail next to\\n a separate list/sidebar, this is the answer — don't\\n reach for raw `<div className=\\\"grid\\\">` with three\\n column tracks.\",\n import: \"@gradeui/ui\",\n subcomponents: [\"AppShellHeader\",\"AppShellNav\",\"AppShellAside\",\"AppShellMain\",\"AppShellFooter\"],\n composesWith: [\"Stack\",\"Row\",\"Card\",\"Button\",\"Separator\",\"Sidebar\",\"Toolbar\",\"any page content\"],\n props: {\n \"nav\": {\n schema: z.enum([\"none\", \"top\", \"side\", \"three-pane\"]).optional(),\n design: \"knob\",\n description: \"layout structure\",\n default: \"none\",\n },\n \"asChild\": {\n schema: z.boolean().optional(),\n design: \"plumbing\",\n description: \"render as the child element via Slot\",\n default: false,\n },\n \"className\": {\n schema: z.string().optional(),\n design: \"plumbing\",\n },\n \"children\": {\n schema: z.unknown(),\n design: \"plumbing\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const AvatarContract = contract({\n name: \"Avatar\",\n description: \"User/entity identity for PEOPLE — profile pictures, author rows, member lists, account headers. Circular by default; the AvatarFallback initials read as a person's name. Always include AvatarFallback so load failure doesn't leave a gap.\",\n import: \"@gradeui/ui\",\n aliases: [\"profile picture\",\"user image\",\"account image\",\"avatar\",\"person glyph\",\"user avatar\",\"profile image\",\"react native avatar\"],\n subcomponents: [\"AvatarImage\",\"AvatarFallback\"],\n composesWith: [\"Card (in CardHeader)\",\"Table cells\",\"Badge (placed next to for status)\",\"Skeleton (loading state)\"],\n props: {\n \"className\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"set size via utilities (default h-10 w-10)\",\n },\n \"src\": {\n schema: z.unknown(),\n design: \"plumbing\",\n },\n \"initials\": {\n schema: z.unknown(),\n design: \"plumbing\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const BadgeContract = contract({\n name: \"Badge\",\n description: \"Compact status chips, counts, tags, pills. For higher-signal inline status → use Callout. For solid CTAs → Button. Soft/outline variants are quieter; solid variants are loud.\",\n import: \"@gradeui/ui\",\n aliases: [\"chip\",\"tag\",\"pill\",\"label chip\",\"badge\",\"tag view\",\"status pill\",\"token\",\"count badge\"],\n composesWith: [\"Card\",\"Table (inside a cell)\",\"Avatar (next to it)\",\"anywhere inline\"],\n props: {\n \"variant\": {\n schema: z.enum([\"see list above\"]).optional(),\n design: \"knob\",\n },\n \"rounded\": {\n schema: z.enum([\"default\", \"full\"]).optional(),\n design: \"knob\",\n description: \"\\\"full\\\" gives a pill shape\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const BreadcrumbContract = contract({\n name: \"Breadcrumb\",\n description: \"Reach for Breadcrumb whenever a screen sits inside a hierarchy and you want the path back to the top to be visible. Common spots: above page titles in admin/CMS screens, top of Settings detail pages, after a router redirect when the URL implies depth. Use the current page as a <BreadcrumbPage> (non-clickable) and prior levels as <BreadcrumbLink>. For a horizontal \\\"top nav\\\" of peer destinations use Side Menu or Tabs instead — Breadcrumb is strictly for hierarchical path.\",\n import: \"@gradeui/ui\",\n aliases: [\"breadcrumb\",\"breadcrumbs\",\"crumbs\",\"path\",\"page hierarchy\",\"path bar\",\"navigation trail\",\"finder path\"],\n subcomponents: [\"BreadcrumbList\",\"BreadcrumbItem\",\"BreadcrumbLink\",\"BreadcrumbPage\",\"BreadcrumbSeparator\",\"BreadcrumbEllipsis\"],\n composesWith: [\"AppShellMain\",\"Card (in CardHeader)\",\"Dialog\"],\n props: {\n \"aria-label\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"passed to the underlying <nav>\",\n },\n \"separator\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"**tree-wide default** for every <BreadcrumbSeparator/> inside. Pass a string (\\\"/\\\", \\\"›\\\", \\\"•\\\"), a lucide icon (`<Slash/>`, `<ChevronRight/>`), or any ReactNode. Default: `<ChevronRight/>`. Set once on the root; every separator below picks it up via context.\",\n },\n \"className\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"the <ol> wrapper; usually no overrides needed\",\n },\n \"href\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"renders as <a> when set, <button> when not; asChild? wraps a custom element\",\n },\n \"children\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"per-instance override of the separator glyph. When set, beats the root's `separator` prop for this one slot. When not set, falls back to the root's `separator`, then to `<ChevronRight/>`.\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const ButtonContract = contract({\n name: \"Button\",\n description: \"Any clickable action. Use size=\\\"icon\\\" for square icon-only buttons, variant=\\\"link\\\" for inline links that should look like Button. A Button placed next to a TabsList of the same size lines up edge-to-edge without per-call overrides.\",\n import: \"@gradeui/ui\",\n aliases: [\"button\",\"push button\",\"plain button\",\"bordered button\",\"destructive button\",\"capsule button\",\"link button\",\"action button\",\"cta\"],\n composesWith: [\"Dialog\",\"DropdownMenu\",\"Tooltip\",\"Card (in CardFooter)\",\"Row\",\"Form controls\"],\n props: {\n \"variant\": {\n schema: z.enum([\"default\", \"destructive\", \"outline\", \"secondary\", \"ghost\", \"link\"]).optional(),\n design: \"knob\",\n },\n \"size\": {\n schema: z.enum([\"sm\", \"md\", \"lg\", \"icon\"]).optional(),\n design: \"knob\",\n description: \"t-shirt scale aligned with Tabs/ToggleGroup heights (sm=h-7, md=h-8, lg=h-10). `default` still works as an alias for `md`.\",\n },\n \"asChild\": {\n schema: z.boolean().optional(),\n design: \"plumbing\",\n description: \"renders as the child element (use to wrap <a>/<Link>)\",\n },\n \"disabled\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const CalendarContract = contract({\n name: \"Calendar\",\n description: \"An inline date grid — date-of-birth pickers in profile forms, scheduling screens with a month view, range selection in reporting filters. For a compact trigger-and-popover input, use DatePicker / DateRangePicker (which wrap Calendar internally). For one-off relative dates (\\\"yesterday\\\", \\\"last week\\\") use a Select instead.\",\n import: \"@gradeui/ui\",\n aliases: [\"calendar\",\"date grid\",\"month view\",\"scheduler grid\",\"calendar view\",\"multidate picker\",\"react native calendars\"],\n subcomponents: [\"CalendarDayButton\"],\n composesWith: [\"Popover (DatePicker composes them)\",\"Card (inline scheduling card)\",\"Dialog (full-screen mobile date pick)\"],\n props: {\n \"mode\": {\n schema: z.enum([\"single\", \"multiple\", \"range\"]).optional(),\n design: \"knob\",\n description: \"picks one date, several dates, or a [from, to] range\",\n },\n \"selected\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"controlled selection; shape matches `mode`\",\n },\n \"onSelect\": {\n schema: z.unknown().optional(),\n design: \"event\",\n description: \"fires with the new selection\",\n },\n \"month\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"controlled displayed month\",\n },\n \"defaultMonth\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"uncontrolled initial month\",\n },\n \"onMonthChange\": {\n schema: z.unknown().optional(),\n design: \"event\",\n },\n \"numberOfMonths\": {\n schema: z.number().optional(),\n design: \"knob\",\n description: \"render multiple months side by side, useful for range pickers\",\n },\n \"disabled\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n },\n \"captionLayout\": {\n schema: z.enum([\"label\", \"dropdown\", \"dropdown-months\", \"dropdown-years\"]).optional(),\n design: \"knob\",\n },\n \"className\": {\n schema: z.string().optional(),\n design: \"plumbing\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const CalloutContract = contract({\n name: \"Callout\",\n description: \"Inline, ambient, non-blocking status/feedback that sits inside the layout flow. Form-level validation summaries, settings-page notices, page-level banners. NOT a toast (use Sonner for transient). NOT a modal (use Dialog when the user must respond). Put an icon as first child — it's auto-positioned; CalloutTitle + CalloutDescription follow.\",\n import: \"@gradeui/ui\",\n aliases: [\"callout\",\"banner\",\"notice\",\"inline alert\",\"in-app notification\",\"status banner\",\"info banner\",\"info callout\",\"warning callout\",\"success callout\"],\n subcomponents: [\"CalloutTitle\",\"CalloutDescription\"],\n composesWith: [\"lucide-react icons as first child\",\"Button (inside CalloutDescription)\",\"Card (as a section callout)\"],\n props: {\n \"variant\": {\n schema: z.enum([\"default\", \"destructive\", \"success\", \"warning\", \"info\"]).optional(),\n design: \"knob\",\n description: \"semantic colouring; `default` is neutral\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const CardContract = contract({\n name: \"Card\",\n description: \"Grouped content with a distinct surface — settings panels, dashboard tiles, list-of-cards layouts. Pair CardHeader (title + description) with CardContent and optional CardFooter (actions).\",\n import: \"@gradeui/ui\",\n aliases: [\"card\",\"group box\",\"groupbox\",\"panel\",\"tile\",\"surface\"],\n subcomponents: [\"CardHeader\",\"CardTitle\",\"CardDescription\",\"CardContent\",\"CardFooter\"],\n composesWith: [\"Button (in CardFooter)\",\"Badge\",\"Separator\",\"Avatar\",\"any form controls\"],\n props: {\n \"Each\": {\n schema: z.unknown(),\n design: \"plumbing\",\n },\n \"No\": {\n schema: z.unknown(),\n design: \"plumbing\",\n description: \"Card is a flexible container surface\",\n },\n },\n});\n","/**\n * Carousel — component contract.\n *\n * Hand-authored (no generator marker at the top), so it survives\n * `pnpm -F @gradeui/ui generate:contracts` reruns. Mirrors the\n * Carousel component's TS interface and exposes the props the\n * Studio settings panel can render controls for.\n *\n * Per-slide content (durations, video src/poster, alt text) lives on\n * `Carousel.Slide` / `Carousel.VideoSlide` and is intentionally NOT\n * surfaced through this top-level contract — those belong to the\n * children's own contracts (added later if/when we want per-slide\n * editing). For v1, the panel edits the carousel-wide knobs (autoplay,\n * loop, align, slides per view) and the chat handles per-slide\n * authoring.\n */\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nconst AlignSchema = z.enum([\"start\", \"center\", \"end\"]);\nconst AutoplayConfigSchema = z.object({\n delay: z.number().int().positive().optional(),\n pauseOnHover: z.boolean().optional(),\n pauseWhenOffscreen: z.boolean().optional(),\n});\nconst AutoplaySchema = z.union([z.boolean(), AutoplayConfigSchema]);\n\nexport const CarouselContract = contract({\n name: \"Carousel\",\n description:\n \"Token-driven slideshow primitive. Embla under the hood, custom autoplay loop with per-slide duration overrides, and a VideoSlide variant that autoplays muted+loop with a poster fallback. Reach for it for marketing hero rotations, app onboarding tours, image galleries, TV/streaming featured rails — anywhere a horizontal stack of slides cycles automatically or on user input.\",\n import: \"@gradeui/ui\",\n aliases: [\n \"carousel\",\n \"slideshow\",\n \"slider\", // colloquial — disambiguate from <Slider> (range input) at the prompt-stitching layer\n \"hero rotation\",\n \"image gallery\",\n \"featured row\",\n \"swipe deck\",\n ],\n subcomponents: [\n \"Carousel.Slide\",\n \"Carousel.VideoSlide\",\n \"Carousel.Dots\",\n \"Carousel.Arrows\",\n \"Carousel.Prev\",\n \"Carousel.Next\",\n ],\n composesWith: [\n \"MediaSurface (inside Carousel.Slide for posters / album art)\",\n \"Card (slide content)\",\n \"Stack / Row (slide composition)\",\n ],\n\n props: {\n // ── Knobs — design choices ───────────────────────────────────────\n loop: {\n schema: z.boolean().optional(),\n design: \"knob\",\n label: \"Loop\",\n default: true,\n description:\n \"Wrap from the last slide back to the first. Default true — the natural fit for hero rotations. Turn off for finite onboarding sequences.\",\n },\n align: {\n schema: AlignSchema.optional(),\n design: \"knob\",\n control: \"toggle-group\",\n label: \"Slide alignment\",\n default: \"start\",\n description:\n \"How slides line up inside the viewport when not at 100% width. 'start' is full-bleed; 'center' gives the 'peek of neighbours' carousel look.\",\n },\n slidesPerView: {\n schema: z.number().int().positive().optional(),\n design: \"knob\",\n label: \"Slides per view\",\n default: 1,\n description:\n \"How many slides show at once. 1 for hero rotations; 3 for thumbnail strips; etc. For media-query responsive layouts, leave this at 1 and override `--gds-carousel-slide-basis` on each Slide via CSS.\",\n },\n autoplay: {\n schema: AutoplaySchema.optional(),\n design: \"structured\",\n label: \"Autoplay\",\n default: false,\n description:\n \"`true` for sensible defaults (5s, pause on hover, pause offscreen). Object form: `{ delay, pauseOnHover, pauseWhenOffscreen }`. Per-slide overrides go on `<Carousel.Slide duration={ms}>`.\",\n },\n draggable: {\n schema: z.boolean().optional(),\n design: \"knob\",\n label: \"Drag to swipe\",\n default: true,\n description:\n \"Disable when slide content (a Map, a chart, a draggable card) needs to swallow drag events.\",\n },\n\n // ── Events ───────────────────────────────────────────────────────\n onSlideChange: {\n schema: z.function().optional(),\n design: \"event\",\n description:\n \"Fires with the new slide index whenever the active slide changes (programmatic, autoplay, or user swipe).\",\n },\n\n // ── Plumbing ─────────────────────────────────────────────────────\n className: {\n schema: z.string().optional(),\n design: \"plumbing\",\n },\n style: {\n schema: z.record(z.string(), z.unknown()).optional(),\n design: \"plumbing\",\n },\n children: {\n schema: z.unknown(),\n design: \"plumbing\",\n description:\n \"Carousel.Slide / Carousel.VideoSlide children, plus optionally Carousel.Dots and Carousel.Arrows.\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const ChartContract = contract({\n name: \"Chart\",\n description: \"Reporting dashboards, single-purpose analytics cards (revenue, conversions, active users), or anywhere you'd otherwise hand-roll a Recharts setup. Bring the actual chart type from `recharts` — ChartContainer doesn't pick the chart shape for you, it themes whatever you nest. For sparkline-style decorative trends consider just rendering a small SVG line directly; ChartContainer is overkill for non-interactive ornament.\",\n import: \"@gradeui/ui\",\n aliases: [\"chart\",\"charts\",\"graph\",\"bar chart\",\"line chart\",\"area chart\",\"recharts\",\"analytics chart\",\"swift chart\",\"swiftui chart\",\"victory chart\",\"victory native\"],\n subcomponents: [\"ChartTooltip\",\"ChartTooltipContent\",\"ChartLegend\",\"ChartLegendContent\",\"ChartStyle\"],\n composesWith: [\"Card (chart-in-a-card pattern)\",\"Tabs (multi-metric switcher)\",\"Recharts components (Bar\",\"Line\",\"Area\",\"Pie\",\"Radar from \\\"recharts\\\")\"],\n props: {\n \"config\": {\n schema: z.unknown(),\n design: \"plumbing\",\n description: \"`{ [seriesKey]: { label: string; color?: string; theme?: { light: string; dark: string } } }`; the keys here are the names you reference in your Recharts <Bar dataKey=\\\"…\\\" /> calls\",\n },\n \"id\": {\n schema: z.string().optional(),\n design: \"plumbing\",\n description: \"used for the inlined <style> tag\",\n },\n \"children\": {\n schema: z.unknown(),\n design: \"plumbing\",\n description: \"typically a single Recharts ResponsiveContainer or chart\",\n },\n \"passes\": {\n schema: z.unknown(),\n design: \"plumbing\",\n description: \"pair with `content={<ChartTooltipContent />}`\",\n },\n \"indicator\": {\n schema: z.enum([\"dot\", \"line\", \"dashed\"]).optional(),\n design: \"knob\",\n },\n \"ChartLegend\": {\n schema: z.unknown(),\n design: \"plumbing\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const CheckboxContract = contract({\n name: \"Checkbox\",\n description: \"Binary on/off tied to a list (select multiple, agree to terms). Single on/off that controls a setting is better with Switch.\",\n import: \"@gradeui/ui\",\n aliases: [\"checkbox\",\"tickbox\",\"tick box\",\"check\",\"multi-select item\"],\n composesWith: [\"Label (via htmlFor)\",\"Card\",\"Form rows\",\"Table (for row selection)\"],\n props: {\n \"checked\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n },\n \"onCheckedChange\": {\n schema: z.unknown().optional(),\n design: \"event\",\n },\n \"defaultChecked\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n },\n \"disabled\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n },\n \"id\": {\n schema: z.string().optional(),\n design: \"plumbing\",\n description: \"bind a Label's htmlFor to this\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const CollapsibleContract = contract({\n name: \"Collapsible\",\n description: \"A single show/hide reveal — \\\"Show advanced settings\\\" rows, expandable inline help, \\\"More details\\\" sections inside cards. For multiple rows of expandable content where one-at-a-time matters, reach for Accordion. For a separate panel that floats above content, use Popover.\",\n import: \"@gradeui/ui\",\n aliases: [\"collapsible\",\"expand\",\"show more\",\"disclosure\",\"advanced settings\",\"disclosure group\",\"expandable section\",\"expandable view\",\"show hide\"],\n subcomponents: [\"CollapsibleTrigger\",\"CollapsibleContent\"],\n composesWith: [\"Button (as the trigger\",\"asChild)\",\"Card (expandable settings group)\",\"Row (header + chevron)\"],\n props: {\n \"open\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"controlled open state\",\n },\n \"defaultOpen\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"uncontrolled initial state\",\n },\n \"onOpenChange\": {\n schema: z.unknown().optional(),\n design: \"event\",\n },\n \"children\": {\n schema: z.unknown(),\n design: \"plumbing\",\n description: \"the clickable header (often a Button asChild)\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const CommandContract = contract({\n name: \"Command\",\n description: \"A searchable list of actions or destinations — global ⌘K palettes, \\\"jump to\\\" inputs, account switchers with filter. Wrap in CommandDialog when it should pop over the entire app on a hotkey. For straight forms with filter, prefer a Select with a search input. For free-text autocomplete tied to a single value, prefer Combobox built on Popover + Command.\",\n import: \"@gradeui/ui\",\n aliases: [\"command palette\",\"command menu\",\"cmd k\",\"quick switcher\",\"action menu\",\"spotlight\",\"spotlight search\",\"quick open\",\"fuzzy finder\"],\n subcomponents: [\"CommandInput\",\"CommandList\",\"CommandEmpty\",\"CommandGroup\",\"CommandItem\",\"CommandSeparator\",\"CommandShortcut\",\"CommandDialog\"],\n composesWith: [\"Dialog (CommandDialog wraps it)\",\"Popover (inline combobox)\",\"Tooltip\"],\n props: {\n \"value\": {\n schema: z.string().optional(),\n design: \"content\",\n description: \"controlled active item value\",\n },\n \"onValueChange\": {\n schema: z.unknown().optional(),\n design: \"event\",\n },\n \"placeholder\": {\n schema: z.string().optional(),\n design: \"content\",\n },\n \"children\": {\n schema: z.unknown(),\n design: \"plumbing\",\n description: \"wraps groups and empty state\",\n },\n \"heading\": {\n schema: z.string().optional(),\n design: \"content\",\n },\n \"onSelect\": {\n schema: z.unknown().optional(),\n design: \"event\",\n },\n \"disabled\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n },\n \"open\": {\n schema: z.unknown(),\n design: \"plumbing\",\n description: \"when you want the command palette mounted in a modal (cmd+k pattern)\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const DatePickerContract = contract({\n name: \"DatePicker\",\n description: \"Any date or date-range entry. Use DatePicker for a single date (DOB, due date, booking). Use DateRangePicker for a span (report period, stay dates, filter window). Prefer these over <Input type=\\\"date\\\"> — consistent theming, keyboard nav, a11y, and no browser-native UI drift.\",\n import: \"@gradeui/ui\",\n aliases: [\"datepicker\",\"calendar input\",\"date field\",\"date range\",\"datepickerios\",\"react native date picker\",\"calendar input field\",\"date field control\"],\n subcomponents: [\"DateRangePicker\"],\n composesWith: [\"Label\",\"Form\",\"Card (in CardContent)\",\"Button (form submit)\"],\n props: {\n \"value\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n },\n \"onChange\": {\n schema: z.unknown().optional(),\n design: \"event\",\n description: \"called on select or clear\",\n },\n \"placeholder\": {\n schema: z.string().optional(),\n design: \"content\",\n description: \"trigger label when empty (default \\\"Pick a date\\\" / \\\"Pick a date range\\\")\",\n },\n \"disabled\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n },\n \"format\": {\n schema: z.string().optional(),\n design: \"content\",\n description: \"date-fns format token for the trigger label (default \\\"PPP\\\" single, \\\"LLL dd, y\\\" range)\",\n },\n \"align\": {\n schema: z.enum([\"start\", \"center\", \"end\"]).optional(),\n design: \"knob\",\n description: \"popover align (default \\\"start\\\")\",\n },\n \"side\": {\n schema: z.enum([\"top\", \"right\", \"bottom\", \"left\"]).optional(),\n design: \"knob\",\n description: \"popover side\",\n },\n \"captionLayout\": {\n schema: z.enum([\"label\", \"dropdown\", \"dropdown-months\", \"dropdown-years\"]).optional(),\n design: \"knob\",\n },\n \"className\": {\n schema: z.string().optional(),\n design: \"plumbing\",\n description: \"on the trigger button\",\n },\n \"contentClassName\": {\n schema: z.string().optional(),\n design: \"content\",\n description: \"on the PopoverContent\",\n },\n \"icon\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"replaces the default CalendarIcon\",\n },\n \"numberOfMonths\": {\n schema: z.number().optional(),\n design: \"knob\",\n description: \"DateRangePicker only, default 2\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const DialogContract = contract({\n name: \"Dialog\",\n description: \"Modal interruptions — confirmations, focused forms, detail views. Dialog is the right primitive for Apple HIG / React Native \\\"Alert\\\" (modal) semantics. For non-blocking inline messaging use Callout; for transient notifications use Toaster (Sonner). Always include DialogTitle (a11y requirement).\",\n import: \"@gradeui/ui\",\n aliases: [\"modal\",\"popup\",\"overlay\",\"alert\",\"system alert\",\"alert dialog\",\"modal dialog\",\"confirm dialog\",\"react native modal\",\"rn alert\"],\n subcomponents: [\"DialogTrigger\",\"DialogContent\",\"DialogHeader\",\"DialogTitle\",\"DialogDescription\",\"DialogFooter\",\"DialogClose\"],\n composesWith: [\"Button (as DialogTrigger asChild\",\"and inside DialogFooter)\",\"Input/Textarea/Select inside DialogContent\"],\n props: {\n \"open\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"Radix controlled/uncontrolled pattern\",\n },\n \"asChild\": {\n schema: z.enum([\"wrap a Button\"]).optional(),\n design: \"plumbing\",\n },\n \"accepts\": {\n schema: z.unknown(),\n design: \"plumbing\",\n },\n \"used\": {\n schema: z.unknown(),\n design: \"plumbing\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const DropdownMenuContract = contract({\n name: \"DropdownMenu\",\n description: \"A small action menu attached to a trigger — overflow \\\"…\\\" buttons on cards, user-avatar menus in headers, \\\"Insert\\\" menus in editors. For a full searchable list, use Command. For ONE primary action plus a secondary, use a Button next to a smaller ghost Button instead of a dropdown.\",\n import: \"@gradeui/ui\",\n aliases: [\"dropdown\",\"dropdown menu\",\"overflow menu\",\"kebab menu\",\"more menu\",\"action menu\",\"context-style menu\",\"menu\",\"pull-down menu\",\"pulldown menu\",\"context menu\",\"popup menu\",\"actions menu\"],\n subcomponents: [\"DropdownMenuTrigger\",\"DropdownMenuContent\",\"DropdownMenuItem\",\"DropdownMenuCheckboxItem\",\"DropdownMenuRadioGroup\",\"DropdownMenuRadioItem\",\"DropdownMenuLabel\",\"DropdownMenuSeparator\",\"DropdownMenuShortcut\",\"DropdownMenuGroup\",\"DropdownMenuSub\",\"DropdownMenuSubTrigger\",\"DropdownMenuSubContent\"],\n composesWith: [\"Button (as trigger asChild)\",\"Avatar (user menu)\",\"Card (overflow on a tile)\",\"Tooltip (on the trigger)\"],\n props: {\n \"open\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n },\n \"asChild\": {\n schema: z.boolean().optional(),\n design: \"plumbing\",\n description: \"usually wraps a Button\",\n },\n \"align\": {\n schema: z.enum([\"start\", \"center\", \"end\", \"top\", \"right\", \"bottom\", \"left\"]).optional(),\n design: \"knob\",\n },\n \"onSelect\": {\n schema: z.unknown().optional(),\n design: \"event\",\n },\n \"DropdownMenuCheckboxItem\": {\n schema: z.unknown(),\n design: \"plumbing\",\n },\n \"DropdownMenuSub\": {\n schema: z.unknown(),\n design: \"plumbing\",\n description: \"sub-trigger shows children, sub-content holds the deeper items\",\n },\n \"children\": {\n schema: z.unknown(),\n design: \"plumbing\",\n description: \"right-aligned kbd hint\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const FlexContract = contract({\n name: \"Flex\",\n description: \"The unopinionated flexbox primitive — reach for Flex when Stack, Row, or Grid don't quite fit. Specifically when you need reverse direction (`row-reverse` / `col-reverse`), CSS defaults instead of Row's baked-in `items-center gap-md`, or baseline alignment. Otherwise prefer Stack / Row / Grid — they're easier to read and tuned for the 95% case. Flex is the escape hatch, not the default.\",\n import: \"@gradeui/ui\",\n aliases: [\"flex\",\"flexbox\",\"flex container\",\"hstack\",\"vstack\",\"horizontal\",\"vertical\",\"generic container\",\"layout view\"],\n composesWith: [\"any content component\"],\n props: {\n \"direction\": {\n schema: z.enum([\"row\", \"col\", \"row-reverse\", \"col-reverse\"]).optional(),\n design: \"knob\",\n description: \"main-axis direction\",\n default: \"row\",\n },\n \"gap\": {\n schema: z.enum([\"none\", \"xs\", \"sm\", \"md\", \"lg\", \"xl\", \"2xl\"]).optional(),\n design: \"knob\",\n description: \"gap between children\",\n default: \"none\",\n },\n \"align\": {\n schema: z.enum([\"start\", \"center\", \"end\", \"stretch\", \"baseline\"]).optional(),\n design: \"knob\",\n description: \"cross-axis alignment\",\n default: \"stretch\",\n },\n \"justify\": {\n schema: z.enum([\"start\", \"center\", \"end\", \"between\", \"around\", \"evenly\"]).optional(),\n design: \"knob\",\n description: \"main-axis distribution\",\n default: \"start\",\n },\n \"wrap\": {\n schema: z.enum([\"nowrap\", \"wrap\", \"wrap-reverse\"]).optional(),\n design: \"knob\",\n description: \"wrap behaviour when children overflow\",\n default: \"nowrap\",\n },\n \"asChild\": {\n schema: z.boolean().optional(),\n design: \"plumbing\",\n description: \"render as the child element via Slot\",\n default: false,\n },\n \"className\": {\n schema: z.string().optional(),\n design: \"plumbing\",\n },\n \"children\": {\n schema: z.unknown(),\n design: \"plumbing\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const GridContract = contract({\n name: \"Grid\",\n description: \"2D layouts where Stack (vertical) and Row (horizontal) don't fit — stat-card grids, feature tiles, pricing columns, photo grids. Reach for Grid over hand-rolled `grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4` so the column count is a prop the settings panel can mutate and the responsive ladder stays consistent across designs.\",\n import: \"@gradeui/ui\",\n aliases: [\"grid\",\"tiles\",\"cards grid\",\"stat grid\",\"columns\",\"feature grid\",\"grid view\",\"lazy v grid\",\"lazyvgrid\",\"lazy h grid\",\"lazyhgrid\",\"tile grid\",\"masonry\"],\n composesWith: [\"Card\",\"Stack (inside each cell)\",\"Row\",\"Button\",\"any content component\"],\n props: {\n \"cols\": {\n schema: z.enum([\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"12\"]).optional(),\n design: \"knob\",\n description: \"desktop column count; each value has a baked-in responsive ladder (e.g. \\\"4\\\" → 1 col mobile, 2 tablet, 4 desktop)\",\n default: \"3\",\n },\n \"gap\": {\n schema: z.enum([\"none\", \"xs\", \"sm\", \"md\", \"lg\", \"xl\", \"2xl\"]).optional(),\n design: \"knob\",\n description: \"gap between grid cells (same scale as Stack/Row)\",\n default: \"md\",\n },\n \"align\": {\n schema: z.enum([\"start\", \"center\", \"end\", \"stretch\"]).optional(),\n design: \"knob\",\n description: \"cross-axis alignment of cells\",\n default: \"stretch\",\n },\n \"asChild\": {\n schema: z.boolean().optional(),\n design: \"plumbing\",\n description: \"render as the child element via Slot\",\n default: false,\n },\n \"className\": {\n schema: z.string().optional(),\n design: \"plumbing\",\n },\n \"children\": {\n schema: z.unknown(),\n design: \"plumbing\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const HoverCardContract = contract({\n name: \"HoverCard\",\n description: \"Rich preview content surfaced on hover — user profile mini-cards on @-mentions, link previews, definition popups. Pointer-only by design (no touch-friendly trigger); pair with a click target for touch devices, or fall back to Popover. NEVER use HoverCard for critical info — if the user can't reach it via keyboard or touch, it might as well not exist for accessibility.\",\n import: \"@gradeui/ui\",\n aliases: [\"hover card\",\"hover preview\",\"mention preview\",\"profile peek\",\"link preview\",\"rich tooltip\",\"link preview card\",\"profile hover\",\"peek card\"],\n subcomponents: [\"HoverCardTrigger\",\"HoverCardContent\"],\n composesWith: [\"Avatar (user preview)\",\"Card (richer content)\",\"Link (the trigger)\"],\n props: {\n \"open\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n },\n \"asChild\": {\n schema: z.boolean().optional(),\n design: \"plumbing\",\n description: \"usually a Link or Button\",\n },\n \"side\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const InputContract = contract({\n name: \"Input\",\n description: \"Any single-line text entry. Always pair with a Label for accessibility.\",\n import: \"@gradeui/ui\",\n aliases: [\"text field\",\"textbox\",\"textfield\",\"form field\",\"text input\",\"secure field\",\"search field\",\"url field\",\"number field\",\"textinput\",\"text input field\",\"react native textinput\"],\n composesWith: [\"Label\",\"Form\",\"Card (in CardContent)\",\"Button (form submit)\"],\n props: {\n \"type\": {\n schema: z.string().optional(),\n design: \"content\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const LabelContract = contract({\n name: \"Label\",\n description: \"Every Input / Textarea / Checkbox / Switch / RadioGroup. Always use htmlFor so clicking the label focuses the control.\",\n import: \"@gradeui/ui\",\n aliases: [\"label\",\"form label\",\"field label\",\"caption\"],\n composesWith: [\"Input\",\"Textarea\",\"Checkbox\",\"Switch\",\"RadioGroup\",\"Select\"],\n props: {\n \"htmlFor\": {\n schema: z.string().optional(),\n design: \"content\",\n description: \"binds to the input's id\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const MapContract = contract({\n name: \"Map\",\n description: \"Any layout that needs a real map — listings (real estate, Airbnb-style), fleet/logistics dashboards, store locators, anywhere a user picks a location from a viewport. Reach for the controlled `hoveredId` prop when a sibling list and the map need to highlight each other.\",\n import: \"@gradeui/ui\",\n aliases: [\"map\",\"maps\",\"mapbox\",\"maplibre\",\"google maps\",\"geo\",\"location\",\"latlng\",\"coordinates\",\"marker\",\"pin\",\"airbnb\",\"listings\",\"fleet\",\"real estate\",\"logistics\",\"map view\",\"mapkit\",\"mapview\",\"react native maps\",\"rn maps\"],\n subcomponents: [\"MapMarker\"],\n composesWith: [\"Card (as marker content)\",\"Badge\",\"Avatar\",\"Button\",\"Row\",\"Stack\",\"Skeleton\"],\n props: {\n \"provider\": {\n schema: z.unknown(),\n design: \"plumbing\",\n description: \"\\\"maplibre\\\" (default, free, no key) | \\\"mapbox\\\" (needs accessToken) | \\\"google\\\" (needs apiKey). Switching is one prop change.\",\n },\n \"center\": {\n schema: z.unknown(),\n design: \"plumbing\",\n description: \"`[lng, lat]` tuple. ALWAYS lng first. Required.\",\n },\n \"zoom\": {\n schema: z.unknown(),\n design: \"plumbing\",\n description: \"number, 0–22. Required.\",\n },\n \"bounds\": {\n schema: z.unknown(),\n design: \"plumbing\",\n description: \"`[[swLng, swLat], [neLng, neLat]]`. When set, takes precedence over center+zoom.\",\n },\n \"appearance\": {\n schema: z.unknown(),\n design: \"plumbing\",\n description: \"\\\"light\\\" | \\\"dark\\\" | \\\"satellite\\\" | \\\"auto\\\" (default \\\"auto\\\", follows GradeThemeProvider mode).\",\n },\n \"hoveredId\": {\n schema: z.unknown(),\n design: \"plumbing\",\n description: \"controlled string id, pairs with onHoveredIdChange. The matching MapMarker gets `data-gds-state=\\\"hovered\\\"` automatically. This is how you build list ↔ map two-way sync.\",\n },\n \"interactive\": {\n schema: z.unknown(),\n design: \"plumbing\",\n description: \"false freezes pan/zoom, useful for static cards.\",\n },\n \"onLoad\": {\n schema: z.unknown(),\n design: \"event\",\n description: \"handle exposes flyTo, panTo, fitBounds, getCenter, getZoom, getBounds, instance.\",\n },\n \"tilerKey\": {\n schema: z.enum([\"maplibre\"]),\n design: \"knob\",\n description: \"only needed off `gradeui.com`/`localhost`. Default key is referrer-locked.\",\n },\n \"accessToken\": {\n schema: z.enum([\"mapbox), apiKey (google\"]),\n design: \"knob\",\n description: \"required for those providers.\",\n },\n },\n});\n","/**\n * MediaSurface — component contract.\n *\n * First contract in the codebase, so this file is the reference template\n * other components will copy. Five rules of thumb worth carrying over:\n *\n * 1. **One contract file per component**, co-located with the .tsx.\n * The two evolve together; the contract is the source of truth\n * for both the playbook prompt and the settings panel.\n *\n * 2. **Every prop in the component's TS interface has a contract entry.**\n * Even plumbing escapes (`asChild`, `className`, `style`) — they go\n * under `design: \"plumbing\"` so the panel filters them out, but\n * they exist for runtime validation and type derivation.\n *\n * 3. **Discriminated unions express structured props.** MediaSurface's\n * `source` is the canonical case: kind-based shapes that the panel\n * reveals as per-kind sub-forms. Zod's `discriminatedUnion` keeps\n * the type narrowing intact through `z.infer`.\n *\n * 4. **Actions are first-class.** Anything imperative (\"Fill image\",\n * \"Refresh\", future \"Force open this dialog\") lives under `actions`,\n * not as a prop. Host (Studio) wires the action handler by `kind`.\n *\n * 5. **Keep descriptions terse and concrete.** They surface in three\n * places: panel tooltips, the playbook prompt, generated docs.\n * A 200-character paragraph reads badly in all three.\n */\n\nimport { z } from \"zod\";\nimport { contract, type InferProps } from \"@gradeui/contracts\";\n\n// ─── Source descriptor schema ──────────────────────────────────────\n//\n// Discriminated union mirroring MediaSource in `media-surface.tsx`.\n// The component's own type and this schema MUST stay in lock-step;\n// changing one without the other surfaces at the next typecheck\n// because the component will import `InferProps<typeof\n// MediaSurfaceContract>` once the migration completes.\n\nconst AlbumSource = z.object({\n kind: z.literal(\"album\"),\n artist: z.string(),\n title: z.string(),\n year: z.number().optional(),\n description: z.string().optional(),\n});\n\nconst TvShowSource = z.object({\n kind: z.literal(\"tv-show\"),\n title: z.string(),\n year: z.number().optional(),\n description: z.string().optional(),\n});\n\nconst MovieSource = z.object({\n kind: z.literal(\"movie\"),\n title: z.string(),\n year: z.number().optional(),\n description: z.string().optional(),\n});\n\nconst GameSource = z.object({\n kind: z.literal(\"game\"),\n title: z.string(),\n description: z.string().optional(),\n});\n\nconst BookSource = z.object({\n kind: z.literal(\"book\"),\n title: z.string().optional(),\n author: z.string().optional(),\n isbn: z.string().optional(),\n description: z.string().optional(),\n});\n\nconst PosterSource = z.object({\n kind: z.literal(\"poster\"),\n title: z.string(),\n year: z.number().optional(),\n description: z.string().optional(),\n});\n\nconst PortraitSource = z.object({\n kind: z.literal(\"portrait\"),\n name: z.string().optional(),\n role: z.string().optional(),\n});\n\nconst LandscapeSource = z.object({\n kind: z.literal(\"landscape\"),\n location: z.string().optional(),\n mood: z.string().optional(),\n});\n\nconst ProductSource = z.object({\n kind: z.literal(\"product\"),\n name: z.string().optional(),\n brand: z.string().optional(),\n});\n\nconst FoodSource = z.object({\n kind: z.literal(\"food\"),\n dish: z.string().optional(),\n cuisine: z.string().optional(),\n});\n\nconst GenericSource = z.object({\n kind: z.literal(\"generic\"),\n prompt: z.string(),\n});\n\nconst NoSubFieldsSource = z.union([\n z.object({ kind: z.literal(\"video\") }),\n z.object({ kind: z.literal(\"audio\") }),\n z.object({ kind: z.literal(\"embed\") }),\n z.object({ kind: z.literal(\"3d\") }),\n]);\n\nconst MediaSourceSchema = z.union([\n AlbumSource,\n TvShowSource,\n MovieSource,\n GameSource,\n BookSource,\n PosterSource,\n PortraitSource,\n LandscapeSource,\n ProductSource,\n FoodSource,\n GenericSource,\n NoSubFieldsSource,\n]);\n\n// ─── Enums ─────────────────────────────────────────────────────────\n\nconst AspectSchema = z.enum([\"video\", \"square\", \"portrait\", \"wide\", \"auto\"]);\nconst RadiusSchema = z.enum([\"none\", \"sm\", \"md\", \"lg\", \"xl\"]);\nconst HintSchema = z.enum([\n \"album\",\n \"tv-show\",\n \"movie\",\n \"game\",\n \"book\",\n \"portrait\",\n \"landscape\",\n \"poster\",\n \"product\",\n \"food\",\n \"video\",\n \"audio\",\n \"embed\",\n \"3d\",\n \"generic\",\n]);\nconst EmptyStateSchema = z.union([\n z.literal(\"auto\"),\n z.literal(\"icon\"),\n z.literal(\"none\"),\n]);\n\n// ─── Contract ──────────────────────────────────────────────────────\n\nexport const MediaSurfaceContract = contract({\n name: \"MediaSurface\",\n description:\n \"The canonical media slot for ALL non-person imagery — album art, posters, hero images, landscape photos, video and 3D containers.\",\n when:\n \"Pass `hint` + `alt` + (optionally) `source` so the empty-state placeholder is meaningful and the generation pipeline can later fill the slot with a real image. Use directly for declarative slots; the higher-level VideoPlayer / RivePlayer / ThreeScene wrap this for runtime-heavy media.\",\n antipatterns: [\n \"Don't wrap <Avatar> inside <MediaSurface> to get an initials fallback. Set `alt` + `hint` on MediaSurface directly — the placeholder renders initials at small sizes derived from `alt`.\",\n \"Don't use <Avatar> for album art, posters, products, food, landscapes, etc. Avatar is for PEOPLE only.\",\n \"Don't inline manual gradient backgrounds (`bg-gradient-to-br …`) on MediaSurface as a 'placeholder vibe' — the empty-state is already styled via `--gds-media-placeholder-bg/-fg` tokens.\",\n ],\n composesWith: [\"Card\", \"CardBlock\", \"MediaBlock\", \"VideoPlayer\", \"RivePlayer\", \"ThreeScene\"],\n aliases: [\n \"media\",\n \"image slot\",\n \"media slot\",\n \"image placeholder\",\n \"cover\",\n \"thumbnail\",\n \"poster slot\",\n ],\n import: \"@gradeui/ui\",\n\n props: {\n // ── Knobs — design choices ──────────────────────────────────────\n hint: {\n schema: HintSchema.optional(),\n design: \"knob\",\n control: \"glyph-picker\",\n label: \"Slot kind\",\n description:\n \"Picks the placeholder glyph + the default aspect + the future generation provider. Defaults to 'generic'.\",\n default: \"generic\",\n examples: [\"album\", \"portrait\", \"landscape\", \"poster\"],\n },\n aspect: {\n schema: AspectSchema.optional(),\n design: \"knob\",\n control: \"toggle-group\",\n label: \"Aspect ratio\",\n description:\n \"Override the slot's natural framing. When omitted, derived from `hint`: album/product/food → square, portrait/poster → portrait, landscape → wide, video/audio/embed/generic → video.\",\n },\n radius: {\n schema: RadiusSchema.optional(),\n design: \"knob\",\n control: \"toggle-group\",\n label: \"Corner radius\",\n default: \"lg\",\n description: \"Driven by the `--gds-media-radius` CSS variable.\",\n },\n border: {\n schema: z.boolean().optional(),\n design: \"knob\",\n label: \"Show border\",\n default: false,\n },\n loading: {\n schema: z.boolean().optional(),\n design: \"knob\",\n label: \"Loading state\",\n default: false,\n description: \"Overlays the muted-pulse skeleton on top of the slot.\",\n },\n emptyState: {\n schema: EmptyStateSchema.optional(),\n design: \"knob\",\n control: \"select\",\n label: \"Empty state\",\n default: \"auto\",\n description:\n \"'auto' renders the size-tiered placeholder (initials → glyph → glyph + caption). 'icon' is a legacy alias. 'none' renders a truly empty surface.\",\n },\n\n // ── Content — text / URL the user authors ──────────────────────\n alt: {\n schema: z.string().optional(),\n design: \"content\",\n control: \"text\",\n label: \"Alt text\",\n description:\n \"Becomes the eventual `<img alt>`. Also drives the placeholder caption (>160px slots) and the 2-letter initials fallback (<64px slots).\",\n examples: [\n \"Travelling Without Moving — Jamiroquai\",\n \"Sunset over Mount Fuji\",\n ],\n },\n src: {\n schema: z.string().url().optional(),\n design: \"content\",\n control: \"url\",\n label: \"Image URL\",\n description:\n \"When set, renders an `<img>` filling the slot via object-cover. The wrapper keeps its aspect/radius/border. Generators patch this prop; manual values always win.\",\n },\n\n // ── Structured — discriminated union with sub-form per kind ────\n source: {\n schema: MediaSourceSchema.optional(),\n design: \"structured\",\n label: \"Source descriptor\",\n description:\n \"Structured metadata for the generation pipeline. Opaque to MediaSurface itself; read by the resolver to look up real imagery from the right provider (MusicBrainz / Pollinations / etc.).\",\n perKindFields: {\n album: { artist: \"string\", title: \"string\", year: \"number?\" },\n poster: { title: \"string\", year: \"number?\" },\n portrait: { name: \"string?\", role: \"string?\" },\n landscape: { location: \"string?\", mood: \"string?\" },\n product: { name: \"string?\", brand: \"string?\" },\n food: { dish: \"string?\", cuisine: \"string?\" },\n generic: { prompt: \"string\" },\n video: {},\n audio: {},\n embed: {},\n \"3d\": {},\n },\n },\n\n // ── Plumbing — needed in code, hidden from the design panel ────\n className: {\n schema: z.string().optional(),\n design: \"plumbing\",\n },\n style: {\n schema: z.record(z.string(), z.unknown()).optional(),\n design: \"plumbing\",\n },\n children: {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description:\n \"Escape hatch for putting a custom <video>, <canvas>, Rive runtime, etc. inside. When supplied, the placeholder is suppressed.\",\n },\n overlay: {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description:\n \"Decorative layer rendered ABOVE the media/placeholder (play buttons, hover gradients, corner badges). Does NOT suppress the placeholder.\",\n },\n glyph: {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description:\n \"Per-instance override of the hint-derived placeholder glyph. Most consumers should pick a `hint` and let the map decide.\",\n },\n fallback: {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"Custom node shown while `loading` is true.\",\n },\n\n // ── Events ─────────────────────────────────────────────────────\n onVisibilityChange: {\n schema: z.function().optional(),\n design: \"event\",\n description: \"Fires when the surface enters / leaves the viewport (IntersectionObserver).\",\n },\n },\n\n // ─── Actions ─────────────────────────────────────────────────────\n actions: {\n fill: {\n label: \"Fill image\",\n icon: \"Sparkles\",\n description:\n \"Resolve this slot's source via the free providers (MusicBrainz → Pollinations → Picsum) and patch the result into the runtime URL map.\",\n kind: \"resolve-media-source\",\n // Only meaningful when we have something to resolve from. Without\n // a `source`, the providers have no descriptor to look up — the\n // chat is the right path for that case (regenerate the JSX with\n // a `source` first).\n enabledWhen: { propPresent: \"source\" },\n },\n refresh: {\n label: \"Refresh\",\n icon: \"RotateCw\",\n description:\n \"Re-fetch this slot's resolved URL (cache-busts the browser AND the local URL map). Useful when a Pollinations URL failed to load on first hit — Pollinations has typically finished its cold-start by now, so a retry usually succeeds.\",\n kind: \"refresh-media-source\",\n enabledWhen: { propPresent: \"source\" },\n },\n },\n});\n\n/** Source descriptor type, derived from the schema so it stays in sync. */\nexport type MediaSource = z.infer<typeof MediaSourceSchema>;\n\n/** Inferred React props type — one entry per prop in the contract.\n * All optional at the JSX boundary because every prop has a defaulted\n * or genuinely optional shape in the schema. */\nexport type MediaSurfacePropsContract = InferProps<typeof MediaSurfaceContract>;\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const MultiSelectContract = contract({\n name: \"MultiSelect\",\n description: \"Picking multiple items from a finite list — tag selectors, filter chips,\\n\\\"share with N people\\\", multi-region settings.\\n\\n**This is the answer for ANY \\\"removable-chips-inside-an-input\\\" pattern.**\\nMultiSelect's trigger renders the current selection as Badges with X\\nicons (the \\\"chip-in-trigger\\\" / \\\"chip-in-input\\\" shape), opens a Popover\\nwith a searchable Command list, and supports \\\"+N more\\\" collapse past\\n`maxCount`. Reach for it for:\\n - Linear-style filter bars (assignee, label, project chips inside one trigger)\\n - Slack channel pickers (selected channels as removable chips)\\n - Notion relation properties (related-page chips)\\n - GitHub label / assignee pickers\\n - tag / category / mention pickers anywhere\\nDon't invent a `<ChipInput>` or `<TagInput>` for these — MultiSelect\\nalready covers the trigger-with-badges shape.\\n\\nUse `<Select>` instead for SINGLE selection. Use `<Command>` directly\\n(no MultiSelect wrapper) when the option set is unbounded or async\\n(users to @-mention, email recipients, search-as-you-type API results).\",\n import: \"@gradeui/ui\",\n composesWith: [\"Popover\",\"Command\",\"Badge\",\"Checkbox-style row indicator\",\"Separator\"],\n props: {\n \"options\": {\n schema: z.unknown(),\n design: \"plumbing\",\n },\n \"value\": {\n schema: z.string().optional(),\n design: \"content\",\n description: \"controlled selection\",\n },\n \"defaultValue\": {\n schema: z.string().optional(),\n design: \"content\",\n description: \"uncontrolled initial selection\",\n },\n \"onValueChange\": {\n schema: z.unknown().optional(),\n design: \"event\",\n },\n \"placeholder\": {\n schema: z.string().optional(),\n design: \"content\",\n default: \"Select…\",\n },\n \"searchPlaceholder\": {\n schema: z.string().optional(),\n design: \"content\",\n default: \"Search…\",\n },\n \"emptyMessage\": {\n schema: z.string().optional(),\n design: \"content\",\n default: \"Nothing matches.\",\n },\n \"maxCount\": {\n schema: z.number().optional(),\n design: \"knob\",\n description: \"badges shown on the trigger before collapsing to \\\"+N more\\\"\",\n },\n \"searchable\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"hide for short option lists\",\n default: true,\n },\n \"badgeDismissible\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"show × on each selected badge\",\n default: true,\n },\n \"disabled\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n },\n \"modalPopover\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"Popover modal mode\",\n default: false,\n },\n \"className\": {\n schema: z.string().optional(),\n design: \"plumbing\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const PopoverContract = contract({\n name: \"Popover\",\n description: \"A floating panel anchored to a trigger that contains interactive content — date pickers, color pickers, filter pickers, \\\"more info\\\" panels, inline forms. Differs from Tooltip (hover-only, no focusable content) and Dialog (modal, blocks the page). DatePicker, DateRangePicker, and the Combobox pattern all compose Popover internally.\",\n import: \"@gradeui/ui\",\n aliases: [\"popover\",\"dropdown panel\",\"floating panel\",\"inline editor\",\"attached panel\",\"filter pop\",\"popover view\",\"popoverpresentation\",\"attached popover\"],\n subcomponents: [\"PopoverTrigger\",\"PopoverContent\",\"PopoverAnchor\"],\n composesWith: [\"Button (as trigger)\",\"Calendar (date picker)\",\"Command (combobox)\",\"Form controls (inline edit popover)\"],\n props: {\n \"open\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n },\n \"asChild\": {\n schema: z.boolean().optional(),\n design: \"plumbing\",\n description: \"usually a Button\",\n },\n \"side\": {\n schema: z.enum([\"top\", \"right\", \"bottom\", \"left\", \"start\", \"center\", \"end\"]).optional(),\n design: \"knob\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const ProgressContract = contract({\n name: \"Progress\",\n description: \"Determinate progress — file uploads, multi-step forms, quota meters. Indeterminate state → use Skeleton or animated Loader icon.\",\n import: \"@gradeui/ui\",\n aliases: [\"progress\",\"progress view\",\"progress indicator\",\"progress bar\",\"determinate progress\",\"loading bar\",\"completion bar\"],\n composesWith: [\"Card (as a section)\",\"Badge (showing % next to it)\",\"Label (describing what's loading)\"],\n props: {\n \"value\": {\n schema: z.number().optional(),\n design: \"knob\",\n description: \"percent complete\",\n },\n \"max\": {\n schema: z.number().optional(),\n design: \"knob\",\n },\n \"className\": {\n schema: z.string().optional(),\n design: \"plumbing\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const RadioGroupContract = contract({\n name: \"RadioGroup\",\n description: \"A small set of mutually-exclusive options where the user needs to SEE all of them at once — pricing tiers (3-4 options), shipping speed, payment method radio cards. For 5+ options use Select. For a segmented control as part of a toolbar use ToggleGroup. For yes/no use Switch.\",\n import: \"@gradeui/ui\",\n aliases: [\"radio group\",\"radio buttons\",\"single-choice\",\"pricing options\",\"payment method\",\"radio buttons\",\"radio control\",\"single-select\"],\n subcomponents: [\"RadioGroupItem\"],\n composesWith: [\"Label (paired with each item via htmlFor)\",\"Stack (vertical list)\",\"Card (radio card pattern)\"],\n props: {\n \"value\": {\n schema: z.string().optional(),\n design: \"content\",\n description: \"controlled selection\",\n },\n \"defaultValue\": {\n schema: z.string().optional(),\n design: \"content\",\n description: \"uncontrolled initial\",\n },\n \"onValueChange\": {\n schema: z.unknown().optional(),\n design: \"event\",\n },\n \"disabled\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n },\n \"orientation\": {\n schema: z.enum([\"horizontal\", \"vertical\"]).optional(),\n design: \"knob\",\n default: \"vertical\",\n },\n \"name\": {\n schema: z.string().optional(),\n design: \"content\",\n description: \"form name when posting natively\",\n },\n \"id\": {\n schema: z.string().optional(),\n design: \"plumbing\",\n description: \"pair with a <Label htmlFor> for click-on-label\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const ResizableContract = contract({\n name: \"Resizable\",\n description: \"A multi-pane layout where the user wants to drag the divider — Slack/Mail-style list+detail, IDE editor+terminal, side-by-side compare view. Static layouts shouldn't use this — reach for AppShell with nav=\\\"three-pane\\\" (fixed widths) or Grid (responsive ladder). Built on react-resizable-panels under the hood.\",\n import: \"@gradeui/ui\",\n aliases: [\"resizable\",\"splitter\",\"split pane\",\"drag divider\",\"adjustable panels\",\"resizer\",\"split view\",\"draggable divider\",\"split pane resizer\",\"ns split view\"],\n subcomponents: [\"ResizablePanelGroup\",\"ResizablePanel\",\"ResizableHandle\"],\n composesWith: [\"AppShellMain (host the splitter inside main)\",\"ScrollArea (each panel's content)\",\"Card\"],\n props: {\n \"direction\": {\n schema: z.enum([\"horizontal\", \"vertical\"]),\n design: \"knob\",\n description: \"required; sets the axis the user drags along\",\n },\n \"autoSaveId\": {\n schema: z.string().optional(),\n design: \"content\",\n description: \"persists user-adjusted sizes to localStorage under this id\",\n },\n \"onLayout\": {\n schema: z.unknown().optional(),\n design: \"event\",\n },\n \"defaultSize\": {\n schema: z.number().optional(),\n design: \"knob\",\n description: \"percent of group (0-100); siblings should sum to ~100\",\n },\n \"minSize\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"percent bounds\",\n },\n \"collapsible\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"allow this panel to collapse to zero\",\n },\n \"collapsedSize\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"collapse behaviour controls\",\n },\n \"withHandle\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"show a visible drag affordance (default just a hit-zone)\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const RivePlayerContract = contract({\n name: \"RivePlayer\",\n description: \"Rive runtime wrapped in the shared media surface. Reach for Rive when you need interactive state-machine animations driven by scroll/hover/input. For non-interactive looping video, use VideoPlayer; for shader-driven backgrounds, use ThreeScene.\",\n import: \"@gradeui/ui\",\n aliases: [\"rive\",\"riv\",\"animation\",\"animated\",\"lottie\"],\n composesWith: [\"MediaSurface (internal)\",\"Card\",\"any container\"],\n props: {\n \"src\": {\n schema: z.string(),\n design: \"content\",\n description: \"URL or path to the .riv file\",\n },\n \"stateMachines\": {\n schema: z.string().optional(),\n design: \"content\",\n description: \"state machine(s) to run\",\n },\n \"artboard\": {\n schema: z.string().optional(),\n design: \"content\",\n description: \"artboard name; omit to use default\",\n },\n \"controls\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"viewer mode by default; set true for play/pause overlay\",\n default: false,\n },\n \"autoPlay\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"respects reduced-motion\",\n default: true,\n },\n \"loop\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n default: true,\n },\n \"pauseOffscreen\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n default: true,\n },\n \"fit\": {\n schema: z.enum([\"contain\", \"cover\", \"fill\", \"fitWidth\", \"fitHeight\", \"none\"]).optional(),\n design: \"knob\",\n default: \"contain\",\n },\n \"stateMachineInputs\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n },\n \"aspect\": {\n schema: z.enum([\"video\", \"square\", \"portrait\", \"wide\", \"auto\"]).optional(),\n design: \"knob\",\n default: \"square\",\n },\n \"radius\": {\n schema: z.enum([\"none\", \"sm\", \"md\", \"lg\", \"xl\"]).optional(),\n design: \"knob\",\n default: \"lg\",\n },\n \"poster\": {\n schema: z.string().optional(),\n design: \"content\",\n description: \"image shown while the runtime loads\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const RowContract = contract({\n name: \"Row\",\n description: \"Horizontal composition — button groups, inline form rows, logo + nav rows, anything on one line. Reach for Row instead of `flex items-center gap-*` so the alignment and spacing are editable through the settings panel. For two-pane layouts with an explicit ratio (sidebar + content, 1/3 + 2/3) use Split instead — Row evenly flows whatever children it holds.\",\n import: \"@gradeui/ui\",\n aliases: [\"row\",\"hstack\",\"horizontal\",\"inline\",\"horizontal layout\",\"hstack\",\"h-stack\",\"horizontal stack\",\"lazyhstack\"],\n composesWith: [\"Button\",\"Input\",\"NavItem\",\"Stack (can wrap a Row)\",\"any content component\"],\n props: {\n \"gap\": {\n schema: z.enum([\"none\", \"xs\", \"sm\", \"md\", \"lg\", \"xl\", \"2xl\"]).optional(),\n design: \"knob\",\n description: \"gap between children\",\n default: \"md\",\n },\n \"align\": {\n schema: z.enum([\"start\", \"center\", \"end\", \"stretch\", \"baseline\"]).optional(),\n design: \"knob\",\n description: \"cross-axis (vertical) alignment\",\n default: \"center\",\n },\n \"justify\": {\n schema: z.enum([\"start\", \"center\", \"end\", \"between\", \"around\", \"evenly\"]).optional(),\n design: \"knob\",\n description: \"main-axis distribution\",\n default: \"start\",\n },\n \"wrap\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"allow children to wrap onto additional lines when they overflow\",\n default: false,\n },\n \"asChild\": {\n schema: z.boolean().optional(),\n design: \"plumbing\",\n description: \"render as the child element via Slot\",\n default: false,\n },\n \"className\": {\n schema: z.string().optional(),\n design: \"plumbing\",\n },\n \"children\": {\n schema: z.unknown(),\n design: \"plumbing\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const ScrollAreaContract = contract({\n name: \"ScrollArea\",\n description: \"Bounded content that needs custom scroll chrome — sidebars with long item lists, chat transcripts, table panels inside a dashboard, anywhere the OS scrollbar would feel out of place against the design tokens. The wrapping element has to have a height constraint (`h-`, `max-h-`, or grid row sizing) or nothing scrolls — scroll-area can't infer a bound on its own. For body-level scrolling, leave the document to the browser.\",\n import: \"@gradeui/ui\",\n aliases: [\"scroll area\",\"scroll container\",\"custom scrollbar\",\"sidebar scroll\",\"panel scroll\",\"scroll view\",\"scrollview\",\"react native scrollview\"],\n subcomponents: [\"ScrollBar\"],\n composesWith: [\"Card (long card body)\",\"AppShellNav (long sidebar)\",\"Sheet (long modal body)\",\"Table (sticky-header scrolling list)\"],\n props: {\n \"type\": {\n schema: z.enum([\"auto\", \"always\", \"scroll\", \"hover\"]).optional(),\n design: \"knob\",\n description: \"when the scrollbar shows\",\n },\n \"scrollHideDelay\": {\n schema: z.number().optional(),\n design: \"knob\",\n description: \"ms before \\\"scroll\\\"/\\\"hover\\\" scrollbars fade\",\n },\n \"dir\": {\n schema: z.enum([\"ltr\", \"rtl\"]).optional(),\n design: \"plumbing\",\n },\n \"className\": {\n schema: z.string().optional(),\n design: \"plumbing\",\n description: \"set a height/max-height here, otherwise nothing scrolls\",\n },\n \"orientation\": {\n schema: z.enum([\"vertical\", \"horizontal\"]).optional(),\n design: \"knob\",\n default: \"vertical\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const SelectContract = contract({\n name: \"Select\",\n description: \"Single-choice from 3+ known options. Fewer than 3 → RadioGroup. Huge list with search → use a Combobox (not in DS yet). Multi-select → not supported by this primitive.\",\n import: \"@gradeui/ui\",\n aliases: [\"dropdown\",\"combobox\",\"picker\",\"select\",\"pop-up button\",\"popup button\",\"popup picker\",\"picker view\",\"rnpickerselect\",\"react native picker\",\"native picker\"],\n subcomponents: [\"SelectTrigger\",\"SelectValue\",\"SelectContent\",\"SelectItem\",\"SelectGroup\",\"SelectLabel\",\"SelectSeparator\"],\n composesWith: [\"Label (above SelectTrigger)\",\"Form\",\"Card\"],\n props: {\n \"value\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"Radix root\",\n },\n \"wraps\": {\n schema: z.unknown(),\n design: \"plumbing\",\n },\n \"placeholder\": {\n schema: z.string().optional(),\n design: \"content\",\n description: \"text when nothing is selected\",\n },\n \"accepts\": {\n schema: z.unknown(),\n design: \"plumbing\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const SeparatorContract = contract({\n name: \"Separator\",\n description: \"Light divider between sibling blocks in a Card, list, or header. For section-level partition use extra spacing instead.\",\n import: \"@gradeui/ui\",\n aliases: [\"divider\",\"rule\",\"hr\",\"line\",\"horizontal rule\"],\n composesWith: [\"Card (between CardHeader/Content/Footer)\",\"navigation menus\",\"any vertical stacks\"],\n props: {\n \"orientation\": {\n schema: z.enum([\"horizontal\", \"vertical\"]).optional(),\n design: \"knob\",\n description: \"default \\\"horizontal\\\"\",\n },\n \"decorative\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"hide from a11y tree\",\n default: true,\n },\n \"className\": {\n schema: z.string().optional(),\n design: \"plumbing\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const ShaderPresetPickerContract = contract({\n name: \"ShaderPresetPicker\",\n description: \"Runtime gallery of shader presets — click to select. Use with ThreeScene as a controlled input so the user can pick a background shader. For a single preview card, use ShaderPresetPreview directly.\",\n import: \"@gradeui/ui\",\n aliases: [\"shader picker\",\"preset picker\",\"shader gallery\",\"preset gallery\"],\n composesWith: [\"ShaderPresetPreview (internal)\",\"ThreeScene (the typical downstream consumer)\"],\n props: {\n \"value\": {\n schema: z.string().optional(),\n design: \"content\",\n description: \"currently selected preset id (controlled)\",\n },\n \"onChange\": {\n schema: z.unknown().optional(),\n design: \"event\",\n description: \"called when the user clicks a preset card\",\n },\n \"filterTags\": {\n schema: z.string().optional(),\n design: \"content\",\n description: \"only show presets matching at least one tag (\\\"space\\\" | \\\"retro\\\" | \\\"motion\\\" | \\\"hero\\\" | \\\"background\\\" …)\",\n },\n \"live\": {\n schema: z.enum([\"never\", \"hover\", \"always\"]).optional(),\n design: \"knob\",\n description: \"thumbnail render mode\",\n default: \"hover\",\n },\n \"postPreset\": {\n schema: z.string().optional(),\n design: \"content\",\n description: \"shared post-FX preset applied to every thumbnail\",\n },\n \"palette\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"shared palette applied to every thumbnail\",\n },\n \"columns\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"grid columns at md+ breakpoint\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const ShaderPresetPreviewContract = contract({\n name: \"ShaderPresetPreview\",\n description: \"Thumbnail-sized preview card for a shader preset. Defaults to a cheap static placeholder until hovered, at which point the live WebGL render kicks in. Use directly when you want a single preset card; use ShaderPresetPicker for a filterable grid.\",\n import: \"@gradeui/ui\",\n aliases: [\"shader preview\",\"preset preview\",\"shader card\"],\n composesWith: [\"ThreeScene (internal)\",\"ShaderPresetPicker (wraps this)\"],\n props: {\n \"preset\": {\n schema: z.string(),\n design: \"content\",\n description: \"shader preset id from the registry\",\n },\n \"live\": {\n schema: z.enum([\"never\", \"hover\", \"always\"]).optional(),\n design: \"knob\",\n description: \"when to run the live WebGL render\",\n default: \"hover\",\n },\n \"postPreset\": {\n schema: z.string().optional(),\n design: \"content\",\n description: \"override the preset's default post-FX\",\n },\n \"palette\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"palette overrides for the preview\",\n },\n \"aspect\": {\n schema: z.enum([\"video\", \"square\", \"portrait\", \"wide\"]).optional(),\n design: \"knob\",\n default: \"video\",\n },\n \"hideLabel\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"hide the label strip under the preview\",\n default: false,\n },\n \"onClick\": {\n schema: z.unknown().optional(),\n design: \"event\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const SheetContract = contract({\n name: \"Sheet\",\n description: \"A panel that slides in from a screen edge — mobile nav drawers, side panels for editing a single record without leaving the list, filter trays on small viewports. For a centered focus modal use Dialog. For a transient announcement use Toast (Sonner). For inline reveals use Collapsible.\",\n import: \"@gradeui/ui\",\n aliases: [\"sheet\",\"drawer\",\"side panel\",\"slide-in\",\"nav drawer\",\"mobile drawer\",\"slide-over\",\"action sheet\",\"modal sheet\",\"bottom sheet\",\"side sheet\",\"react native modal sheet\",\"bottom-sheet\",\"ios action sheet\"],\n subcomponents: [\"SheetTrigger\",\"SheetContent\",\"SheetHeader\",\"SheetTitle\",\"SheetDescription\",\"SheetFooter\",\"SheetClose\"],\n composesWith: [\"Form controls (an inline edit sheet)\",\"Button (trigger + close)\",\"AppShellNav (mobile-only swap)\"],\n props: {\n \"open\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n },\n \"asChild\": {\n schema: z.boolean().optional(),\n design: \"plumbing\",\n },\n \"side\": {\n schema: z.enum([\"top\", \"right\", \"bottom\", \"left\"]).optional(),\n design: \"knob\",\n default: \"right\",\n },\n \"className\": {\n schema: z.string().optional(),\n design: \"plumbing\",\n description: \"usually set a width (right/left) or height (top/bottom)\",\n },\n \"SheetTitle\": {\n schema: z.unknown(),\n design: \"plumbing\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const SidebarContract = contract({\n name: \"Sidebar\",\n description: \"Vertical app navigation. Drop inside `<AppShellNav placement=\\\"side\\\">` for full-page layouts. Compound API — `<SidebarHeader>` for brand, `<SidebarContent>` for the scrollable body of `<SidebarSection>` + `<SidebarItem>` rows, `<SidebarFooter>` for user / settings chrome. For top nav reach for TopMenu; for command-palette style search reach for Command.\",\n import: \"@gradeui/ui\",\n aliases: [\"sidebar\",\"side menu\",\"sidemenu\",\"navigation sidebar\",\"app sidebar\",\"side nav\",\"side nav rail\",\"master pane\",\"sidebarmenu\",\"navigation rail\",\"react native drawer\"],\n subcomponents: [\"SidebarHeader\",\"SidebarContent\",\"SidebarFooter\",\"SidebarSection\",\"SidebarItem\"],\n composesWith: [\"AppShell (inside AppShellNav)\",\"Avatar (in Footer)\",\"Tooltip (auto-wrapped on collapsed items)\",\"Button (asChild for custom routing)\"],\n props: {\n \"collapsed\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"controlled collapsed state (wire onCollapsedChange when set)\",\n },\n \"defaultCollapsed\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"uncontrolled initial value (default false)\",\n },\n \"onCollapsedChange\": {\n schema: z.unknown().optional(),\n design: \"event\",\n },\n \"collapsible\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"show the affordance for the user to collapse (default true)\",\n },\n \"variant\": {\n schema: z.enum([\"rail\", \"panel\"]).optional(),\n design: \"knob\",\n description: \"outer chrome — `rail` (default) sits flush against an adjacent surface with a single right-border + tracked width; `panel` is a card-style floating sidebar with full border + rounded corners and width inherited from the parent flex/grid track.\",\n },\n \"any\": {\n schema: z.unknown(),\n design: \"plumbing\",\n description: \"brand / logo / org switcher; hides nothing when collapsed (centred)\",\n },\n \"title\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"group label; **uppercase tracking-wide muted** styling auto-applied (Notion / Linear / Slack-style \\\"GAMES\\\", \\\"FAVORITES\\\", \\\"WORKSPACE\\\" headers); hidden when sidebar is collapsed\",\n },\n \"icon\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"optional icon beside the title\",\n },\n \"trailing\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"Right-edge action slot. On **SidebarSection**: the canonical \\\"+\\\" / \\\"...\\\" header affordance (Notion's \\\"+ Add page\\\", Linear's \\\"+\\\" next to Favorites). On **SidebarTreeItem**: a sibling-of-button slot for settings cog / more-actions / '+ add child'; vertically centered against the row; click events stopPropagation'd so taps don't toggle expand. Branch row exposes `group/row` named-group, so consumer can use `hidden group-hover/row:flex` for hover-only visibility scoped to the branch alone.\",\n },\n \"defaultExpanded\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"initial open state (default true)\",\n },\n \"badge\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"trailing count / label (hidden when collapsed)\",\n },\n \"active\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"current route; adds aria-current=\\\"page\\\"\",\n },\n \"href\": {\n schema: z.string().optional(),\n design: \"content\",\n description: \"renders as <a>; for routing use `asChild` with your link component\",\n },\n \"asChild\": {\n schema: z.boolean().optional(),\n design: \"plumbing\",\n description: \"wrap a custom link (<Link href> from Next.js etc.) via Radix Slot\",\n },\n \"asButton\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"render as <button> for action rows (open dialog, log out)\",\n },\n \"disabled\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n },\n \"collapsedLabel\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"tooltip override when sidebar is collapsed (defaults to children text)\",\n },\n \"size\": {\n schema: z.enum([\"sm\", \"md\"]).optional(),\n design: \"knob\",\n description: \"row size — `md` (default) is the standard `text-sm font-medium` nav row; `sm` is `text-xs` + lighter weight + tighter padding for visually subordinate rows (nested screens, sub-pages). Active state still wins on color + weight.\",\n },\n \"description\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"secondary line under the label — `Edited 2m ago`, `12 items`, etc. Layout stacks label + description; icon vertically centered against stack; badge stays trailing. Hidden when sidebar collapsed.\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const SkeletonContract = contract({\n name: \"Skeleton\",\n description: \"Loading placeholder for content whose shape you know. Set width/height via className to mimic the real content (e.g. \\\"h-4 w-32\\\"). Not a spinner — use it where the real thing will drop in.\",\n import: \"@gradeui/ui\",\n aliases: [\"placeholder\",\"shimmer\",\"loader\",\"loading state\",\"redacted\",\"redacted placeholder\",\"shimmer placeholder\",\"content placeholder\",\"lottie placeholder\"],\n composesWith: [\"Card\",\"Avatar (inside a Skeleton for avatar loading)\",\"any layout\"],\n props: {\n \"className\": {\n schema: z.string().optional(),\n design: \"plumbing\",\n description: \"required in practice; supply width/height utilities\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const SliderContract = contract({\n name: \"Slider\",\n description: \"A continuous-ish numeric pick — volume, opacity, font size, price-range filters. Use a single-thumb slider for one value, two-thumb for a range. For a small set of discrete options (1-5 stars, sm/md/lg) prefer ToggleGroup. For free-text numeric entry use an Input type=\\\"number\\\".\",\n import: \"@gradeui/ui\",\n aliases: [\"slider\",\"range slider\",\"range input\",\"volume\",\"opacity slider\",\"scrub\",\"drag value\",\"slider control\",\"value slider\",\"react native slider\"],\n composesWith: [\"Label (mandatory above)\",\"Row (label + current value display)\",\"Card (settings rows)\"],\n props: {\n \"value\": {\n schema: z.number().optional(),\n design: \"knob\",\n description: \"controlled value; ALWAYS an array even for a single-thumb slider (`[50]`)\",\n },\n \"defaultValue\": {\n schema: z.number().optional(),\n design: \"knob\",\n description: \"uncontrolled initial; `[20, 80]` for a two-thumb range\",\n },\n \"onValueChange\": {\n schema: z.unknown().optional(),\n design: \"event\",\n },\n \"min\": {\n schema: z.number().optional(),\n design: \"knob\",\n },\n \"max\": {\n schema: z.number().optional(),\n design: \"knob\",\n },\n \"step\": {\n schema: z.number().optional(),\n design: \"knob\",\n },\n \"disabled\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n },\n \"orientation\": {\n schema: z.enum([\"horizontal\", \"vertical\"]).optional(),\n design: \"knob\",\n default: \"horizontal\",\n },\n \"dir\": {\n schema: z.enum([\"ltr\", \"rtl\"]).optional(),\n design: \"plumbing\",\n },\n \"inverted\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"flip the visual direction\",\n },\n \"name\": {\n schema: z.string().optional(),\n design: \"content\",\n description: \"form name when posting natively\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const SortableContract = contract({\n name: \"Sortable\",\n description: \"Drag-to-reorder lists, kanban-column reordering, sortable shelves, tab strips the user can rearrange. Pairs with any layout primitive — Stack for vertical lists, Row for horizontal strips, Grid for 2D card walls. For cross-container drag (drag a card from one column to another) hand-roll DndContext at the page level — Sortable v1 covers single-list reorder; Sortable.Group for cross-container is a planned follow-up. Reach for raw `@dnd-kit/core` if you need custom collision detection, drag overlays with arbitrary chrome, or non-list use cases (kanban swimlanes, draggable canvas nodes).\",\n import: \"@gradeui/ui\",\n aliases: [\"sortable\",\"reorder\",\"drag and drop\",\"dnd\",\"draggable list\",\"sortable list\",\"kanban\",\"drag to reorder\",\"drag-drop\",\"dragdroplist\",\"drag handle\",\"react native draggable flatlist\"],\n subcomponents: [\"Sortable.Item\",\"Sortable.Handle\"],\n composesWith: [\"Stack (vertical lists)\",\"Row (horizontal strips)\",\"Grid (2D card walls)\",\"Card (typical item content)\",\"Button (as Sortable.Handle asChild)\"],\n props: {\n \"values\": {\n schema: z.unknown(),\n design: \"plumbing\",\n description: \"ordered list of unique ids; the source of truth for the order\",\n },\n \"onReorder\": {\n schema: z.unknown().optional(),\n design: \"event\",\n description: \"fires with the new order after a drag that changed it\",\n },\n \"strategy\": {\n schema: z.enum([\"vertical\", \"horizontal\", \"grid\"]).optional(),\n design: \"knob\",\n description: \"match the layout your items render in\",\n default: \"vertical\",\n },\n \"disabled\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"disable drag on every item\",\n },\n \"Sortable\": {\n schema: z.unknown(),\n design: \"plumbing\",\n description: \"must match one entry in the parent `values` array (identity, not React key)\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const StackContract = contract({\n name: \"Stack\",\n description: \"Default top-level layout inside the main slot when composing two or more stacked regions (hero + content + footer, auth card + subtext, etc.). Prefer Stack over hand-rolled `flex flex-col gap-*` so the vertical rhythm is editable through the settings panel.\",\n import: \"@gradeui/ui\",\n aliases: [\"stack\",\"vstack\",\"vertical\",\"column\",\"vertical layout\",\"v-stack\",\"vertical stack\",\"lazyvstack\"],\n composesWith: [\"Section\",\"Row\",\"Split\",\"Hero\",\"any content component\"],\n props: {\n \"gap\": {\n schema: z.enum([\"none\", \"xs\", \"sm\", \"md\", \"lg\", \"xl\", \"2xl\"]).optional(),\n design: \"knob\",\n description: \"vertical gap between children\",\n default: \"md\",\n },\n \"align\": {\n schema: z.enum([\"start\", \"center\", \"end\", \"stretch\"]).optional(),\n design: \"knob\",\n description: \"cross-axis (horizontal) alignment of children\",\n default: \"stretch\",\n },\n \"justify\": {\n schema: z.enum([\"start\", \"center\", \"end\", \"between\", \"around\", \"evenly\"]).optional(),\n design: \"knob\",\n description: \"main-axis (vertical) distribution. Reach for this on absolute-positioned overlays (`justify=\\\"end\\\"` pins children to the bottom) and split footers (`justify=\\\"between\\\"`).\",\n default: \"start\",\n },\n \"asChild\": {\n schema: z.boolean().optional(),\n design: \"plumbing\",\n description: \"render as the child element via Slot, so `<Stack asChild><section>…</section></Stack>` stamps Stack's classes onto the `<section>` rather than nesting a wrapper div\",\n default: false,\n },\n \"className\": {\n schema: z.string().optional(),\n design: \"plumbing\",\n },\n \"children\": {\n schema: z.unknown(),\n design: \"plumbing\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const SwitchContract = contract({\n name: \"Switch\",\n description: \"Instant on/off setting (\\\"Enable notifications\\\", \\\"Dark mode\\\"). Commits on toggle — no submit button needed. For selecting-from-a-list use Checkbox.\",\n import: \"@gradeui/ui\",\n aliases: [\"toggle\",\"switch\",\"on/off switch\",\"ios toggle\",\"toggle switch\",\"switch control\",\"react native switch\"],\n composesWith: [\"Label (via htmlFor)\",\"Card (settings rows)\"],\n props: {\n \"checked\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n },\n \"onCheckedChange\": {\n schema: z.unknown().optional(),\n design: \"event\",\n },\n \"defaultChecked\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n },\n \"disabled\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n },\n \"id\": {\n schema: z.string().optional(),\n design: \"plumbing\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const TableContract = contract({\n name: \"Table\",\n description: \"Structured tabular data — rows × columns with alignment requirements. NOT a layout grid — for that use div+Tailwind grid utilities. Keep to <100 rows; larger datasets need virtualisation (not in DS).\",\n import: \"@gradeui/ui\",\n aliases: [\"table\",\"table view\",\"data table\",\"datatable\",\"grid view\",\"data grid\",\"rows and columns\"],\n subcomponents: [\"TableHeader\",\"TableBody\",\"TableFooter\",\"TableRow\",\"TableHead\",\"TableCell\",\"TableCaption\"],\n composesWith: [\"Card (wrap the table)\",\"Badge (inside TableCell for status)\",\"Checkbox (row selection)\",\"Button (row actions)\"],\n props: {\n \"Each\": {\n schema: z.unknown(),\n design: \"plumbing\",\n },\n \"No\": {\n schema: z.unknown(),\n design: \"plumbing\",\n description: \"styling follows the active theme tokens\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const TabsContract = contract({\n name: \"Tabs\",\n description: \"A small set of peer views within one surface (2–5 tabs). For primary nav use Side Menu/routing. For filters use a filter control, not tabs. Pick `variant=\\\"pill\\\"` for app chrome (settings panels, in-card tab strips). Pick `variant=\\\"underlined\\\"` for marketing/docs pages and browser-tab-style treatments.\",\n import: \"@gradeui/ui\",\n aliases: [\"tabs\",\"tab strip\",\"tab bar\",\"tab view\",\"tabbed interface\",\"pageviewcontroller\",\"react native tab view\",\"underlined tabs\",\"page tabs\",\"segment switcher\",\"simple tabs\"],\n subcomponents: [\"TabsList\",\"TabsTrigger\",\"TabsContent\"],\n composesWith: [\"Card (tabs inside a card body)\",\"Dialog\",\"TooltipProvider (required for tooltip prop)\"],\n props: {\n \"defaultValue\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n },\n \"size\": {\n schema: z.enum([\"sm\", \"md\", \"lg, default md\"]).optional(),\n design: \"knob\",\n description: \"t-shirt scale aligned with Button/ToggleGroup heights; cascades to every TabsTrigger via context so set it once on the list\",\n },\n \"variant\": {\n schema: z.enum([\"pill\", \"underlined, default pill\"]).optional(),\n design: \"knob\",\n description: \"`pill` is the shadcn chip-on-muted look; `underlined` is the minimal text + bottom-border treatment (formerly the separate SimpleTabs component, collapsed into Tabs in May 2026). Cascades to triggers.\",\n },\n \"value\": {\n schema: z.string(),\n design: \"content\",\n description: \"matches a TabsContent value; tooltip?: string — when set, wraps the trigger in the design-system Tooltip and auto-applies aria-label (useful for icon-only triggers); requires a TooltipProvider somewhere above the tabs\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const TextareaContract = contract({\n name: \"Textarea\",\n description: \"Multi-line text entry (descriptions, messages, comments). Pair with a Label. Single-line input → use Input instead.\",\n import: \"@gradeui/ui\",\n aliases: [\"text area\",\"multiline\",\"comment box\",\"message field\",\"text editor\",\"multi-line text\",\"multiline input\",\"multiline text field\",\"comments box\",\"multiline textinput\"],\n composesWith: [\"Label\",\"Form\",\"Card (in CardContent)\"],\n props: {},\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const ThreeSceneContract = contract({\n name: \"ThreeScene\",\n description: \"WebGL primitive for shader backgrounds, generative visuals, and bespoke three.js scenes. Three authoring paths, in order of preference — (1) pick a `preset` id; (2) if nothing in the registry fits, write a `fragmentShader` against the fixed uniform contract; (3) only as a last resort, pass a full `createScene` factory. For looping video, use VideoPlayer; for interactive animations, use RivePlayer.\",\n import: \"@gradeui/ui\",\n aliases: [\"three\",\"threejs\",\"webgl\",\"shader\",\"scene\",\"3d\",\"generative\",\"hero background\",\"fragment shader\",\"glsl\"],\n composesWith: [\"MediaSurface (internal)\",\"foreground content stacked above with `position: absolute/relative z-10`\"],\n props: {\n \"preset\": {\n schema: z.enum([\"space\", \"plasma\", \"voronoi\", \"synthwave\"]).optional(),\n design: \"knob\",\n description: \"shader preset id from the registry\",\n },\n \"fragmentShader\": {\n schema: z.string().optional(),\n design: \"content\",\n description: \"user-authored GLSL body; takes precedence over preset\",\n },\n \"onShaderError\": {\n schema: z.unknown().optional(),\n design: \"event\",\n description: \"fires on compile failure; scene falls back to `preset=\\\"space\\\"`\",\n },\n \"postPreset\": {\n schema: z.enum([\"none\", \"vhs\", \"cinematic\", \"synthwave\", \"crt\"]).optional(),\n design: \"knob\",\n description: \"post-processing pass\",\n default: \"vhs\",\n },\n \"palette\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"any CSS-legal colour string per slot. Re-tints automatically when the theme changes. Unset slots fall back to defaults.\",\n },\n \"createScene\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"custom full scene factory; takes precedence over preset AND fragmentShader\",\n },\n \"controls\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"play/pause overlay\",\n default: false,\n },\n \"autoPlay\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"respects reduced-motion\",\n default: true,\n },\n \"pauseOffscreen\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"big win for WebGL battery life\",\n default: true,\n },\n \"aspect\": {\n schema: z.enum([\"video\", \"square\", \"portrait\", \"wide\", \"auto\"]).optional(),\n design: \"knob\",\n default: \"video\",\n },\n \"maxDpr\": {\n schema: z.number().optional(),\n design: \"knob\",\n description: \"lower for thumbnails / low-end devices\",\n },\n \"radius\": {\n schema: z.enum([\"none\", \"sm\", \"md\", \"lg\", \"xl\"]).optional(),\n design: \"knob\",\n default: \"lg\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const ToastContract = contract({\n name: \"Toast\",\n description: \"Transient, non-blocking feedback that confirms or warns about an action — \\\"Saved\\\", \\\"Failed to upload\\\", \\\"Copied to clipboard\\\", \\\"Invitation sent\\\". For permanent inline messages reach for Callout. For confirmations that block until acknowledged use Dialog. Mount <Toaster /> ONCE at the root of the app; everywhere else, call the `toast` helper.\",\n import: \"@gradeui/ui\",\n aliases: [\"toast\",\"toaster\",\"sonner\",\"notification\",\"snackbar\",\"alert toast\",\"transient alert\",\"transient banner\",\"banner notification\",\"toastandroid\"],\n composesWith: [\"App root layout (single <Toaster /> mount)\",\"Form submit handlers (success/error toasts)\",\"Async actions\"],\n props: {\n \"position\": {\n schema: z.enum([\"top-left\", \"top-center\", \"top-right\", \"bottom-left\", \"bottom-center\", \"bottom-right\"]).optional(),\n design: \"knob\",\n default: \"bottom-right\",\n },\n \"theme\": {\n schema: z.enum([\"light\", \"dark\", \"system\"]).optional(),\n design: \"knob\",\n },\n \"richColors\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"colored variants for success/error/warning/info\",\n },\n \"expand\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"keep multiple toasts visually separated rather than stacked\",\n },\n \"visibleToasts\": {\n schema: z.number().optional(),\n design: \"knob\",\n description: \"max concurrent toasts on screen (default 3)\",\n },\n \"duration\": {\n schema: z.number().optional(),\n design: \"knob\",\n description: \"default ms before auto-dismiss\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const ToggleContract = contract({\n name: \"Toggle\",\n description: \"A standalone on/off button — Bold/Italic in a toolbar, \\\"Show grid\\\" in a header, single binary toggle that doesn't belong inside a Switch row. For two-or-more mutually-exclusive options use ToggleGroup. For a labeled settings switch (\\\"Active: on/off\\\") use Switch.\",\n import: \"@gradeui/ui\",\n aliases: [\"toggle\",\"toggle button\",\"press button\",\"bold button\",\"italic button\"],\n composesWith: [\"Tooltip (wrap an icon-only Toggle)\",\"Row\",\"TabsList (sibling)\"],\n props: {\n \"variant\": {\n schema: z.enum([\"default\", \"outline\"]).optional(),\n design: \"knob\",\n description: \"outline adds a border, default is borderless and ghost-like\",\n },\n \"size\": {\n schema: z.enum([\"default\", \"sm\", \"lg\"]).optional(),\n design: \"knob\",\n },\n \"pressed\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"controlled pressed state\",\n },\n \"defaultPressed\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"uncontrolled initial state\",\n },\n \"onPressedChange\": {\n schema: z.unknown().optional(),\n design: \"event\",\n },\n \"disabled\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n },\n \"children\": {\n schema: z.unknown(),\n design: \"plumbing\",\n description: \"usually an icon or short label\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const ToggleGroupContract = contract({\n name: \"ToggleGroup\",\n description: \"A small set of mutually-exclusive (`type=\\\"single\\\"`) or independent (`type=\\\"multiple\\\"`) binary options that live side-by-side as a segmented control — viewport size picker (Mobile/Tablet/Desktop), text alignment, view density. Reads identically to a TabsList of the same size; reach for ToggleGroup when each option emits a value (like a form input) rather than swapping panels. Use Tabs for panel switching, Toggle for a single on/off.\",\n import: \"@gradeui/ui\",\n aliases: [\"toggle group\",\"segmented control\",\"segmented buttons\",\"button group\",\"pill group\",\"view selector\",\"segmented picker\",\"segmentedcontrolios\",\"segmented buttons group\",\"rn segmented control\"],\n subcomponents: [\"ToggleGroupItem\"],\n composesWith: [\"Card (header controls)\",\"Row\",\"AppShellHeader chrome\",\"settings panels\"],\n props: {\n \"type\": {\n schema: z.enum([\"single\", \"multiple\"]),\n design: \"knob\",\n description: \"single picks one, multiple picks any number\",\n },\n \"value\": {\n schema: z.string().optional(),\n design: \"content\",\n description: \"controlled; matches `type` (string for single, string[] for multiple)\",\n },\n \"defaultValue\": {\n schema: z.string().optional(),\n design: \"content\",\n description: \"uncontrolled initial\",\n },\n \"onValueChange\": {\n schema: z.unknown().optional(),\n design: \"event\",\n },\n \"size\": {\n schema: z.enum([\"sm\", \"md\", \"lg, default md\"]).optional(),\n design: \"knob\",\n description: \"cascades to every ToggleGroupItem via context, matches Tabs/Button heights\",\n },\n \"variant\": {\n schema: z.enum([\"default\", \"outline\"]).optional(),\n design: \"knob\",\n },\n \"tooltip\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"when set, wraps the item in a Tooltip; required for icon-only items where the visible chrome doesn't carry a label\",\n },\n \"tooltipSide\": {\n schema: z.enum([\"top\", \"right\", \"bottom\", \"left\\\", default \\\"top\"]).optional(),\n design: \"knob\",\n description: \"side the tooltip renders on\",\n },\n \"tooltipDelay\": {\n schema: z.number().optional(),\n design: \"knob\",\n description: \"per-item delay override; falls back to the upstream TooltipProvider's delayDuration\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const ToolbarContract = contract({\n name: \"Toolbar\",\n description: \"ANY three-region chrome bar — the leading/center/trailing pattern Apple HIG\\ndescribes as a \\\"Toolbar.\\\" App window chrome (Reddit, Twitter, GitHub, Linear,\\nmost desktop apps), section toolbars inside Cards or panels, bottom action\\nbars on mobile layouts, persistent footer toolbars.\\n\\nDon't hand-roll `<Row justify=\\\"between\\\">` with a flex-1 on a middle child and\\nmanual min-width juggling — Toolbar gives you the canonical `auto 1fr auto`\\ngrid for free, with `role=\\\"toolbar\\\"`, `data-gds-part` markers, position\\nvariants for top/bottom borders, and sticky sizing.\\n\\nSlot semantics:\\n leading — Logo + nav rail (e.g. a `<Row>` of Buttons or Link components)\\n center — Search input, page title chip, segmented Tab strip\\n trailing — Icon buttons, notification bell, avatar, primary CTA\\n\\nWhen a slot is omitted, its column collapses cleanly. Center stays visually\\ncentered in the bar regardless of leading/trailing widths because the grid\\ntemplate is `auto 1fr auto` (the center column absorbs available width).\\n\\nUse as the top child of `<AppShellHeader>` for window-level chrome:\\n <AppShellHeader>\\n <Toolbar leading={<Logo/>} center={<Search/>} trailing={<Avatar/>} />\\n </AppShellHeader>\\n\\nUse directly inside a Card or page section for section-scoped toolbars:\\n <Card>\\n <Toolbar size=\\\"sm\\\" variant=\\\"subtle\\\" leading={...} trailing={...} />\\n {content}\\n </Card>\",\n import: \"@gradeui/ui\",\n subcomponents: [\"ToolbarSlot\"],\n composesWith: [\"Button\",\"Avatar\",\"Input\",\"Logo\",\"Badge\",\"AppShellHeader\",\"Card\",\"Row\",\"Stack\"],\n props: {\n \"leading\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"left-aligned region (logo + primary nav)\",\n },\n \"center\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"center region (search, page title, segmented control)\",\n },\n \"trailing\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"right-aligned region (action icons, avatar, primary CTA)\",\n },\n \"children\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n description: \"escape hatch; bypasses slot layout\",\n },\n \"position\": {\n schema: z.enum([\"top\", \"bottom\", \"inline\"]).optional(),\n design: \"knob\",\n description: \"border placement\",\n default: \"top\",\n },\n \"variant\": {\n schema: z.enum([\"default\", \"subtle\", \"transparent\"]).optional(),\n design: \"knob\",\n default: \"default\",\n },\n \"size\": {\n schema: z.enum([\"sm\", \"md\", \"lg\"]).optional(),\n design: \"knob\",\n description: \"height + padding\",\n default: \"md\",\n },\n \"sticky\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"pin to top/bottom of scroll container\",\n default: false,\n },\n \"aria-label\": {\n schema: z.string().optional(),\n design: \"content\",\n description: \"required by WAI-ARIA toolbar pattern\",\n default: \"Toolbar\",\n },\n \"className\": {\n schema: z.string().optional(),\n design: \"plumbing\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const TooltipContract = contract({\n name: \"Tooltip\",\n description: \"A short, non-essential label that explains a control on hover/focus — icon-only buttons in toolbars, abbreviated column headers, status dots. NEVER hide critical info inside a tooltip — they're invisible on touch and can be skipped by screen readers if implemented carelessly. For richer hover content use HoverCard. For inline help text that's always visible, use a description paragraph.\",\n import: \"@gradeui/ui\",\n aliases: [\"tooltip\",\"tip\",\"hover tip\",\"hint\",\"label on hover\",\"help tag\",\"hint\",\"helper text bubble\",\"info tip\"],\n subcomponents: [\"TooltipTrigger\",\"TooltipContent\",\"TooltipProvider\"],\n composesWith: [\"Button (icon-only)\",\"Toggle\",\"TabsTrigger (the canonical tabs already have a `tooltip` prop that wraps this)\",\"Avatar (status badge meaning)\"],\n props: {\n \"delayDuration\": {\n schema: z.number().optional(),\n design: \"knob\",\n description: \"ms hover before show; mount ONCE near the app root\",\n },\n \"skipDelayDuration\": {\n schema: z.number().optional(),\n design: \"knob\",\n description: \"ms gap that still feels like \\\"same hover\\\"\",\n },\n \"open\": {\n schema: z.unknown().optional(),\n design: \"plumbing\",\n },\n \"asChild\": {\n schema: z.boolean().optional(),\n design: \"plumbing\",\n description: \"usually wraps a Button or icon\",\n },\n \"side\": {\n schema: z.enum([\"top\", \"right\", \"bottom\", \"left\", \"start\", \"center\", \"end\"]).optional(),\n design: \"knob\",\n default: \"top\",\n },\n },\n});\n","// AUTO-GENERATED by scripts/generate-contracts.mjs from the .md sidecar.\n// Hand edits will be overwritten on the next run. To customise this\n// component's contract (add actions, structured props, custom control\n// kinds, glyph pickers), remove this file's auto-generated marker and\n// hand-author it — the generator skips files without the marker.\n\nimport { z } from \"zod\";\nimport { contract } from \"@gradeui/contracts\";\n\nexport const VideoPlayerContract = contract({\n name: \"VideoPlayer\",\n description: \"HTML5 video wrapped in the shared media surface. Controls-on for a standard player, controls-off (+ autoplay/muted/loop) for hero / background video. Prefer Rive for anything interactive, Three Scene for shader backgrounds.\",\n import: \"@gradeui/ui\",\n aliases: [\"video\",\"mp4\",\"movie\",\"webm\",\"clip\",\"video view\",\"av player\",\"react native video\",\"video element\"],\n composesWith: [\"MediaSurface (internal)\",\"Card (wrap for thumbnail grids)\"],\n props: {\n \"src\": {\n schema: z.string(),\n design: \"content\",\n description: \"video URL\",\n },\n \"controls\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"show native controls; false for chromeless hero/background video\",\n default: true,\n },\n \"autoPlay\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"forces muted=true (browser restriction)\",\n default: false,\n },\n \"loop\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n default: false,\n },\n \"muted\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n default: false,\n },\n \"pauseOffscreen\": {\n schema: z.boolean().optional(),\n design: \"knob\",\n description: \"pause when scrolled out of viewport\",\n default: true,\n },\n \"aspect\": {\n schema: z.enum([\"video\", \"square\", \"portrait\", \"wide\", \"auto\"]).optional(),\n design: \"knob\",\n default: \"video\",\n },\n \"radius\": {\n schema: z.enum([\"none\", \"sm\", \"md\", \"lg\", \"xl\"]).optional(),\n design: \"knob\",\n description: \"driven by `--gds-media-radius`\",\n default: \"lg\",\n },\n \"objectFit\": {\n schema: z.enum([\"cover\", \"contain\", \"fill\"]).optional(),\n design: \"knob\",\n default: \"cover\",\n },\n \"poster\": {\n schema: z.string().optional(),\n design: \"content\",\n description: \"image shown before playback. Always rendered as a `loading=\\\"lazy\\\"` `<img>` overlay (not the native `poster` attribute, which fetches eagerly).\",\n },\n \"playbackRate\": {\n schema: z.number().optional(),\n design: \"knob\",\n },\n },\n});\n","/**\n * Component contract registry — auto-managed by\n * scripts/generate-contracts.mjs. Hand-authored contracts (MediaSurface,\n * etc.) are also wired in here; the generator preserves them on each\n * run.\n */\n\nimport type { ComponentContract } from \"@gradeui/contracts\";\nimport { AccordionContract } from \"../components/ui/accordion.contract\";\nimport { AiChatContract } from \"../components/ui/ai-chat.contract\";\nimport { AiChatComposerContract } from \"../components/ui/ai-chat-composer.contract\";\nimport { AppShellContract } from \"../components/ui/app-shell.contract\";\nimport { AvatarContract } from \"../components/ui/avatar.contract\";\nimport { BadgeContract } from \"../components/ui/badge.contract\";\nimport { BreadcrumbContract } from \"../components/ui/breadcrumb.contract\";\nimport { ButtonContract } from \"../components/ui/button.contract\";\nimport { CalendarContract } from \"../components/ui/calendar.contract\";\nimport { CalloutContract } from \"../components/ui/callout.contract\";\nimport { CardContract } from \"../components/ui/card.contract\";\nimport { CarouselContract } from \"../components/ui/carousel.contract\";\nimport { ChartContract } from \"../components/ui/chart.contract\";\nimport { CheckboxContract } from \"../components/ui/checkbox.contract\";\nimport { CollapsibleContract } from \"../components/ui/collapsible.contract\";\nimport { CommandContract } from \"../components/ui/command.contract\";\nimport { DatePickerContract } from \"../components/ui/date-picker.contract\";\nimport { DialogContract } from \"../components/ui/dialog.contract\";\nimport { DropdownMenuContract } from \"../components/ui/dropdown-menu.contract\";\nimport { FlexContract } from \"../components/ui/flex.contract\";\nimport { GridContract } from \"../components/ui/grid.contract\";\nimport { HoverCardContract } from \"../components/ui/hover-card.contract\";\nimport { InputContract } from \"../components/ui/input.contract\";\nimport { LabelContract } from \"../components/ui/label.contract\";\nimport { MapContract } from \"../components/ui/map.contract\";\nimport { MediaSurfaceContract } from \"../components/ui/media-surface.contract\";\nimport { MultiSelectContract } from \"../components/ui/multi-select.contract\";\nimport { PopoverContract } from \"../components/ui/popover.contract\";\nimport { ProgressContract } from \"../components/ui/progress.contract\";\nimport { RadioGroupContract } from \"../components/ui/radio-group.contract\";\nimport { ResizableContract } from \"../components/ui/resizable.contract\";\nimport { RivePlayerContract } from \"../components/ui/rive-player.contract\";\nimport { RowContract } from \"../components/ui/row.contract\";\nimport { ScrollAreaContract } from \"../components/ui/scroll-area.contract\";\nimport { SelectContract } from \"../components/ui/select.contract\";\nimport { SeparatorContract } from \"../components/ui/separator.contract\";\nimport { ShaderPresetPickerContract } from \"../components/ui/shader-preset-picker.contract\";\nimport { ShaderPresetPreviewContract } from \"../components/ui/shader-preset-preview.contract\";\nimport { SheetContract } from \"../components/ui/sheet.contract\";\nimport { SidebarContract } from \"../components/ui/sidebar.contract\";\nimport { SkeletonContract } from \"../components/ui/skeleton.contract\";\nimport { SliderContract } from \"../components/ui/slider.contract\";\nimport { SortableContract } from \"../components/ui/sortable.contract\";\nimport { StackContract } from \"../components/ui/stack.contract\";\nimport { SwitchContract } from \"../components/ui/switch.contract\";\nimport { TableContract } from \"../components/ui/table.contract\";\nimport { TabsContract } from \"../components/ui/tabs.contract\";\nimport { TextareaContract } from \"../components/ui/textarea.contract\";\nimport { ThreeSceneContract } from \"../components/ui/three-scene.contract\";\nimport { ToastContract } from \"../components/ui/toast.contract\";\nimport { ToggleContract } from \"../components/ui/toggle.contract\";\nimport { ToggleGroupContract } from \"../components/ui/toggle-group.contract\";\nimport { ToolbarContract } from \"../components/ui/toolbar.contract\";\nimport { TooltipContract } from \"../components/ui/tooltip.contract\";\nimport { VideoPlayerContract } from \"../components/ui/video-player.contract\";\n\nexport const COMPONENT_CONTRACTS: Readonly<Record<string, ComponentContract>> = {\n Accordion: AccordionContract,\n AiChat: AiChatContract,\n AiChatComposer: AiChatComposerContract,\n AppShell: AppShellContract,\n Avatar: AvatarContract,\n Badge: BadgeContract,\n Breadcrumb: BreadcrumbContract,\n Button: ButtonContract,\n Calendar: CalendarContract,\n Callout: CalloutContract,\n Card: CardContract,\n Carousel: CarouselContract,\n Chart: ChartContract,\n Checkbox: CheckboxContract,\n Collapsible: CollapsibleContract,\n Command: CommandContract,\n DatePicker: DatePickerContract,\n Dialog: DialogContract,\n DropdownMenu: DropdownMenuContract,\n Flex: FlexContract,\n Grid: GridContract,\n HoverCard: HoverCardContract,\n Input: InputContract,\n Label: LabelContract,\n Map: MapContract,\n MediaSurface: MediaSurfaceContract,\n MultiSelect: MultiSelectContract,\n Popover: PopoverContract,\n Progress: ProgressContract,\n RadioGroup: RadioGroupContract,\n Resizable: ResizableContract,\n RivePlayer: RivePlayerContract,\n Row: RowContract,\n ScrollArea: ScrollAreaContract,\n Select: SelectContract,\n Separator: SeparatorContract,\n ShaderPresetPicker: ShaderPresetPickerContract,\n ShaderPresetPreview: ShaderPresetPreviewContract,\n Sheet: SheetContract,\n Sidebar: SidebarContract,\n Skeleton: SkeletonContract,\n Slider: SliderContract,\n Sortable: SortableContract,\n Stack: StackContract,\n Switch: SwitchContract,\n Table: TableContract,\n Tabs: TabsContract,\n Textarea: TextareaContract,\n ThreeScene: ThreeSceneContract,\n Toast: ToastContract,\n Toggle: ToggleContract,\n ToggleGroup: ToggleGroupContract,\n Toolbar: ToolbarContract,\n Tooltip: TooltipContract,\n VideoPlayer: VideoPlayerContract,\n};\n\nexport function getComponentContract(\n componentName: string | null | undefined,\n): ComponentContract | null {\n if (!componentName) return null;\n return COMPONENT_CONTRACTS[componentName] ?? null;\n}\n\nexport function listContractedComponents(): string[] {\n return Object.keys(COMPONENT_CONTRACTS);\n}\n","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\n/**\n * Callout — inline, ambient, non-blocking status/feedback surface.\n *\n * Renamed from `Alert` (May 2026). The old name collided with\n * Apple HIG `Alert` (a modal) and with `role=\"alert\"` ARIA semantics,\n * both of which imply interruptive/assertive behaviour the component\n * does not have. \"Callout\" is honest about what it is: an inline\n * attention-grabber that sits in the layout flow. The `Alert` name is\n * deliberately left vacant in the barrel so a future genuinely-\n * interruptive primitive can claim it without further renames — until\n * then, reach for `<Dialog>` for modal alerts.\n *\n * Variants intentionally preserved as-is in this pass (`default |\n * destructive | success | warning | info`) — splitting `variant` onto\n * orthogonal `intent × emphasis` axes is a planned follow-up across\n * the whole library, not a one-component change. The `highlight`\n * variant (yellow) was dropped in this rename: in practice it\n * overlapped `warning` (amber) and added one more variant without a\n * unique semantic. Consumers needing \"notable but not alarming\" use\n * `variant=\"warning\"` or `variant=\"info\"` depending on temperature.\n */\nconst calloutVariants = cva(\n // Each variant uses the theme's semantic tokens instead of hard-coded\n // gds-* 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 },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n);\n\ntype CalloutVariant = NonNullable<VariantProps<typeof calloutVariants>[\"variant\"]>;\n\n/**\n * ARIA role mapping. Screen readers treat `alert` as assertive — it\n * interrupts whatever the user is hearing to announce the message.\n * That's correct for genuinely-time-critical content (a save failure,\n * a destructive confirmation) but wrong for ambient confirmations\n * (\"Profile updated\"). The conditional below routes:\n *\n * warning / destructive → role=\"alert\" (assertive — interrupts)\n * info / success / default → role=\"status\" (polite — announces after current speech)\n *\n * Consumers can still override via `role={…}` on the underlying div.\n */\nconst ROLE_BY_VARIANT: Record<CalloutVariant, \"alert\" | \"status\"> = {\n destructive: \"alert\",\n warning: \"alert\",\n info: \"status\",\n success: \"status\",\n default: \"status\",\n};\n\nconst Callout = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof calloutVariants>\n>(({ className, variant, role, ...props }, ref) => {\n const resolvedVariant = (variant ?? \"default\") as CalloutVariant;\n return (\n <div\n ref={ref}\n role={role ?? ROLE_BY_VARIANT[resolvedVariant]}\n data-gds-part=\"callout\"\n className={cn(calloutVariants({ variant }), className)}\n {...props}\n />\n );\n});\nCallout.displayName = \"Callout\";\n\nconst CalloutTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h5\n ref={ref}\n data-gds-part=\"callout-title\"\n className={cn(\"mb-1 font-medium leading-none tracking-tight\", className)}\n {...props}\n />\n));\nCalloutTitle.displayName = \"CalloutTitle\";\n\nconst CalloutDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-gds-part=\"callout-description\"\n className={cn(\"text-sm [&_p]:leading-relaxed\", className)}\n {...props}\n />\n));\nCalloutDescription.displayName = \"CalloutDescription\";\n\nexport { Callout, CalloutTitle, CalloutDescription, calloutVariants };\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 or marketing layout.\n *\n * Provides five slots arranged via CSS-grid template areas:\n *\n * ┌─────────── Header (full bleed) ───────────┐\n * │ Nav │ Aside │ Main │\n * └─────────── Footer (full bleed) ───────────┘\n *\n * Header and Footer always span the full width and sit at the very top /\n * very bottom of the shell — useful for marketing pages, brand bars, site\n * chrome. `nav` chooses how the body row is split:\n *\n * - `none` — Main only (a marketing page or a single-column app)\n * - `top` — Main below an in-app top-nav row (TopMenu)\n * - `side` — Nav rail + Main (classic app layout)\n * - `three-pane` — Nav rail + fixed Aside + flex Main (Slack/Mail/Notion\n * shape; aside width via --gds-app-shell-aside, default 320px)\n *\n * Each slot is assigned a fixed `grid-area` (header/nav/aside/main/footer),\n * so the **JSX child order doesn't matter** — drop slots in any order and\n * the grid sorts them.\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 Sidebar, a\n * TopMenu, a hand-rolled `<nav>`. For drag-to-resize columns inside the\n * body, compose this with `Resizable` instead of using a static grid.\n *\n * Variants:\n * - `nav` — \"none\" | \"top\" | \"side\" | \"three-pane\"\n * - `maxWidth` — Main slot only: \"full\" | \"container\" caps reading width\n * for marketing-style content.\n * - `sticky` — Nav slot, Header slot. Pin to the viewport on scroll.\n */\nconst shellVariants = cva(\n \"gds-app-shell min-h-screen w-full bg-background text-foreground grid\",\n {\n variants: {\n nav: {\n none: \"\",\n top: \"\",\n side: \"\",\n \"three-pane\": \"\",\n },\n },\n defaultVariants: {\n nav: \"none\",\n },\n }\n);\n\nconst headerVariants = cva(\"gds-app-shell-header\", {\n variants: {\n sticky: {\n true: \"sticky top-0 z-30\",\n false: \"\",\n },\n },\n defaultVariants: {\n sticky: false,\n },\n});\n\nconst navVariants = cva(\"gds-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 asideVariants = cva(\"gds-app-shell-aside min-w-0 border-r bg-background\", {\n variants: {\n sticky: {\n true: \"sticky top-0 h-screen self-start\",\n false: \"\",\n },\n },\n defaultVariants: {\n sticky: false,\n },\n});\n\nconst mainVariants = cva(\"gds-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\nconst footerVariants = cva(\"gds-app-shell-footer border-t bg-background\");\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// ---------- Header slot ----------\n\nexport interface AppShellHeaderProps\n extends React.HTMLAttributes<HTMLElement>,\n VariantProps<typeof headerVariants> {\n asChild?: boolean;\n}\n\nconst AppShellHeader = React.forwardRef<HTMLElement, AppShellHeaderProps>(\n ({ className, sticky, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"header\";\n return (\n <Comp\n ref={ref as React.Ref<HTMLElement>}\n data-gds-part=\"app-shell-header\"\n className={cn(headerVariants({ sticky, className }))}\n {...props}\n />\n );\n }\n);\nAppShellHeader.displayName = \"AppShellHeader\";\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// ---------- Aside slot (middle column for nav=\"three-pane\") ----------\n\nexport interface AppShellAsideProps\n extends React.HTMLAttributes<HTMLElement>,\n VariantProps<typeof asideVariants> {\n asChild?: boolean;\n}\n\nconst AppShellAside = React.forwardRef<HTMLElement, AppShellAsideProps>(\n ({ className, sticky, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"aside\";\n return (\n <Comp\n ref={ref as React.Ref<HTMLElement>}\n data-gds-part=\"app-shell-aside\"\n className={cn(asideVariants({ sticky, className }))}\n {...props}\n />\n );\n }\n);\nAppShellAside.displayName = \"AppShellAside\";\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\n// ---------- Footer slot ----------\n\nexport interface AppShellFooterProps\n extends React.HTMLAttributes<HTMLElement>,\n VariantProps<typeof footerVariants> {\n asChild?: boolean;\n}\n\nconst AppShellFooter = React.forwardRef<HTMLElement, AppShellFooterProps>(\n ({ className, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"footer\";\n return (\n <Comp\n ref={ref as React.Ref<HTMLElement>}\n data-gds-part=\"app-shell-footer\"\n className={cn(footerVariants({ className }))}\n {...props}\n />\n );\n }\n);\nAppShellFooter.displayName = \"AppShellFooter\";\n\nexport {\n AppShell,\n AppShellHeader,\n AppShellNav,\n AppShellAside,\n AppShellMain,\n AppShellFooter,\n shellVariants,\n headerVariants,\n navVariants,\n asideVariants,\n mainVariants,\n footerVariants,\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-gds-yellow-400 text-gds-gray-900 shadow hover:bg-gds-yellow-500\",\n success:\n \"border-transparent bg-gds-green-500 text-gds-gray-900 shadow hover:bg-gds-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-gds-green-500/20 bg-gds-green-500/10 text-gds-green-600 dark:text-gds-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-gds-yellow-500/20 bg-gds-yellow-400/10 text-gds-yellow-600 dark:text-gds-yellow-400\",\n // Outline variants - just border and text, no background\n \"success-outline\":\n \"border-gds-green-500/50 bg-transparent text-gds-green-600 dark:text-gds-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\n/**\n * Button — primary action primitive.\n *\n * Sizes (t-shirt scale) align EXACTLY to Tabs / ToggleGroup outer\n * heights so a button placed next to a tab strip lines up without\n * any per-call className overrides:\n *\n * sm: h-7 (28px) — matches `<TabsList size=\"sm\">` height\n * md: h-8 (32px) — matches `<TabsList size=\"md\">` height (default)\n * lg: h-10 (40px) — matches `<TabsList size=\"lg\">` height\n * icon: h-8 w-8 — square variant, md height\n *\n * `default` is preserved as an alias for `md` so existing call sites\n * keep working through the rename.\n *\n * Type and icon sizes also follow the Tabs scale (text-xs + size-3.5\n * at sm/md, text-sm + size-4 at lg) so the visual rhythm reads\n * consistent across primitives.\n */\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md 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]: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 // Tactile \"physical key\" treatment — inner bevel + outer drop +\n // ambient hover glow keyed off `--btn-glow` (defaults to the\n // --selected-glow blue). Drive the tone per-button with a style\n // override, e.g. `style={{ '--btn-glow': 'var(--warning)' }}`,\n // or with `data-state=\"on\"` / `aria-pressed=\"true\"` for a held\n // selected look. Heavy lift lives in .gds-button-raised so the\n // multi-stop shadow stack stays readable.\n raised: \"gds-button-raised\",\n },\n size: {\n sm: \"h-7 gap-1.5 px-2.5 text-xs [&_svg]:size-3.5\",\n md: \"h-8 gap-1.5 px-3 text-xs [&_svg]:size-3.5\",\n // Alias for md — back-compat with usages that predate the\n // t-shirt rename. Same classes as md verbatim.\n default: \"h-8 gap-1.5 px-3 text-xs [&_svg]:size-3.5\",\n lg: \"h-10 gap-2 px-4 text-sm [&_svg]:size-4\",\n icon: \"h-8 w-8 [&_svg]:size-3.5\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\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 // `data-gds-part=\"button\"` is the identity attribute Studio's\n // selection agent looks for to map a click to a DS component.\n // Without it, clicking a Button (or anything inside it — the\n // common case is a Lucide icon child) ends up selecting the\n // inner SVG instead, and the inspector can't load the Button\n // contract because there's no componentName to look up.\n data-gds-part=\"button\"\n className={cn(\"gds-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","\"use client\";\n\n/**\n * Carousel — token-driven slideshow primitive built on embla-carousel.\n *\n * Compound API:\n *\n * <Carousel autoplay loop>\n * <Carousel.Slide>{...}</Carousel.Slide>\n * <Carousel.Slide duration={15000}>{...}</Carousel.Slide>\n * <Carousel.VideoSlide src=\"…\" poster=\"…\" alt=\"…\" />\n *\n * <Carousel.Arrows />\n * <Carousel.Dots />\n * </Carousel>\n *\n * Design-system contract:\n * - All visual dimensions are CSS variables (`--gds-carousel-*`) so the\n * control surface, dot size, gap, arrow look etc. are themable per\n * consumer without prop drilling. Defaults live in `styles/globals.css`.\n * - Root stamps `data-gds-part=\"carousel\"` so Studio's selection agent\n * can target the whole carousel as one unit, with sub-parts on\n * `Carousel.Slide` (`carousel-slide`), `Carousel.Dots` (`carousel-dots`),\n * `Carousel.Arrows` (`carousel-arrows`).\n * - Autoplay is hand-rolled (no `embla-carousel-autoplay` plugin) so per-\n * slide duration overrides and \"advance when the video ends\" behaviour\n * fall out cleanly. The plugin's fixed `delay` would have made both of\n * those fight the library.\n *\n * Video slide behaviour (the one the user asked for):\n * - Poster image is rendered until the slide becomes active.\n * - On activation the <video> autoplays muted + loop (= browser-friendly)\n * with no controls — chosen default.\n * - When the loop is short (`<video loop>` re-fires onEnded continuously\n * in some browsers but never in others), we ALSO use the same per-slide\n * `duration` mechanism as still slides: if the slide author passes\n * `duration={15000}` we advance after 15s regardless of the video\n * length. Without a duration the slide stays put until the carousel\n * stops being autoplayed — that matches \"play this video forever\n * while it's on screen\".\n *\n * Library: embla-carousel-react. Headless, ~6kb gzip, no opinionated CSS.\n */\n\nimport * as React from \"react\";\nimport useEmblaCarousel, {\n type UseEmblaCarouselType,\n} from \"embla-carousel-react\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\n\ntype EmblaApi = NonNullable<UseEmblaCarouselType[1]>;\ntype EmblaOptions = Parameters<typeof useEmblaCarousel>[0];\n\n// ─────────────────────────────────────────────────────────────────────\n// Context — every subcomponent talks to embla via this.\n// ─────────────────────────────────────────────────────────────────────\n\ninterface CarouselContextValue {\n api: EmblaApi | undefined;\n selectedIndex: number;\n slideCount: number;\n canScrollPrev: boolean;\n canScrollNext: boolean;\n /** Slide indices → per-slide duration (ms). Populated by `Carousel.Slide`\n * when it mounts so autoplay can read it without prop-drilling. */\n durationsRef: React.MutableRefObject<Map<number, number>>;\n /** Slide indices that are video slides and need an \"advance now\" signal\n * when the video calls `onEnded`. */\n advanceFromSlide: (slideIndex: number) => void;\n}\n\nconst CarouselContext = React.createContext<CarouselContextValue | null>(null);\n\nfunction useCarousel(componentName: string): CarouselContextValue {\n const ctx = React.useContext(CarouselContext);\n if (!ctx) {\n throw new Error(\n `<${componentName}> must be rendered inside a <Carousel> root.`,\n );\n }\n return ctx;\n}\n\n// ─────────────────────────────────────────────────────────────────────\n// Root\n// ─────────────────────────────────────────────────────────────────────\n\nexport interface CarouselProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Loop back to slide 0 after the last one. Default true. */\n loop?: boolean;\n /** Slide alignment within the viewport when not all slides are full-width.\n * `\"start\"` (default) lines slides up to the left edge; `\"center\"` is the\n * classic \"current slide centered, peek of neighbours\" treatment. */\n align?: \"start\" | \"center\" | \"end\";\n /** How many slides to show at once. Default `1` (full-bleed slides).\n * For responsive multi-slide layouts (e.g. 1 mobile / 3 desktop) leave\n * this and use the `--gds-carousel-slide-basis` CSS var on `Slide`\n * instead — it accepts media-query-driven values. */\n slidesPerView?: number;\n /** Autoplay config. Pass `true` for defaults (5s delay, pause on hover,\n * pause when offscreen). Pass an object to override; pass `false` /\n * omit to disable. */\n autoplay?: boolean | AutoplayConfig;\n /** Drag-to-swipe. Default `true`. Disable when the carousel is being\n * driven entirely by Dots/Arrows and drag would conflict with chrome\n * inside the slides. */\n draggable?: boolean;\n /** Fired whenever the active slide changes — programmatic, autoplay,\n * or user swipe. The value is the zero-based slide index. */\n onSlideChange?: (index: number) => void;\n}\n\nexport interface AutoplayConfig {\n /** Default delay per slide in ms. Overridden by `<Carousel.Slide duration>`\n * on a per-slide basis. Default 5000. */\n delay?: number;\n /** Pause the autoplay while the pointer is over the carousel. Default true. */\n pauseOnHover?: boolean;\n /** Pause when the carousel scrolls out of the viewport — saves work and\n * matches the MediaSurface \"play when visible\" convention. Default true. */\n pauseWhenOffscreen?: boolean;\n}\n\nconst DEFAULT_AUTOPLAY_DELAY = 5000;\n\ninterface CarouselRootComponent\n extends React.ForwardRefExoticComponent<\n CarouselProps & React.RefAttributes<HTMLDivElement>\n > {\n Slide: typeof CarouselSlide;\n VideoSlide: typeof CarouselVideoSlide;\n Dots: typeof CarouselDots;\n Arrows: typeof CarouselArrows;\n Prev: typeof CarouselPrev;\n Next: typeof CarouselNext;\n}\n\nconst CarouselRoot = React.forwardRef<HTMLDivElement, CarouselProps>(\n (\n {\n loop = true,\n align = \"start\",\n slidesPerView = 1,\n autoplay = false,\n draggable = true,\n onSlideChange,\n className,\n style,\n children,\n ...rest\n },\n ref,\n ) => {\n const options: EmblaOptions = React.useMemo(\n () => ({\n loop,\n align,\n slidesToScroll: 1,\n watchDrag: draggable,\n containScroll: loop ? false : \"trimSnaps\",\n }),\n [loop, align, draggable],\n );\n\n const [viewportRef, api] = useEmblaCarousel(options);\n\n const [selectedIndex, setSelectedIndex] = React.useState(0);\n const [slideCount, setSlideCount] = React.useState(0);\n const [canScrollPrev, setCanScrollPrev] = React.useState(false);\n const [canScrollNext, setCanScrollNext] = React.useState(false);\n\n const durationsRef = React.useRef<Map<number, number>>(new Map());\n const onSlideChangeRef = React.useRef(onSlideChange);\n onSlideChangeRef.current = onSlideChange;\n\n // Resolve autoplay config once.\n const autoplayConfig = React.useMemo<AutoplayConfig | null>(() => {\n if (!autoplay) return null;\n if (autoplay === true) return {};\n return autoplay;\n }, [autoplay]);\n\n // Sync state from embla. `reInit` re-fires when the slide DOM changes\n // (e.g. a video slide swaps poster→video), so the snap count + bounds\n // stay accurate without us having to track DOM mutations manually.\n React.useEffect(() => {\n if (!api) return;\n const sync = () => {\n setSelectedIndex(api.selectedScrollSnap());\n setSlideCount(api.scrollSnapList().length);\n setCanScrollPrev(api.canScrollPrev());\n setCanScrollNext(api.canScrollNext());\n onSlideChangeRef.current?.(api.selectedScrollSnap());\n };\n sync();\n api.on(\"select\", sync);\n api.on(\"reInit\", sync);\n return () => {\n api.off(\"select\", sync);\n api.off(\"reInit\", sync);\n };\n }, [api]);\n\n // Hand-rolled autoplay — reads per-slide durations from the ref.\n // Lives here (not in a plugin) so VideoSlide can call\n // `advanceFromSlide(idx)` to skip on `onEnded` without fighting\n // the plugin's internal timer.\n const advanceFromSlide = React.useCallback(\n (slideIndex: number) => {\n if (!api) return;\n // Only advance if we're STILL on that slide — guards against\n // a stale `onEnded` firing after the user already swiped away.\n if (api.selectedScrollSnap() !== slideIndex) return;\n api.scrollNext();\n },\n [api],\n );\n\n // Pause-on-hover state (controlled here so the timer can read it).\n const hoveredRef = React.useRef(false);\n // Pause-when-offscreen via IntersectionObserver on the viewport.\n const visibleRef = React.useRef(true);\n\n const rootRef = React.useRef<HTMLDivElement | null>(null);\n // Compose the consumer's ref with our internal one for IO + hover.\n React.useImperativeHandle(ref, () => rootRef.current as HTMLDivElement);\n\n React.useEffect(() => {\n if (!autoplayConfig?.pauseWhenOffscreen) {\n visibleRef.current = true;\n return;\n }\n const node = rootRef.current;\n if (!node || typeof IntersectionObserver === \"undefined\") return;\n const io = new IntersectionObserver(\n (entries) => {\n visibleRef.current = entries.some((e) => e.isIntersecting);\n },\n { threshold: 0.25 },\n );\n io.observe(node);\n return () => io.disconnect();\n }, [autoplayConfig?.pauseWhenOffscreen]);\n\n // The timer itself.\n React.useEffect(() => {\n if (!api || !autoplayConfig) return;\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n const schedule = () => {\n if (timer) clearTimeout(timer);\n const idx = api.selectedScrollSnap();\n const delay =\n durationsRef.current.get(idx) ??\n autoplayConfig.delay ??\n DEFAULT_AUTOPLAY_DELAY;\n timer = setTimeout(() => {\n if (hoveredRef.current || !visibleRef.current) {\n // Reschedule and check again next tick — keeps the loop\n // alive without advancing.\n schedule();\n return;\n }\n api.scrollNext();\n // The \"select\" listener below will call schedule() again\n // for the next slide's delay.\n }, delay);\n };\n\n const onSelect = () => schedule();\n const onPointerDown = () => {\n if (timer) clearTimeout(timer);\n };\n const onSettle = () => schedule();\n\n api.on(\"select\", onSelect);\n api.on(\"pointerDown\", onPointerDown);\n api.on(\"settle\", onSettle);\n schedule();\n\n return () => {\n if (timer) clearTimeout(timer);\n api.off(\"select\", onSelect);\n api.off(\"pointerDown\", onPointerDown);\n api.off(\"settle\", onSettle);\n };\n }, [api, autoplayConfig]);\n\n const handleMouseEnter = () => {\n if (autoplayConfig?.pauseOnHover !== false) hoveredRef.current = true;\n };\n const handleMouseLeave = () => {\n hoveredRef.current = false;\n };\n\n const ctx = React.useMemo<CarouselContextValue>(\n () => ({\n api,\n selectedIndex,\n slideCount,\n canScrollPrev,\n canScrollNext,\n durationsRef,\n advanceFromSlide,\n }),\n [\n api,\n selectedIndex,\n slideCount,\n canScrollPrev,\n canScrollNext,\n advanceFromSlide,\n ],\n );\n\n // Inline CSS variable for slidesPerView so consumers can do\n // ` style={{ \"--gds-carousel-slide-basis\": \"33%\" }}` on individual\n // slides — but the default basis falls out of slidesPerView so the\n // common case is prop-driven.\n const basis = `calc(100% / ${slidesPerView})`;\n\n return (\n <CarouselContext.Provider value={ctx}>\n <div\n ref={rootRef}\n data-gds-part=\"carousel\"\n className={cn(\"relative\", className)}\n style={{\n [\"--gds-carousel-slide-basis\" as string]: basis,\n ...style,\n }}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n {...rest}\n >\n <div\n ref={viewportRef}\n data-gds-part=\"carousel-viewport\"\n className=\"overflow-hidden\"\n style={{\n borderRadius: \"var(--gds-carousel-radius, var(--gds-media-radius, 0.5rem))\",\n }}\n >\n <div\n data-gds-part=\"carousel-track\"\n className=\"flex\"\n style={{\n gap: \"var(--gds-carousel-gap, 0)\",\n touchAction: \"pan-y pinch-zoom\",\n }}\n >\n {children}\n </div>\n </div>\n </div>\n </CarouselContext.Provider>\n );\n },\n) as CarouselRootComponent;\nCarouselRoot.displayName = \"Carousel\";\n\n// ─────────────────────────────────────────────────────────────────────\n// Slide\n// ─────────────────────────────────────────────────────────────────────\n\nexport interface CarouselSlideProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Per-slide autoplay duration in ms. Overrides the carousel's default\n * delay for this slide only. e.g. `duration={15000}` keeps a hero\n * still on screen for 15s while the rest cycle at 5s. */\n duration?: number;\n}\n\nconst CarouselSlide = React.forwardRef<HTMLDivElement, CarouselSlideProps>(\n ({ duration, className, style, children, ...rest }, ref) => {\n const { durationsRef } = useCarousel(\"Carousel.Slide\");\n // Position is supplied by the parent track's flex order. We need the\n // slide's index to write the per-slide duration into the ref. Use a\n // sibling-count effect to find it — cheap and avoids requiring a\n // controlled prop.\n const slideRef = React.useRef<HTMLDivElement | null>(null);\n React.useImperativeHandle(ref, () => slideRef.current as HTMLDivElement);\n\n React.useEffect(() => {\n if (duration == null) return;\n const el = slideRef.current;\n if (!el?.parentElement) return;\n const idx = Array.from(el.parentElement.children).indexOf(el);\n if (idx < 0) return;\n const map = durationsRef.current;\n map.set(idx, duration);\n return () => {\n map.delete(idx);\n };\n }, [duration, durationsRef]);\n\n return (\n <div\n ref={slideRef}\n data-gds-part=\"carousel-slide\"\n className={cn(\"min-w-0 shrink-0 grow-0\", className)}\n style={{\n flexBasis: \"var(--gds-carousel-slide-basis, 100%)\",\n ...style,\n }}\n {...rest}\n >\n {children}\n </div>\n );\n },\n);\nCarouselSlide.displayName = \"Carousel.Slide\";\n\n// ─────────────────────────────────────────────────────────────────────\n// VideoSlide — poster + muted-autoplay-on-activate\n// ─────────────────────────────────────────────────────────────────────\n\nexport interface CarouselVideoSlideProps\n extends Omit<CarouselSlideProps, \"children\"> {\n src: string;\n /** Poster shown until the slide becomes active. Reuses the\n * `--gds-media-placeholder-bg/-fg` tokens as a fallback. */\n poster?: string;\n alt?: string;\n /** Override default behaviour and show native controls. Default false —\n * the chosen default (\"muted autoplay + loop, no controls\"). */\n controls?: boolean;\n /** Override the default loop behaviour. Default true (the chosen\n * default). When `false` and no `duration` is set, the carousel\n * advances when the video ends. */\n loop?: boolean;\n /** Object-fit for the video. Default `\"cover\"`. */\n fit?: \"cover\" | \"contain\";\n}\n\nconst CarouselVideoSlide = React.forwardRef<HTMLDivElement, CarouselVideoSlideProps>(\n (\n {\n src,\n poster,\n alt,\n controls = false,\n loop = true,\n fit = \"cover\",\n duration,\n className,\n style,\n ...rest\n },\n ref,\n ) => {\n const { api, selectedIndex, advanceFromSlide } =\n useCarousel(\"Carousel.VideoSlide\");\n const slideRef = React.useRef<HTMLDivElement | null>(null);\n const videoRef = React.useRef<HTMLVideoElement | null>(null);\n React.useImperativeHandle(ref, () => slideRef.current as HTMLDivElement);\n\n // Find this slide's index by sibling position — same approach as\n // CarouselSlide. Stored in state so we can compare against\n // `selectedIndex` cheaply.\n const [slideIndex, setSlideIndex] = React.useState<number | null>(null);\n React.useEffect(() => {\n const el = slideRef.current;\n if (!el?.parentElement) return;\n setSlideIndex(Array.from(el.parentElement.children).indexOf(el));\n }, [api]);\n\n const isActive = slideIndex != null && slideIndex === selectedIndex;\n\n // Activate / deactivate the video as the slide enters / exits.\n React.useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n if (isActive) {\n // play() returns a promise that rejects if the browser blocks\n // it (rare for muted videos but defensive — swallow).\n const p = video.play();\n if (p && typeof p.catch === \"function\") p.catch(() => {});\n } else {\n video.pause();\n video.currentTime = 0;\n }\n }, [isActive]);\n\n return (\n <CarouselSlide\n ref={slideRef}\n duration={duration}\n className={cn(\n \"relative overflow-hidden bg-[var(--gds-media-placeholder-bg)]\",\n className,\n )}\n style={style}\n data-gds-part=\"carousel-video-slide\"\n {...rest}\n >\n {/* Poster — visible until activated. Always rendered (no\n opacity flicker on swap) and stacked behind the video. */}\n {poster && (\n <img\n src={poster}\n alt={alt ?? \"\"}\n aria-hidden={isActive}\n className=\"absolute inset-0 h-full w-full\"\n style={{\n objectFit: fit,\n opacity: isActive ? 0 : 1,\n transition: \"opacity var(--gds-carousel-fade-ms, 200ms) ease-out\",\n }}\n />\n )}\n <video\n ref={videoRef}\n src={src}\n muted\n playsInline\n loop={loop}\n controls={controls}\n preload=\"metadata\"\n aria-label={alt}\n className=\"block h-full w-full\"\n style={{\n objectFit: fit,\n opacity: isActive ? 1 : 0,\n transition: \"opacity var(--gds-carousel-fade-ms, 200ms) ease-out\",\n }}\n onEnded={() => {\n // Only relevant when loop=false. Advance the carousel so the\n // video doesn't end-state freeze on the user.\n if (loop) return;\n if (slideIndex == null) return;\n advanceFromSlide(slideIndex);\n }}\n />\n </CarouselSlide>\n );\n },\n);\nCarouselVideoSlide.displayName = \"Carousel.VideoSlide\";\n\n// ─────────────────────────────────────────────────────────────────────\n// Dots\n// ─────────────────────────────────────────────────────────────────────\n\nexport interface CarouselDotsProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Position the dots relative to the viewport. Default `\"below\"` puts\n * them in flow underneath; `\"overlay\"` floats them at the bottom of\n * the carousel area on top of the slides. */\n position?: \"below\" | \"overlay\";\n /** Custom render function for one dot. Receives `{ index, active, onClick }`\n * and should return a button — for when the default rounded-pill look\n * doesn't fit (e.g. thumbnail strips, numeric pagination). */\n renderDot?: (state: {\n index: number;\n active: boolean;\n onClick: () => void;\n }) => React.ReactNode;\n}\n\nconst CarouselDots = React.forwardRef<HTMLDivElement, CarouselDotsProps>(\n ({ position = \"below\", renderDot, className, style, ...rest }, ref) => {\n const { api, selectedIndex, slideCount } = useCarousel(\"Carousel.Dots\");\n\n if (slideCount <= 1) return null;\n\n const dots = Array.from({ length: slideCount }, (_, i) => i);\n\n const overlayStyles =\n position === \"overlay\"\n ? {\n position: \"absolute\" as const,\n insetInlineStart: 0,\n insetInlineEnd: 0,\n bottom: \"var(--gds-carousel-dots-inset, 0.75rem)\",\n zIndex: 1,\n }\n : { marginBlockStart: \"var(--gds-carousel-dots-gap, 0.75rem)\" };\n\n return (\n <div\n ref={ref}\n data-gds-part=\"carousel-dots\"\n className={cn(\"flex items-center justify-center\", className)}\n style={{\n gap: \"var(--gds-carousel-dots-spacing, 0.5rem)\",\n ...overlayStyles,\n ...style,\n }}\n {...rest}\n >\n {dots.map((i) => {\n const active = i === selectedIndex;\n const onClick = () => api?.scrollTo(i);\n if (renderDot) return renderDot({ index: i, active, onClick });\n return (\n <button\n key={i}\n type=\"button\"\n onClick={onClick}\n aria-label={`Go to slide ${i + 1}`}\n aria-current={active ? \"true\" : undefined}\n data-active={active || undefined}\n className=\"rounded-full transition-all\"\n style={{\n width: active\n ? \"var(--gds-carousel-dot-active-width, 1.25rem)\"\n : \"var(--gds-carousel-dot-size, 0.5rem)\",\n height: \"var(--gds-carousel-dot-size, 0.5rem)\",\n background: active\n ? \"var(--gds-carousel-dot-active-color, oklch(var(--primary)))\"\n : \"var(--gds-carousel-dot-color, oklch(var(--muted-foreground) / 0.4))\",\n }}\n />\n );\n })}\n </div>\n );\n },\n);\nCarouselDots.displayName = \"Carousel.Dots\";\n\n// ─────────────────────────────────────────────────────────────────────\n// Arrows\n// ─────────────────────────────────────────────────────────────────────\n\nexport interface CarouselArrowsProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Position relative to the viewport. `\"overlay\"` (default) floats the\n * arrows over the slides; `\"outside\"` places them in flow alongside\n * the carousel (useful when the viewport is full-bleed). */\n position?: \"overlay\" | \"outside\";\n}\n\nconst CarouselArrows = React.forwardRef<HTMLDivElement, CarouselArrowsProps>(\n ({ position = \"overlay\", className, style, ...rest }, ref) => {\n if (position === \"outside\") {\n return (\n <div\n ref={ref}\n data-gds-part=\"carousel-arrows\"\n className={cn(\"flex items-center justify-end gap-2 pt-2\", className)}\n style={style}\n {...rest}\n >\n <CarouselPrev />\n <CarouselNext />\n </div>\n );\n }\n return (\n <div\n ref={ref}\n data-gds-part=\"carousel-arrows\"\n className={cn(\"pointer-events-none absolute inset-0 z-[1]\", className)}\n style={style}\n {...rest}\n >\n <CarouselPrev className=\"pointer-events-auto absolute left-[var(--gds-carousel-arrow-inset,0.75rem)] top-1/2 -translate-y-1/2\" />\n <CarouselNext className=\"pointer-events-auto absolute right-[var(--gds-carousel-arrow-inset,0.75rem)] top-1/2 -translate-y-1/2\" />\n </div>\n );\n },\n);\nCarouselArrows.displayName = \"Carousel.Arrows\";\n\nexport interface CarouselNavButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {}\n\nconst CarouselPrev = React.forwardRef<HTMLButtonElement, CarouselNavButtonProps>(\n ({ className, style, children, ...rest }, ref) => {\n const { api, canScrollPrev } = useCarousel(\"Carousel.Prev\");\n return (\n <button\n ref={ref}\n type=\"button\"\n data-gds-part=\"carousel-prev\"\n aria-label=\"Previous slide\"\n disabled={!canScrollPrev}\n onClick={() => api?.scrollPrev()}\n className={cn(\n \"inline-flex items-center justify-center rounded-full\",\n \"transition disabled:opacity-40 disabled:cursor-not-allowed\",\n \"hover:[background:var(--gds-carousel-arrow-hover-bg,oklch(var(--background)))]\",\n className,\n )}\n style={{\n width: \"var(--gds-carousel-arrow-size, 2.25rem)\",\n height: \"var(--gds-carousel-arrow-size, 2.25rem)\",\n background:\n \"var(--gds-carousel-arrow-bg, oklch(var(--background) / 0.85))\",\n color: \"var(--gds-carousel-arrow-fg, oklch(var(--foreground)))\",\n backdropFilter: \"var(--gds-carousel-arrow-backdrop, blur(6px))\",\n boxShadow:\n \"var(--gds-carousel-arrow-shadow, 0 2px 8px oklch(0 0 0 / 0.12))\",\n ...style,\n }}\n {...rest}\n >\n {children ?? <ChevronLeft className=\"h-4 w-4\" aria-hidden />}\n </button>\n );\n },\n);\nCarouselPrev.displayName = \"Carousel.Prev\";\n\nconst CarouselNext = React.forwardRef<HTMLButtonElement, CarouselNavButtonProps>(\n ({ className, style, children, ...rest }, ref) => {\n const { api, canScrollNext } = useCarousel(\"Carousel.Next\");\n return (\n <button\n ref={ref}\n type=\"button\"\n data-gds-part=\"carousel-next\"\n aria-label=\"Next slide\"\n disabled={!canScrollNext}\n onClick={() => api?.scrollNext()}\n className={cn(\n \"inline-flex items-center justify-center rounded-full\",\n \"transition disabled:opacity-40 disabled:cursor-not-allowed\",\n \"hover:[background:var(--gds-carousel-arrow-hover-bg,oklch(var(--background)))]\",\n className,\n )}\n style={{\n width: \"var(--gds-carousel-arrow-size, 2.25rem)\",\n height: \"var(--gds-carousel-arrow-size, 2.25rem)\",\n background:\n \"var(--gds-carousel-arrow-bg, oklch(var(--background) / 0.85))\",\n color: \"var(--gds-carousel-arrow-fg, oklch(var(--foreground)))\",\n backdropFilter: \"var(--gds-carousel-arrow-backdrop, blur(6px))\",\n boxShadow:\n \"var(--gds-carousel-arrow-shadow, 0 2px 8px oklch(0 0 0 / 0.12))\",\n ...style,\n }}\n {...rest}\n >\n {children ?? <ChevronRight className=\"h-4 w-4\" aria-hidden />}\n </button>\n );\n },\n);\nCarouselNext.displayName = \"Carousel.Next\";\n\n// ─────────────────────────────────────────────────────────────────────\n// Compose + export\n// ─────────────────────────────────────────────────────────────────────\n\nCarouselRoot.Slide = CarouselSlide;\nCarouselRoot.VideoSlide = CarouselVideoSlide;\nCarouselRoot.Dots = CarouselDots;\nCarouselRoot.Arrows = CarouselArrows;\nCarouselRoot.Prev = CarouselPrev;\nCarouselRoot.Next = CarouselNext;\n\nexport const Carousel = CarouselRoot;\n\nexport {\n CarouselSlide,\n CarouselVideoSlide,\n CarouselDots,\n CarouselArrows,\n CarouselPrev,\n CarouselNext,\n};\n\n// Headless escape hatch for consumers that want the embla api directly\n// (custom dots, thumbnail strips, programmatic control from outside the\n// tree). Returns `undefined` until embla has initialised.\nexport function useCarouselApi(): EmblaApi | undefined {\n const ctx = React.useContext(CarouselContext);\n return ctx?.api;\n}\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 \"gds-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 \"gds-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\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\n\n/**\n * Input variants — `size` lets dense surfaces (the Studio inspector,\n * settings sheets) reach for a compact `sm` input without hand-rolling\n * className overrides. Default keeps the existing h-9 padding /\n * text-base-md:text-sm so this is a no-op for every existing call\n * site.\n *\n * `pl-3 pr-3` is preserved verbatim from the original so the search-\n * input pattern (leading icon overrides `pl-*`) still wins via\n * twMerge. See packages/ui/components/ui/input.tsx for the full\n * rationale.\n */\nconst inputVariants = cva(\n \"flex w-full rounded-md border border-input bg-transparent shadow-sm transition-colors file:border-0 file:bg-transparent 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\",\n {\n variants: {\n size: {\n default: \"h-9 pl-3 pr-3 py-1 text-base file:text-sm md:text-sm\",\n sm: \"h-8 pl-2 pr-2 py-1 text-xs file:text-xs\",\n },\n },\n defaultVariants: { size: \"default\" },\n }\n);\n\ntype InputSize = NonNullable<VariantProps<typeof inputVariants>[\"size\"]>;\n\ntype InputProps = Omit<React.ComponentProps<\"input\">, \"size\"> & {\n size?: InputSize;\n};\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, size = \"default\", ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(inputVariants({ size }), className)}\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 { type DialogProps } from \"@radix-ui/react-dialog\"\nimport { Command as CommandPrimitive } from \"cmdk\"\nimport { Search } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Dialog, DialogContent, DialogTitle } from \"@/components/ui/dialog\"\n\nconst Command = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive\n ref={ref}\n className={cn(\n \"flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground\",\n className\n )}\n {...props}\n />\n))\nCommand.displayName = CommandPrimitive.displayName\n\nconst CommandDialog = ({ children, ...props }: DialogProps) => {\n return (\n <Dialog {...props}>\n <DialogContent className=\"overflow-hidden p-0\">\n <DialogTitle className=\"sr-only\">Search</DialogTitle>\n <Command className=\"[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\">\n {children}\n </Command>\n </DialogContent>\n </Dialog>\n )\n}\n\nconst CommandInput = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Input>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>\n>(({ className, ...props }, ref) => (\n <div className=\"flex items-center border-b px-3\" cmdk-input-wrapper=\"\">\n <Search className=\"mr-2 h-4 w-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n ref={ref}\n className={cn(\n \"flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n />\n </div>\n))\n\nCommandInput.displayName = CommandPrimitive.Input.displayName\n\nconst CommandList = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.List>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.List\n ref={ref}\n className={cn(\"max-h-[300px] overflow-y-auto overflow-x-hidden\", className)}\n {...props}\n />\n))\n\nCommandList.displayName = CommandPrimitive.List.displayName\n\nconst CommandEmpty = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Empty>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Empty>\n>((props, ref) => (\n <CommandPrimitive.Empty\n ref={ref}\n className=\"py-6 text-center text-sm\"\n {...props}\n />\n))\n\nCommandEmpty.displayName = CommandPrimitive.Empty.displayName\n\nconst CommandGroup = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Group>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Group>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Group\n ref={ref}\n className={cn(\n \"overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground\",\n className\n )}\n {...props}\n />\n))\n\nCommandGroup.displayName = CommandPrimitive.Group.displayName\n\nconst CommandSeparator = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 h-px bg-border\", className)}\n {...props}\n />\n))\nCommandSeparator.displayName = CommandPrimitive.Separator.displayName\n\nconst CommandItem = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex cursor-default gap-2 select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled=true]:pointer-events-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n className\n )}\n {...props}\n />\n))\n\nCommandItem.displayName = CommandPrimitive.Item.displayName\n\nconst CommandShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground\",\n className\n )}\n {...props}\n />\n )\n}\nCommandShortcut.displayName = \"CommandShortcut\"\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\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\n/**\n * MultiSelect — multi-pick combobox.\n *\n * Composes Popover + Command (cmdk) + Badge + Checkbox into the\n * pattern popularised by sersavan/shadcn-multi-select-component:\n *\n * - Trigger: a button that shows the currently-selected items as\n * removable Badges. Past `maxCount` selected items it collapses\n * into a \"+N more\" badge so the trigger doesn't grow forever.\n * - Open: a Popover containing a searchable Command list. Each\n * row is a checkable item; a leading icon is optional per\n * option.\n * - Footer actions: Select all · Clear · Close.\n *\n * Controlled and uncontrolled both supported (value / defaultValue\n * mirroring Radix conventions). Selection is `string[]` — the\n * caller pulls the matching option objects from their own `options`\n * array when needed.\n *\n * Data-driven via `options` rather than compound children. Multi-\n * select lists are typically dozens of items long; declaring each\n * one in JSX is noisy and the per-item icon prop doesn't have a\n * natural children-API equivalent. A compound API (`MultiSelect.Item`)\n * could land later for the few cases that need fully custom rendering.\n *\n * Theming: visual surfaces (popover bg, badge fill, focus rings)\n * inherit from the theme tokens the underlying Popover / Badge /\n * Checkbox already read from. No new `--gds-multi-select-*` vars\n * needed yet; if/when callers want to retune density (e.g. a\n * compact variant), add them then.\n */\n\nimport * as React from \"react\";\nimport { Check, ChevronDown, X, XCircle } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { Badge } from \"@/components/ui/badge\";\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n} from \"@/components/ui/command\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@/components/ui/popover\";\nimport { Separator } from \"@/components/ui/separator\";\n\nexport interface MultiSelectOption {\n /** Value stored in selection. Must be unique. */\n value: string;\n /** Display label for the dropdown row and selected badge. */\n label: string;\n /** Optional lucide-style icon component (or any React component\n * accepting a className). Rendered both in the dropdown row and\n * on the badge. */\n icon?: React.ComponentType<{ className?: string }>;\n /** Disables the row in the dropdown — selection is locked in\n * whichever state it's currently in. */\n disabled?: boolean;\n}\n\nexport interface MultiSelectProps {\n /** The full pool of selectable items. */\n options: MultiSelectOption[];\n /** Controlled value. When provided, `onValueChange` MUST be wired\n * or the component becomes a read-only display of `value`. */\n value?: string[];\n /** Uncontrolled initial value. Ignored if `value` is provided. */\n defaultValue?: string[];\n /** Fired whenever the selection changes. The full next selection\n * is passed — caller doesn't need to reconcile add/remove. */\n onValueChange?: (next: string[]) => void;\n /** Placeholder text on the trigger when nothing is selected. */\n placeholder?: string;\n /** Search-input placeholder. Default \"Search…\". */\n searchPlaceholder?: string;\n /** Message rendered when search returns no rows. */\n emptyMessage?: string;\n /** Max badges to show on the trigger before collapsing to\n * `+N more`. Default 3. Pass `Infinity` to never collapse. */\n maxCount?: number;\n /** Hide the Search input. Useful for short option lists. */\n searchable?: boolean;\n /** Hide the per-badge × button. Selected items can still be\n * toggled off through the dropdown. */\n badgeDismissible?: boolean;\n /** Disable the whole control. */\n disabled?: boolean;\n /** Drives Popover's `modal` prop — when true, clicks outside the\n * dropdown don't dismiss it until an explicit close. Default false. */\n modalPopover?: boolean;\n /** Extra classes on the trigger. */\n className?: string;\n /** Forwarded to the trigger button for tests / Studio selection. */\n id?: string;\n \"aria-label\"?: string;\n}\n\nconst DEFAULT_MAX_COUNT = 3;\n\nexport const MultiSelect = React.forwardRef<\n HTMLButtonElement,\n MultiSelectProps\n>(function MultiSelect(\n {\n options,\n value: controlledValue,\n defaultValue,\n onValueChange,\n placeholder = \"Select…\",\n searchPlaceholder = \"Search…\",\n emptyMessage = \"Nothing matches.\",\n maxCount = DEFAULT_MAX_COUNT,\n searchable = true,\n badgeDismissible = true,\n disabled = false,\n modalPopover = false,\n className,\n id,\n \"aria-label\": ariaLabel,\n ...rest\n },\n ref,\n) {\n const isControlled = controlledValue !== undefined;\n const [internalValue, setInternalValue] = React.useState<string[]>(\n defaultValue ?? [],\n );\n const value = isControlled ? controlledValue! : internalValue;\n const [open, setOpen] = React.useState(false);\n\n // Build a quick lookup so we can render selected badges in selection\n // order without re-scanning `options` on every render.\n const optionByValue = React.useMemo(() => {\n const map = new Map<string, MultiSelectOption>();\n for (const opt of options) map.set(opt.value, opt);\n return map;\n }, [options]);\n\n const commit = React.useCallback(\n (next: string[]) => {\n if (!isControlled) setInternalValue(next);\n onValueChange?.(next);\n },\n [isControlled, onValueChange],\n );\n\n const toggle = (v: string) => {\n if (value.includes(v)) {\n commit(value.filter((x) => x !== v));\n } else {\n commit([...value, v]);\n }\n };\n\n const removeOne = (e: React.MouseEvent | React.KeyboardEvent, v: string) => {\n e.preventDefault();\n e.stopPropagation();\n commit(value.filter((x) => x !== v));\n };\n\n const clearAll = (e?: React.MouseEvent | React.KeyboardEvent) => {\n e?.preventDefault();\n e?.stopPropagation();\n commit([]);\n };\n\n const selectAll = () => {\n const enabled = options.filter((o) => !o.disabled).map((o) => o.value);\n commit(enabled);\n };\n\n const allSelected =\n options.length > 0 &&\n options\n .filter((o) => !o.disabled)\n .every((o) => value.includes(o.value));\n\n const visibleBadgeValues = value.slice(0, maxCount);\n const overflowCount = Math.max(0, value.length - maxCount);\n\n return (\n <Popover open={open} onOpenChange={setOpen} modal={modalPopover}>\n <PopoverTrigger asChild>\n <button\n ref={ref}\n type=\"button\"\n id={id}\n role=\"combobox\"\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n aria-label={ariaLabel}\n disabled={disabled}\n data-gds-part=\"multi-select\"\n className={cn(\n // Match Input's surface — same min-height, padding, border,\n // focus ring — so MultiSelect lines up with form siblings.\n \"flex min-h-9 w-full items-center justify-between gap-2 rounded-md border border-input bg-transparent pl-2 pr-2 text-sm shadow-sm\",\n \"ring-offset-background placeholder:text-muted-foreground\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"[&[data-state=open]]:ring-1 [&[data-state=open]]:ring-ring\",\n className,\n )}\n >\n {value.length === 0 ? (\n <span className=\"text-muted-foreground px-1\">{placeholder}</span>\n ) : (\n <div\n className=\"flex flex-1 flex-wrap items-center gap-1 py-1\"\n data-gds-part=\"multi-select-badges\"\n >\n {visibleBadgeValues.map((v) => {\n const opt = optionByValue.get(v);\n if (!opt) return null;\n const Icon = opt.icon;\n return (\n <Badge\n key={v}\n variant=\"secondary\"\n className=\"gap-1 pr-1\"\n data-gds-part=\"multi-select-badge\"\n >\n {Icon ? <Icon className=\"h-3 w-3\" /> : null}\n <span className=\"truncate max-w-[12rem]\">{opt.label}</span>\n {badgeDismissible && !disabled && (\n <span\n role=\"button\"\n aria-label={`Remove ${opt.label}`}\n tabIndex={0}\n onClick={(e) => removeOne(e, v)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n removeOne(e, v);\n }\n }}\n className=\"ml-0.5 inline-flex h-4 w-4 cursor-pointer items-center justify-center rounded-sm hover:bg-muted-foreground/20\"\n >\n <X className=\"h-3 w-3\" aria-hidden />\n </span>\n )}\n </Badge>\n );\n })}\n {overflowCount > 0 && (\n <Badge\n variant=\"outline\"\n className=\"text-muted-foreground\"\n data-gds-part=\"multi-select-overflow\"\n title={value\n .slice(maxCount)\n .map((v) => optionByValue.get(v)?.label ?? v)\n .join(\", \")}\n >\n +{overflowCount} more\n </Badge>\n )}\n </div>\n )}\n <div className=\"flex shrink-0 items-center gap-1\">\n {value.length > 0 && !disabled && (\n <span\n role=\"button\"\n aria-label=\"Clear all\"\n tabIndex={0}\n onClick={(e) => clearAll(e)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") clearAll(e);\n }}\n className=\"inline-flex h-5 w-5 cursor-pointer items-center justify-center rounded-sm text-muted-foreground hover:text-foreground hover:bg-muted\"\n >\n <XCircle className=\"h-3.5 w-3.5\" aria-hidden />\n </span>\n )}\n <ChevronDown\n className=\"h-4 w-4 shrink-0 text-muted-foreground\"\n aria-hidden\n />\n </div>\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"start\"\n className=\"w-[var(--radix-popover-trigger-width)] p-0\"\n data-gds-part=\"multi-select-content\"\n >\n <Command>\n {searchable && <CommandInput placeholder={searchPlaceholder} />}\n <CommandList>\n <CommandEmpty>{emptyMessage}</CommandEmpty>\n <CommandGroup>\n {options.map((opt) => {\n const Icon = opt.icon;\n const selected = value.includes(opt.value);\n return (\n <CommandItem\n key={opt.value}\n value={opt.label}\n onSelect={() => toggle(opt.value)}\n disabled={opt.disabled}\n data-gds-part=\"multi-select-item\"\n data-selected={selected || undefined}\n >\n <div\n className={cn(\n \"mr-2 flex h-4 w-4 shrink-0 items-center justify-center rounded-sm border border-primary\",\n selected\n ? \"bg-primary text-primary-foreground\"\n : \"opacity-50 [&_svg]:invisible\",\n )}\n aria-hidden\n >\n <Check className=\"h-3 w-3\" />\n </div>\n {Icon ? (\n <Icon className=\"mr-2 h-4 w-4 text-muted-foreground\" />\n ) : null}\n <span className=\"truncate\">{opt.label}</span>\n </CommandItem>\n );\n })}\n </CommandGroup>\n <CommandSeparator />\n <CommandGroup>\n <div className=\"flex items-center justify-between gap-1 p-1\">\n <CommandItem\n onSelect={selectAll}\n className=\"flex-1 justify-center text-xs\"\n disabled={allSelected}\n >\n Select all\n </CommandItem>\n <Separator orientation=\"vertical\" className=\"h-5\" />\n <CommandItem\n onSelect={() => clearAll()}\n className=\"flex-1 justify-center text-xs\"\n disabled={value.length === 0}\n >\n Clear\n </CommandItem>\n <Separator orientation=\"vertical\" className=\"h-5\" />\n <CommandItem\n onSelect={() => setOpen(false)}\n className=\"flex-1 justify-center text-xs\"\n >\n Close\n </CommandItem>\n </div>\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n );\n});\nMultiSelect.displayName = \"MultiSelect\";\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","\"use client\";\n\nimport * as React from \"react\";\nimport { GripVertical } from \"lucide-react\";\nimport * as ResizablePrimitive from \"react-resizable-panels\";\n\nimport { cn } from \"@/lib/utils\";\n\n/**\n * Resizable — drag-to-adjust panel groups.\n *\n * Thin wrapper over `react-resizable-panels` so consumers can compose\n * persistently-sized splits (e.g. nav + main, list + detail, three-pane\n * with adjustable middle column) without owning the layout primitives.\n *\n * Use this when you want USER-adjustable column widths. For static layouts\n * with a fixed-width middle column, prefer `<AppShell nav=\"three-pane\">`\n * — that's a plain CSS grid with no JS.\n *\n * Layout-shape parity:\n * - `direction=\"horizontal\"` → ResizableHandle is vertical (the divider\n * between two columns)\n * - `direction=\"vertical\"` → ResizableHandle is horizontal (the divider\n * between two rows)\n *\n * Persisting layout: pass `id` to ResizablePanelGroup and `id` to each\n * ResizablePanel; react-resizable-panels writes layout to localStorage\n * under that id so the user's preferred sizes survive reloads.\n *\n * Example:\n *\n * <ResizablePanelGroup direction=\"horizontal\" id=\"inbox-shell\">\n * <ResizablePanel defaultSize={20} minSize={15} id=\"nav\">\n * <Sidebar />\n * </ResizablePanel>\n * <ResizableHandle withHandle />\n * <ResizablePanel defaultSize={30} minSize={20} id=\"list\">\n * <ThreadList />\n * </ResizablePanel>\n * <ResizableHandle />\n * <ResizablePanel defaultSize={50} id=\"detail\">\n * <ThreadDetail />\n * </ResizablePanel>\n * </ResizablePanelGroup>\n */\nconst ResizablePanelGroup = ({\n className,\n ...props\n}: React.ComponentProps<typeof ResizablePrimitive.PanelGroup>) => (\n <ResizablePrimitive.PanelGroup\n data-gds-part=\"resizable-panel-group\"\n className={cn(\n \"flex h-full w-full data-[panel-group-direction=vertical]:flex-col\",\n className\n )}\n {...props}\n />\n);\n\nconst ResizablePanel = ResizablePrimitive.Panel;\n\nconst ResizableHandle = ({\n withHandle,\n className,\n ...props\n}: React.ComponentProps<typeof ResizablePrimitive.PanelResizeHandle> & {\n /** When true, render a visible grip handle in the middle of the divider\n * for affordance. Without this, the handle is just a 1px hit area —\n * fine for power-user tools, harder to discover for everyone else. */\n withHandle?: boolean;\n}) => (\n <ResizablePrimitive.PanelResizeHandle\n data-gds-part=\"resizable-handle\"\n className={cn(\n \"relative flex w-px items-center justify-center bg-border after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 data-[panel-group-direction=vertical]:h-px data-[panel-group-direction=vertical]:w-full data-[panel-group-direction=vertical]:after:left-0 data-[panel-group-direction=vertical]:after:h-1 data-[panel-group-direction=vertical]:after:w-full data-[panel-group-direction=vertical]:after:-translate-y-1/2 data-[panel-group-direction=vertical]:after:translate-x-0 [&[data-panel-group-direction=vertical]>div]:rotate-90\",\n className\n )}\n {...props}\n >\n {withHandle && (\n <div className=\"z-10 flex h-4 w-3 items-center justify-center rounded-sm border bg-border\">\n <GripVertical className=\"h-2.5 w-2.5\" />\n </div>\n )}\n </ResizablePrimitive.PanelResizeHandle>\n);\n\nexport { ResizablePanelGroup, ResizablePanel, ResizableHandle };\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(\"gds-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(\"gds-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(\"gds-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 { cva, type VariantProps } from \"class-variance-authority\";\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\n/**\n * Select trigger variants — `size` lets dense surfaces (the\n * Studio inspector, settings sheets) reach for a compact `sm`\n * trigger without hand-rolling className overrides. Default keeps\n * the existing h-10 / px-3 / text-sm so this is a no-op for every\n * existing call site.\n */\nconst selectTriggerVariants = cva(\n \"flex w-full items-center justify-between rounded-md border border-input bg-background 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 {\n variants: {\n size: {\n default: \"h-10 px-3 py-2 text-sm\",\n sm: \"h-8 px-2 py-1 text-xs\",\n },\n },\n defaultVariants: { size: \"default\" },\n }\n);\n\ntype SelectTriggerSize = NonNullable<\n VariantProps<typeof selectTriggerVariants>[\"size\"]\n>;\n\nconst SelectTrigger = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger> & {\n size?: SelectTriggerSize;\n }\n>(({ className, children, size = \"default\", ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(selectTriggerVariants({ size }), className)}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown\n className={cn(\n \"opacity-50\",\n size === \"sm\" ? \"h-3.5 w-3.5\" : \"h-4 w-4\"\n )}\n />\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 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","\"use client\";\n\n/**\n * Sortable — compound drag-to-reorder primitive built on dnd-kit.\n *\n * The orchestrator (`<Sortable>`) owns the DndContext + SortableContext;\n * items (`<Sortable.Item>`) attach the `useSortable` hook + transform\n * styles to whatever you put inside them. An optional `<Sortable.Handle>`\n * scopes the drag activation to a specific child element (drag-by-grip\n * instead of drag-by-whole-row).\n *\n * Design choices that may surprise you:\n *\n * - Layout primitives (Stack, Row, Grid) stay PURE — they don't grow\n * a `sortable` prop. The reorder behaviour lives on its own\n * primitive that composes with any layout:\n * `<Sortable><Stack>...</Stack></Sortable>` works.\n * `<Sortable strategy=\"grid\"><Grid cols={3}>...</Grid></Sortable>`\n * too. This matches the dnd-kit / framer Reorder pattern and\n * keeps each component's contract tight.\n *\n * - `values` is the source of truth, not the children. The model is\n * `state -> children`, so reorder fires `onReorder(newValues)` and\n * the consumer updates state; React re-renders children in the\n * new order. Trying to read children's keys + mutate them is\n * fighting React's data-flow.\n *\n * - Item identity is `value`, NOT `key`. Items must have a unique\n * `value` prop that matches one entry in `values`. We deliberately\n * don't auto-derive from `key` because React lifts keys out of\n * children before we can read them, AND because the value carries\n * more semantic weight than a render-time key.\n *\n * - Cross-container drag (the \"drag from To Do to Done\" kanban case)\n * is NOT covered by v1. That needs one DndContext above multiple\n * SortableContexts — planned as `<Sortable.Group>` follow-up. For\n * now, each `<Sortable>` is its own world. Single-list reorder,\n * single-grid reorder, single-horizontal-row reorder all work.\n *\n * - Theming: no new tokens. dnd-kit handles the transform CSS;\n * visual treatment (drop shadow on the active item, slight\n * scale, etc.) is applied via opt-in className on the item.\n */\n\nimport * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport {\n DndContext,\n KeyboardSensor,\n PointerSensor,\n closestCenter,\n closestCorners,\n useDroppable,\n useSensor,\n useSensors,\n type DragEndEvent,\n type UniqueIdentifier,\n} from \"@dnd-kit/core\";\nimport {\n SortableContext,\n arrayMove,\n horizontalListSortingStrategy,\n rectSortingStrategy,\n sortableKeyboardCoordinates,\n useSortable,\n verticalListSortingStrategy,\n type SortingStrategy,\n} from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\n\nimport { cn } from \"@/lib/utils\";\n\n// ─── Context ──────────────────────────────────────────────────────────\n\ntype SortableStrategy = \"vertical\" | \"horizontal\" | \"grid\";\n\nconst STRATEGY_BY_NAME: Record<SortableStrategy, SortingStrategy> = {\n vertical: verticalListSortingStrategy,\n horizontal: horizontalListSortingStrategy,\n grid: rectSortingStrategy,\n};\n\ninterface SortableContextValue {\n /** Whether the parent Sortable is currently disabled — propagated to\n * Item so its drag handlers no-op without us reaching into props on\n * every item. */\n disabled: boolean;\n}\n\nconst SortableRootContext = React.createContext<SortableContextValue | null>(null);\n\n// ─── Group (cross-container) ──────────────────────────────────────────\n//\n// dnd-kit's standard pattern for kanban-style cross-container drag uses\n// ONE DndContext above MULTIPLE SortableContexts. Each container\n// registers its `values` + `onReorder` with the Group via context; on\n// drag-end the Group routes the event:\n//\n// same container → that container's onReorder(new order)\n// cross container → source.onReorder(without id) + dest.onReorder(with id inserted)\n//\n// Sortable auto-detects whether it's inside a Group via context — when\n// it is, it skips its own DndContext mount and registers with the Group\n// instead. Standalone Sortable (no Group) keeps working exactly as\n// before. No breaking change for the kanban-board scaffold (which used\n// 3 independent Sortables); migrating to Sortable.Group is opt-in for\n// cross-column drag.\n\ninterface RegisteredContainer<T extends UniqueIdentifier = UniqueIdentifier> {\n id: string;\n values: T[];\n onReorder?: (next: T[]) => void;\n}\n\ninterface SortableGroupContextValue {\n registerContainer: <T extends UniqueIdentifier>(\n container: RegisteredContainer<T>,\n ) => () => void;\n}\n\nconst SortableGroupContext = React.createContext<SortableGroupContextValue | null>(\n null,\n);\n\nexport interface SortableGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Disable drag for every container inside the Group. */\n disabled?: boolean;\n}\n\nexport const SortableGroup = React.forwardRef<HTMLDivElement, SortableGroupProps>(\n function SortableGroup({ disabled = false, className, children, ...rest }, ref) {\n // Registry of child containers. Each Sortable inside the Group\n // self-registers via the context's registerContainer helper. Stored\n // in a ref so the registry mutations don't trigger Group re-renders\n // on every Sortable mount; we read the live snapshot inside the\n // drag handlers.\n const registryRef = React.useRef<Map<string, RegisteredContainer>>(\n new Map(),\n );\n\n const registerContainer = React.useCallback(\n <T extends UniqueIdentifier>(container: RegisteredContainer<T>): (() => void) => {\n registryRef.current.set(\n container.id,\n container as unknown as RegisteredContainer,\n );\n return () => {\n registryRef.current.delete(container.id);\n };\n },\n [],\n );\n\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 4 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }),\n );\n\n // Find which container an id lives in. Containers can also be drop\n // targets themselves (when a column is empty, the `over.id` IS the\n // column's id, not an item id) — handle both cases.\n const findContainerForId = (id: UniqueIdentifier): RegisteredContainer | null => {\n const registry = registryRef.current;\n // Direct hit: the id IS a container id.\n const direct = registry.get(String(id));\n if (direct) return direct;\n // Otherwise it's an item id — find the container whose values\n // array contains it.\n for (const container of registry.values()) {\n if (container.values.some((v) => v === id)) return container;\n }\n return null;\n };\n\n const handleDragEnd = React.useCallback((event: DragEndEvent) => {\n if (disabled) return;\n const { active, over } = event;\n if (!over) return;\n const source = findContainerForId(active.id);\n const dest = findContainerForId(over.id);\n if (!source || !dest) return;\n\n if (source.id === dest.id) {\n // Same-container reorder. Same shape as standalone Sortable.\n if (active.id === over.id) return;\n const oldIndex = source.values.findIndex((v) => v === active.id);\n const newIndex = source.values.findIndex((v) => v === over.id);\n if (oldIndex === -1 || newIndex === -1) return;\n source.onReorder?.(arrayMove(source.values, oldIndex, newIndex));\n return;\n }\n\n // Cross-container move. Remove from source, insert into dest at\n // the index of the over.id (or at the end if dropped on the\n // container itself).\n const sourceNext = source.values.filter((v) => v !== active.id);\n const destIndex =\n over.id === dest.id\n ? dest.values.length\n : Math.max(0, dest.values.findIndex((v) => v === over.id));\n const destNext = [\n ...dest.values.slice(0, destIndex),\n active.id,\n ...dest.values.slice(destIndex),\n ];\n source.onReorder?.(sourceNext);\n dest.onReorder?.(destNext);\n }, [disabled]);\n\n // `closestCorners` is the recommended collision detector for\n // multi-container sortable — it works better than `closestCenter`\n // when an item is dragged near the edge of one container into\n // another. The Sortable-without-Group path keeps closestCenter.\n return (\n <SortableGroupContext.Provider value={{ registerContainer }}>\n <DndContext\n sensors={sensors}\n collisionDetection={closestCorners}\n onDragEnd={handleDragEnd}\n >\n <div\n ref={ref}\n data-gds-part=\"sortable-group\"\n data-disabled={disabled || undefined}\n className={cn(className)}\n {...rest}\n >\n {children}\n </div>\n </DndContext>\n </SortableGroupContext.Provider>\n );\n },\n);\nSortableGroup.displayName = \"Sortable.Group\";\n\n// ─── Root ─────────────────────────────────────────────────────────────\n\nexport interface SortableProps<T extends UniqueIdentifier = UniqueIdentifier>\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\" | \"id\"> {\n /** Ordered list of unique ids — strings or numbers. Source of truth\n * for the order; reorder fires `onReorder(newValues)` and the\n * consumer updates their state. */\n values: T[];\n /** Fired with the full new order after a drag-end that changed it.\n * Drags that snap back (drop on origin) DON'T fire — only real\n * reorders. */\n onReorder?: (next: T[]) => void;\n /** Layout direction the sort strategy assumes.\n * `vertical` (default) — stacked column of items, drag up/down.\n * `horizontal` — row of items, drag left/right.\n * `grid` — 2D wrap, drag in any direction.\n * Match this to the layout your items render in. */\n strategy?: SortableStrategy;\n /** Disable drag on every item without rebuilding the tree. */\n disabled?: boolean;\n /** Stable container id — required when this Sortable is nested\n * inside a `Sortable.Group` for cross-container drag (the Group\n * routes drag-end events by container id). Optional for standalone\n * Sortable; auto-generated via React.useId when omitted. */\n id?: string;\n}\n\n// Compound-component type pattern matched against the other roots in\n// this codebase (Carousel, Sidebar). Non-generic on the callable\n// signature — TS still infers `values: string[]` at the call site,\n// we lose only the rare \"values: SymbolicId[]\" inference, which no\n// real consumer needs.\ninterface SortableRootComponent\n extends React.ForwardRefExoticComponent<\n SortableProps & React.RefAttributes<HTMLDivElement>\n > {\n Item: typeof SortableItem;\n Handle: typeof SortableHandle;\n Group: typeof SortableGroup;\n}\n\nconst SortableImpl = React.forwardRef<HTMLDivElement, SortableProps>(\n function Sortable(\n {\n values,\n onReorder,\n strategy = \"vertical\",\n disabled = false,\n id,\n className,\n children,\n ...rest\n },\n ref,\n ) {\n // Auto-detect Sortable.Group enclosure. Inside a Group we skip\n // our own DndContext + sensors (the Group owns them) and register\n // ourselves so cross-container drag-end routing works. Standalone\n // Sortable keeps its old behaviour unchanged.\n const group = React.useContext(SortableGroupContext);\n const inGroup = group !== null;\n\n // Container id — required for Group registration AND for the\n // useDroppable wrapper that makes the container itself a drop\n // target for empty columns. Auto-generated when not passed; pass\n // a stable id explicitly in cross-container setups for legibility.\n const fallbackId = React.useId();\n const containerId = id ?? fallbackId;\n\n // Register with the Group on every values/onReorder change so its\n // drag-end handler sees the live snapshot.\n React.useEffect(() => {\n if (!inGroup) return;\n return group!.registerContainer({\n id: containerId,\n values,\n onReorder,\n });\n }, [inGroup, group, containerId, values, onReorder]);\n\n const sensors = useSensors(\n // PointerSensor with activation distance — drag doesn't fire on\n // a click, only after a few pixels of pointer movement. Keeps\n // clickable items (a Card with an onClick, a Button inside the\n // row) working without every press immediately stealing as drag.\n useSensor(PointerSensor, { activationConstraint: { distance: 4 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }),\n );\n\n const handleStandaloneDragEnd = React.useCallback(\n (event: DragEndEvent) => {\n const { active, over } = event;\n if (!over || active.id === over.id) return;\n const oldIndex = values.findIndex((v) => v === active.id);\n const newIndex = values.findIndex((v) => v === over.id);\n if (oldIndex === -1 || newIndex === -1) return;\n onReorder?.(arrayMove(values, oldIndex, newIndex) as typeof values);\n },\n [values, onReorder],\n );\n\n const ctx = React.useMemo<SortableContextValue>(\n () => ({ disabled }),\n [disabled],\n );\n\n // Shared body — SortableContext + the (possibly-droppable) container.\n const body = (\n <SortableContext items={values} strategy={STRATEGY_BY_NAME[strategy]}>\n <ContainerDroppable\n id={containerId}\n enabled={inGroup}\n forwardedRef={ref}\n strategy={strategy}\n disabled={disabled}\n className={className}\n {...rest}\n >\n {children}\n </ContainerDroppable>\n </SortableContext>\n );\n\n // In-Group: skip the DndContext (Group has it).\n if (inGroup) {\n return (\n <SortableRootContext.Provider value={ctx}>\n {body}\n </SortableRootContext.Provider>\n );\n }\n\n // Standalone — original behaviour.\n return (\n <SortableRootContext.Provider value={ctx}>\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragEnd={handleStandaloneDragEnd}\n >\n {body}\n </DndContext>\n </SortableRootContext.Provider>\n );\n },\n) as unknown as SortableRootComponent;\nSortableImpl.displayName = \"Sortable\";\n\n/**\n * Inner wrapper that registers the container itself as a droppable\n * target when inside a Group — empty columns need this so the user\n * can drop an item into an otherwise-empty container. Outside a\n * Group, useDroppable is a no-op for collision purposes (dnd-kit's\n * collision detection only considers the items inside).\n */\nfunction ContainerDroppable({\n id,\n enabled,\n forwardedRef,\n strategy,\n disabled,\n className,\n children,\n ...rest\n}: {\n id: string;\n enabled: boolean;\n forwardedRef: React.ForwardedRef<HTMLDivElement>;\n strategy: SortableStrategy;\n disabled: boolean;\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLDivElement>) {\n const droppable = useDroppable({ id, disabled: !enabled });\n const composedRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n if (enabled) droppable.setNodeRef(node);\n if (typeof forwardedRef === \"function\") forwardedRef(node);\n else if (forwardedRef) forwardedRef.current = node;\n },\n [enabled, droppable, forwardedRef],\n );\n return (\n <div\n ref={composedRef}\n data-gds-part=\"sortable\"\n data-strategy={strategy}\n data-disabled={disabled || undefined}\n className={cn(className)}\n {...rest}\n >\n {children}\n </div>\n );\n}\n\n// ─── Item ─────────────────────────────────────────────────────────────\n\n/** Context passed from Item down to a (potentially nested) Handle so it\n * can attach the drag listeners only to that specific child element. */\ninterface SortableItemContextValue {\n listeners: ReturnType<typeof useSortable>[\"listeners\"];\n setActivatorNodeRef: ReturnType<typeof useSortable>[\"setActivatorNodeRef\"];\n /** True when the consumer used <Sortable.Handle> inside the Item —\n * flips the Item's own listeners off so the handle has exclusive\n * drag activation. Tracked via a sentinel set by Handle on mount. */\n hasHandle: React.MutableRefObject<boolean>;\n disabled: boolean;\n}\n\nconst SortableItemInternalContext =\n React.createContext<SortableItemContextValue | null>(null);\n\nexport interface SortableItemProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Must match one of the parent `<Sortable values>` entries.\n * Identity, not React key. */\n value: UniqueIdentifier;\n /** Render the item as its child element via Radix Slot — useful when\n * the wrapping div would mess with your layout (e.g. inside Table\n * rows). */\n asChild?: boolean;\n /** Disable drag for THIS item without disabling the whole Sortable. */\n disabled?: boolean;\n}\n\nconst SortableItem = React.forwardRef<HTMLDivElement, SortableItemProps>(\n function SortableItem(\n { value, asChild = false, disabled: itemDisabled, className, style, children, ...rest },\n forwardedRef,\n ) {\n const root = React.useContext(SortableRootContext);\n if (!root) {\n throw new Error(\"<Sortable.Item> must be rendered inside <Sortable>.\");\n }\n const disabled = root.disabled || itemDisabled || false;\n\n const {\n attributes,\n listeners,\n setNodeRef,\n setActivatorNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: value, disabled });\n\n // Track whether the consumer mounted a Handle inside this Item.\n // When they DID, the Item's own listeners get dropped (the handle\n // has exclusive drag activation). When they didn't, the whole\n // Item is the drag activator. Tracked via ref + useEffect to\n // avoid a re-render dance.\n const hasHandleRef = React.useRef(false);\n\n // Compose forwarded ref with dnd-kit's setNodeRef.\n const composedRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n setNodeRef(node);\n if (typeof forwardedRef === \"function\") forwardedRef(node);\n else if (forwardedRef) forwardedRef.current = node;\n },\n [setNodeRef, forwardedRef],\n );\n\n const itemCtx = React.useMemo<SortableItemContextValue>(\n () => ({\n listeners,\n setActivatorNodeRef,\n hasHandle: hasHandleRef,\n disabled,\n }),\n [listeners, setActivatorNodeRef, disabled],\n );\n\n const composedStyle: React.CSSProperties = {\n transform: CSS.Transform.toString(transform),\n transition,\n // Subtle lift while dragging — opt-out via className override.\n zIndex: isDragging ? 1 : undefined,\n cursor: disabled\n ? \"default\"\n : hasHandleRef.current\n ? undefined\n : \"grab\",\n ...style,\n };\n\n const Comp = asChild ? Slot : \"div\";\n\n // We attach the activation listeners to the WHOLE item by default,\n // but when a Handle is mounted later, useEffect inside the Handle\n // flips the hasHandle ref AND the Handle attaches the same\n // listeners to itself. The Item-level listeners stay attached but\n // dnd-kit's activator-node-ref (set by Handle) wins for collision\n // origin purposes — net effect: only the handle activates drag.\n return (\n <SortableItemInternalContext.Provider value={itemCtx}>\n <Comp\n ref={composedRef}\n data-gds-part=\"sortable-item\"\n data-value={String(value)}\n data-dragging={isDragging || undefined}\n className={cn(className)}\n style={composedStyle}\n {...attributes}\n {...(hasHandleRef.current ? {} : listeners)}\n {...rest}\n >\n {children}\n </Comp>\n </SortableItemInternalContext.Provider>\n );\n },\n);\nSortableItem.displayName = \"Sortable.Item\";\n\n// ─── Handle ───────────────────────────────────────────────────────────\n\nexport interface SortableHandleProps extends React.HTMLAttributes<HTMLElement> {\n /** Render as the child element via Slot — typical pattern is\n * `<Sortable.Handle asChild><Button variant=\"ghost\" size=\"icon\">…</Button></Sortable.Handle>`. */\n asChild?: boolean;\n}\n\nconst SortableHandle = React.forwardRef<HTMLElement, SortableHandleProps>(\n function SortableHandle({ asChild = false, className, children, ...rest }, ref) {\n const itemCtx = React.useContext(SortableItemInternalContext);\n if (!itemCtx) {\n throw new Error(\n \"<Sortable.Handle> must be rendered inside <Sortable.Item>.\",\n );\n }\n\n // Flip the sentinel on mount so the Item drops its own listeners.\n // Done in a layout effect so it runs before paint and the cursor\n // doesn't briefly show \"grab\" on the whole item.\n React.useLayoutEffect(() => {\n itemCtx.hasHandle.current = true;\n return () => {\n itemCtx.hasHandle.current = false;\n };\n }, [itemCtx.hasHandle]);\n\n const composedRef = React.useCallback(\n (node: HTMLElement | null) => {\n itemCtx.setActivatorNodeRef(node);\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n },\n [itemCtx, ref],\n );\n\n const sharedProps = {\n \"data-gds-part\": \"sortable-handle\",\n \"aria-label\": \"Drag to reorder\" as string,\n className: cn(\n \"cursor-grab touch-none select-none\",\n itemCtx.disabled && \"cursor-default opacity-50\",\n className,\n ),\n ...(itemCtx.disabled ? {} : itemCtx.listeners),\n ...rest,\n };\n\n // Two branches with the proper ref types — Slot wants\n // Ref<HTMLElement>, button wants Ref<HTMLButtonElement>. The\n // polymorphic single-Comp variant would require an `as any` cast\n // to satisfy both; splitting is uglier source but cleaner types.\n if (asChild) {\n return (\n <Slot\n ref={composedRef as React.Ref<HTMLElement>}\n {...sharedProps}\n >\n {children}\n </Slot>\n );\n }\n return (\n <button\n type=\"button\"\n ref={composedRef as React.Ref<HTMLButtonElement>}\n {...sharedProps}\n >\n {children}\n </button>\n );\n },\n);\nSortableHandle.displayName = \"Sortable.Handle\";\n\n// ─── Compose + export ─────────────────────────────────────────────────\n\nSortableImpl.Item = SortableItem;\nSortableImpl.Handle = SortableHandle;\nSortableImpl.Group = SortableGroup;\n\nexport const Sortable = SortableImpl as SortableRootComponent;\n// SortableGroup is already exported inline at its declaration above.\nexport { SortableItem, SortableHandle };\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(\"gds-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 * Main-axis (vertical) distribution. Added to mirror Row's `justify`\n * so consumers stop reaching for `flex flex-col justify-end` inline\n * on absolute-positioned heroes, footer pinning, etc. Default `start`\n * keeps the historical behaviour (children pack to the top) and the\n * full distribution scale matches CSS `justify-content`.\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 },\n defaultVariants: {\n gap: \"md\",\n align: \"stretch\",\n justify: \"start\",\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, justify, 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, justify, 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 { Check, ChevronDown, ChevronRight, MoreHorizontal } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Popover, PopoverContent, PopoverTrigger } from \"./popover\"\n\n/**\n * Breadcrumb — composable navigation primitive.\n *\n * Pure surface-less component (no background, no border, no sticky\n * positioning). Density matches `TabsTrigger` so a breadcrumb row\n * placed above a tab strip — or alongside one — reads at the same\n * scale.\n *\n * Composition is shadcn-flavoured:\n *\n * <Breadcrumb>\n * <BreadcrumbList>\n * <BreadcrumbItem>\n * <BreadcrumbLink onClick={onBack}>All screens</BreadcrumbLink>\n * </BreadcrumbItem>\n * <BreadcrumbSeparator />\n * <BreadcrumbItem>\n * <BreadcrumbPage>Pricing</BreadcrumbPage>\n * </BreadcrumbItem>\n * </BreadcrumbList>\n * </Breadcrumb>\n *\n * Note: the `TopMenu` component in this package wraps the same\n * breadcrumb idea in an app-bar surface (sticky, bordered, padded).\n * Use TopMenu when you want the full app-shell chrome; use\n * Breadcrumb on its own when you want navigation embedded inside an\n * existing surface (e.g. inside the Studio canvas).\n */\n\n// Separator inheritance context. Set on the Breadcrumb root via the\n// `separator` prop; every <BreadcrumbSeparator/> below it that doesn't\n// pass its own children reads from here. Per-instance children still\n// win — useful for \"different separator just before the current page\"\n// designs.\nconst BreadcrumbSeparatorContext = React.createContext<React.ReactNode>(\n <ChevronRight />,\n)\n\nexport interface BreadcrumbProps extends React.ComponentPropsWithoutRef<\"nav\"> {\n /** Default separator node for every <BreadcrumbSeparator/> inside this\n * tree. Pass a string (\"/\", \"›\", \"•\"), a lucide icon (<Slash />,\n * <ChevronRight />), or any ReactNode. Default: <ChevronRight />.\n * Per-instance `<BreadcrumbSeparator>children</BreadcrumbSeparator>`\n * still overrides. */\n separator?: React.ReactNode\n}\n\nconst Breadcrumb = React.forwardRef<HTMLElement, BreadcrumbProps>(\n ({ separator, children, ...props }, ref) => (\n <BreadcrumbSeparatorContext.Provider value={separator ?? <ChevronRight />}>\n <nav ref={ref} aria-label=\"breadcrumb\" {...props}>\n {children}\n </nav>\n </BreadcrumbSeparatorContext.Provider>\n ),\n)\nBreadcrumb.displayName = \"Breadcrumb\"\n\nconst BreadcrumbList = React.forwardRef<\n HTMLOListElement,\n React.ComponentPropsWithoutRef<\"ol\">\n>(({ className, ...props }, ref) => (\n <ol\n ref={ref}\n className={cn(\n \"flex flex-wrap items-center gap-1.5 break-words text-xs text-muted-foreground\",\n className\n )}\n {...props}\n />\n))\nBreadcrumbList.displayName = \"BreadcrumbList\"\n\nconst BreadcrumbItem = React.forwardRef<\n HTMLLIElement,\n React.ComponentPropsWithoutRef<\"li\">\n>(({ className, ...props }, ref) => (\n <li\n ref={ref}\n className={cn(\"inline-flex items-center gap-1.5\", className)}\n {...props}\n />\n))\nBreadcrumbItem.displayName = \"BreadcrumbItem\"\n\n// Shared link/button classes — the visual is identical regardless of\n// whether the underlying element is an <a> (has href) or a <button>\n// (in-app navigation via onClick).\nconst breadcrumbLinkClasses = cn(\n \"inline-flex items-center gap-1.5 rounded-md px-1.5 py-0.5 text-xs\",\n \"transition-colors hover:text-foreground hover:bg-muted/60\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n \"[&_svg]:pointer-events-none [&_svg]:size-3.5 [&_svg]:shrink-0\",\n)\n\ninterface BreadcrumbLinkProps extends React.HTMLAttributes<HTMLElement> {\n /** Anchor href. When set, renders an <a>; otherwise renders a <button>. */\n href?: string\n /** Use a <span> instead of <a>/<button> — useful when wrapping in a\n * framework-specific Link component yourself. */\n asChild?: boolean\n}\n\n// Split into three forwardRefs (one per element) so TypeScript can\n// type the ref correctly. A polymorphic forwardRef would need a\n// generic ref type — more ceremony than the API needs.\nconst BreadcrumbLink = React.forwardRef<HTMLElement, BreadcrumbLinkProps>(\n ({ asChild, className, href, ...props }, ref) => {\n if (asChild) {\n return (\n <span\n ref={ref as React.Ref<HTMLSpanElement>}\n className={cn(breadcrumbLinkClasses, className)}\n {...props}\n />\n )\n }\n if (href) {\n return (\n <a\n ref={ref as React.Ref<HTMLAnchorElement>}\n href={href}\n className={cn(breadcrumbLinkClasses, className)}\n {...props}\n />\n )\n }\n return (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n type=\"button\"\n className={cn(breadcrumbLinkClasses, className)}\n {...props}\n />\n )\n }\n)\nBreadcrumbLink.displayName = \"BreadcrumbLink\"\n\nconst BreadcrumbPage = React.forwardRef<\n HTMLSpanElement,\n React.ComponentPropsWithoutRef<\"span\">\n>(({ className, ...props }, ref) => (\n <span\n ref={ref}\n role=\"link\"\n aria-disabled=\"true\"\n aria-current=\"page\"\n className={cn(\n \"inline-flex items-center gap-1.5 px-0.5 text-xs font-medium text-foreground\",\n \"[&_svg]:pointer-events-none [&_svg]:size-3.5 [&_svg]:shrink-0\",\n className\n )}\n {...props}\n />\n))\nBreadcrumbPage.displayName = \"BreadcrumbPage\"\n\nconst BreadcrumbSeparator = ({\n children,\n className,\n ...props\n}: React.ComponentProps<\"li\">) => {\n // Per-instance `children` always wins (so designs that want a\n // different glyph just before the current page can opt-out). When\n // no children, read the tree-wide default from context — set by\n // the Breadcrumb root's `separator` prop. If neither is set,\n // ChevronRight is the fallback so a bare <BreadcrumbSeparator/>\n // outside a Breadcrumb root still renders something.\n const fromContext = React.useContext(BreadcrumbSeparatorContext)\n return (\n <li\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\n \"[&_svg]:size-3 [&_svg]:shrink-0 text-muted-foreground/60\",\n className\n )}\n {...props}\n >\n {children ?? fromContext}\n </li>\n )\n}\nBreadcrumbSeparator.displayName = \"BreadcrumbSeparator\"\n\nconst BreadcrumbEllipsis = ({\n className,\n ...props\n}: React.ComponentProps<\"span\">) => (\n <span\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\"flex h-5 w-5 items-center justify-center\", className)}\n {...props}\n >\n <MoreHorizontal className=\"h-3.5 w-3.5\" />\n <span className=\"sr-only\">More</span>\n </span>\n)\nBreadcrumbEllipsis.displayName = \"BreadcrumbEllipsis\"\n\n// ─────────────────────────────────────────────────────────────────────\n// Menu variant — each segment is a dropdown of peer/child items\n// ─────────────────────────────────────────────────────────────────────\n//\n// A column-view-style Breadcrumb. Each segment can carry its own\n// `items` array, and clicking the segment opens a popover listing\n// them — usually the segment's children or peers, surfaced for\n// fast horizontal navigation without a sidebar tree.\n//\n// Each item supports a primary `label` and an optional 3-5 word\n// `summary` so the popover reads more like a content menu than a\n// raw node list. The Studio canvas path bar uses this with AI-\n// generated summaries (`data-gds-summary`) to let designers walk\n// the rendered tree at speed; the same primitive can drive a\n// docs sidebar, a Finder-style file picker, etc.\n//\n// Backward compatible — none of the existing Breadcrumb subparts\n// change. `BreadcrumbMenuTrigger` is purely additive; reach for it\n// only when you want the dropdown behavior.\n\n/** One row inside a BreadcrumbMenuTrigger's popover. The dropdown\n * renders the label as the main text and (optionally) a small\n * muted summary line below. `active` is the visual cue for \"this\n * is the current trail node\" so users can tell which entry maps\n * to their current path. `hasChildren` adds a `›` so the user\n * knows this entry has its own sub-menu when they pick it. */\nexport interface BreadcrumbMenuItem {\n id: string\n label: string\n summary?: string\n active?: boolean\n hasChildren?: boolean\n}\n\nexport interface BreadcrumbMenuTriggerProps {\n /** The label that appears in the breadcrumb itself (e.g. \"Stack\",\n * \"AppShellMain\"). Distinct from the items: this is the segment\n * the user is hovering, not its children. */\n label: string\n /** Items to render in the popover when the segment is opened.\n * Typically the children of the node this segment represents. */\n items: BreadcrumbMenuItem[]\n /** Called with the picked item's id when the user makes a\n * selection. The popover auto-closes on select. */\n onSelect: (id: string) => void\n /** Optional click handler for the segment label itself (not the\n * dropdown). Useful when the host wants clicking the label to\n * also select that node directly. When omitted, the label is\n * purely a popover trigger. */\n onSelectLabel?: () => void\n /** When true, mark the trigger as the current trail position.\n * Visually heavier (matches BreadcrumbPage's weight) and the\n * chevron rotates down to signal \"you are here.\" */\n current?: boolean\n className?: string\n}\n\n/**\n * Segment that opens a popover of children/peers. Composes inside\n * a `<BreadcrumbItem>` exactly where you'd otherwise put a\n * `<BreadcrumbLink>` — same density, same focus ring.\n *\n * <BreadcrumbItem>\n * <BreadcrumbMenuTrigger\n * label=\"Stack\"\n * items={children}\n * onSelect={selectById}\n * />\n * </BreadcrumbItem>\n */\nconst BreadcrumbMenuTrigger = React.forwardRef<\n HTMLButtonElement,\n BreadcrumbMenuTriggerProps\n>(({ label, items, onSelect, onSelectLabel, current, className }, ref) => {\n const [open, setOpen] = React.useState(false)\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n breadcrumbLinkClasses,\n current && \"font-medium text-foreground\",\n className,\n )}\n onClick={() => {\n // When the host wants label-clicks to ALSO select that\n // node (the common case for Studio's path bar — click\n // the label to land on the current segment), invoke the\n // handler and skip opening the popover. The user can\n // still pop the dropdown by clicking the chevron.\n if (onSelectLabel) {\n onSelectLabel()\n } else {\n setOpen((v) => !v)\n }\n }}\n >\n <span>{label}</span>\n <ChevronDown\n className={cn(\n \"h-3 w-3 text-muted-foreground transition-transform\",\n open && \"rotate-180\",\n )}\n // The chevron is the dedicated popover handle — clicking\n // it always opens, regardless of whether `onSelectLabel`\n // is wired. Stop propagation so the label's onClick\n // doesn't also fire.\n onClick={(e) => {\n e.stopPropagation()\n setOpen((v) => !v)\n }}\n role=\"button\"\n aria-label={`Show ${label} children`}\n />\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"start\"\n className=\"w-64 p-1 max-h-80 overflow-y-auto\"\n >\n {items.length === 0 ? (\n <p className=\"px-2 py-1.5 text-xs text-muted-foreground\">\n No items here yet.\n </p>\n ) : (\n <ul className=\"flex flex-col gap-0.5\">\n {items.map((item) => (\n <li key={item.id}>\n <button\n type=\"button\"\n onClick={() => {\n onSelect(item.id)\n setOpen(false)\n }}\n className={cn(\n \"w-full text-left rounded-md px-2 py-1.5\",\n \"flex items-start gap-2\",\n \"hover:bg-muted transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n item.active && \"bg-muted/60\",\n )}\n >\n <span className=\"flex-1 min-w-0\">\n <span className=\"flex items-center gap-1.5\">\n <span className=\"text-xs font-medium text-foreground truncate\">\n {item.label}\n </span>\n {item.active && (\n <Check className=\"h-3 w-3 text-primary shrink-0\" />\n )}\n </span>\n {item.summary && (\n <span className=\"block text-[10px] text-muted-foreground leading-snug truncate\">\n {item.summary}\n </span>\n )}\n </span>\n {item.hasChildren && (\n <ChevronRight className=\"h-3 w-3 text-muted-foreground/70 shrink-0 mt-0.5\" />\n )}\n </button>\n </li>\n ))}\n </ul>\n )}\n </PopoverContent>\n </Popover>\n )\n})\nBreadcrumbMenuTrigger.displayName = \"BreadcrumbMenuTrigger\"\n\nexport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbPage,\n BreadcrumbSeparator,\n BreadcrumbEllipsis,\n BreadcrumbMenuTrigger,\n}\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 * as TabsPrimitive from \"@radix-ui/react-tabs\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\"\n\n/**\n * Tabs — accessible tab strip + content switcher built on Radix.\n *\n * Sizing is a t-shirt scale: `sm` / `md` / `lg`. Set on `TabsList`;\n * cascades to every `TabsTrigger` inside via a small context. Triggers\n * may also opt out per-call with their own `size` prop if a row needs\n * a one-off override.\n *\n * **Variant** (May 2026 — added during the SimpleTabs collapse):\n * - `pill` (default) — shadcn-style chips on a `bg-muted` pill.\n * - `underlined` — minimal underlined-tab look (text-primary on\n * active + bottom border indicator). What used to live in\n * SimpleTabs. Reach for this on marketing pages, docs nav,\n * and any \"browser-tab-like\" treatment.\n *\n * Icons: pass an `<svg>` (lucide etc.) as a sibling of the label inside\n * `TabsTrigger`. The variant rules apply `[&_svg]:size-*` to auto-size\n * any child icon to the right scale, plus `gap-*` between icon and\n * label. No icon prop needed.\n *\n * <Tabs defaultValue=\"preview\">\n * <TabsList size=\"md\" variant=\"underlined\">\n * <TabsTrigger value=\"preview\"><Eye /> Preview</TabsTrigger>\n * <TabsTrigger value=\"code\"><Code2 /> Code</TabsTrigger>\n * </TabsList>\n * <TabsContent value=\"preview\">…</TabsContent>\n * <TabsContent value=\"code\">…</TabsContent>\n * </Tabs>\n */\n\nexport type TabsSize = \"sm\" | \"md\" | \"lg\"\nexport type TabsVariant = \"pill\" | \"underlined\"\n\ninterface TabsContextValue {\n size: TabsSize\n variant: TabsVariant\n}\nconst TabsStyleContext = React.createContext<TabsContextValue>({\n size: \"md\",\n variant: \"pill\",\n})\n\nconst Tabs = TabsPrimitive.Root\n\n// ─── Variants ───────────────────────────────────────────────────────────\n//\n// Sizing math (so the visible whitespace stays roughly symmetric on\n// both axes — that was the v1 papercut):\n//\n// sm: list h-7 p-0.5 → inner 24px. Trigger h-6 (24px) fits exactly.\n// Text 11px + size-3 icon (12px) ~ 12px content; vertical air\n// = (24-12)/2 = 6px. Horizontal px-1.5 = 6px. ≈ symmetric.\n// md: list h-8 p-0.5 → inner 28px. Trigger h-7 (28px). text-xs\n// (12px) + size-3.5 icon (14px) ~ 14px content; vertical air\n// = (28-14)/2 = 7px. Horizontal px-2 = 8px. Within 1px.\n// lg: list h-10 p-1 → inner 32px. Trigger h-8 (32px). text-sm\n// (14px) + size-4 icon (16px) ~ 16px content; vertical air\n// = (32-16)/2 = 8px. Horizontal px-2.5 = 10px. Within 2px.\n\nconst tabsListVariants = cva(\"inline-flex items-center text-muted-foreground\", {\n variants: {\n variant: {\n pill: \"justify-center rounded-lg bg-muted\",\n // Underlined: row of text/icon triggers sitting on a single\n // bottom rule. The list owns the baseline border; the active\n // trigger paints over it via `border-primary` + `-mb-px`.\n underlined: \"justify-start border-b border-border\",\n },\n size: {\n sm: \"\",\n md: \"\",\n lg: \"\",\n },\n },\n compoundVariants: [\n // Pill: list owns the chip height + breathing-room padding.\n { variant: \"pill\", size: \"sm\", className: \"h-7 p-0.5\" },\n { variant: \"pill\", size: \"md\", className: \"h-8 p-0.5\" },\n { variant: \"pill\", size: \"lg\", className: \"h-10 p-1\" },\n // Underlined: list is content-sized; size only changes the gap\n // between triggers (their own padding handles vertical rhythm).\n { variant: \"underlined\", size: \"sm\", className: \"gap-3\" },\n { variant: \"underlined\", size: \"md\", className: \"gap-4\" },\n { variant: \"underlined\", size: \"lg\", className: \"gap-6\" },\n ],\n defaultVariants: { variant: \"pill\", size: \"md\" },\n})\n\nconst tabsTriggerVariants = cva(\n \"inline-flex items-center justify-center whitespace-nowrap 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 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n pill: \"rounded-md data-[state=active]:bg-background data-[state=active]:text-foreground\",\n // Underlined: transparent surface, primary text + thicker\n // bottom border on active. `-mb-px` pulls the trigger down\n // one pixel so its border sits ON TOP of the list's border,\n // not below it (no double-line on active).\n underlined:\n \"rounded-none bg-transparent border-b-2 border-transparent -mb-px hover:text-foreground data-[state=active]:border-primary data-[state=active]:text-primary\",\n },\n size: {\n sm: \"text-[11px] gap-1 [&_svg]:size-3\",\n md: \"text-xs gap-1.5 [&_svg]:size-3.5\",\n lg: \"text-sm gap-2 [&_svg]:size-4\",\n },\n },\n compoundVariants: [\n // Pill triggers fit inside the sized list — fixed heights.\n { variant: \"pill\", size: \"sm\", className: \"h-6 px-1.5\" },\n { variant: \"pill\", size: \"md\", className: \"h-7 px-2\" },\n { variant: \"pill\", size: \"lg\", className: \"h-8 px-2.5\" },\n // Underlined triggers own their own vertical space — taller\n // padding-block so the underline has room to sit below.\n { variant: \"underlined\", size: \"sm\", className: \"pb-1.5 pt-1 px-1\" },\n { variant: \"underlined\", size: \"md\", className: \"pb-2 pt-1.5 px-1.5\" },\n { variant: \"underlined\", size: \"lg\", className: \"pb-2.5 pt-2 px-2\" },\n ],\n defaultVariants: { variant: \"pill\", size: \"md\" },\n }\n)\n\n// ─── TabsList ───────────────────────────────────────────────────────────\n\nexport interface TabsListProps\n extends React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>,\n VariantProps<typeof tabsListVariants> {}\n\nconst TabsList = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.List>,\n TabsListProps\n>(({ className, size = \"md\", variant = \"pill\", children, ...props }, ref) => (\n // Provide the size + variant to every nested TabsTrigger so consumers\n // only set them once on the list. Individual triggers can still\n // override by passing their own `size` / `variant` props.\n <TabsStyleContext.Provider value={{ size: size ?? \"md\", variant: variant ?? \"pill\" }}>\n <TabsPrimitive.List\n ref={ref}\n className={cn(tabsListVariants({ size, variant }), className)}\n {...props}\n >\n {children}\n </TabsPrimitive.List>\n </TabsStyleContext.Provider>\n))\nTabsList.displayName = TabsPrimitive.List.displayName\n\n// ─── TabsTrigger ────────────────────────────────────────────────────────\n\nexport interface TabsTriggerProps\n extends React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>,\n VariantProps<typeof tabsTriggerVariants> {\n /**\n * Tooltip text shown on hover / focus. Designed for icon-only\n * triggers: pass `<TabsTrigger value=\"preview\" tooltip=\"Preview\">`\n * with an icon child, and the component handles the rest. If\n * `aria-label` is not set explicitly, the tooltip string is also\n * applied as `aria-label` so screen readers can name the choice.\n *\n * Requires a `<TooltipProvider>` somewhere above the tabs. The\n * design system's root layout mounts one app-wide.\n */\n tooltip?: React.ReactNode\n}\n\nconst TabsTrigger = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Trigger>,\n TabsTriggerProps\n>(({ className, size, variant, tooltip, ...props }, ref) => {\n const inherited = React.useContext(TabsStyleContext)\n const resolvedSize = size ?? inherited.size\n const resolvedVariant = variant ?? inherited.variant\n\n // Auto-apply aria-label from tooltip when it's a plain string and\n // the consumer didn't already set one. Icon-only triggers need an\n // accessible name; tooltip text is the natural source.\n const ariaLabel =\n props[\"aria-label\"] ??\n (typeof tooltip === \"string\" ? tooltip : undefined)\n\n const trigger = (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n tabsTriggerVariants({ size: resolvedSize, variant: resolvedVariant }),\n className,\n )}\n aria-label={ariaLabel}\n {...props}\n />\n )\n\n if (!tooltip) return trigger\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{trigger}</TooltipTrigger>\n <TooltipContent>{tooltip}</TooltipContent>\n </Tooltip>\n )\n})\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName\n\n// ─── TabsContent ────────────────────────────────────────────────────────\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 {\n Tabs,\n TabsList,\n TabsTrigger,\n TabsContent,\n tabsListVariants,\n tabsTriggerVariants,\n}\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 TogglePrimitive from \"@radix-ui/react-toggle\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst toggleVariants = cva(\n \"inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n outline:\n \"border border-input bg-transparent shadow-sm hover:bg-accent hover:text-accent-foreground\",\n },\n size: {\n default: \"h-9 px-2 min-w-9\",\n sm: \"h-8 px-1.5 min-w-8\",\n lg: \"h-10 px-2.5 min-w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nconst Toggle = React.forwardRef<\n React.ElementRef<typeof TogglePrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof TogglePrimitive.Root> &\n VariantProps<typeof toggleVariants>\n>(({ className, variant, size, ...props }, ref) => (\n <TogglePrimitive.Root\n ref={ref}\n className={cn(toggleVariants({ variant, size, className }))}\n {...props}\n />\n))\n\nToggle.displayName = TogglePrimitive.Root.displayName\n\nexport { Toggle, toggleVariants }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as ToggleGroupPrimitive from \"@radix-ui/react-toggle-group\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./tooltip\"\n\n/**\n * ToggleGroup — segmented control / mutually-exclusive picker.\n *\n * Visually identical to `Tabs` (same pill chrome, same active-state\n * treatment, same density). Use ToggleGroup when the value is a\n * picked option (no per-tab content panel); use Tabs when each\n * option owns a content region.\n *\n * Sized via the t-shirt scale (sm / md / lg) — cascades from the\n * group to every item through context, matching the Tabs pattern.\n *\n * Self-contained: does NOT compose `toggleVariants` from `Toggle`.\n * The standalone Toggle and the in-group ToggleGroupItem have\n * different intents (single on/off vs picker item) and shouldn't\n * share styling — keeping each component's variants in one place\n * avoids the \"two layers of classes fighting each other\" trap.\n */\n\nexport type ToggleGroupSize = \"sm\" | \"md\" | \"lg\"\n\nconst ToggleGroupSizeContext = React.createContext<ToggleGroupSize>(\"md\")\n\nconst toggleGroupVariants = cva(\n \"inline-flex items-center justify-center rounded-lg bg-muted text-muted-foreground\",\n {\n variants: {\n size: {\n sm: \"h-7 p-0.5\",\n md: \"h-8 p-0.5\",\n lg: \"h-10 p-1\",\n },\n },\n defaultVariants: { size: \"md\" },\n }\n)\n\nconst toggleGroupItemVariants = cva(\n // Same base shape as TabsTrigger so a placed ToggleGroup reads\n // as the same primitive in the chrome regardless of which one\n // a designer reached for.\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md 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 [&_svg]:pointer-events-none [&_svg]:shrink-0 data-[state=on]:bg-background data-[state=on]:text-foreground\",\n {\n variants: {\n size: {\n sm: \"h-6 px-1.5 text-[11px] gap-1 [&_svg]:size-3\",\n md: \"h-7 px-2 text-xs gap-1.5 [&_svg]:size-3.5\",\n lg: \"h-8 px-2.5 text-sm gap-2 [&_svg]:size-4\",\n },\n },\n defaultVariants: { size: \"md\" },\n }\n)\n\n// `ToggleGroupPrimitive.Root`'s props are a discriminated union\n// (`type=\"single\"` vs `type=\"multiple\"`) so we use `type` + `&`\n// rather than `interface ... extends` — TypeScript won't allow\n// extending a union via interface, but intersecting is fine.\nexport type ToggleGroupProps =\n React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Root> &\n VariantProps<typeof toggleGroupVariants>\n\nconst ToggleGroup = React.forwardRef<\n React.ElementRef<typeof ToggleGroupPrimitive.Root>,\n ToggleGroupProps\n>(({ className, size = \"md\", children, ...props }, ref) => (\n <ToggleGroupSizeContext.Provider value={size ?? \"md\"}>\n <ToggleGroupPrimitive.Root\n ref={ref}\n className={cn(toggleGroupVariants({ size }), className)}\n {...(props as React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Root>)}\n >\n {children}\n </ToggleGroupPrimitive.Root>\n </ToggleGroupSizeContext.Provider>\n))\nToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName\n\nexport type ToggleGroupItemProps =\n React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Item> &\n VariantProps<typeof toggleGroupItemVariants> & {\n /** Tooltip content. When set, the item is wrapped in a Tooltip\n * so icon-only items keep an accessible label without bloating\n * the chrome with text. Pass a string for the common case;\n * pass a node for richer content (key hint, badge, etc.).\n *\n * Assumes a `TooltipProvider` exists somewhere upstream — in\n * apps/docs the root layout already mounts one, which is the\n * pattern most consumers should follow. If no provider is\n * present, the tooltip is silently ignored at runtime (Radix\n * no-ops) — pass `tooltip={undefined}` to be sure of plain\n * behavior. */\n tooltip?: React.ReactNode\n /** Which side of the item the tooltip renders on. Defaults to\n * \"top\" — matches the Tabs primitive's convention. */\n tooltipSide?: React.ComponentPropsWithoutRef<typeof TooltipContent>[\"side\"]\n /** Tooltip delay override. The provider's `delayDuration` is\n * the default; pass a per-item value if a specific control\n * needs a snappier or quieter feel. */\n tooltipDelay?: number\n }\n\nconst ToggleGroupItem = React.forwardRef<\n React.ElementRef<typeof ToggleGroupPrimitive.Item>,\n ToggleGroupItemProps\n>(\n (\n {\n className,\n size,\n tooltip,\n tooltipSide = \"top\",\n tooltipDelay,\n \"aria-label\": ariaLabel,\n ...props\n },\n ref\n ) => {\n const inherited = React.useContext(ToggleGroupSizeContext)\n const resolved = size ?? inherited\n // When tooltip is a plain string and the consumer didn't supply\n // an aria-label, mirror the tooltip text onto aria-label so the\n // item still has an accessible name for screen readers (icon-only\n // buttons would otherwise be unannounced). If the consumer passed\n // their own aria-label, respect it.\n const resolvedAriaLabel =\n ariaLabel ?? (typeof tooltip === \"string\" ? tooltip : undefined)\n const item = (\n <ToggleGroupPrimitive.Item\n ref={ref}\n className={cn(toggleGroupItemVariants({ size: resolved }), className)}\n aria-label={resolvedAriaLabel}\n {...props}\n />\n )\n if (tooltip == null) return item\n // Why the span wrapper:\n // `TooltipTrigger asChild` uses Radix's Slot to merge its own\n // `data-state=\"closed\" | \"delayed-open\" | \"instant-open\"` into\n // the child. If that child is the toggle button directly, those\n // values land in `{...buttonProps}` and — because Toggle's\n // Primitive.button spreads props AFTER its own explicit\n // `data-state={pressed ? \"on\" : \"off\"}` — they clobber the\n // active-state attribute the variant CSS hooks (`data-[state=on]:…`).\n // Wrapping the item in a non-focusable span keeps the trigger's\n // data-state on the span and the toggle's data-state on the\n // button, so selected-state styling stays intact. The span is\n // inline-flex so it doesn't disturb the parent's flex layout;\n // pointer / focus events bubble through to the inner button\n // (Radix Tooltip listens for both).\n return (\n <Tooltip delayDuration={tooltipDelay}>\n <TooltipTrigger asChild>\n <span className=\"inline-flex\">{item}</span>\n </TooltipTrigger>\n <TooltipContent side={tooltipSide}>{tooltip}</TooltipContent>\n </Tooltip>\n )\n }\n)\nToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName\n\nexport { ToggleGroup, ToggleGroupItem, toggleGroupVariants, toggleGroupItemVariants }\n","import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\n\n/**\n * Toolbar — slot-based chrome bar for the leading/center/trailing\n * pattern Apple HIG describes as a \"Toolbar.\"\n *\n * ┌─────────────────────────────────────────────────┐\n * │ [leading] [center] [trailing] │\n * └─────────────────────────────────────────────────┘\n *\n * The three-region top nav is everywhere — Reddit, Twitter, GitHub,\n * Linear's top bar, every desktop app's window chrome — and most\n * scaffolds end up rebuilding it from raw `<Row justify=\"between\">`\n * with a manual flex-1 on the center. This primitive collapses that\n * into:\n *\n * <Toolbar leading={<Logo/>} center={<Search/>} trailing={<Avatar/>} />\n *\n * The grid template is `auto 1fr auto`, so the center slot absorbs\n * available width and stays visually centered relative to the bar\n * (not relative to the gap between leading and trailing). If any\n * slot is omitted, the grid column collapses cleanly.\n *\n * Accessibility — role=\"toolbar\" by default, with aria-label expected\n * via props. WAI-ARIA toolbar pattern: children should be keyboard-\n * navigable via arrow keys if they're a tight set of related actions.\n * For an app chrome bar (logo + nav + actions) the standard tab\n * sequence is usually fine and a single aria-label is enough; for an\n * editor-style toolbar (B / I / S / link), pair with a roving\n * tabindex implementation. (Roving tabindex is out of scope for v1 —\n * if you need it, compose with @radix-ui/react-toolbar's primitives\n * inside the slots.)\n *\n * Anatomy:\n * Toolbar — <div role=\"toolbar\"> by default; sets the grid\n * Toolbar.Slot — exported for symmetry but rarely needed; the\n * leading/center/trailing props are the canonical\n * API\n *\n * Variants:\n * position — \"top\" | \"bottom\" | \"inline\" (border placement)\n * variant — \"default\" | \"subtle\" | \"transparent\"\n * size — \"sm\" | \"md\" | \"lg\" (height + padding)\n * sticky — boolean (sticky to top/bottom)\n *\n * Used for: app window chrome (AppShellHeader), section toolbars\n * inside a card or panel, action bars at the bottom of a list,\n * persistent footer toolbars on mobile-style layouts.\n */\nconst toolbarVariants = cva(\n // Grid columns: auto 1fr auto — center stretches and visually\n // centers within the bar, regardless of leading/trailing widths.\n // gap-3 between columns by default; consumers can override.\n \"grid items-center w-full gap-3 [grid-template-columns:auto_1fr_auto]\",\n {\n variants: {\n position: {\n top: \"border-b border-border\",\n bottom: \"border-t border-border\",\n inline: \"\",\n },\n variant: {\n default: \"bg-background\",\n subtle: \"bg-muted/30\",\n transparent: \"bg-transparent\",\n },\n size: {\n sm: \"min-h-10 px-3\",\n md: \"min-h-12 px-4\",\n lg: \"min-h-14 px-6\",\n },\n sticky: {\n true: \"\",\n false: \"\",\n },\n },\n compoundVariants: [\n // Sticky behaviour depends on which edge the toolbar lives on.\n // top → stick to top:0; bottom → stick to bottom:0. Inline\n // toolbars don't make sense to stick — left as-is.\n { sticky: true, position: \"top\", className: \"sticky top-0 z-20\" },\n { sticky: true, position: \"bottom\", className: \"sticky bottom-0 z-20\" },\n ],\n defaultVariants: {\n position: \"top\",\n variant: \"default\",\n size: \"md\",\n sticky: false,\n },\n }\n);\n\nexport interface ToolbarProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\">,\n VariantProps<typeof toolbarVariants> {\n /** Left-aligned content. Usually a logo + primary nav links. */\n leading?: React.ReactNode;\n /** Center-aligned content. Usually a search input, a page title,\n * or a segmented control. The center column stretches via `1fr`\n * so it stays visually centered relative to the bar. */\n center?: React.ReactNode;\n /** Right-aligned content. Usually action icons + user avatar. */\n trailing?: React.ReactNode;\n /** When using `children` directly (advanced custom layout), the\n * slot props are ignored. Most callers should prefer the slot\n * props — they give the canonical grid layout for free. */\n children?: React.ReactNode;\n /** Required by WAI-ARIA toolbar pattern. Falls back to \"Toolbar\". */\n \"aria-label\"?: string;\n}\n\nconst Toolbar = React.forwardRef<HTMLDivElement, ToolbarProps>(\n (\n {\n className,\n position,\n variant,\n size,\n sticky,\n leading,\n center,\n trailing,\n children,\n \"aria-label\": ariaLabel,\n ...props\n },\n ref\n ) => {\n // When `children` is provided, escape into raw mode so the consumer\n // owns the inner layout. The grid template still applies, so the\n // children should fit into 3 columns (or use grid-column spans).\n const usingSlots = children == null;\n return (\n <div\n ref={ref}\n role=\"toolbar\"\n aria-label={ariaLabel ?? \"Toolbar\"}\n data-gds-part=\"toolbar\"\n data-position={position ?? \"top\"}\n className={cn(toolbarVariants({ position, variant, size, sticky }), className)}\n {...props}\n >\n {usingSlots ? (\n <>\n <div data-gds-part=\"toolbar-leading\" className=\"flex items-center min-w-0\">\n {leading}\n </div>\n <div data-gds-part=\"toolbar-center\" className=\"flex items-center min-w-0 justify-center\">\n {center}\n </div>\n <div data-gds-part=\"toolbar-trailing\" className=\"flex items-center min-w-0 justify-end\">\n {trailing}\n </div>\n </>\n ) : (\n children\n )}\n </div>\n );\n }\n);\nToolbar.displayName = \"Toolbar\";\n\n/**\n * ToolbarSlot — escape-hatch piece for the rare case a consumer\n * wants to compose a custom inner layout with children but still\n * get the slot styling. Use the slot props on Toolbar where you can.\n */\nexport interface ToolbarSlotProps extends React.HTMLAttributes<HTMLDivElement> {\n align?: \"leading\" | \"center\" | \"trailing\";\n}\n\nconst ToolbarSlot = React.forwardRef<HTMLDivElement, ToolbarSlotProps>(\n ({ className, align = \"leading\", ...props }, ref) => (\n <div\n ref={ref}\n data-gds-part={`toolbar-${align}`}\n className={cn(\n \"flex items-center min-w-0\",\n align === \"center\" && \"justify-center\",\n align === \"trailing\" && \"justify-end\",\n className\n )}\n {...props}\n />\n )\n);\nToolbarSlot.displayName = \"ToolbarSlot\";\n\nexport { Toolbar, ToolbarSlot };\n","\"use client\";\n\n/**\n * Sidebar — compound layout primitive for vertical app navigation.\n *\n * Renamed from `SideMenu` (May 2026) and rebuilt around a compound API\n * so consumers can slot custom content into the header/content/footer\n * regions instead of being forced through a data-driven `sections=[...]`\n * prop. Replaces the previous single-component shape entirely.\n *\n * Why compound: sidebars vary wildly across products — Notion-style\n * workspace switcher up top, search input below, scrollable nav in the\n * middle, user profile + settings link at the bottom. The old data-\n * driven SideMenu could express the section list cleanly but anything\n * non-list-shaped (search inputs, drag handles, command-K trigger\n * pills, custom brand blocks) had to fight the API. Compound trades\n * \"two lines of JSX\" for \"any shape the consumer wants.\"\n *\n * Compound shape:\n *\n * <Sidebar>\n * <SidebarHeader> // brand / logo / org switcher\n * <SidebarContent> // scrollable body\n * <SidebarSection title=\"Workspace\">\n * <SidebarItem href=\"/\" icon={<Home />}>Dashboard</SidebarItem>\n * <SidebarItem href=\"/inbox\" icon={<Inbox />} badge={3}>Inbox</SidebarItem>\n * </SidebarSection>\n * </SidebarContent>\n * <SidebarFooter> // user / settings / pinned chrome\n * </Sidebar>\n *\n * For routing integration, `<SidebarItem href>` renders an `<a>` by\n * default. Drop `asChild` to wrap any link component (Next/Link, React\n * Router Link, Remix Link, etc.) — Radix Slot stamps the item's classes\n * onto whatever you pass:\n *\n * <SidebarItem asChild icon={<Home />}>\n * <Link href=\"/\">Dashboard</Link>\n * </SidebarItem>\n *\n * Theming: visual surfaces (bg, border, text colour) come from semantic\n * theme tokens, not hard-coded greys. Sizing knobs (collapsed width,\n * expanded width, item padding) live as `--gds-sidebar-*` CSS variables\n * so the consumer can retune without prop drilling.\n *\n * Composition: Sidebar slots inside `<AppShellNav placement=\"side\">`\n * exactly the way SideMenu did; AppShell is the page-level chrome,\n * Sidebar is the navigation content for that chrome.\n */\n\nimport * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { ChevronDown, ChevronLeft, ChevronRight } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\n\n// ─── Context ──────────────────────────────────────────────────────────\n\ninterface SidebarContextValue {\n collapsed: boolean;\n}\n\nconst SidebarContext = React.createContext<SidebarContextValue | null>(null);\n\n// Tree-depth context — incremented by SidebarTreeItem's children\n// wrapper. Read by SidebarItem + SidebarTreeItem to add left padding\n// per nesting level. Notion-style page trees use this; flat sidebars\n// stay at depth 0 and pay nothing.\nconst SidebarTreeDepthContext = React.createContext<number>(0);\nfunction useTreeDepth(): number {\n return React.useContext(SidebarTreeDepthContext);\n}\n\nfunction useSidebar(componentName: string): SidebarContextValue {\n const ctx = React.useContext(SidebarContext);\n if (!ctx) {\n throw new Error(`<${componentName}> must be rendered inside a <Sidebar> root.`);\n }\n return ctx;\n}\n\n// ─── Root ─────────────────────────────────────────────────────────────\n\nexport interface SidebarProps extends React.HTMLAttributes<HTMLElement> {\n /** Controlled collapsed state. When set, `onCollapsedChange` MUST be\n * wired or the toggle button becomes a no-op. */\n collapsed?: boolean;\n /** Uncontrolled initial collapsed state. Ignored if `collapsed` is set. */\n defaultCollapsed?: boolean;\n /** Fired when the toggle button flips collapsed state. */\n onCollapsedChange?: (next: boolean) => void;\n /** Show / hide the affordance for the user to collapse. Defaults true. */\n collapsible?: boolean;\n /**\n * Visual treatment.\n *\n * - `\"rail\"` (default) — the classic nav rail: sits flush against an\n * adjacent surface with only a right-side border, fixed width via\n * `--gds-sidebar-width`. Designed to slot into `<AppShellNav placement=\"side\">`.\n * - `\"panel\"` — a floating card-style sidebar: full border, rounded\n * corners, width inherited from the parent (typically a flex/grid\n * track). Use when the sidebar is one of several adjacent panes\n * in a body row, like Studio's `Projects | Canvas | Settings`.\n *\n * The variant affects ONLY the outer chrome — header/content/footer/\n * section/item internals are identical so the same compound markup\n * works in both treatments.\n */\n variant?: \"rail\" | \"panel\";\n}\n\ninterface SidebarRootComponent\n extends React.ForwardRefExoticComponent<\n SidebarProps & React.RefAttributes<HTMLElement>\n > {\n Header: typeof SidebarHeader;\n Content: typeof SidebarContent;\n Footer: typeof SidebarFooter;\n Section: typeof SidebarSection;\n Item: typeof SidebarItem;\n TreeItem: typeof SidebarTreeItem;\n}\n\nconst Sidebar = React.forwardRef<HTMLElement, SidebarProps>(\n (\n {\n collapsed: controlledCollapsed,\n defaultCollapsed = false,\n onCollapsedChange,\n collapsible = true,\n variant = \"rail\",\n className,\n style,\n children,\n ...rest\n },\n ref,\n ) => {\n const isControlled = controlledCollapsed !== undefined;\n const [internal, setInternal] = React.useState(defaultCollapsed);\n const collapsed = isControlled ? controlledCollapsed! : internal;\n const isPanel = variant === \"panel\";\n\n const toggle = () => {\n const next = !collapsed;\n if (!isControlled) setInternal(next);\n onCollapsedChange?.(next);\n };\n\n return (\n <TooltipProvider delayDuration={0}>\n <SidebarContext.Provider value={{ collapsed }}>\n <aside\n ref={ref}\n data-gds-part=\"sidebar\"\n data-collapsed={collapsed || undefined}\n data-variant={variant}\n className={cn(\n \"relative flex h-full flex-col bg-card text-card-foreground\",\n // Chrome is the only thing the variant changes. Rail\n // hugs an adjacent surface with a single right border\n // and a tracked width; panel floats as its own card\n // and sizes from the parent flex/grid track.\n isPanel\n ? \"w-full border border-border rounded-lg overflow-hidden\"\n : \"border-r border-border transition-[width] duration-200 ease-out\",\n className,\n )}\n style={\n // Panel variant defers sizing to the parent container —\n // typical use is inside a flex track that already\n // constrains width, so an inline width would fight the\n // parent. Rail variant keeps its tracked width as before.\n isPanel\n ? style\n : {\n width: collapsed\n ? \"var(--gds-sidebar-collapsed-width, 4rem)\"\n : \"var(--gds-sidebar-width, 16rem)\",\n ...style,\n }\n }\n {...rest}\n >\n {children}\n\n {/* The hover-out toggle is a rail-mode affordance — it\n deliberately overlaps the right border. In panel mode\n the sidebar is a free-standing card whose width is\n set by the parent layout, so a self-collapse handle\n doesn't fit the model; callers wanting a hide/show\n affordance there should add their own button (e.g.\n the Studio canvas toolbar's PanelLeft toggle). */}\n {collapsible && !isPanel && (\n <button\n type=\"button\"\n onClick={toggle}\n aria-label={collapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n data-gds-part=\"sidebar-collapse-toggle\"\n className={cn(\n \"absolute -right-3 top-6 z-10 flex h-6 w-6 items-center justify-center\",\n \"rounded-full border border-border bg-card text-muted-foreground shadow-sm\",\n \"hover:text-foreground hover:bg-muted transition-colors\",\n )}\n >\n {collapsed ? (\n <ChevronRight className=\"h-3 w-3\" />\n ) : (\n <ChevronLeft className=\"h-3 w-3\" />\n )}\n </button>\n )}\n </aside>\n </SidebarContext.Provider>\n </TooltipProvider>\n );\n },\n) as SidebarRootComponent;\nSidebar.displayName = \"Sidebar\";\n\n// ─── Header ───────────────────────────────────────────────────────────\n\nexport interface SidebarHeaderProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst SidebarHeader = React.forwardRef<HTMLDivElement, SidebarHeaderProps>(\n ({ className, ...props }, ref) => {\n const { collapsed } = useSidebar(\"SidebarHeader\");\n return (\n <div\n ref={ref}\n data-gds-part=\"sidebar-header\"\n data-collapsed={collapsed || undefined}\n className={cn(\n \"flex shrink-0 items-center border-b border-border\",\n collapsed ? \"justify-center px-2\" : \"px-3\",\n \"h-[var(--gds-sidebar-header-height,3.25rem)]\",\n className,\n )}\n {...props}\n />\n );\n },\n);\nSidebarHeader.displayName = \"SidebarHeader\";\n\n// ─── Content ──────────────────────────────────────────────────────────\n\nexport interface SidebarContentProps extends React.HTMLAttributes<HTMLElement> {}\n\nconst SidebarContent = React.forwardRef<HTMLElement, SidebarContentProps>(\n ({ className, ...props }, ref) => (\n <nav\n ref={ref}\n data-gds-part=\"sidebar-content\"\n className={cn(\n \"flex-1 overflow-y-auto overflow-x-hidden\",\n \"py-[var(--gds-sidebar-content-py,0.5rem)]\",\n className,\n )}\n {...props}\n />\n ),\n);\nSidebarContent.displayName = \"SidebarContent\";\n\n// ─── Footer ───────────────────────────────────────────────────────────\n\nexport interface SidebarFooterProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst SidebarFooter = React.forwardRef<HTMLDivElement, SidebarFooterProps>(\n ({ className, ...props }, ref) => {\n const { collapsed } = useSidebar(\"SidebarFooter\");\n return (\n <div\n ref={ref}\n data-gds-part=\"sidebar-footer\"\n data-collapsed={collapsed || undefined}\n className={cn(\n \"shrink-0 border-t border-border\",\n collapsed ? \"px-2 py-2\" : \"px-3 py-2\",\n className,\n )}\n {...props}\n />\n );\n },\n);\nSidebarFooter.displayName = \"SidebarFooter\";\n\n// ─── Section ──────────────────────────────────────────────────────────\n\nexport interface SidebarSectionProps\n // Omit `title` from the HTML attrs because the native `title` is a\n // tooltip-text `string`; ours is a ReactNode label shown above the\n // section items.\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Group label shown above the items. Hidden when sidebar is collapsed\n * (children render flat under the icon strip). */\n title?: React.ReactNode;\n /** Optional icon next to the title. */\n icon?: React.ReactNode;\n /** Action(s) rendered on the right edge of the section header — the\n * canonical \"+ add to this group\" or \"...\" menu slot. Common in Notion\n * (+ next to Pages), Linear (+ next to Favorites), Slack (+ next to\n * Channels). Rendered as a sibling of the chevron when `collapsible`,\n * otherwise pinned to the right edge of the static header.\n * Pointer events on the trailing content are isolated from the\n * collapse toggle, so a Button inside `trailing` won't also flip the\n * expanded state. */\n trailing?: React.ReactNode;\n /** Allow the section to toggle open/closed via clicking the title.\n * Default true when `title` is set; ignored otherwise (no header to click). */\n collapsible?: boolean;\n /** Initial open state for collapsible sections. Default true. */\n defaultExpanded?: boolean;\n}\n\nconst SidebarSection = React.forwardRef<HTMLDivElement, SidebarSectionProps>(\n (\n {\n title,\n icon,\n trailing,\n collapsible = true,\n defaultExpanded = true,\n className,\n children,\n ...rest\n },\n ref,\n ) => {\n const { collapsed } = useSidebar(\"SidebarSection\");\n const [expanded, setExpanded] = React.useState(defaultExpanded);\n const canCollapse = !!title && collapsible;\n\n // When the parent sidebar is collapsed, just render the children flat\n // — no section header, no nesting indent. Items get their own\n // collapsed-state treatment via context.\n if (collapsed) {\n return (\n <div\n ref={ref}\n data-gds-part=\"sidebar-section\"\n className={cn(\n \"px-[var(--gds-sidebar-section-px,0.5rem)] space-y-[var(--gds-sidebar-section-gap,0.125rem)]\",\n className,\n )}\n {...rest}\n >\n {children}\n </div>\n );\n }\n\n return (\n <div\n ref={ref}\n data-gds-part=\"sidebar-section\"\n className={cn(\n \"px-[var(--gds-sidebar-section-px,0.5rem)] pb-1\",\n className,\n )}\n {...rest}\n >\n {title &&\n (canCollapse ? (\n // Collapsible header — outer Row stays clickable for the\n // toggle, trailing content is wrapped in a span that swallows\n // its own clicks so a Button inside trailing doesn't also\n // toggle the section.\n <div\n className={cn(\n \"group/header flex w-full items-center gap-1 rounded-md px-2 py-1.5 text-xs font-medium uppercase tracking-wide\",\n \"text-muted-foreground hover:text-foreground hover:bg-muted/50 transition-colors\",\n )}\n >\n <button\n type=\"button\"\n onClick={() => setExpanded((v) => !v)}\n aria-expanded={expanded}\n className=\"flex flex-1 items-center gap-2 text-left min-w-0\"\n >\n {icon}\n <span className=\"flex-1 text-left normal-case truncate\">{title}</span>\n {expanded ? (\n <ChevronDown className=\"h-3 w-3 shrink-0\" strokeWidth={1.5} />\n ) : (\n <ChevronRight className=\"h-3 w-3 shrink-0\" strokeWidth={1.5} />\n )}\n </button>\n {trailing && (\n <span\n className=\"flex items-center shrink-0\"\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => e.stopPropagation()}\n >\n {trailing}\n </span>\n )}\n </div>\n ) : (\n <div\n className={cn(\n \"flex items-center gap-2 px-2 py-1.5 text-xs font-medium uppercase tracking-wide\",\n \"text-muted-foreground\",\n )}\n >\n {icon}\n <span className=\"flex-1 truncate\">{title}</span>\n {trailing && <span className=\"shrink-0\">{trailing}</span>}\n </div>\n ))}\n {expanded && (\n <div\n className={cn(\n \"mt-[var(--gds-sidebar-section-gap,0.125rem)]\",\n \"space-y-[var(--gds-sidebar-section-gap,0.125rem)]\",\n )}\n >\n {children}\n </div>\n )}\n </div>\n );\n },\n);\nSidebarSection.displayName = \"SidebarSection\";\n\n// ─── Item ─────────────────────────────────────────────────────────────\n\nexport interface SidebarItemProps\n extends Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"children\" | \"title\"> {\n /** Leading icon. Sized to fit both expanded + collapsed states. */\n icon?: React.ReactNode;\n /** Trailing badge — count, status label. Hidden when collapsed. */\n badge?: React.ReactNode;\n /** Marks the current page / route. Drives the highlighted style + sets\n * `aria-current=\"page\"`. */\n active?: boolean;\n /** Render the item as a button rather than a link. Use when the row\n * triggers an action (open dialog, log out) rather than navigation. */\n asButton?: boolean;\n /** Wrap a custom link component (Next/Link, etc.) via Radix Slot\n * rather than rendering a plain <a>. Mutually exclusive with `asButton`. */\n asChild?: boolean;\n /** Disabled state — visual greying + pointer-events-none. */\n disabled?: boolean;\n /** Visible label. Use `children` so the JSX reads naturally — the\n * prop name is `children` not `label`. */\n children?: React.ReactNode;\n /** Tooltip override shown when sidebar is collapsed. Defaults to the\n * item's text content (children, when it's a string). */\n collapsedLabel?: React.ReactNode;\n /**\n * Row size.\n *\n * - `\"md\"` (default) — `text-sm font-medium`, the standard nav row.\n * - `\"sm\"` — `text-xs`, lighter weight + tighter padding. Use for\n * visually-subordinate rows (nested screens under a parent\n * project, sub-pages under a section, etc.) so the hierarchy is\n * legible without manual className overrides. Active state still\n * wins on color + weight so the current row pops at either size.\n */\n size?: \"sm\" | \"md\";\n /**\n * Secondary line shown beneath the label — typically metadata like\n * \"Edited 2m ago\", \"12 items\", or a brief description. Layout\n * adapts: the row becomes label + description stacked vertically,\n * with the icon vertically centered against the stack and the\n * badge anchored to the trailing edge as usual. Hidden when the\n * sidebar is collapsed (only the icon + tooltip remain).\n */\n description?: React.ReactNode;\n}\n\nconst SidebarItem = React.forwardRef<HTMLAnchorElement, SidebarItemProps>(\n (\n {\n icon,\n badge,\n active = false,\n asButton = false,\n asChild = false,\n disabled = false,\n collapsedLabel,\n size = \"md\",\n description,\n className,\n children,\n ...rest\n },\n ref,\n ) => {\n const { collapsed } = useSidebar(\"SidebarItem\");\n // Nesting depth from any enclosing SidebarTreeItem(s). Flat\n // sidebars are depth 0 and pay no extra padding; tree leaves\n // get 0.75rem of left inset per level so the chevron column\n // stays aligned.\n const depth = useTreeDepth();\n // Children indent matches the parent TreeItem's chevron+icon\n // column (chevron 1rem + gap 0.375rem + icon 1rem = ~1.5rem),\n // so a child's row content visually aligns with the parent's\n // label column — the canonical tree pattern. Tunable via the\n // `--gds-sidebar-tree-indent` CSS variable for consumers that\n // want tighter or looser nesting.\n const depthStyle = !collapsed && depth > 0\n ? {\n paddingLeft: `calc(0.5rem + ${depth} * var(--gds-sidebar-tree-indent, 1.5rem))`,\n }\n : undefined;\n\n // Size + active interact: at md, both states use font-medium;\n // at sm, inactive drops to font-normal so the row visually\n // recedes, but active keeps font-medium so the current row\n // still pops against its siblings.\n const isSm = size === \"sm\";\n const sizeClasses = isSm\n ? \"text-xs px-2 py-1\"\n : \"text-sm px-2 py-1.5\";\n const weightClass =\n isSm && !active ? \"font-normal\" : \"font-medium\";\n // Inactive color at sm is muted-foreground to match its lighter\n // role; md keeps the foreground/80 default. Active is the same\n // primary highlight in either size.\n const stateColor = active\n ? \"bg-primary/10 text-primary\"\n : isSm\n ? \"text-muted-foreground hover:bg-muted hover:text-foreground\"\n : \"text-foreground/80 hover:bg-muted hover:text-foreground\";\n\n // With a description the layout shifts from a single-line row\n // (items-center) to a two-line stack inside the label column —\n // icon stays vertically centered against the stack. Extra\n // vertical padding gives the second line breathing room. The\n // description is hidden when the sidebar is collapsed; only\n // the icon + tooltip survive in rail-collapsed mode.\n const hasDescription = !collapsed && description != null;\n const sharedClass = cn(\n \"group flex items-center gap-2.5 rounded-md transition-colors\",\n sizeClasses,\n weightClass,\n hasDescription && (isSm ? \"py-1.5\" : \"py-2\"),\n collapsed ? \"justify-center px-2 py-2\" : null,\n stateColor,\n disabled && \"opacity-50 pointer-events-none\",\n className,\n );\n\n const labelStack = hasDescription ? (\n <span className=\"flex min-w-0 flex-1 flex-col gap-0.5 text-left leading-tight\">\n <span className=\"truncate\">{children}</span>\n <span\n className={cn(\n \"truncate font-normal text-muted-foreground\",\n isSm ? \"text-[10px]\" : \"text-[11px]\",\n )}\n >\n {description}\n </span>\n </span>\n ) : (\n <span className=\"flex-1 truncate text-left\">{children}</span>\n );\n\n const body = (\n <>\n {icon && (\n <span className=\"shrink-0 [&>svg]:h-4 [&>svg]:w-4\" aria-hidden>\n {icon}\n </span>\n )}\n {!collapsed && labelStack}\n {!collapsed && badge !== undefined && badge !== null && (\n <span className=\"ml-auto inline-flex items-center justify-center rounded bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground\">\n {badge}\n </span>\n )}\n </>\n );\n\n let element: React.ReactElement;\n if (asChild) {\n // Stamp our classes onto whatever the consumer passed (e.g.\n // <Link>). `children` IS the link node in this mode — we don't\n // wrap it in extra DOM.\n element = (\n <Slot\n data-gds-part=\"sidebar-item\"\n data-active={active || undefined}\n aria-current={active ? \"page\" : undefined}\n className={sharedClass}\n style={depthStyle}\n >\n {children as React.ReactElement}\n </Slot>\n );\n } else if (asButton) {\n const {\n href: _href,\n target: _target,\n rel: _rel,\n download: _download,\n hrefLang: _hrefLang,\n ping: _ping,\n referrerPolicy: _referrerPolicy,\n type: _type,\n ...buttonRest\n } = rest as React.ButtonHTMLAttributes<HTMLButtonElement> &\n React.AnchorHTMLAttributes<HTMLAnchorElement>;\n element = (\n <button\n type=\"button\"\n // forwardRef here is anchor-typed, but for asButton we accept\n // mismatch — most consumers don't ref button rows; if they\n // need a button ref, drop asButton and use asChild with their\n // own <button>.\n data-gds-part=\"sidebar-item\"\n data-active={active || undefined}\n aria-current={active ? \"page\" : undefined}\n disabled={disabled}\n className={cn(sharedClass, \"w-full text-left\")}\n style={depthStyle}\n {...buttonRest}\n >\n {body}\n </button>\n );\n } else {\n element = (\n <a\n ref={ref}\n data-gds-part=\"sidebar-item\"\n data-active={active || undefined}\n aria-current={active ? \"page\" : undefined}\n aria-disabled={disabled || undefined}\n className={sharedClass}\n style={depthStyle}\n {...rest}\n >\n {body}\n </a>\n );\n }\n\n if (!collapsed) return element;\n\n // Collapsed: wrap in a Tooltip so the user can still discover the\n // label. `collapsedLabel` overrides the inferred children text.\n const tooltipLabel =\n collapsedLabel ?? (typeof children === \"string\" ? children : null);\n if (!tooltipLabel) return element;\n return (\n <Tooltip>\n <TooltipTrigger asChild>{element}</TooltipTrigger>\n <TooltipContent side=\"right\" sideOffset={8}>\n {tooltipLabel}\n {badge !== undefined && badge !== null && (\n <span className=\"ml-2 inline-flex items-center justify-center rounded bg-foreground/10 px-1.5 py-0 text-[10px]\">\n {badge}\n </span>\n )}\n </TooltipContent>\n </Tooltip>\n );\n },\n);\nSidebarItem.displayName = \"SidebarItem\";\n\n// ─── TreeItem (nested branches) ───────────────────────────────────────\n//\n// Notion-style nested page trees. A SidebarTreeItem is a collapsible\n// row that hosts more SidebarItem / SidebarTreeItem children, auto-\n// indented one level per nesting depth. Reads + writes the\n// SidebarTreeDepthContext so consumers don't have to thread depth\n// through their own props.\n//\n// Why not fold this into SidebarItem with an `expandable` flag: the\n// row shape diverges — TreeItem grows a chevron column on the LEFT\n// edge (where Item has the icon), and the \"label\" prop reads more\n// naturally as its own prop than as ambiguous children. Keeping them\n// as separate components also lets the model pick deliberately based\n// on intent (\"is this a leaf or a branch?\").\n\nexport interface SidebarTreeItemProps\n extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"children\" | \"title\"> {\n /** Row label. Required — without it the row has nothing to show. */\n label: React.ReactNode;\n /** Leading icon (folder, file, custom emoji). Shown to the right\n * of the chevron column. */\n icon?: React.ReactNode;\n /** Trailing badge — count, status. Hidden when sidebar is collapsed. */\n badge?: React.ReactNode;\n /** Marks the branch as the current route. Adds aria-current=\"page\"\n * on the row. */\n active?: boolean;\n /** Initial expanded state. Defaults `true` so the user can see what's\n * inside without having to click. */\n defaultExpanded?: boolean;\n /** Controlled expanded state — wire `onExpandedChange` to manage from\n * outside (useful when you want to persist tree state). */\n expanded?: boolean;\n onExpandedChange?: (next: boolean) => void;\n /** Disabled state. */\n disabled?: boolean;\n /** Nested children — SidebarItem or more SidebarTreeItem. */\n children?: React.ReactNode;\n /**\n * Secondary line shown beneath the label — same shape as\n * SidebarItem's `description`. Useful when a branch needs more\n * than just a name (last-edited timestamp, item count, owner).\n * Layout adapts to stack label + description; chevron and icon\n * stay vertically centered against the stack.\n */\n description?: React.ReactNode;\n /**\n * Right-edge action slot — settings cog, more-actions overflow,\n * \"+ add child\" affordance. Rendered as a sibling of the branch\n * button (not nested inside it, so `<button>` children inside\n * trailing remain valid HTML). Vertically centered against the\n * branch row, isolated from the expand/collapse click so a tap\n * on a trailing button doesn't toggle the tree.\n *\n * The wrapper container also exposes a `group/row` named-group\n * class so consumer-provided trailing can opt into hover-only\n * visibility via Tailwind's `group-hover/row:` variant\n * (`hidden group-hover/row:flex`) without writing custom CSS.\n * Hovering nested children rows does NOT trigger the group hover\n * — the named group is scoped to the branch row alone.\n */\n trailing?: React.ReactNode;\n}\n\nconst SidebarTreeItem = React.forwardRef<HTMLButtonElement, SidebarTreeItemProps>(\n function SidebarTreeItem(\n {\n label,\n icon,\n badge,\n active = false,\n defaultExpanded = true,\n expanded: controlledExpanded,\n onExpandedChange,\n disabled,\n description,\n trailing,\n className,\n style,\n children,\n ...rest\n },\n ref,\n ) {\n const { collapsed } = useSidebar(\"SidebarTreeItem\");\n const depth = useTreeDepth();\n const isControlled = controlledExpanded !== undefined;\n const [internalExpanded, setInternalExpanded] = React.useState(defaultExpanded);\n const expanded = isControlled ? controlledExpanded! : internalExpanded;\n\n const toggle = () => {\n const next = !expanded;\n if (!isControlled) setInternalExpanded(next);\n onExpandedChange?.(next);\n };\n\n // Collapsed sidebar — render children flat as if this branch\n // didn't have a header, same convention as SidebarSection. The\n // tree shape isn't readable in a 4rem-wide rail anyway.\n if (collapsed) {\n return (\n <SidebarTreeDepthContext.Provider value={depth}>\n {children}\n </SidebarTreeDepthContext.Provider>\n );\n }\n\n // Match the SidebarItem depth-indent math so nested TreeItems\n // line up with their leaf siblings. Same `--gds-sidebar-tree-indent`\n // CSS var drives both, in rem.\n const depthInset = depth * 1.5;\n\n return (\n <div data-gds-part=\"sidebar-tree-item\">\n {/* Branch row + optional trailing slot. The `group/row`\n named-group lets consumer-provided trailing content use\n `group-hover/row:` to reveal on hover without leaking\n the hover state to the nested children below. */}\n <div className=\"group/row relative\">\n <button\n ref={ref}\n type=\"button\"\n onClick={toggle}\n aria-expanded={expanded}\n aria-current={active ? \"page\" : undefined}\n data-active={active || undefined}\n disabled={disabled}\n className={cn(\n \"group flex w-full items-center gap-1.5 rounded-md py-1 text-sm font-medium transition-colors\",\n active\n ? \"bg-primary/10 text-primary\"\n : \"text-foreground/80 hover:bg-muted hover:text-foreground\",\n disabled && \"opacity-50 pointer-events-none\",\n // Reserve trailing padding when a trailing slot is\n // mounted so the label doesn't slide under the actions.\n trailing != null && \"pr-12\",\n className,\n )}\n style={{\n paddingLeft: `calc(0.25rem + ${depthInset}rem)`,\n paddingRight: trailing != null ? \"3rem\" : \"0.5rem\",\n ...style,\n }}\n {...rest}\n >\n <span\n className=\"inline-flex h-4 w-4 items-center justify-center text-muted-foreground shrink-0\"\n aria-hidden\n >\n {expanded ? (\n <ChevronDown className=\"h-3 w-3\" />\n ) : (\n <ChevronRight className=\"h-3 w-3\" />\n )}\n </span>\n {icon && (\n <span className=\"shrink-0 [&>svg]:h-4 [&>svg]:w-4\" aria-hidden>\n {icon}\n </span>\n )}\n {description != null ? (\n <span className=\"flex min-w-0 flex-1 flex-col gap-0.5 text-left leading-tight\">\n <span className=\"truncate\">{label}</span>\n <span className=\"truncate text-[11px] font-normal text-muted-foreground\">\n {description}\n </span>\n </span>\n ) : (\n <span className=\"flex-1 truncate text-left\">{label}</span>\n )}\n {badge !== undefined && badge !== null && (\n <span className=\"ml-auto inline-flex items-center justify-center rounded bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground\">\n {badge}\n </span>\n )}\n </button>\n {trailing != null && (\n <div\n // Stop click propagation so a click inside trailing\n // (the canonical 'open settings' button) doesn't bubble\n // to the row's toggle handler and accidentally flip\n // the expanded state. inset-y-0 anchors trailing to\n // the button's height so vertical centering tracks\n // size + description automatically.\n onClick={(e) => e.stopPropagation()}\n className=\"pointer-events-auto absolute inset-y-0 right-1.5 flex items-center gap-0.5\"\n >\n {trailing}\n </div>\n )}\n </div>\n {expanded && children && (\n <SidebarTreeDepthContext.Provider value={depth + 1}>\n <div className=\"space-y-[var(--gds-sidebar-section-gap,0.125rem)]\">\n {children}\n </div>\n </SidebarTreeDepthContext.Provider>\n )}\n </div>\n );\n },\n);\nSidebarTreeItem.displayName = \"SidebarTreeItem\";\n\n// ─── Compose + export ─────────────────────────────────────────────────\n\nSidebar.Header = SidebarHeader;\nSidebar.Content = SidebarContent;\nSidebar.Footer = SidebarFooter;\nSidebar.Section = SidebarSection;\nSidebar.Item = SidebarItem;\nSidebar.TreeItem = SidebarTreeItem;\n\nexport {\n Sidebar,\n SidebarHeader,\n SidebarContent,\n SidebarFooter,\n SidebarSection,\n SidebarItem,\n SidebarTreeItem,\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 + --gds-radius-*)\n * - Spacing density (--gds-density multiplier)\n * - Shadow, motion, and border vars (--gds-shadow-*, --gds-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 \"--gds-radius-sm\": theme.radius.sm,\n \"--gds-radius-md\": theme.radius.md,\n \"--gds-radius-lg\": theme.radius.lg,\n \"--gds-radius-xl\": theme.radius.xl,\n \"--gds-radius-2xl\": theme.radius[\"2xl\"],\n \"--gds-radius-full\": theme.radius.full,\n\n // --- Spacing density multiplier (consumed via calc()) ---\n \"--gds-density\": String(theme.spacing.densityFactor),\n\n // --- Shadows ---\n \"--gds-shadow-sm\": theme.effects.shadows.sm,\n \"--gds-shadow-md\": theme.effects.shadows.md,\n \"--gds-shadow-lg\": theme.effects.shadows.lg,\n \"--gds-shadow-xl\": theme.effects.shadows.xl,\n \"--gds-shadow-2xl\": theme.effects.shadows[\"2xl\"],\n \"--gds-shadow-inner\": theme.effects.shadows.inner,\n\n // --- Motion ---\n \"--gds-transition-fast\": theme.effects.motion.fast,\n \"--gds-transition-base\": theme.effects.motion.base,\n \"--gds-transition-slow\": theme.effects.motion.slow,\n \"--gds-transition-slower\": theme.effects.motion.slower,\n\n // --- Borders ---\n \"--gds-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. --gds-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-grade-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| \\`--gds-radius-sm\\` | \\`${radius.sm}\\` |\n| \\`--gds-radius-md\\` | \\`${radius.md}\\` |\n| \\`--gds-radius-lg\\` | \\`${radius.lg}\\` |\n| \\`--gds-radius-xl\\` | \\`${radius.xl}\\` |\n| \\`--gds-radius-2xl\\` | \\`${radius[\"2xl\"]}\\` |\n| \\`--gds-radius-full\\` | \\`${radius.full}\\` |\n\n### Spacing\n\n- **Density factor**: \\`${spacing.densityFactor}\\` (applied as \\`var(--gds-density)\\` on components that opt in)\n- **Base unit**: \\`${spacing.baseUnit}\\`\n\n### Motion\n\n| Var | Duration |\n|-----|----------|\n| \\`--gds-transition-fast\\` | \\`${effects.motion.fast}\\` |\n| \\`--gds-transition-base\\` | \\`${effects.motion.base}\\` |\n| \\`--gds-transition-slow\\` | \\`${effects.motion.slow}\\` |\n| \\`--gds-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| \\`--gds-shadow-sm\\` | \\`${effects.shadows.sm}\\` |\n| \\`--gds-shadow-md\\` | \\`${effects.shadows.md}\\` |\n| \\`--gds-shadow-lg\\` | \\`${effects.shadows.lg}\\` |\n| \\`--gds-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, Callout, Skeleton, Separator,\n HoverCard, Popover, Dialog, Sheet, Tooltip, Progress, DropdownMenu,\n Command, Tabs, 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\">\\`, \\`<Callout 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 = `grade-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 = \"grade-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 = \"grade-theme\";\nconst STORAGE_MODE_KEY = \"grade-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-grade-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","import * as React from \"react\";\nimport type { Coords, MarkerHandle } from \"./types\";\n\nexport type MapContextValue = {\n /**\n * Called by `<MapMarker>` on mount. Returns null if the adapter\n * isn't ready yet (the marker will retry on the next render via\n * effect re-run).\n */\n registerMarker: (\n id: string,\n coords: Coords,\n anchor: \"center\" | \"bottom\"\n ) => MarkerHandle | null;\n};\n\nexport const MapContext = React.createContext<MapContextValue | null>(null);\n\nexport function useMapContext(): MapContextValue | null {\n return React.useContext(MapContext);\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { useMaybeGradeTheme } from \"../../grade-theme-provider\";\nimport { MapContext, type MapContextValue } from \"./context\";\nimport type {\n AdapterFactory,\n AdapterInstance,\n Coords,\n MapHandle,\n MapProps,\n MarkerHandle,\n} from \"./types\";\n\nconst ADAPTER_LOADERS: Record<\n \"maplibre\" | \"mapbox\" | \"google\",\n () => Promise<AdapterFactory>\n> = {\n maplibre: () =>\n import(\"./adapters/maplibre\").then((m) => m.createMaplibreAdapter),\n mapbox: () =>\n import(\"./adapters/mapbox\").then((m) => m.createMapboxAdapter),\n google: () =>\n import(\"./adapters/google\").then((m) => m.createGoogleAdapter),\n};\n\nconst MARKER_WARN_THRESHOLD = 500;\n\nconst Map = React.forwardRef<MapHandle, MapProps>(function Map(props, ref) {\n const {\n center,\n zoom,\n bounds,\n appearance = \"auto\",\n interactive = true,\n hoveredId,\n onHoveredIdChange,\n onLoad,\n onError,\n className,\n style,\n children,\n ...rest\n } = props;\n\n // Provider + provider-specific config (narrowed at the type level by MapProps,\n // erased here so the runtime can read them uniformly).\n const provider =\n (rest as { provider?: \"maplibre\" | \"mapbox\" | \"google\" }).provider ??\n \"maplibre\";\n const styleUrl = (rest as { styleUrl?: string }).styleUrl;\n const tilerKey = (rest as { tilerKey?: string }).tilerKey;\n const accessToken = (rest as { accessToken?: string }).accessToken;\n const apiKey = (rest as { apiKey?: string }).apiKey;\n const mapId = (rest as { mapId?: string }).mapId;\n\n const containerRef = React.useRef<HTMLDivElement | null>(null);\n const adapterRef = React.useRef<AdapterInstance | null>(null);\n const markerRegistryRef = React.useRef<globalThis.Map<string, MarkerHandle>>(\n new globalThis.Map()\n );\n const lastHoveredRef = React.useRef<string | null>(null);\n\n // `adapterReady` is the signal MapMarker effects watch via the context\n // value's identity. When the adapter finishes its async init we flip\n // this true; the contextValue useMemo below has [adapterReady] as a\n // dep, so a fresh context object propagates to every <MapMarker>,\n // their `useEffect(..., [ctx, id])` re-runs, and `registerMarker`\n // fires the second time with adapterRef.current populated. Without\n // this signal markers race the adapter init and stay unregistered.\n const [adapterReady, setAdapterReady] = React.useState(false);\n\n // Latest-callback refs so the adapter init effect doesn't churn on prop changes.\n const onHoveredChangeRef = React.useRef(onHoveredIdChange);\n const onErrorRef = React.useRef(onError);\n const onLoadRef = React.useRef(onLoad);\n React.useEffect(() => {\n onHoveredChangeRef.current = onHoveredIdChange;\n onErrorRef.current = onError;\n onLoadRef.current = onLoad;\n });\n\n const themeCtx = useMaybeGradeTheme();\n const isDark = themeCtx?.isDark ?? false;\n\n const resolvedAppearance: \"light\" | \"dark\" | \"satellite\" =\n appearance === \"auto\" ? (isDark ? \"dark\" : \"light\") : appearance;\n\n // -------- adapter init (re-runs only on identity-changing config) --------\n React.useEffect(() => {\n let cancelled = false;\n const container = containerRef.current;\n if (!container) return;\n\n const initialAppearance =\n appearance === \"auto\" ? (isDark ? \"dark\" : \"light\") : appearance;\n\n (async () => {\n try {\n const factory = await ADAPTER_LOADERS[provider]();\n if (cancelled) return;\n\n const adapter = await factory(\n container,\n {\n center,\n zoom,\n bounds,\n appearance: initialAppearance,\n interactive,\n styleUrl,\n tilerKey,\n accessToken,\n apiKey,\n mapId,\n },\n {\n onLoad: () => {\n /* called by adapter once it's ready; we use the return value below */\n },\n onError: (err) => onErrorRef.current?.(err),\n onMarkerHover: (id) => onHoveredChangeRef.current?.(id),\n onMarkerClick: () => {\n /* per-marker onClick is dispatched via DOM listeners on the marker element */\n },\n }\n );\n\n if (cancelled) {\n adapter.destroy();\n return;\n }\n\n adapterRef.current = adapter;\n setAdapterReady(true);\n onLoadRef.current?.(buildHandle(adapterRef, markerRegistryRef));\n } catch (err) {\n if (cancelled) return;\n // sdk-missing / api-key-missing / provider-init-failed are already\n // reported via onError inside the adapter. Anything else: report.\n const code = (err as { code?: string })?.code;\n if (!code) {\n onErrorRef.current?.({\n code: \"provider-init-failed\",\n message: (err as Error)?.message ?? \"Map init failed\",\n cause: err,\n });\n }\n }\n })();\n\n return () => {\n cancelled = true;\n adapterRef.current?.destroy();\n adapterRef.current = null;\n setAdapterReady(false);\n markerRegistryRef.current.clear();\n lastHoveredRef.current = null;\n };\n // Only re-init on provider/key/style changes — center/zoom/etc. are imperative.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [provider, styleUrl, accessToken, apiKey, mapId, tilerKey]);\n\n // -------- imperative prop sync --------\n React.useEffect(() => {\n adapterRef.current?.setAppearance(resolvedAppearance);\n }, [resolvedAppearance]);\n\n React.useEffect(() => {\n adapterRef.current?.setInteractive(interactive);\n }, [interactive]);\n\n React.useEffect(() => {\n if (!adapterRef.current) return;\n if (bounds) {\n adapterRef.current.setBounds(bounds[0], bounds[1]);\n } else {\n adapterRef.current.setCenter(center);\n adapterRef.current.setZoom(zoom);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n center[0],\n center[1],\n zoom,\n bounds?.[0]?.[0],\n bounds?.[0]?.[1],\n bounds?.[1]?.[0],\n bounds?.[1]?.[1],\n ]);\n\n // -------- hovered-id sync (controlled) --------\n React.useEffect(() => {\n const prev = lastHoveredRef.current;\n if (prev && prev !== hoveredId) {\n markerRegistryRef.current.get(prev)?.setHovered(false);\n }\n if (hoveredId) {\n markerRegistryRef.current.get(hoveredId)?.setHovered(true);\n }\n lastHoveredRef.current = hoveredId ?? null;\n }, [hoveredId]);\n\n // -------- imperative ref handle --------\n React.useImperativeHandle(\n ref,\n () => buildHandle(adapterRef, markerRegistryRef),\n []\n );\n\n // -------- marker registration context --------\n // Deps include `adapterReady` so the context value's identity changes\n // when the adapter finishes loading — MapMarker effects re-run and\n // get a non-null handle from registerMarker on the second pass.\n const contextValue = React.useMemo<MapContextValue>(\n () => ({\n registerMarker: (id, coords, anchor) => {\n const adapter = adapterRef.current;\n if (!adapter) return null;\n\n const handle = adapter.addMarker(id, coords, anchor);\n markerRegistryRef.current.set(id, handle);\n\n if (\n process.env.NODE_ENV !== \"production\" &&\n markerRegistryRef.current.size === MARKER_WARN_THRESHOLD + 1\n ) {\n // eslint-disable-next-line no-console\n console.warn(\n `@gradeui/ui Map: rendering ${markerRegistryRef.current.size} markers. ` +\n \"DOM markers degrade past ~1k. Consider clustering via the .instance escape hatch.\"\n );\n }\n\n // Wrap remove so registry stays in sync.\n const originalRemove = handle.remove;\n handle.remove = () => {\n originalRemove();\n markerRegistryRef.current.delete(id);\n if (lastHoveredRef.current === id) lastHoveredRef.current = null;\n };\n // Apply current hover state immediately if this id is the hovered one.\n if (hoveredId === id) handle.setHovered(true);\n return handle;\n },\n }),\n // hoveredId omitted intentionally — registerMarker reads from closure on call,\n // but since `<MapMarker>` only registers once on mount and hoveredId sync\n // happens via the dedicated effect, this is safe.\n [adapterReady]\n );\n\n return (\n <div\n ref={containerRef}\n data-gds-part=\"map\"\n className={cn(\"gds-map relative isolate overflow-hidden\", className)}\n style={{\n borderRadius: \"var(--gds-map-radius, var(--radius, 0.5rem))\",\n border: \"var(--gds-map-border, 1px solid var(--border, transparent))\",\n ...style,\n }}\n >\n <MapContext.Provider value={contextValue}>{children}</MapContext.Provider>\n </div>\n );\n});\n\nMap.displayName = \"Map\";\n\nfunction buildHandle(\n adapterRef: React.MutableRefObject<AdapterInstance | null>,\n registryRef: React.MutableRefObject<globalThis.Map<string, MarkerHandle>>\n): MapHandle {\n const noop = () => undefined;\n return {\n flyTo: (idOrCoords, opts) => {\n const adapter = adapterRef.current;\n if (!adapter) return;\n let target: Coords | null;\n if (typeof idOrCoords === \"string\") {\n target = registryRef.current.get(idOrCoords)?.coords ?? null;\n if (!target) {\n // eslint-disable-next-line no-console\n console.warn(\n `@gradeui/ui Map.flyTo: no marker registered with id \"${idOrCoords}\".`\n );\n return;\n }\n } else {\n target = idOrCoords;\n }\n adapter.flyTo(target, opts);\n },\n panTo: (coords, opts) => adapterRef.current?.panTo(coords, opts) ?? noop(),\n fitBounds: (coords, opts) =>\n adapterRef.current?.fitBounds(coords, opts) ?? noop(),\n getCenter: () => adapterRef.current?.getCenter() ?? [0, 0],\n getZoom: () => adapterRef.current?.getZoom() ?? 0,\n getBounds: () =>\n adapterRef.current?.getBounds() ?? [\n [0, 0],\n [0, 0],\n ],\n get instance() {\n return adapterRef.current?.instance ?? null;\n },\n };\n}\n\nexport { Map };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { cn } from \"@/lib/utils\";\nimport { useMapContext } from \"./context\";\nimport type { Coords, MapMarkerProps, MarkerHandle } from \"./types\";\n\nconst MapMarker = React.memo(function MapMarker({\n id,\n at,\n anchor = \"bottom\",\n className,\n children,\n onClick,\n}: MapMarkerProps) {\n const ctx = useMapContext();\n const [el, setEl] = React.useState<HTMLElement | null>(null);\n const handleRef = React.useRef<MarkerHandle | null>(null);\n const onClickRef = React.useRef(onClick);\n React.useEffect(() => {\n onClickRef.current = onClick;\n });\n\n // Register on mount; re-register if context becomes available later.\n // We deliberately don't depend on `at` / `anchor` here — those are pushed\n // imperatively below to avoid expensive re-registration on every move.\n React.useEffect(() => {\n if (!ctx) return;\n const handle = ctx.registerMarker(id, at, anchor);\n if (handle) {\n handleRef.current = handle;\n setEl(handle.element);\n\n const onDomClick = (e: MouseEvent) => {\n onClickRef.current?.({ id, coords: handle.coords, native: e });\n };\n handle.element.addEventListener(\"click\", onDomClick);\n\n return () => {\n handle.element.removeEventListener(\"click\", onDomClick);\n handle.remove();\n handleRef.current = null;\n setEl(null);\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ctx, id]);\n\n // Update marker position when `at` changes — no re-register.\n React.useEffect(() => {\n handleRef.current?.setPosition(at as Coords);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [at[0], at[1]]);\n\n if (!el) return null;\n\n return createPortal(\n <div\n data-gds-part=\"map-marker-content\"\n className={cn(\"pointer-events-auto\", className)}\n >\n {children}\n </div>,\n el\n );\n});\n\nMapMarker.displayName = \"MapMarker\";\n\nexport { MapMarker };\n","\"use client\";\n\n/**\n * MediaSurface — the shared shell used by VideoPlayer, RivePlayer, ThreeScene\n * AND the canonical \"media slot\" primitive for still images, posters, album\n * art, etc.\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 * - **empty-state placeholder** with format-suggesting glyph + alt caption\n *\n * Design-system note: all visual dimensions are backed by CSS vars so\n * consumers can retheme via `--gds-media-radius`, `--gds-media-border`,\n * `--gds-media-placeholder-bg`, `--gds-media-placeholder-fg`. The\n * placeholder pair drives the empty-state treatment — it's the canonical\n * \"image not yet loaded\" surface across Grade until the image-generation\n * pipeline replaces empty slots with real pictures. Custom placeholder UI\n * elsewhere in the product should consume the same vars so we stay\n * visually coherent.\n * (These will rename to `--gds-*` when the broader codebase rename lands.)\n *\n * The placeholder uses a **size-tiered** rendering: sub-64px slots show\n * initials only (avatar-density), 64-160px show the format glyph alone,\n * and >160px add the alt text as a small caption beneath the glyph. The\n * tier is measured via ResizeObserver — we deliberately don't lean on CSS\n * container queries here so the component works in projects whose Tailwind\n * config doesn't have the container-queries plugin installed.\n *\n * **Do NOT wrap <Avatar> inside <MediaSurface>** to get a 2-letter initials\n * fallback. That pattern conflates two primitives — Avatar is for people\n * only (circular, social context); MediaSurface is for everything else\n * (square album art, wide landscapes, portrait posters). Set `alt` + `hint`\n * on MediaSurface directly and you get the same initials affordance with\n * the right semantics.\n */\n\nimport * as React from \"react\";\nimport {\n Book,\n Box,\n Clapperboard,\n Code2,\n Disc3,\n Film,\n Gamepad2,\n Image as ImageIcon,\n Mountain,\n Music,\n Package,\n Tv,\n User,\n UtensilsCrossed,\n Video,\n} from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\n\nexport type MediaAspect = \"video\" | \"square\" | \"portrait\" | \"wide\" | \"auto\";\nexport type MediaRadius = \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\n/**\n * What kind of media is this slot intended for? Drives three things:\n * 1. The glyph rendered in the empty-state placeholder.\n * 2. The default `aspect` when the caller hasn't pinned one.\n * 3. The future generation pipeline's provider routing (album →\n * MusicBrainz cover-art, poster → TMDB, generic → Gemini, etc.).\n *\n * Kept as a small finite union so the Settings panel can render it as a\n * glyph-led toggle picker rather than a free-text input. Adding a hint\n * here means adding a glyph in `HINT_GLYPH` and a default aspect in\n * `HINT_DEFAULT_ASPECT` below — both maps are checked exhaustively.\n */\nexport type MediaHint =\n | \"album\"\n | \"tv-show\"\n | \"movie\"\n | \"game\"\n | \"book\"\n | \"portrait\"\n | \"landscape\"\n | \"poster\"\n | \"product\"\n | \"food\"\n | \"video\"\n | \"audio\"\n | \"embed\"\n | \"3d\"\n | \"generic\";\n\n/**\n * Structured metadata the future generation pipeline reads to look up real\n * imagery for this slot. The component itself never renders from `source` —\n * it's purely declarative until the generator walks the JSX and patches in\n * `src` values. Discriminated by `kind` so we can route per-provider:\n *\n * album → MusicBrainz Cover Art Archive (free, no auth)\n * tv-show → TMDb (free with key)\n * movie → TMDb (free with key)\n * game → IGDB (free, Twitch OAuth)\n * book → OpenLibrary (free, no auth)\n * poster → Picsum (or wired generator)\n * portrait → Picsum (until prompt-aware generator lands)\n * landscape→ Picsum (until prompt-aware generator lands)\n * product → Picsum (until prompt-aware generator lands)\n * food → Picsum (until prompt-aware generator lands)\n * generic → Picsum\n * video/audio/embed/3d → no auto-gen; user provides\n *\n * Every variant optionally carries a `description` string — populated\n * by Studio from the surface's `alt` prop via the Generate Image\n * action. Prompt-aware providers use it as the user-intent prompt;\n * lookup providers (MusicBrainz, TMDb, …) ignore unknown fields.\n */\nexport type MediaSource =\n | { kind: \"album\"; artist: string; title: string; year?: number; description?: string }\n | { kind: \"tv-show\"; title: string; year?: number; description?: string }\n | { kind: \"movie\"; title: string; year?: number; description?: string }\n | { kind: \"game\"; title: string; description?: string }\n | { kind: \"book\"; title?: string; author?: string; isbn?: string; description?: string }\n | { kind: \"portrait\"; name?: string; role?: string; description?: string }\n | { kind: \"landscape\"; location?: string; mood?: string; description?: string }\n | { kind: \"poster\"; title: string; year?: number; description?: string }\n | { kind: \"product\"; name?: string; brand?: string; description?: string }\n | { kind: \"food\"; dish?: string; cuisine?: string; description?: string }\n | { kind: \"video\" }\n | { kind: \"audio\" }\n | { kind: \"embed\" }\n | { kind: \"3d\" }\n | { kind: \"generic\"; prompt: string; description?: string };\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\n/**\n * Hint → glyph map. Lucide icons chosen to be visually unambiguous at\n * placeholder size (the glyph fills roughly 1/3 of the surface). Override\n * per-instance via the `glyph` prop, or globally per-theme by overriding\n * `--gds-media-hint-{name}-glyph` with a `url(...)` value (advanced).\n */\nconst HINT_GLYPH: Record<MediaHint, React.ComponentType<{ className?: string }>> = {\n album: Disc3,\n \"tv-show\": Tv,\n movie: Clapperboard,\n game: Gamepad2,\n book: Book,\n portrait: User,\n landscape: Mountain,\n poster: Film,\n product: Package,\n food: UtensilsCrossed,\n video: Video,\n audio: Music,\n embed: Code2,\n \"3d\": Box,\n generic: ImageIcon,\n};\n\n/**\n * Hint → default aspect ratio. Applied when the caller didn't pin `aspect`\n * explicitly. Matches the natural framing each format gets in real layouts:\n * albums are square, posters and people are portrait, landscapes/video are\n * wide. Falls back to \"video\" (16:9) for anything where the convention is\n * less load-bearing (`embed`, `3d`, `generic`, `audio`).\n */\nconst HINT_DEFAULT_ASPECT: Record<MediaHint, MediaAspect> = {\n album: \"square\",\n \"tv-show\": \"portrait\",\n movie: \"portrait\",\n game: \"portrait\",\n book: \"portrait\",\n portrait: \"portrait\",\n landscape: \"wide\",\n poster: \"portrait\",\n product: \"square\",\n food: \"square\",\n video: \"video\",\n audio: \"video\",\n embed: \"video\",\n \"3d\": \"square\",\n generic: \"video\",\n};\n\n/**\n * Stable lookup key for a source descriptor. **MUST** match the\n * `sourceKey()` implementation in `@gradeui/media/sources/router.ts` —\n * they're the two halves of the runtime URL-map handshake. The server\n * keys its returned URL map by this string; MediaSurface looks up its\n * resolved URL with this same string.\n *\n * We duplicate the function here rather than importing from `@gradeui/media`\n * because `@gradeui/ui` cannot depend on a server-only package. Any\n * change to the algorithm needs to land in both places — the duplication\n * is tiny (one switch, no other state) and the risk of drift is bounded\n * by the discriminated-union shape.\n */\nfunction sourceKeyFor(source: MediaSource | undefined): string | null {\n if (!source) return null;\n switch (source.kind) {\n case \"album\":\n return `album:${source.artist}|${source.title}|${source.year ?? \"\"}`;\n case \"tv-show\":\n return `tv-show:${source.title}|${source.year ?? \"\"}`;\n case \"movie\":\n return `movie:${source.title}|${source.year ?? \"\"}`;\n case \"game\":\n return `game:${source.title}`;\n case \"book\":\n return `book:${source.isbn ?? \"\"}|${source.title ?? \"\"}|${source.author ?? \"\"}`;\n case \"poster\":\n return `poster:${source.title}|${source.year ?? \"\"}`;\n case \"portrait\":\n return `portrait:${source.name ?? \"\"}|${source.role ?? \"\"}`;\n case \"landscape\":\n return `landscape:${source.location ?? \"\"}|${source.mood ?? \"\"}`;\n case \"product\":\n return `product:${source.brand ?? \"\"}|${source.name ?? \"\"}`;\n case \"food\":\n return `food:${source.dish ?? \"\"}|${source.cuisine ?? \"\"}`;\n case \"generic\":\n return `generic:${source.prompt}`;\n default:\n return `${(source as { kind: string }).kind}:`;\n }\n}\n\n/**\n * Subscribe to the runtime URL map exposed by Studio (and any other host\n * that wants to wire the same protocol). The map lives on `window.__gradeMediaUrls`\n * — a `Record<sourceKey, url>` — and emits `grade:media-urls-updated`\n * whenever it changes. Components reading the map re-render on the event.\n *\n * Headless / server-rendered consumers get an empty map; the resolution\n * only kicks in client-side.\n *\n * The map is intentionally **decoupled** from React context so consuming\n * apps don't have to thread a provider through their tree — MediaSurface\n * can be dropped anywhere in any layout and the URL map \"just works\"\n * once the host writes to the global. Studio's iframe agent writes to\n * the global in response to the \"Fill images\" flow; other integrations\n * (e.g. an MCP server, a CLI codemod) can use the same protocol.\n */\ntype MediaUrlMap = Record<string, string>;\n/**\n * Per-instance prop overrides, keyed by the same `sourceKey` as the\n * URL map. Each entry is a partial MediaSurface props bag — only the\n * keys the user has customised for THIS specific slot. The studio\n * settings panel writes overrides via the `grade:component-action`\n * event with kind `\"set-media-override\"`; this component reads\n * `overrides[myKey]` at render and merges on top of its JSX props\n * so an edit on Discovery doesn't ripple to every other album in the\n * same `.map()`. See `useResolvedOverride` below.\n */\ntype MediaOverrideMap = Record<string, Partial<{\n hint: MediaHint;\n aspect: MediaAspect;\n radius: MediaRadius;\n border: boolean;\n loading: boolean;\n alt: string;\n src: string;\n emptyState: \"auto\" | \"icon\" | \"none\";\n}>>;\ndeclare global {\n interface Window {\n __gradeMediaUrls?: MediaUrlMap;\n __gradeMediaOverrides?: MediaOverrideMap;\n }\n}\nfunction useResolvedSrc(source: MediaSource | undefined): string | undefined {\n const key = sourceKeyFor(source);\n const [version, setVersion] = React.useState(0);\n React.useEffect(() => {\n if (typeof window === \"undefined\") return;\n const handler = () => setVersion((n) => n + 1);\n window.addEventListener(\"grade:media-urls-updated\", handler);\n return () => window.removeEventListener(\"grade:media-urls-updated\", handler);\n }, []);\n // `version` participates in the dep array so re-renders pick up the\n // latest map after an event fires. We don't store the URL itself in\n // state because the map is the source of truth — keeping it in state\n // would leave stale URLs behind if the map shrinks.\n React.useEffect(() => {\n // no-op — placeholder so `version` is consumed and the lint rule\n // doesn't complain about an unused variable in StrictMode.\n }, [version]);\n if (!key || typeof window === \"undefined\") return undefined;\n return window.__gradeMediaUrls?.[key];\n}\n\n/**\n * Per-instance prop override. Keyed by sourceKey — same trick the URL\n * map uses — so each rendered MediaSurface in a `.map()` reads only\n * its own customisations. The hook re-renders the component whenever\n * the global override map fires `grade:media-overrides-updated`. With\n * no source descriptor, there's no key, no override possible — returns\n * undefined so the caller falls through to the JSX-prop value.\n */\nfunction useResolvedOverride(source: MediaSource | undefined):\n | MediaOverrideMap[string]\n | undefined {\n const key = sourceKeyFor(source);\n const [version, setVersion] = React.useState(0);\n React.useEffect(() => {\n if (typeof window === \"undefined\") return;\n const handler = () => setVersion((n) => n + 1);\n window.addEventListener(\"grade:media-overrides-updated\", handler);\n return () =>\n window.removeEventListener(\"grade:media-overrides-updated\", handler);\n }, []);\n React.useEffect(() => {\n // see useResolvedSrc — same dep-array trick to keep StrictMode quiet.\n }, [version]);\n if (!key || typeof window === \"undefined\") return undefined;\n return window.__gradeMediaOverrides?.[key];\n}\n\n/**\n * Strip leading articles + connectors from a label and take the initials\n * of the first two meaningful words. Single-word labels fall back to the\n * first two characters. Used by the placeholder's small-tier render to\n * give the slot a meaningful glyph at avatar density.\n *\n * Examples:\n * \"Travelling Without Moving\" → \"TW\"\n * \"The Beatles\" → \"BE\" (skip \"The\", single word left)\n * \"Jamiroquai\" → \"JA\"\n * \"Album cover for Jamiroquai\" → \"AC\" (acceptable; alt text shape)\n */\nfunction deriveInitials(alt: string | undefined): string {\n if (!alt) return \"\";\n const stop = /^(the|a|an|and|for|by|of|in|on|at|to)$/i;\n const words = alt.trim().split(/\\s+/).filter((w) => w && !stop.test(w));\n if (words.length === 0) {\n return alt.replace(/\\s+/g, \"\").slice(0, 2).toUpperCase();\n }\n if (words.length === 1) {\n return words[0].slice(0, 2).toUpperCase();\n }\n return (words[0][0] + words[1][0]).toUpperCase();\n}\n\n/**\n * Tier the placeholder render against the surface's actual rendered width.\n * Thresholds chosen empirically: avatar-shaped UI sits at 40-64px, content-\n * card thumbnails at 100-160px, hero-sized media at >160px.\n */\ntype PlaceholderTier = \"sm\" | \"md\" | \"lg\";\nfunction tierFromWidth(w: number): PlaceholderTier {\n if (w < 64) return \"sm\";\n if (w >= 160) return \"lg\";\n return \"md\";\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 /**\n * Controls the empty-state placeholder shown when no `src`, `children`,\n * and no `loading` state are provided. Default `\"auto\"` renders the\n * size-tiered placeholder (initials / glyph / glyph + caption depending\n * on the slot's rendered width — see `tierFromWidth`). Use `\"none\"` for\n * a truly empty surface (e.g. a custom decorative overlay that needs\n * the surface clean), or pass a node to fully override.\n *\n * Legacy `\"icon\"` is kept as an alias for `\"auto\"` so the previous API\n * doesn't break.\n */\n emptyState?: \"auto\" | \"icon\" | \"none\" | React.ReactNode;\n /**\n * What kind of media is intended for this slot — drives the placeholder\n * glyph, the default `aspect` when unset, and the future generator's\n * provider routing. See `MediaHint`. Defaults to `\"generic\"` (image icon).\n */\n hint?: MediaHint;\n /**\n * Descriptive label for the slot. Used three ways:\n * 1. The `alt` attribute on the rendered `<img>` when `src` is set.\n * 2. The caption shown beneath the glyph in the large placeholder tier.\n * 3. The source string for derived 2-letter initials in the small tier.\n * Strongly recommended — without it the placeholder is anonymous and the\n * eventual image has no a11y label.\n */\n alt?: string;\n /**\n * Structured metadata for the generation pipeline. Opaque to MediaSurface\n * itself (it just stamps `data-media-source-kind` on the root for\n * inspector visibility); read by the generator AST walker to look up real\n * imagery from the right provider. See `MediaSource`.\n */\n source?: MediaSource;\n /**\n * When set, MediaSurface renders an `<img>` filling the slot via\n * object-cover. The wrapper keeps its aspect / radius / border chrome.\n * Convenience prop so callers don't have to write the `<img>` themselves;\n * also the target the future generator patches into when filling slots.\n */\n src?: string;\n /**\n * Override the hint-derived glyph for one-off cases. Most consumers\n * should pick a `hint` and let the map decide; this is the escape\n * hatch for special slots that don't fit the canonical set.\n */\n glyph?: React.ReactNode;\n /**\n * Stable identifier for this specific MediaSurface instance, stamped\n * on the root as `data-gds-instance-id`. When the JSX renders a list\n * of MediaSurfaces from a data array (`.map(a => <MediaSurface\n * instanceId={a.id} ... />)`), this is how Studio's selection agent\n * tells THIS card apart from its siblings — every other prop is\n * either shared via the template (hint, aspect) or content that\n * happens to differ but isn't guaranteed unique.\n *\n * Combined with the data-array-mutator path, this is what makes\n * \"click Discovery, change its alt text, only Discovery's alt\n * changes\" actually work — the panel finds the data entry whose\n * `id` matches `instanceId` and patches just that entry.\n *\n * No-op if omitted (standalone MediaSurfaces don't need it).\n */\n instanceId?: string;\n /**\n * Content layered ON TOP of the media (or placeholder) — play buttons,\n * hover gradients, corner badges, watch-progress bars. Renders in its\n * own absolutely-positioned layer at the highest z-index. Importantly,\n * an overlay does NOT suppress the empty-state placeholder: a play\n * button hovering over an unfilled album slot is still meaningfully\n * unfilled, and we want the placeholder to read through it. Use\n * `children` for content that REPLACES the media (custom canvas/video);\n * use `overlay` for content that DECORATES it.\n */\n overlay?: React.ReactNode;\n children?: React.ReactNode;\n}\n\nexport const MediaSurface = React.forwardRef<HTMLDivElement, MediaSurfaceProps>(\n (\n {\n className,\n aspect: aspectProp,\n radius: radiusProp = \"lg\",\n border: borderProp = false,\n loading: loadingProp = false,\n onVisibilityChange,\n fallback,\n emptyState: emptyStateProp = \"auto\",\n hint: hintProp = \"generic\",\n alt: altProp,\n source,\n src: srcProp,\n glyph,\n overlay,\n instanceId,\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 // ─── Prop resolution ─────────────────────────────────────────\n // JSX is the single source of truth. Studio's \"Fill images\" and\n // settings-panel edits write directly into the data-array entries\n // that back these props (`src: \"...\"`, `hint: \"poster\"` etc.), so\n // there's no separate override store to merge from any more.\n //\n // The old override path (a per-instance prop map keyed by\n // sourceKey, persisted to localStorage and merged here on render)\n // had three failure modes that the JSX-as-truth model eliminates\n // in one move: stale entries surviving across designs, empty-\n // string entries that beat the JSX via `??`, and the export-to-\n // CodeSandbox blank-imagery problem (the override map didn't\n // travel with the JSX). All gone.\n const hint: MediaHint = hintProp;\n const aspect: MediaAspect | undefined = aspectProp;\n const radius: MediaRadius = radiusProp;\n const border: boolean = borderProp;\n const loading: boolean = loadingProp;\n const alt: string | undefined = altProp;\n const src: string | undefined = srcProp;\n const emptyState = emptyStateProp;\n\n // Resolve aspect: explicit prop wins; otherwise pick the natural default\n // for the hint (album → square, landscape → wide, etc.). Falls through\n // to \"video\" via HINT_DEFAULT_ASPECT if hint is unset.\n const resolvedAspect: MediaAspect = aspect ?? HINT_DEFAULT_ASPECT[hint];\n\n // Visibility observer (existing behaviour — left in place).\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 // Size observer for the tiered placeholder. The placeholder is now\n // ALWAYS rendered (behind any `src`/`children`) so that Studio's\n // wireframe-mode CSS can hide the image layer and reveal the\n // placeholder beneath without re-mounting the tree. The observer\n // runs whenever there's a placeholder to size-tier — which is\n // anything but `emptyState=\"none\"` + no children. Custom `children`\n // (escape hatch — caller fully owns the surface) still suppress\n // the placeholder, since whatever they're rendering IS the content.\n const hasPlaceholder = !children && emptyState !== \"none\";\n const [tier, setTier] = React.useState<PlaceholderTier>(\"md\");\n React.useEffect(() => {\n if (!hasPlaceholder) return;\n const el = innerRef.current;\n if (!el) return;\n const ro = new ResizeObserver(([entry]) => {\n const w = entry.contentRect.width;\n setTier(tierFromWidth(w));\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, [hasPlaceholder]);\n\n const initials = React.useMemo(() => deriveInitials(alt), [alt]);\n const HintGlyph = HINT_GLYPH[hint] ?? ImageIcon;\n // Legacy `emptyState=\"icon\"` is treated as the new `\"auto\"` default.\n const useAutoPlaceholder =\n emptyState === \"auto\" || emptyState === \"icon\";\n\n // Effective src — straight from the JSX. The DS stamps\n // `data-media-source` as a JSON blob whenever a `source` is\n // present so an external walker (Studio's selection-agent inside\n // the Sandpack iframe) can collect runtime-evaluated sources, hand\n // them to a resolver, and write the resulting URL back into the\n // JSX. Once it's in the JSX it lives on `srcProp` and just renders\n // — no parallel URL map, no override merge.\n const candidateSrc = src;\n const sourceJson = React.useMemo(\n () => (source ? JSON.stringify(source) : undefined),\n [source],\n );\n // Track broken URLs so a 404/timeout doesn't leave the user staring\n // at the browser's generic \"broken image\" icon. When `onError`\n // fires we drop the src — the content layer unmounts and the\n // tiered placeholder underneath shows through, so the slot reads\n // as \"not yet filled\" rather than \"broken.\" Reset whenever the\n // candidate src changes (a new URL is its own retry).\n const [imgErrored, setImgErrored] = React.useState(false);\n React.useEffect(() => {\n setImgErrored(false);\n }, [candidateSrc]);\n const effectiveSrc = imgErrored ? undefined : candidateSrc;\n\n return (\n <div\n ref={innerRef}\n data-gds-part=\"media-surface\"\n data-media-hint={hint}\n data-media-source-kind={source?.kind}\n data-media-source={sourceJson}\n data-media-alt={alt}\n data-gds-instance-id={instanceId}\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 //\n // No `bg-muted` on the wrapper any more — the placeholder div\n // below paints its own solid `--gds-media-placeholder-bg`, so\n // a wrapper background just risks a two-layer mismatch in\n // themes where `--muted` differs from the placeholder pair.\n // The surface is transparent under custom `children` (e.g. a\n // Three.js canvas), which is the intended behaviour.\n \"gds-media-surface relative w-full overflow-hidden\",\n aspectClass[resolvedAspect],\n border && \"border border-border\",\n className,\n )}\n style={{\n borderRadius: `var(--gds-media-radius, ${radiusVar[radius]})`,\n ...style,\n }}\n {...props}\n >\n {/* Tiered empty-state placeholder — rendered FIRST (lowest layer)\n so it sits beneath any `src` image / `children` / `overlay`.\n That ordering is what makes Studio's wireframe-mode toggle\n possible: a single ancestor CSS rule can hide the `src`/content\n layers and the placeholder beneath shows through — no React-side\n state, no re-mount. Surface and icon colours come from the\n `--gds-media-placeholder-*` token pair so they retheme with\n the active mode. */}\n {hasPlaceholder && (\n <div\n data-gds-part=\"media-surface-placeholder\"\n data-tier={tier}\n className=\"absolute inset-0 z-0 flex flex-col items-center justify-center gap-2 pointer-events-none px-3 text-center\"\n style={{\n background: \"var(--gds-media-placeholder-bg)\",\n color: \"var(--gds-media-placeholder-fg)\",\n }}\n aria-hidden\n >\n {!useAutoPlaceholder ? (\n // Caller-supplied node — full override, matches the legacy\n // escape hatch.\n (emptyState as React.ReactNode)\n ) : tier === \"sm\" ? (\n // Avatar-density: initials only. Falls back to the glyph\n // if the alt produced no initials (no `alt` supplied).\n initials ? (\n <span className=\"font-semibold text-sm tracking-tight\">\n {initials}\n </span>\n ) : (\n <HintGlyph className=\"h-1/2 w-1/2 max-h-6 max-w-6\" />\n )\n ) : tier === \"md\" ? (\n // Thumbnail: just the glyph. Caller-supplied `glyph` wins\n // so unusual slots (e.g. a custom brand icon) can override\n // without leaving the hint vocabulary.\n <>\n {glyph ?? (\n <HintGlyph className=\"h-1/3 w-1/3 max-h-10 max-w-10\" />\n )}\n </>\n ) : (\n // Hero: glyph + alt caption. Caption truncates to 2 lines so\n // a verbose alt doesn't overflow the surface.\n <>\n {glyph ?? (\n <HintGlyph className=\"h-1/4 w-1/4 max-h-12 max-w-12\" />\n )}\n {alt && (\n <span\n className=\"text-xs leading-snug line-clamp-2 max-w-[80%]\"\n data-gds-part=\"media-surface-caption\"\n >\n {alt}\n </span>\n )}\n </>\n )}\n </div>\n )}\n\n {/* Image layer — sits above the placeholder. This is the target the\n future generator patches into when filling slots. Both `src` and\n `children` are wrapped together in `media-surface-content` so a\n single CSS selector (used by Studio's wireframe mode) can hide\n both at once and let the placeholder underneath show through.\n `effectiveSrc` resolves explicit `src` first, then the runtime\n URL map populated by Studio's \"Fill images\" flow. */}\n {(effectiveSrc || children) && (\n <div\n data-gds-part=\"media-surface-content\"\n className=\"absolute inset-0 z-[1]\"\n >\n {effectiveSrc && (\n <img\n src={effectiveSrc}\n alt={alt ?? \"\"}\n onError={() => setImgErrored(true)}\n className=\"absolute inset-0 h-full w-full object-cover\"\n data-gds-part=\"media-surface-img\"\n />\n )}\n {children}\n </div>\n )}\n\n {/* Loading skeleton — layered above content so it covers a\n transitioning image. */}\n {loading && (\n <div\n className=\"absolute inset-0 z-[2] flex items-center justify-center bg-muted animate-pulse\"\n aria-hidden\n >\n {fallback}\n </div>\n )}\n\n {/* Decorative overlay layer — play buttons, hover gradients, badges.\n Highest z so it sits on top of content in BOTH wireframe and\n full mode; the badge stays meaningful whether the slot is filled\n or not. */}\n {overlay && (\n <div\n data-gds-part=\"media-surface-overlay\"\n className=\"absolute inset-0 z-10\"\n >\n {overlay}\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","\"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"]}