{"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/map/adapters/leaflet.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/background-fill.contract.ts","../components/ui/badge.contract.ts","../components/ui/banner.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/checkbox-card.contract.ts","../components/ui/code.contract.ts","../components/ui/collapsible.contract.ts","../components/ui/color-picker.contract.ts","../components/ui/combobox.contract.ts","../components/ui/command.contract.ts","../components/ui/composer.contract.ts","../components/ui/data-view.contract.ts","../components/ui/date-picker.contract.ts","../components/ui/dialog.contract.ts","../components/ui/dropdown-menu.contract.ts","../components/ui/field.contract.ts","../components/ui/fill-picker.contract.ts","../components/ui/flex.contract.ts","../components/ui/gradient-editor.contract.ts","../components/ui/grid.contract.ts","../components/ui/hover-card.contract.ts","../components/ui/input.contract.ts","../components/ui/input-group.contract.ts","../components/ui/label.contract.ts","../components/ui/logo.contract.ts","../components/ui/map.contract.ts","../components/ui/media-surface.contract.ts","../components/ui/message.contract.ts","../components/ui/motion.contract.ts","../components/ui/multi-select.contract.ts","../components/ui/popover.contract.ts","../components/ui/progress.contract.ts","../components/ui/property-list.contract.ts","../components/ui/radio-card.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/screen-animator.contract.ts","../components/ui/scroll-area.contract.ts","../components/ui/section.contract.ts","../components/ui/section-block.contract.ts","../components/ui/select.contract.ts","../components/ui/selection-card.contract.ts","../components/ui/separator.contract.ts","../components/ui/shader-controls.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/swatch.contract.ts","../components/ui/switch.contract.ts","../components/ui/switch-card.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","../lib/surface.ts","../components/ui/banner.tsx","../components/ui/button.tsx","../components/ui/section.tsx","../components/ui/section-block.tsx","../components/ui/calendar.tsx","../components/ui/carousel.tsx","../components/ui/card.tsx","../components/ui/checkbox.tsx","../components/ui/label.tsx","../components/ui/separator.tsx","../components/ui/field.tsx","../components/ui/property-list.tsx","../components/ui/selection-card.tsx","../lib/demo/types.ts","../lib/demo/sleep.ts","../lib/motion/index.ts","../lib/demo/use-scripted-demo.ts","../lib/demo/blinking-cursor.tsx","../lib/demo/stage.tsx","../components/ui/code.tsx","../components/ui/message.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/textarea.tsx","../components/ui/input-group.tsx","../components/ui/progress.tsx","../components/ui/command.tsx","../components/ui/multi-select.tsx","../components/ui/combobox.tsx","../components/ui/row.tsx","../components/ui/stack.tsx","../components/ui/table.tsx","../components/ui/toggle.tsx","../components/ui/tooltip.tsx","../components/ui/toggle-group.tsx","../components/ui/data-view.tsx","../components/ui/radio-group.tsx","../components/ui/resizable.tsx","../components/ui/grid.tsx","../components/ui/flex.tsx","../components/ui/scroll-area.tsx","../components/ui/select.tsx","../components/ui/swatch.tsx","../components/ui/sheet.tsx","../components/ui/skeleton.tsx","../components/ui/slider.tsx","../components/ui/sortable.tsx","../components/ui/switch.tsx","../components/ui/breadcrumb.tsx","../components/ui/tabs.tsx","../components/ui/chart.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","../components/ui/logo.tsx","../components/ui/grade-loader.tsx","../components/ui/screen-animator.tsx","../components/ui/motion.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/custom-fragment.ts","../lib/three/scenes/fragment-scenes.ts","../lib/three/shader-presets.ts","../lib/three/post-presets.ts","../components/ui/three-scene.tsx","../lib/three/schema.ts","../components/ui/shader-controls.tsx","../components/ui/background-fill.tsx","../components/ui/color-picker.tsx","../components/ui/gradient-editor.tsx","../lib/three/theme-palette.ts","../components/ui/shader-preset-preview.tsx","../components/ui/shader-preset-picker.tsx","../components/ui/fill-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","c","b","id","anchor","element","handle","marker","hovered","mapbox_exports","createMapboxAdapter","ensureMapboxCss","MAPBOX_CSS_HREF","MAPBOX_STYLES","init_mapbox","mapboxgl","google_exports","createGoogleAdapter","GOOGLE_LIGHT_STYLES","GOOGLE_DARK_STYLES","stylesFor","init_google","LoaderCtor","mod","loader","google","isSat","showZoom","googleCorner","leaflet_exports","createLeafletAdapter","ensureLeafletCss","LEAFLET_CSS_HREF","CARTO_STYLE","cartoUrl","CARTO_ATTRIBUTION","init_leaflet","style","L","toLatLng","leafletCorner","addTiles","layer","tiles","applyAppearance","resizeObserver","z","a","o","pad","icon","iconEl","AccordionContract","AiChatContract","AiChatComposerContract","AppShellContract","AvatarContract","BackgroundFillContract","BadgeContract","BannerContract","BreadcrumbContract","ButtonContract","CalendarContract","CalloutContract","CardContract","AlignSchema","AutoplayConfigSchema","AutoplaySchema","CarouselContract","ChartContract","CheckboxContract","CheckboxCardContract","CodeContract","CollapsibleContract","ColorPickerContract","ComboboxContract","CommandContract","ComposerContract","DataViewContract","DatePickerContract","DialogContract","DropdownMenuContract","FieldContract","FillPickerContract","FlexContract","GradientEditorContract","GridContract","HoverCardContract","InputContract","InputGroupContract","LabelContract","LogoContract","MapContract","AlbumSource","TvShowSource","MovieSource","GameSource","BookSource","PosterSource","PortraitSource","LandscapeSource","ProductSource","FoodSource","GenericSource","NoSubFieldsSource","MediaSourceSchema","AspectSchema","RadiusSchema","HintSchema","EmptyStateSchema","MediaSurfaceContract","MessageContract","MotionContract","MultiSelectContract","PopoverContract","ProgressContract","PropertyListContract","RadioCardContract","RadioGroupContract","ResizableContract","RivePlayerContract","RowContract","ScreenAnimatorContract","ScrollAreaContract","SectionContract","SectionBlockContract","SelectContract","SelectionCardContract","SeparatorContract","ShaderControlsContract","ShaderPresetPickerContract","ShaderPresetPreviewContract","SheetContract","SidebarContract","SkeletonContract","SliderContract","SortableContract","StackContract","SwatchContract","SwitchContract","SwitchCardContract","TableContract","TabsContract","TextareaContract","ThreeSceneContract","ToastContract","ToggleContract","ToggleGroupContract","ToolbarContract","TooltipContract","VideoPlayerContract","COMPONENT_CONTRACTS","getComponentContract","componentName","listContractedComponents","cn","inputs","twMerge","clsx","Accordion","AccordionItem","to","className","props","ref","AccordionTrigger","children","ChevronDown","AccordionContent","calloutVariants","cva","ROLE_BY_VARIANT","Callout","Go","variant","role","CalloutTitle","CalloutDescription","shellVariants","headerVariants","navVariants","asideVariants","mainVariants","footerVariants","AppShell","Rt","nav","asChild","Slot","AppShellHeader","sticky","AppShellNav","placement","AppShellAside","AppShellMain","maxWidth","AppShellFooter","avatarSizes","avatarFallbackTypes","AvatarSizeContext","It","Avatar","size","AvatarImage","avatarFallbackTones","AvatarFallback","tone","badgeVariants","Badge","rounded","zd","SURFACE_CLASS","surfaceBg","surface","defaultBgClass","bannerVariants","Banner","Eo","align","dismissible","onDismiss","action","resolvedVariant","resolvedRole","X","buttonVariants","Button","Wr","iconOnly","raised","bandVariants","Section","Le","scope","background","Comp","containerVariants","Container","maxW","grid","SectionEyebrow","SectionTitle","SectionSubtitle","SectionDescription","SectionActions","SectionMedia","sectionBlockVariants","titleVariants","SectionBlock","Tt","padding","fullBleed","alignment","title","titleSize","subtitle","cta1","cta2","backgroundImage","normalizeCTA","cta","cta1Config","cta2Config","Calendar","classNames","showOutsideDays","captionLayout","buttonVariant","formatters","components","defaultClassNames","getDefaultClassNames","Ht","DayPicker","date","rootRef","orientation","ChevronLeftIcon","ChevronRightIcon","ChevronDownIcon","CalendarDayButton","day","modifiers","CarouselContext","D","useCarousel","ctx","DEFAULT_AUTOPLAY_DELAY","CarouselRoot","loop","slidesPerView","autoplay","draggable","onSlideChange","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","Pt","interactive","CardHeader","CardTitle","CardDescription","CardContent","CardFooter","Checkbox","Da","CheckIcon","labelVariants","Label","qr","Separator","Yr","decorative","FieldContext","be","FieldSet","FieldLegend","FieldGroup","fieldVariants","FIELD_FAMILY","Field","layout","autoId","resolved","top","controlIndex","hasDescription","child","type","FieldDescription","FieldContent","gc","controlEl","controlId","descriptionId","describedBy","wired","FieldTrailing","FieldLabel","htmlFor","FieldTitle","FieldSeparator","FieldError","errors","content","uniqueErrors","error","index","FieldRoot","PropertyListContext","yt","ROW_GAP","PropertyListRoot","density","divider","labelWidth","PropertyListRow","label","value","alignProp","ctxAlign","PropertyList","SelectionCardBody","description","aside","hideIndicator","indicatorPosition","titleId","indicator","xe","ind","radioIndicator","Xr","checkboxIndicator","Jr","Check","switchIndicator","Qr","RadioCard","CheckboxCard","SwitchCard","DEMO_SPEED_PRESETS","DEMO_IN_VIEW_AMOUNT","sleep","ms","signal","reject","onAbort","typeText","text","onTick","stagger","isAbortError","MOTION_ATTR","MOTION_OFF","REDUCE_QUERY","readReduced","osReduced","toggledOff","useReducedMotion","reduced","setReduced","Ha","update","mql","observer","usePrefersReducedMotion","usePageActive","setActive","framed","compute","setMotion","root","DEFAULT_LOOP_DELAY_MS","INSTANT_PRESET","useScriptedDemo","steps","interpret","speed","trigger","playProp","loopDelay","maxLoops","containerRef","onComplete","onLoopReset","preset","effectiveLoop","pageActive","isPlaying","setIsPlaying","Be","isComplete","setIsComplete","currentIndex","setCurrentIndex","noopRef","inView","useInView","liveInView","playbackActive","manualPlayTick","setManualPlayTick","shouldPlay","interpretRef","completeRef","loopResetRef","controllerRef","restartTimerRef","stop","play","n","restart","delayMs","controller","cycles","BlinkingCursor","tn","StageContext","Ue","DemoStage","defaultAnimation","visibleWhenIdle","visible","setVisible","hasSteps","step","prev","finalValue","ANIMATION_VARIANTS","Reveal","animation","durationMs","hideOutsideStage","onReveal","onHide","stage","isVisible","prevVisibleRef","onRevealRef","onHideRef","anim","motion","SIZE_CLASS","SPEED_PRESETS","cssVarTheme","normaliseHighlight","input","set","items","item","start","end","kindForLine","lineNumber","diff","highlightSet","Code","Y","source","language","highlight","reveal","showLineNumbers","filename","wrap","bare","prompt","cursor","height","maxLines","resolvedDelay","resolvedStagger","stepsActive","stepBuffer","setStepBuffer","outputLineSet","setOutputLineSet","sourceForRender","code","hasDiff","showGutter","innerRef","revealComplete","setRevealComplete","intrinsicDelay","perLineStagger","totalLines","tokenEstimate","totalRevealMs","t","stepBufferRef","outputLineSetRef","updateBuffer","updateOutputs","stepsComplete","buffer","base","startLine","outputLineCount","nextOutputs","stepStagger","partial","showCursor","Highlight","tokens","getLineProps","getTokenProps","line","lineIndex","kind","lineProps","isLastLine","isOutputLine","renderCursorHere","baseLineClass","lineContent","TypewriterLine","token","tokenSlot","isWhitespace","slot","DENSITY","Message","$e","author","timestamp","avatar","badge","edited","pinned","actions","reactions","threadCount","onThreadClick","isEnd","editedLabel","d","Popover","PopoverTrigger","PopoverAnchor","PopoverContent","pr","sideOffset","DEFAULT_FORMAT","RANGE_FORMAT","DatePicker","onChange","placeholder","disabled","contentClassName","side","format","ariaLabel","ot","CalendarIcon","formatDate","DateRangePicker","numberOfMonths","hasFrom","Dialog","DialogTrigger","DialogPortal","DialogClose","DialogOverlay","nt","DialogContent","showClose","bordered","DialogHeader","DialogFooter","DialogTitle","DialogDescription","DropdownMenu","DropdownMenuTrigger","DropdownMenuSizeContext","se","ddItemBase","DropdownMenuGroup","DropdownMenuPortal","DropdownMenuSub","DropdownMenuRadioGroup","DropdownMenuSubTrigger","inset","DropdownMenuSubContent","DropdownMenuContent","DropdownMenuItem","DropdownMenuCheckboxItem","checked","compact","DropdownMenuRadioItem","Circle","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuShortcut","inputVariants","SLOT_PADDING","Input","wt","startSlot","endSlotProp","revealable","revealed","setRevealed","canReveal","endSlot","v","EyeOff","EyeIcon","renderedType","textareaVariants","Textarea","dn","INPUT_GROUP_HEIGHT","InputGroupSizeContext","$t","InputGroup","inputGroupAddonVariants","InputGroupAddon","inputGroupButtonVariants","InputGroupButton","InputGroupText","InputGroupInput","groupSize","InputGroupTextarea","TONE_FILL","Progress","ur","Command","Je","CommandPrimitive","CommandInput","Search","CommandList","CommandEmpty","CommandGroup","CommandSeparator","CommandItem","DEFAULT_MAX_COUNT","MultiSelect","J","controlledValue","defaultValue","onValueChange","searchPlaceholder","emptyMessage","maxCount","searchable","badgeDismissible","modalPopover","isControlled","internalValue","setInternalValue","open","setOpen","optionByValue","opt","commit","toggle","x","removeOne","clearAll","selectAll","allSelected","visibleBadgeValues","overflowCount","Icon","XCircle","selected","Combobox","ComboboxPrimitive","ComboboxValue","he","ComboboxTrigger","ComboboxClear","XIcon","ComboboxInput","showTrigger","showClear","ComboboxContent","alignOffset","ComboboxList","ComboboxItem","ComboboxGroup","ComboboxLabel","ComboboxCollection","ComboboxEmpty","ComboboxSeparator","ComboboxChips","ComboboxChip","showRemove","ComboboxChipsInput","useComboboxAnchor","rowVariants","Row","un","gap","justify","stackVariants","Stack","mn","Table","Qe","TableHeader","TableBody","TableFooter","TableRow","TableHead","TableCell","TableCaption","toggleVariants","Toggle","vn","TooltipProvider","Tooltip","TooltipTrigger","TooltipContent","yr","ToggleGroupContext","kt","ToggleGroup","ToggleGroupItem","tooltip","tooltipSide","tooltipDelay","context","resolvedAriaLabel","useControllable","controlled","internal","setInternal","N","useDataView","defaultView","views","defaultActiveId","defaultSorting","defaultColumnVisibility","view","setView","activeId","setActiveId","sorting","setSorting","columnVisibility","setColumnVisibility","renderCell","col","row","VIEW_ICON","Rows3","LayoutGrid","Grid3x3","VIEW_LABEL","DataViewToggle","DataViewColumns","columns","visibility","onVisibilityChange","hideable","SlidersHorizontal","DataView","data","getRowId","viewProp","onViewChange","activeIdProp","onActiveChange","sortingProp","onSortingChange","visibilityProp","onColumnVisibilityChange","pageSize","stickyHeader","toolbar","renderCard","initialVisibility","tableColumns","paginated","table","useReactTable","getCoreRowModel","getSortedRowModel","getPaginationRowModel","pinnedOffset","acc","isEmpty","totalRows","pageStart","pageEnd","TableView","TileView","onActivate","capHeight","leafColumns","pinnedStyle","isHeader","hg","header","canSort","sort","SortIcon","ArrowUp","ArrowDown","ArrowUpDown","cell","mode","cols","titleCol","badgeCols","metaCols","minVar","RadioGroup","qo","RadioGroupItem","CircleIcon","ResizablePanelGroup","xr","ResizablePanel","ResizableHandle","withHandle","GripVertical","gridVariants","Grid","Sn","flexVariants","Flex","Cn","direction","ScrollArea","bo","ScrollBar","Select","SelectGroup","SelectValue","SelectMenuSizeContext","le","selectTriggerVariants","SelectTrigger","chevron","SelectScrollUpButton","ChevronUp","SelectScrollDownButton","SelectContent","selectLabelSizeClasses","SelectLabel","selectItemVariants","SelectItem","hint","SelectSeparator","swatchVariants","resolveFill","color","HEX_RE","SwatchGroupContext","mt","Swatch","gradient","image","shape","onColorChange","group","resolvedSize","resolvedShape","resolvedType","fill","editable","hex","name","checker","tile","STACK_OVERLAP","GAP","SwatchGroup","stacked","Sheet","_e","SheetTrigger","SheetClose","SheetPortal","SheetOverlay","it","sheetVariants","SheetContent","overlayClassName","closeClassName","SheetHeader","SheetFooter","SheetTitle","SheetDescription","Skeleton","fp","SIZE","Slider","ga","s","STRATEGY_BY_NAME","verticalListSortingStrategy","horizontalListSortingStrategy","rectSortingStrategy","SortableRootContext","K","SortableGroupContext","SortableGroup","registryRef","registerContainer","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","findContainerForId","registry","direct","handleDragEnd","event","over","dest","oldIndex","newIndex","arrayMove","sourceNext","destIndex","destNext","DndContext","closestCorners","SortableImpl","values","onReorder","strategy","inGroup","fallbackId","containerId","handleStandaloneDragEnd","body","SortableContext","ContainerDroppable","closestCenter","forwardedRef","droppable","useDroppable","composedRef","SortableItemInternalContext","SortableItem","itemDisabled","attributes","listeners","setNodeRef","setActivatorNodeRef","transform","transition","isDragging","useSortable","hasHandleRef","itemCtx","composedStyle","CSS","SortableHandle","sharedProps","Sortable","switchTrackVariants","switchThumbVariants","Switch","Cr","BreadcrumbSeparatorContext","Q","Breadcrumb","separator","BreadcrumbList","BreadcrumbItem","breadcrumbLinkClasses","BreadcrumbLink","href","BreadcrumbPage","BreadcrumbSeparator","fromContext","BreadcrumbEllipsis","MoreHorizontal","BreadcrumbMenuTrigger","onSelectLabel","current","TabsStyleContext","gt","Tabs","tabsListVariants","tabsTriggerVariants","TabsList","TabsTrigger","inherited","TabsContent","THEMES","ChartContext","Z","useChart","ChartContainer","config","onTouchEnd","onTouchCancel","uniqueId","chartId","setRefs","dismissTooltip","handleTouchEnd","handleTouchCancel","ChartTouchStyle","ChartStyle","colorConfig","theme","prefix","itemConfig","ChartTooltip","ChartTooltipContent","payload","hideLabel","labelFormatter","labelClassName","formatter","nameKey","labelKey","tooltipLabel","getPayloadConfigFromPayload","nestLabel","indicatorColor","ChartLegend","ChartLegendContent","hideIcon","verticalAlign","payloadPayload","configLabelKey","toolbarVariants","Toolbar","Kt","leading","center","trailing","usingSlots","ToolbarSlot","SidebarContext","E","SidebarTreeDepthContext","useTreeDepth","useSidebar","Sidebar","controlledCollapsed","defaultCollapsed","onCollapsedChange","collapsible","collapsed","isPanel","SidebarHeader","SidebarContent","SidebarFooter","SidebarSection","defaultExpanded","titleTransform","expanded","setExpanded","canCollapse","SidebarItem","asButton","collapsedLabel","depth","depthStyle","isSm","sizeClasses","weightClass","stateColor","sharedClass","labelStack","_href","_target","_rel","_download","_hrefLang","_ping","_referrerPolicy","_type","buttonRest","SidebarTreeItem","controlledExpanded","onExpandedChange","internalExpanded","setInternalExpanded","depthInset","RAMP_KEYS","LIGHTNESS_CURVE","CHROMA_CURVE","hueToRamp","hue","chromaScale","normalizedHue","ramp","C","neutralRamp","FIXED_SEMANTIC","PURE_WHITE","PURE_BLACK","deriveAlertPair","h","chroma","softC","deepL","deepC","softL","FONTS","CUSTOM_FONT_PREFIX","customFontFamily","sel","CUSTOM_FONT_FALLBACK","ALL_MODES","INTENSITY_MULTIPLIER","buildChartPalette","hues","intensity","pC","aC","dC","norm","PURE","MODE_TOKENS","resolveToken","ramps","deriveColorsForMode","ringRamp","tokenOverrides","isLightBg","fixed","alertMode","w","hi","BASE_SCALE","SCALE_MULTIPLIER","MODULAR_RATIOS","GDS_MODULAR_SCALES","MIN_TEXT_REM","MODULAR_RATIO_MIN","MODULAR_RATIO_MAX","clamp","lo","TYPE_LINE_HEIGHT_CURVE","typeLadder","scale","mult","sizes","modularNamedSizes","ratio","modularTypeSizes","resolveFontFamily","faces","fallbackCategory","family","category","f","resolveTypography","ladder","rem","namedScale","GDS_TYPE_SIZE_NAMES","RADIUS_BASE","resolveRadius","r","DENSITY_FACTOR","SPACING_BASE_REM","MIN_SPACING_UNIT_REM","resolveSpacing","factor","unitRem","SHADOW_PRESETS","resolveEffects","generateTheme","pureGray","neutralChroma","primaryChroma","accentChroma","neutral","primary","accent","chart","colors","statusHue","fixedLight","norm360","accentHue","roleRamps","typography","radius","spacing","effects","calmInput","energyInput","BUILT_IN_INPUTS","colorVars","themeToCSSVars","vars","flattenRamp","brandPops","families","hueOf","triplet","pH","aH","out","FONT_FACE_STYLE_ID","fontFaceCSS","injectFontFaces","doc","css","tag","applyThemeToRoot","oklchToHex","probe","rgb","match","g","rowTriplet","parts","l","oklch","rampTable","lines","semanticTable","rows","lightHex","darkHex","stringifyInput","generateThemeMarkdown","mapToken","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","copy","STORAGE_THEME_KEY","STORAGE_MODE_KEY","DARK_MODES","GRADE_PRE_HYDRATION_SCRIPT","GradeThemeContext","Ae","GradeThemeProvider","defaultTheme","defaultMode","themeId","setThemeIdState","setModeState","revision","setRevision","storedTheme","storedMode","prefersDark","mq","listener","setThemeId","setMode","saveAndActivate","deleteTheme","refresh","useGradeTheme","useMaybeGradeTheme","MapContext","In","useMapContext","ADAPTER_LOADERS","m","MARKER_WARN_THRESHOLD","Map","Ce","bounds","tools","toolsPosition","hoveredId","onHoveredIdChange","onLoad","onError","provider","accessToken","apiKey","mapId","adapterRef","markerRegistryRef","lastHoveredRef","adapterReady","setAdapterReady","onHoveredChangeRef","onErrorRef","onLoadRef","themeCtx","hasThemeCtx","rootDark","setRootDark","read","mo","isDark","resolvedAppearance","cancelled","initialAppearance","factory","adapter","buildHandle","contextValue","originalRemove","noop","idOrCoords","target","MapMarker","Ft","at","setEl","handleRef","onClickRef","onDomClick","createPortal","aspectClass","aspectRatioStyle","radiusVar","HINT_GLYPH","Disc3","Tv","Clapperboard","Gamepad2","Book","User","Mountain","Film","Package","UtensilsCrossed","Video","Music","Code2","Box","ImageIcon","HINT_DEFAULT_ASPECT","sourceKeyFor","useFillPending","version","setVersion","me","handler","deriveInitials","words","tierFromWidth","MediaSurface","aspectProp","radiusProp","borderProp","loadingProp","fallback","emptyStateProp","hintProp","altProp","srcProp","glyph","overlay","instanceId","aspect","border","loading","emptyState","resolvedAspect","aspectExplicit","entry","candidateSrc","imgErrored","setImgErrored","effectiveSrc","hasPlaceholder","tier","setTier","ro","initials","HintGlyph","useAutoPlaceholder","sourceJson","fillPending","VideoPlayer","st","autoPlay","muted","pauseOffscreen","playbackRate","objectFit","posterVisible","setPosterVisible","effectiveMuted","effectiveAutoPlay","handleVisibilityChange","RivePlayer","Ee","stateMachines","artboard","stateMachineInputs","Mod","setMod","setError","RiveInner","useRive","Layout","Fit","Alignment","EventType","fitMap","rive","RiveComponent","playing","setPlaying","togglePlay","Pause","Play","SIZE_PX","LOCKUP_FALLBACK","resolveArtwork","sources","lockup","mono","lk","colour","Logo","xo","heightPx","artwork","a11y","GradeDefaultMark","inner","GRADE_MARK_PATH","GradeLoader","Ke","showLabel","px","TRANS_MS","ENTER_MS","ENTER_TRANSFORM","EXIT_TRANSFORM","DEFAULT_STAGE","SETTLE","PUSH","shotToFrame","trans","cx","cy","btn","PlayIcon","W","PauseIcon","RestartIcon","ScreenAnimator","shots","paused","onEnded","spotlight","enter","captionPosition","backdrop","frames","starter","setI","finished","setFinished","loopsRef","replay","onEndedRef","fi","zoomed","transMs","ease","SceneCtx","STANDALONE_CTX","useMotionScene","SceneFailedCard","onSkip","SceneBoundary","MiniRender","virtualWidth","box","setBox","measure","parseAspect","FitBox","cw","ch","MotionScreen","device","animate","_screenId","scene","vw","regRef","register","reg","frame","SCREEN_ANIMATE","TEMPLATE_DURATION","MotionText","template","heading","lift","dur","remainRef","started","liftShadow","playState","OVERLAY_ZONE","MotionOverlay","zone","_fromScene","_toScene","SCENE_TRANSITION_DEFAULT_MS","sceneTransitionAnim","SCENE_TRANSITION_KEYFRAMES","UNTIMED_FALLBACK_MS","ADVANCE_BEAT_MS","MotionSceneImpl","_label","transitionMs","onSceneEnd","explicitDur","totalRef","doneRef","endedRef","minDoneRef","endNow","endTimer","pausedRef","pendingEndRef","check","isDone","MotionScene","isOverlayElement","isMotionScene","CAMERA_ENTER_MS","CAMERA_DEFAULT_HOLD","CAMERA_DEFAULT_TRANS","cameraDurationMs","total","walkTimed","computeSceneDurationMs","timed","fromChildren","floor","syncSubtreeAnimations","host","offsetMs","hold","Motion","kids","scenes","overlays","count","cardAspect","cardWidth","setIdx","setPaused","done","setDone","runId","setRunId","viewOverride","setViewOverride","effectiveView","exportMode","setExportMode","durations","starts","timeRef","filmRef","idxRef","sceneAtTime","activeSceneEl","seekMs","fastTarget","offset","pausedNowRef","scheduleRef","raf","last","lastPost","tick","now","sched","dt","scenesInDom","activeEl","outgoing","setOutgoing","prevIdxRef","incoming","overlapMs","goTo","advance","onMsg","seekMsRef","fin","onKey","explicitStrip","teaser","shown","hidden","film","from","createPostComposer","renderer","camera","width","composer","EffectComposer","RenderPass","bloom","BloomEffect","KernelSize","noise","NoiseEffect","BlendFunction","scanlines","ScanlineEffect","vignette","VignetteEffect","chromatic","ChromaticAberrationEffect","ks","glitch","GlitchEffect","GlitchMode","EffectPass","applyPreset","chromaOffset","glitchMax","STAR_COUNT","FIELD_DEPTH","FIELD_RADIUS","spaceScene","palette","positions","zOffsets","primaryColor","accentColor","resetStar","randomZ","theta","y","geometry","material","stars","SPEED","STREAK_LEN","_elapsed","delta","pos","baseIdx","cam","FRAGMENT","VERTEX","plasmaScene","lt","uniforms","quad","elapsed","voronoiScene","synthwaveScene","Ct","paramUniformName","COLOR_LIST_CAP","paramUniformDeclarations","u","safeColor","et","FRAGMENT_HEADER","VERTEX_FULLSCREEN","ShaderCompileError","log","precompileFragment","gl","shader","ok","buildFragmentShaderScene","userFragment","paramDecls","combined","arr","controlByKey","params","uni","countUni","meshScene","undertonesScene","flowingDotsScene","grainScene","wavesScene","glassScene","holographicScene","fluidControls","fluidScene","auroraControls","auroraScene","causticsControls","causticsScene","ribbonControls","ribbonScene","concentricControls","concentricScene","vortexControls","vortexScene","spectralControls","spectralScene","halftoneControls","halftoneScene","digitalControls","digitalScene","sceneRegistry","shaderPresets","shaderPresetById","postPresets","defaultPostPreset","DEFAULT_PALETTE","TONE_BACKGROUNDS","OKLCH_TRIPLET","HSL_TRIPLET","VAR_REF","resolveCssColor","effectiveInput","varRef","computed","canvas","resolvePalette","MAX_LIVE_CONTEXTS","budgetEntries","budgetSeq","enforceBudget","budgetAcquire","budgetRelease","ThreeScene","ve","fragmentShader","onShaderError","postPreset","paletteProp","createSceneProp","releaseOffscreen","maxDpr","hostRef","ready","setReady","setInView","granted","setGranted","budgetRef","merged","resolvedFactory","resolvedPost","resolvedPostRef","paletteRef","paletteSig","onShaderErrorRef","livePalette","Jo","dpr","postPresetObj","post","clock","rafId","running","themeObserver","sceneWithMouse","onPointerMove","ev","rect","liveRef","getNum","getStr","getBool","getColors","isPercent","ShaderControls","state","labelPosition","q","NumberValue","ColorField","ColorListField","control","lab","spec","percent","span","decimals","toDisplay","fromInput","unit","draft","setDraft","display","min","max","setAt","add","removeAt","Plus","Minus","TOKEN_COLORS","resolveColor","radiusClass","objectFitClass","BackgroundFill","ya","repeat","tileSize","opacity","blendMode","layerStyle","paint","stops","angle","DEFAULT_COLOR_TOKEN_GROUPS","TRANSPARENT","colorTokenShortName","seg","TokenSwatch","ge","ColorPickerPanel","allowTransparent","onClose","pick","itemValue","search","keywords","ColorRow","tok","ColorPicker","triggerVariant","inline","hasValue","TYPE_OPTIONS","stopColor","pct","gradientToCss","stopSeq","newStopId","LABEL","GradientEditor","Te","patch","setStop","addStop","removeStop","reverse","rotate","ArrowLeftRight","RotateCw","THEME_REACTIVE_PALETTE","ShaderPresetPreview","zt","live","setHovered","showScene","ShaderPresetPicker","filterTags","presets","Qo","FILL_TOKENS","tokenColor","TABS","Square","Blend","VideoIcon","Sparkles","tabOf","FillPicker","tab","selectTab","ROW_KINDS","rowKindOf","toGradientValue","push","fromGradientValue","gv","sorted","via","defaultFill","FillSection","switchKind","stashed","toggleVisible","Eye","Trash2","LenisProvider","lenisRef","useRef","useEffect","lenis","Lenis","time","jn","GradeThemeSwitcher","themes","Re","Palette","Download","isBuiltIn","primary500","accent500","neutral500","MODES","SunDim","Sun","Moon","MoonStar","GradeModeSwitcher","ea","ThemeToggle","so"],"mappings":"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","file":"index.mjs","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  // Tools — shared vocabulary (types.ts). MapLibre had NO zoom buttons\n  // before this (scroll/pinch only); \"auto\"/\"zoom\" now adds the\n  // navigation control (zoom only, no compass — rotation isn't part of\n  // the Grade map contract) docked to the requested corner, which\n  // MapLibre takes verbatim.\n  if (opts.tools === \"zoom\" || (opts.tools === \"auto\" && opts.interactive)) {\n    map.addControl(\n      new maplibregl.NavigationControl({ showCompass: false }),\n      opts.toolsPosition,\n    );\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  // Tools — shared vocabulary (types.ts); same shape as the maplibre\n  // adapter: zoom-only navigation control docked to the requested corner.\n  if (opts.tools === \"zoom\" || (opts.tools === \"auto\" && opts.interactive)) {\n    map.addControl(\n      new mapboxgl.NavigationControl({ showCompass: false }),\n      opts.toolsPosition,\n    );\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  // Tools — shared vocabulary (types.ts). Google's default UI is loud\n  // (map-type switcher, street view, fullscreen), so the Grade contract\n  // disables ALL of it and adds back only the zoom control, docked via\n  // ControlPosition. This also makes Google match the other providers'\n  // quiet chrome instead of its own kitchen sink.\n  const showZoom =\n    opts.tools === \"zoom\" || (opts.tools === \"auto\" && opts.interactive);\n  const googleCorner: Record<string, google.maps.ControlPosition> = {\n    \"top-left\": google.maps.ControlPosition.LEFT_TOP,\n    \"top-right\": google.maps.ControlPosition.RIGHT_TOP,\n    \"bottom-left\": google.maps.ControlPosition.LEFT_BOTTOM,\n    \"bottom-right\": google.maps.ControlPosition.RIGHT_BOTTOM,\n  };\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: true,\n    zoomControl: showZoom,\n    zoomControlOptions: {\n      position: googleCorner[opts.toolsPosition],\n    },\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      // disableDefaultUI stays true permanently (Grade owns the chrome);\n      // only the zoom control follows interactivity under tools=\"auto\".\n      map.setOptions({\n        zoomControl:\n          opts.tools === \"zoom\" || (opts.tools === \"auto\" && 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 {\n  AdapterFactory,\n  AdapterInstance,\n  Coords,\n  MarkerHandle,\n} from \"../types\";\n\n/**\n * Leaflet adapter — a WORKER-FREE raster-tile renderer.\n *\n * Why this exists alongside the maplibre adapter: maplibre-gl does all of its\n * rendering in a Web Worker (spawned from a `blob:` URL). Inside a strictly\n * sandboxed MCP App panel the default CSP is `default-src 'none'`, workers\n * fall back to that, and the MCP Apps CSP vocabulary has no `worker-src`\n * knob — so maplibre simply cannot run there. Leaflet paints raster tiles as\n * plain `<img>` elements on the main thread (no worker), so it runs fine; the\n * only thing it needs is network access to the tile host, which IS grantable\n * via the resource's `connectDomains` / `resourceDomains`.\n *\n * Keyless: OSM raster tiles, no API key, no referrer lock. The MCP View\n * forces this adapter (see the provider override in map.tsx); Studio and the\n * embed keep maplibre.\n */\n\nconst LEAFLET_CSS_HREF = \"https://unpkg.com/leaflet@1.9.4/dist/leaflet.css\";\nconst CSS_LINK_ID = \"gds-leaflet-css\";\n\nfunction ensureLeafletCss() {\n  if (typeof document === \"undefined\") return;\n  // The MCP View bundles Leaflet's CSS inline and sets this flag, so we skip\n  // the network <link> there (it would be CSP-blocked anyway).\n  if ((globalThis as { __gradeLeafletCssBundled?: boolean }).__gradeLeafletCssBundled)\n    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 = LEAFLET_CSS_HREF;\n  document.head.appendChild(link);\n}\n\n// Keyless CARTO raster basemaps (built on OSM data). Much closer to Google\n// Maps' default look than raw OSM: `voyager` is the light, road-forward style;\n// `dark_all` is a real dark style (no CSS-invert hack). Served from the\n// a–d.basemaps.cartocdn.com CDN; those hosts are declared in the MCP View's\n// resource CSP. Free with attribution.\nconst CARTO_STYLE: Record<\"light\" | \"dark\" | \"satellite\", string> = {\n  light: \"rastertiles/voyager\",\n  dark: \"rastertiles/dark_all\",\n  satellite: \"rastertiles/voyager\",\n};\nconst cartoUrl = (style: string) =>\n  `https://{s}.basemaps.cartocdn.com/${style}/{z}/{x}/{y}{r}.png`;\nconst CARTO_ATTRIBUTION = \"© OpenStreetMap contributors © CARTO\";\n\nexport const createLeafletAdapter: AdapterFactory = async (\n  container,\n  opts,\n  callbacks\n) => {\n  ensureLeafletCss();\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  let L: any;\n  try {\n    // leaflet is resolved + bundled by the consumer (the MCP preview View);\n    // it's intentionally NOT a dependency of @gradeui/ui, so the dts build\n    // can't resolve its types here. The value is `any`, so suppress the\n    // module-resolution error rather than pull leaflet into this package.\n    // @ts-ignore -- optional peer, resolved by the bundling consumer\n    L = await import(\"leaflet\");\n    if (L.default) L = L.default;\n  } catch (err) {\n    callbacks.onError({\n      code: \"sdk-missing\",\n      message:\n        '@gradeui/ui Map: `leaflet` is not installed. Run `pnpm add leaflet` to use the worker-free Leaflet adapter.',\n      cause: err,\n    });\n    throw err;\n  }\n\n  // Grade coords are [lng, lat]; Leaflet wants [lat, lng].\n  const toLatLng = (c: Coords): [number, number] => [c[1], c[0]];\n\n  // Tools — one vocabulary across providers (see MapTools/MapToolsPosition\n  // in types.ts). \"auto\" follows `interactive`; the position maps to\n  // Leaflet's squashed corner names. Zoom is added as an explicit control\n  // (zoomControl: false at init) so it can dock to any corner.\n  const showZoom =\n    opts.tools === \"zoom\" || (opts.tools === \"auto\" && opts.interactive);\n  const leafletCorner: Record<string, string> = {\n    \"top-left\": \"topleft\",\n    \"top-right\": \"topright\",\n    \"bottom-left\": \"bottomleft\",\n    \"bottom-right\": \"bottomright\",\n  };\n\n  const map = L.map(container, {\n    center: toLatLng(opts.center),\n    zoom: opts.zoom,\n    zoomControl: false,\n    attributionControl: true,\n    dragging: opts.interactive,\n    scrollWheelZoom: opts.interactive,\n    doubleClickZoom: opts.interactive,\n    boxZoom: opts.interactive,\n    keyboard: opts.interactive,\n    touchZoom: opts.interactive,\n  });\n\n  if (showZoom) {\n    L.control\n      .zoom({ position: leafletCorner[opts.toolsPosition] ?? \"topleft\" })\n      .addTo(map);\n  }\n\n  // Appearance is a different tile STYLE (not a CSS filter), so switching it\n  // swaps the layer. `{r}` is Leaflet's retina suffix; `detectRetina` fills it.\n  const addTiles = (appearance: \"light\" | \"dark\" | \"satellite\") => {\n    const layer = L.tileLayer(cartoUrl(CARTO_STYLE[appearance] ?? CARTO_STYLE.light), {\n      maxZoom: 20,\n      subdomains: \"abcd\",\n      detectRetina: true,\n      attribution: CARTO_ATTRIBUTION,\n      crossOrigin: true,\n    });\n    layer.on(\"tileerror\", () =>\n      callbacks.onError({\n        code: \"tile-load-failed\",\n        message: \"map tile failed to load (is the tile host allowed by CSP?)\",\n      })\n    );\n    layer.addTo(map);\n    return layer;\n  };\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  let tiles: any = addTiles(opts.appearance);\n  const applyAppearance = (appearance: \"light\" | \"dark\" | \"satellite\") => {\n    if (tiles) map.removeLayer(tiles);\n    tiles = addTiles(appearance);\n  };\n\n  if (opts.bounds) {\n    map.fitBounds([toLatLng(opts.bounds[0]), toLatLng(opts.bounds[1])], {\n      animate: false,\n    });\n  }\n\n  // Leaflet initialises synchronously — signal ready immediately.\n  callbacks.onLoad();\n\n  // CRITICAL for sandboxed/absolute-inset containers (the MCP preview panel):\n  // the iframe is frequently sized AFTER the map mounts, so Leaflet's initial\n  // measurement is 0×0 and it renders NOTHING — no tiles, no markers. Re-measure\n  // on the next frames and whenever the container resizes.\n  const resizeObserver =\n    typeof ResizeObserver !== \"undefined\"\n      ? new ResizeObserver(() => map.invalidateSize(false))\n      : null;\n  resizeObserver?.observe(container);\n  requestAnimationFrame(() => map.invalidateSize(false));\n  window.setTimeout(() => map.invalidateSize(false), 200);\n  window.setTimeout(() => map.invalidateSize(false), 600);\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: (c) => map.panTo(toLatLng(c), { animate: false }),\n    setZoom: (z) => map.setZoom(z),\n    setBounds: (sw, ne) =>\n      map.fitBounds([toLatLng(sw), toLatLng(ne)], { animate: false }),\n    setAppearance: (a) => applyAppearance(a),\n    setInteractive: (enabled) => {\n      const handlers = [\n        \"dragging\",\n        \"scrollWheelZoom\",\n        \"doubleClickZoom\",\n        \"boxZoom\",\n        \"keyboard\",\n        \"touchZoom\",\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: (c, o) =>\n      map.flyTo(toLatLng(c), o?.zoom ?? map.getZoom(), {\n        duration: (o?.durationMs ?? 800) / 1000,\n      }),\n    panTo: (c, o) =>\n      map.panTo(toLatLng(c), { duration: (o?.durationMs ?? 600) / 1000 }),\n    fitBounds: (list, o) => {\n      if (list.length === 0) return;\n      const pad = o?.paddingPx ?? 40;\n      map.fitBounds(list.map(toLatLng), {\n        padding: [pad, pad],\n        duration: (o?.durationMs ?? 800) / 1000,\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      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      // Live DOM marker: <MapMarker> portals its React children into\n      // `element`. Leaflet positions the icon container's top-left at the\n      // coord (iconAnchor [0,0]); our absolutely-positioned element then\n      // offsets via transform so its bottom-centre (or centre) sits on the\n      // point — matching the maplibre adapter's anchor semantics.\n      const element = document.createElement(\"div\");\n      element.dataset.gdsPart = \"map-marker\";\n      element.dataset.gdsState = \"idle\";\n      element.style.position = \"absolute\";\n      element.style.cursor = \"pointer\";\n      element.style.transform =\n        anchor === \"center\"\n          ? \"translate(-50%, -50%)\"\n          : \"translate(-50%, -100%)\";\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 icon = L.divIcon({\n        className: \"gds-leaflet-marker\",\n        html: \"\",\n        iconSize: [0, 0],\n        iconAnchor: [0, 0],\n      });\n      const marker = L.marker(toLatLng(coords), {\n        icon,\n        interactive: true,\n        keyboard: false,\n      }).addTo(map);\n\n      const iconEl: HTMLElement | undefined = marker.getElement();\n      if (iconEl) {\n        iconEl.style.pointerEvents = \"auto\";\n        iconEl.appendChild(element);\n      }\n\n      const handle: MarkerHandle = {\n        element,\n        coords,\n        setHovered: (hovered) => {\n          element.dataset.gdsState = hovered ? \"hovered\" : \"idle\";\n          if (iconEl) iconEl.style.zIndex = hovered ? \"1000\" : \"\";\n        },\n        setPosition: (next) => {\n          handle.coords = next;\n          marker.setLatLng(toLatLng(next));\n        },\n        remove: () => {\n          map.removeLayer(marker);\n          markers.delete(id);\n        },\n      };\n\n      markers.set(id, { marker, handle });\n      return handle;\n    },\n    destroy: () => {\n      resizeObserver?.disconnect();\n      markers.forEach(({ marker }) => map.removeLayer(marker));\n      markers.clear();\n      map.remove();\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  styleDefaults: {\"AccordionItem\":\"border-b\",\"AccordionTrigger\":\"flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180\",\"AccordionContent\":\"pb-4 pt-0\"},\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.union([z.string(), z.array(z.string())]).optional(),\n      design: \"knob\",\n      description: \"initial open item(s)\",\n  },\n  \"value\": {\n      schema: z.union([z.string(), z.array(z.string())]).optional(),\n      design: \"knob\",\n      description: \"controlled\",\n  },\n  \"onValueChange\": {\n      schema: z.unknown().optional(),\n      design: \"event\",\n  },\n  \"children\": {\n      schema: z.unknown().optional(),\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  styleDefaults: {\"MessageActions\":\"inline-flex items-center gap-1 rounded-md px-2 py-1 text-[11px]\",\"ThinkingDisclosure\":\"w-3.5 h-3.5 text-gds-gray-500 dark:text-gds-gray-400 shrink-0\",\"StepsDisclosure\":\"w-3.5 h-3.5 text-gds-gray-500 dark:text-gds-gray-400 transition-transform shrink-0\",\"AIChat\":\"flex flex-col overflow-hidden\"},\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  styleDefaults: {\"AIChatComposer\":\"w-full\"},\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  styleDefaults: {\"AppShell\":\"gds-app-shell min-h-screen w-full bg-background text-foreground grid\",\"AppShellHeader\":\"gds-app-shell-header\",\"AppShellNav\":\"gds-app-shell-nav border-b bg-background\",\"AppShellAside\":\"gds-app-shell-aside min-w-0 border-r bg-background\",\"AppShellMain\":\"gds-app-shell-main min-w-0 w-full\",\"AppShellFooter\":\"gds-app-shell-footer border-t bg-background\"},\n  variantDefaults: {\"nav\":\"none\"},\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  element: \"span\",\n  composesWith: [\"Card (in CardHeader)\",\"Table cells\",\"Badge (placed next to for status)\",\"Skeleton (loading state)\",\"Message (in the avatar slot)\"],\n  styleDefaults: {\"AvatarImage\":\"aspect-square h-full w-full\"},\n  props: {\n  \"size\": {\n      schema: z.enum([\"2xs\", \"xs\", \"sm\", \"md\", \"lg\", \"xl\"]).optional(),\n      design: \"knob\",\n      description: \"t-shirt scale, 20px → 80px; default md (40px). xs for chat message rows, sm for comments/dense threads, lg/xl for profile headers. Prefer this over h-*/w-* className utilities.\",\n  },\n  \"src\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"alt\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"tone\": {\n      schema: z.enum([\"muted\", \"primary\", \"violet\", \"amber\", \"emerald\", \"sky\", \"rose\", \"plum\", \"lime\"]).optional(),\n      design: \"knob\",\n      description: \"tinted bg/text pair. Reach for explicit tones when each author needs a stable colour mapping (chat avatars, comment threads, member lists); default muted.\",\n  },\n  \"children\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"initials (or a small icon), rendered while the image loads or when it fails. Initials auto-scale with the avatar's size (~0.4 of the circle; md = 16px) — do NOT add text-* classes to correct their size.\",\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 BackgroundFillContract = contract({\n  name: \"BackgroundFill\",\n  description: \"The background *paint* of a frame — a generative shader, image, video, gradient, repeating texture, or solid token rendered as a layer BEHIND the frame's content. Use it as the first child of a `relative` frame; it paints an `absolute inset-0`, `z-0`, `pointer-events-none` layer, so content carrying `relative z-10` sits on top. This is the canonical way to give any container a rich background — never drop a full-bleed `<ThreeScene>` or `<img>` as a free-standing sibling. For a sized, in-flow media element (a hero card, a thumbnail), use ThreeScene / MediaSurface / VideoPlayer directly instead.\",\n  import: \"@gradeui/ui\",\n  aliases: [\"background\",\"fill\",\"frame fill\",\"backdrop\",\"surface fill\",\"background image\",\"background video\",\"background gradient\",\"background shader\",\"texture\",\"paint\"],\n  composesWith: [\"AppShell\",\"Card\",\"Stack\",\"Row\",\"Grid (any relative container)\",\"ThreeScene (shader fill)\",\"MediaSurface\"],\n  styleDefaults: {\"BackgroundFill\":\"absolute inset-0 h-full w-full\"},\n  props: {\n  \"type\": {\n      schema: z.enum([\"none\", \"solid\", \"gradient\", \"image\", \"video\", \"shader\"]),\n      design: \"knob\",\n      description: \"which paint to render (required)\",\n  },\n  \"color\": {\n      schema: z.string().optional(),\n      design: \"content\",\n      description: \"solid fill; a token name (`primary`, `card`, `muted`, `accent`, `secondary`, `destructive`, `background`, `transparent`) or any CSS colour\",\n  },\n  \"gradient\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"stops are token names or CSS colours. shape: \\\"linear\\\" (default, uses `angle`, default 135°) | \\\"radial\\\" (uses `at` — CSS position like \\\"top\\\" / \\\"30% 20%\\\", default \\\"center\\\" — and optional `size` like \\\"45rem 50rem\\\", default farthest-corner)\",\n  },\n  \"src\": {\n      schema: z.string().optional(),\n      design: \"content\",\n      description: \"image or video URL\",\n  },\n  \"fit\": {\n      schema: z.enum([\"cover\", \"contain\", \"fill\", \"none\"]).optional(),\n      design: \"knob\",\n      description: \"object-fit for image/video (default \\\"cover\\\")\",\n  },\n  \"position\": {\n      schema: z.string().optional(),\n      design: \"content\",\n      description: \"CSS object/background position (default \\\"center\\\")\",\n  },\n  \"repeat\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"tile the image (background-repeat) instead of a single <img>\",\n  },\n  \"tileSize\": {\n      schema: z.string().optional(),\n      design: \"content\",\n      description: \"CSS background-size when repeating (e.g. \\\"120px\\\")\",\n  },\n  \"preset\": {\n      schema: z.string().optional(),\n      design: \"content\",\n      description: \"shader preset id (see ThreeScene)\",\n  },\n  \"fragmentShader\": {\n      schema: z.string().optional(),\n      design: \"content\",\n      description: \"custom GLSL (takes precedence over preset)\",\n  },\n  \"palette\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"shader palette overrides; wrap tokens as `oklch(var(--token))`\",\n  },\n  \"postPreset\": {\n      schema: z.string().optional(),\n      design: \"content\",\n      description: \"shader post-FX\",\n  },\n  \"opacity\": {\n      schema: z.number().optional(),\n      design: \"knob\",\n      description: \"layer opacity 0–1\",\n  },\n  \"blendMode\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"blend against the frame behind it\",\n  },\n  \"radius\": {\n      schema: z.enum([\"none\", \"sm\", \"md\", \"lg\", \"xl\"]).optional(),\n      design: \"knob\",\n      description: \"match the frame's radius so the paint clips cleanly\",\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  element: \"div\",\n  composesWith: [\"Card\",\"Table (inside a cell)\",\"Avatar (next to it)\",\"anywhere inline\"],\n  styleDefaults: {\"Badge\":\"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 border-transparent bg-primary text-primary-foreground hover:bg-primary/80 rounded-md\"},\n  variantDefaults: {\"variant\":\"default\",\"rounded\":\"default\"},\n  props: {\n  \"variant\": {\n      schema: z.enum([\"default\", \"secondary\", \"destructive\", \"outline\", \"highlight\", \"success\", \"warning\", \"info\", \"success-soft\", \"warning-soft\", \"destructive-soft\", \"info-soft\", \"highlight-soft\", \"success-outline\", \"warning-outline\", \"destructive-outline\", \"info-outline\"]).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 BannerContract = contract({\n  name: \"Banner\",\n  description: \"A full-width horizontal strip surfacing system-level state, announcements, or first-run guidance — \\\"you're previewing a draft\\\", \\\"investigating incident\\\", \\\"new feature available\\\", \\\"send your design to Figma\\\". Distinct from Callout (inline boxed message in the layout flow), Toast (transient floating notification), Dialog (modal interrupt). Banner is what lives at the TOP of an AppShellHeader, page, or panel.\",\n  import: \"@gradeui/ui\",\n  aliases: [\"banner\",\"notification banner\",\"system banner\",\"header banner\",\"announcement bar\",\"top bar\",\"status bar\",\"promo banner\",\"incident banner\",\"draft banner\",\"first run banner\",\"glass banner\",\"sticky banner\"],\n  composesWith: [\"AppShellHeader (most common host — banner sits ABOVE the header content)\",\"Button (in the action slot)\",\"Link (inside the content)\",\"Lucide icons (in the icon slot)\"],\n  styleDefaults: {\"Banner\":\"relative flex items-center gap-3 px-4 py-2.5 text-sm leading-relaxed border-b bg-muted text-foreground border-border [&>svg]:text-muted-foreground justify-between\"},\n  variantDefaults: {\"variant\":\"default\",\"align\":\"between\"},\n  props: {\n  \"variant\": {\n      schema: z.enum([\"default\", \"info\", \"success\", \"warning\", \"destructive\", \"announcement\"]).optional(),\n      design: \"knob\",\n      description: \"intent + tonal direction. `default` is a calm muted strip; `announcement` is a low-alpha brand tint for \\\"new feature\\\" messaging; status variants pick up the soft+deep token pairs.\",\n  },\n  \"surface\": {\n      schema: z.enum([\"solid\", \"translucent\", \"glass\", \"glass-strong\"]).optional(),\n      design: \"knob\",\n      description: \"material applied over the variant tint. `glass` for banners that sit over imagery / generative backdrops.\",\n  },\n  \"align\": {\n      schema: z.enum([\"start\", \"center\", \"between\"]).optional(),\n      design: \"knob\",\n      description: \"justify behaviour of the inner flex row. Defaults to `between` so the action / dismiss button right-align.\",\n  },\n  \"sticky\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"stick to the top of the scroll container.\",\n  },\n  \"dismissible\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"render the trailing X close button. Pair with `onDismiss` to react.\",\n  },\n  \"onDismiss\": {\n      schema: z.unknown().optional(),\n      design: \"event\",\n  },\n  \"icon\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"leading icon slot. NOT inferred from variant; pass what fits the message.\",\n  },\n  \"action\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"trailing slot before dismiss. Usually a `<Button size=\\\"sm\\\">` or `<a>`.\",\n  },\n  \"role\": {\n      schema: z.string().optional(),\n      design: \"plumbing\",\n      description: \"overrides the automatic role mapping (warning/destructive → alert, others → status).\",\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  styleDefaults: {\"BreadcrumbList\":\"flex flex-wrap items-center gap-1.5 break-words text-xs text-muted-foreground\",\"BreadcrumbItem\":\"inline-flex items-center gap-1.5\",\"BreadcrumbPage\":\"inline-flex items-center gap-1.5 px-0.5 text-xs font-medium text-foreground\",\"BreadcrumbSeparator\":\"inline-flex items-center [&_svg]:size-3 [&_svg]:shrink-0 text-muted-foreground/60\",\"BreadcrumbEllipsis\":\"flex h-5 w-5 items-center justify-center\",\"BreadcrumbMenuTrigger\":\"h-3 w-3 text-muted-foreground transition-transform\"},\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\",\n  },\n  \"asChild\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\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 `iconOnly` for square icon-only buttons (at any size), variant=\\\"link\\\" for inline links that should look like Button, the `raised` prop for high-commitment / weighty actions where the chrome can afford a tactile \\\"physical key\\\" treatment (composes with any variant; variant=\\\"raised\\\" remains the neutral-key alias). 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\",\"raised button\",\"pill button\",\"key button\"],\n  element: \"button\",\n  composesWith: [\"Dialog\",\"DropdownMenu\",\"Tooltip\",\"Card (in CardFooter)\",\"Row\",\"Form controls\"],\n  styleDefaults: {\"Button\":\"inline-flex cursor-pointer 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 bg-primary text-primary-foreground hover:bg-primary/90 h-8 gap-1.5 px-3 text-base [&_svg]:size-4\"},\n  variantDefaults: {\"variant\":\"default\",\"size\":\"md\"},\n  props: {\n  \"variant\": {\n      schema: z.enum([\"default\", \"destructive\", \"outline\", \"secondary\", \"ghost\", \"link\", \"raised\"]).optional(),\n      design: \"knob\",\n      description: \"`raised` here is a back-compat alias (the raised TRAIT on a neutral key surface); prefer the `raised` prop\",\n  },\n  \"raised\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"presence TRAIT: tactile elevation (bevel + drop + hover glow + pressed sink) layered onto ANY variant — raised primary, raised outline, etc. Glow tone reads --btn-glow → --accent-glow → --selected-glow; override per-button via style={{ \\\"--btn-glow\\\": \\\"var(--warning)\\\" }}\",\n  },\n  \"size\": {\n      schema: z.enum([\"2xs\", \"xs\", \"sm\", \"md\", \"lg\"]).optional(),\n      design: \"knob\",\n      description: \"t-shirt scale aligned with Tabs/ToggleGroup heights (2xs=h-5, xs=h-6, sm=h-7, md=h-8, lg=h-10). 2xs/xs are the dense tool-panel sizes (match Figma Button size=2xs/xs). `default` still works as an alias for `md`.\",\n  },\n  \"iconOnly\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"squares the button at the current `size` height (w = h, no horizontal padding) for icon-only buttons; the icon child is centered. This is THE way to make a square icon button at any density (sm→28², 2xs→20²).\",\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  styleDefaults: {\"Calendar\":\"bg-background group/calendar p-3 [--cell-size:2rem] [[data-slot=card-content]_&]:bg-transparent [[data-slot=popover-content]_&]:bg-transparent\"},\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  element: \"div\",\n  composesWith: [\"lucide-react icons as first child\",\"Button (inside CalloutDescription)\",\"Card (as a section callout)\"],\n  styleDefaults: {\"CalloutTitle\":\"mb-1 text-sm font-semibold leading-snug\",\"CalloutDescription\":\"text-sm [&_p]:leading-relaxed\"},\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, marketing hero containers, AI suggestion overlays. Pair CardHeader (title + description) with CardContent and optional CardFooter (actions). Reach for `surface=\\\"glass\\\"` whenever the card sits over a busy backdrop (gradient mesh, dot grid, generative art, image hero).\",\n  import: \"@gradeui/ui\",\n  aliases: [\"card\",\"group box\",\"groupbox\",\"panel\",\"tile\",\"surface\",\"glass card\",\"frosted card\",\"floating panel\",\"hero card\",\"ai suggestion card\",\"dashboard tile\",\"settings panel\"],\n  subcomponents: [\"CardHeader\",\"CardTitle\",\"CardDescription\",\"CardContent\",\"CardFooter\"],\n  element: \"div\",\n  composesWith: [\"Button (in CardFooter)\",\"Badge\",\"Separator\",\"Avatar\",\"Code\",\"MediaSurface\",\"any form controls\"],\n  styleDefaults: {\"Card\":\"gds-card rounded-xl border text-card-foreground shadow\",\"CardHeader\":\"flex flex-col space-y-1.5 p-6\",\"CardTitle\":\"font-semibold leading-none tracking-tight\",\"CardDescription\":\"text-sm text-muted-foreground\",\"CardContent\":\"p-6 pt-0\",\"CardFooter\":\"flex items-center p-6 pt-0\"},\n  props: {\n  \"surface\": {\n      schema: z.enum([\"solid\", \"translucent\", \"glass\", \"glass-strong\"]).optional(),\n      design: \"knob\",\n      description: \"what the card surface is *made of*. `solid` is the default opaque `bg-card`. `translucent` is ~82% opacity for menu sheets. `glass` is ~58% opacity + 14px blur + edge highlight for floating panels. `glass-strong` is ~42% + 24px blur for full-page overlays. Composes with `shadow-elevation-*` (depth) and `gds-aura-*` (state signal).\",\n  },\n  \"interactive\": {\n      schema: z.enum([\"boolean\"]).optional(),\n      design: \"knob\",\n      description: \"the WHOLE card is the click target (a wallet tile, a project row). Adds the pointer, keyboard focusability and a hover/focus treatment, and lights any trailing Button inside at the same moment so the card and its chevron read as ONE affordance. On dark surfaces a drop shadow barely registers, so the hover cue leads with a one-step surface lift (card -> muted) plus a brighter border, with the shadow as a secondary hint. Put the handler on the card and make the trailing chevron a `Button asChild` wrapping a span, so there is no nested control inside a clickable region.\",\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  styleDefaults: {\"ChartContainer\":\"flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-none [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-sector]:outline-none [&_.recharts-surface]:outline-none\",\"ChartTooltipContent\":\"font-medium\",\"ChartLegendContent\":\"flex items-center justify-center gap-4\"},\n  props: {\n  \"config\": {\n      schema: z.unknown().optional(),\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().optional(),\n      design: \"plumbing\",\n      description: \"typically a single Recharts ResponsiveContainer or chart\",\n  },\n  \"content\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"pair with `content={<ChartTooltipContent />}`; passes through to Recharts <Tooltip>\",\n  },\n  \"cursor\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"the hover crosshair/highlight; Recharts passthrough\",\n  },\n  \"indicator\": {\n      schema: z.enum([\"dot\", \"line\", \"dashed\"]).optional(),\n      design: \"knob\",\n  },\n  \"hideLabel\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"hideIndicator\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"nameKey\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"labelKey\": {\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 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. For a label + description row, wrap in Field. When each option should be a whole selectable card (label + description, selected state on the card surface), use CheckboxCard.\",\n  import: \"@gradeui/ui\",\n  aliases: [\"checkbox\",\"tickbox\",\"tick box\",\"check\",\"multi-select item\"],\n  element: \"button\",\n  composesWith: [\"Label (via htmlFor)\",\"Field (label + description row)\",\"CheckboxCard (whole-card selectable option)\",\"Card\",\"Form rows\",\"Table (for row selection)\"],\n  styleDefaults: {\"Checkbox\":\"grid place-content-center text-current transition-none\"},\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  \"name\": {\n      schema: z.string().optional(),\n      design: \"content\",\n      description: \"form field name, posted via the hidden input\",\n  },\n  \"value\": {\n      schema: z.string().optional(),\n      design: \"content\",\n      description: \"form value when checked (default \\\"on\\\")\",\n  },\n  \"required\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"marks the hidden form input required\",\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 CheckboxCardContract = contract({\n  name: \"CheckboxCard\",\n  description: \"Multi-select where each option is a whole selectable card (add-ons, feature toggles, opt-ins). The whole card is the control, so focus and the checked state live on the card surface. Standalone (not in a group). Static content only — never nest an interactive control inside. For a plain checkbox + label row use Field instead.\",\n  import: \"@gradeui/ui\",\n  aliases: [\"checkbox card\",\"selectable card\",\"multi-select card\",\"add-on card\",\"feature card\",\"opt-in card\"],\n  composesWith: [\"Badge (in aside)\",\"MediaSurface (custom children)\",\"Stack / Grid (laying out several)\"],\n  props: {\n  \"checked\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"standard checkbox state\",\n  },\n  \"defaultChecked\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"standard checkbox state\",\n  },\n  \"onCheckedChange\": {\n      schema: z.unknown().optional(),\n      design: \"event\",\n      description: \"standard checkbox state\",\n  },\n  \"label\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"title line\",\n  },\n  \"description\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"secondary line\",\n  },\n  \"aside\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"slot before the indicator (a Badge, price, hint)\",\n  },\n  \"hideIndicator\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"hide the check; selection shown by the card border + background\",\n  },\n  \"indicatorPosition\": {\n      schema: z.enum([\"leading\", \"trailing\"]).optional(),\n      design: \"knob\",\n      description: \"default trailing\",\n  },\n  \"children\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"arbitrary static content instead of label/description\",\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 CodeContract = contract({\n  name: \"Code\",\n  description: \"Read-only code surface for marketing heroes, docs, changelog entries, AI-output displays. Use `diff` for the \\\"diff hero\\\" pattern (before/after side-by-side or stacked). Use `reveal=\\\"lines\\\"` with `trigger=\\\"inView\\\"` for scroll-driven marketing pages. Use `reveal=\\\"typewriter\\\"` for AI-output / chat-style displays. Use `bare` for inline code inside prose. NOT a code editor — for editable code, reach for an external editor primitive (CodeMirror / Monaco).\",\n  import: \"@gradeui/ui\",\n  aliases: [\"code block\",\"code\",\"code snippet\",\"code surface\",\"syntax highlighted code\",\"diff hero\",\"diff view\",\"diff block\",\"changelog code\",\"before after code\",\"scroll-triggered code\",\"typewriter code\"],\n  composesWith: [\"SectionBlock\",\"Card\",\"Tabs (for multi-file examples)\",\"Carousel (slide-to-slide code progression)\"],\n  styleDefaults: {\"Code\":\"gds-code relative w-full overflow-hidden\"},\n  props: {\n  \"source\": {\n      schema: z.string(),\n      design: \"content\",\n      description: \"the code to render\",\n  },\n  \"language\": {\n      schema: z.enum([\"tsx\", \"jsx\", \"ts\", \"js\", \"html\", \"css\", \"json\", \"bash\", \"md\", \"py\", \"go\", \"rust\"]).optional(),\n      design: \"knob\",\n      description: \"Prism language id; defaults to `tsx`\",\n  },\n  \"highlight\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"1-indexed line number, array of numbers, or array of `[start, end]` ranges to emphasise\",\n  },\n  \"diff\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"`{ added?: number[]; removed?: number[] }` — 1-indexed lines for diff hero / changelog mode\",\n  },\n  \"reveal\": {\n      schema: z.enum([\"none\", \"lines\", \"typewriter\", \"diff\"]).optional(),\n      design: \"knob\",\n      description: \"entrance animation; defaults to `none`\",\n  },\n  \"trigger\": {\n      schema: z.enum([\"mount\", \"inView\", \"manual\"]).optional(),\n      design: \"knob\",\n      description: \"what kicks the reveal off; defaults to `mount`\",\n  },\n  \"play\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"for `trigger=\\\"manual\\\"`, set true to play\",\n  },\n  \"speed\": {\n      schema: z.enum([\"slow\", \"normal\", \"fast\"]).optional(),\n      design: \"knob\",\n      description: \"animation feel preset. `normal` (default) maps to the canonical 50ms/22ms staggers + 180ms pre-delay. Pick a feel; don't tune individual numbers unless you have to.\",\n  },\n  \"delay\": {\n      schema: z.number().optional(),\n      design: \"knob\",\n      description: \"explicit delay before reveal starts (ms) — overrides the `speed` preset\",\n  },\n  \"stagger\": {\n      schema: z.number().optional(),\n      design: \"knob\",\n      description: \"explicit per-line stagger for `lines`/`diff`, per-token for `typewriter` (ms) — overrides the `speed` preset\",\n  },\n  \"prompt\": {\n      schema: z.string().optional(),\n      design: \"content\",\n      description: \"string prepended to each line. Use for terminal emulation: `prompt=\\\"$ \\\"` for bash, `prompt=\\\"> \\\"` for PowerShell, `prompt=\\\">>> \\\"` for Python REPL. Prompt characters render in muted token colour, don't pick up the typewriter stagger, and are hidden from screen readers.\",\n  },\n  \"showLineNumbers\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n  },\n  \"filename\": {\n      schema: z.string().optional(),\n      design: \"content\",\n      description: \"optional label rendered in the header chrome\",\n  },\n  \"wrap\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"wrap long lines instead of horizontal scroll\",\n  },\n  \"bare\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"drop chrome (border, header, padding) — for inline use\",\n  },\n  \"size\": {\n      schema: z.enum([\"xs\", \"sm\", \"md\"]).optional(),\n      design: \"knob\",\n      description: \"type-scale preset. `xs` (12px) for dense changelog cards / inline blocks; `sm` (14px, default) for marketing heroes and docs; `md` (16px) for focal-point displays.\",\n  },\n  \"height\": {\n      schema: z.enum([\"auto\", \"number\", \"string\"]).optional(),\n      design: \"knob\",\n      description: \"container sizing. `auto` (default) grows with content. Number = pixels (`300` → `300px`). String passes through as CSS (`\\\"20rem\\\"`, `\\\"50vh\\\"`).\",\n  },\n  \"maxLines\": {\n      schema: z.number().optional(),\n      design: \"knob\",\n      description: \"cap the visible line count at exactly N line-heights. Wins over `height`. Inherits the current size's line-height automatically.\",\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().optional(),\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 ColorPickerContract = contract({\n  name: \"ColorPicker\",\n  description: \"The token-led single-select colour picker — the focused \\\"pick one colour token\\\" sibling of FillPicker's solid tab. Use it anywhere a value is ONE Grade colour token (a fill colour, a border colour, an accent override) rather than a full paint. Composes Popover + Command exactly like Combobox, but each row is a Swatch + the token's short name, grouped by family and searchable. triggerVariant=\\\"inline\\\" reduces the trigger to a single clickable swatch — reach for that inside inspectors and the FillSection fill rows. For a full paint (gradient / image / shader) use FillPicker; for a list of fills use FillSection; for a multi-stop gradient use GradientEditor.\",\n  import: \"@gradeui/ui\",\n  aliases: [\"color picker\",\"colour picker\",\"token picker\",\"colour token picker\",\"color token picker\",\"swatch picker\",\"paint colour\",\"fill colour picker\",\"accent picker\",\"colour dropdown\"],\n  composesWith: [\"Popover\",\"Command\",\"Swatch\",\"FillSection\",\"GradientEditor\",\"Field\",\"PropertyList\"],\n  styleDefaults: {\"ColorPicker\":\"ring-offset-background focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50\",\"ColorRow\":\"ml-auto h-3.5 w-3.5\"},\n  props: {\n  \"value\": {\n      schema: z.string().optional(),\n      design: \"content\",\n      description: \"a Grade colour token NAME (\\\"action/primary\\\"), the literal \\\"transparent\\\", or null when nothing is picked\",\n  },\n  \"onValueChange\": {\n      schema: z.unknown().optional(),\n      design: \"event\",\n      description: \"fired with the next value (token name, \\\"transparent\\\", or null)\",\n  },\n  \"tokens\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"token families offered in the list; defaults to the Grade semantic set (surface / action / status)\",\n  },\n  \"searchable\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"show the search input (default true)\",\n  },\n  \"triggerVariant\": {\n      schema: z.enum([\"default\", \"inline\"]).optional(),\n      design: \"knob\",\n      description: \"default = form-control surface (swatch + name); inline = just a clickable swatch for inspector / fill-row use\",\n  },\n  \"placeholder\": {\n      schema: z.string().optional(),\n      design: \"content\",\n      description: \"trigger text when nothing is selected\",\n  },\n  \"searchPlaceholder\": {\n      schema: z.string().optional(),\n      design: \"content\",\n      description: \"search-input placeholder\",\n  },\n  \"emptyMessage\": {\n      schema: z.string().optional(),\n      design: \"content\",\n      description: \"shown when search returns no rows\",\n  },\n  \"allowTransparent\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"include a Transparent option at the top (default true)\",\n  },\n  \"align\": {\n      schema: z.enum([\"start\", \"center\", \"end\"]).optional(),\n      design: \"knob\",\n      description: \"popover alignment (default start)\",\n  },\n  \"disabled\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"lock to a read-only display of the current value\",\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 ComboboxContract = contract({\n  name: \"Combobox\",\n  description: \"A searchable picker with type-to-filter. Single-select by default (value shows in the input); add multiple for tag-style chips. For a single chip that opens the popover (the Studio token-field pattern), keep it single-select and render your own chip in an InputGroupAddon — the built-in ComboboxChips is multiple-only. For a small fixed list without search use Select; for a free-form command palette use Command.\",\n  import: \"@gradeui/ui\",\n  aliases: [\"combobox\",\"autocomplete\",\"searchable select\",\"single select\",\"multi select\",\"tag input\",\"chips input\",\"picker\",\"status picker\",\"assignee picker\",\"token select\",\"command select\"],\n  composesWith: [\"InputGroup\",\"Button\",\"Field\",\"Badge\",\"Avatar\",\"PropertyList\",\"Table\"],\n  styleDefaults: {\"ComboboxTrigger\":\"[&_svg:not([class*='size-'])]:size-4\",\"ComboboxInput\":\"w-auto\",\"ComboboxContent\":\"group/combobox-content relative max-h-96 w-(--anchor-width) max-w-(--available-width) min-w-[calc(var(--anchor-width)+--spacing(7))] origin-(--transform-origin) overflow-hidden rounded-md bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[chips=true]:min-w-(--anchor-width) 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 *:data-[slot=input-group]:m-1 *:data-[slot=input-group]:mb-0 *:data-[slot=input-group]:h-8 *:data-[slot=input-group]:border-input/30 *:data-[slot=input-group]:bg-input/30 *:data-[slot=input-group]:shadow-none data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\"ComboboxList\":\"max-h-[min(calc(--spacing(96)---spacing(9)),calc(var(--available-height)---spacing(9)))] scroll-py-1 overflow-y-auto p-1 data-empty:p-0\",\"ComboboxItem\":\"relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-highlighted:bg-accent data-highlighted:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\"ComboboxLabel\":\"px-2 py-1.5 text-xs text-muted-foreground pointer-coarse:px-3 pointer-coarse:py-2 pointer-coarse:text-sm\",\"ComboboxEmpty\":\"hidden w-full justify-center py-2 text-center text-sm text-muted-foreground group-data-empty/combobox-content:flex\",\"ComboboxSeparator\":\"-mx-1 my-1 h-px bg-border\",\"ComboboxChips\":\"flex min-h-9 flex-wrap items-center gap-1.5 rounded-md border border-input bg-transparent bg-clip-padding px-2.5 py-1.5 text-sm shadow-xs transition-[color,box-shadow] focus-within:border-ring focus-within:ring-[3px] focus-within:ring-ring/50 has-aria-invalid:border-destructive has-aria-invalid:ring-[3px] has-aria-invalid:ring-destructive/20 has-data-[slot=combobox-chip]:px-1.5 dark:bg-input/30 dark:has-aria-invalid:border-destructive/50 dark:has-aria-invalid:ring-destructive/40\",\"ComboboxChip\":\"flex h-[calc(--spacing(5.5))] w-fit items-center justify-center gap-1 rounded-sm bg-muted px-1.5 text-xs font-medium whitespace-nowrap text-foreground has-disabled:pointer-events-none has-disabled:cursor-not-allowed has-disabled:opacity-50 has-data-[slot=combobox-chip-remove]:pr-0\",\"ComboboxChipsInput\":\"min-w-16 flex-1 outline-none\"},\n  props: {\n  \"scroll\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"a\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"divider\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"multiple-select\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"lower-level\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"useComboboxAnchor\": {\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 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  styleDefaults: {\"Command\":\"flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground\",\"CommandInput\":\"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\",\"CommandList\":\"max-h-[300px] overflow-y-auto overflow-x-hidden\",\"CommandGroup\":\"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\",\"CommandSeparator\":\"-mx-1 h-px bg-border\",\"CommandItem\":\"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\",\"CommandShortcut\":\"ml-auto text-xs tracking-widest text-muted-foreground\"},\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().optional(),\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().optional(),\n      design: \"plumbing\",\n  },\n  \"onOpenChange\": {\n      schema: z.unknown().optional(),\n      design: \"event\",\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 ComposerContract = contract({\n  name: \"Composer\",\n  description: \"THE PRIMITIVE for any text composition surface — Slack / Discord /\\nTeams chat input, AI chat / copilot prompt box, comment thread input,\\nGitHub / Linear / Jira comment box, Reddit / Twitter reply box,\\nNotion / Linear document body, email composer, post body, anywhere\\na user types text and submits.\\n\\nCONCRETE TEST — if you find yourself writing a `<textarea>` (or\\n`<Input>` styled tall) with a row of `<Bold>` / `<Italic>` /\\n`<Paperclip>` / `<Send>` buttons below or beside it, STOP. That is\\n`<Composer>`. Use it.\\n\\nCommon shapes:\\n  Chat input with formatting + attachments + send\\n    → <Composer formats={[\\\"bold\\\",\\\"italic\\\",\\\"code\\\"]} toolbar attachments />\\n  AI prompt box with paperclip + send\\n    → <AIChatComposer />  (preset wrapping Composer)\\n  Comment / reply input\\n    → <ComposerReply triggers={[{char:\\\"@\\\", items: people}]} />\\n  Document body editor\\n    → <Composer toolbar formats={[...]} bare />\\n\\nBuilt on Lexical for rich text, mentions, slash commands. The\\n`attachments` prop wires image paste + paperclip + chip preview row\\nwith object URL lifecycle handled internally — don't roll that\\nplumbing yourself. The `triggers` prop wires @mentions and /slash\\ncommands with a typeahead popover. The `formats` array picks which\\ntoolbar buttons render when `toolbar` is on.\\n\\nShares the lib/demo step vocabulary with <Code> so scripted\\ntyping/format/mention demos animate in the same rhythm as your\\nterminal demos.\",\n  import: \"@gradeui/ui\",\n  composesWith: [\"AIChatComposer (preset wrapping this with paperclip + send + attachments)\",\"ComposerReply (preset for comment threads)\",\"AIChat (uses AIChatComposer internally)\",\"Card (host above for reply boxes)\",\"Avatar (in leftActions slot for \\\"your\\\" avatar next to the input)\"],\n  styleDefaults: {\"ComposerToolbar\":\"flex flex-wrap items-center gap-0.5\",\"AttachmentChips\":\"absolute -top-1.5 -right-1.5 h-5 w-5 rounded-full\",\"ComposerInner\":\"w-full\"},\n  props: {\n  \"placeholder\": {\n      schema: z.string().optional(),\n      design: \"content\",\n  },\n  \"initialText\": {\n      schema: z.string().optional(),\n      design: \"content\",\n      description: \"plain text content to seed on mount\",\n  },\n  \"initialJson\": {\n      schema: z.string().optional(),\n      design: \"content\",\n      description: \"Lexical state JSON (from a previous onSubmit round-trip)\",\n  },\n  \"formats\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"available formats (defaults to bold/italic/underline/strikethrough/code/h1/h2/blockquote/ul/ol); pass false for plain text only\",\n  },\n  \"toolbar\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"show the formatting toolbar above the editor; default false\",\n  },\n  \"triggers\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"mention/slash configs, eg. `[{ char: \\\"@\\\", items: people }, { char: \\\"/\\\", items: commands }]`\",\n  },\n  \"attachments\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"enable image paste + paperclip when true/object; default off\",\n  },\n  \"onSubmit\": {\n      schema: z.unknown().optional(),\n      design: \"event\",\n  },\n  \"isLoading\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"disables editor, swaps default Send for Stop\",\n  },\n  \"onStop\": {\n      schema: z.unknown().optional(),\n      design: \"event\",\n  },\n  \"maxLength\": {\n      schema: z.number().optional(),\n      design: \"knob\",\n  },\n  \"autoFocus\": {\n      schema: z.boolean().optional(),\n      design: \"plumbing\",\n  },\n  \"submitOnEnter\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"default true (Shift-Enter still inserts newline)\",\n  },\n  \"leftActions\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"override the default paperclip\",\n  },\n  \"rightActions\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"override the default Send/Stop\",\n  },\n  \"hideSend\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"hide the default Send without replacing it\",\n  },\n  \"steps\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"scripted demo sequence\",\n  },\n  \"trigger\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"\\\"mount\\\" | \\\"inView\\\" | \\\"manual\\\"; default \\\"mount\\\"\",\n  },\n  \"play\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"for trigger=\\\"manual\\\"\",\n  },\n  \"speed\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"\\\"slow\\\" | \\\"normal\\\" | \\\"fast\\\"; default \\\"normal\\\"\",\n  },\n  \"loop\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n  },\n  \"loopDelay\": {\n      schema: z.number().optional(),\n      design: \"knob\",\n      description: \"ms between loop iterations, default 2000\",\n  },\n  \"readOnly\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"disables editing AND focusability; programmatic playback still works; use for marketing demos so the script doesn't steal focus\",\n  },\n  \"bare\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"strip the card chrome\",\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 DataViewContract = contract({\n  name: \"DataView\",\n  description: \"One dataset, drawn as a table, a list of cards, or a grid — without re-typing the TanStack boilerplate (sortable headers, flexRender, selection, view switch) on every page. Hand it data + a columns schema; columns declare a `type` (badge/tags/number/currency/percent/date/boolean/url/text) that DataView renders, with a `cell` override for bespoke cells (avatars, relations). The view toggle can live anywhere — `useDataView()` holds the state so a `<DataViewToggle>` or `<DataViewColumns>` in a page header drives a `<DataView>` lower down. Mark a column `pinned=\\\"left\\\"` (with a `width`) for a fixed column and `stickyHeader` to freeze the header. For a single record's fields use PropertyList; for the raw table primitive use Table.\",\n  import: \"@gradeui/ui\",\n  aliases: [\"data view\",\"data table\",\"datatable\",\"data grid\",\"dataview\",\"table view\",\"card view\",\"grid view\",\"list view\",\"gallery\",\"records list\",\"master list\",\"tanstack table\",\"sortable table\",\"column visibility\",\"pinned column\",\"frozen column\",\"sticky header\",\"view switcher\"],\n  composesWith: [\"Table\",\"Card\",\"Badge\",\"Avatar\",\"ToggleGroup\",\"DropdownMenu\",\"PropertyList\",\"Combobox\"],\n  styleDefaults: {\"TableView\":\"h-3 w-3 transition-opacity\"},\n  props: {\n  \"data\": {\n      schema: z.unknown(),\n      design: \"plumbing\",\n      description: \"the rows\",\n  },\n  \"columns\": {\n      schema: z.unknown(),\n      design: \"plumbing\",\n      description: \"the schema; one list drives table, cards, and grid\",\n  },\n  \"getRowId\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"defaults to row.id\",\n  },\n  \"view\": {\n      schema: z.enum([\"table\", \"cards\", \"grid\"]).optional(),\n      design: \"knob\",\n      description: \"controlled or uncontrolled view\",\n  },\n  \"defaultView\": {\n      schema: z.enum([\"table\", \"cards\", \"grid\"]).optional(),\n      design: \"knob\",\n      description: \"controlled or uncontrolled view\",\n  },\n  \"onViewChange\": {\n      schema: z.enum([\"table\", \"cards\", \"grid\"]).optional(),\n      design: \"event\",\n      description: \"controlled or uncontrolled view\",\n  },\n  \"views\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"allowed views; one entry = single view, no toggle\",\n  },\n  \"activeId\": {\n      schema: z.string().optional(),\n      design: \"content\",\n      description: \"the selected row; click emits it\",\n  },\n  \"defaultActiveId\": {\n      schema: z.string().optional(),\n      design: \"content\",\n      description: \"the selected row; click emits it\",\n  },\n  \"onActiveChange\": {\n      schema: z.string().optional(),\n      design: \"event\",\n      description: \"the selected row; click emits it\",\n  },\n  \"sorting\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"TanStack SortingState\",\n  },\n  \"defaultSorting\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"TanStack SortingState\",\n  },\n  \"onSortingChange\": {\n      schema: z.unknown().optional(),\n      design: \"event\",\n      description: \"TanStack SortingState\",\n  },\n  \"columnVisibility\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"which fields show\",\n  },\n  \"defaultColumnVisibility\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"which fields show\",\n  },\n  \"onColumnVisibilityChange\": {\n      schema: z.unknown().optional(),\n      design: \"event\",\n      description: \"which fields show\",\n  },\n  \"pageSize\": {\n      schema: z.number().optional(),\n      design: \"knob\",\n      description: \"rows per page. Unset = no pagination (every row renders, the page scrolls). Set it for a history that grows: the table stops scrolling inside itself and grows a pager instead.\",\n  },\n  \"stickyHeader\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"freeze the header row on scroll\",\n  },\n  \"toolbar\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"render the built-in columns menu + view toggle above the view\",\n  },\n  \"renderCard\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"override card / grid tiles\",\n  },\n  \"emptyMessage\": {\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 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  styleDefaults: {\"DatePicker\":\"h-9 w-[280px] justify-start text-left text-base font-normal md:text-sm data-[empty=true]:text-muted-foreground\",\"DateRangePicker\":\"h-9 w-[300px] justify-start text-left text-base font-normal md:text-sm data-[empty=true]:text-muted-foreground\"},\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, AI suggestion sheets. 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\",\"glass modal\",\"frosted modal\",\"ai suggestion modal\"],\n  subcomponents: [\"DialogTrigger\",\"DialogContent\",\"DialogHeader\",\"DialogTitle\",\"DialogDescription\",\"DialogFooter\",\"DialogClose\"],\n  composesWith: [\"Button (as DialogTrigger asChild\",\"and inside DialogFooter)\",\"Input/Textarea/Select inside DialogContent\",\"Code (for changelog / diff modals)\",\"MediaSurface (for image / preview modals)\"],\n  styleDefaults: {\"DialogContent\":\"fixed inset-0 z-50 grid content-start gap-4 overflow-y-auto p-6 pt-[max(1.5rem,env(safe-area-inset-top))] pb-[max(1.5rem,env(safe-area-inset-bottom))] shadow-lg duration-200 sm:inset-auto sm:left-1/2 sm:top-1/2 sm:h-auto sm:max-h-[85dvh] sm:w-full sm:max-w-lg sm:-translate-x-1/2 sm:-translate-y-1/2 sm:rounded-xl sm:p-8 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=open]:fade-in-0 data-[state=closed]:fade-out-0 data-[state=open]:zoom-in-95 data-[state=closed]:zoom-out-95\",\"DialogHeader\":\"flex flex-col space-y-1.5 text-center sm:text-left\",\"DialogFooter\":\"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\"DialogTitle\":\"text-lg font-semibold leading-none tracking-tight\",\"DialogDescription\":\"text-sm text-muted-foreground\"},\n  props: {\n  \"open\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"onOpenChange\": {\n      schema: z.unknown().optional(),\n      design: \"event\",\n      description: \"Radix controlled/uncontrolled pattern\",\n  },\n  \"asChild\": {\n      schema: z.enum([\"wrap a Button\"]).optional(),\n      design: \"plumbing\",\n  },\n  \"surface\": {\n      schema: z.enum([\"solid\", \"translucent\", \"glass\", \"glass-strong\"]).optional(),\n      design: \"knob\",\n      description: \"what the modal panel is *made of*. Defaults to `solid` (opaque `bg-background`). `glass` lets the page show through softly — pairs with rich backdrops or AI-suggestion modals.\",\n  },\n  \"bordered\": {\n      schema: z.enum([\"boolean, default true\"]).optional(),\n      design: \"knob\",\n      description: \"draw the hairline outline around the panel. Set false on dark, high-contrast surfaces where the shadow and the panel's own background already separate it from the page.\",\n  },\n  \"showClose\": {\n      schema: z.enum([\"boolean, default true\"]).optional(),\n      design: \"knob\",\n      description: \"render the built-in close button. Set false when the dialog owns its own dismissal. Do NOT also put a Cancel in the footer while this is on: the X is the dismissal.\",\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\",\"glass menu\",\"frosted menu\",\"ios menu\",\"hig 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  styleDefaults: {\"DropdownMenuSubContent\":\"z-50 min-w-[8rem] overflow-hidden rounded-md border 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)\",\"DropdownMenuContent\":\"z-50 max-h-[var(--radix-dropdown-menu-content-available-height)] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border text-popover-foreground shadow-md\",\"DropdownMenuItem\":\"relative flex cursor-default select-none items-center gap-2 rounded-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground focus:[&_svg]:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&>svg]:shrink-0\",\"DropdownMenuCheckboxItem\":\"relative flex cursor-default select-none items-center rounded-sm pr-2 outline-none transition-colors focus:bg-accent focus:text-accent-foreground focus:[&_svg]:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\"DropdownMenuRadioItem\":\"relative flex cursor-default select-none items-center rounded-sm pr-2 outline-none transition-colors focus:bg-accent focus:text-accent-foreground focus:[&_svg]:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\"DropdownMenuLabel\":\"font-semibold\",\"DropdownMenuSeparator\":\"-mx-1 my-1 h-px bg-muted\",\"DropdownMenuShortcut\":\"ml-auto text-xs tracking-widest opacity-60\"},\n  props: {\n  \"open\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"defaultOpen\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"onOpenChange\": {\n      schema: z.unknown().optional(),\n      design: \"event\",\n  },\n  \"modal\": {\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\"]).optional(),\n      design: \"knob\",\n  },\n  \"side\": {\n      schema: z.enum([\"top\", \"right\", \"bottom\", \"left\"]).optional(),\n      design: \"knob\",\n  },\n  \"sideOffset\": {\n      schema: z.number().optional(),\n      design: \"knob\",\n  },\n  \"surface\": {\n      schema: z.enum([\"solid\", \"translucent\", \"glass\", \"glass-strong\"]).optional(),\n      design: \"knob\",\n      description: \"what the menu surface is *made of*. `solid` (default) is `bg-popover`. `translucent` matches Apple HIG / iOS menu sheets. `glass` for menus floating over rich canvases.\",\n  },\n  \"size\": {\n      schema: z.enum([\"default\", \"sm\", \"xs\"]).optional(),\n      design: \"knob\",\n      description: \"menu density; cascades to every item (Item, Checkbox, Radio, SubTrigger, Label) via context so a compact trigger gets a compact menu. Use \\\"xs\\\" in dense tool panels.\",\n  },\n  \"onSelect\": {\n      schema: z.unknown().optional(),\n      design: \"event\",\n  },\n  \"disabled\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"inset\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"checked\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"controlled checked state\",\n  },\n  \"onCheckedChange\": {\n      schema: z.unknown().optional(),\n      design: \"event\",\n  },\n  \"value\": {\n      schema: z.string().optional(),\n      design: \"content\",\n      description: \"the selected radio item\",\n  },\n  \"onValueChange\": {\n      schema: z.unknown().optional(),\n      design: \"event\",\n  },\n  \"nested\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"sub-trigger shows children, sub-content holds the deeper items\",\n  },\n  \"children\": {\n      schema: z.unknown().optional(),\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 FieldContract = contract({\n  name: \"Field\",\n  description: \"The form-field wrapper. Default vertical for Input/Select/Textarea (label on top). horizontal for a checkbox/radio row (control first) or a settings row (label left, Switch right). Stack fields with Field.Group; group a related set with Field.Set + Field.Legend; divide with Field.Separator; surface validation with Field.Error; use Field.Title for a non-label heading. For a selectable CARD where the whole surface is the control, use RadioCard / CheckboxCard / SwitchCard instead.\",\n  import: \"@gradeui/ui\",\n  aliases: [\"field\",\"form field\",\"control row\",\"label and description\",\"input field\",\"vertical field\",\"two line checkbox\",\"option row\",\"setting row\",\"toggle row\",\"field group\",\"fieldset\",\"field legend\",\"field error\",\"orientation\"],\n  subcomponents: [\"FieldLabel\",\"FieldTitle\",\"FieldDescription\",\"FieldContent\",\"FieldTrailing\",\"FieldGroup\",\"FieldSet\",\"FieldLegend\",\"FieldSeparator\",\"FieldError\"],\n  element: \"div\",\n  subcomponentElements: {\"FieldLabel\":\"label\",\"FieldSet\":\"fieldset\",\"FieldLegend\":\"legend\"},\n  composesWith: [\"Input\",\"Select\",\"Textarea\",\"Checkbox\",\"RadioGroup\",\"RadioGroupItem\",\"Switch\",\"Badge (inside Field.Trailing)\",\"Field.Group\",\"Field.Set\",\"Field.Legend\",\"Field.Separator\",\"Field.Error\",\"Field.Content\",\"Field.Title\"],\n  styleDefaults: {\"FieldSet\":\"flex flex-col gap-6\",\"FieldLegend\":\"mb-3 font-medium\",\"FieldGroup\":\"group/field-group @container/field-group flex w-full flex-col gap-7 data-[slot=checkbox-group]:gap-3 [&>[data-slot=field-group]]:gap-4\",\"Field\":\"group/field flex w-full data-[invalid=true]:text-destructive\",\"FieldTrailing\":\"flex shrink-0 items-center gap-2\",\"FieldContent\":\"group/field-content flex flex-1 flex-col gap-1.5 leading-snug\",\"FieldLabel\":\"group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-50\",\"FieldTitle\":\"flex w-fit items-center gap-2 text-sm leading-snug font-medium group-data-[disabled=true]/field:opacity-50\",\"FieldDescription\":\"text-sm leading-normal font-normal text-muted-foreground group-has-[[data-orientation=horizontal]]/field:text-balance\",\"FieldSeparator\":\"relative -my-2 h-5 text-sm group-data-[variant=outline]/field-group:-mb-2\",\"FieldError\":\"text-destructive text-sm font-normal\"},\n  variantDefaults: {\"orientation\":\"vertical\"},\n  props: {\n  \"orientation\": {\n      schema: z.enum([\"vertical\", \"horizontal\", \"responsive\"]).optional(),\n      design: \"knob\",\n      description: \"vertical (default): label on top, control, then description (Input/Select/Textarea fields); horizontal: control + text in a row, placement follows DOM order (control first = checkbox row; control after text = settings row); responsive: vertical then horizontal at @md (needs a Field.Group ancestor)\",\n  },\n  \"layout\": {\n      schema: z.enum([\"option\", \"setting\"]).optional(),\n      design: \"knob\",\n      description: \"DEPRECATED alias; option → horizontal control-leading, setting → horizontal control-trailing. Prefer orientation\",\n  },\n  \"children\": {\n      schema: z.unknown(),\n      design: \"plumbing\",\n      description: \"id + aria-describedby auto-wired\",\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 FillPickerContract = contract({\n  name: \"FillPicker\",\n  description: \"Grade's paint picker — the control for choosing a frame's background fill, modelled on Figma's fill popover. A fill-type icon row (solid · gradient · image · pattern · video · shader) switches the panel below; a global opacity sits at the foot. Emits a FillValue that maps 1:1 onto BackgroundFill props. This is a Studio/inspector chrome control — pair it with BackgroundFill, which renders the chosen paint. Not for app content. Use the FillSection subcomponent to edit a LIST of fills (the Figma \\\"Fill\\\" inspector section): each row is a Solid/Gradient/Image toggle, the matching value control (ColorPicker / GradientEditor popover / image URL), an opacity %, a visibility eye, and a remove button, with an add button in the header.\",\n  import: \"@gradeui/ui\",\n  aliases: [\"fill picker\",\"paint picker\",\"background picker\",\"fill chooser\",\"fill popover\",\"fill section\",\"fill list\",\"fills inspector\",\"paint section\"],\n  subcomponents: [\"FillSection\"],\n  composesWith: [\"BackgroundFill (renders the FillValue)\",\"Popover (host it in a popover)\",\"ColorPicker (the solid value)\",\"GradientEditor (the gradient value)\",\"ShaderPresetPicker (the shader tab)\",\"the inspector Fill section\"],\n  styleDefaults: {\"Swatch\":\"h-7 w-7 rounded-md border border-border/60 transition-shadow\",\"FillPicker\":\"flex flex-col gap-3\",\"FillSection\":\"flex flex-col gap-2\"},\n  props: {\n  \"value\": {\n      schema: z.unknown(),\n      design: \"plumbing\",\n      description: \"current paint ({ type, color?, gradient?, src?, fit?, repeat?, tileSize?, preset?, palette?, postPreset?, opacity? }) (required)\",\n  },\n  \"onChange\": {\n      schema: z.unknown(),\n      design: \"event\",\n      description: \"called on any change (required)\",\n  },\n  \"title\": {\n      schema: z.string().optional(),\n      design: \"plumbing\",\n      description: \"section heading (default \\\"Fills\\\")\",\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 GradientEditorContract = contract({\n  name: \"GradientEditor\",\n  description: \"Edit a multi-stop CSS gradient with token-led stops. A type Select (Linear / Radial / Angular) with reverse + rotate actions, a live full-width preview bar (a Swatch type=\\\"gradient\\\"), then a Stops list where each stop is a position %, a colour (ColorPicker token or raw), an opacity %, and a remove button; an add button appends a stop. Token stops resolve to oklch(var(--<token>)) so the preview re-voices with the theme. Emits the structured GradientValue (kept editable + serialisable); the caller turns it into CSS with the exported gradientToCss(value). Use inside a Popover from a FillSection gradient row, or standalone in a theme builder. For a single solid colour use ColorPicker; for a full paint (solid / gradient / image / shader) use FillPicker.\",\n  import: \"@gradeui/ui\",\n  aliases: [\"gradient editor\",\"gradient picker\",\"gradient builder\",\"css gradient editor\",\"stop editor\",\"gradient stops\",\"linear gradient editor\",\"conic gradient editor\"],\n  composesWith: [\"Select\",\"Button\",\"Input\",\"ColorPicker\",\"Swatch\",\"Popover\",\"FillSection\"],\n  styleDefaults: {\"GradientEditor\":\"flex flex-col gap-3\"},\n  props: {\n  \"value\": {\n      schema: z.unknown(),\n      design: \"plumbing\",\n      description: \"the structured gradient (type linear/radial/angular, optional angle in deg, ordered stops). NOT a CSS string — render the string via gradientToCss(value).\",\n  },\n  \"onChange\": {\n      schema: z.unknown(),\n      design: \"event\",\n      description: \"fired with the next structured gradient on any edit\",\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  styleDefaults: {\"Grid\":\"gds-grid grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-4 items-stretch\"},\n  variantDefaults: {\"cols\":\"3\",\"gap\":\"md\",\"align\":\"stretch\"},\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, layer-thumbnail peeks. 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\",\"glass preview\",\"frosted preview\"],\n  subcomponents: [\"HoverCardTrigger\",\"HoverCardContent\"],\n  composesWith: [\"Avatar (user preview)\",\"Card (richer content)\",\"Link (the trigger)\",\"MediaSurface (link/layer previews)\",\"Code (snippet previews)\"],\n  styleDefaults: {\"HoverCardContent\":\"z-50 w-64 rounded-md border 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-hover-card-content-transform-origin)\"},\n  props: {\n  \"open\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"defaultOpen\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"onOpenChange\": {\n      schema: z.unknown().optional(),\n      design: \"event\",\n  },\n  \"openDelay\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"closeDelay\": {\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  \"align\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"sideOffset\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"alignOffset\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"className\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"surface\": {\n      schema: z.enum([\"solid\", \"translucent\", \"glass\", \"glass-strong\"]).optional(),\n      design: \"knob\",\n      description: \"what the preview surface is *made of*. `solid` (default) is `bg-popover`. `glass` for hover previews over rich content (a media feed, a layout canvas).\",\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. Use startSlot/endSlot for icons, prefixes and units instead of hand-positioning absolute children; use size=\\\"sm\\\"/\\\"xs\\\" in dense tool panels.\",\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\",\"unit input\",\"input with icon\"],\n  element: \"input\",\n  composesWith: [\"Label\",\"Form\",\"Card (in CardContent)\",\"Button (form submit)\"],\n  styleDefaults: {\"Input\":\"flex w-full rounded-md bg-transparent transition-colors file:border-0 file:bg-transparent file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50\"},\n  variantDefaults: {\"size\":\"default\",\"variant\":\"default\"},\n  props: {\n  \"type\": {\n      schema: z.string().optional(),\n      design: \"content\",\n  },\n  \"placeholder\": {\n      schema: z.string().optional(),\n      design: \"content\",\n      description: \"hint text shown while the input is empty. Model it explicitly (not just a native passthrough) so generated screens carry placeholders and the validator accepts them.\",\n  },\n  \"size\": {\n      schema: z.enum([\"lg\", \"default\", \"sm\", \"xs\", \"2xs\"]).optional(),\n      design: \"knob\",\n      description: \"control density. `lg` (h-11, stays 16px text) for a prominent single-value field like an amount in a dialog; `default` (h-9) for forms; `sm` (h-8), `xs` (h-7) and `2xs` (h-6) for dense tool panels like the inspector. NOTE: pre-unification scale — see Figma parity audit; due to migrate to the t-shirt scale (xs 24 | sm 28 | md 32 | lg 40, default→md).\",\n  },\n  \"startSlot\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"adornment rendered inside the leading edge (icon, prefix, currency symbol). Non-interactive by default so clicks focus the input.\",\n  },\n  \"endSlot\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"adornment rendered inside the trailing edge (unit like \\\"px\\\", a clear button, a stepper). Same pointer rules as startSlot.\",\n  },\n  \"revealable\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"adds the show/hide eye toggle to a `type=\\\"password\\\"` field, with the aria-label and aria-pressed wiring done. Ignored on any other type. THIS is the password field: do not hand-compose an eye button into endSlot, and do not reach for a separate PasswordInput, there isn't one. Composes with endSlot (the consumer's adornment renders first, the toggle sits outermost).\",\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 InputGroupContract = contract({\n  name: \"InputGroup\",\n  description: \"Compose an input with leading/trailing icons, text affixes, buttons, or a toolbar inside one bordered field. Put controls in InputGroupInput / InputGroupTextarea and decorations in InputGroupAddon. For a plain field with a label + description, use Field instead.\",\n  import: \"@gradeui/ui\",\n  aliases: [\"input group\",\"input with icon\",\"input addon\",\"prefix suffix input\",\"search input\",\"input affix\",\"text field with button\",\"leading icon input\",\"trailing button input\"],\n  subcomponents: [\"InputGroupInput\",\"InputGroupTextarea\",\"InputGroupAddon\",\"InputGroupButton\",\"InputGroupText\"],\n  element: \"div\",\n  subcomponentElements: {\"InputGroupInput\":\"input\",\"InputGroupTextarea\":\"textarea\",\"InputGroupButton\":\"button\",\"InputGroupText\":\"span\"},\n  composesWith: [\"Input\",\"Textarea\",\"Button\",\"Field\",\"Label\",\"Kbd\",\"Tooltip\"],\n  styleDefaults: {\"InputGroup\":\"group/input-group relative flex w-full items-center rounded-md border border-input shadow-xs transition-[color,box-shadow] outline-none dark:bg-input/30\",\"InputGroupAddon\":\"flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4 order-first pl-3 has-[>button]:ml-[-0.45rem] has-[>kbd]:ml-[-0.35rem]\",\"InputGroupButton\":\"flex items-center gap-2 text-sm shadow-none h-6 gap-1 rounded-[calc(var(--radius)-5px)] px-2 has-[>svg]:px-2 [&>svg:not([class*='size-'])]:size-3.5\",\"InputGroupText\":\"flex items-center gap-2 text-sm text-muted-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\"InputGroupInput\":\"flex-1 rounded-none border-0 bg-transparent shadow-none focus-visible:ring-0 dark:bg-transparent\",\"InputGroupTextarea\":\"flex-1 resize-none rounded-none border-0 bg-transparent py-3 shadow-none focus-visible:ring-0 dark:bg-transparent\"},\n  props: {\n  \"size\": {\n      schema: z.enum([\"lg\", \"default\", \"sm\"]).optional(),\n      design: \"knob\",\n      description: \"group height (h-11 / h-9 / h-8). Shared with the control inside, so `<InputGroup size=\\\"lg\\\">` sizes the whole field; an explicit size on InputGroupInput still wins.\",\n  },\n  \"align\": {\n      schema: z.enum([\"inline-start\", \"inline-end\", \"block-start\", \"block-end\"]).optional(),\n      design: \"knob\",\n      description: \"a slot for icons / text / buttons. inline = beside the control; block = stacked above/below (toolbars, textareas).\",\n  },\n  \"variant\": {\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 LabelContract = contract({\n  name: \"Label\",\n  description: \"Every Input / Textarea / Checkbox / Switch / RadioGroup. Always use htmlFor so clicking the label focuses the control. Match `size` to the field it labels (size=\\\"xs\\\" label over a size=\\\"xs\\\" input).\",\n  import: \"@gradeui/ui\",\n  aliases: [\"label\",\"form label\",\"field label\",\"caption\"],\n  element: \"label\",\n  composesWith: [\"Input\",\"Textarea\",\"Checkbox\",\"Switch\",\"RadioGroup\",\"Select\"],\n  styleDefaults: {\"Label\":\"font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70 text-sm\"},\n  variantDefaults: {\"size\":\"default\"},\n  props: {\n  \"htmlFor\": {\n      schema: z.string().optional(),\n      design: \"content\",\n      description: \"binds to the input's id\",\n  },\n  \"size\": {\n      schema: z.enum([\"default\", \"sm\", \"xs\"]).optional(),\n      design: \"knob\",\n      description: \"text size, mirrors Input/Select/Textarea so a field and its label scale together. default = text-sm; xs = 11px for dense tool panels.\",\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 LogoContract = contract({\n  name: \"Logo\",\n  description: \"ALWAYS use <Logo> wherever a screen carries a brand mark —\",\n  import: \"@gradeui/ui\",\n  aliases: [\"logo\",\"brand\",\"brandmark\",\"wordmark\",\"lockup\",\"brand logo\",\"app logo\",\"logotype\",\"grade mark\",\"g arrow\"],\n  composesWith: [\"AppShell\",\"AppShellHeader\",\"Sidebar\",\"SidebarHeader\",\"Toolbar\",\"MotionOverlay\",\"Row\",\"Stack\"],\n  styleDefaults: {\"Logo\":\"gds-logo inline-flex shrink-0 select-none items-center\"},\n  props: {\n  \"sources\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"artwork keyed by lockup then appearance: { square?: { light?, dark?, mono? }, horizontal?: {...}, icon?: {...} }. Each slot is any node (inline <svg>, <img>, component). OMIT ENTIRELY and the GRADE MARK renders (the square G-arrow, painted with currentColor so it sits correctly on any surface). A bare <Logo /> is always correct branding.\",\n  },\n  \"size\": {\n      schema: z.enum([\"sm\", \"md\", \"lg\", \"xl\"]).optional(),\n      design: \"knob\",\n      description: \"height of the mark: 20 / 28 / 40 / 56px (a raw pixel number also works). Width is intrinsic (square/icon 1:1, horizontal keeps its ratio). Default \\\"md\\\"; use \\\"sm\\\" in dense rails and toolbars.\",\n  },\n  \"lockup\": {\n      schema: z.enum([\"square\", \"horizontal\", \"icon\"]).optional(),\n      design: \"knob\",\n      description: \"which shape to show; falls back to the next-best available artwork. Default \\\"horizontal\\\".\",\n  },\n  \"mode\": {\n      schema: z.enum([\"light\", \"dark\"]).optional(),\n      design: \"knob\",\n      description: \"the background the logo SITS ON, selecting light/dark artwork. Explicit, not theme-coupled. Default \\\"light\\\".\",\n  },\n  \"mono\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"render the single-colour treatment; inherits currentColor from the parent. Default false.\",\n  },\n  \"label\": {\n      schema: z.string().optional(),\n      design: \"content\",\n      description: \"accessible name (aria-label + role=\\\"img\\\"); pair with decorative when the brand name is already beside it.\",\n  },\n  \"decorative\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"aria-hidden, no role; use when text nearby names the brand.\",\n  },\n  \"href\": {\n      schema: z.string().optional(),\n      design: \"content\",\n      description: \"renders the logo as a link (logo-links-home).\",\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 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  \"onHoveredIdChange\": {\n      schema: z.unknown(),\n      design: \"event\",\n      description: \"`(id: string | null) => void`. The other half of the controlled hover pair: fires when the pointer enters/leaves a marker so the sibling list can highlight in step. Without this entry in the contract, screens using the documented two-way sync fail save validation.\",\n  },\n  \"interactive\": {\n      schema: z.unknown(),\n      design: \"plumbing\",\n      description: \"false freezes pan/zoom, useful for static cards.\",\n  },\n  \"tools\": {\n      schema: z.unknown(),\n      design: \"plumbing\",\n      description: \"\\\"auto\\\" (default, zoom buttons follow `interactive`) | \\\"zoom\\\" (force zoom buttons) | \\\"none\\\" (chrome-free map; attribution always stays — license). One vocabulary across all providers.\",\n  },\n  \"toolsPosition\": {\n      schema: z.unknown(),\n      design: \"plumbing\",\n      description: \"\\\"top-left\\\" (default) | \\\"top-right\\\" | \\\"bottom-left\\\" | \\\"bottom-right\\\". Corner the tools dock to; use when a search bar or legend sits over the default corner.\",\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.unknown().optional(),\n      design: \"plumbing\",\n      description: \"MapLibre only (provider=\\\"maplibre\\\"). Optional everywhere: omit on `gradeui.com`/`localhost` and the referrer-locked demo key is used; set it only when embedding off-domain. The contract never requires it.\",\n  },\n  \"accessToken\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"Mapbox only. Pass it whenever provider=\\\"mapbox\\\" — the component itself enforces this at runtime (throws a clear `provider=\\\"mapbox\\\" requires an accessToken prop` error via onError if missing). It is OPTIONAL in the contract on purpose, so the validator never demands it from maplibre/google maps.\",\n  },\n  \"apiKey\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"Google only. Pass it whenever provider=\\\"google\\\" — the component enforces it at runtime (throws `provider=\\\"google\\\" requires an apiKey prop` via onError if missing). OPTIONAL in the contract on purpose, so it's never demanded from maplibre/mapbox.\",\n  },\n  \"id\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"string. Required. Stable marker id; pair with Map's `hoveredId` for list↔map hover sync.\",\n  },\n  \"at\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"`[lng, lat]` tuple. Required. THE coordinate prop. ALWAYS lng first. The prop is literally named `at` — it is NOT `lngLat`, `coordinates`, `position`, `latLng`, `center`, or separate `lng`/`lat` props. Passing any other name leaves the marker coord `undefined`, and MapLibre throws on mount, crashing the WHOLE screen in every renderer. When in doubt, copy the `airbnb-listings` scaffold: `<MapMarker id={l.id} at={l.coords}>`.\",\n  },\n  \"anchor\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"\\\"center\\\" | \\\"bottom\\\" (default \\\"bottom\\\", pin tip sits on the coord). Only these two values.\",\n  },\n  \"onClick\": {\n      schema: z.unknown().optional(),\n      design: \"event\",\n      description: \"handler called with `({ id, coords, native })` on marker click.\",\n  },\n  \"children\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"DOM rendered as the marker (Badge, Card, Avatar, or any element). Inherits `--gds-*` tokens.\",\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      group: \"image\",\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: \"none\",\n      description:\n        \"Driven by the `--gds-media-radius` CSS variable. Defaults to `none` so the slot sits flush — set `lg`/`xl` for a standalone rounded image. (A media slot mounted flush at the top of a Card should stay square and let the Card clip it.)\",\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      group: \"image\",\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      group: \"image\",\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    instanceId: {\n      schema: z.string().optional(),\n      design: \"content\",\n      group: \"image\",\n      control: \"text\",\n      label: \"Instance id\",\n      description:\n        \"Stable per-instance id stamped as `data-gds-instance-id`. Use when rendering MediaSurfaces from a data array (`.map(item => <MediaSurface instanceId={item.id} …/>)`) — it's how Studio's selection + Fill flows tell one card apart from its siblings and patch only that entry. Was missing from this hand-authored contract while the component documented it, which made save validation reject the documented pattern (June 2026).\",\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\" (refresh-media-source) removed — its cache-bust re-resolve\n    // read as \"step the image back\" and confused more than it helped. Fill\n    // re-resolves anyway; a dedicated retry can return behind a clearer\n    // affordance if a real need resurfaces.\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 MessageContract = contract({\n  name: \"Message\",\n  description: \"The canonical \\\"avatar + author + timestamp + body\\\" row. THE PRIMITIVE\\nfor any chat surface, comment thread, post-reply, activity log, or\\nnotification feed that follows the people-and-text shape.\\n\\nCONCRETE TEST — if you find yourself composing an `<Avatar>` followed\\nby a `<Row>` of author name + timestamp, with a `<p>` or `<span>`\\nbody below, STOP. That is `<Message>`. Reach for it directly.\\n\\nSlack-style channel feed, Discord messages, Teams chat, Linear /\\nGitHub / Jira comments, Reddit replies, Twitter/X posts in a thread,\\nNotion comment sidebars, in-app activity logs, notification rows —\\nevery one of these IS `<Message>`. Do not roll the layout inline.\\n\\nFor non-people activity (system events, log lines, status pings) use\\nCallout or a plain Row instead — Message implies a human author.\",\n  import: \"@gradeui/ui\",\n  composesWith: [\"Avatar (in the avatar slot — pair with AvatarFallback tone=\\\"...\\\" for stable per-author colour)\",\"Badge (in the badge slot for role / OP / bot tags)\",\"Button (in actions\",\"typically size=\\\"icon\\\" + variant=\\\"ghost\\\")\",\"Stack (host multiple Messages in a thread)\",\"Card (wrap a Stack of Messages for a comment-thread block)\"],\n  styleDefaults: {\"Message\":\"flex items-start\"},\n  props: {\n  \"author\": {\n      schema: z.string(),\n      design: \"content\",\n      description: \"display name of the message author\",\n  },\n  \"timestamp\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"string (\\\"11:24\\\", \\\"2 hours ago\\\") or any node for custom formatting\",\n  },\n  \"avatar\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"slot for any `<Avatar>` composition; omit for grouped messages from the same author\",\n  },\n  \"badge\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"small chip(s) next to the author name (OP, Bot, Admin, role tag)\",\n  },\n  \"edited\": {\n      schema: z.union([z.boolean(), z.string()]).optional(),\n      design: \"knob\",\n      description: \"renders \\\"(edited)\\\" hint next to timestamp; pass a string to customise (\\\"(edited 2 minutes ago)\\\")\",\n  },\n  \"pinned\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"renders a pin glyph + \\\"Pinned\\\" label above the header row for sticky / pinned messages\",\n  },\n  \"actions\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"end-of-header slot, typically hover-revealed icon buttons (reply / react / more)\",\n  },\n  \"reactions\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"slot below the body, typically a Row of reaction chips (emoji + count)\",\n  },\n  \"threadCount\": {\n      schema: z.number().optional(),\n      design: \"knob\",\n      description: \"renders a \\\"N replies\\\" link affordance below the body\",\n  },\n  \"onThreadClick\": {\n      schema: z.unknown().optional(),\n      design: \"event\",\n      description: \"handler for the threadCount affordance\",\n  },\n  \"align\": {\n      schema: z.enum([\"start\", \"end\"]).optional(),\n      design: \"knob\",\n      description: \"`start` (default) puts the avatar on the left; `end` mirrors for \\\"your messages\\\" in DM threads\",\n  },\n  \"density\": {\n      schema: z.enum([\"default\", \"compact\"]).optional(),\n      design: \"knob\",\n      description: \"`default` is the canonical chat / channel-feed rhythm; `compact` tightens text sizes + gaps for dense side panels (Studio comments, activity feeds). Pair with `Avatar size=\\\"xs\\\"` for the tightest stack.\",\n  },\n  \"children\": {\n      schema: z.unknown(),\n      design: \"plumbing\",\n      description: \"body content (plain text or rich nodes)\",\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 MotionContract = contract({\n  name: \"Motion\",\n  description: \"A directed sequence of scenes on one persistent stage — the\",\n  import: \"@gradeui/ui\",\n  aliases: [\"motion\",\"grade motion\",\"scenes\",\"sequence\",\"demo reel\",\"product video\",\"launch video\",\"title card\",\"lower third\",\"section break\",\"multi-scene\",\"storyboard\"],\n  subcomponents: [\"MotionScene\",\"MotionScreen\",\"MotionText\"],\n  composesWith: [\"ScreenAnimator\",\"ThreeScene\",\"VideoPlayer\",\"AppShell\",\"the whole component set (scenes hold screens)\"],\n  styleDefaults: {\"MotionScreen\":\"gds-motion-screen\",\"MotionText\":\"gds-motion-text\",\"MotionOverlay\":\"gds-motion-overlay\",\"MotionSceneImpl\":\"gds-motion-scene\",\"Motion\":\"gds-motion\"},\n  props: {\n  \"view\": {\n      schema: z.enum([\"play\", \"strip\"]).optional(),\n      design: \"knob\",\n      description: \"play runs the film; strip lays\",\n      default: \"play\",\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 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  styleDefaults: {\"MultiSelect\":\"mr-2 flex h-4 w-4 shrink-0 items-center justify-center rounded-sm border border-primary\"},\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\",\"glass popover\",\"frosted popover\",\"inspector popover\"],\n  subcomponents: [\"PopoverTrigger\",\"PopoverContent\",\"PopoverAnchor\"],\n  composesWith: [\"Button (as trigger)\",\"Calendar (date picker)\",\"Command (combobox)\",\"Form controls (inline edit popover)\",\"Code (code-detail popovers)\"],\n  styleDefaults: {\"PopoverContent\":\"z-50 w-72 rounded-md border 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  props: {\n  \"open\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"defaultOpen\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"onOpenChange\": {\n      schema: z.unknown().optional(),\n      design: \"event\",\n  },\n  \"modal\": {\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\"]).optional(),\n      design: \"knob\",\n  },\n  \"align\": {\n      schema: z.enum([\"start\", \"center\", \"end\"]).optional(),\n      design: \"knob\",\n  },\n  \"sideOffset\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"alignOffset\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"collisionPadding\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"className\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"surface\": {\n      schema: z.enum([\"solid\", \"translucent\", \"glass\", \"glass-strong\"]).optional(),\n      design: \"knob\",\n      description: \"what the popover surface is *made of*. `solid` is the default opaque `bg-popover`. `translucent` is the Apple HIG menu-sheet feel. `glass` for floating panels over rich canvases (Studio inspector, image-tool palette).\",\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  element: \"div\",\n  composesWith: [\"Card (as a section)\",\"Badge (showing % next to it)\",\"Label (describing what's loading)\"],\n  styleDefaults: {\"Progress\":\"relative h-4 w-full overflow-hidden rounded-full bg-secondary\"},\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  \"tone\": {\n      schema: z.enum([\"primary\", \"accent\", \"muted\"]).optional(),\n      design: \"knob\",\n      description: \"fill colour of the bar (default \\\"primary\\\"). Reach for \\\"accent\\\" when the bar is LARGE, a full-width wizard header bar in the action colour reads as competing with the page's actual actions rather than as progress. \\\"muted\\\" for a purely informational gauge (quota, storage) where brand colour over-signals. Use this prop; do NOT tint the indicator with a child selector from outside.\",\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 PropertyListContract = contract({\n  name: \"PropertyList\",\n  description: \"Read-only display of the properties of a SINGLE item — detail panels, inspectors, \\\"about this\\\" cards, order/record summaries. It is a Table row transposed (schema vertical, one record). The value side is a polymorphic slot, so the same renderers that fill a Table cell (text, Badge, tag group, Avatar stack, date, link) drop straight into a row. For an EDITABLE field (label + control) use Field instead; a panel that flips between read and edit swaps a PropertyList for a stack of Fields.\",\n  import: \"@gradeui/ui\",\n  aliases: [\"property list\",\"properties\",\"property panel\",\"description list\",\"definition list\",\"detail list\",\"key value\",\"key-value\",\"data list\",\"field list\",\"attributes\",\"metadata list\",\"record summary\",\"detail panel\",\"inspector fields\",\"spec list\"],\n  composesWith: [\"Badge\",\"Avatar\",\"Table\",\"Field\",\"Separator\",\"Card\"],\n  styleDefaults: {\"PropertyListRoot\":\"flex min-w-0 flex-col\",\"PropertyListRow\":\"grid\"},\n  props: {\n  \"layout\": {\n      schema: z.enum([\"row\", \"stack\"]).optional(),\n      design: \"knob\",\n      description: \"row (default): label column beside value; stack: label above value for narrow panels\",\n  },\n  \"density\": {\n      schema: z.enum([\"compact\", \"default\", \"relaxed\"]).optional(),\n      design: \"knob\",\n      description: \"row rhythm\",\n  },\n  \"align\": {\n      schema: z.enum([\"start\", \"center\"]).optional(),\n      design: \"knob\",\n      description: \"default vertical alignment of label vs value; use start when values wrap (tag groups, multi-line)\",\n  },\n  \"divider\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"hairline rule between rows\",\n  },\n  \"labelWidth\": {\n      schema: z.string().optional(),\n      design: \"content\",\n      description: \"override the label column width (any CSS length); sets --gds-property-list-label-width\",\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 RadioCardContract = contract({\n  name: \"RadioCard\",\n  description: \"Single-select where each option is a whole selectable card (shipping options, plan picker, onboarding choices). The whole card is the control, so focus and the checked state live on the card surface and the entire card is clickable. MUST sit inside a RadioGroup (keeps roving focus + single-select). Static content only — never nest an interactive control (Slider/Input/Button/link) inside. For a plain radio + label row use Field instead.\",\n  import: \"@gradeui/ui\",\n  aliases: [\"radio card\",\"selectable card\",\"option card\",\"plan picker\",\"choice card\",\"pricing tier\",\"segmented choice card\"],\n  composesWith: [\"RadioGroup (required parent)\",\"Badge (in aside)\",\"MediaSurface (custom children)\"],\n  props: {\n  \"value\": {\n      schema: z.string(),\n      design: \"content\",\n      description: \"the radio value\",\n  },\n  \"label\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"title line\",\n  },\n  \"description\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"secondary line\",\n  },\n  \"aside\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"slot before the indicator (a Badge, price, hint)\",\n  },\n  \"hideIndicator\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"hide the dot; selection shown by the card border + background\",\n  },\n  \"indicatorPosition\": {\n      schema: z.enum([\"leading\", \"trailing\"]).optional(),\n      design: \"knob\",\n      description: \"default trailing\",\n  },\n  \"children\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"arbitrary static content (image, custom layout) instead of label/description\",\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. When each option should be a whole clickable card (label + description, selected state on the card), use RadioCard inside the RadioGroup instead of a Card with a radio in the corner. For a plain label + description row, wrap RadioGroupItem in Field. 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  element: \"div\",\n  composesWith: [\"Label (paired with each item via htmlFor)\",\"Field (label + description row)\",\"RadioCard (whole-card selectable option)\",\"Stack (vertical list)\"],\n  styleDefaults: {\"RadioGroup\":\"grid gap-3\"},\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  styleDefaults: {\"ResizablePanelGroup\":\"flex h-full w-full data-[panel-group-direction=vertical]:flex-col\",\"ResizableHandle\":\"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  props: {\n  \"direction\": {\n      schema: z.enum([\"horizontal\", \"vertical\"]).optional(),\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  },\n  \"maxSize\": {\n      schema: z.number().optional(),\n      design: \"knob\",\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  },\n  \"onCollapse\": {\n      schema: z.unknown().optional(),\n      design: \"event\",\n  },\n  \"onExpand\": {\n      schema: z.unknown().optional(),\n      design: \"event\",\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  styleDefaults: {\"RiveInner\":\"absolute inset-0 flex items-end justify-end p-2\"},\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.union([z.string(), z.array(z.string())]).optional(),\n      design: \"knob\",\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  styleDefaults: {\"Row\":\"gds-row flex flex-row gap-4 items-center justify-start\"},\n  variantDefaults: {\"gap\":\"md\",\"align\":\"center\",\"justify\":\"start\"},\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 ScreenAnimatorContract = contract({\n  name: \"ScreenAnimator\",\n  description: \"Wrap ANY screen or section in a directed camera — a \\\"live demo\",\n  import: \"@gradeui/ui\",\n  aliases: [\"screen animator\",\"camera\",\"camera tour\",\"director\",\"demo\",\"product demo\",\"zoom pan\",\"spotlight\",\"ken burns\",\"presenter\"],\n  composesWith: [\"AppShell\",\"ThreeScene\",\"Card\",\"Grid\",\"the whole component set (it wraps a screen)\"],\n  styleDefaults: {\"ScreenAnimator\":\"gds-screen-animator\"},\n  props: {\n  \"shots\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"the tour. Each\",\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  styleDefaults: {\"ScrollArea\":\"relative overflow-hidden\",\"ScrollBar\":\"flex touch-none select-none transition-colors\"},\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 SectionContract = contract({\n  name: \"Section\",\n  description: \"THE page scaffold. A page is an ordered stack of Sections — every distinct band (hero, logos, features, pricing, testimonial, CTA, footer) gets its OWN Section so each is independently themeable. `Section` is the full-width band (scope + vertical rhythm). **REQUIRED scaffold: a `Section` ALWAYS contains a `Container`.** Put content inside the `Container`, never directly in the `Section`. For an edge-to-edge band use `<Container maxW=\\\"full\\\">` — that is how you go full-bleed; you never omit the Container. NEVER hand-roll `<section className=\\\"py-20\\\">` or a `<div className=\\\"max-w-7xl mx-auto px-6\\\">` wrapper — that is exactly what `Section` + `Container` replace. This holds for app content regions too, not just marketing pages (AppShell is only the outer chrome; the regions inside it are still `Section` → `Container`). The content inside the Container is free — use the parts (SectionEyebrow/Title/Subtitle/Description/Actions/Media) for the common heading+copy+CTA+media shape, or drop any JSX. SectionMedia is a slot for any media (MediaSurface image, Carousel, VideoPlayer, embed, or a whole app UI).\",\n  import: \"@gradeui/ui\",\n  aliases: [\"section\",\"band\",\"hero section\",\"page section\",\"content section\",\"marketing section\",\"landing section\",\"full bleed\",\"container\",\"max width wrapper\",\"page band\",\"section block\"],\n  subcomponents: [\"Container\",\"SectionEyebrow\",\"SectionTitle\",\"SectionSubtitle\",\"SectionDescription\",\"SectionActions\",\"SectionMedia\"],\n  composesWith: [\"Container\",\"MediaSurface\",\"Carousel\",\"VideoPlayer\",\"Button\",\"Badge\",\"Card\",\"Grid\",\"Stack\"],\n  styleDefaults: {\"Section\":\"w-full py-16 md:py-24\",\"Container\":\"mx-auto w-full px-4 md:px-6 lg:px-8 max-w-7xl\",\"SectionEyebrow\":\"inline-block text-xs font-medium uppercase tracking-wider text-muted-foreground\",\"SectionTitle\":\"text-balance text-3xl font-semibold tracking-tight md:text-4xl\",\"SectionSubtitle\":\"text-lg text-muted-foreground md:text-xl\",\"SectionDescription\":\"leading-relaxed text-muted-foreground\",\"SectionActions\":\"flex flex-wrap items-center gap-3\",\"SectionMedia\":\"w-full\"},\n  variantDefaults: {\"pad\":\"lg\"},\n  props: {\n  \"scope\": {\n      schema: z.enum([\"default\", \"inverse\", \"brand\", \"accent\", \"muted\", \"card\"]).optional(),\n      design: \"knob\",\n      description: \"colour SUBTHEME; applies the `scope-*` class so the whole band re-tones (bg/fg/card/muted/border) while action colours stay vivid. Unset = the page surface. See STUDIO-COLOR.md.\",\n  },\n  \"background\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"visual band background slot: image / video / gradient / shader (drop a <BackgroundFill> here). Renders BEHIND the content; Section owns the relative/overflow/z plumbing. Works with `scope` (which re-tones the content tokens so text stays legible over the media).\",\n  },\n  \"pad\": {\n      schema: z.enum([\"none\", \"sm\", \"md\", \"lg\", \"xl\"]).optional(),\n      design: \"knob\",\n      description: \"vertical rhythm (responsive py); default lg. Section is ALWAYS full width — it never sets a max width.\",\n  },\n  \"as\": {\n      schema: z.enum([\"section\", \"header\", \"footer\", \"div\"]).optional(),\n      design: \"knob\",\n      description: \"semantic element; default section.\",\n  },\n  \"maxW\": {\n      schema: z.enum([\"sm\", \"md\", \"lg\", \"xl\", \"prose\", \"full\"]).optional(),\n      design: \"knob\",\n      description: \"centred max width + gutters; default lg. The MEASURE.\",\n  },\n  \"grid\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"snap children to a 12-column grid (use `col-span-*` on children); default false.\",\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 SectionBlockContract = contract({\n  name: \"SectionBlock\",\n  description: \"The top-level container for a marketing page section — hero, feature row, pricing table, testimonial strip, FAQ section. Always reach for SectionBlock over a hand-rolled `<section>` so vertical rhythm, container width, and tonal background stay consistent across the page. Pair `background=\\\"gradient\\\"` + `surface=\\\"glass\\\"` inner Cards for the \\\"modern marketing hero\\\" pattern.\",\n  import: \"@gradeui/ui\",\n  aliases: [\"section\",\"section block\",\"hero section\",\"marketing section\",\"page section\",\"content section\",\"container section\",\"feature section\",\"hero\",\"page hero\",\"marketing hero\",\"glass section\",\"gradient section\",\"mesh hero\"],\n  composesWith: [\"Card (the most common child — especially with surface=\\\"glass\\\")\",\"Grid (feature rows)\",\"Stack (hero column)\",\"MediaSurface (hero imagery)\",\"Code (developer hero)\",\"Carousel (logo strips)\"],\n  styleDefaults: {\"SectionBlock\":\"relative w-full py-16 md:py-24 bg-transparent\"},\n  variantDefaults: {\"padding\":\"lg\",\"background\":\"transparent\"},\n  props: {\n  \"padding\": {\n      schema: z.enum([\"none\", \"sm\", \"md\", \"lg\", \"xl\"]).optional(),\n      design: \"knob\",\n      description: \"vertical rhythm. Defaults to `lg`.\",\n  },\n  \"background\": {\n      schema: z.enum([\"transparent\", \"muted\", \"card\", \"primary\", \"gradient\"]).optional(),\n      design: \"knob\",\n      description: \"tonal direction of the section bg.\",\n  },\n  \"surface\": {\n      schema: z.enum([\"solid\", \"translucent\", \"glass\", \"glass-strong\"]).optional(),\n      design: \"knob\",\n      description: \"what the section is *made of*. Orthogonal to `background`. Use `glass` for hero sections that float over a generative backdrop / image / dot grid.\",\n  },\n  \"container\": {\n      schema: z.enum([\"default\", \"wide\", \"narrow\", \"full\"]).optional(),\n      design: \"knob\",\n      description: \"max-width of the inner content.\",\n  },\n  \"alignment\": {\n      schema: z.enum([\"left\", \"center\", \"right\"]).optional(),\n      design: \"knob\",\n      description: \"header / CTA alignment.\",\n  },\n  \"titleSize\": {\n      schema: z.enum([\"sm\", \"md\", \"lg\", \"xl\"]).optional(),\n      design: \"knob\",\n  },\n  \"title\": {\n      schema: z.string().optional(),\n      design: \"plumbing\",\n  },\n  \"subtitle\": {\n      schema: z.string().optional(),\n      design: \"content\",\n  },\n  \"cta1\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"string or `{ text, variant, href, onClick }` config\",\n  },\n  \"cta2\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"string or `{ text, variant, href, onClick }` config\",\n  },\n  \"backgroundImage\": {\n      schema: z.string().optional(),\n      design: \"content\",\n      description: \"direct CSS background image url\",\n  },\n  \"as\": {\n      schema: z.enum([\"section\", \"div\", \"article\"]).optional(),\n      design: \"knob\",\n      description: \"semantic root\",\n  },\n  \"fullBleed\": {\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 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. In dense tool panels, set size=\\\"xs\\\" on BOTH the trigger and the content so the closed control and open menu match.\",\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  subcomponentElements: {\"SelectTrigger\":\"button\",\"SelectValue\":\"span\",\"SelectContent\":\"div\",\"SelectItem\":\"div\",\"SelectGroup\":\"div\",\"SelectLabel\":\"div\",\"SelectSeparator\":\"div\"},\n  composesWith: [\"Label (above SelectTrigger)\",\"Form\",\"Card\"],\n  styleDefaults: {\"SelectTrigger\":\"flex w-full items-center justify-between rounded-md border border-input bg-background dark:bg-input/30 data-[placeholder]:text-muted-foreground focus-visible:outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1 h-9 px-3 py-1 text-sm\",\"SelectScrollUpButton\":\"flex cursor-default items-center justify-center py-1\",\"SelectScrollDownButton\":\"flex cursor-default items-center justify-center py-1\",\"SelectContent\":\"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\",\"SelectItem\":\"relative flex w-full cursor-default select-none items-center rounded-sm outline-none focus:bg-accent focus:text-accent-foreground focus:[&_svg]:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 py-1.5 pl-8 pr-2 text-sm\",\"SelectSeparator\":\"-mx-1 my-1 h-px bg-muted\"},\n  props: {\n  \"value\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"onValueChange\": {\n      schema: z.unknown().optional(),\n      design: \"event\",\n  },\n  \"defaultValue\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"disabled\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"name\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"required\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"autoComplete\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"onOpenChange\": {\n      schema: z.unknown().optional(),\n      design: \"event\",\n      description: \"Radix root (renders no element itself, so no native-attr passthrough; name/required/autoComplete post via a hidden native select)\",\n  },\n  \"size\": {\n      schema: z.enum([\"default\", \"sm\", \"xs\"]).optional(),\n      design: \"knob\",\n      description: \"control density; wraps the clickable control, nest SelectValue inside\",\n  },\n  \"placeholder\": {\n      schema: z.string().optional(),\n      design: \"content\",\n      description: \"text when nothing is selected\",\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 SelectionCardContract = contract({\n  name: \"SelectionCard\",\n  description: \"A selectable option where the WHOLE card is the control — plan pickers, shipping/payment options, onboarding choices, settings toggles. Use RadioCard for single-select (inside a RadioGroup), CheckboxCard for multi-select, SwitchCard for an on/off option. The glyph differs by type on purpose so single-select vs multi-select vs toggle reads at a glance. All three share one `.gds-selection-card` surface so they look identical sitting together, and every visual is token-driven (`--gds-selection-card-*` with semantic fallbacks) so a project can re-skin them through the per-project override layer without forking.\",\n  import: \"@gradeui/ui\",\n  aliases: [\"selection card\",\"radio card\",\"checkbox card\",\"switch card\",\"option card\",\"choice card\",\"plan picker\",\"pricing option\",\"selectable card\",\"tile select\"],\n  subcomponents: [\"RadioCard\",\"CheckboxCard\",\"SwitchCard\"],\n  composesWith: [\"RadioGroup\",\"Badge\",\"Label\",\"Grid\",\"Stack\"],\n  styleDefaults: {\"RadioCard\":\"gds-selection-card\",\"CheckboxCard\":\"gds-selection-card\",\"SwitchCard\":\"gds-selection-card\"},\n  props: {\n  \"label\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"title line. Omit and pass `children` for fully custom content.\",\n  },\n  \"description\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"secondary line under the label.\",\n  },\n  \"aside\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"slot between content and indicator (a Badge, price, kbd hint).\",\n  },\n  \"hideIndicator\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"hide the dot/check/switch glyph; selection is then shown by the card's selected border + background. Semantics stay intact.\",\n  },\n  \"indicatorPosition\": {\n      schema: z.enum([\"leading\", \"trailing\"]).optional(),\n      design: \"knob\",\n      description: \"which side the glyph sits on; default trailing.\",\n  },\n  \"value\": {\n      schema: z.enum([\"string\"]).optional(),\n      design: \"knob\",\n      description: \"required; sits inside a `RadioGroup`. Renders as a RadioGroupPrimitive.Item.\",\n  },\n  \"checked\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"renders as a CheckboxPrimitive.Root.\",\n  },\n  \"defaultChecked\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"renders as a CheckboxPrimitive.Root.\",\n  },\n  \"onCheckedChange\": {\n      schema: z.unknown().optional(),\n      design: \"event\",\n      description: \"renders as a CheckboxPrimitive.Root.\",\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  element: \"div\",\n  composesWith: [\"Card (between CardHeader/Content/Footer)\",\"navigation menus\",\"any vertical stacks\"],\n  styleDefaults: {\"Separator\":\"shrink-0 bg-border\"},\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 ShaderControlsContract = contract({\n  name: \"ShaderControls\",\n  description: \"Render a `ControlSpec[]` schema into a DS-native control panel — the single renderer behind shader params, the post-processing stack, and any effect layer (they all describe themselves as ControlSpec[]). Reach for it whenever you have a list of named, typed parameters to expose as a tweaker panel and want it to read identically to the Studio inspector. DS-consistent by construction: it composes the primitives at tool-panel density (Label size=\\\"xs\\\", Slider size=\\\"sm\\\", ghost Input, ToggleGroup, Select, Switch) — never bespoke markup.\",\n  import: \"@gradeui/ui\",\n  aliases: [\"shader controls\",\"control panel\",\"params panel\",\"tweaker\",\"parameter panel\",\"controlspec renderer\",\"effect controls\",\"schema controls\"],\n  composesWith: [\"Label\",\"Slider\",\"Input\",\"ToggleGroup\",\"Select\",\"Switch\",\"Card\"],\n  styleDefaults: {\"ShaderControls\":\"flex flex-col\",\"Row\":\"text-muted-foreground\"},\n  props: {\n  \"controls\": {\n      schema: z.enum([\"ControlSpec[]\"]),\n      design: \"knob\",\n      description: \"the schema to render. Each spec describes one control (slider / toggle / select / switch / input) and its range, step, label, and display.\",\n  },\n  \"value\": {\n      schema: z.enum([\"DemoState\"]),\n      design: \"knob\",\n      description: \"controlled state object keyed by control name; the parent owns it.\",\n  },\n  \"onChange\": {\n      schema: z.enum([\"(key, value) => void\"]),\n      design: \"event\",\n      description: \"fired on every control change.\",\n  },\n  \"labelPosition\": {\n      schema: z.enum([\"inline\", \"above\"]).optional(),\n      design: \"knob\",\n      description: \"dense inline (label left, control + value right) or stacked label-above; default inline.\",\n  },\n  \"numberFormat\": {\n      schema: z.enum([\"raw\", \"percent\"]).optional(),\n      design: \"knob\",\n      description: \"\\\"percent\\\" normalises eligible sliders (no unit, fractional step, non-negative) to 0–100%; a control's own `display: \\\"percent\\\"` always wins. Default raw.\",\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  styleDefaults: {\"ShaderPresetPicker\":\"grid grid-cols-2 gap-3\"},\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  styleDefaults: {\"ShaderPresetPreview\":\"group cursor-pointer flex flex-col gap-2\"},\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, Studio-style inspector panels. 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\",\"inspector panel\",\"glass sheet\",\"frosted drawer\"],\n  subcomponents: [\"SheetTrigger\",\"SheetContent\",\"SheetHeader\",\"SheetTitle\",\"SheetDescription\",\"SheetFooter\",\"SheetClose\"],\n  composesWith: [\"Form controls (an inline edit sheet)\",\"Button (trigger + close)\",\"AppShellNav (mobile-only swap)\",\"Code (changelog drawers)\",\"MediaSurface (image-detail sheets)\"],\n  styleDefaults: {\"SheetOverlay\":\"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\",\"SheetContent\":\"fixed z-50 gap-4 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 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\",\"SheetHeader\":\"flex flex-col space-y-2 text-center sm:text-left\",\"SheetFooter\":\"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\"SheetTitle\":\"text-lg font-semibold text-foreground\",\"SheetDescription\":\"text-sm text-muted-foreground\"},\n  props: {\n  \"open\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"defaultOpen\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"onOpenChange\": {\n      schema: z.unknown().optional(),\n      design: \"event\",\n  },\n  \"modal\": {\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  \"surface\": {\n      schema: z.enum([\"solid\", \"translucent\", \"glass\", \"glass-strong\"]).optional(),\n      design: \"knob\",\n      description: \"what the sheet panel is *made of*. `solid` is the default opaque `bg-background`. Reach for `glass` whenever the canvas behind the sheet (a layout in progress, a media gallery, a dashboard) should remain visible.\",\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  },\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  styleDefaults: {\"Sidebar\":\"relative flex h-full flex-col bg-card text-card-foreground\",\"SidebarHeader\":\"flex shrink-0 items-center border-b border-border\",\"SidebarContent\":\"flex-1 overflow-y-auto overflow-x-hidden\",\"SidebarFooter\":\"shrink-0 border-t border-border\",\"SidebarSection\":\"px-[var(--gds-sidebar-section-px,0.5rem)] space-y-[var(--gds-sidebar-section-gap,0.125rem)]\",\"SidebarItem\":\"truncate font-normal text-muted-foreground\",\"SidebarTreeItem\":\"group flex w-full items-center gap-1.5 rounded-md py-1 text-sm font-medium transition-colors\"},\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 treatment. `rail` (default) is the classic nav rail with a single right-border + tracked width via `--gds-sidebar-width`; drops cleanly into `<AppShellNav placement=\\\"side\\\">`. `panel` is a card-style floating sidebar with full border + rounded corners + parent-controlled width; use when the sidebar is one of several adjacent panes in a body row (e.g. Projects | Canvas | Settings). The compound children (Header/Content/Footer/Section/Item) are identical in both treatments.\",\n  },\n  \"bordered\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"draw the OUTER edge: the right-hand rule in `rail`, the full outline in `panel` (default true). Set false where the rail's own `bg-card` already separates it from the content beside it and the rule reads as an artefact, which is typical on dark high-contrast themes. A borderless rail keeps its width transition and a borderless panel keeps its rounding and clipping. Controls the outer edge ONLY: the rules under SidebarHeader and above SidebarFooter are internal structure and stay.\",\n  },\n  \"title\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"group label, tracking-wide muted styling; hidden when sidebar is collapsed. CASE: static (non-collapsible) headers historically render UPPERCASE (Notion / Linear / Slack-style \\\"GAMES\\\", \\\"FAVORITES\\\"); collapsible headers render the authored case. Control it explicitly with titleTransform.\",\n  },\n  \"titleTransform\": {\n      schema: z.enum([\"uppercase\", \"none\"]).optional(),\n      design: \"knob\",\n      description: \"title casing for BOTH header variants. \\\"none\\\" renders the authored case (sentence-case headers like a \\\"Recents\\\" list); \\\"uppercase\\\" forces the shouty group label. Unset = the per-variant legacy default above.\",\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: \"**action(s) on the right edge of the header** — the canonical \\\"+\\\" / \\\"...\\\" slot (Notion's \\\"+ Add page\\\" next to Pages, Linear's \\\"+\\\" next to Favorites, Slack's \\\"+\\\" next to Channels). Pointer events isolated so a Button here doesn't toggle collapse.\",\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 under a project, sub-pages under a section). Active state still wins on color + weight so the current row pops at either size.\",\n  },\n  \"description\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"secondary line beneath the label (metadata like 'Edited 2m ago', '12 items', a brief description). Row layout adapts: label + description stacked vertically; icon vertically-centered against the stack; badge stays on trailing edge. 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  element: \"div\",\n  composesWith: [\"Card\",\"Avatar (inside a Skeleton for avatar loading)\",\"any layout\"],\n  styleDefaults: {\"Skeleton\":\"animate-pulse rounded-md bg-muted\"},\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  styleDefaults: {\"Slider\":\"relative w-full grow overflow-hidden rounded-full\"},\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  styleDefaults: {\"SortableHandle\":\"cursor-grab touch-none select-none\"},\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  \"value\": {\n      schema: z.union([z.string(), z.number()]).optional(),\n      design: \"knob\",\n      description: \"must match one entry in the parent `values` array (identity, not React key)\",\n  },\n  \"asChild\": {\n      schema: z.boolean().optional(),\n      design: \"plumbing\",\n      description: \"render as the child element via Radix Slot\",\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 SwatchContract = contract({\n  name: \"Swatch\",\n  description: \"Showing a colour as a small chip — brand-pop strips, palette / accent pickers, theme previews, token galleries, \\\"pick a colour\\\" rows. Reach for `token` to bind to a live theme variable; `color` for raw values. A transparency checkerboard sits behind the fill so semi-transparent values read honestly.\",\n  import: \"@gradeui/ui\",\n  aliases: [\"colour swatch\",\"color swatch\",\"colour chip\",\"color chip\",\"palette swatch\",\"token swatch\",\"brand pop\",\"accent swatch\",\"colour tile\",\"color tile\",\"paint chip\",\"react native colour swatch\"],\n  subcomponents: [\"SwatchGroup\"],\n  composesWith: [\"Row (strip of swatches)\",\"Stack\",\"Grid (palette wall)\",\"Field (as a colour-picker trailing slot)\",\"Card (in a theme-preview)\",\"RadioGroup (selectable accent set)\",\"Label\"],\n  styleDefaults: {\"Swatch\":\"relative inline-block shrink-0 overflow-hidden shadow-elevation-1 size-8 rounded-[var(--radius)]\",\"SwatchGroup\":\"inline-flex flex-wrap items-center\"},\n  variantDefaults: {\"size\":\"md\",\"shape\":\"rounded\"},\n  props: {\n  \"color\": {\n      schema: z.string().optional(),\n      design: \"content\",\n      description: \"any raw CSS colour (`#1f6feb`, `oklch(...)`, `rgb(...)`, or `var(--x)`). Takes precedence over `token`. Use for one-off or external colours.\",\n  },\n  \"token\": {\n      schema: z.string().optional(),\n      design: \"content\",\n      description: \"a Grade colour token NAME with no `--` and no `oklch()` wrap; resolved internally to `oklch(var(--<token>))`. THE design-system path — e.g. `token=\\\"brand-3\\\"`, `token=\\\"primary\\\"`, `token=\\\"chart-2\\\"`. Re-voices live when the theme changes.\",\n  },\n  \"type\": {\n      schema: z.enum([\"solid\", \"gradient\", \"image\"]).optional(),\n      design: \"knob\",\n      description: \"fill kind; default solid (or inferred from `image` / `gradient`). Determines what the chip renders in place.\",\n  },\n  \"gradient\": {\n      schema: z.string().optional(),\n      design: \"content\",\n      description: \"CSS gradient for `type=\\\"gradient\\\"`, e.g. `linear-gradient(135deg,#6366f1,#ec4899)`.\",\n  },\n  \"image\": {\n      schema: z.string().optional(),\n      design: \"content\",\n      description: \"image URL for `type=\\\"image\\\"`; rendered cover-fit behind the chip.\",\n  },\n  \"size\": {\n      schema: z.enum([\"2xs\", \"xs\", \"sm\", \"md\", \"lg\", \"xl\"]).optional(),\n      design: \"knob\",\n      description: \"t-shirt scale, 16px → 56px; default md (32px). 2xs (16px) suits dense colour lists. Prefer over h-*/w-* utilities.\",\n  },\n  \"shape\": {\n      schema: z.enum([\"square\", \"rounded\", \"circle\"]).optional(),\n      design: \"knob\",\n      description: \"default rounded (rides `--radius`); circle for dot pickers; square for a hard tile.\",\n  },\n  \"selected\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"draws the shared selection ring (`--selected`). For palette / accent pickers.\",\n  },\n  \"onSelect\": {\n      schema: z.unknown().optional(),\n      design: \"event\",\n      description: \"makes the swatch a pickable <button> (adds aria-pressed, focus ring, hover lift). Omit for a static display chip.\",\n  },\n  \"onColorChange\": {\n      schema: z.unknown().optional(),\n      design: \"event\",\n      description: \"makes the swatch an editable colour well: hosts a native `<input type=\\\"color\\\">` (the OS picker) behind the DS chip and fires with the new `#rrggbb`. Presentation stays the chip, interaction stays native. Use for inspector / control-panel colour fields instead of styling a raw colour input. Takes precedence over `onSelect`.\",\n  },\n  \"label\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"caption rendered beneath the chip; also becomes the accessible name + tooltip.\",\n  },\n  \"layout\": {\n      schema: z.enum([\"row\", \"stack\"]).optional(),\n      design: \"knob\",\n      description: \"`row` (default) spaces chips out; `stack` overlaps them into a coin-stack (the theme-picker / \\\"key colours\\\" treatment, where each chip's ring reads as the separating edge).\",\n  },\n  \"gap\": {\n      schema: z.enum([\"xs\", \"sm\", \"md\", \"lg\"]).optional(),\n      design: \"knob\",\n      description: \"spacing between chips in `row` layout; default sm.\",\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. For a settings row (label + description on the left, Switch on the right) use Field layout=\\\"setting\\\". For a prominent on/off presented as a whole selectable card, use SwitchCard.\",\n  import: \"@gradeui/ui\",\n  aliases: [\"toggle\",\"switch\",\"on/off switch\",\"ios toggle\",\"toggle switch\",\"switch control\",\"react native switch\"],\n  element: \"button\",\n  composesWith: [\"Label (via htmlFor)\",\"Field (layout=\\\"setting\\\" settings row)\",\"SwitchCard (whole-card toggle)\",\"Card (settings rows)\"],\n  styleDefaults: {\"Switch\":\"peer inline-flex shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-xs outline-none transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input dark:data-[state=unchecked]:bg-input/80 h-6 w-11\"},\n  variantDefaults: {\"size\":\"default\"},\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  \"name\": {\n      schema: z.string().optional(),\n      design: \"content\",\n      description: \"form field name, posted via the hidden input\",\n  },\n  \"value\": {\n      schema: z.string().optional(),\n      design: \"content\",\n      description: \"form value when on (default \\\"on\\\")\",\n  },\n  \"required\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"marks the hidden form input required\",\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 SwitchCardContract = contract({\n  name: \"SwitchCard\",\n  description: \"A prominent on/off setting presented as a whole selectable card. The whole card is the switch, so the toggled state lives on the card surface. Standalone. For a row of compact settings (label left, small Switch right) use Field layout=\\\"setting\\\" instead — SwitchCard is for the heavier, card-sized toggle.\",\n  import: \"@gradeui/ui\",\n  aliases: [\"switch card\",\"toggle card\",\"setting card\",\"feature toggle card\"],\n  composesWith: [\"Badge (in aside)\",\"Stack (stacking several)\"],\n  props: {\n  \"checked\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"standard switch state\",\n  },\n  \"defaultChecked\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"standard switch state\",\n  },\n  \"onCheckedChange\": {\n      schema: z.unknown().optional(),\n      design: \"event\",\n      description: \"standard switch state\",\n  },\n  \"label\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"title line\",\n  },\n  \"description\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"secondary line\",\n  },\n  \"aside\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"slot before the indicator (a Badge, price, hint)\",\n  },\n  \"hideIndicator\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"hide the switch glyph; state shown by the card border + background\",\n  },\n  \"indicatorPosition\": {\n      schema: z.enum([\"leading\", \"trailing\"]).optional(),\n      design: \"knob\",\n      description: \"default trailing\",\n  },\n  \"children\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n      description: \"arbitrary static content instead of label/description\",\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  element: \"table\",\n  composesWith: [\"Card (wrap the table)\",\"Badge (inside TableCell for status)\",\"Checkbox (row selection)\",\"Button (row actions)\"],\n  styleDefaults: {\"Table\":\"w-full caption-bottom text-sm\",\"TableHeader\":\"[&_tr]:border-b\",\"TableBody\":\"[&_tr:last-child]:border-0\",\"TableFooter\":\"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\",\"TableRow\":\"border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted\",\"TableHead\":\"h-10 px-2 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\"TableCell\":\"p-2 align-middle [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\"TableCaption\":\"mt-4 text-sm text-muted-foreground\"},\n  props: {\n  \"colSpan\": {\n      schema: z.number().optional(),\n      design: \"knob\",\n      description: \"span multiple columns\",\n  },\n  \"rowSpan\": {\n      schema: z.number().optional(),\n      design: \"knob\",\n      description: \"span multiple rows\",\n  },\n  \"scope\": {\n      schema: z.string().optional(),\n      design: \"content\",\n      description: \"a11y column/row header scope (\\\"col\\\" | \\\"row\\\")\",\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  element: \"div\",\n  subcomponentElements: {\"TabsTrigger\":\"button\"},\n  composesWith: [\"Card (tabs inside a card body)\",\"Dialog\",\"TooltipProvider (required for tooltip prop)\"],\n  styleDefaults: {\"TabsList\":\"inline-flex items-center text-muted-foreground justify-center rounded-lg bg-muted\",\"TabsContent\":\"mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"},\n  props: {\n  \"defaultValue\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"value\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"onValueChange\": {\n      schema: z.unknown().optional(),\n      design: \"event\",\n  },\n  \"orientation\": {\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  \"tooltip\": {\n      schema: z.string().optional(),\n      design: \"content\",\n      description: \"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  \"disabled\": {\n      schema: z.boolean().optional(),\n      design: \"knob\",\n      description: \"trigger shown but not selectable\",\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. Use size=\\\"sm\\\"/\\\"xs\\\" in dense tool panels.\",\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  element: \"textarea\",\n  composesWith: [\"Label\",\"Form\",\"Card (in CardContent)\"],\n  styleDefaults: {\"Textarea\":\"flex w-full rounded-md border border-input bg-background dark:bg-input/30 placeholder:text-muted-foreground focus-visible:outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 min-h-[80px] px-3 py-2 text-sm\"},\n  variantDefaults: {\"size\":\"default\"},\n  props: {\n  \"size\": {\n      schema: z.enum([\"default\", \"sm\", \"xs\"]).optional(),\n      design: \"knob\",\n      description: \"control density, mirrors Input. default = min-h-80 / text-sm; sm and xs shrink the min-height + padding for dense panels.\",\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 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  styleDefaults: {\"ThreeScene\":\"absolute inset-0 flex items-end justify-end p-2\"},\n  props: {\n  \"preset\": {\n      schema: z.enum([\"mesh\", \"waves\", \"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  styleDefaults: {\"Toggle\":\"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 bg-transparent h-9 px-2 min-w-9\"},\n  variantDefaults: {\"variant\":\"default\",\"size\":\"default\"},\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  styleDefaults: {\"ToggleGroup\":\"flex items-center justify-center gap-1\"},\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.union([z.string(), z.array(z.string())]).optional(),\n      design: \"knob\",\n      description: \"controlled; matches `type` (string for single, string[] for multiple)\",\n  },\n  \"defaultValue\": {\n      schema: z.union([z.string(), z.array(z.string())]).optional(),\n      design: \"knob\",\n      description: \"uncontrolled initial\",\n  },\n  \"onValueChange\": {\n      schema: z.unknown().optional(),\n      design: \"event\",\n  },\n  \"size\": {\n      schema: z.enum([\"2xs\", \"xs\", \"sm\", \"md\", \"lg, default md\"]).optional(),\n      design: \"knob\",\n      description: \"cascades to every ToggleGroupItem via context, matches Tabs/Button heights; 2xs/xs are the dense tool-panel sizes (2xs also drops text to text-2xs and icons to size-3 so labelled items read at panel density)\",\n  },\n  \"variant\": {\n      schema: z.enum([\"default\", \"outline\", \"segmented\"]).optional(),\n      design: \"knob\",\n      description: \"segmented sits the items in a muted track with the active item as a soft raised pill, so it reads like a TabsList; reach for it in dense property panels (e.g. a Row/Stack direction toggle)\",\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  styleDefaults: {\"ToolbarSlot\":\"flex items-center min-w-0\"},\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  styleDefaults: {\"TooltipContent\":\"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  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  \"defaultOpen\": {\n      schema: z.unknown().optional(),\n      design: \"plumbing\",\n  },\n  \"onOpenChange\": {\n      schema: z.unknown().optional(),\n      design: \"event\",\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\"]).optional(),\n      design: \"knob\",\n      default: \"top\",\n  },\n  \"align\": {\n      schema: z.enum([\"start\", \"center\", \"end\"]).optional(),\n      design: \"knob\",\n  },\n  \"sideOffset\": {\n      schema: z.number().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 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  styleDefaults: {\"VideoPlayer\":\"w-full h-full\"},\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 { BackgroundFillContract } from \"../components/ui/background-fill.contract\";\nimport { BadgeContract } from \"../components/ui/badge.contract\";\nimport { BannerContract } from \"../components/ui/banner.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 { CheckboxCardContract } from \"../components/ui/checkbox-card.contract\";\nimport { CodeContract } from \"../components/ui/code.contract\";\nimport { CollapsibleContract } from \"../components/ui/collapsible.contract\";\nimport { ColorPickerContract } from \"../components/ui/color-picker.contract\";\nimport { ComboboxContract } from \"../components/ui/combobox.contract\";\nimport { CommandContract } from \"../components/ui/command.contract\";\nimport { ComposerContract } from \"../components/ui/composer.contract\";\nimport { DataViewContract } from \"../components/ui/data-view.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 { FieldContract } from \"../components/ui/field.contract\";\nimport { FillPickerContract } from \"../components/ui/fill-picker.contract\";\nimport { FlexContract } from \"../components/ui/flex.contract\";\nimport { GradientEditorContract } from \"../components/ui/gradient-editor.contract\";\nimport { GridContract } from \"../components/ui/grid.contract\";\nimport { HoverCardContract } from \"../components/ui/hover-card.contract\";\nimport { InputContract } from \"../components/ui/input.contract\";\nimport { InputGroupContract } from \"../components/ui/input-group.contract\";\nimport { LabelContract } from \"../components/ui/label.contract\";\nimport { LogoContract } from \"../components/ui/logo.contract\";\nimport { MapContract } from \"../components/ui/map.contract\";\nimport { MediaSurfaceContract } from \"../components/ui/media-surface.contract\";\nimport { MessageContract } from \"../components/ui/message.contract\";\nimport { MotionContract } from \"../components/ui/motion.contract\";\nimport { MultiSelectContract } from \"../components/ui/multi-select.contract\";\nimport { PopoverContract } from \"../components/ui/popover.contract\";\nimport { ProgressContract } from \"../components/ui/progress.contract\";\nimport { PropertyListContract } from \"../components/ui/property-list.contract\";\nimport { RadioCardContract } from \"../components/ui/radio-card.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 { ScreenAnimatorContract } from \"../components/ui/screen-animator.contract\";\nimport { ScrollAreaContract } from \"../components/ui/scroll-area.contract\";\nimport { SectionContract } from \"../components/ui/section.contract\";\nimport { SectionBlockContract } from \"../components/ui/section-block.contract\";\nimport { SelectContract } from \"../components/ui/select.contract\";\nimport { SelectionCardContract } from \"../components/ui/selection-card.contract\";\nimport { SeparatorContract } from \"../components/ui/separator.contract\";\nimport { ShaderControlsContract } from \"../components/ui/shader-controls.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 { SwatchContract } from \"../components/ui/swatch.contract\";\nimport { SwitchContract } from \"../components/ui/switch.contract\";\nimport { SwitchCardContract } from \"../components/ui/switch-card.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  BackgroundFill: BackgroundFillContract,\n  Badge: BadgeContract,\n  Banner: BannerContract,\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  CheckboxCard: CheckboxCardContract,\n  Code: CodeContract,\n  Collapsible: CollapsibleContract,\n  ColorPicker: ColorPickerContract,\n  Combobox: ComboboxContract,\n  Command: CommandContract,\n  Composer: ComposerContract,\n  DataView: DataViewContract,\n  DatePicker: DatePickerContract,\n  Dialog: DialogContract,\n  DropdownMenu: DropdownMenuContract,\n  Field: FieldContract,\n  FillPicker: FillPickerContract,\n  Flex: FlexContract,\n  GradientEditor: GradientEditorContract,\n  Grid: GridContract,\n  HoverCard: HoverCardContract,\n  Input: InputContract,\n  InputGroup: InputGroupContract,\n  Label: LabelContract,\n  Logo: LogoContract,\n  Map: MapContract,\n  MediaSurface: MediaSurfaceContract,\n  Message: MessageContract,\n  Motion: MotionContract,\n  MultiSelect: MultiSelectContract,\n  Popover: PopoverContract,\n  Progress: ProgressContract,\n  PropertyList: PropertyListContract,\n  RadioCard: RadioCardContract,\n  RadioGroup: RadioGroupContract,\n  Resizable: ResizableContract,\n  RivePlayer: RivePlayerContract,\n  Row: RowContract,\n  ScreenAnimator: ScreenAnimatorContract,\n  ScrollArea: ScrollAreaContract,\n  Section: SectionContract,\n  SectionBlock: SectionBlockContract,\n  Select: SelectContract,\n  SelectionCard: SelectionCardContract,\n  Separator: SeparatorContract,\n  ShaderControls: ShaderControlsContract,\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  Swatch: SwatchContract,\n  Switch: SwitchContract,\n  SwitchCard: SwitchCardContract,\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  // The icon slot must be sized here: bare lucide icons default to 24px\n  // and would fill the text inset, losing the icon-to-title gap. 20px\n  // icons with a 32px (pl-8) inset keep 12px of breathing room.\n  \"relative w-full rounded-lg border p-4 [&>svg~*]:pl-8 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:h-5 [&>svg]:w-5\",\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 text-sm font-semibold leading-snug\", 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\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\n\n/**\n * Avatar — circular user/entity glyph. Wraps Radix's avatar primitive\n * with two ergonomic additions over the base shadcn shape:\n *\n *   size — t-shirt scale (xs / sm / md / lg / xl) so consumers pick a\n *          token instead of writing `h-7 w-7` every time. Defaults\n *          to md (40px) to preserve previous behaviour.\n *\n *   tone — on AvatarFallback only. Picks a tinted bg/text colour\n *          pair (violet / amber / emerald / sky / rose / plum / lime /\n *          primary / muted). Default `muted` matches the previous\n *          `bg-muted` behaviour. Reach for explicit tones when each\n *          author needs a stable colour mapping (chat avatars, comment\n *          threads, member lists).\n *\n * AvatarFallback type scales with the avatar's size (9px at 2xs up to\n * 30px at xl; md keeps the 16px base) via a size context, so initials\n * hold a ~0.4 ratio in every circle instead of inheriting 16px.\n *\n * Both additions are backwards compatible — code that passed className\n * directly still works and overrides the variant defaults.\n */\n\nconst avatarSizes = cva(\n  \"relative flex shrink-0 overflow-hidden rounded-full\",\n  {\n    variants: {\n      size: {\n        // 2xs (20px) — densest tool-panel avatar / inline mention\n        \"2xs\": \"h-5 w-5\",\n        // xs (24px) — chat message avatars, dense comment threads\n        xs: \"h-6 w-6\",\n        // sm (28px) — comments, tag chips, secondary surfaces\n        sm: \"h-7 w-7\",\n        // md (40px) — default, profile rows, sidebars\n        md: \"h-10 w-10\",\n        // lg (56px) — profile headers, member cards\n        lg: \"h-14 w-14\",\n        // xl (80px) — onboarding, account pages\n        xl: \"h-20 w-20\",\n      },\n    },\n    defaultVariants: {\n      size: \"md\",\n    },\n  },\n);\n\nexport type AvatarSize = NonNullable<VariantProps<typeof avatarSizes>[\"size\"]>;\n\n// Fallback type per avatar size — ~0.4 of the circle diameter. Theme\n// scale steps where one lands close (they re-scale with the type theme);\n// arbitrary px only below the smallest step. md stays at the 16px base\n// so the default size renders exactly as before.\nconst avatarFallbackTypes: Record<AvatarSize, string> = {\n  \"2xs\": \"text-[9px]\",\n  xs: \"text-[10px]\",\n  sm: \"text-xs\",\n  md: \"text-base\",\n  lg: \"text-2xl\",\n  xl: \"text-3xl\",\n};\n\n// Lets AvatarFallback know the size its Avatar was given without a prop\n// on every call site.\nconst AvatarSizeContext = React.createContext<AvatarSize>(\"md\");\n\nexport interface AvatarProps\n  extends React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>,\n    VariantProps<typeof avatarSizes> {}\n\nconst Avatar = React.forwardRef<\n  React.ElementRef<typeof AvatarPrimitive.Root>,\n  AvatarProps\n>(({ className, size, ...props }, ref) => (\n  <AvatarSizeContext.Provider value={size ?? \"md\"}>\n    <AvatarPrimitive.Root\n      ref={ref}\n      data-gds-part=\"avatar\"\n      data-gds-size={size ?? \"md\"}\n      className={cn(avatarSizes({ size }), className)}\n      {...props}\n    />\n  </AvatarSizeContext.Provider>\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    data-gds-part=\"avatar-image\"\n    className={cn(\"aspect-square h-full w-full\", className)}\n    {...props}\n  />\n));\nAvatarImage.displayName = AvatarPrimitive.Image.displayName;\n\n// ─── Fallback tones ──────────────────────────────────────────────────\n//\n// Each tone is a bg + text colour pair. Light theme uses the 500 hue\n// at 20% alpha for the bg and 600 for the text; dark theme uses the\n// 400 hue for text. `primary` reads from the theme, the rest are\n// fixed brand-safe colours suitable for \"stable per-author identity\"\n// mappings (alice = violet, ben = amber, ...).\n//\n// `muted` matches the previous bg-muted behaviour; default tone is\n// muted so existing call sites that omit `tone` are unchanged.\n\nconst avatarFallbackTones = cva(\n  \"flex h-full w-full items-center justify-center rounded-full font-semibold\",\n  {\n    variants: {\n      tone: {\n        muted: \"bg-muted text-foreground\",\n        primary: \"bg-primary/15 text-primary\",\n        violet: \"bg-violet-500/20 text-violet-600 dark:text-violet-400\",\n        amber: \"bg-amber-500/20 text-amber-600 dark:text-amber-400\",\n        emerald: \"bg-emerald-500/20 text-emerald-600 dark:text-emerald-400\",\n        sky: \"bg-sky-500/20 text-sky-600 dark:text-sky-400\",\n        rose: \"bg-rose-500/20 text-rose-600 dark:text-rose-400\",\n        plum: \"bg-fuchsia-500/20 text-fuchsia-600 dark:text-fuchsia-400\",\n        lime: \"bg-lime-500/20 text-lime-600 dark:text-lime-400\",\n      },\n    },\n    defaultVariants: {\n      tone: \"muted\",\n    },\n  },\n);\n\nexport type AvatarTone = NonNullable<\n  VariantProps<typeof avatarFallbackTones>[\"tone\"]\n>;\n\nexport interface AvatarFallbackProps\n  extends React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>,\n    VariantProps<typeof avatarFallbackTones> {}\n\nconst AvatarFallback = React.forwardRef<\n  React.ElementRef<typeof AvatarPrimitive.Fallback>,\n  AvatarFallbackProps\n>(({ className, tone, ...props }, ref) => {\n  const size = React.useContext(AvatarSizeContext);\n  return (\n    <AvatarPrimitive.Fallback\n      ref={ref}\n      data-gds-part=\"avatar-fallback\"\n      data-gds-tone={tone ?? \"muted\"}\n      className={cn(avatarFallbackTones({ tone }), avatarFallbackTypes[size], className)}\n      {...props}\n    />\n  );\n});\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;\n\nexport {\n  Avatar,\n  AvatarImage,\n  AvatarFallback,\n  avatarSizes,\n  avatarFallbackTones,\n  avatarFallbackTypes,\n};\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst badgeVariants = cva(\n  \"inline-flex items-center gap-1 border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 [&_svg]:size-3 [&_svg]:shrink-0\",\n  {\n    variants: {\n      variant: {\n        default:\n          \"border-transparent bg-primary text-primary-foreground 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 hover:bg-destructive/80\",\n        outline: \"text-foreground\",\n        // Semantic solid variants — role colour at full strength. These track\n        // the theme's --success / --warning / --info / --highlight tokens, so a\n        // semantic-colour edit re-tones them (same source the Callout uses).\n        highlight:\n          \"border-transparent bg-highlight text-gds-gray-900 hover:bg-highlight/90\",\n        success:\n          \"border-transparent bg-success text-gds-gray-900 hover:bg-success/90\",\n        warning:\n          \"border-transparent bg-warning text-white hover:bg-warning/90\",\n        info:\n          \"border-transparent bg-info text-white hover:bg-info/90\",\n        // Semantic soft variants — deep on-surface text over a tinted surface.\n        // -soft / -deep re-voice per light/dark, so no dark: overrides needed.\n        // SOFT = STATUS AS TEXT, no chip (Ali, 11 Aug). These used to be\n        // a saturated dark fill plus vivid text, which on a dark card\n        // reads as a warning label stuck to the surface — garish next to\n        // calm content, and the two colours fight each other. Colour on\n        // the glyphs alone says the same thing quietly, and it matches\n        // what the product does: the Glint app's activity list renders\n        // \"Pending\" as plain green text, not a pill.\n        //\n        // Padding is dropped with the fill so these align as text in a\n        // row rather than sitting in an invisible box. For a chip WITH a\n        // surface, use the solid variants (`success`, `destructive`) or\n        // `outline`; the name is kept because these remain the quiet end\n        // of the status scale.\n        \"success-soft\": \"border-transparent bg-transparent px-0 text-success-deep\",\n        \"warning-soft\": \"border-transparent bg-transparent px-0 text-warning-deep\",\n        \"destructive-soft\":\n          \"border-transparent bg-transparent px-0 text-destructive-deep\",\n        \"info-soft\": \"border-transparent bg-transparent px-0 text-info-deep\",\n        \"highlight-soft\":\n          \"border-transparent bg-transparent px-0 text-highlight-deep\",\n        // Outline variants - border + deep text, no fill\n        \"success-outline\":\n          \"border-success/50 bg-transparent text-success-deep\",\n        \"warning-outline\":\n          \"border-warning/50 bg-transparent text-warning-deep\",\n        \"destructive-outline\":\n          \"border-destructive/50 bg-transparent text-destructive-deep\",\n        \"info-outline\":\n          \"border-info/50 bg-transparent text-info-deep\",\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","/**\n * Surface — what a container is *made of*.\n *\n * Shared across every component that surfaces content (Card, Dialog,\n * Sheet, Popover, DropdownMenu, HoverCard, SectionBlock). Picking the\n * material is a first-class prop axis on each of those components,\n * orthogonal to elevation (how high) and aura (what it radiates) — see\n * gradeui/PRESENCE.md for the three-axis model.\n *\n * Putting this on the prop API instead of leaving it as a className\n * escape-hatch buys three things:\n *\n *   1. Studio's inspector surfaces a `surface` knob on every container\n *      so users can flip the material without touching code.\n *   2. The model has a first-class vocabulary to pick from — without\n *      this it reaches for `bg-card/40 backdrop-blur-md` Tailwind soup\n *      and loses the edge highlight + theme-aware blur tuning.\n *   3. Themes can retune `--surface-blur-*` / `--surface-alpha-*`\n *      centrally and every container moves with them.\n *\n * The CSS classes referenced here live in packages/ui/styles/globals.css\n * (and the apps/docs mirror) under the SURFACE CLASSES section.\n */\n\nexport type Surface =\n  | \"solid\"\n  | \"translucent\"\n  | \"glass\"\n  | \"glass-strong\"\n  | \"frosted\";\n\n/**\n * Maps a Surface variant to the `gds-surface-*` class. `solid` returns\n * an empty string because the base `bg-card` (or component default)\n * covers it — surface-bearing components should also drop their default\n * opaque background when `surface !== \"solid\"` so the alpha actually\n * shows through. See cardSurfaceBg() below for the shared helper.\n */\nexport const SURFACE_CLASS: Record<Surface, string> = {\n  solid: \"\",\n  translucent: \"gds-surface-translucent\",\n  glass: \"gds-surface-glass\",\n  \"glass-strong\": \"gds-surface-glass-strong\",\n  frosted: \"gds-surface-frosted\",\n};\n\n/**\n * Components that have an opaque default background (Card's `bg-card`,\n * Popover's `bg-popover`, etc.) call this with the surface choice and\n * the component's default class. It drops the default when surface is\n * anything other than `solid` so the translucent/glass layers aren't\n * hidden behind a fully-opaque fill.\n *\n * @param surface  active surface choice\n * @param defaultBgClass e.g. \"bg-card\" or \"bg-popover\"\n */\nexport function surfaceBg(surface: Surface, defaultBgClass: string): string {\n  return surface === \"solid\" ? defaultBgClass : \"\";\n}\n","import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { X } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { SURFACE_CLASS, surfaceBg, type Surface } from \"@/lib/surface\";\n\n/**\n * Banner — full-width horizontal strip surfacing system-level state or\n * announcements that should stay visible until acknowledged.\n *\n * The shape is the difference from Callout:\n *\n *   Callout = inline boxed message in the layout flow (rounded box,\n *             body-paragraph width, lives inside a Card/Section).\n *   Banner  = full-bleed horizontal strip across a page / panel /\n *             AppShellHeader top. Single-line by default.\n *\n * Use cases that should be Banner, not Callout, not Dialog:\n *   - \"You're previewing this from main — switch to your branch\"\n *   - \"We're investigating an incident affecting search\"\n *   - \"Send your design to Figma — get the Grade plugin\"\n *   - \"New: scaffold-playground tab\"\n *\n * Three Presence axes apply: variant (intent colour), surface\n * (material), shadow utilities for elevation. The default is\n * `variant=\"default\" surface=\"solid\"`, which yields a calm announcement\n * strip in the active theme. Status variants pick up the soft / deep\n * token pairs (`--info-soft` + `--info-deep`, etc.), same pattern as\n * Callout.\n *\n * AUTHORING ORIGIN: this primitive was extracted out of\n * `apps/docs/components/studio/figma-intro-banner.tsx` after the user\n * flagged that ad-hoc banner as invisible — it was reaching for\n * `--gds-primary` / `--gds-border` / `--gds-foreground` tokens that\n * don't exist (our tokens are unprefixed). The inline-style fallbacks\n * kicked in and the chrome washed out completely. Banner exists so the\n * \"I need a one-line announcement strip\" need lands in a primitive that\n * cannot get the token names wrong.\n */\n\nconst bannerVariants = cva(\n  \"relative flex items-center gap-3 px-4 py-2.5 text-sm leading-relaxed border-b\",\n  {\n    variants: {\n      variant: {\n        default:\n          \"bg-muted text-foreground border-border [&>svg]:text-muted-foreground\",\n        info:\n          \"bg-info-soft text-info-deep border-info/30 [&>svg]:text-info-deep\",\n        success:\n          \"bg-success-soft text-success-deep border-success/30 [&>svg]:text-success-deep\",\n        warning:\n          \"bg-warning-soft text-warning-deep border-warning/30 [&>svg]:text-warning-deep\",\n        destructive:\n          \"bg-destructive-soft text-destructive-deep border-destructive/30 [&>svg]:text-destructive-deep\",\n        announcement:\n          // Promo / \"new feature\" tone — picks up the primary brand\n          // colour at a low alpha so it stays calm.\n          \"bg-[oklch(var(--primary)_/_0.06)] text-foreground border-[oklch(var(--primary)_/_0.18)] [&>svg]:text-primary\",\n      },\n      align: {\n        start: \"justify-start\",\n        center: \"justify-center\",\n        between: \"justify-between\",\n      },\n      sticky: {\n        true: \"sticky top-0 z-30\",\n        false: \"\",\n      },\n    },\n    defaultVariants: {\n      variant: \"default\",\n      align: \"between\",\n      sticky: false,\n    },\n  }\n);\n\n/**\n * Role mapping: status colours that imply something is wrong get\n * `role=\"alert\"` so screen readers interrupt. Calm / informational\n * variants get `role=\"status\"` (polite). Matches the Callout rule.\n */\nconst ROLE_BY_VARIANT: Record<NonNullable<VariantProps<typeof bannerVariants>[\"variant\"]>, \"alert\" | \"status\"> = {\n  destructive: \"alert\",\n  warning: \"alert\",\n  info: \"status\",\n  success: \"status\",\n  default: \"status\",\n  announcement: \"status\",\n};\n\nexport interface BannerProps\n  extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\">,\n    VariantProps<typeof bannerVariants> {\n  /**\n   * Material the banner is *made of*. Defaults to `solid` (the\n   * variant's tinted bg). `glass` is useful when the banner sits over\n   * a hero image / generative backdrop and the imagery underneath\n   * should remain visible.\n   */\n  surface?: Surface;\n  /**\n   * Show a close button at the trailing end. The button calls\n   * `onDismiss` if provided; otherwise the consumer controls\n   * visibility via standard React state on the parent.\n   */\n  dismissible?: boolean;\n  /**\n   * Callback when the user clicks the trailing close button. Required\n   * when `dismissible` is set if you want the banner to actually\n   * disappear (the primitive itself stays controlled).\n   */\n  onDismiss?: () => void;\n  /**\n   * Leading slot — typically a single Lucide icon. The status icon\n   * is NOT inferred from variant; pass the one that fits your message.\n   */\n  icon?: React.ReactNode;\n  /**\n   * Optional trailing action — usually a Button or anchor. Sits to the\n   * left of the dismiss button.\n   */\n  action?: React.ReactNode;\n}\n\nconst Banner = React.forwardRef<HTMLDivElement, BannerProps>(\n  (\n    {\n      className,\n      variant = \"default\",\n      align,\n      sticky,\n      surface = \"solid\",\n      dismissible,\n      onDismiss,\n      icon,\n      action,\n      role,\n      children,\n      ...props\n    },\n    ref\n  ) => {\n    const resolvedVariant = (variant ?? \"default\") as NonNullable<\n      VariantProps<typeof bannerVariants>[\"variant\"]\n    >;\n    const resolvedRole = role ?? ROLE_BY_VARIANT[resolvedVariant];\n\n    return (\n      <div\n        ref={ref}\n        role={resolvedRole}\n        data-gds-part=\"banner\"\n        data-variant={resolvedVariant}\n        data-surface={surface}\n        className={cn(\n          bannerVariants({ variant, align, sticky }),\n          // Surface composes on top of the variant tint. When surface\n          // is set to anything other than solid, the bg-* class from\n          // the variant still applies — the gds-surface-* class layers\n          // backdrop blur + edge highlight over it. `surfaceBg()`\n          // returns \"\" when surface !== \"solid\" but we keep the\n          // variant background classes intact (they're tonal, not the\n          // base `bg-card`/`bg-popover` the helper is designed to\n          // strip), so the helper isn't strictly needed here. Glass\n          // utilities still combine cleanly.\n          SURFACE_CLASS[surface],\n          className\n        )}\n        {...props}\n      >\n        {icon ? (\n          <span data-gds-part=\"banner-icon\" aria-hidden className=\"shrink-0\">\n            {icon}\n          </span>\n        ) : null}\n\n        <div\n          data-gds-part=\"banner-content\"\n          className=\"flex-1 min-w-0\"\n        >\n          {children}\n        </div>\n\n        {action ? (\n          <span data-gds-part=\"banner-action\" className=\"shrink-0\">\n            {action}\n          </span>\n        ) : null}\n\n        {dismissible ? (\n          <button\n            type=\"button\"\n            data-gds-part=\"banner-dismiss\"\n            onClick={onDismiss}\n            aria-label=\"Dismiss\"\n            className=\"shrink-0 inline-flex h-7 w-7 items-center justify-center rounded-md opacity-70 hover:opacity-100 hover:bg-black/5 focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 transition-opacity\"\n          >\n            <X className=\"h-4 w-4\" />\n          </button>\n        ) : null}\n      </div>\n    );\n  }\n);\nBanner.displayName = \"Banner\";\n\nexport { Banner, bannerVariants };\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 *   2xs: h-5 (20px)  — densest tool-panel size; matches Figma Button size=2xs\n *   xs:  h-6 (24px)  — tool-panel density; matches Figma Button size=xs\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 *\n * `default` is preserved as an alias for `md` so existing call sites\n * keep working through the rename.\n *\n * `iconOnly` squares the button at WHATEVER `size` it has (2xs=20, sm=28,\n * md=32, lg=40) by dropping horizontal padding and matching width to\n * height. It's a boolean modifier on top of the height ramp — there is no\n * separate icon size value — and the icon you pass as the child is centered.\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 cursor-pointer 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 hover:bg-primary/90\",\n        destructive:\n          \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n        outline:\n          \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n        secondary:\n          \"bg-secondary text-secondary-foreground 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 gds-button-raised-surface\",\n      },\n      size: {\n        // 2xs: h-5 (20px) — densest tool-panel button (the Studio inspector); matches Figma Button size=2xs.\n        \"2xs\": \"h-5 gap-1 px-1.5 text-2xs [&_svg]:size-3\",\n        // xs: h-6 (24px) — Figma-density for tool panels; matches Figma Button size=xs.\n        xs: \"h-6 gap-1 px-2 text-xs [&_svg]:size-3\",\n        sm: \"h-7 gap-1.5 px-2.5 text-sm [&_svg]:size-3.5\",\n        md: \"h-8 gap-1.5 px-3 text-base [&_svg]:size-4\",\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-base [&_svg]:size-4\",\n        lg: \"h-10 gap-2 px-4 text-lg [&_svg]:size-5\",\n      },\n      // Squares the button at the current `size` height for icon-only use.\n      // px-0 here drops the text padding; the per-size width that makes it\n      // square (w = h) lives in compoundVariants below.\n      iconOnly: {\n        true: \"px-0\",\n        false: \"\",\n      },\n    },\n    compoundVariants: [\n      // width = height per size → a true square at every density.\n      { size: \"2xs\", iconOnly: true, class: \"w-5\" },\n      { size: \"xs\", iconOnly: true, class: \"w-6\" },\n      { size: \"sm\", iconOnly: true, class: \"w-7\" },\n      { size: \"md\", iconOnly: true, class: \"w-8\" },\n      { size: \"default\", iconOnly: true, class: \"w-8\" },\n      { size: \"lg\", iconOnly: true, class: \"w-10\" },\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  /** Presence TRAIT: tactile elevation (bevel + drop + hover glow +\n   *  pressed sink) layered onto WHATEVER variant the button wears —\n   *  a raised primary, raised outline, etc. Glow tone reads\n   *  --btn-glow → --accent-glow → --selected-glow; override\n   *  per-button via style={{ \"--btn-glow\": \"var(--warning)\" }}.\n   *  variant=\"raised\" remains the neutral-key alias (trait +\n   *  secondary surface). */\n  raised?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n  ({ className, variant, size, iconOnly, asChild = false, raised = 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, iconOnly }), raised && \"gds-button-raised\", className)}\n        ref={ref}\n        {...props}\n      />\n    )\n  }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n","import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"@/lib/utils\";\n\n/**\n * Section + Container — the page scaffold (STUDIO-SECTIONS.md).\n *\n * A page is an ordered stack of Sections. `Section` is the FULL-WIDTH band: it\n * owns a colour `scope` (subtheme) + vertical `pad` rhythm, and nothing else —\n * it never constrains width. `Container` is the measure: a centred max-width +\n * gutters you drop INSIDE a section to contain content; omit it for a full-bleed\n * band. The content is FREE; Section never bakes a title/CTA (that's\n * `SectionBlock`'s opinionated job). The known composable parts (Eyebrow /\n * Title / Subtitle / Description / Actions / Media) give the common shape\n * design intent without constraining it.\n */\n\nexport type SectionScope =\n  | \"default\"\n  | \"inverse\"\n  | \"brand\"\n  | \"accent\"\n  | \"muted\"\n  | \"card\";\nexport type ContainerMaxW = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"prose\" | \"full\";\n\n// ── Section: the full-width band ────────────────────────────────────\n// Carries the scope paint + vertical rhythm. Always full bleed — wrap\n// content in <Container> when you want a measure.\nconst bandVariants = cva(\"w-full\", {\n  variants: {\n    pad: {\n      none: \"py-0\",\n      sm: \"py-8 md:py-12\",\n      md: \"py-12 md:py-16\",\n      lg: \"py-16 md:py-24\",\n      xl: \"py-20 md:py-32\",\n    },\n  },\n  defaultVariants: { pad: \"lg\" },\n});\n\nexport interface SectionProps\n  extends React.HTMLAttributes<HTMLElement>,\n    VariantProps<typeof bandVariants> {\n  /** Colour subtheme — applies the `scope-*` class (STUDIO-COLOR.md). Unset =\n   *  the page surface (transparent). */\n  scope?: SectionScope;\n  /** Visual band background — image / video / gradient / shader (e.g.\n   *  `<BackgroundFill>`). Renders BEHIND the content; Section owns the\n   *  relative + overflow-hidden + z-layering. Works with `scope`, which\n   *  re-tones the content tokens so text stays legible over the media. */\n  background?: React.ReactNode;\n  /** Semantic element. */\n  as?: \"section\" | \"header\" | \"footer\" | \"div\";\n}\n\nconst Section = React.forwardRef<HTMLElement, SectionProps>(\n  (\n    {\n      className,\n      scope,\n      background,\n      pad,\n      as: Comp = \"section\",\n      children,\n      ...props\n    },\n    ref,\n  ) => (\n    <Comp\n      ref={ref as never}\n      data-gds-part=\"section\"\n      data-scope={scope}\n      // The scope class paints the band (background-color + color) AND\n      // re-points the surface tokens for the subtree. No scope = page bg.\n      className={cn(\n        bandVariants({ pad }),\n        scope && `scope-${scope}`,\n        background != null && \"relative overflow-hidden\",\n        className,\n      )}\n      {...props}\n    >\n      {background != null ? (\n        <>\n          <div data-gds-part=\"section-background\" className=\"absolute inset-0\">\n            {background}\n          </div>\n          <div className=\"relative z-10\">{children}</div>\n        </>\n      ) : (\n        children\n      )}\n    </Comp>\n  ),\n);\nSection.displayName = \"Section\";\n\n// ── Container: the measure ──────────────────────────────────────────\n// Centred max-width + gutters. Drop inside a Section (or anywhere) to\n// constrain content; omit it for full-bleed. `grid` snaps children to a\n// 12-column grid.\nconst containerVariants = cva(\"mx-auto w-full px-4 md:px-6 lg:px-8\", {\n  variants: {\n    maxW: {\n      sm: \"max-w-3xl\",\n      md: \"max-w-5xl\",\n      lg: \"max-w-7xl\",\n      xl: \"max-w-[96rem]\",\n      prose: \"max-w-prose\",\n      full: \"max-w-none\",\n    },\n    grid: { true: \"grid grid-cols-12 gap-6\", false: \"\" },\n  },\n  defaultVariants: { maxW: \"lg\", grid: false },\n});\n\nexport interface ContainerProps\n  extends React.HTMLAttributes<HTMLDivElement>,\n    VariantProps<typeof containerVariants> {\n  as?: \"div\" | \"section\";\n}\n\nconst Container = React.forwardRef<HTMLDivElement, ContainerProps>(\n  ({ className, maxW, grid, as: Comp = \"div\", ...props }, ref) => (\n    <Comp\n      ref={ref as never}\n      data-gds-part=\"container\"\n      className={cn(containerVariants({ maxW, grid }), className)}\n      {...props}\n    />\n  ),\n);\nContainer.displayName = \"Container\";\n\n/* ── Section parts ──────────────────────────────────────────────────\n * The known, styled, composable vocabulary (STUDIO-SECTIONS.md). Offered,\n * never required — drop raw JSX for anything the vocabulary doesn't cover.\n * Each carries a `data-gds-part` so Studio can select it. */\n\nconst SectionEyebrow = React.forwardRef<\n  HTMLSpanElement,\n  React.HTMLAttributes<HTMLSpanElement>\n>(({ className, ...props }, ref) => (\n  <span\n    ref={ref}\n    data-gds-part=\"section-eyebrow\"\n    className={cn(\n      \"inline-block text-xs font-medium uppercase tracking-wider text-muted-foreground\",\n      className,\n    )}\n    {...props}\n  />\n));\nSectionEyebrow.displayName = \"SectionEyebrow\";\n\nconst SectionTitle = React.forwardRef<\n  HTMLHeadingElement,\n  React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n  <h2\n    ref={ref}\n    data-gds-part=\"section-title\"\n    className={cn(\n      \"text-balance text-3xl font-semibold tracking-tight md:text-4xl\",\n      className,\n    )}\n    style={{ fontFamily: \"var(--font-heading, var(--font-sans))\" }}\n    {...props}\n  />\n));\nSectionTitle.displayName = \"SectionTitle\";\n\nconst SectionSubtitle = React.forwardRef<\n  HTMLParagraphElement,\n  React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n  <p\n    ref={ref}\n    data-gds-part=\"section-subtitle\"\n    className={cn(\"text-lg text-muted-foreground md:text-xl\", className)}\n    {...props}\n  />\n));\nSectionSubtitle.displayName = \"SectionSubtitle\";\n\nconst SectionDescription = React.forwardRef<\n  HTMLParagraphElement,\n  React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n  <p\n    ref={ref}\n    data-gds-part=\"section-description\"\n    className={cn(\"leading-relaxed text-muted-foreground\", className)}\n    {...props}\n  />\n));\nSectionDescription.displayName = \"SectionDescription\";\n\nconst SectionActions = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n  <div\n    ref={ref}\n    data-gds-part=\"section-actions\"\n    className={cn(\"flex flex-wrap items-center gap-3\", className)}\n    {...props}\n  />\n));\nSectionActions.displayName = \"SectionActions\";\n\n/** SectionMedia — a SLOT. Holds any media: a single image (MediaSurface),\n *  a Carousel, a VideoPlayer, an embed, or a whole app UI. The section\n *  doesn't care what's inside; the media frames itself. */\nconst SectionMedia = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n  <div\n    ref={ref}\n    data-gds-part=\"section-media\"\n    className={cn(\"w-full\", className)}\n    {...props}\n  />\n));\nSectionMedia.displayName = \"SectionMedia\";\n\nexport {\n  Section,\n  Container,\n  SectionEyebrow,\n  SectionTitle,\n  SectionSubtitle,\n  SectionDescription,\n  SectionActions,\n  SectionMedia,\n  bandVariants as sectionBandVariants,\n  containerVariants,\n};\n","import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"@/lib/utils\";\nimport { Button, type buttonVariants } from \"@/components/ui/button\";\nimport { Section, Container, type ContainerMaxW } from \"@/components/ui/section\";\nimport { SURFACE_CLASS, type Surface } from \"@/lib/surface\";\n\n/** Named colour SCOPES (STUDIO-COLOR.md). A `scope` makes the section a local\n *  colour mode — like light/dark, but scoped to this element and focused on\n *  surfaces. It applies the matching `scope-*` class, which re-points the\n *  surface tokens (--background / --card / --muted / --foreground / --border)\n *  at the named pair, so every descendant re-tones while still using the\n *  ordinary tokens. `inverse` is the dark-band / light-text marketing scope. */\nexport const SECTION_SCOPES = [\n  \"default\",\n  \"inverse\",\n  \"brand\",\n  \"accent\",\n  \"muted\",\n  \"card\",\n] as const;\nexport type SectionScope = (typeof SECTION_SCOPES)[number];\n\nconst sectionBlockVariants = cva(\"relative w-full\", {\n  variants: {\n    padding: {\n      none: \"py-0\",\n      sm: \"py-8 md:py-12\",\n      md: \"py-12 md:py-16\",\n      lg: \"py-16 md:py-24\",\n      xl: \"py-20 md:py-32\",\n    },\n    background: {\n      transparent: \"bg-transparent\",\n      muted: \"bg-muted\",\n      card: \"bg-card border-y\",\n      primary: \"bg-primary text-primary-foreground\",\n      gradient: \"bg-gradient-to-br from-primary/10 via-accent/5 to-background\",\n      // Selected by the `scope` prop: paints with the ordinary semantic tokens,\n      // which the `scope-*` class on the same element has remapped.\n      scoped: \"bg-background text-foreground\",\n    },\n    fullBleed: {\n      true: \"w-full\",\n      false: \"\",\n    },\n  },\n  defaultVariants: {\n    padding: \"lg\",\n    background: \"transparent\",\n    fullBleed: false,\n  },\n});\n\nconst containerVariants = cva(\"mx-auto px-4 md:px-6 lg:px-8\", {\n  variants: {\n    container: {\n      default: \"max-w-7xl\",\n      wide: \"max-w-[1536px]\",\n      narrow: \"max-w-4xl\",\n      full: \"max-w-none\",\n    },\n  },\n  defaultVariants: {\n    container: \"default\",\n  },\n});\n\nconst headerVariants = cva(\"space-y-3 md:space-y-4\", {\n  variants: {\n    alignment: {\n      left: \"text-left\",\n      center: \"text-center mx-auto max-w-3xl\",\n      right: \"text-right ml-auto max-w-3xl\",\n    },\n  },\n  defaultVariants: {\n    alignment: \"left\",\n  },\n});\n\nconst titleVariants = cva(\"font-bold tracking-tight\", {\n  variants: {\n    titleSize: {\n      sm: \"text-2xl md:text-3xl\",\n      md: \"text-3xl md:text-4xl\",\n      lg: \"text-4xl md:text-5xl\",\n      xl: \"text-5xl md:text-6xl lg:text-7xl\",\n    },\n  },\n  defaultVariants: {\n    titleSize: \"lg\",\n  },\n});\n\ntype ButtonVariant = VariantProps<typeof buttonVariants>[\"variant\"];\n\ninterface CTAConfig {\n  text: string;\n  variant?: ButtonVariant;\n  href?: string;\n  onClick?: () => void;\n}\n\nexport interface SectionBlockProps\n  extends React.HTMLAttributes<HTMLElement>,\n    VariantProps<typeof sectionBlockVariants>,\n    VariantProps<typeof containerVariants>,\n    VariantProps<typeof headerVariants>,\n    VariantProps<typeof titleVariants> {\n  /**\n   * What the section surface is *made of*. Orthogonal to `background`\n   * (which picks the tonal direction): `surface` picks the material\n   * applied on top.\n   *\n   * - `solid` (default): the `background` tint is opaque.\n   * - `translucent`: ~82% opacity, no blur — picks up the page underneath.\n   * - `glass`: ~58% opacity + 14px blur + edge highlight. Sections that\n   *   sit over a hero image / generative backdrop and need to read as\n   *   floating chrome.\n   * - `glass-strong`: 42% + 24px blur — for full-page-overlay sections.\n   *\n   * When `surface !== \"solid\"`, the `background` Tailwind classes still\n   * apply but get overlaid with the glass class so the alpha shows\n   * through the tint.\n   */\n  surface?: Surface;\n\n  /** Make the section a named colour scope (a local surface mode): applies the\n   *  `scope-*` class so the whole subtree re-tones. Overrides `background`. */\n  scope?: SectionScope;\n\n  // Header content\n  title?: string;\n  subtitle?: string;\n\n  // CTAs\n  cta1?: string | CTAConfig;\n  cta2?: string | CTAConfig;\n\n  // Visual styling\n  backgroundImage?: string;\n\n  // Content slot\n  children?: React.ReactNode;\n\n  // Accessibility\n  as?: \"section\" | \"div\" | \"article\";\n}\n\nconst SectionBlock = React.forwardRef<HTMLElement, SectionBlockProps>(\n  (\n    {\n      className,\n      padding,\n      background,\n      fullBleed,\n      container,\n      alignment,\n      surface = \"solid\",\n      scope,\n      title,\n      titleSize,\n      subtitle,\n      cta1,\n      cta2,\n      backgroundImage,\n      children,\n      as: Comp = \"section\",\n      ...props\n    },\n    ref\n  ) => {\n    // Helper to normalize CTA config\n    const normalizeCTA = (cta: string | CTAConfig): CTAConfig | null => {\n      if (!cta) return null;\n      if (typeof cta === \"string\") {\n        return { text: cta };\n      }\n      return cta;\n    };\n\n    const cta1Config = normalizeCTA(cta1 as string | CTAConfig);\n    const cta2Config = normalizeCTA(cta2 as string | CTAConfig);\n\n    return (\n      <Comp\n        ref={ref as any}\n        data-gds-part=\"section-block\"\n        data-surface={surface}\n        className={cn(\n          sectionBlockVariants({\n            padding,\n            background: scope ? \"scoped\" : background,\n            fullBleed,\n          }),\n          // `scope-*` is a colour scope (a local mode, like light/dark but\n          // scoped to this element): it remaps --background / --foreground /\n          // --card / --muted / --border for this subtree, so descendants keep\n          // using the ordinary tokens and re-tone automatically.\n          scope && `scope-${scope}`,\n          SURFACE_CLASS[surface],\n          className\n        )}\n        style={\n          backgroundImage\n            ? {\n                backgroundImage: `url(${backgroundImage})`,\n                backgroundSize: \"cover\",\n                backgroundPosition: \"center\",\n              }\n            : undefined\n        }\n        {...props}\n      >\n        <div data-gds-part=\"container\" className={containerVariants({ container })}>\n          {/* Header */}\n          {(title || subtitle) && (\n            <div className={headerVariants({ alignment })}>\n              {title && (\n                <h2\n                  className={titleVariants({ titleSize })}\n                  style={{ fontFamily: \"var(--font-heading, var(--font-sans))\" }}\n                >\n                  {title}\n                </h2>\n              )}\n              {subtitle && (\n                <p\n                  className=\"text-lg md:text-xl text-muted-foreground\"\n                  style={{ fontFamily: \"var(--font-body, var(--font-sans))\" }}\n                >\n                  {subtitle}\n                </p>\n              )}\n            </div>\n          )}\n\n          {/* CTAs */}\n          {(cta1Config || cta2Config) && (\n            <div\n              className={cn(\n                \"flex flex-wrap gap-3 md:gap-4 mt-6 md:mt-8\",\n                alignment === \"center\" && \"justify-center\",\n                alignment === \"right\" && \"justify-end\"\n              )}\n            >\n              {cta1Config && (\n                <Button\n                  variant={cta1Config.variant || \"default\"}\n                  size=\"lg\"\n                  onClick={cta1Config.onClick}\n                  asChild={!!cta1Config.href}\n                >\n                  {cta1Config.href ? (\n                    <a href={cta1Config.href}>{cta1Config.text}</a>\n                  ) : (\n                    cta1Config.text\n                  )}\n                </Button>\n              )}\n              {cta2Config && (\n                <Button\n                  variant={cta2Config.variant || \"outline\"}\n                  size=\"lg\"\n                  onClick={cta2Config.onClick}\n                  asChild={!!cta2Config.href}\n                >\n                  {cta2Config.href ? (\n                    <a href={cta2Config.href}>{cta2Config.text}</a>\n                  ) : (\n                    cta2Config.text\n                  )}\n                </Button>\n              )}\n            </div>\n          )}\n\n          {/* Content Slot */}\n          {children && (\n            <div\n              className={cn(\n                \"mt-8 md:mt-12\",\n                alignment === \"center\" && \"mx-auto\"\n              )}\n            >\n              {children}\n            </div>\n          )}\n        </div>\n      </Comp>\n    );\n  }\n);\n\nSectionBlock.displayName = \"SectionBlock\";\n\nexport { SectionBlock, sectionBlockVariants };\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      iconOnly\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        // Readable hover: a soft accent wash with the day's own\n        // foreground text. The DS ghost variant swaps to a SOLID accent\n        // bg + accent-foreground, which on these tiny cells reads as\n        // low-contrast (\"can't see the number on hover\") — so we\n        // override both here. Selected / range / today states below\n        // still win (they come after and set their own bg + fg).\n        \"hover:bg-accent/40 hover:text-foreground\",\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\"\nimport { SURFACE_CLASS, surfaceBg, type Surface } from \"@/lib/surface\"\n\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n  /**\n   * The whole card is the click target — a wallet tile, a project row,\n   * anything that opens something. Adds the pointer, a hover/focus\n   * treatment, and keyboard focusability, and makes any trailing\n   * `Button` inside show its hover state at the same time, so the card\n   * and its chevron read as ONE affordance rather than two.\n   *\n   * On dark surfaces a drop shadow barely registers, so the hover\n   * treatment leads with a surface lift (one ramp step) plus a brighter\n   * border, and carries the shadow as a secondary cue. See the\n   * `.gds-card[data-interactive]` rules in styles/globals.css.\n   *\n   * Put the click handler on the card. The trailing chevron should then\n   * be a `Button asChild` wrapping a span — visually identical, but not\n   * a nested interactive control inside a clickable region.\n   */\n  interactive?: boolean;\n  /**\n   * What the card surface is *made of*. Composes with `shadow-elevation-*`\n   * (depth) and `gds-aura-*` (state signal) — see PRESENCE.md.\n   *\n   * - `solid` (default): opaque `bg-card`.\n   * - `translucent`: ~82% opacity, no blur. Menu sheets, popovers.\n   * - `glass`: ~58% opacity + 14px blur + edge highlight. Floating panels.\n   * - `glass-strong`: ~42% opacity + 24px blur. Full-page overlays.\n   *\n   * When `surface` is set to anything other than `solid`, the base\n   * `bg-card` is dropped so the glass alpha can pass through.\n   */\n  surface?: Surface;\n}\n\nconst Card = React.forwardRef<HTMLDivElement, CardProps>(\n  ({ className, surface = \"solid\", interactive = false, ...props }, ref) => (\n    <div\n      ref={ref}\n      data-gds-part=\"card\"\n      data-surface={surface}\n      data-interactive={interactive || undefined}\n      tabIndex={interactive ? 0 : undefined}\n      className={cn(\n        \"gds-card rounded-xl border text-card-foreground shadow\",\n        surfaceBg(surface, \"bg-card\"),\n        SURFACE_CLASS[surface],\n        interactive &&\n          \"cursor-pointer transition-[background-color,border-color,box-shadow,transform] outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n        className\n      )}\n      {...props}\n    />\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 { CheckIcon } 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    data-slot=\"checkbox\"\n    className={cn(\n      // shadcn (radix) structure: neutral `border-input` at rest, the\n      // brand `border-primary` + fill only on checked, the ring-[3px]\n      // focus model, shadow-xs, dark fill and aria-invalid states.\n      //\n      // Grade trait kept on purpose: a fixed 3px radius so the checkbox\n      // always reads as a rounded square — even under \"round\"/\"pill\"\n      // themes where a token-derived radius would otherwise turn it\n      // circular (a radio-button look). Override via className if you\n      // really want it circular.\n      \"gds-checkbox peer size-4 shrink-0 rounded-[3px] border border-input shadow-xs outline-none transition-shadow focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:bg-input/30 dark:aria-invalid:ring-destructive/40 dark:data-[state=checked]:bg-primary\",\n      className\n    )}\n    {...props}\n  >\n    <CheckboxPrimitive.Indicator\n      data-slot=\"checkbox-indicator\"\n      className={cn(\"grid place-content-center text-current transition-none\")}\n    >\n      <CheckIcon className=\"size-3.5\" />\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 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  \"font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n  {\n    variants: {\n      // Mirrors Input/Select/Textarea so a field + its label scale\n      // together. `xs` is the dense tool-panel label (the inspector).\n      size: {\n        default: \"text-sm\",\n        sm: \"text-sm\",\n        xs: \"text-xs\",\n        // 2xs (11px) — dense tool-panel labels (the Studio inspector).\n        \"2xs\": \"text-2xs\",\n      },\n    },\n    defaultVariants: { size: \"default\" },\n  }\n)\n\nconst Label = React.forwardRef<\n  React.ElementRef<typeof LabelPrimitive.Root>,\n  React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &\n    VariantProps<typeof labelVariants>\n>(({ className, size, ...props }, ref) => (\n  <LabelPrimitive.Root\n    ref={ref}\n    className={cn(labelVariants({ size }), className)}\n    {...props}\n  />\n))\nLabel.displayName = LabelPrimitive.Root.displayName\n\nexport { Label }\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 { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\nimport { Label } from \"./label\";\nimport { Separator } from \"./separator\";\n\n/**\n * Field — a 1:1 port of shadcn's Field family (same components, data-slots,\n * classes, and orientation variants) so a Figma frame named with these slots\n * maps straight onto the code.\n *\n * Grade addition (invisible): Field auto-wires accessibility — it generates an\n * id, hands it to the control, points Field.Label's `htmlFor` at it, and links\n * Field.Description via `aria-describedby`. Children still render in DOM order\n * exactly as shadcn, so the structure is identical; pass an explicit `id` /\n * `htmlFor` to opt out.\n *\n * Anatomy (matches https://ui.shadcn.com/docs/components/radix/field):\n *   Field.Set → Field.Legend + Field.Group\n *   Field.Group → many Field\n *   Field (orientation: vertical | horizontal | responsive)\n *     → Field.Label / Field.Title, control, Field.Content, Field.Description,\n *       Field.Error, Field.Separator\n *   A selectable card = Field.Label wrapping a Field.\n *\n * Sizing lives on the leaf components (Label / Description / Input / Switch),\n * which keep Grade's dense `2xs` sizes on top of shadcn parity.\n */\n\nconst FieldContext = React.createContext<{\n  controlId?: string;\n  descriptionId?: string;\n} | null>(null);\n\nfunction FieldSet({ className, ...props }: React.ComponentProps<\"fieldset\">) {\n  return (\n    <fieldset\n      data-slot=\"field-set\"\n      className={cn(\n        \"flex flex-col gap-6\",\n        \"has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3\",\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction FieldLegend({\n  className,\n  variant = \"legend\",\n  ...props\n}: React.ComponentProps<\"legend\"> & { variant?: \"legend\" | \"label\" }) {\n  return (\n    <legend\n      data-slot=\"field-legend\"\n      data-variant={variant}\n      className={cn(\n        \"mb-3 font-medium\",\n        \"data-[variant=legend]:text-base\",\n        \"data-[variant=label]:text-sm\",\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction FieldGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"field-group\"\n      className={cn(\n        \"group/field-group @container/field-group flex w-full flex-col gap-7 data-[slot=checkbox-group]:gap-3 [&>[data-slot=field-group]]:gap-4\",\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nconst fieldVariants = cva(\n  // Gap is per-orientation: vertical tightened to gap-2 (8 Aug 2026,\n  // label-to-control rhythm read too loose on real forms); horizontal\n  // keeps the roomier gap-3 for control-beside-label rows.\n  \"group/field flex w-full data-[invalid=true]:text-destructive\",\n  {\n    variants: {\n      orientation: {\n        vertical: [\"flex-col gap-2 [&>*]:w-full [&>.sr-only]:w-auto\"],\n        horizontal: [\n          \"flex-row items-center gap-3\",\n          \"[&>[data-slot=field-label]]:flex-auto\",\n          \"has-[>[data-slot=field-content]]:items-start has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px\",\n        ],\n        responsive: [\n          \"flex-col gap-2 [&>*]:w-full [&>.sr-only]:w-auto @md/field-group:flex-row @md/field-group:items-center @md/field-group:gap-3 @md/field-group:[&>*]:w-auto\",\n          \"@md/field-group:[&>[data-slot=field-label]]:flex-auto\",\n          \"@md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px\",\n        ],\n      },\n    },\n    defaultVariants: {\n      orientation: \"vertical\",\n    },\n  }\n);\n\n// The field-family components — used to tell a \"control\" child apart from the\n// text/structure slots when auto-wiring.\nconst FIELD_FAMILY = new Set<React.ElementType>();\n\nexport interface FieldProps\n  extends React.ComponentProps<\"div\">,\n    VariantProps<typeof fieldVariants> {\n  /** @deprecated use `orientation`. Maps option/setting → horizontal. */\n  layout?: \"option\" | \"setting\";\n}\n\nfunction Field({\n  className,\n  orientation,\n  layout,\n  children,\n  ...props\n}: FieldProps) {\n  const autoId = React.useId();\n  const resolved: NonNullable<FieldProps[\"orientation\"]> =\n    orientation ?? (layout ? \"horizontal\" : \"vertical\");\n\n  // Auto-wire: find the control child + whether a description is present,\n  // without reordering anything (DOM order stays identical to shadcn).\n  const top = React.Children.toArray(children);\n  let controlIndex = -1;\n  let hasDescription = false;\n\n  top.forEach((child, i) => {\n    if (!React.isValidElement(child)) return;\n    const type = child.type as React.ElementType;\n    if (type === FieldDescription) {\n      hasDescription = true;\n    } else if (type === FieldContent) {\n      React.Children.forEach(\n        (child.props as { children?: React.ReactNode }).children,\n        (gc) => {\n          if (React.isValidElement(gc) && gc.type === FieldDescription)\n            hasDescription = true;\n        }\n      );\n    } else if (!FIELD_FAMILY.has(type) && controlIndex === -1) {\n      controlIndex = i;\n    }\n  });\n\n  const controlEl =\n    controlIndex >= 0\n      ? (top[controlIndex] as React.ReactElement<Record<string, unknown>>)\n      : null;\n  const controlId =\n    (controlEl?.props.id as string | undefined) ??\n    (controlEl ? `${autoId}-control` : undefined);\n  const descriptionId = hasDescription ? `${autoId}-description` : undefined;\n  const describedBy = controlEl\n    ? [controlEl.props[\"aria-describedby\"] as string | undefined, descriptionId]\n        .filter(Boolean)\n        .join(\" \") || undefined\n    : undefined;\n\n  const wired =\n    controlIndex >= 0 && controlEl\n      ? top.map((child, i) =>\n          i === controlIndex\n            ? React.cloneElement(controlEl, {\n                id: controlId,\n                \"aria-describedby\": describedBy,\n              } as Partial<Record<string, unknown>> & React.Attributes)\n            : child\n        )\n      : children;\n\n  return (\n    <FieldContext.Provider value={{ controlId, descriptionId }}>\n      <div\n        role=\"group\"\n        data-slot=\"field\"\n        data-orientation={resolved}\n        className={cn(fieldVariants({ orientation: resolved }), className)}\n        {...props}\n      >\n        {wired}\n      </div>\n    </FieldContext.Provider>\n  );\n}\n\n/**\n * Field.Trailing — Grade extension (not in shadcn): a slot pinned to the end\n * of the row for a Badge / price / kbd hint.\n */\nfunction FieldTrailing({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"field-trailing\"\n      className={cn(\"flex shrink-0 items-center gap-2\", className)}\n      {...props}\n    />\n  );\n}\n\nfunction FieldContent({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"field-content\"\n      className={cn(\n        \"group/field-content flex flex-1 flex-col gap-1.5 leading-snug\",\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction FieldLabel({\n  className,\n  htmlFor,\n  ...props\n}: React.ComponentProps<typeof Label>) {\n  const ctx = React.useContext(FieldContext);\n  return (\n    <Label\n      data-slot=\"field-label\"\n      htmlFor={htmlFor ?? ctx?.controlId}\n      className={cn(\n        \"group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-50\",\n        \"has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col has-[>[data-slot=field]]:rounded-md has-[>[data-slot=field]]:border [&>*]:data-[slot=field]:p-4\",\n        \"has-data-[state=checked]:border-primary has-data-[state=checked]:bg-primary/5 dark:has-data-[state=checked]:bg-primary/10\",\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction FieldTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"field-label\"\n      className={cn(\n        \"flex w-fit items-center gap-2 text-sm leading-snug font-medium group-data-[disabled=true]/field:opacity-50\",\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction FieldDescription({\n  className,\n  id,\n  ...props\n}: React.ComponentProps<\"p\">) {\n  const ctx = React.useContext(FieldContext);\n  return (\n    <p\n      data-slot=\"field-description\"\n      id={id ?? ctx?.descriptionId}\n      className={cn(\n        \"text-sm leading-normal font-normal text-muted-foreground group-has-[[data-orientation=horizontal]]/field:text-balance\",\n        \"last:mt-0 nth-last-2:-mt-1 [[data-variant=legend]+&]:-mt-1.5\",\n        \"[&>a:hover]:text-primary [&>a]:underline [&>a]:underline-offset-4\",\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction FieldSeparator({\n  children,\n  className,\n  ...props\n}: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"field-separator\"\n      data-content={!!children}\n      className={cn(\n        \"relative -my-2 h-5 text-sm group-data-[variant=outline]/field-group:-mb-2\",\n        className\n      )}\n      {...props}\n    >\n      <Separator className=\"absolute inset-0 top-1/2\" />\n      {children && (\n        <span\n          className=\"bg-background text-muted-foreground relative mx-auto block w-fit px-2\"\n          data-slot=\"field-separator-content\"\n        >\n          {children}\n        </span>\n      )}\n    </div>\n  );\n}\n\nfunction FieldError({\n  className,\n  children,\n  errors,\n  ...props\n}: React.ComponentProps<\"div\"> & {\n  errors?: Array<{ message?: string } | undefined>;\n}) {\n  const content = React.useMemo(() => {\n    if (children) return children;\n    if (!errors?.length) return null;\n\n    const uniqueErrors = [\n      ...new Map(errors.map((error) => [error?.message, error])).values(),\n    ];\n\n    if (uniqueErrors.length === 1) return uniqueErrors[0]?.message;\n\n    return (\n      <ul className=\"ml-4 flex list-disc flex-col gap-1\">\n        {uniqueErrors.map(\n          (error, index) =>\n            error?.message && <li key={index}>{error.message}</li>\n        )}\n      </ul>\n    );\n  }, [children, errors]);\n\n  if (!content) return null;\n\n  return (\n    <div\n      role=\"alert\"\n      data-slot=\"field-error\"\n      className={cn(\"text-destructive text-sm font-normal\", className)}\n      {...props}\n    >\n      {content}\n    </div>\n  );\n}\n\n// Register the family now that all components are declared.\n[\n  FieldLabel,\n  FieldTitle,\n  FieldDescription,\n  FieldContent,\n  FieldTrailing,\n  FieldError,\n  FieldSeparator,\n  FieldLegend,\n  FieldSet,\n  FieldGroup,\n].forEach((c) => FIELD_FAMILY.add(c));\n\n// Compound dot-access (Field.Label, Field.Content, …) alongside named exports.\nconst FieldRoot = Object.assign(Field, {\n  Label: FieldLabel,\n  Title: FieldTitle,\n  Description: FieldDescription,\n  Content: FieldContent,\n  Trailing: FieldTrailing,\n  Group: FieldGroup,\n  Set: FieldSet,\n  Legend: FieldLegend,\n  Separator: FieldSeparator,\n  Error: FieldError,\n});\n\nexport {\n  FieldRoot as Field,\n  FieldLabel,\n  FieldTitle,\n  FieldDescription,\n  FieldContent,\n  FieldTrailing,\n  FieldGroup,\n  FieldSet,\n  FieldLegend,\n  FieldSeparator,\n  FieldError,\n};\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\n/**\n * PropertyList — the read-only \"one record, stacked\" display primitive.\n *\n * A property list is a table row transposed: where a Table runs the schema\n * horizontally (columns) across many records, a PropertyList takes ONE\n * record and stacks its fields vertically as label / value pairs. Reach for\n * it for detail panels, inspectors, \"about this item\" cards, order summaries\n * — anywhere you're showing the properties of a single thing.\n *\n *   <PropertyList>\n *     <PropertyList.Row label=\"Status\" icon={<Activity />}>\n *       <Badge variant=\"warning-soft\">Low</Badge>\n *     </PropertyList.Row>\n *     <PropertyList.Row label=\"Owner\">\n *       <Avatar className=\"h-5 w-5\"><AvatarFallback>EO</AvatarFallback></Avatar>\n *     </PropertyList.Row>\n *   </PropertyList>\n *\n * The value side is deliberately polymorphic — it's a slot (`children`, or\n * the `value` prop), not a string. A row can hold plain text, a date, a\n * single Badge, a tag group, an avatar stack, a link, anything. That's the\n * whole point: the same value renderers that fill a Table cell drop straight\n * into a PropertyList row, so the two surfaces never drift.\n *\n * Semantics: renders a real `<dl>` with `<dt>` / `<dd>` pairs (each pair\n * wrapped in a `<div>`, which the HTML spec allows), so it's announced as a\n * description list by assistive tech for free.\n *\n * Layout + density are token-driven (`--gds-property-list-*`) so a narrow\n * inspector and a wide settings page can retune the label column and rhythm\n * without prop-drilling. `layout=\"stack\"` drops the label above the value\n * for tight columns.\n *\n * This is a DISPLAY primitive. For an editable field (label + control), use\n * `Field`; a detail panel that flips between read and edit typically swaps a\n * PropertyList for a stack of Fields.\n */\n\ntype PropertyListLayout = \"row\" | \"stack\";\ntype PropertyListDensity = \"compact\" | \"default\" | \"relaxed\";\ntype PropertyListAlign = \"start\" | \"center\";\n\ninterface PropertyListContextValue {\n  layout: PropertyListLayout;\n  align: PropertyListAlign;\n  divider: boolean;\n}\n\nconst PropertyListContext = React.createContext<PropertyListContextValue>({\n  layout: \"row\",\n  align: \"center\",\n  divider: false,\n});\n\nconst ROW_GAP: Record<PropertyListDensity, string> = {\n  compact: \"var(--gds-property-list-row-gap-compact, 0.375rem)\",\n  default: \"var(--gds-property-list-row-gap, 0.625rem)\",\n  relaxed: \"var(--gds-property-list-row-gap-relaxed, 1rem)\",\n};\n\nexport interface PropertyListProps\n  extends React.HTMLAttributes<HTMLDListElement> {\n  /** `row` (default): label column beside value. `stack`: label above value (narrow panels). */\n  layout?: PropertyListLayout;\n  /** Row rhythm. `compact` for dense inspectors, `relaxed` for airy settings pages. */\n  density?: PropertyListDensity;\n  /** Default vertical alignment of label vs value. `center` for single-line values, `start` when values wrap (tag groups, multi-line). */\n  align?: PropertyListAlign;\n  /** Hairline rule between rows. */\n  divider?: boolean;\n  /** Override the label column width (any CSS length). Sets `--gds-property-list-label-width` for all rows. */\n  labelWidth?: string;\n}\n\nconst PropertyListRoot = React.forwardRef<HTMLDListElement, PropertyListProps>(\n  (\n    {\n      layout = \"row\",\n      density = \"default\",\n      align = \"center\",\n      divider = false,\n      labelWidth,\n      className,\n      style,\n      children,\n      ...props\n    },\n    ref\n  ) => {\n    return (\n      <PropertyListContext.Provider value={{ layout, align, divider }}>\n        <dl\n          ref={ref}\n          data-gds-part=\"property-list\"\n          data-layout={layout}\n          data-density={density}\n          className={cn(\"flex min-w-0 flex-col\", className)}\n          style={{\n            rowGap: ROW_GAP[density],\n            ...(labelWidth\n              ? ({\n                  [\"--gds-property-list-label-width\" as string]: labelWidth,\n                } as React.CSSProperties)\n              : {}),\n            ...style,\n          }}\n          {...props}\n        >\n          {children}\n        </dl>\n      </PropertyListContext.Provider>\n    );\n  }\n);\nPropertyListRoot.displayName = \"PropertyList\";\n\nexport interface PropertyListRowProps\n  extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n  /** The property name (the `<dt>`). */\n  label: React.ReactNode;\n  /** Optional leading glyph, rendered muted at `--gds-property-list-icon-size`. */\n  icon?: React.ReactNode;\n  /** The value. Provide via `value` or as `children` — accepts any node (text, Badge, tag group, Avatar stack, link…). */\n  value?: React.ReactNode;\n  /** Per-row override of the list's vertical alignment. */\n  align?: PropertyListAlign;\n  children?: React.ReactNode;\n}\n\nconst PropertyListRow = React.forwardRef<HTMLDivElement, PropertyListRowProps>(\n  (\n    { label, icon, value, align: alignProp, className, children, ...props },\n    ref\n  ) => {\n    const { layout, align: ctxAlign, divider } = React.useContext(\n      PropertyListContext\n    );\n    const align = alignProp ?? ctxAlign;\n    const content = value ?? children;\n\n    return (\n      <div\n        ref={ref}\n        data-gds-part=\"property\"\n        className={cn(\n          \"grid\",\n          divider &&\n            \"border-t border-[color:var(--gds-property-list-divider-color,oklch(var(--border)))] pt-[var(--gds-property-list-row-gap,0.625rem)] first:border-t-0 first:pt-0\",\n          className\n        )}\n        style={{\n          gridTemplateColumns:\n            layout === \"stack\"\n              ? \"minmax(0, 1fr)\"\n              : \"var(--gds-property-list-label-width, 8.5rem) minmax(0, 1fr)\",\n          columnGap: \"var(--gds-property-list-col-gap, 1rem)\",\n          rowGap: layout === \"stack\" ? \"0.25rem\" : undefined,\n          alignItems: align === \"start\" ? \"start\" : \"center\",\n        }}\n        {...props}\n      >\n        <dt\n          data-gds-part=\"property-label\"\n          className={cn(\n            \"flex min-w-0 items-center gap-1.5 text-sm text-[color:var(--gds-property-list-label-color,oklch(var(--muted-foreground)))]\",\n            align === \"start\" && \"pt-px\"\n          )}\n        >\n          {icon ? (\n            <span\n              data-gds-part=\"property-icon\"\n              aria-hidden\n              className=\"flex shrink-0 items-center justify-center text-current [&_svg]:h-[var(--gds-property-list-icon-size,0.875rem)] [&_svg]:w-[var(--gds-property-list-icon-size,0.875rem)]\"\n            >\n              {icon}\n            </span>\n          ) : null}\n          <span className=\"truncate\">{label}</span>\n        </dt>\n        <dd\n          data-gds-part=\"property-value\"\n          className=\"m-0 min-w-0 text-sm text-foreground\"\n        >\n          {content}\n        </dd>\n      </div>\n    );\n  }\n);\nPropertyListRow.displayName = \"PropertyList.Row\";\n\nconst PropertyList = Object.assign(PropertyListRoot, {\n  Row: PropertyListRow,\n});\n\nexport { PropertyList, PropertyListRow };\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as RadioGroupPrimitive from \"@radix-ui/react-radio-group\";\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\";\nimport * as SwitchPrimitives from \"@radix-ui/react-switch\";\nimport { Check } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\n\n/**\n * Selection cards — RadioCard / CheckboxCard / SwitchCard.\n *\n * The whole card IS the control. RadioCard renders as a\n * `RadioGroupPrimitive.Item`, CheckboxCard as a `CheckboxPrimitive.Root`,\n * SwitchCard as a `SwitchPrimitives.Root` — so focus, hover, and the\n * checked state all live on the parent surface, and the entire card is the\n * hit target. The small glyph (dot / check / switch) is just a visual\n * indicator; it differs by type on purpose, because that's how someone\n * reads single-select vs multi-select vs toggle at a glance.\n *\n * All three share ONE surface (`.gds-selection-card`) so they look identical\n * sitting together. Every visual is token-driven (`--gds-selection-card-*`\n * with semantic fallbacks), so a project can re-skin the cards through the\n * per-project override layer without forking the component.\n *\n *   <RadioGroup defaultValue=\"standard\" className=\"grid gap-3\">\n *     <RadioCard value=\"standard\" label=\"Standard\" description=\"4–10 business days\" />\n *     <RadioCard value=\"fast\"     label=\"Fast\"     description=\"2–5 business days\" />\n *     <RadioCard value=\"next-day\" label=\"Next day\" description=\"1 business day\" />\n *   </RadioGroup>\n *\n * IMPORTANT — interactive content. Because the card is itself a control\n * (a `role=radio`/`checkbox`/`switch` button), you must NOT nest other\n * interactive elements (Slider, Input, Button, links) inside it. Put only\n * static content here (text, images, badges). If a card needs its own\n * controls, use a plain `Card` containing a `Field` row + the control as\n * siblings instead.\n */\n\ntype IndicatorPosition = \"leading\" | \"trailing\";\n\ninterface SelectionCardOwnProps {\n  /** Title line. Omit and pass `children` for fully custom content. */\n  label?: React.ReactNode;\n  /** Secondary line under the label. */\n  description?: React.ReactNode;\n  /** Optional slot rendered between the content and the indicator\n   *  (a Badge, price, kbd hint, …). */\n  aside?: React.ReactNode;\n  /** Hide the dot/check/switch glyph — selection is then conveyed purely by\n   *  the card's selected border + background. Semantics stay intact. */\n  hideIndicator?: boolean;\n  /** Which side the indicator sits on. Default `trailing`. */\n  indicatorPosition?: IndicatorPosition;\n}\n\n/** Shared body: arbitrary children win; otherwise a label/description block.\n *  Lays out [content][aside][indicator], or indicator-first when leading. */\nfunction SelectionCardBody({\n  label,\n  description,\n  aside,\n  hideIndicator,\n  indicatorPosition = \"trailing\",\n  titleId,\n  descriptionId,\n  indicator,\n  children,\n}: SelectionCardOwnProps & {\n  titleId?: string;\n  descriptionId?: string;\n  indicator: React.ReactNode;\n  children?: React.ReactNode;\n}) {\n  const content =\n    children != null ? (\n      <div className=\"gds-selection-card__slot\">{children}</div>\n    ) : (\n      <div className=\"gds-selection-card__content\">\n        {label != null && (\n          <span id={titleId} className=\"gds-selection-card__title\">\n            {label}\n          </span>\n        )}\n        {description != null && (\n          <span id={descriptionId} className=\"gds-selection-card__desc\">\n            {description}\n          </span>\n        )}\n      </div>\n    );\n\n  const ind = hideIndicator ? null : indicator;\n\n  return indicatorPosition === \"leading\" ? (\n    <>\n      {ind}\n      {content}\n      {aside}\n    </>\n  ) : (\n    <>\n      {content}\n      {aside}\n      {ind}\n    </>\n  );\n}\n\nconst radioIndicator = (\n  <span className=\"gds-selection-indicator gds-selection-indicator--radio\" aria-hidden>\n    <RadioGroupPrimitive.Indicator className=\"gds-selection-indicator__dot\" />\n  </span>\n);\n\nconst checkboxIndicator = (\n  <span\n    className=\"gds-selection-indicator gds-selection-indicator--checkbox\"\n    aria-hidden\n  >\n    <CheckboxPrimitive.Indicator className=\"gds-selection-indicator__check\">\n      <Check className=\"h-3.5 w-3.5\" strokeWidth={3} />\n    </CheckboxPrimitive.Indicator>\n  </span>\n);\n\nconst switchIndicator = (\n  <span\n    className=\"gds-selection-indicator gds-selection-indicator--switch\"\n    aria-hidden\n  >\n    <SwitchPrimitives.Thumb className=\"gds-selection-indicator__thumb\" />\n  </span>\n);\n\n/* ── RadioCard ─────────────────────────────────────────────────────────── */\n\nexport interface RadioCardProps\n  extends Omit<\n      React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item>,\n      \"children\"\n    >,\n    SelectionCardOwnProps {\n  children?: React.ReactNode;\n}\n\nconst RadioCard = React.forwardRef<\n  React.ComponentRef<typeof RadioGroupPrimitive.Item>,\n  RadioCardProps\n>(\n  (\n    {\n      className,\n      label,\n      description,\n      aside,\n      hideIndicator,\n      indicatorPosition = \"trailing\",\n      children,\n      ...props\n    },\n    ref\n  ) => {\n    const autoId = React.useId();\n    const titleId = label != null ? `${autoId}-t` : undefined;\n    const descriptionId = description != null ? `${autoId}-d` : undefined;\n    return (\n      <RadioGroupPrimitive.Item\n        ref={ref}\n        data-gds-part=\"radio-card\"\n        data-indicator={indicatorPosition}\n        aria-labelledby={titleId}\n        aria-describedby={descriptionId}\n        className={cn(\"gds-selection-card\", className)}\n        {...props}\n      >\n        <SelectionCardBody\n          label={label}\n          description={description}\n          aside={aside}\n          hideIndicator={hideIndicator}\n          indicatorPosition={indicatorPosition}\n          titleId={titleId}\n          descriptionId={descriptionId}\n          indicator={radioIndicator}\n        >\n          {children}\n        </SelectionCardBody>\n      </RadioGroupPrimitive.Item>\n    );\n  }\n);\nRadioCard.displayName = \"RadioCard\";\n\n/* ── CheckboxCard ──────────────────────────────────────────────────────── */\n\nexport interface CheckboxCardProps\n  extends Omit<\n      React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>,\n      \"children\"\n    >,\n    SelectionCardOwnProps {\n  children?: React.ReactNode;\n}\n\nconst CheckboxCard = React.forwardRef<\n  React.ComponentRef<typeof CheckboxPrimitive.Root>,\n  CheckboxCardProps\n>(\n  (\n    {\n      className,\n      label,\n      description,\n      aside,\n      hideIndicator,\n      indicatorPosition = \"trailing\",\n      children,\n      ...props\n    },\n    ref\n  ) => {\n    const autoId = React.useId();\n    const titleId = label != null ? `${autoId}-t` : undefined;\n    const descriptionId = description != null ? `${autoId}-d` : undefined;\n    return (\n      <CheckboxPrimitive.Root\n        ref={ref}\n        data-gds-part=\"checkbox-card\"\n        data-indicator={indicatorPosition}\n        aria-labelledby={titleId}\n        aria-describedby={descriptionId}\n        className={cn(\"gds-selection-card\", className)}\n        {...props}\n      >\n        <SelectionCardBody\n          label={label}\n          description={description}\n          aside={aside}\n          hideIndicator={hideIndicator}\n          indicatorPosition={indicatorPosition}\n          titleId={titleId}\n          descriptionId={descriptionId}\n          indicator={checkboxIndicator}\n        >\n          {children}\n        </SelectionCardBody>\n      </CheckboxPrimitive.Root>\n    );\n  }\n);\nCheckboxCard.displayName = \"CheckboxCard\";\n\n/* ── SwitchCard ────────────────────────────────────────────────────────── */\n\nexport interface SwitchCardProps\n  extends Omit<\n      React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>,\n      \"children\"\n    >,\n    SelectionCardOwnProps {\n  children?: React.ReactNode;\n}\n\nconst SwitchCard = React.forwardRef<\n  React.ComponentRef<typeof SwitchPrimitives.Root>,\n  SwitchCardProps\n>(\n  (\n    {\n      className,\n      label,\n      description,\n      aside,\n      hideIndicator,\n      indicatorPosition = \"trailing\",\n      children,\n      ...props\n    },\n    ref\n  ) => {\n    const autoId = React.useId();\n    const titleId = label != null ? `${autoId}-t` : undefined;\n    const descriptionId = description != null ? `${autoId}-d` : undefined;\n    return (\n      <SwitchPrimitives.Root\n        ref={ref}\n        data-gds-part=\"switch-card\"\n        data-indicator={indicatorPosition}\n        aria-labelledby={titleId}\n        aria-describedby={descriptionId}\n        className={cn(\"gds-selection-card\", className)}\n        {...props}\n      >\n        <SelectionCardBody\n          label={label}\n          description={description}\n          aside={aside}\n          hideIndicator={hideIndicator}\n          indicatorPosition={indicatorPosition}\n          titleId={titleId}\n          descriptionId={descriptionId}\n          indicator={switchIndicator}\n        >\n          {children}\n        </SelectionCardBody>\n      </SwitchPrimitives.Root>\n    );\n  }\n);\nSwitchCard.displayName = \"SwitchCard\";\n\nexport { RadioCard, CheckboxCard, SwitchCard };\n","/**\n * Shared types + presets for scripted component demos.\n *\n * Lives at the bottom of the demo primitive stack so the hook, the\n * cursor, and any component that opts in (`<Code>`, `<Composer>`,\n * `<DemoStage>`) all read from one definition of \"what slow / normal /\n * fast feels like\" and one definition of \"when do we start playing\".\n *\n * If you ever want to retune the cadence of every demo on the marketing\n * site at once, this is the file to edit.\n */\n\n/**\n * Animation feel. Maps onto a triple of timing values so authors can\n * pick a vibe (slow / normal / fast) instead of hand-tuning ms.\n * Components that need finer control can still override the resolved\n * values per-instance.\n */\nexport type DemoSpeed = \"slow\" | \"normal\" | \"fast\";\n\n/**\n * What kicks the demo off:\n *   - `mount`   plays immediately on first paint\n *   - `inView`  waits for the container to cross the viewport threshold\n *   - `manual`  driven by the `play` prop or imperative ref\n */\nexport type DemoTrigger = \"mount\" | \"inView\" | \"manual\";\n\n/**\n * Speed presets shared across every scripted-demo surface. Three\n * unambiguously distinct feels: `slow` is \"I am being shown\", `normal`\n * is \"I am being told\", `fast` is \"I am being briefed\".\n *\n *   - `tokenStagger`  per-character cadence for typing-style steps\n *   - `lineStagger`   per-line cadence for reveal-style demos\n *   - `preDelay`      pause after the trigger fires before the first tick\n *   - `fadeMs`        default enter-transition duration for revealed parts\n */\nexport const DEMO_SPEED_PRESETS: Record<\n  DemoSpeed,\n  {\n    tokenStagger: number;\n    lineStagger: number;\n    preDelay: number;\n    fadeMs: number;\n  }\n> = {\n  slow: { tokenStagger: 70, lineStagger: 200, preDelay: 500, fadeMs: 480 },\n  normal: { tokenStagger: 22, lineStagger: 55, preDelay: 200, fadeMs: 280 },\n  fast: { tokenStagger: 8, lineStagger: 18, preDelay: 60, fadeMs: 160 },\n};\n\n/**\n * `inView` threshold + `once` semantics applied by the hook. Marketing\n * surfaces want the reveal to fire once, after enough of the block is\n * visible that the user actually sees it animate.\n */\nexport const DEMO_IN_VIEW_AMOUNT = 0.55;\n","/**\n * Cancellable sleep + type helpers for scripted demos.\n *\n * The runner threads an `AbortSignal` through every step so a `stop()`\n * call (or an unmount) can short-circuit long waits and typing loops\n * cleanly. Consumers write `await sleep(ms, signal)` inside their\n * interpret callback and the cancellation is automatic.\n *\n * Note: this throws DOMException(\"Aborted\", \"AbortError\") on cancel.\n * The runner's outer try/catch swallows that specific error and exits;\n * any other rejection bubbles up so authoring bugs aren't silenced.\n */\n\n/**\n * Promisified setTimeout that resolves after `ms` milliseconds, or\n * rejects with an AbortError if the signal fires first. Resolves\n * immediately if `ms <= 0`.\n */\nexport function sleep(ms: number, signal?: AbortSignal): Promise<void> {\n  if (ms <= 0) return Promise.resolve();\n  return new Promise((resolve, reject) => {\n    if (signal?.aborted) {\n      reject(new DOMException(\"Aborted\", \"AbortError\"));\n      return;\n    }\n    const timer = window.setTimeout(() => {\n      signal?.removeEventListener(\"abort\", onAbort);\n      resolve();\n    }, ms);\n    const onAbort = () => {\n      window.clearTimeout(timer);\n      reject(new DOMException(\"Aborted\", \"AbortError\"));\n    };\n    signal?.addEventListener(\"abort\", onAbort, { once: true });\n  });\n}\n\n/**\n * Type `text` one character at a time, calling `onTick(partial)` for\n * each prefix. Stagger between ticks defaults to 22ms (the `normal`\n * speed preset's `tokenStagger`).\n *\n * `onTick` receives the cumulative typed text (not the new char), so\n * consumers can do `setBuffer(prefix + partial)` without tracking state\n * themselves. The final call fires with the complete text — there's no\n * separate \"done\" callback.\n */\nexport async function typeText(\n  text: string,\n  onTick: (partial: string) => void,\n  stagger = 22,\n  signal?: AbortSignal,\n): Promise<void> {\n  // Non-positive stagger (the reduced-motion preset, or any caller that\n  // wants no typing animation): emit the whole string in a single tick so\n  // the surface lands on its final state without per-character motion, or\n  // the flicker a 0ms loop would produce.\n  if (stagger <= 0) {\n    onTick(text);\n    return;\n  }\n  for (let i = 1; i <= text.length; i++) {\n    onTick(text.slice(0, i));\n    if (i < text.length) await sleep(stagger, signal);\n  }\n}\n\n/**\n * Helper for treating an unknown error as the runner's abort sentinel.\n * Returns true if the value is the AbortError thrown by `sleep` / a\n * downstream `fetch` / etc. Used by the runner's catch block to\n * distinguish cancellation (silent exit) from real bugs (rethrow).\n */\nexport function isAbortError(err: unknown): boolean {\n  return (\n    err instanceof DOMException && err.name === \"AbortError\"\n  );\n}\n","/**\n * lib/motion — the global motion control for gradeui.\n *\n * One choke point for \"should this animate?\". Every animated component\n * (ThreeScene, RivePlayer, VideoPlayer, aura surfaces) asks\n * `useReducedMotion()`, so flipping motion off in one place stills them all.\n *\n * Two independent inputs, ORed together (reduce-only by design — the toggle\n * can ADD restriction but never override a user's OS preference to force\n * motion ON):\n *\n *   1. the OS `prefers-reduced-motion: reduce` media query, and\n *   2. a `data-motion=\"off\"` attribute on the document root (`<html>`),\n *      the manual toggle.\n *\n * The attribute is the same mechanism the renderer's `data-fidelity` flag\n * uses: stamp it on `<html>` and CSS + components react. Inside Studio's\n * Fast Frame / embed / share iframes it is driven over postMessage\n * (`grade:set-motion`), so the toggle reaches into the sandbox where the\n * ThreeScene surfaces actually run. A matching `[data-motion=\"off\"]` CSS\n * reset in `styles/globals.css` covers pure-CSS animation/transition.\n *\n * Sibling to lib/demo (the scripted-reveal spine).\n */\n\nimport * as React from \"react\";\n\n/** The attribute stamped on `<html>` to force motion off. */\nexport const MOTION_ATTR = \"data-motion\";\nconst MOTION_OFF = \"off\";\n\nconst REDUCE_QUERY = \"(prefers-reduced-motion: reduce)\";\n\n/** Read the current effective reduced-motion state (OS query OR the global\n *  toggle). SSR-safe: returns `false` when there's no `window`. */\nfunction readReduced(): boolean {\n  if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n    return false;\n  }\n  const osReduced = window.matchMedia(REDUCE_QUERY).matches;\n  const toggledOff =\n    document.documentElement.getAttribute(MOTION_ATTR) === MOTION_OFF;\n  return osReduced || toggledOff;\n}\n\n/**\n * Returns `true` when motion should be suppressed — either the OS reports\n * `prefers-reduced-motion: reduce`, or the global `data-motion=\"off\"` toggle\n * is set on `<html>`. Stays live: re-reads on media-query change and on the\n * attribute mutating.\n *\n * SSR-safe — defaults to `false` (motion allowed) on the server and\n * rehydrates in an effect, so it never causes a hydration mismatch.\n */\nexport function useReducedMotion(): boolean {\n  const [reduced, setReduced] = React.useState(false);\n\n  React.useEffect(() => {\n    const update = () => setReduced(readReduced());\n    update();\n\n    const mql = window.matchMedia(REDUCE_QUERY);\n    mql.addEventListener(\"change\", update);\n\n    // Watch the toggle attribute on <html>.\n    const observer = new MutationObserver(update);\n    observer.observe(document.documentElement, {\n      attributes: true,\n      attributeFilter: [MOTION_ATTR],\n    });\n\n    return () => {\n      mql.removeEventListener(\"change\", update);\n      observer.disconnect();\n    };\n  }, []);\n\n  return reduced;\n}\n\n/**\n * @deprecated Prefer {@link useReducedMotion}. Kept for back-compat with the\n * components that import it from `media-surface`; it now also folds in the\n * global `data-motion=\"off\"` toggle, not just the OS query.\n */\nexport const usePrefersReducedMotion = useReducedMotion;\n\n/**\n * Returns `true` when the page is actually being watched — the tab is visible\n * AND (for a top-level document) the window is focused. Inside an iframe the\n * focus check is skipped, because an iframe rarely \"has focus\" even when its\n * tab is frontmost; it falls back to visibility, which correctly tracks the\n * top tab. Use it to PAUSE autoplay loops when nobody's looking: a movie stops\n * when you tab away.\n *\n * SSR-safe — defaults to `true` and rehydrates in an effect.\n *\n * Scope, deliberately: this knows about tab visibility + window focus, NOT\n * whether the element is scrolled into view (pair it with an\n * IntersectionObserver — e.g. motion's `useInView` — for that), and NOT\n * whether a cross-document iframe has scrolled off its PARENT's viewport. An\n * iframe can't see the parent's scroll; the parent must observe the host and\n * pause it. See the grid poster/promote policy in STUDIO-CAPTURE.md.\n */\nexport function usePageActive(): boolean {\n  const [active, setActive] = React.useState(true);\n\n  React.useEffect(() => {\n    // window.top identity check is safe cross-origin (no property access).\n    const framed = window.self !== window.top;\n    const compute = () =>\n      document.visibilityState !== \"hidden\" && (framed || document.hasFocus());\n    const update = () => setActive(compute());\n    update();\n\n    document.addEventListener(\"visibilitychange\", update);\n    window.addEventListener(\"focus\", update);\n    window.addEventListener(\"blur\", update);\n    window.addEventListener(\"pageshow\", update);\n\n    return () => {\n      document.removeEventListener(\"visibilitychange\", update);\n      window.removeEventListener(\"focus\", update);\n      window.removeEventListener(\"blur\", update);\n      window.removeEventListener(\"pageshow\", update);\n    };\n  }, []);\n\n  return active;\n}\n\n/**\n * Imperatively set the global motion toggle on `<html>`.\n *\n *   setMotion(false) → stamps `data-motion=\"off\"` (animation suppressed)\n *   setMotion(true)  → removes the attribute (default: respect the OS only)\n *\n * Reduce-only: turning motion \"on\" never forces animation for a viewer whose\n * OS asks for reduced motion — `useReducedMotion()` still honours the query.\n * No-op on the server.\n */\nexport function setMotion(enabled: boolean): void {\n  if (typeof document === \"undefined\") return;\n  const root = document.documentElement;\n  if (enabled) root.removeAttribute(MOTION_ATTR);\n  else root.setAttribute(MOTION_ATTR, MOTION_OFF);\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useInView } from \"motion/react\";\nimport {\n  DEMO_IN_VIEW_AMOUNT,\n  DEMO_SPEED_PRESETS,\n  type DemoSpeed,\n  type DemoTrigger,\n} from \"./types\";\nimport { isAbortError, sleep } from \"./sleep\";\nimport { useReducedMotion, usePageActive } from \"../motion\";\n\n/**\n * useScriptedDemo — the shared step-machine hook behind every\n * scripted-demo surface in gradeui (`<Code>`, `<Composer>`,\n * `<DemoStage>`, anything else that wants the same play / stop / speed\n * semantics).\n *\n * Generic over the Step type. Each consumer defines its own verbs\n * (Code has `output`, Composer has `mention`, DemoStage has `reveal`)\n * and passes an `interpret(step, ctx)` callback that executes one\n * step. The hook owns: sequencing, cancellation, trigger detection\n * (mount / inView / manual), loop, pre-delay, completion signal, and\n * the imperative play() / stop() API.\n *\n * Reduced motion: this hook is the declarative-motion layer's accessibility\n * boundary. When the OS reports `prefers-reduced-motion: reduce` OR the\n * global `data-motion=\"off\"` toggle is set (both via `useReducedMotion`),\n * the runner settles on the FINAL frame instead of animating — zeroed\n * timings run every step instantly and the sequence never loops, so the\n * end state shows and holds. That keeps lib/demo honouring the same motion\n * control as ThreeScene and the CSS reset; without it, a screen built with\n * <Code> would keep typing under reduced motion and would not be accessible.\n *\n * Authoring guide for `interpret`:\n *   - `await sleep(ms, ctx.signal)` for any pause so stop() can short\n *     a long wait cleanly.\n *   - `await typeText(text, onTick, stagger, ctx.signal)` for typing\n *     loops, again so stop() interrupts mid-character. A non-positive\n *     stagger (what the reduced-motion preset supplies) emits the whole\n *     string in one tick, so the final state shows with no animation.\n *   - Read `ctx.speed` to grab the resolved DEMO_SPEED_PRESETS entry\n *     when a step doesn't pin its own cadence.\n *   - Throw nothing on cancel — the helpers do it for you. Anything\n *     else thrown is treated as a real bug and bubbles to the console.\n */\n\nexport interface ScriptedDemoContext {\n  /** Resolved speed preset for the current run. Zeroed under reduced motion. */\n  speed: (typeof DEMO_SPEED_PRESETS)[DemoSpeed];\n  /** AbortSignal that fires on stop() / unmount / steps change. */\n  signal: AbortSignal;\n  /** Live cancellation check for code paths that can't take a signal. */\n  cancelled: () => boolean;\n  /** True when the run is in reduced-motion mode (settling, not animating).\n   *  Most interpreters don't need this — zeroed timings handle it — but a\n   *  step that does something non-timing-based (confetti, sound) can skip it. */\n  reduced: boolean;\n}\n\nexport interface UseScriptedDemoOptions<TStep> {\n  /** The steps to run. Undefined or empty means \"no script\". */\n  steps?: TStep[];\n  /**\n   * Per-step interpreter. Receives one step + a context with timing\n   * helpers, runs whatever the step means, and returns when done.\n   * Synchronous or async — the runner awaits either.\n   */\n  interpret: (step: TStep, ctx: ScriptedDemoContext) => Promise<void> | void;\n  /** Animation feel. Defaults to `normal`. */\n  speed?: DemoSpeed;\n  /** What kicks the script off. Defaults to `mount`. */\n  trigger?: DemoTrigger;\n  /** For `trigger=\"manual\"` — flip true to play. */\n  play?: boolean;\n  /** Loop the sequence forever after completion. Pause length controlled by `loopDelay`. */\n  loop?: boolean;\n  /** Cap the number of loop cycles, then settle and stop. A demo is a movie —\n   *  it shouldn't spin forever. Default Infinity. Grid/embed surfaces set a\n   *  small number so the loop ends instead of running unattended. */\n  maxLoops?: number;\n  /**\n   * Milliseconds to pause between loop cycles. Only applies when\n   * `loop` is true. Defaults to 2000. Marketing surfaces that want\n   * the demo to breathe between repeats bump this to 4000-6000; tight\n   * inline demos drop it to 800.\n   */\n  loopDelay?: number;\n  /** Container ref for inView detection. Required when `trigger=\"inView\"`. */\n  containerRef?: React.RefObject<HTMLElement | null>;\n  /**\n   * Fires when one loop iteration completes (or the whole run, when\n   * `loop` is false). Consumers can use this to reset their buffer or\n   * fire a parent callback.\n   */\n  onComplete?: () => void;\n  /**\n   * Fires before each loop iteration starts (after the 2s pause).\n   * Use to reset per-iteration state in the consumer.\n   */\n  onLoopReset?: () => void;\n}\n\nexport interface ScriptedDemoState {\n  /** True while the runner is actively walking steps. */\n  isPlaying: boolean;\n  /** True after the last step has run (and stays true until reset). */\n  isComplete: boolean;\n  /** 0-indexed pointer to the currently executing step, or -1 idle. */\n  currentIndex: number;\n  /** Imperative trigger. Mostly for `trigger=\"manual\"` ref handles. */\n  play: () => void;\n  /** Cancel the in-flight script. Idempotent. */\n  stop: () => void;\n  /**\n   * One-shot replay. Cancels any in-flight run, then re-plays from\n   * step 0. Pass a delay in ms to schedule the replay (useful for\n   * \"play, finish, breathe, play once more\" cadences without the\n   * commitment of `loop`).\n   */\n  restart: (delayMs?: number) => void;\n}\n\nconst DEFAULT_LOOP_DELAY_MS = 2000;\n\n// Reduced-motion timings — everything instant. `typeText` treats a\n// non-positive stagger as \"emit the whole string in one tick\", so steps\n// complete without the typing animation (or the flicker a 0ms loop causes)\n// and the surface lands on its final frame.\nconst INSTANT_PRESET: (typeof DEMO_SPEED_PRESETS)[DemoSpeed] = {\n  tokenStagger: 0,\n  lineStagger: 0,\n  preDelay: 0,\n  fadeMs: 0,\n};\n\nexport function useScriptedDemo<TStep>(\n  opts: UseScriptedDemoOptions<TStep>,\n): ScriptedDemoState {\n  const {\n    steps,\n    interpret,\n    speed = \"normal\",\n    trigger = \"mount\",\n    play: playProp,\n    loop = false,\n    loopDelay = DEFAULT_LOOP_DELAY_MS,\n    maxLoops = Infinity,\n    containerRef,\n    onComplete,\n    onLoopReset,\n  } = opts;\n\n  // Reduced motion (OS preference OR the global data-motion toggle): settle\n  // on the final frame instead of animating. Zeroed timings + no loop.\n  const reduced = useReducedMotion();\n  const preset = reduced ? INSTANT_PRESET : DEMO_SPEED_PRESETS[speed];\n  const effectiveLoop = reduced ? false : loop;\n\n  // Playback gate part 1 of 2: is the page even being watched? Pauses every\n  // loop when the tab is hidden/unfocused — a movie stops when you tab away.\n  // (Part 2, element-in-view, is wired below once we have the container ref.)\n  const pageActive = usePageActive();\n\n  const [isPlaying, setIsPlaying] = React.useState(false);\n  const [isComplete, setIsComplete] = React.useState(false);\n  const [currentIndex, setCurrentIndex] = React.useState(-1);\n\n  // inView wiring — only active when trigger=\"inView\" AND a container\n  // ref was supplied. amount + once mirror the marketing-hero contract.\n  // `useInView` accepts a nullable ref so we always pass the ref, but\n  // it only fires when actually observable.\n  // motion's typing requires a non-null element ref. We assert via cast\n  // because passing { current: null } is legal at runtime and behaves\n  // as \"never in view\".\n  const noopRef = React.useRef<HTMLElement>(null);\n  const inView = useInView(\n    (containerRef ?? noopRef) as React.RefObject<Element>,\n    {\n      once: true,\n      amount: DEMO_IN_VIEW_AMOUNT,\n    },\n  );\n\n  // Playback gate part 2 of 2: a LIVE in-view (re-fires on leave, unlike the\n  // once-only trigger above). Only meaningful when a container ref is being\n  // observed; with no ref we can't see the element, so we don't gate on it\n  // (tab visibility still applies). Together: pause when nobody's watching.\n  const liveInView = useInView(\n    (containerRef ?? noopRef) as React.RefObject<Element>,\n    { amount: DEMO_IN_VIEW_AMOUNT },\n  );\n  const playbackActive = pageActive && (containerRef ? liveInView : true);\n\n  // Manual play trigger — a counter we bump from the imperative play()\n  // method. The runner effect depends on it so a second play() call\n  // (after stop() or after completion) cleanly re-runs the script.\n  const [manualPlayTick, setManualPlayTick] = React.useState(0);\n\n  const shouldPlay = React.useMemo(() => {\n    if (trigger === \"mount\") return true;\n    if (trigger === \"inView\") return inView;\n    // manual: explicit prop OR imperative play() call (tick > 0)\n    return Boolean(playProp) || manualPlayTick > 0;\n  }, [trigger, inView, playProp, manualPlayTick]);\n\n  // Stable interpret ref so the runner effect doesn't restart on every\n  // render just because the consumer passes an inline function.\n  const interpretRef = React.useRef(interpret);\n  interpretRef.current = interpret;\n\n  const completeRef = React.useRef(onComplete);\n  completeRef.current = onComplete;\n  const loopResetRef = React.useRef(onLoopReset);\n  loopResetRef.current = onLoopReset;\n\n  // Active AbortController so stop() can fire from outside the effect.\n  const controllerRef = React.useRef<AbortController | null>(null);\n  // Pending restart timeout id so a second restart() call supersedes\n  // the first (and unmount cleans up before it fires).\n  const restartTimerRef = React.useRef<number | null>(null);\n\n  const stop = React.useCallback(() => {\n    controllerRef.current?.abort();\n    controllerRef.current = null;\n    if (restartTimerRef.current !== null) {\n      window.clearTimeout(restartTimerRef.current);\n      restartTimerRef.current = null;\n    }\n    setIsPlaying(false);\n  }, []);\n\n  const play = React.useCallback(() => {\n    // For mount/inView triggers, calling play() manually still works\n    // (treated as a manual re-run): we bump the tick and rely on the\n    // effect dependency to restart.\n    setManualPlayTick((n) => n + 1);\n  }, []);\n\n  const restart = React.useCallback((delayMs = 0) => {\n    // Cancel any in-flight run and any pending restart so the new\n    // call is the source of truth.\n    controllerRef.current?.abort();\n    controllerRef.current = null;\n    if (restartTimerRef.current !== null) {\n      window.clearTimeout(restartTimerRef.current);\n      restartTimerRef.current = null;\n    }\n    if (delayMs > 0) {\n      restartTimerRef.current = window.setTimeout(() => {\n        restartTimerRef.current = null;\n        setManualPlayTick((n) => n + 1);\n      }, delayMs);\n      return;\n    }\n    setManualPlayTick((n) => n + 1);\n  }, []);\n\n  // Unmount cleanup for any orphaned restart timeout.\n  React.useEffect(() => {\n    return () => {\n      if (restartTimerRef.current !== null) {\n        window.clearTimeout(restartTimerRef.current);\n        restartTimerRef.current = null;\n      }\n    };\n  }, []);\n\n  React.useEffect(() => {\n    if (!steps || steps.length === 0) return;\n    // Under reduced motion, run once to settle on the final frame even if\n    // the normal trigger (inView / manual) hasn't fired — the content\n    // should be present, just not animated.\n    if (!reduced && (!shouldPlay || !playbackActive)) return;\n\n    const controller = new AbortController();\n    controllerRef.current = controller;\n    const { signal } = controller;\n    const cancelled = () => signal.aborted;\n\n    const ctx: ScriptedDemoContext = { speed: preset, signal, cancelled, reduced };\n\n    let active = true;\n    let cycles = 0;\n\n    const run = async () => {\n      do {\n        setIsPlaying(true);\n        setIsComplete(false);\n        setCurrentIndex(-1);\n\n        try {\n          // Initial pre-delay so the static state is visible for a\n          // beat before the first step fires. Mostly matters for\n          // `trigger=\"inView\"` (the eye needs an anchor) but it's\n          // cheap to apply universally. Zero under reduced motion.\n          await sleep(trigger === \"inView\" ? preset.preDelay : 0, signal);\n\n          for (let i = 0; i < steps.length; i++) {\n            if (signal.aborted) return;\n            setCurrentIndex(i);\n            await interpretRef.current(steps[i], ctx);\n          }\n\n          if (signal.aborted) return;\n          setCurrentIndex(-1);\n          setIsComplete(true);\n          completeRef.current?.();\n\n          cycles += 1;\n          // Stop when not looping, or once we've hit the loop cap — settle on\n          // the final frame and don't spin unattended.\n          if (!effectiveLoop || cycles >= maxLoops) {\n            setIsPlaying(false);\n            return;\n          }\n\n          // Loop: pause (`loopDelay`, default 2000ms) then reset and replay.\n          await sleep(loopDelay, signal);\n          if (signal.aborted) return;\n          loopResetRef.current?.();\n        } catch (err) {\n          if (isAbortError(err)) return;\n          // Re-throw real errors so authoring bugs surface in the\n          // console rather than being swallowed silently.\n          if (process.env.NODE_ENV !== \"production\") {\n            // eslint-disable-next-line no-console\n            console.error(\"[useScriptedDemo] step error:\", err);\n          }\n          setIsPlaying(false);\n          return;\n        }\n      } while (active && effectiveLoop && !signal.aborted);\n    };\n\n    void run();\n\n    return () => {\n      active = false;\n      controller.abort();\n      if (controllerRef.current === controller) controllerRef.current = null;\n    };\n    // `interpret` is intentionally NOT in the dep list — we read it\n    // through interpretRef so the effect doesn't restart on every\n    // render. Same for the completion callbacks. `reduced` IS a dep so\n    // toggling motion re-runs (settles instantly when turned off,\n    // re-animates when turned on).\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [\n    steps,\n    shouldPlay,\n    playbackActive,\n    effectiveLoop,\n    loopDelay,\n    preset,\n    trigger,\n    manualPlayTick,\n    reduced,\n  ]);\n\n  return { isPlaying, isComplete, currentIndex, play, stop, restart };\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\n/**\n * BlinkingCursor — the shared caret used by every scripted-demo\n * surface in gradeui. Styled via CSS variables so each host (Code's\n * terminal, Composer's inline caret, future surfaces) can tweak\n * dimensions and colour without forking the component.\n *\n * Tokens read from the cascade:\n *   --gds-demo-cursor-color   defaults to currentColor\n *   --gds-demo-cursor-width   defaults to 0.55ch (a hair narrower than\n *                             a monospace char so it reads as a caret\n *                             rather than a block)\n *   --gds-demo-cursor-height  defaults to 1.1em\n *\n * The animation lives in `styles/globals.css` as `.gds-demo-cursor`\n * (alongside the other demo primitives). Keeping it in CSS rather\n * than motion / framer keeps the cursor available in environments\n * that disable JS animation but still render the page.\n */\n\nexport interface BlinkingCursorProps\n  extends Omit<React.HTMLAttributes<HTMLSpanElement>, \"children\"> {\n  /**\n   * Visual variant. `inline` (default) is for caret-in-text demos\n   * (Code, Composer). `block` is for terminal-style square cursors\n   * that fill a character cell.\n   */\n  variant?: \"inline\" | \"block\";\n}\n\nexport const BlinkingCursor = React.forwardRef<\n  HTMLSpanElement,\n  BlinkingCursorProps\n>(function BlinkingCursor({ variant = \"inline\", className, ...rest }, ref) {\n  return (\n    <span\n      ref={ref}\n      data-gds-part=\"demo-cursor\"\n      data-gds-variant={variant}\n      aria-hidden\n      className={cn(\"gds-demo-cursor\", className)}\n      {...rest}\n    />\n  );\n});\n","\"use client\";\n\nimport * as React from \"react\";\nimport { motion, useReducedMotion } from \"motion/react\";\nimport {\n  type DemoSpeed,\n  type DemoTrigger,\n} from \"./types\";\nimport { sleep } from \"./sleep\";\nimport { useScriptedDemo } from \"./use-scripted-demo\";\n\n/**\n * DemoStage + Reveal — staged appearance for whole-interface demos.\n *\n * Drop `<Reveal id=\"hero\">…</Reveal>` around any subtree that should\n * appear on cue. Wrap a region in `<DemoStage steps={…}>` and the\n * script drives which targets become visible, in what order, with\n * what cadence. Same speed / trigger / loop / play semantics as\n * `<Code>` and `<Composer>`.\n *\n * Why a context-based pattern instead of one-component-per-region:\n *   - Authoring stays declarative — the script reads as a storyboard,\n *     not as a stack of imperative ref calls.\n *   - Reveals can live deep in a subtree without prop-drilling.\n *   - The same `<Reveal>` works whether or not a parent stage exists\n *     (it just renders visible if there's no context, so the same\n *     markup ships to production without the demo wrapper).\n *\n * Reduced motion: if the user has `prefers-reduced-motion`, every\n * Reveal renders immediately at its destination state — the stage's\n * script still walks, but the visual transitions are no-ops.\n */\n\nexport type RevealStep =\n  | { type: \"reveal\"; target: string }\n  | { type: \"reveal-all\" }\n  | { type: \"hide\"; target: string }\n  | { type: \"wait\"; ms: number }\n  | { type: \"reset\" };\n\ninterface StageContextValue {\n  /** Set of currently-visible reveal target ids. */\n  visible: Set<string>;\n  /** True when there's a stage above us (vs. naked Reveal rendering). */\n  hasStage: boolean;\n  /** Stage-level reduced-motion flag passed down to Reveals. */\n  reducedMotion: boolean;\n  /**\n   * Default enter animation if a Reveal doesn't specify its own.\n   * Stages can theme an entire region's reveal style at once.\n   */\n  defaultAnimation: RevealAnimation;\n}\n\nconst StageContext = React.createContext<StageContextValue>({\n  visible: new Set(),\n  hasStage: false,\n  reducedMotion: false,\n  defaultAnimation: \"fade-up\",\n});\n\nexport type RevealAnimation =\n  | \"fade\"\n  | \"fade-up\"\n  | \"fade-down\"\n  | \"fade-left\"\n  | \"fade-right\"\n  | \"scale\"\n  | \"none\";\n\nexport interface DemoStageProps {\n  /** Steps that drive which Reveals are visible at what time. */\n  steps?: RevealStep[];\n  /** Speed preset. Same vocabulary as Code / Composer. */\n  speed?: DemoSpeed;\n  /** When the stage starts running. Defaults to `mount`. */\n  trigger?: DemoTrigger;\n  /** For trigger=\"manual\" — flip true to play. */\n  play?: boolean;\n  /** Loop the script forever. */\n  loop?: boolean;\n  /** Default enter animation for child Reveals that don't override. */\n  defaultAnimation?: RevealAnimation;\n  /**\n   * Render content visible by default (every target shown) when the\n   * stage has no steps. Useful for sharing the same JSX between live\n   * production use and demo playback.\n   */\n  visibleWhenIdle?: boolean;\n  className?: string;\n  children: React.ReactNode;\n}\n\nexport function DemoStage({\n  steps,\n  speed = \"normal\",\n  trigger = \"mount\",\n  play,\n  loop = false,\n  defaultAnimation = \"fade-up\",\n  visibleWhenIdle = true,\n  className,\n  children,\n}: DemoStageProps) {\n  const reduced = useReducedMotion() ?? false;\n  const containerRef = React.useRef<HTMLDivElement>(null);\n  const [visible, setVisible] = React.useState<Set<string>>(\n    () => new Set(),\n  );\n\n  // If there are no steps, just render everything visible immediately\n  // (when `visibleWhenIdle` is true) so the same markup is shippable.\n  const hasSteps = Boolean(steps && steps.length);\n\n  useScriptedDemo<RevealStep>({\n    steps: hasSteps ? steps : undefined,\n    speed,\n    trigger,\n    play,\n    loop,\n    containerRef,\n    onLoopReset: () => setVisible(new Set()),\n    interpret: async (step, ctx) => {\n      if (step.type === \"wait\") {\n        return sleep(step.ms, ctx.signal);\n      }\n      if (step.type === \"reset\") {\n        setVisible(new Set());\n        return sleep(ctx.speed.preDelay, ctx.signal);\n      }\n      if (step.type === \"reveal\") {\n        setVisible((prev) => {\n          if (prev.has(step.target)) return prev;\n          const next = new Set(prev);\n          next.add(step.target);\n          return next;\n        });\n        // Default cadence between reveals lines up with the typing\n        // tokenStagger so a fast stage feels fast and a slow one slow.\n        return sleep(ctx.speed.lineStagger, ctx.signal);\n      }\n      if (step.type === \"reveal-all\") {\n        // Defer; child Reveals read the wildcard from context flag.\n        // Simpler to just mark a sentinel and let useMemo in the\n        // provider expand it.\n        setVisible((prev) => {\n          const next = new Set(prev);\n          next.add(\"__all__\");\n          return next;\n        });\n        return sleep(ctx.speed.lineStagger, ctx.signal);\n      }\n      if (step.type === \"hide\") {\n        setVisible((prev) => {\n          if (!prev.has(step.target)) return prev;\n          const next = new Set(prev);\n          next.delete(step.target);\n          return next;\n        });\n        return sleep(ctx.speed.fadeMs, ctx.signal);\n      }\n    },\n  });\n\n  const value = React.useMemo<StageContextValue>(\n    () => ({\n      visible: hasSteps ? visible : new Set([\"__all__\"]),\n      hasStage: true,\n      reducedMotion: reduced,\n      defaultAnimation,\n    }),\n    [hasSteps, visible, reduced, defaultAnimation],\n  );\n\n  // When there are no steps and visibleWhenIdle is false, render an\n  // empty visible set so children stay hidden. Power-users only.\n  const finalValue = !hasSteps && !visibleWhenIdle\n    ? { ...value, visible: new Set<string>() }\n    : value;\n\n  return (\n    <div\n      ref={containerRef}\n      data-gds-part=\"demo-stage\"\n      data-gds-stage-playing={hasSteps ? \"true\" : \"false\"}\n      className={className}\n    >\n      <StageContext.Provider value={finalValue}>\n        {children}\n      </StageContext.Provider>\n    </div>\n  );\n}\n\n// ─── Reveal ──────────────────────────────────────────────────────────\n\nconst ANIMATION_VARIANTS: Record<\n  RevealAnimation,\n  { initial: Record<string, number>; animate: Record<string, number> }\n> = {\n  fade: { initial: { opacity: 0 }, animate: { opacity: 1 } },\n  \"fade-up\": { initial: { opacity: 0, y: 12 }, animate: { opacity: 1, y: 0 } },\n  \"fade-down\": { initial: { opacity: 0, y: -12 }, animate: { opacity: 1, y: 0 } },\n  \"fade-left\": { initial: { opacity: 0, x: 12 }, animate: { opacity: 1, x: 0 } },\n  \"fade-right\": { initial: { opacity: 0, x: -12 }, animate: { opacity: 1, x: 0 } },\n  scale: { initial: { opacity: 0, scale: 0.96 }, animate: { opacity: 1, scale: 1 } },\n  none: { initial: { opacity: 1 }, animate: { opacity: 1 } },\n};\n\nexport interface RevealProps {\n  /** Stage target id. The matching `{ type: \"reveal\", target: id }` step shows this. */\n  id: string;\n  /** Enter animation. Falls back to the parent stage's `defaultAnimation`. */\n  animation?: RevealAnimation;\n  /** Override transition duration (ms). Defaults to the stage speed's fadeMs. */\n  durationMs?: number;\n  /**\n   * When true and there's no parent DemoStage, render hidden anyway.\n   * Default false — naked usage renders visible so production markup\n   * matches demo markup.\n   */\n  hideOutsideStage?: boolean;\n  /**\n   * Fires when this Reveal transitions from hidden to visible. Use to\n   * kick off a nested scripted demo (Composer.restart(), Code.play(),\n   * etc) at the moment the user actually sees the surface. Without\n   * this hook, nested demos with `trigger=\"mount\"` would run while\n   * still hidden and the user would miss the animation entirely.\n   */\n  onReveal?: () => void;\n  /**\n   * Fires when this Reveal transitions from visible to hidden (e.g.\n   * because the stage script ran a `hide` step or looped via `reset`).\n   * Use to pause/reset nested state.\n   */\n  onHide?: () => void;\n  className?: string;\n  children: React.ReactNode;\n}\n\nexport function Reveal({\n  id,\n  animation,\n  durationMs,\n  hideOutsideStage = false,\n  onReveal,\n  onHide,\n  className,\n  children,\n}: RevealProps) {\n  const stage = React.useContext(StageContext);\n  const isVisible = !stage.hasStage\n    ? !hideOutsideStage\n    : stage.visible.has(\"__all__\") || stage.visible.has(id);\n\n  // Fire onReveal / onHide on the visibility transition. Tracked via\n  // a ref so we don't fire on first paint when isVisible matches the\n  // initial state.\n  const prevVisibleRef = React.useRef(isVisible);\n  const onRevealRef = React.useRef(onReveal);\n  const onHideRef = React.useRef(onHide);\n  onRevealRef.current = onReveal;\n  onHideRef.current = onHide;\n  React.useEffect(() => {\n    if (isVisible === prevVisibleRef.current) return;\n    prevVisibleRef.current = isVisible;\n    if (isVisible) onRevealRef.current?.();\n    else onHideRef.current?.();\n  }, [isVisible]);\n\n  const anim = animation ?? stage.defaultAnimation;\n  const variant = ANIMATION_VARIANTS[anim];\n  const duration = (durationMs ?? 280) / 1000;\n\n  // Reduced motion: skip the transform / opacity dance, just snap to\n  // the destination state. Stage flag wins so a single tester preference\n  // applies everywhere.\n  if (stage.reducedMotion) {\n    return (\n      <div\n        data-gds-part=\"reveal\"\n        data-gds-reveal-id={id}\n        data-gds-revealed={isVisible ? \"true\" : \"false\"}\n        className={className}\n        style={{ opacity: isVisible ? 1 : 0 }}\n      >\n        {children}\n      </div>\n    );\n  }\n\n  return (\n    <motion.div\n      data-gds-part=\"reveal\"\n      data-gds-reveal-id={id}\n      data-gds-revealed={isVisible ? \"true\" : \"false\"}\n      className={className}\n      initial={variant.initial}\n      animate={isVisible ? variant.animate : variant.initial}\n      transition={{ duration, ease: [0.22, 1, 0.36, 1] }}\n    >\n      {children}\n    </motion.div>\n  );\n}\n","import * as React from \"react\";\nimport { Highlight, type Language, type PrismTheme } from \"prism-react-renderer\";\nimport { motion, useInView } from \"motion/react\";\nimport { cn } from \"@/lib/utils\";\nimport {\n  useScriptedDemo,\n  sleep,\n  DEMO_SPEED_PRESETS,\n  BlinkingCursor,\n} from \"@/lib/demo\";\n\n/**\n * Code — syntax-highlighted code surface with diff, line-emphasis, and\n * reveal animation modes. Designed for marketing heroes (\"diff hero\"),\n * docs blocks, and changelog entries.\n *\n * Engine choice: prism-react-renderer. Sync, ~6kb, render-prop API hands\n * us `tokens` as data. Already in use in Studio's CodeView so the repo\n * has one highlighter, not two. Async highlighters (shiki) would either\n * flash unstyled on hydration or balloon the marketing bundle once you\n * include enough langs to matter. See gradeui/STUDIO.md for the Studio\n * variant.\n *\n * Theme is CSS-variable driven (`--gds-code-*`), so token palette\n * inverts with the theme without us re-rendering a different prism\n * theme. The prism `theme` prop just hands each token type a\n * `color: var(--gds-code-<thing>)` so the cascade does the work.\n *\n * Animation strategy: motion (already a dep). `reveal=\"lines\"` staggers\n * each line in; `typewriter` reveals tokens one-at-a-time per line;\n * `diff` plays the removed → added swap. The `trigger` prop selects\n * what kicks it off — `inView` is the common case for scroll-driven\n * marketing surfaces; `mount` fires immediately; `manual` reads `play`.\n */\n\n// ─── Types ───────────────────────────────────────────────────────────\n\nexport type CodeLanguage = Language;\nexport type CodeReveal = \"none\" | \"lines\" | \"typewriter\" | \"diff\";\nexport type CodeTrigger = \"mount\" | \"inView\" | \"manual\";\nexport type CodeSpeed = \"slow\" | \"normal\" | \"fast\";\nexport type CodeSize = \"xs\" | \"sm\" | \"md\";\n\nconst SIZE_CLASS: Record<CodeSize, string> = {\n  xs: \"text-xs\",\n  sm: \"text-sm\",\n  md: \"text-base\",\n};\n\n/**\n * Step shape for scripted terminal / CLI sessions. Lives on `<Code>`\n * itself rather than a sibling `CodeSequence` so the theme bridge,\n * prompt prop, cursor, surface tokens, and prism highlighter aren't\n * duplicated. When `steps` is provided, it overrides `source` + `reveal`\n * and runs the machine below internally.\n *\n *   - `type`   — types text into the buffer as if a user were typing\n *   - `output` — appends text instantly as command output (no prompt,\n *                no per-char delay, often muted in render)\n *   - `wait`   — pauses for `ms` milliseconds before the next step\n *   - `clear`  — wipes the buffer (terminal `clear`)\n */\nexport type CodeStep =\n  | { type: \"type\"; text: string; speed?: CodeSpeed }\n  | { type: \"output\"; text: string }\n  | { type: \"wait\"; ms: number }\n  | { type: \"clear\" };\n\n/**\n * Speed presets — pick a feel, not a number. The user wanted \"sensible\n * defaults, I don't want to have to think.\" Speeds collapse to a\n * (per-line, per-token, pre-reveal-delay) triple. Authors that need\n * finer control can still pass explicit `stagger` + `delay`, which\n * override the preset.\n */\nconst SPEED_PRESETS: Record<\n  CodeSpeed,\n  { lineStagger: number; tokenStagger: number; preDelay: number; fadeMs: number }\n> = {\n  // Retuned May 2026: the previous `slow` (90/38/320) only differed\n  // from `normal` by ~40%, which the user couldn't feel. Tripling the\n  // line stagger + doubling the token stagger makes the three steps\n  // unambiguously distinct — slow lands as \"I am being shown\", normal\n  // as \"I am being told\", fast as \"I am being briefed\".\n  slow:   { lineStagger: 200, tokenStagger: 70, preDelay: 500, fadeMs: 480 },\n  normal: { lineStagger: 55,  tokenStagger: 22, preDelay: 200, fadeMs: 280 },\n  fast:   { lineStagger: 18,  tokenStagger: 8,  preDelay: 60,  fadeMs: 160 },\n};\n\nexport interface CodeDiff {\n  /** 1-indexed line numbers marked as added (green bg + `+` gutter). */\n  added?: number[];\n  /** 1-indexed line numbers marked as removed (red bg + `-` gutter). */\n  removed?: number[];\n}\n\nexport interface CodeProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n  /**\n   * Source code to render. Optional when `steps` is provided — the\n   * scripted machine builds its own buffer and ignores `source`. When\n   * neither `source` nor `steps` is set, the block renders empty.\n   */\n  source?: string;\n  /** Prism language id — `tsx` handles JSX too. Defaults to `tsx`. */\n  language?: CodeLanguage;\n  /**\n   * 1-indexed lines (or `[start, end]` ranges) to emphasise with the\n   * highlight background. Composes with `diff` — diff colours win.\n   */\n  highlight?: number | number[] | Array<number | [number, number]>;\n  /** Diff mode — paints +added / -removed lines and renders a gutter. */\n  diff?: CodeDiff;\n  /** Reveal animation. Defaults to `none`. */\n  reveal?: CodeReveal;\n  /** What triggers the reveal. Defaults to `mount`. */\n  trigger?: CodeTrigger;\n  /** For `trigger=\"manual\"` — set true to play. */\n  play?: boolean;\n  /**\n   * Animation feel — slow / normal (default) / fast. Maps onto sensible\n   * stagger + pre-reveal delay values so authors don't have to think.\n   * Explicit `stagger` / `delay` override the preset if provided.\n   */\n  speed?: CodeSpeed;\n  /** Delay before the reveal starts (ms). Overrides the `speed` preset. */\n  delay?: number;\n  /**\n   * Per-line stagger for `lines`/`diff`, per-token for `typewriter`\n   * (ms). Overrides the `speed` preset.\n   */\n  stagger?: number;\n  /** Show 1-indexed line numbers in a gutter. */\n  showLineNumbers?: boolean;\n  /** Optional filename / label in the chrome header. */\n  filename?: string;\n  /** Wrap long lines instead of horizontal scroll. */\n  wrap?: boolean;\n  /** Hide the surrounding chrome (border, header, padding). */\n  bare?: boolean;\n  /**\n   * String prepended to every line. Use for terminal emulation\n   * (`prompt=\"$ \"` for bash, `prompt=\"> \"` for PowerShell, `prompt=\">>> \"`\n   * for Python REPL). Prompt characters render in muted token colour,\n   * don't pick up the typewriter stagger (they're chrome, not content),\n   * and are aria-hidden so screen readers don't read them.\n   */\n  prompt?: string;\n  /**\n   * Show a blinking cursor at the tail of the reveal — implies the\n   * \"typing\" gesture in marketing demos and terminal sessions.\n   * Defaults to `true` when `reveal=\"typewriter\"`, `false` otherwise.\n   * Pass explicit `true` to keep the cursor up after a `lines` reveal\n   * completes, or `false` to hide it on a typewriter run.\n   */\n  cursor?: boolean;\n  /**\n   * Scripted terminal session. When provided, takes precedence over\n   * `source` + `reveal` — the component runs the step machine,\n   * progressively appending characters per step. Pairs naturally with\n   * `language=\"bash\"` + `prompt=\"$ \"` + `cursor` (all default-on).\n   *\n   * Output lines are rendered without a prompt prefix and at a muted\n   * token colour so they read as command output rather than input.\n   * Use `wait` between commands to let the user catch up.\n   *\n   * Example:\n   *   <Code language=\"bash\" prompt=\"$ \" steps={[\n   *     { type: \"type\", text: \"pnpm add @gradeui/ui\" },\n   *     { type: \"wait\", ms: 500 },\n   *     { type: \"output\", text: \"added 47 packages in 2.3s\" },\n   *     { type: \"type\", text: \"pnpm gradeui init\" },\n   *   ]} />\n   */\n  steps?: CodeStep[];\n  /**\n   * When `steps` is set: loops the sequence forever after completion\n   * (with a 2s pause + clear between cycles). For \"always-on\" hero\n   * demos that need to keep playing.\n   */\n  loop?: boolean;\n  /**\n   * Container sizing — `auto` (default) grows with the rendered lines.\n   * A number is treated as pixels (`300` → `300px`); a string is passed\n   * through as CSS (`\"20rem\"`, `\"50vh\"`, `\"calc(100vh - 4rem)\"`).\n   *\n   * Overflowing content scrolls. Pair with `wrap` to break long lines\n   * instead of horizontal scroll.\n   */\n  /**\n   * Type-scale preset. `xs` (12px) for dense changelog cards and inline\n   * code in tables; `sm` (14px, default) for marketing heroes and most\n   * docs blocks; `md` (16px) for \"this is the focal point\" displays\n   * like AI-output demos and large screen-capture replacements.\n   *\n   * Composes with `maxLines` correctly because the container height\n   * uses `1lh` which inherits whatever line-height the size class\n   * produces — switching size resizes the container automatically.\n   */\n  size?: CodeSize;\n  height?: number | string | \"auto\";\n  /**\n   * Cap the visible line count — the container is fixed at exactly\n   * `maxLines * 1lh` and additional lines scroll. Use for terminal\n   * windows (\"show me the last 8 lines\"), code-tour cards, and\n   * marketing surfaces that need a stable vertical rhythm regardless\n   * of how much content is in the snippet.\n   *\n   * Wins over `height` when both are set.\n   */\n  maxLines?: number;\n}\n\n// ─── Prism theme bridge → CSS variables ──────────────────────────────\n//\n// Map each prism token type to a `color: var(--gds-code-<role>)`. The\n// defaults live in styles/globals.css; consumers can override per-theme\n// or per-instance via inline style.\n\nconst cssVarTheme: PrismTheme = {\n  plain: { color: \"var(--gds-code-fg)\", backgroundColor: \"transparent\" },\n  styles: [\n    { types: [\"comment\", \"prolog\", \"doctype\", \"cdata\"], style: { color: \"var(--gds-code-comment)\", fontStyle: \"normal\" } },\n    { types: [\"punctuation\"], style: { color: \"var(--gds-code-punctuation)\" } },\n    { types: [\"property\", \"constant\", \"symbol\", \"deleted\"], style: { color: \"var(--gds-code-property)\" } },\n    { types: [\"boolean\", \"number\"], style: { color: \"var(--gds-code-number)\" } },\n    { types: [\"selector\", \"attr-name\", \"string\", \"char\", \"builtin\", \"inserted\"], style: { color: \"var(--gds-code-string)\" } },\n    { types: [\"operator\", \"entity\", \"url\"], style: { color: \"var(--gds-code-operator)\" } },\n    { types: [\"atrule\", \"keyword\"], style: { color: \"var(--gds-code-keyword)\" } },\n    { types: [\"function\", \"class-name\"], style: { color: \"var(--gds-code-function)\" } },\n    { types: [\"regex\", \"important\", \"variable\"], style: { color: \"var(--gds-code-variable)\" } },\n    { types: [\"tag\"], style: { color: \"var(--gds-code-tag)\" } },\n    { types: [\"attr-name\"], style: { color: \"var(--gds-code-attr-name)\" } },\n    { types: [\"attr-value\"], style: { color: \"var(--gds-code-attr-value)\" } },\n  ],\n};\n\n// ─── Helpers ─────────────────────────────────────────────────────────\n\nfunction normaliseHighlight(input: CodeProps[\"highlight\"]): Set<number> {\n  const set = new Set<number>();\n  if (input == null) return set;\n  const items = Array.isArray(input) ? input : [input];\n  for (const item of items) {\n    if (typeof item === \"number\") {\n      set.add(item);\n    } else if (Array.isArray(item) && item.length === 2) {\n      const [start, end] = item;\n      for (let i = start; i <= end; i++) set.add(i);\n    }\n  }\n  return set;\n}\n\ntype LineKind = \"default\" | \"added\" | \"removed\" | \"highlight\";\n\nfunction kindForLine(\n  lineNumber: number,\n  diff: CodeDiff | undefined,\n  highlightSet: Set<number>,\n): LineKind {\n  // Diff wins. Marketing pages want the +/- semantic to read first.\n  if (diff?.added?.includes(lineNumber)) return \"added\";\n  if (diff?.removed?.includes(lineNumber)) return \"removed\";\n  if (highlightSet.has(lineNumber)) return \"highlight\";\n  return \"default\";\n}\n\n// ─── Component ───────────────────────────────────────────────────────\n\nconst Code = React.forwardRef<HTMLDivElement, CodeProps>(function Code(\n  {\n    source,\n    language = \"tsx\" as CodeLanguage,\n    highlight,\n    diff,\n    reveal = \"none\",\n    trigger = \"mount\",\n    play,\n    speed = \"normal\",\n    delay,\n    stagger,\n    showLineNumbers = false,\n    filename,\n    wrap = false,\n    bare = false,\n    prompt,\n    cursor,\n    steps,\n    loop = false,\n    size = \"sm\",\n    height,\n    maxLines,\n    className,\n    style,\n    ...rest\n  },\n  ref,\n) {\n  const preset = SPEED_PRESETS[speed];\n  // Explicit `delay` / `stagger` override the preset — single source of\n  // resolved timing flows downstream.\n  const resolvedDelay = delay ?? 0;\n  const resolvedStagger =\n    stagger ?? (reveal === \"typewriter\" ? preset.tokenStagger : preset.lineStagger);\n  // ─── Step machine (terminal / scripted CLI) ──────────────────────\n  //\n  // When `steps` is provided we ignore `source` + `reveal` and run a\n  // typing simulation: each `type` step appends one char per tick at\n  // the speed preset's `tokenStagger`, each `output` step appends its\n  // text instantly with a muted-token marker line, each `wait` step\n  // pauses the timer for `ms`. The buffer (a plain string) becomes the\n  // `code` value flowing into prism — so syntax highlighting + prompt\n  // + cursor all keep working without duplication.\n  //\n  // Output lines are tracked separately (a Set of 1-indexed line\n  // numbers) and rendered with the comment colour, no prompt.\n  const stepsActive = Boolean(steps && steps.length);\n  const [stepBuffer, setStepBuffer] = React.useState(\"\");\n  const [outputLineSet, setOutputLineSet] = React.useState<Set<number>>(\n    () => new Set(),\n  );\n\n  // Strip a single trailing newline — prism otherwise emits an empty\n  // final line which throws the staggered reveal off by one frame.\n  // When the step machine is driving, the buffer it builds is the\n  // source of truth instead.\n  // `source` is optional now (it's ignored when `steps` is set, and the\n  // empty-input case should render a no-op block rather than crash with\n  // \"Cannot read properties of undefined\").\n  const sourceForRender = stepsActive ? stepBuffer : (source ?? \"\");\n  const code = React.useMemo(\n    () => sourceForRender.replace(/\\n$/, \"\"),\n    [sourceForRender],\n  );\n  const highlightSet = React.useMemo(() => normaliseHighlight(highlight), [highlight]);\n  const hasDiff = Boolean(diff?.added?.length || diff?.removed?.length);\n  const showGutter = showLineNumbers || hasDiff;\n\n  // Container ref is used both as the forwarded ref AND for `inView`\n  // detection — motion's `useInView` needs a real ref to observe.\n  const innerRef = React.useRef<HTMLDivElement>(null);\n  React.useImperativeHandle(ref, () => innerRef.current as HTMLDivElement);\n\n  // Track reveal completion so the cursor can hide itself after the\n  // last token / line lands. Default true (keeps cursor visible if\n  // user passes `cursor` on a static block). The effect below flips\n  // it false at the right moment.\n  const [revealComplete, setRevealComplete] = React.useState(reveal === \"none\");\n\n  // `once: true` matches the marketing-hero contract — once the user\n  // has seen the reveal, scrolling away and back shouldn't replay it.\n  //\n  // `amount: 0.55` (was 0.3 pre-tune) means more than half the block\n  // must be in view before triggering. At 0.3 the reveal kicked off\n  // when only the top edge of long blocks scrolled past the threshold,\n  // so the user often saw the animation finish before the block was\n  // even fully visible. 0.55 keeps the static state visible long\n  // enough that the reveal lands as \"look, it's animating now\".\n  const inView = useInView(innerRef, { once: true, amount: 0.55 });\n\n  // Small intrinsic settle delay on inView triggers: the block first\n  // renders static at full opacity for a beat, THEN the per-line stagger\n  // starts. Without this, the reveal happens the moment the threshold\n  // flips and there's no anchor moment for the eye. Value comes from\n  // the speed preset's `preDelay`.\n  const intrinsicDelay = trigger === \"inView\" ? preset.preDelay : 0;\n\n  const shouldPlay =\n    trigger === \"mount\" ? true : trigger === \"inView\" ? inView : Boolean(play);\n\n  // Resolved per-line stagger. Declared up here so totalRevealMs below\n  // can reference it — TypeScript / V8 const declarations follow strict\n  // temporal-dead-zone rules, and the steps machine refactor accidentally\n  // moved the original `const perLineStagger = …` past its first use.\n  // Surfaced as \"Cannot access 'perLineStagger' before initialization\"\n  // whenever any docs page opened the Code tab.\n  const perLineStagger = resolvedStagger;\n\n  // Compute total reveal duration so the cursor can disappear when the\n  // animation finishes. Per-line for `lines`/`diff`, per-token for\n  // `typewriter` (we approximate token count from a whitespace-collapsed\n  // count; close enough for cursor-disappear timing).\n  const totalLines = code.split(\"\\n\").length;\n  const tokenEstimate =\n    reveal === \"typewriter\"\n      ? code.replace(/\\s+/g, \" \").split(\" \").length\n      : totalLines;\n  const totalRevealMs =\n    intrinsicDelay + resolvedDelay + tokenEstimate * perLineStagger + 280;\n\n  React.useEffect(() => {\n    if (stepsActive) {\n      // Step machine owns its own completion signal — the effect below\n      // flips revealComplete when the steps drain.\n      return;\n    }\n    if (!shouldPlay || reveal === \"none\") {\n      setRevealComplete(reveal === \"none\");\n      return;\n    }\n    setRevealComplete(false);\n    const t = window.setTimeout(() => setRevealComplete(true), totalRevealMs);\n    return () => window.clearTimeout(t);\n    // Re-run when the consumer flips trigger / changes content.\n  }, [shouldPlay, reveal, totalRevealMs, stepsActive]);\n\n  // ─── Step runner ─────────────────────────────────────────────────\n  //\n  // Refactored 2026-05-29 onto `useScriptedDemo` from `lib/demo/`.\n  // The runner / cancellation / loop logic now lives in the shared\n  // hook (same one Composer and DemoStage use); Code only supplies\n  // the per-step interpret callback that mutates its own buffer +\n  // output-line state. trigger=\"manual\" + `play={shouldPlay}` keeps\n  // Code's existing scroll/inView/play-prop semantics intact — the\n  // hook just runs the script when Code's outer shouldPlay flips true.\n  //\n  // The interpret callback uses a buffer ref (not the React state)\n  // for sequential reads — otherwise a `type` step's per-char ticks\n  // would read stale state and rewrite the same chunk repeatedly.\n  // We mirror writes to both the ref (next tick reads it) and React\n  // state (rendering picks it up).\n  const stepBufferRef = React.useRef(\"\");\n  const outputLineSetRef = React.useRef<Set<number>>(new Set());\n  const updateBuffer = React.useCallback((next: string) => {\n    stepBufferRef.current = next;\n    setStepBuffer(next);\n  }, []);\n  const updateOutputs = React.useCallback((next: Set<number>) => {\n    outputLineSetRef.current = next;\n    setOutputLineSet(next);\n  }, []);\n\n  const { isComplete: stepsComplete } = useScriptedDemo<CodeStep>({\n    steps: stepsActive ? steps : undefined,\n    speed,\n    trigger: \"manual\",\n    play: shouldPlay,\n    loop,\n    containerRef: innerRef,\n    onLoopReset: () => {\n      updateBuffer(\"\");\n      updateOutputs(new Set());\n      setRevealComplete(false);\n    },\n    interpret: async (step, ctx) => {\n      const signal = ctx.signal;\n      if (step.type === \"wait\") return sleep(step.ms, signal);\n      if (step.type === \"clear\") {\n        updateBuffer(\"\");\n        updateOutputs(new Set());\n        return;\n      }\n      if (step.type === \"output\") {\n        // Output appends instantly. Each new line of the output is\n        // marked as an output row (1-indexed, line number in the\n        // final buffer including this insert).\n        const buffer = stepBufferRef.current;\n        const base = buffer.length > 0 && !buffer.endsWith(\"\\n\") ? buffer + \"\\n\" : buffer;\n        const next = base + step.text;\n        const startLine = base.split(\"\\n\").length;\n        const outputLineCount = step.text.split(\"\\n\").length;\n        const nextOutputs = new Set(outputLineSetRef.current);\n        for (let i = 0; i < outputLineCount; i++) nextOutputs.add(startLine + i);\n        updateBuffer(next);\n        updateOutputs(nextOutputs);\n        // Append a trailing newline so the next type step starts on\n        // its own row, matching the pre-refactor behaviour.\n        updateBuffer(next + (next.endsWith(\"\\n\") ? \"\" : \"\\n\"));\n        // Brief beat after output before the next prompt.\n        return sleep(240, signal);\n      }\n      // type — append one char per tick at the resolved token stagger\n      // (or the step's per-step speed override).\n      const stepStagger = step.speed\n        ? DEMO_SPEED_PRESETS[step.speed].tokenStagger\n        : ctx.speed.tokenStagger;\n      const buffer = stepBufferRef.current;\n      const base = buffer.length > 0 && !buffer.endsWith(\"\\n\") ? buffer + \"\\n\" : buffer;\n      // Small intra-step settle so the prompt renders before the\n      // first key \"press\" (matches pre-refactor behaviour).\n      await sleep(60, signal);\n      for (let i = 0; i < step.text.length; i++) {\n        if (signal.aborted) return;\n        const partial = base + step.text.slice(0, i + 1);\n        updateBuffer(partial);\n        if (i < step.text.length - 1) await sleep(stepStagger, signal);\n      }\n    },\n  });\n\n  // When the step machine completes, flag revealComplete so the\n  // cursor's \"show only while in flight\" logic fires. The existing\n  // non-step reveal-complete effect (above) doesn't touch this when\n  // stepsActive.\n  React.useEffect(() => {\n    if (stepsActive) setRevealComplete(stepsComplete);\n  }, [stepsActive, stepsComplete]);\n\n  // Cursor visibility — defaults on for typewriter AND for scripted\n  // step sessions (terminal demos always want a caret). Static blocks\n  // get no cursor unless the consumer opts in.\n  const showCursor = cursor ?? (reveal === \"typewriter\" || stepsActive);\n\n  return (\n    <div\n      ref={innerRef}\n      data-gds-part=\"code\"\n      data-gds-reveal={reveal}\n      data-gds-trigger={trigger}\n      data-gds-size={size}\n      className={cn(\n        \"gds-code relative w-full overflow-hidden\",\n        SIZE_CLASS[size],\n        !bare && [\n          \"rounded-lg border bg-[var(--gds-code-bg)] text-[var(--gds-code-fg)]\",\n          \"border-border/60\",\n        ],\n        className,\n      )}\n      style={style}\n      {...rest}\n    >\n      {filename && !bare ? (\n        <div\n          data-gds-part=\"code-header\"\n          className=\"flex items-center justify-between border-b border-border/60 px-4 py-2 text-xs text-muted-foreground\"\n        >\n          <span className=\"font-mono\">{filename}</span>\n          {language ? (\n            <span className=\"uppercase tracking-wider opacity-60\">{language}</span>\n          ) : null}\n        </div>\n      ) : null}\n\n      <Highlight code={code} language={language} theme={cssVarTheme}>\n        {({ tokens, getLineProps, getTokenProps }) => (\n          <pre\n            data-gds-part=\"code-pre\"\n            className={cn(\n              \"font-mono leading-relaxed\",\n              bare ? \"p-0\" : \"px-0 py-3\",\n              wrap ? \"whitespace-pre-wrap break-words\" : \"overflow-x-auto whitespace-pre\",\n              // When a fixed height / maxLines is set the pre needs\n              // vertical scroll too — otherwise overflowing lines just\n              // get clipped invisibly.\n              (height !== undefined || maxLines !== undefined) && \"overflow-y-auto\",\n            )}\n            style={{\n              background: \"transparent\",\n              margin: 0,\n              // maxLines wins over height. `1lh` is the line-height of\n              // the current font — supported in all evergreen browsers.\n              // Add a small allowance for vertical padding so the last\n              // line isn't clipped by the bare-mode `p-0`.\n              ...(maxLines !== undefined\n                ? { height: `calc(${maxLines} * 1lh + 0.5rem)` }\n                : height !== undefined && height !== \"auto\"\n                  ? {\n                      height:\n                        typeof height === \"number\" ? `${height}px` : height,\n                    }\n                  : null),\n            }}\n          >\n            {tokens.map((line, lineIndex) => {\n              const lineNumber = lineIndex + 1;\n              const kind = kindForLine(lineNumber, diff, highlightSet);\n              const lineProps = getLineProps({ line });\n              const isLastLine = lineIndex === tokens.length - 1;\n              const isOutputLine = stepsActive && outputLineSet.has(lineNumber);\n              // Cursor renders only on the last visible line, and only\n              // while the reveal is in flight (or always, if the\n              // consumer opted in via `cursor={true}` on a static\n              // block).\n              const renderCursorHere =\n                showCursor && isLastLine && (!revealComplete || cursor === true);\n\n              const baseLineClass = cn(\n                \"flex w-full pr-4\",\n                bare ? \"pl-0\" : \"pl-4\",\n                kind === \"added\" &&\n                  \"bg-[var(--gds-code-diff-added-bg)] text-[var(--gds-code-diff-added-fg)]\",\n                kind === \"removed\" &&\n                  \"bg-[var(--gds-code-diff-removed-bg)] text-[var(--gds-code-diff-removed-fg)]\",\n                kind === \"highlight\" &&\n                  \"bg-[var(--gds-code-line-highlight-bg)] shadow-[inset_2px_0_0_0_var(--gds-code-line-highlight-marker)]\",\n              );\n\n              const lineContent = (\n                <>\n                  {showGutter ? (\n                    <span\n                      data-gds-part=\"code-gutter\"\n                      className={cn(\n                        \"select-none pr-3 text-right font-mono text-xs leading-relaxed opacity-60\",\n                        hasDiff ? \"w-10\" : \"w-8\",\n                      )}\n                      aria-hidden\n                    >\n                      {hasDiff ? (\n                        <span className=\"inline-block w-3 text-center\">\n                          {kind === \"added\" ? \"+\" : kind === \"removed\" ? \"-\" : \" \"}\n                        </span>\n                      ) : null}\n                      {showLineNumbers ? (\n                        <span className=\"ml-1 tabular-nums\">{lineNumber}</span>\n                      ) : null}\n                    </span>\n                  ) : null}\n\n                  <span\n                    className=\"flex-1\"\n                    // Output lines (step machine) render in the muted\n                    // comment colour so command output reads visually\n                    // distinct from prompted input.\n                    style={isOutputLine ? { color: \"var(--gds-code-comment)\" } : undefined}\n                  >\n                    {prompt && !isOutputLine ? (\n                      // Prompt chars render as chrome — muted token\n                      // colour, never animated, hidden from screen\n                      // readers so they don't read `$ $ $` on a five-\n                      // line bash session. Output lines suppress the\n                      // prompt (they're not commands the user typed).\n                      <span\n                        data-gds-part=\"code-prompt\"\n                        aria-hidden\n                        className=\"select-none opacity-60\"\n                        style={{ color: \"var(--gds-code-comment)\" }}\n                      >\n                        {prompt}\n                      </span>\n                    ) : null}\n                    {reveal === \"typewriter\" && shouldPlay && !stepsActive ? (\n                      <TypewriterLine\n                        line={line}\n                        getTokenProps={getTokenProps}\n                        delay={intrinsicDelay + resolvedDelay + lineIndex * perLineStagger}\n                        stagger={perLineStagger}\n                      />\n                    ) : (\n                      line.map((token, key) => (\n                        <span key={key} {...getTokenProps({ token })} />\n                      ))\n                    )}\n                    {renderCursorHere && !isOutputLine ? (\n                      <BlinkingCursor data-gds-part=\"code-cursor\" />\n                    ) : null}\n                  </span>\n                </>\n              );\n\n              // `reveal=\"none\"` (or `typewriter` — handled at the line\n              // level) renders a plain row; `lines`/`diff` wrap each\n              // row in motion.div for the staggered entry.\n              if (\n                reveal === \"none\" ||\n                reveal === \"typewriter\" ||\n                stepsActive ||\n                !shouldPlay\n              ) {\n                return (\n                  <div\n                    key={lineIndex}\n                    {...lineProps}\n                    className={cn(lineProps.className, baseLineClass)}\n                    // For inView trigger, keep lines hidden until the\n                    // observer flips. Without this they pop in at 0\n                    // opacity → 1 with a perceptible flash.\n                    style={{\n                      ...lineProps.style,\n                      opacity:\n                        trigger !== \"mount\" && !shouldPlay && reveal !== \"none\"\n                          ? 0\n                          : undefined,\n                    }}\n                  >\n                    {lineContent}\n                  </div>\n                );\n              }\n\n              return (\n                <motion.div\n                  key={lineIndex}\n                  {...lineProps}\n                  className={cn(lineProps.className, baseLineClass)}\n                  initial={{\n                    opacity: 0,\n                    y: reveal === \"diff\" ? (kind === \"removed\" ? -4 : 6) : 4,\n                  }}\n                  animate={{ opacity: 1, y: 0 }}\n                  transition={{\n                    delay: (intrinsicDelay + resolvedDelay + lineIndex * perLineStagger) / 1000,\n                    // Per-line fade duration scales with the speed\n                    // preset (slow = 480ms, normal = 280, fast = 160).\n                    // Without this the line stagger could push 200ms\n                    // apart while each line still resolved in 280ms —\n                    // they bunched up because the tail of line N was\n                    // still fading in when line N+1 started.\n                    duration: preset.fadeMs / 1000,\n                    ease: [0.22, 1, 0.36, 1],\n                  }}\n                  style={lineProps.style}\n                >\n                  {lineContent}\n                </motion.div>\n              );\n            })}\n          </pre>\n        )}\n      </Highlight>\n    </div>\n  );\n});\n\nCode.displayName = \"Code\";\n\n// ─── Typewriter renderer ─────────────────────────────────────────────\n//\n// Walks the prism token stream for a single line and reveals tokens one\n// at a time. Whitespace-only tokens come through \"free\" (no animation\n// delay) so leading indentation doesn't feel like dead time. Animation\n// is per-token rather than per-character — keeps the DOM count sane on\n// long blocks and still reads as a typewriter at sensible cadences.\n\ninterface TypewriterLineProps {\n  line: Array<{ types: string[]; content: string; empty?: boolean }>;\n  getTokenProps: (args: { token: { types: string[]; content: string; empty?: boolean } }) => Record<string, unknown>;\n  delay: number;\n  stagger: number;\n}\n\nfunction TypewriterLine({ line, getTokenProps, delay, stagger }: TypewriterLineProps) {\n  // Count the substantive tokens — whitespace doesn't get its own\n  // animation slot. Otherwise indented blocks (2-4 spaces of leading\n  // whitespace per line) double the perceived duration of the reveal.\n  let tokenSlot = 0;\n  return (\n    <>\n      {line.map((token, key) => {\n        const isWhitespace = /^\\s*$/.test(token.content);\n        const props = getTokenProps({ token });\n        if (isWhitespace) {\n          return <span key={key} {...props} />;\n        }\n        const slot = tokenSlot++;\n        return (\n          <motion.span\n            key={key}\n            {...props}\n            initial={{ opacity: 0 }}\n            animate={{ opacity: 1 }}\n            transition={{\n              delay: (delay + slot * stagger) / 1000,\n              duration: 0.12,\n            }}\n          />\n        );\n      })}\n    </>\n  );\n}\n\nexport { Code };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\n/**\n * Message — the canonical \"avatar + author + timestamp + body\" row.\n *\n * THE primitive for any chat message, comment, post-reply, activity-log\n * entry, or notification row that follows the people-and-text shape.\n * Surfaced after three scaffolds (chat, comments, hero preview) all\n * re-rolled the same flex layout inline — that was the signal.\n *\n * Slot-based composition for the avatar so consumers pass whatever\n * Avatar variant fits their surface (sized, toned, image, fallback).\n * Message doesn't pick an Avatar shape for you — it just hosts.\n *\n *   <Message\n *     author=\"alice\"\n *     timestamp=\"11:24\"\n *     avatar={\n *       <Avatar size=\"sm\">\n *         <AvatarFallback tone=\"violet\">A</AvatarFallback>\n *       </Avatar>\n *     }\n *   >\n *     Post copy is in the doc.\n *   </Message>\n *\n * For \"your messages right-aligned\" chat surfaces (iMessage / WhatsApp\n * / your own DM threads), pass `align=\"end\"` and the row + content\n * mirror.\n *\n * Anti-patterns to avoid (caught from real scaffold use):\n *\n *   - Don't roll a custom \"AuthorDot\" inline — Avatar with\n *     <AvatarFallback tone=\"...\"> covers the colored-initials case\n *     cleanly and stays themable.\n *   - Don't use Message for non-people activity (system events,\n *     log lines). Reach for Callout or a plain Row.\n */\n\nexport interface MessageProps\n  extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n  /** Display name of the message author. */\n  author: string;\n  /**\n   * Timestamp string (\"11:24\", \"2 hours ago\") OR any node for custom\n   * formatting (tooltip-wrapped time, link to permalink, etc).\n   */\n  timestamp?: React.ReactNode;\n  /**\n   * Avatar slot. Pass any `<Avatar>` composition. When omitted, the\n   * row renders without an avatar column — handy for grouped messages\n   * from the same author where only the first row shows the avatar.\n   */\n  avatar?: React.ReactNode;\n  /**\n   * Small chip(s) next to the author name. Use for \"OP\", \"Bot\",\n   * \"Admin\", or any role/state badge that belongs in the header\n   * rhythm rather than the body.\n   */\n  badge?: React.ReactNode;\n  /**\n   * Editing state — renders an \"(edited)\" hint next to the timestamp.\n   * Pass a string to customise the label (e.g. \"(edited 2 minutes ago)\").\n   */\n  edited?: boolean | string;\n  /**\n   * Pinned state — renders a small pin glyph at the top of the row.\n   * Surfaces \"this is a sticky / pinned message\" in Slack-style feeds.\n   */\n  pinned?: boolean;\n  /**\n   * End-of-header slot. Common use: a hover-revealed Row of small\n   * icon buttons (reply / react / pin / more). Pushed to the right\n   * with `ml-auto`.\n   */\n  actions?: React.ReactNode;\n  /**\n   * Reactions slot — renders below the body. Typically a Row of\n   * reaction chips (emoji + count). Hidden when no node is passed.\n   */\n  reactions?: React.ReactNode;\n  /**\n   * Thread / reply count — renders a \"N replies\" link affordance\n   * below the body. Click handler is the consumer's responsibility.\n   * Wire `onThreadClick` if you want the built-in button to fire.\n   */\n  threadCount?: number;\n  /** Fires when the built-in \"N replies\" affordance is clicked. */\n  onThreadClick?: () => void;\n  /**\n   * Visual alignment. `start` (default) puts the avatar on the left\n   * — the standard chat / comment shape. `end` mirrors the row so the\n   * avatar sits on the right and the content right-aligns — use for\n   * \"your messages\" in DM threads.\n   */\n  align?: \"start\" | \"end\";\n  /**\n   * Row rhythm. `default` is the canonical chat / channel-feed shape.\n   * `compact` tightens text sizes + gaps for dense side-panel use\n   * (Studio comments tab, activity feeds, notification rows where many\n   * rows stack vertically and the surface is narrow). Avatar size is\n   * still consumer-controlled — pair `density=\"compact\"` with\n   * `Avatar size=\"xs\"` for the tightest rhythm.\n   */\n  density?: \"default\" | \"compact\";\n  /**\n   * Body content (the message text). Accepts any node so consumers\n   * can embed rich content — Markdown-rendered prose, images,\n   * embedded cards, etc. Plain text is the common case.\n   */\n  children: React.ReactNode;\n}\n\n/**\n * Density styling lookup. Keeping the deltas centralised here makes\n * the variant matrix legible at a glance — one row per slot, two\n * columns for the two densities. Add a third density later by adding\n * a column, not by sprinkling more ternaries through the JSX.\n *\n * Compact deltas are calibrated for Studio's side panels (~20rem\n * wide) and dense activity feeds: roughly a notch down on every\n * typographic axis, gaps tightened by 1 step. Avatar size is NOT\n * touched — that's the consumer's call (Avatar size=\"xs\" pairs well\n * with density=\"compact\").\n */\nconst DENSITY = {\n  default: {\n    row: \"gap-3\",\n    content: \"space-y-1\",\n    author: \"text-sm font-semibold\",\n    meta: \"text-xs\",\n    body: \"text-sm leading-relaxed\",\n    thread: \"text-xs\",\n  },\n  compact: {\n    row: \"gap-2\",\n    content: \"space-y-0.5\",\n    author: \"text-xs font-semibold\",\n    meta: \"text-[10px]\",\n    body: \"text-xs leading-relaxed\",\n    thread: \"text-[11px]\",\n  },\n} as const;\n\nexport const Message = React.forwardRef<HTMLDivElement, MessageProps>(\n  function Message(\n    {\n      author,\n      timestamp,\n      avatar,\n      badge,\n      edited,\n      pinned,\n      actions,\n      reactions,\n      threadCount,\n      onThreadClick,\n      align = \"start\",\n      density = \"default\",\n      className,\n      children,\n      ...rest\n    },\n    ref,\n  ) {\n    const isEnd = align === \"end\";\n    const editedLabel = edited === true ? \"(edited)\" : edited || undefined;\n    const d = DENSITY[density];\n\n    return (\n      <div\n        ref={ref}\n        data-gds-part=\"message\"\n        data-gds-align={align}\n        data-gds-density={density}\n        data-gds-pinned={pinned ? \"true\" : undefined}\n        className={cn(\n          \"flex items-start\",\n          d.row,\n          isEnd && \"flex-row-reverse\",\n          className,\n        )}\n        {...rest}\n      >\n        {avatar && (\n          <div\n            data-gds-part=\"message-avatar\"\n            className=\"flex-shrink-0\"\n          >\n            {avatar}\n          </div>\n        )}\n        <div\n          data-gds-part=\"message-content\"\n          className={cn(\n            \"flex-1 min-w-0\",\n            d.content,\n            isEnd && \"text-right\",\n          )}\n        >\n          {pinned && (\n            <div\n              data-gds-part=\"message-pinned\"\n              className={cn(\n                \"flex items-center gap-1 text-[10px] uppercase tracking-wider text-muted-foreground\",\n                isEnd && \"flex-row-reverse\",\n              )}\n            >\n              <svg\n                aria-hidden=\"true\"\n                viewBox=\"0 0 16 16\"\n                className=\"h-3 w-3\"\n                fill=\"currentColor\"\n              >\n                <path d=\"M9.828.722a.5.5 0 0 1 .707 0l4.743 4.743a.5.5 0 0 1 0 .707l-2.121 2.121a.5.5 0 0 1-.354.146h-1.792l-3.586 3.586v2.293a.5.5 0 0 1-.854.354L4.146 12.39 1 15.535V14.12l3.146-3.146-1.293-1.293a.5.5 0 0 1 .354-.854h2.293l3.586-3.586V3.45a.5.5 0 0 1 .146-.354L9.828.722Z\" />\n              </svg>\n              Pinned\n            </div>\n          )}\n          <div\n            data-gds-part=\"message-header\"\n            className={cn(\n              \"flex items-baseline gap-2 flex-wrap\",\n              isEnd && \"flex-row-reverse\",\n            )}\n          >\n            <span\n              data-gds-part=\"message-author\"\n              className={d.author}\n            >\n              {author}\n            </span>\n            {badge && (\n              <div data-gds-part=\"message-badge\">{badge}</div>\n            )}\n            {timestamp && (\n              <span\n                data-gds-part=\"message-timestamp\"\n                className={cn(d.meta, \"text-muted-foreground\")}\n              >\n                {timestamp}\n              </span>\n            )}\n            {editedLabel && (\n              <span\n                data-gds-part=\"message-edited\"\n                className={cn(d.meta, \"text-muted-foreground\")}\n              >\n                {editedLabel}\n              </span>\n            )}\n            {actions && (\n              <div\n                data-gds-part=\"message-actions\"\n                className={cn(isEnd ? \"mr-auto\" : \"ml-auto\")}\n              >\n                {actions}\n              </div>\n            )}\n          </div>\n          <div\n            data-gds-part=\"message-body\"\n            className={d.body}\n          >\n            {children}\n          </div>\n          {reactions && (\n            <div\n              data-gds-part=\"message-reactions\"\n              className={cn(\n                \"flex flex-wrap gap-1 pt-1\",\n                isEnd && \"justify-end\",\n              )}\n            >\n              {reactions}\n            </div>\n          )}\n          {typeof threadCount === \"number\" && threadCount > 0 && (\n            <button\n              type=\"button\"\n              data-gds-part=\"message-thread\"\n              onClick={onThreadClick}\n              className={cn(\n                \"inline-flex items-center gap-1 font-medium\",\n                d.thread,\n                \"text-primary hover:underline\",\n                \"focus:outline-none focus-visible:ring-2 focus-visible:ring-primary rounded\",\n                isEnd && \"flex-row-reverse\",\n              )}\n            >\n              <svg\n                aria-hidden=\"true\"\n                viewBox=\"0 0 16 16\"\n                className=\"h-3 w-3\"\n                fill=\"currentColor\"\n              >\n                <path d=\"M2 3a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v6a1 1 0 0 1-1 1H6.414l-2.707 2.707A1 1 0 0 1 2 12V3Z\" />\n              </svg>\n              {threadCount} {threadCount === 1 ? \"reply\" : \"replies\"}\n            </button>\n          )}\n        </div>\n      </div>\n    );\n  },\n);\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\"\n\nimport { cn } from \"@/lib/utils\"\nimport { SURFACE_CLASS, surfaceBg, type Surface } from \"@/lib/surface\"\n\nconst Popover = PopoverPrimitive.Root\n\nconst PopoverTrigger = PopoverPrimitive.Trigger\n\nconst PopoverAnchor = PopoverPrimitive.Anchor\n\nexport interface PopoverContentProps\n  extends React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content> {\n  /**\n   * What the popover surface is *made of*. Defaults to `solid`\n   * (`bg-popover`). `translucent` is the Apple HIG menu-sheet feel.\n   * `glass` for floating panels over rich canvases.\n   */\n  surface?: Surface\n}\n\nconst PopoverContent = React.forwardRef<\n  React.ElementRef<typeof PopoverPrimitive.Content>,\n  PopoverContentProps\n>(({ className, align = \"center\", sideOffset = 4, surface = \"solid\", ...props }, ref) => (\n  <PopoverPrimitive.Portal>\n    <PopoverPrimitive.Content\n      ref={ref}\n      align={align}\n      sideOffset={sideOffset}\n      data-surface={surface}\n      className={cn(\n        \"z-50 w-72 rounded-md border 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        surfaceBg(surface, \"bg-popover\"),\n        SURFACE_CLASS[surface],\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            \"h-9 w-[280px] justify-start text-left text-base font-normal md:text-sm 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            \"h-9 w-[300px] justify-start text-left text-base font-normal md:text-sm 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\"\nimport { SURFACE_CLASS, surfaceBg, type Surface } from \"@/lib/surface\"\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      // SCRIM (Ali, 11 Aug): lifted from /90 to /80. At /90 the page\n      // behind was all but gone, which read as a page transition rather\n      // than a panel over the page. /80 still carries the focus but\n      // leaves the backdrop legible. Dial this, not a per-dialog\n      // className: the scrim is one decision for the whole system.\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\nexport interface DialogContentProps\n  extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> {\n  /**\n   * What the dialog surface is *made of*. Composes with the overlay\n   * scrim — see PRESENCE.md and dialog.md for scenarios.\n   *\n   * - `solid` (default): opaque `bg-background`.\n   * - `translucent`: ~82% opacity, no blur — \"presence without drama\".\n   * - `glass`: 58% opacity + 14px blur + edge highlight. The page\n   *   underneath shows through softly.\n   * - `glass-strong`: 42% opacity + 24px blur. For dialogs that should\n   *   feel like an overlay rather than a panel.\n   */\n  surface?: Surface\n  /**\n   * How the panel is shaped on small screens.\n   *\n   * - `sheet` (default): a full-screen sheet below `sm`, its padding\n   *   clearing the device safe areas, content scrolling. The right\n   *   shape for forms and flows — there is more to do than read.\n   * - `center`: the centred card at every width. Use for short\n   *   confirmations and for anything the user cannot dismiss (a\n   *   full-screen non-dismissable sheet is a trap on a phone).\n   *\n   * From `sm` up the two are identical.\n   */\n  layout?: \"sheet\" | \"center\"\n  /** Render the built-in close button. Set false when the dialog owns\n   *  its own dismissal (or deliberately has none). */\n  showClose?: boolean\n  /** Draw the hairline outline around the panel. Default true, which is\n   *  the long-standing look. Set false on dark, high-contrast surfaces\n   *  where the shadow and the panel's own background already separate it\n   *  from the page and the outline reads as an artefact. */\n  bordered?: boolean\n}\n\nconst DialogContent = React.forwardRef<\n  React.ElementRef<typeof DialogPrimitive.Content>,\n  DialogContentProps\n>(\n  (\n    {\n      className,\n      children,\n      surface = \"solid\",\n      layout = \"sheet\",\n      showClose = true,\n      bordered = true,\n      ...props\n    },\n    ref\n  ) => (\n    <DialogPortal>\n      <DialogOverlay />\n      {/* Below sm the panel is a full-screen sheet whose padding clears\n          the device safe areas; from sm up it is the centred card. It\n          enters in place (fade + scale from its own centre) — it used\n          to slide in from the top-left on top of the centring\n          transform, which read as flying in from the corner. Keep the\n          base classes as ONE string: the contract generator extracts\n          styleDefaults from a single literal. */}\n      <DialogPrimitive.Content\n        ref={ref}\n        data-surface={surface}\n        data-layout={layout}\n        className={cn(\n          \"fixed inset-0 z-50 grid content-start gap-4 overflow-y-auto p-6 pt-[max(1.5rem,env(safe-area-inset-top))] pb-[max(1.5rem,env(safe-area-inset-bottom))] shadow-lg duration-200 sm:inset-auto sm:left-1/2 sm:top-1/2 sm:h-auto sm:max-h-[85dvh] sm:w-full sm:max-w-lg sm:-translate-x-1/2 sm:-translate-y-1/2 sm:rounded-xl sm:p-8 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=open]:fade-in-0 data-[state=closed]:fade-out-0 data-[state=open]:zoom-in-95 data-[state=closed]:zoom-out-95\",\n          layout === \"center\" &&\n            \"inset-auto left-1/2 top-1/2 h-auto max-h-[85dvh] w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 rounded-xl\",\n          bordered && \"border\",\n          surfaceBg(surface, \"bg-background\"),\n          SURFACE_CLASS[surface],\n          className\n        )}\n        {...props}\n      >\n        {children}\n        {showClose && (\n          <DialogPrimitive.Close className=\"absolute right-4 top-4 inline-flex size-9 items-center justify-center rounded-full text-muted-foreground opacity-80 transition-colors hover:bg-muted hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:ring-offset-background disabled:pointer-events-none sm:right-6 sm:top-6\">\n            <X className=\"size-5\" />\n            <span className=\"sr-only\">Close</span>\n          </DialogPrimitive.Close>\n        )}\n      </DialogPrimitive.Content>\n    </DialogPortal>\n  )\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\"\nimport { SURFACE_CLASS, surfaceBg, type Surface } from \"@/lib/surface\"\n\nconst DropdownMenu = DropdownMenuPrimitive.Root\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\n\n/**\n * Menu density. Set `size` on `<DropdownMenuContent>` (or\n * `<DropdownMenuSubContent>`) and every item inside — Item, Checkbox,\n * Radio, SubTrigger, Label — picks up matching padding / text-size via\n * context (which flows through the Radix portal). Mirrors Select so a\n * compact trigger can have an equally compact menu. `xs` is the\n * tool-panel density (the Studio inspector).\n */\ntype DropdownMenuSize = \"default\" | \"sm\" | \"xs\"\nconst DropdownMenuSizeContext = React.createContext<DropdownMenuSize>(\"default\")\nconst ddItemBase = (size: DropdownMenuSize) =>\n  size === \"default\" ? \"px-2 py-1.5 text-sm\" : \"px-2 py-1 text-xs\"\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  const size = React.useContext(DropdownMenuSizeContext)\n  return (\n  <DropdownMenuPrimitive.SubTrigger\n    ref={ref}\n    className={cn(\n      // transition + accent-foreground pair MUST match DropdownMenuItem's\n      // hover treatment — SubTrigger previously set only the accent bg,\n      // leaving default (near-black) text on hover while sibling items\n      // flipped to accent-foreground (caught by Ali, 2026-06-11).\n      \"flex cursor-default select-none items-center gap-2 rounded-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground focus:[&_svg]:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n      ddItemBase(size),\n      size === \"default\" ? \"[&_svg]:size-4\" : \"[&_svg]:size-3.5\",\n      inset && (size === \"default\" ? \"pl-8\" : \"pl-7\"),\n      className\n    )}\n    {...props}\n  >\n    {children}\n    <ChevronRight className=\"ml-auto\" />\n  </DropdownMenuPrimitive.SubTrigger>\n  )\n})\nDropdownMenuSubTrigger.displayName =\n  DropdownMenuPrimitive.SubTrigger.displayName\n\nexport interface DropdownMenuSubContentProps\n  extends React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent> {\n  /** What the submenu surface is *made of*. See dropdown-menu.md. */\n  surface?: Surface\n  /** Menu density — cascades to items via context. */\n  size?: DropdownMenuSize\n}\n\nconst DropdownMenuSubContent = React.forwardRef<\n  React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n  DropdownMenuSubContentProps\n>(({ className, surface = \"solid\", size = \"default\", children, ...props }, ref) => (\n  <DropdownMenuPrimitive.SubContent\n    ref={ref}\n    data-surface={surface}\n    className={cn(\n      \"z-50 min-w-[8rem] overflow-hidden rounded-md border 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      size === \"default\" ? \"p-1\" : \"p-0.5\",\n      surfaceBg(surface, \"bg-popover\"),\n      SURFACE_CLASS[surface],\n      className\n    )}\n    {...props}\n  >\n    <DropdownMenuSizeContext.Provider value={size}>\n      {children}\n    </DropdownMenuSizeContext.Provider>\n  </DropdownMenuPrimitive.SubContent>\n))\nDropdownMenuSubContent.displayName =\n  DropdownMenuPrimitive.SubContent.displayName\n\nexport interface DropdownMenuContentProps\n  extends React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content> {\n  /**\n   * What the menu surface is *made of*. `solid` (default) is `bg-popover`.\n   * `translucent` matches Apple HIG / iOS menu sheets. `glass` for menus\n   * floating over rich canvases. See dropdown-menu.md.\n   */\n  surface?: Surface\n  /** Menu density — cascades to items via context. */\n  size?: DropdownMenuSize\n}\n\nconst DropdownMenuContent = React.forwardRef<\n  React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n  DropdownMenuContentProps\n>(({ className, sideOffset = 4, surface = \"solid\", size = \"default\", children, ...props }, ref) => (\n  <DropdownMenuPrimitive.Portal>\n    <DropdownMenuPrimitive.Content\n      ref={ref}\n      sideOffset={sideOffset}\n      data-surface={surface}\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 text-popover-foreground shadow-md\",\n        size === \"default\" ? \"p-1\" : \"p-0.5\",\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        surfaceBg(surface, \"bg-popover\"),\n        SURFACE_CLASS[surface],\n        className\n      )}\n      {...props}\n    >\n      <DropdownMenuSizeContext.Provider value={size}>\n        {children}\n      </DropdownMenuSizeContext.Provider>\n    </DropdownMenuPrimitive.Content>\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  const size = React.useContext(DropdownMenuSizeContext)\n  return (\n  <DropdownMenuPrimitive.Item\n    ref={ref}\n    className={cn(\n      \"relative flex cursor-default select-none items-center gap-2 rounded-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground focus:[&_svg]:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&>svg]:shrink-0\",\n      ddItemBase(size),\n      size === \"default\" ? \"[&>svg]:size-4\" : \"[&>svg]:size-3.5\",\n      inset && (size === \"default\" ? \"pl-8\" : \"pl-7\"),\n      className\n    )}\n    {...props}\n  />\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  const size = React.useContext(DropdownMenuSizeContext)\n  const compact = size !== \"default\"\n  return (\n  <DropdownMenuPrimitive.CheckboxItem\n    ref={ref}\n    className={cn(\n      \"relative flex cursor-default select-none items-center rounded-sm pr-2 outline-none transition-colors focus:bg-accent focus:text-accent-foreground focus:[&_svg]:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n      compact ? \"py-1 pl-7 text-xs\" : \"py-1.5 pl-8 text-sm\",\n      className\n    )}\n    checked={checked}\n    {...props}\n  >\n    <span\n      className={cn(\n        \"absolute flex items-center justify-center\",\n        compact ? \"left-1.5 h-3 w-3\" : \"left-2 h-3.5 w-3.5\",\n      )}\n    >\n      <DropdownMenuPrimitive.ItemIndicator>\n        <Check className={compact ? \"h-3 w-3\" : \"h-4 w-4\"} />\n      </DropdownMenuPrimitive.ItemIndicator>\n    </span>\n    {children}\n  </DropdownMenuPrimitive.CheckboxItem>\n  )\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  const size = React.useContext(DropdownMenuSizeContext)\n  const compact = size !== \"default\"\n  return (\n  <DropdownMenuPrimitive.RadioItem\n    ref={ref}\n    className={cn(\n      \"relative flex cursor-default select-none items-center rounded-sm pr-2 outline-none transition-colors focus:bg-accent focus:text-accent-foreground focus:[&_svg]:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n      compact ? \"py-1 pl-7 text-xs\" : \"py-1.5 pl-8 text-sm\",\n      className\n    )}\n    {...props}\n  >\n    <span\n      className={cn(\n        \"absolute flex items-center justify-center\",\n        compact ? \"left-1.5 h-3 w-3\" : \"left-2 h-3.5 w-3.5\",\n      )}\n    >\n      <DropdownMenuPrimitive.ItemIndicator>\n        <Circle className=\"h-2 w-2 fill-current\" />\n      </DropdownMenuPrimitive.ItemIndicator>\n    </span>\n    {children}\n  </DropdownMenuPrimitive.RadioItem>\n  )\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  const size = React.useContext(DropdownMenuSizeContext)\n  return (\n  <DropdownMenuPrimitive.Label\n    ref={ref}\n    className={cn(\n      \"font-semibold\",\n      size === \"default\" ? \"px-2 py-1.5 text-sm\" : \"px-2 py-1 text-xs\",\n      inset && (size === \"default\" ? \"pl-8\" : \"pl-7\"),\n      className\n    )}\n    {...props}\n  />\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\";\nimport { Eye as EyeIcon, EyeOff } from \"lucide-react\";\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 bg-transparent transition-colors file:border-0 file:bg-transparent file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50\",\n  {\n    variants: {\n      size: {\n        // Prominent single-value fields — an amount in a dialog, a\n        // first field on a marketing form. Stays text-base at every\n        // width: it is the thing being read, and 16px keeps iOS from\n        // zooming on focus.\n        lg: \"h-11 pl-4 pr-4 py-2 text-base file:text-sm\",\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-sm file:text-xs\",\n        // Figma-density — tool panels (the Studio inspector). shadow-none\n        // so they sit flush with SelectTrigger (no drop shadow) — every\n        // field in a dense panel should read identically.\n        xs: \"h-7 pl-2 pr-2 py-0 text-xs file:text-xs shadow-none\",\n        // 2xs: h-6 (24px) — densest tool-panel input. rounded-lg + the\n        // tighter leading edge mirror SelectTrigger's 2xs so mixed\n        // field rows read identically.\n        \"2xs\": \"h-6 rounded-lg pl-1.5 pr-2 py-0 text-2xs file:text-2xs shadow-none\",\n      },\n      // `ghost` is the borderless inline-edit field — a value that reads as\n      // plain text until focused (inspector readouts, the path bar). No\n      // border, no shadow; the focus ring still confirms edit mode.\n      variant: {\n        default: \"border border-input dark:bg-input/30\",\n        ghost: \"border border-transparent bg-transparent shadow-none\",\n      },\n    },\n    defaultVariants: { size: \"default\", variant: \"default\" },\n  }\n);\n\ntype InputSize = NonNullable<VariantProps<typeof inputVariants>[\"size\"]>;\n\ntype InputVariant = NonNullable<VariantProps<typeof inputVariants>[\"variant\"]>;\n\ntype InputProps = Omit<React.ComponentProps<\"input\">, \"size\"> & {\n  size?: InputSize;\n  variant?: InputVariant;\n  /** Adornment rendered inside the field on the leading edge — an icon,\n   *  a unit, a prefix. Non-interactive by default (clicks pass through\n   *  to focus the input); pass an element with its own pointer-events\n   *  if you need it clickable. */\n  startSlot?: React.ReactNode;\n  /** Adornment rendered inside the field on the trailing edge — a unit\n   *  (\"px\"), a clear button, a stepper. Same pointer rules as\n   *  `startSlot`. */\n  endSlot?: React.ReactNode;\n  /**\n   * Add the show/hide eye toggle to a `type=\"password\"` field.\n   *\n   * Lives here rather than as a separate PasswordInput, or as an eye\n   * button hand-composed at each call site, because every password field\n   * in every product wants the same affordance and the same a11y\n   * labelling. One prop means a form gets it by typing one word.\n   *\n   * Ignored unless `type=\"password\"`: on any other type there is nothing\n   * to reveal, and silently swapping a field's type would be worse than\n   * doing nothing. Revealing swaps the rendered type to \"text\", which is\n   * what every browser password manager expects.\n   *\n   * Composes with `endSlot`: the consumer's adornment renders first and\n   * the toggle sits outermost, so a field can carry both a unit and a\n   * reveal without the two fighting for the same corner.\n   */\n  revealable?: boolean;\n};\n\n// Reserved space + adornment inset per size, so the text never collides\n// with a slot. Consumers can still override via `className` (twMerge\n// lets a later pl-*/pr-* win) for extra-tight cases.\nconst SLOT_PADDING: Record<\n  InputSize,\n  { startPad: string; endPad: string; startInset: string; endInset: string }\n> = {\n  lg: { startPad: \"pl-11\", endPad: \"pr-11\", startInset: \"pl-4\", endInset: \"pr-4\" },\n  default: { startPad: \"pl-9\", endPad: \"pr-9\", startInset: \"pl-3\", endInset: \"pr-3\" },\n  sm: { startPad: \"pl-7\", endPad: \"pr-6\", startInset: \"pl-2\", endInset: \"pr-2\" },\n  xs: { startPad: \"pl-6\", endPad: \"pr-5\", startInset: \"pl-2\", endInset: \"pr-2\" },\n  \"2xs\": { startPad: \"pl-6\", endPad: \"pr-5\", startInset: \"pl-1.5\", endInset: \"pr-2\" },\n};\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n  (\n    {\n      className,\n      type,\n      size = \"default\",\n      variant = \"default\",\n      startSlot,\n      endSlot: endSlotProp,\n      revealable = false,\n      ...props\n    },\n    ref,\n  ) => {\n    const [revealed, setRevealed] = React.useState(false);\n    /* Only a password field has anything to reveal. Gating on the type\n       rather than on the prop alone means a stray `revealable` on a text\n       field renders nothing instead of a toggle that does nothing. */\n    const canReveal = revealable && type === \"password\";\n    const Eye = revealed ? EyeOff : EyeIcon;\n    const endSlot = canReveal ? (\n      <>\n        {endSlotProp}\n        {/* pointer-events-auto because the slot wrapper is\n            pointer-events-none by design (clicks pass through to focus\n            the field). type=\"button\" so it cannot submit the form it\n            sits in, which is the classic bug with an in-field toggle. */}\n        <button\n          type=\"button\"\n          onClick={() => setRevealed((v) => !v)}\n          className=\"pointer-events-auto -mr-1 inline-flex size-6 items-center justify-center rounded-md text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/50\"\n          aria-label={revealed ? \"Hide password\" : \"Show password\"}\n          aria-pressed={revealed}\n        >\n          <Eye aria-hidden=\"true\" />\n        </button>\n      </>\n    ) : (\n      endSlotProp\n    );\n    /* Revealing swaps the RENDERED type, which is what password managers\n       and screen readers key off; the caller's `type` prop is untouched,\n       so canReveal stays true while revealed. */\n    const renderedType = canReveal && revealed ? \"text\" : type;\n    if (!startSlot && !endSlot) {\n      return (\n        <input\n          type={renderedType}\n          className={cn(inputVariants({ size, variant }), className)}\n          ref={ref}\n          {...props}\n        />\n      );\n    }\n    const pad = SLOT_PADDING[size];\n    return (\n      <div className=\"relative flex w-full items-center\">\n        {startSlot ? (\n          <span\n            className={cn(\n              \"pointer-events-none absolute inset-y-0 left-0 flex items-center text-muted-foreground [&_svg]:size-3.5\",\n              pad.startInset,\n            )}\n          >\n            {startSlot}\n          </span>\n        ) : null}\n        <input\n          type={renderedType}\n          ref={ref}\n          className={cn(\n            inputVariants({ size, variant }),\n            startSlot && pad.startPad,\n            endSlot && pad.endPad,\n            className,\n          )}\n          {...props}\n        />\n        {endSlot ? (\n          <span\n            className={cn(\n              \"pointer-events-none absolute inset-y-0 right-0 flex items-center text-muted-foreground [&_svg]:size-3.5\",\n              pad.endInset,\n            )}\n          >\n            {endSlot}\n          </span>\n        ) : null}\n      </div>\n    );\n  }\n);\nInput.displayName = \"Input\";\n\nexport { Input };\n","import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"@/lib/utils\";\n\n/**\n * Textarea variants — `size` mirrors Input so the whole form-control\n * family scales together. Default keeps the existing min-h-[80px] /\n * px-3 / text-sm; `sm` and `xs` are for dense tool panels.\n */\nconst textareaVariants = cva(\n  \"flex w-full rounded-md border border-input bg-background dark:bg-input/30 placeholder:text-muted-foreground focus-visible:outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50\",\n  {\n    variants: {\n      size: {\n        default: \"min-h-[80px] px-3 py-2 text-sm\",\n        sm: \"min-h-[64px] px-2 py-1.5 text-sm\",\n        xs: \"min-h-[52px] px-2 py-1 text-xs\",\n        \"2xs\": \"min-h-[44px] px-2 py-1 text-2xs\",\n      },\n    },\n    defaultVariants: { size: \"default\" },\n  }\n);\n\ntype TextareaSize = NonNullable<VariantProps<typeof textareaVariants>[\"size\"]>;\n\ntype TextareaProps = Omit<React.ComponentProps<\"textarea\">, \"size\"> & {\n  size?: TextareaSize;\n};\n\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n  ({ className, size = \"default\", ...props }, ref) => {\n    return (\n      <textarea\n        className={cn(textareaVariants({ size }), className)}\n        ref={ref}\n        {...props}\n      />\n    );\n  }\n);\nTextarea.displayName = \"Textarea\";\n\nexport { Textarea };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\nimport { Button } from \"./button\";\nimport { Input } from \"./input\";\nimport { Textarea } from \"./textarea\";\n\n/**\n * InputGroup — 1:1 port of shadcn's Input Group family (same data-slots,\n * classes, and alignment variants) so a Figma frame named with these slots\n * maps straight onto the code.\n *\n *   <InputGroup>\n *     <InputGroupAddon><SearchIcon /></InputGroupAddon>\n *     <InputGroupInput placeholder=\"Search…\" />\n *     <InputGroupAddon align=\"inline-end\">\n *       <InputGroupButton>Go</InputGroupButton>\n *     </InputGroupAddon>\n *   </InputGroup>\n *\n * Addon alignment: inline-start / inline-end (sit beside the control) and\n * block-start / block-end (stack above/below — for textareas + toolbars).\n *\n * InputGroupButton is adapted to Grade's Button API (variant `ghost` by\n * default; height/padding driven by the group's own size classes).\n */\n\n/** The group's height scale, mirroring Input's own sizes. The size is\n *  shared with the control inside (see InputGroupInput), so\n *  `<InputGroup size=\"lg\">` is all a call site needs. */\ntype InputGroupSize = \"lg\" | \"default\" | \"sm\";\n\nconst INPUT_GROUP_HEIGHT: Record<InputGroupSize, string> = {\n  lg: \"h-11\",\n  default: \"h-9\",\n  sm: \"h-8\",\n};\n\nconst InputGroupSizeContext = React.createContext<InputGroupSize>(\"default\");\n\nfunction InputGroup({\n  className,\n  size = \"default\",\n  ...props\n}: React.ComponentProps<\"div\"> & { size?: InputGroupSize }) {\n  return (\n    <InputGroupSizeContext.Provider value={size}>\n    <div\n      data-slot=\"input-group\"\n      data-size={size}\n      role=\"group\"\n      className={cn(\n        \"group/input-group relative flex w-full items-center rounded-md border border-input shadow-xs transition-[color,box-shadow] outline-none dark:bg-input/30\",\n        INPUT_GROUP_HEIGHT[size],\n        \"min-w-0 has-[>textarea]:h-auto\",\n\n        // Variants based on alignment.\n        \"has-[>[data-align=inline-start]]:[&>input]:pl-2\",\n        \"has-[>[data-align=inline-end]]:[&>input]:pr-2\",\n        \"has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-start]]:[&>input]:pb-3\",\n        \"has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-3\",\n\n        // Focus state.\n        \"has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-[3px] has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50\",\n\n        // Error state.\n        \"has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-destructive/20 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40\",\n\n        className\n      )}\n      {...props}\n    />\n    </InputGroupSizeContext.Provider>\n  );\n}\n\nconst inputGroupAddonVariants = cva(\n  \"flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4\",\n  {\n    variants: {\n      align: {\n        \"inline-start\":\n          \"order-first pl-3 has-[>button]:ml-[-0.45rem] has-[>kbd]:ml-[-0.35rem]\",\n        \"inline-end\":\n          \"order-last pr-3 has-[>button]:mr-[-0.45rem] has-[>kbd]:mr-[-0.35rem]\",\n        \"block-start\":\n          \"order-first w-full justify-start px-3 pt-3 group-has-[>input]/input-group:pt-2.5 [.border-b]:pb-3\",\n        \"block-end\":\n          \"order-last w-full justify-start px-3 pb-3 group-has-[>input]/input-group:pb-2.5 [.border-t]:pt-3\",\n      },\n    },\n    defaultVariants: {\n      align: \"inline-start\",\n    },\n  }\n);\n\nfunction InputGroupAddon({\n  className,\n  align = \"inline-start\",\n  ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\n  return (\n    <div\n      role=\"group\"\n      data-slot=\"input-group-addon\"\n      data-align={align}\n      className={cn(inputGroupAddonVariants({ align }), className)}\n      onClick={(e) => {\n        if ((e.target as HTMLElement).closest(\"button\")) {\n          return;\n        }\n        e.currentTarget.parentElement?.querySelector(\"input\")?.focus();\n      }}\n      {...props}\n    />\n  );\n}\n\nconst inputGroupButtonVariants = cva(\n  \"flex items-center gap-2 text-sm shadow-none\",\n  {\n    variants: {\n      size: {\n        xs: \"h-6 gap-1 rounded-[calc(var(--radius)-5px)] px-2 has-[>svg]:px-2 [&>svg:not([class*='size-'])]:size-3.5\",\n        sm: \"h-8 gap-1.5 rounded-md px-2.5 has-[>svg]:px-2.5\",\n        \"icon-xs\": \"size-6 rounded-[calc(var(--radius)-5px)] p-0 has-[>svg]:p-0\",\n        \"icon-sm\": \"size-8 p-0 has-[>svg]:p-0\",\n      },\n    },\n    defaultVariants: {\n      size: \"xs\",\n    },\n  }\n);\n\nfunction InputGroupButton({\n  className,\n  type = \"button\",\n  variant = \"ghost\",\n  size = \"xs\",\n  ...props\n}: Omit<React.ComponentProps<typeof Button>, \"size\"> &\n  VariantProps<typeof inputGroupButtonVariants>) {\n  return (\n    <Button\n      type={type}\n      data-size={size}\n      variant={variant}\n      className={cn(inputGroupButtonVariants({ size }), className)}\n      {...props}\n    />\n  );\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n  return (\n    <span\n      className={cn(\n        \"flex items-center gap-2 text-sm text-muted-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction InputGroupInput({\n  className,\n  size,\n  ...props\n}: React.ComponentProps<typeof Input>) {\n  // Inherit the group's size so the control matches its shell; an\n  // explicit `size` on the control still wins.\n  const groupSize = React.useContext(InputGroupSizeContext);\n  return (\n    <Input\n      data-slot=\"input-group-control\"\n      size={size ?? groupSize}\n      className={cn(\n        \"flex-1 rounded-none border-0 bg-transparent shadow-none focus-visible:ring-0 dark:bg-transparent\",\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction InputGroupTextarea({\n  className,\n  ...props\n}: React.ComponentProps<typeof Textarea>) {\n  return (\n    <Textarea\n      data-slot=\"input-group-control\"\n      className={cn(\n        \"flex-1 resize-none rounded-none border-0 bg-transparent py-3 shadow-none focus-visible:ring-0 dark:bg-transparent\",\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nexport {\n  InputGroup,\n  InputGroupAddon,\n  InputGroupButton,\n  InputGroupText,\n  InputGroupInput,\n  InputGroupTextarea,\n};\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as ProgressPrimitive from \"@radix-ui/react-progress\";\nimport { cn } from \"@/lib/utils\";\n\n/**\n * The fill colour of the bar.\n *\n * `primary` is the default and the long-standing look. `accent` is the\n * quieter option (Ali, 11 Aug 2026: a full-width wizard progress bar in\n * primary \"is too strong\"): a bar that spans the whole header is a large\n * area of colour, and at that size the action colour stops reading as\n * progress and starts competing with the actual actions on the page.\n * `muted` is for a bar that is pure information, a quota meter or a\n * storage gauge, where any brand colour would over-signal.\n *\n * A PROP, not a className override on the indicator. The indicator is an\n * inner element, so tinting it from outside means reaching through the\n * component with a child selector, which breaks the moment the internals\n * change and has to be repeated at every call site.\n */\nconst TONE_FILL = {\n  primary: \"bg-primary\",\n  accent: \"bg-accent\",\n  muted: \"bg-muted-foreground\",\n} as const;\n\nexport type ProgressTone = keyof typeof TONE_FILL;\n\nexport interface ProgressProps\n  extends React.ComponentPropsWithoutRef<typeof ProgressPrimitive.Root> {\n  tone?: ProgressTone;\n}\n\nconst Progress = React.forwardRef<\n  React.ComponentRef<typeof ProgressPrimitive.Root>,\n  ProgressProps\n>(({ className, value, tone = \"primary\", ...props }, ref) => (\n  <ProgressPrimitive.Root\n    ref={ref}\n    data-tone={tone}\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={cn(\"h-full w-full flex-1 transition-all\", TONE_FILL[tone])}\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 layout=\"center\" className=\"overflow-hidden p-0 sm: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\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 { Combobox as ComboboxPrimitive } from \"@base-ui/react\";\nimport { CheckIcon, ChevronDownIcon, XIcon } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { Button } from \"./button\";\nimport {\n  InputGroup,\n  InputGroupAddon,\n  InputGroupButton,\n  InputGroupInput,\n} from \"./input-group\";\n\n/**\n * Combobox — 1:1 port of shadcn's (radix-namespace) Combobox, built on the\n * Base UI Combobox primitive (@base-ui/react). Compositional, not data-driven:\n * you render <ComboboxItem> children inside <ComboboxList>.\n *\n * Single select (default) shows the value in the input; pass `multiple` to the\n * root for chips. For a single chip that opens the popover (the Studio\n * token-field pattern), keep it single-select and render your own chip in an\n * <InputGroupAddon> — the built-in <ComboboxChips> is multiple-only.\n *\n *   <Combobox items={frameworks}>\n *     <ComboboxInput placeholder=\"Framework…\" />\n *     <ComboboxContent>\n *       <ComboboxList>\n *         {(item) => <ComboboxItem key={item} value={item}>{item}</ComboboxItem>}\n *       </ComboboxList>\n *       <ComboboxEmpty>No results.</ComboboxEmpty>\n *     </ComboboxContent>\n *   </Combobox>\n */\n\nconst Combobox = ComboboxPrimitive.Root;\n\nfunction ComboboxValue({ ...props }: ComboboxPrimitive.Value.Props) {\n  return <ComboboxPrimitive.Value data-slot=\"combobox-value\" {...props} />;\n}\n\nfunction ComboboxTrigger({\n  className,\n  children,\n  ...props\n}: ComboboxPrimitive.Trigger.Props) {\n  return (\n    <ComboboxPrimitive.Trigger\n      data-slot=\"combobox-trigger\"\n      className={cn(\"[&_svg:not([class*='size-'])]:size-4\", className)}\n      {...props}\n    >\n      {children}\n      <ChevronDownIcon\n        data-slot=\"combobox-trigger-icon\"\n        className=\"pointer-events-none size-4 text-muted-foreground\"\n      />\n    </ComboboxPrimitive.Trigger>\n  );\n}\n\nfunction ComboboxClear({ className, ...props }: ComboboxPrimitive.Clear.Props) {\n  return (\n    <ComboboxPrimitive.Clear\n      data-slot=\"combobox-clear\"\n      render={<InputGroupButton variant=\"ghost\" size=\"icon-xs\" />}\n      className={cn(className)}\n      {...props}\n    >\n      <XIcon className=\"pointer-events-none\" />\n    </ComboboxPrimitive.Clear>\n  );\n}\n\nfunction ComboboxInput({\n  className,\n  children,\n  disabled = false,\n  showTrigger = true,\n  showClear = false,\n  ...props\n}: ComboboxPrimitive.Input.Props & {\n  showTrigger?: boolean;\n  showClear?: boolean;\n}) {\n  return (\n    <InputGroup className={cn(\"w-auto\", className)}>\n      <ComboboxPrimitive.Input\n        render={<InputGroupInput disabled={disabled} />}\n        {...props}\n      />\n      <InputGroupAddon align=\"inline-end\">\n        {showTrigger && (\n          <InputGroupButton\n            size=\"icon-xs\"\n            variant=\"ghost\"\n            asChild\n            data-slot=\"input-group-button\"\n            className=\"group-has-data-[slot=combobox-clear]/input-group:hidden data-pressed:bg-transparent\"\n            disabled={disabled}\n          >\n            <ComboboxTrigger />\n          </InputGroupButton>\n        )}\n        {showClear && <ComboboxClear disabled={disabled} />}\n      </InputGroupAddon>\n      {children}\n    </InputGroup>\n  );\n}\n\nfunction ComboboxContent({\n  className,\n  side = \"bottom\",\n  sideOffset = 6,\n  align = \"start\",\n  alignOffset = 0,\n  anchor,\n  ...props\n}: ComboboxPrimitive.Popup.Props &\n  Pick<\n    ComboboxPrimitive.Positioner.Props,\n    \"side\" | \"align\" | \"sideOffset\" | \"alignOffset\" | \"anchor\"\n  >) {\n  return (\n    <ComboboxPrimitive.Portal>\n      <ComboboxPrimitive.Positioner\n        side={side}\n        sideOffset={sideOffset}\n        align={align}\n        alignOffset={alignOffset}\n        anchor={anchor}\n        className=\"isolate z-50\"\n      >\n        <ComboboxPrimitive.Popup\n          data-slot=\"combobox-content\"\n          data-chips={!!anchor}\n          className={cn(\n            \"group/combobox-content relative max-h-96 w-(--anchor-width) max-w-(--available-width) min-w-[calc(var(--anchor-width)+--spacing(7))] origin-(--transform-origin) overflow-hidden rounded-md bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[chips=true]:min-w-(--anchor-width) 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 *:data-[slot=input-group]:m-1 *:data-[slot=input-group]:mb-0 *:data-[slot=input-group]:h-8 *:data-[slot=input-group]:border-input/30 *:data-[slot=input-group]:bg-input/30 *:data-[slot=input-group]:shadow-none data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n            className\n          )}\n          {...props}\n        />\n      </ComboboxPrimitive.Positioner>\n    </ComboboxPrimitive.Portal>\n  );\n}\n\nfunction ComboboxList({ className, ...props }: ComboboxPrimitive.List.Props) {\n  return (\n    <ComboboxPrimitive.List\n      data-slot=\"combobox-list\"\n      className={cn(\n        \"max-h-[min(calc(--spacing(96)---spacing(9)),calc(var(--available-height)---spacing(9)))] scroll-py-1 overflow-y-auto p-1 data-empty:p-0\",\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction ComboboxItem({\n  className,\n  children,\n  ...props\n}: ComboboxPrimitive.Item.Props) {\n  return (\n    <ComboboxPrimitive.Item\n      data-slot=\"combobox-item\"\n      className={cn(\n        \"relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-highlighted:bg-accent data-highlighted:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n        className\n      )}\n      {...props}\n    >\n      {children}\n      <ComboboxPrimitive.ItemIndicator\n        data-slot=\"combobox-item-indicator\"\n        render={\n          <span className=\"pointer-events-none absolute right-2 flex size-4 items-center justify-center\" />\n        }\n      >\n        <CheckIcon className=\"pointer-events-none size-4 pointer-coarse:size-5\" />\n      </ComboboxPrimitive.ItemIndicator>\n    </ComboboxPrimitive.Item>\n  );\n}\n\nfunction ComboboxGroup({ className, ...props }: ComboboxPrimitive.Group.Props) {\n  return (\n    <ComboboxPrimitive.Group\n      data-slot=\"combobox-group\"\n      className={cn(className)}\n      {...props}\n    />\n  );\n}\n\nfunction ComboboxLabel({\n  className,\n  ...props\n}: ComboboxPrimitive.GroupLabel.Props) {\n  return (\n    <ComboboxPrimitive.GroupLabel\n      data-slot=\"combobox-label\"\n      className={cn(\n        \"px-2 py-1.5 text-xs text-muted-foreground pointer-coarse:px-3 pointer-coarse:py-2 pointer-coarse:text-sm\",\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction ComboboxCollection({ ...props }: ComboboxPrimitive.Collection.Props) {\n  return (\n    <ComboboxPrimitive.Collection data-slot=\"combobox-collection\" {...props} />\n  );\n}\n\nfunction ComboboxEmpty({ className, ...props }: ComboboxPrimitive.Empty.Props) {\n  return (\n    <ComboboxPrimitive.Empty\n      data-slot=\"combobox-empty\"\n      className={cn(\n        \"hidden w-full justify-center py-2 text-center text-sm text-muted-foreground group-data-empty/combobox-content:flex\",\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction ComboboxSeparator({\n  className,\n  ...props\n}: ComboboxPrimitive.Separator.Props) {\n  return (\n    <ComboboxPrimitive.Separator\n      data-slot=\"combobox-separator\"\n      className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n      {...props}\n    />\n  );\n}\n\nfunction ComboboxChips({\n  className,\n  ...props\n}: React.ComponentPropsWithRef<typeof ComboboxPrimitive.Chips> &\n  ComboboxPrimitive.Chips.Props) {\n  return (\n    <ComboboxPrimitive.Chips\n      data-slot=\"combobox-chips\"\n      className={cn(\n        \"flex min-h-9 flex-wrap items-center gap-1.5 rounded-md border border-input bg-transparent bg-clip-padding px-2.5 py-1.5 text-sm shadow-xs transition-[color,box-shadow] focus-within:border-ring focus-within:ring-[3px] focus-within:ring-ring/50 has-aria-invalid:border-destructive has-aria-invalid:ring-[3px] has-aria-invalid:ring-destructive/20 has-data-[slot=combobox-chip]:px-1.5 dark:bg-input/30 dark:has-aria-invalid:border-destructive/50 dark:has-aria-invalid:ring-destructive/40\",\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction ComboboxChip({\n  className,\n  children,\n  showRemove = true,\n  ...props\n}: ComboboxPrimitive.Chip.Props & {\n  showRemove?: boolean;\n}) {\n  return (\n    <ComboboxPrimitive.Chip\n      data-slot=\"combobox-chip\"\n      className={cn(\n        \"flex h-[calc(--spacing(5.5))] w-fit items-center justify-center gap-1 rounded-sm bg-muted px-1.5 text-xs font-medium whitespace-nowrap text-foreground has-disabled:pointer-events-none has-disabled:cursor-not-allowed has-disabled:opacity-50 has-data-[slot=combobox-chip-remove]:pr-0\",\n        className\n      )}\n      {...props}\n    >\n      {children}\n      {showRemove && (\n        <ComboboxPrimitive.ChipRemove\n          render={<Button variant=\"ghost\" size=\"xs\" iconOnly />}\n          className=\"-ml-1 opacity-50 hover:opacity-100\"\n          data-slot=\"combobox-chip-remove\"\n        >\n          <XIcon className=\"pointer-events-none\" />\n        </ComboboxPrimitive.ChipRemove>\n      )}\n    </ComboboxPrimitive.Chip>\n  );\n}\n\nfunction ComboboxChipsInput({\n  className,\n  ...props\n}: ComboboxPrimitive.Input.Props) {\n  return (\n    <ComboboxPrimitive.Input\n      data-slot=\"combobox-chip-input\"\n      className={cn(\"min-w-16 flex-1 outline-none\", className)}\n      {...props}\n    />\n  );\n}\n\nfunction useComboboxAnchor() {\n  return React.useRef<HTMLDivElement | null>(null);\n}\n\nexport {\n  Combobox,\n  ComboboxInput,\n  ComboboxContent,\n  ComboboxList,\n  ComboboxItem,\n  ComboboxGroup,\n  ComboboxLabel,\n  ComboboxCollection,\n  ComboboxEmpty,\n  ComboboxSeparator,\n  ComboboxChips,\n  ComboboxChip,\n  ComboboxChipsInput,\n  ComboboxTrigger,\n  ComboboxValue,\n  useComboboxAnchor,\n};\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 * 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","import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Table = React.forwardRef<\n  HTMLTableElement,\n  React.HTMLAttributes<HTMLTableElement>\n>(({ className, ...props }, ref) => (\n  <div className=\"relative w-full overflow-auto\">\n    <table\n      ref={ref}\n      className={cn(\"w-full caption-bottom text-sm\", className)}\n      {...props}\n    />\n  </div>\n))\nTable.displayName = \"Table\"\n\nconst TableHeader = React.forwardRef<\n  HTMLTableSectionElement,\n  React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n  <thead ref={ref} className={cn(\"[&_tr]:border-b\", className)} {...props} />\n))\nTableHeader.displayName = \"TableHeader\"\n\nconst TableBody = React.forwardRef<\n  HTMLTableSectionElement,\n  React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n  <tbody\n    ref={ref}\n    className={cn(\"[&_tr:last-child]:border-0\", className)}\n    {...props}\n  />\n))\nTableBody.displayName = \"TableBody\"\n\nconst TableFooter = React.forwardRef<\n  HTMLTableSectionElement,\n  React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n  <tfoot\n    ref={ref}\n    className={cn(\n      \"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\",\n      className\n    )}\n    {...props}\n  />\n))\nTableFooter.displayName = \"TableFooter\"\n\nconst TableRow = React.forwardRef<\n  HTMLTableRowElement,\n  React.HTMLAttributes<HTMLTableRowElement>\n>(({ className, ...props }, ref) => (\n  <tr\n    ref={ref}\n    className={cn(\n      \"border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted\",\n      className\n    )}\n    {...props}\n  />\n))\nTableRow.displayName = \"TableRow\"\n\nconst TableHead = React.forwardRef<\n  HTMLTableCellElement,\n  React.ThHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n  <th\n    ref={ref}\n    className={cn(\n      \"h-10 px-2 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\n      className\n    )}\n    {...props}\n  />\n))\nTableHead.displayName = \"TableHead\"\n\nconst TableCell = React.forwardRef<\n  HTMLTableCellElement,\n  React.TdHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n  <td\n    ref={ref}\n    className={cn(\n      \"p-2 align-middle [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\n      className\n    )}\n    {...props}\n  />\n))\nTableCell.displayName = \"TableCell\"\n\nconst TableCaption = React.forwardRef<\n  HTMLTableCaptionElement,\n  React.HTMLAttributes<HTMLTableCaptionElement>\n>(({ className, ...props }, ref) => (\n  <caption\n    ref={ref}\n    className={cn(\"mt-4 text-sm text-muted-foreground\", className)}\n    {...props}\n  />\n))\nTableCaption.displayName = \"TableCaption\"\n\nexport {\n  Table,\n  TableHeader,\n  TableBody,\n  TableFooter,\n  TableHead,\n  TableRow,\n  TableCell,\n  TableCaption,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as 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        // segmented — the quiet iOS-style selector for dense panels. Items\n        // sit in a muted track (added by ToggleGroup variant=\"segmented\");\n        // the selected item is a soft raised pill, NOT the loud accent fill.\n        segmented:\n          \"rounded-md bg-transparent text-muted-foreground hover:bg-transparent hover:text-foreground data-[state=on]:bg-background data-[state=on]:text-foreground data-[state=on]:shadow-sm\",\n      },\n      size: {\n        default: \"h-9 px-2 min-w-9\",\n        sm: \"h-8 px-1.5 min-w-8\",\n        // xs: h-7 (28px) — Figma-density for tool panels.\n        xs: \"h-7 px-1 min-w-7 text-xs\",\n        // 2xs: h-6 (24px) — densest tool-panel toggle. Smaller text +\n        // icon so labelled toggles (Row/Stack) read at panel density.\n        \"2xs\": \"h-6 px-1 min-w-6 text-2xs [&_svg]:size-3\",\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 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 ToggleGroupPrimitive from \"@radix-ui/react-toggle-group\"\nimport { type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\nimport { toggleVariants } from \"@/components/ui/toggle\"\nimport {\n  Tooltip,\n  TooltipContent,\n  TooltipTrigger,\n} from \"@/components/ui/tooltip\"\n\nconst ToggleGroupContext = React.createContext<\n  VariantProps<typeof toggleVariants>\n>({\n  size: \"default\",\n  variant: \"default\",\n})\n\nconst ToggleGroup = React.forwardRef<\n  React.ElementRef<typeof ToggleGroupPrimitive.Root>,\n  React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Root> &\n    VariantProps<typeof toggleVariants>\n>(({ className, variant, size, children, ...props }, ref) => (\n  <ToggleGroupPrimitive.Root\n    ref={ref}\n    className={cn(\n      \"flex items-center justify-center gap-1\",\n      // segmented — the items sit in a single muted track, no gaps, so it\n      // reads as one control rather than separate toggle buttons.\n      variant === \"segmented\" && \"inline-flex gap-0 rounded-lg bg-muted p-0.5\",\n      className,\n    )}\n    {...props}\n  >\n    <ToggleGroupContext.Provider value={{ variant, size }}>\n      {children}\n    </ToggleGroupContext.Provider>\n  </ToggleGroupPrimitive.Root>\n))\n\nToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName\n\n// Mirror of the canonical packages/ui props — see\n// packages/ui/components/ui/toggle-group.tsx for the source of truth.\n// `tooltip` wraps the item in a Tooltip so icon-only toggles keep\n// an accessible label without crowding the chrome with text.\ntype ToggleGroupItemProps =\n  React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Item> &\n    VariantProps<typeof toggleVariants> & {\n      tooltip?: React.ReactNode\n      tooltipSide?: React.ComponentPropsWithoutRef<typeof TooltipContent>[\"side\"]\n      tooltipDelay?: number\n    }\n\nconst ToggleGroupItem = React.forwardRef<\n  React.ElementRef<typeof ToggleGroupPrimitive.Item>,\n  ToggleGroupItemProps\n>(\n  (\n    {\n      className,\n      children,\n      variant,\n      size,\n      tooltip,\n      tooltipSide = \"top\",\n      tooltipDelay,\n      \"aria-label\": ariaLabel,\n      ...props\n    },\n    ref\n  ) => {\n    const context = React.useContext(ToggleGroupContext)\n    const resolvedAriaLabel =\n      ariaLabel ?? (typeof tooltip === \"string\" ? tooltip : undefined)\n    const item = (\n      <ToggleGroupPrimitive.Item\n        ref={ref}\n        className={cn(\n          toggleVariants({\n            variant: context.variant || variant,\n            size: context.size || size,\n          }),\n          className\n        )}\n        aria-label={resolvedAriaLabel}\n        {...props}\n      >\n        {children}\n      </ToggleGroupPrimitive.Item>\n    )\n    if (tooltip == null) return item\n    // Wrap in a span so the trigger's `data-state=\"closed\"` lands on\n    // the span, not on the toggle button. Without this, the trigger\n    // attribute clobbers the toggle's own `data-state=\"on\"` and the\n    // active-state styling disappears. See the packages/ui mirror for\n    // the full explanation.\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)\n\nToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName\n\nexport { ToggleGroup, ToggleGroupItem }\n","\"use client\";\n\n/**\n * DataView — one dataset, drawn as a table, a list of cards, or a grid.\n *\n * Wraps TanStack Table so a page stops re-typing the same boilerplate\n * (sortable-header buttons, flexRender plumbing, selection wiring, the\n * view switch). You hand it `data` + a `columns` schema; it owns sorting,\n * column visibility, selection, and view switching.\n *\n *   <DataView data={rows} columns={cols} defaultView=\"table\" />\n *\n * Schema-driven cells: each column declares a `type` (badge / tags /\n * number / currency / percent / date / boolean / url / text) and DataView\n * renders it. `cell` overrides per column for anything bespoke (avatars,\n * relations). `role: \"title\"` marks the primary field for card / grid.\n *\n * The view toggle can live ANYWHERE. `useDataView()` holds the state\n * (view / activeId / sorting / columnVisibility) so a `<DataViewToggle>`\n * or `<DataViewColumns>` placed in a page header drives a `<DataView>`\n * lower down. Or pass `toolbar` to let DataView render them inline.\n *\n * Single-view is first-class: pass `views={[\"table\"]}` (or just\n * `defaultView` with no toolbar) and it's only ever a table / only cards /\n * only a grid, no switch.\n *\n * Table extras: mark a column `pinned=\"left\"` for a fixed column (sticky,\n * give it a `width` so multi-pin offsets line up) and `stickyHeader` to\n * freeze the header row on scroll.\n *\n * Tunable via `--gds-data-view-*` (card / grid min column width, gap).\n */\n\nimport * as React from \"react\";\nimport {\n  useReactTable,\n  getCoreRowModel,\n  getSortedRowModel,\n  getPaginationRowModel,\n  type ColumnDef,\n  type SortingState,\n  type VisibilityState,\n  type OnChangeFn,\n  type Table as TanstackTable,\n  type Header,\n  type HeaderGroup,\n  type Row as TanstackRow,\n  type Cell,\n  type Column,\n} from \"@tanstack/react-table\";\nimport {\n  ArrowDown,\n  ArrowUp,\n  ArrowUpDown,\n  ChevronLeft,\n  ChevronRight,\n  Check,\n  LayoutGrid,\n  Rows3,\n  Grid3x3,\n  SlidersHorizontal,\n} from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { Badge, type BadgeProps } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card } from \"@/components/ui/card\";\nimport { Row } from \"@/components/ui/row\";\nimport { Stack } from \"@/components/ui/stack\";\nimport {\n  Table,\n  TableBody,\n  TableCell,\n  TableHead,\n  TableHeader,\n  TableRow,\n} from \"@/components/ui/table\";\nimport { ToggleGroup, ToggleGroupItem } from \"@/components/ui/toggle-group\";\nimport {\n  DropdownMenu,\n  DropdownMenuTrigger,\n  DropdownMenuContent,\n  DropdownMenuLabel,\n  DropdownMenuSeparator,\n  DropdownMenuCheckboxItem,\n} from \"@/components/ui/dropdown-menu\";\n\n// ── Types ──────────────────────────────────────────────────────────────\n\nexport type DataViewMode = \"table\" | \"cards\" | \"grid\";\n\nexport type DataViewCellType =\n  | \"text\"\n  | \"badge\"\n  | \"tags\"\n  | \"number\"\n  | \"currency\"\n  | \"percent\"\n  | \"date\"\n  | \"boolean\"\n  | \"url\";\n\nexport interface DataViewBadgeOption {\n  value: string;\n  label?: string;\n  variant?: BadgeProps[\"variant\"];\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface DataViewColumn<T = any> {\n  /** Accessor key into the row + the column id. */\n  key: string;\n  /** Header content. */\n  header: React.ReactNode;\n  /** Built-in renderer to use for the value. Ignored when `cell` is set. */\n  type?: DataViewCellType;\n  /** For `type=\"badge\"`: per-value label + colour. */\n  options?: DataViewBadgeOption[];\n  /** Render the cell yourself (avatars, relations, anything bespoke). */\n  cell?: (row: T) => React.ReactNode;\n  /** Hint for card / grid composition. `title` is the primary field. */\n  role?: \"title\" | \"meta\";\n  /** Allow click-to-sort on this column. */\n  sortable?: boolean;\n  /** Pin the column to the left (a fixed column). Give it `width` so\n   *  multi-pin offsets line up. */\n  pinned?: \"left\";\n  /** Fixed width in px (used for pinned offsets + min sizing). */\n  width?: number;\n  /** Right-align the cell (numbers / currency). */\n  align?: \"start\" | \"end\";\n  /** Whether the user can hide it from the Columns menu. Default true. */\n  hideable?: boolean;\n  /** Start hidden. */\n  defaultHidden?: boolean;\n}\n\n// ── Controllable state helper ────────────────────────────────────────────\n\nfunction useControllable<V>(\n  controlled: V | undefined,\n  defaultValue: V,\n  onChange?: (v: V) => void,\n) {\n  const [internal, setInternal] = React.useState<V>(defaultValue);\n  const value = controlled !== undefined ? controlled : internal;\n  const set = React.useCallback(\n    (next: V | ((prev: V) => V)) => {\n      const resolved =\n        typeof next === \"function\"\n          ? (next as (prev: V) => V)(value)\n          : next;\n      if (controlled === undefined) setInternal(resolved);\n      onChange?.(resolved);\n    },\n    [controlled, onChange, value],\n  );\n  return [value, set] as const;\n}\n\n// ── useDataView — hold the state so the chrome can live anywhere ─────────\n\nexport interface UseDataViewOptions {\n  defaultView?: DataViewMode;\n  views?: DataViewMode[];\n  defaultActiveId?: string | null;\n  defaultSorting?: SortingState;\n  defaultColumnVisibility?: VisibilityState;\n}\n\nexport interface DataViewState {\n  view: DataViewMode;\n  setView: (v: DataViewMode) => void;\n  views: DataViewMode[];\n  activeId: string | null;\n  setActiveId: (id: string | null) => void;\n  sorting: SortingState;\n  setSorting: OnChangeFn<SortingState>;\n  columnVisibility: VisibilityState;\n  setColumnVisibility: OnChangeFn<VisibilityState>;\n}\n\nexport function useDataView(options: UseDataViewOptions = {}): DataViewState {\n  const {\n    defaultView = \"table\",\n    views = [\"table\", \"cards\", \"grid\"],\n    defaultActiveId = null,\n    defaultSorting = [],\n    defaultColumnVisibility = {},\n  } = options;\n  const [view, setView] = React.useState<DataViewMode>(defaultView);\n  const [activeId, setActiveId] = React.useState<string | null>(defaultActiveId);\n  const [sorting, setSorting] = React.useState<SortingState>(defaultSorting);\n  const [columnVisibility, setColumnVisibility] = React.useState<VisibilityState>(\n    defaultColumnVisibility,\n  );\n  return {\n    view,\n    setView,\n    views,\n    activeId,\n    setActiveId,\n    sorting,\n    setSorting,\n    columnVisibility,\n    setColumnVisibility,\n  };\n}\n\n// ── Default cell renderers (generic shapes) ──────────────────────────────\n\nconst formatDate = (v: unknown) => {\n  const d = new Date(v as string);\n  return Number.isNaN(d.getTime())\n    ? String(v)\n    : d.toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\", year: \"numeric\" });\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction renderCell(col: DataViewColumn, row: any): React.ReactNode {\n  if (col.cell) return col.cell(row);\n  const v = row[col.key];\n  switch (col.type) {\n    case \"badge\": {\n      const opt = col.options?.find((o) => o.value === v);\n      return <Badge variant={opt?.variant ?? \"secondary\"}>{opt?.label ?? v}</Badge>;\n    }\n    case \"tags\":\n      return Array.isArray(v) ? (\n        <Row gap=\"xs\" wrap>\n          {v.map((t) => (\n            <Badge key={String(t)} variant=\"secondary\">{t}</Badge>\n          ))}\n        </Row>\n      ) : null;\n    case \"number\":\n      return <span className=\"tabular-nums\">{v as React.ReactNode}</span>;\n    case \"currency\":\n      return <span className=\"tabular-nums\">{\"$\" + Number(v).toLocaleString(\"en-US\")}</span>;\n    case \"percent\":\n      return <span className=\"tabular-nums\">{Math.round(Number(v) * 100) + \"%\"}</span>;\n    case \"date\":\n      return <span className=\"tabular-nums text-muted-foreground\">{formatDate(v)}</span>;\n    case \"boolean\":\n      return <Badge variant={v ? \"success-soft\" : \"outline\"}>{v ? \"Yes\" : \"No\"}</Badge>;\n    case \"url\":\n      return (\n        <a href={String(v)} className=\"text-primary underline-offset-2 hover:underline\">\n          {String(v).replace(/^https?:\\/\\//, \"\")}\n        </a>\n      );\n    case \"text\":\n    default:\n      return <span>{v as React.ReactNode}</span>;\n  }\n}\n\n// ── DataViewToggle — standalone, place it anywhere ───────────────────────\n\nconst VIEW_ICON: Record<DataViewMode, React.ComponentType<{ className?: string }>> = {\n  table: Rows3,\n  cards: LayoutGrid,\n  grid: Grid3x3,\n};\nconst VIEW_LABEL: Record<DataViewMode, string> = {\n  table: \"Table view\",\n  cards: \"Card view\",\n  grid: \"Grid view\",\n};\n\nexport interface DataViewToggleProps {\n  value: DataViewMode;\n  onChange: (v: DataViewMode) => void;\n  views?: DataViewMode[];\n  className?: string;\n}\n\nexport function DataViewToggle({\n  value,\n  onChange,\n  views = [\"table\", \"cards\", \"grid\"],\n  className,\n}: DataViewToggleProps) {\n  if (views.length < 2) return null;\n  return (\n    <ToggleGroup\n      type=\"single\"\n      value={value}\n      onValueChange={(v) => v && onChange(v as DataViewMode)}\n      className={className}\n      data-gds-part=\"data-view-toggle\"\n    >\n      {views.map((v) => {\n        const Icon = VIEW_ICON[v];\n        return (\n          <ToggleGroupItem key={v} value={v} aria-label={VIEW_LABEL[v]}>\n            <Icon className=\"h-4 w-4\" />\n          </ToggleGroupItem>\n        );\n      })}\n    </ToggleGroup>\n  );\n}\n\n// ── DataViewColumns — the \"choose what to display\" menu ───────────────────\n\nexport interface DataViewColumnsProps {\n  columns: DataViewColumn[];\n  visibility: VisibilityState;\n  onVisibilityChange: (next: VisibilityState) => void;\n  label?: string;\n  className?: string;\n}\n\nexport function DataViewColumns({\n  columns,\n  visibility,\n  onVisibilityChange,\n  label = \"Display\",\n  className,\n}: DataViewColumnsProps) {\n  const hideable = columns.filter((c) => c.hideable !== false);\n  const isVisible = (key: string) => visibility[key] !== false;\n  const toggle = (key: string) =>\n    onVisibilityChange({ ...visibility, [key]: !isVisible(key) });\n  return (\n    <DropdownMenu>\n      <DropdownMenuTrigger asChild>\n        <Button variant=\"outline\" size=\"sm\" className={className} data-gds-part=\"data-view-columns\">\n          <SlidersHorizontal className=\"mr-1.5 h-3.5 w-3.5\" />\n          {label}\n        </Button>\n      </DropdownMenuTrigger>\n      <DropdownMenuContent align=\"end\" className=\"w-48\">\n        <DropdownMenuLabel>Show fields</DropdownMenuLabel>\n        <DropdownMenuSeparator />\n        {hideable.map((c) => (\n          <DropdownMenuCheckboxItem\n            key={c.key}\n            checked={isVisible(c.key)}\n            onCheckedChange={() => toggle(c.key)}\n            onSelect={(e) => e.preventDefault()}\n          >\n            {typeof c.header === \"string\" ? c.header : c.key}\n          </DropdownMenuCheckboxItem>\n        ))}\n      </DropdownMenuContent>\n    </DropdownMenu>\n  );\n}\n\n// ── DataView ─────────────────────────────────────────────────────────────\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface DataViewProps<T = any> {\n  data: T[];\n  columns: DataViewColumn<T>[];\n  getRowId?: (row: T, index: number) => string;\n  view?: DataViewMode;\n  defaultView?: DataViewMode;\n  onViewChange?: (v: DataViewMode) => void;\n  views?: DataViewMode[];\n  activeId?: string | null;\n  defaultActiveId?: string | null;\n  onActiveChange?: (id: string | null) => void;\n  sorting?: SortingState;\n  defaultSorting?: SortingState;\n  onSortingChange?: OnChangeFn<SortingState>;\n  columnVisibility?: VisibilityState;\n  defaultColumnVisibility?: VisibilityState;\n  onColumnVisibilityChange?: OnChangeFn<VisibilityState>;\n  /** Freeze the header row on vertical scroll. */\n  /**\n   * Rows per page. Unset means no pagination: every row renders and the\n   * page scrolls, which is right for a short list.\n   *\n   * WHY IT EXISTS (Ali, 12 Aug): a long table under stickyHeader was\n   * capped at 28rem and scrolled INSIDE itself, which reads as a cropped\n   * box rather than a table. Paginating is the honest fix for a history\n   * that grows: the page stays one height, and the header cap is dropped\n   * while paginating because a bounded page has nothing to scroll.\n   */\n  pageSize?: number;\n  stickyHeader?: boolean;\n  /** Render a built-in toolbar (columns menu + view toggle) above the view. */\n  toolbar?: boolean;\n  /** Override card / grid tile rendering. */\n  renderCard?: (row: T, ctx: { active: boolean }) => React.ReactNode;\n  emptyMessage?: React.ReactNode;\n  className?: string;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function DataView<T extends Record<string, any>>(props: DataViewProps<T>) {\n  const {\n    data,\n    columns,\n    getRowId = (row: T) => String((row as { id?: unknown }).id),\n    view: viewProp,\n    defaultView = \"table\",\n    onViewChange,\n    views = [\"table\", \"cards\", \"grid\"],\n    activeId: activeIdProp,\n    defaultActiveId = null,\n    onActiveChange,\n    sorting: sortingProp,\n    defaultSorting = [],\n    onSortingChange,\n    columnVisibility: visibilityProp,\n    defaultColumnVisibility,\n    onColumnVisibilityChange,\n    pageSize,\n    stickyHeader = false,\n    toolbar = false,\n    renderCard,\n    emptyMessage = \"Nothing to show.\",\n    className,\n  } = props;\n\n  const [view, setView] = useControllable(viewProp, defaultView, onViewChange);\n  const [activeId, setActiveId] = useControllable<string | null>(\n    activeIdProp,\n    defaultActiveId,\n    onActiveChange,\n  );\n  const [sorting, setSorting] = useControllable<SortingState>(\n    sortingProp,\n    defaultSorting,\n    onSortingChange as ((v: SortingState) => void) | undefined,\n  );\n  const initialVisibility = React.useMemo<VisibilityState>(() => {\n    const base: VisibilityState = { ...(defaultColumnVisibility ?? {}) };\n    for (const c of columns) if (c.defaultHidden) base[c.key] ??= false;\n    return base;\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n  const [columnVisibility, setColumnVisibility] = useControllable<VisibilityState>(\n    visibilityProp,\n    initialVisibility,\n    onColumnVisibilityChange as ((v: VisibilityState) => void) | undefined,\n  );\n\n  const tableColumns = React.useMemo<ColumnDef<T>[]>(\n    () =>\n      columns.map((col) => ({\n        id: col.key,\n        accessorKey: col.key,\n        header: () => col.header,\n        enableSorting: !!col.sortable,\n        enableHiding: col.hideable !== false,\n        meta: col,\n      })),\n    [columns],\n  );\n\n  const paginated = typeof pageSize === \"number\" && pageSize > 0;\n\n  const table = useReactTable({\n    data,\n    columns: tableColumns,\n    getRowId,\n    state: { sorting, columnVisibility },\n    onSortingChange: setSorting as OnChangeFn<SortingState>,\n    onColumnVisibilityChange: setColumnVisibility as OnChangeFn<VisibilityState>,\n    getCoreRowModel: getCoreRowModel(),\n    getSortedRowModel: getSortedRowModel(),\n    /* Pagination is OPT IN: without a pageSize there is no pagination row\n       model at all, because TanStack's default page size is 10 and adding\n       the model unconditionally would silently truncate every existing\n       table to ten rows. */\n    ...(paginated\n      ? {\n          getPaginationRowModel: getPaginationRowModel(),\n          initialState: { pagination: { pageIndex: 0, pageSize } },\n          /* Reset to page one when the data changes under us, which is\n             what a filter or a new row should do. */\n          autoResetPageIndex: true,\n        }\n      : {}),\n  });\n\n  // Precompute left offsets for pinned columns (in column order).\n  const pinnedOffset = React.useMemo(() => {\n    const map: Record<string, number> = {};\n    let acc = 0;\n    for (const c of columns) {\n      if (c.pinned === \"left\") {\n        map[c.key] = acc;\n        acc += c.width ?? 0;\n      }\n    }\n    return map;\n  }, [columns]);\n\n  const rows = table.getRowModel().rows;\n  const isEmpty = rows.length === 0;\n\n  /* The visible range, for the pager's \"11-20 of 24\". Off the FILTERED\n     row count, not the raw data, so a filter narrows the total too. */\n  const totalRows = table.getFilteredRowModel().rows.length;\n  const pageStart = paginated && totalRows > 0\n    ? table.getState().pagination.pageIndex * pageSize! + 1\n    : 0;\n  const pageEnd = paginated\n    ? Math.min(pageStart + pageSize! - 1, totalRows)\n    : totalRows;\n\n\n  return (\n    <Stack gap=\"md\" className={className} data-gds-part=\"data-view\" data-view={view}>\n      {toolbar && (\n        <Row justify=\"end\" align=\"center\" gap=\"sm\">\n          <DataViewColumns\n            columns={columns}\n            visibility={columnVisibility}\n            onVisibilityChange={(v) => setColumnVisibility(v)}\n          />\n          <DataViewToggle value={view} onChange={setView} views={views} />\n        </Row>\n      )}\n\n      {view === \"table\" ? (\n        <TableView\n          table={table}\n          activeId={activeId}\n          onActivate={setActiveId}\n          pinnedOffset={pinnedOffset}\n          stickyHeader={stickyHeader}\n          capHeight={!paginated}\n          emptyMessage={emptyMessage}\n          isEmpty={isEmpty}\n        />\n      ) : (\n        <TileView\n          table={table}\n          mode={view}\n          activeId={activeId}\n          onActivate={setActiveId}\n          renderCard={renderCard}\n          emptyMessage={emptyMessage}\n          isEmpty={isEmpty}\n        />\n      )}\n\n      {/* THE PAGER, only when paginating and only when there is more than\n          one page: a single-page table should not grow controls it does not\n          need. Range on the left, position and the two steps on the right,\n          which is the order every table in this system reads. */}\n      {paginated && table.getPageCount() > 1 ? (\n        <Row justify=\"between\" align=\"center\" gap=\"sm\" data-gds-part=\"data-view-pager\">\n          <span className=\"text-xs tabular-nums text-muted-foreground\">\n            {`${pageStart}\\u2013${pageEnd} of ${totalRows}`}\n          </span>\n          <Row gap=\"xs\" align=\"center\">\n            <Button\n              variant=\"outline\"\n              size=\"sm\"\n              iconOnly\n              aria-label=\"Previous page\"\n              disabled={!table.getCanPreviousPage()}\n              onClick={() => table.previousPage()}\n            >\n              <ChevronLeft className=\"size-4\" />\n            </Button>\n            <span className=\"px-1 text-xs tabular-nums text-muted-foreground\">\n              {`Page ${table.getState().pagination.pageIndex + 1} of ${table.getPageCount()}`}\n            </span>\n            <Button\n              variant=\"outline\"\n              size=\"sm\"\n              iconOnly\n              aria-label=\"Next page\"\n              disabled={!table.getCanNextPage()}\n              onClick={() => table.nextPage()}\n            >\n              <ChevronRight className=\"size-4\" />\n            </Button>\n          </Row>\n        </Row>\n      ) : null}\n    </Stack>\n  );\n}\nDataView.displayName = \"DataView\";\nDataView.Toggle = DataViewToggle;\nDataView.Columns = DataViewColumns;\n\n// ── Table view ───────────────────────────────────────────────────────────\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction TableView<T>({\n  table,\n  activeId,\n  onActivate,\n  pinnedOffset,\n  stickyHeader,\n  capHeight,\n  emptyMessage,\n  isEmpty,\n}: {\n  table: TanstackTable<T>;\n  activeId: string | null;\n  onActivate: (id: string | null) => void;\n  pinnedOffset: Record<string, number>;\n  stickyHeader: boolean;\n  /** Apply the sticky-header max-height. False while paginating: a\n   *  bounded page has nothing to scroll, and the cap is what made a long\n   *  table look cropped. */\n  capHeight: boolean;\n  emptyMessage: React.ReactNode;\n  isEmpty: boolean;\n}) {\n  const leafColumns = table.getVisibleLeafColumns();\n  const pinnedStyle = (key: string, isHeader: boolean): React.CSSProperties | undefined => {\n    if (!(key in pinnedOffset)) return undefined;\n    return {\n      position: \"sticky\",\n      left: pinnedOffset[key],\n      zIndex: isHeader ? 30 : 10,\n      background: \"var(--gds-data-view-pinned-bg, oklch(var(--background)))\",\n    };\n  };\n\n  return (\n    <div\n      /* NO OUTER FRAME (Ali, 11 Aug). The Table primitive this wraps has\n         never drawn one, so the box was DataView's own invention and made\n         a table look like a card sitting inside the page rather than part\n         of it. The row hairlines already separate the data; the frame just\n         boxed it in. */\n      className=\"overflow-auto\"\n      data-gds-part=\"data-view-table\"\n      style={\n        stickyHeader && capHeight\n          ? { maxHeight: \"var(--gds-data-view-table-max-h, 28rem)\" }\n          : undefined\n      }\n    >\n      <Table>\n        <TableHeader>\n          {table.getHeaderGroups().map((hg: HeaderGroup<T>) => (\n            <TableRow key={hg.id}>\n              {hg.headers.map((header: Header<T, unknown>) => {\n                const col = header.column.columnDef.meta as DataViewColumn | undefined;\n                const canSort = header.column.getCanSort();\n                const sort = header.column.getIsSorted();\n                const SortIcon = sort === \"asc\" ? ArrowUp : sort === \"desc\" ? ArrowDown : ArrowUpDown;\n                const pinned = pinnedStyle(header.column.id, true);\n                return (\n                  <TableHead\n                    key={header.id}\n                    style={{\n                      ...(col?.width ? { width: col.width, minWidth: col.width } : {}),\n                      ...(stickyHeader\n                        ? { position: \"sticky\", top: 0, zIndex: pinned ? 30 : 20, background: \"var(--gds-data-view-header-bg, oklch(var(--background)))\" }\n                        : {}),\n                      ...pinned,\n                    }}\n                    className={cn(\n                      col?.align === \"end\" && \"text-right\",\n                      header.column.id in pinnedOffset && \"border-r border-border\",\n                    )}\n                  >\n                    {canSort ? (\n                      /* THE ARROW IS A STATE, NOT A DECORATION (11 Aug).\n                         Every sortable header used to carry a permanent\n                         up-down glyph, so a table of six sortable columns\n                         showed six arrows and none of them told you which\n                         sort was actually applied. Now: the SORTED column\n                         keeps its arrow, pointing the way it sorts; the\n                         rest reveal a neutral one on hover or keyboard\n                         focus, which is when the affordance is relevant. */\n                      <button\n                        type=\"button\"\n                        className=\"group/sort inline-flex items-center gap-1 text-left font-medium hover:text-foreground focus-visible:text-foreground focus-visible:outline-none\"\n                        onClick={header.column.getToggleSortingHandler()}\n                        aria-label={\n                          typeof col?.header === \"string\"\n                            ? `Sort by ${col.header}`\n                            : \"Sort\"\n                        }\n                      >\n                        {typeof col?.header !== \"undefined\" ? col.header : null}\n                        <SortIcon\n                          aria-hidden\n                          className={cn(\n                            \"h-3 w-3 transition-opacity\",\n                            sort\n                              ? \"text-foreground opacity-100\"\n                              : \"text-muted-foreground opacity-0 group-hover/sort:opacity-100 group-focus-visible/sort:opacity-100\",\n                          )}\n                        />\n                      </button>\n                    ) : (\n                      col?.header ?? null\n                    )}\n                  </TableHead>\n                );\n              })}\n            </TableRow>\n          ))}\n        </TableHeader>\n        <TableBody>\n          {isEmpty ? (\n            <TableRow>\n              <TableCell colSpan={leafColumns.length} className=\"py-12 text-center text-sm text-muted-foreground\">\n                {emptyMessage}\n              </TableCell>\n            </TableRow>\n          ) : (\n            table.getRowModel().rows.map((row: TanstackRow<T>) => {\n              const active = row.id === activeId;\n              return (\n                <TableRow\n                  key={row.id}\n                  data-state={active ? \"selected\" : undefined}\n                  className={active ? \"cursor-pointer bg-muted\" : \"cursor-pointer\"}\n                  onClick={() => onActivate(row.id)}\n                >\n                  {row.getVisibleCells().map((cell: Cell<T, unknown>) => {\n                    const col = cell.column.columnDef.meta as DataViewColumn;\n                    const pinned = pinnedStyle(cell.column.id, false);\n                    return (\n                      <TableCell\n                        key={cell.id}\n                        style={{\n                          ...(col?.width ? { width: col.width, minWidth: col.width } : {}),\n                          // Pinned body cells inherit the row background on hover/active.\n                          ...(pinned ? { ...pinned, background: active ? \"var(--muted, oklch(var(--background)))\" : pinned.background } : {}),\n                        }}\n                        className={cn(\n                          col?.align === \"end\" && \"text-right\",\n                          cell.column.id in pinnedOffset && \"border-r border-border\",\n                        )}\n                      >\n                        {renderCell(col, row.original)}\n                      </TableCell>\n                    );\n                  })}\n                </TableRow>\n              );\n            })\n          )}\n        </TableBody>\n      </Table>\n    </div>\n  );\n}\n\n// ── Card / Grid view ─────────────────────────────────────────────────────\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction TileView<T>({\n  table,\n  mode,\n  activeId,\n  onActivate,\n  renderCard,\n  emptyMessage,\n  isEmpty,\n}: {\n  table: TanstackTable<T>;\n  mode: DataViewMode;\n  activeId: string | null;\n  onActivate: (id: string | null) => void;\n  renderCard?: (row: T, ctx: { active: boolean }) => React.ReactNode;\n  emptyMessage: React.ReactNode;\n  isEmpty: boolean;\n}) {\n  const cols = table\n    .getVisibleLeafColumns()\n    .map((c: Column<T, unknown>) => c.columnDef.meta as DataViewColumn);\n  const titleCol = cols.find((c: DataViewColumn) => c?.role === \"title\") ?? cols[0];\n  const badgeCols = cols.filter(\n    (c: DataViewColumn) => c && c !== titleCol && (c.type === \"badge\" || c.type === \"tags\"),\n  );\n  const metaCols = cols.filter(\n    (c: DataViewColumn) => c && c !== titleCol && c.type !== \"badge\" && c.type !== \"tags\",\n  );\n  const compact = mode === \"grid\";\n  const minVar = compact\n    ? \"var(--gds-data-view-grid-min, 11rem)\"\n    : \"var(--gds-data-view-card-min, 18rem)\";\n\n  if (isEmpty) {\n    return (\n      <div className=\"py-12 text-center text-sm text-muted-foreground\">\n        {emptyMessage}\n      </div>\n    );\n  }\n\n  return (\n    <div\n      data-gds-part={compact ? \"data-view-grid\" : \"data-view-cards\"}\n      style={{\n        display: \"grid\",\n        gap: \"var(--gds-data-view-gap, 0.75rem)\",\n        gridTemplateColumns: `repeat(auto-fill, minmax(${minVar}, 1fr))`,\n      }}\n    >\n      {table.getRowModel().rows.map((row: TanstackRow<T>) => {\n        const active = row.id === activeId;\n        if (renderCard) {\n          return (\n            <div key={row.id} onClick={() => onActivate(row.id)}>\n              {renderCard(row.original, { active })}\n            </div>\n          );\n        }\n        return (\n          <Card\n            key={row.id}\n            onClick={() => onActivate(row.id)}\n            className={active ? \"cursor-pointer ring-2 ring-primary\" : \"cursor-pointer hover:bg-muted/40\"}\n          >\n            <Stack gap=\"sm\" className={compact ? \"p-3\" : \"p-4\"}>\n              <Row justify=\"between\" align=\"start\" gap=\"sm\">\n                {titleCol ? (\n                  <span className=\"min-w-0 truncate font-medium\">\n                    {renderCell(titleCol, row.original)}\n                  </span>\n                ) : null}\n              </Row>\n              {badgeCols.length > 0 && (\n                <Row gap=\"xs\" wrap>\n                  {badgeCols.map((c: DataViewColumn) => (\n                    <React.Fragment key={c.key}>{renderCell(c, row.original)}</React.Fragment>\n                  ))}\n                </Row>\n              )}\n              {!compact && metaCols.length > 0 && (\n                <Stack gap=\"xs\">\n                  {metaCols.slice(0, 3).map((c: DataViewColumn) => (\n                    <Row key={c.key} justify=\"between\" gap=\"sm\" align=\"center\">\n                      <span className=\"text-xs text-muted-foreground\">\n                        {typeof c.header === \"string\" ? c.header : c.key}\n                      </span>\n                      <span className=\"text-sm\">{renderCell(c, row.original)}</span>\n                    </Row>\n                  ))}\n                </Stack>\n              )}\n            </Stack>\n          </Card>\n        );\n      })}\n    </div>\n  );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as RadioGroupPrimitive from \"@radix-ui/react-radio-group\";\nimport { CircleIcon } 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      data-slot=\"radio-group\"\n      className={cn(\"grid gap-3\", 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      data-slot=\"radio-group-item\"\n      className={cn(\n        // shadcn (radix) structure: neutral `border-input` at rest, the\n        // ring-[3px] focus model, shadow-xs, dark fill and aria-invalid\n        // states. The indicator dot is `fill-primary`.\n        \"aspect-square size-4 shrink-0 rounded-full border border-input text-primary shadow-xs outline-none transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:bg-input/30 dark:aria-invalid:ring-destructive/40\",\n        className\n      )}\n      {...props}\n    >\n      <RadioGroupPrimitive.Indicator\n        data-slot=\"radio-group-indicator\"\n        className=\"relative flex items-center justify-center\"\n      >\n        <CircleIcon className=\"absolute left-1/2 top-1/2 size-2 -translate-x-1/2 -translate-y-1/2 fill-primary\" />\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 * 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 * Menu density. Set `size` on `<SelectContent>` and every `<SelectItem>`\n * inside it picks up matching padding / text-size / check-indicator\n * sizing via context — so a compact trigger (`size=\"xs\"`) can have an\n * equally compact dropdown without per-item overrides. React context\n * flows through the Radix portal (it follows the React tree, not the\n * DOM), so items styled this way work even though the menu is portaled.\n */\ntype SelectMenuSize = \"default\" | \"sm\" | \"xs\" | \"2xs\";\nconst SelectMenuSizeContext = React.createContext<SelectMenuSize>(\"default\");\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  // data-[placeholder] (not placeholder:) — Radix renders the Select\n  // placeholder as a span flagged with that attribute; the input-style\n  // pseudo-element selector never matches, so ghost values rendered\n  // through the placeholder were showing full-strength.\n  \"flex w-full items-center justify-between rounded-md border border-input bg-background dark:bg-input/30 data-[placeholder]:text-muted-foreground focus-visible:outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1\",\n  {\n    variants: {\n      size: {\n        default: \"h-9 px-3 py-1 text-sm\",\n        sm: \"h-8 px-2 py-1 text-sm\",\n        // Figma-density — tool panels (the Studio inspector, shader controls).\n        xs: \"h-7 px-2 py-0 text-xs\",\n        // rounded-lg (a step up from the base rounded-md) + tighter\n        // leading edge — at h-6 the md radius reads boxy and the 8px\n        // inset pushed the property glyph too far in.\n        \"2xs\": \"h-6 rounded-lg pl-1.5 pr-2 py-0 text-2xs\",\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    /** Adornment rendered inside the trigger on the leading edge — a\n     *  property glyph, a unit. Mirrors Input's startSlot. Grouped with\n     *  the value in a div (NOT a bare span: the trigger's\n     *  `[&>span]:line-clamp-1` would stack a span's children\n     *  vertically). */\n    startSlot?: React.ReactNode;\n    /** Hide the dropdown chevron — Figma-style token fields keep the\n     *  right edge for their own affordances (detach/attach). */\n    chevron?: boolean;\n  }\n>(\n  (\n    { className, children, size = \"default\", startSlot, chevron = true, ...props },\n    ref,\n  ) => (\n  <SelectPrimitive.Trigger\n    ref={ref}\n    className={cn(selectTriggerVariants({ size }), className)}\n    {...props}\n  >\n    {startSlot ? (\n      <div className=\"flex min-w-0 flex-1 items-center gap-1.5 [&>span]:truncate\">\n        <span className=\"pointer-events-none flex shrink-0 items-center text-muted-foreground/70 [&_svg]:size-4\">\n          {startSlot}\n        </span>\n        {children}\n      </div>\n    ) : (\n      children\n    )}\n    {chevron ? (\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    ) : null}\n  </SelectPrimitive.Trigger>\n  ),\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    size?: SelectMenuSize;\n    /** Portal target. Defaults to document.body; pass a themed wrapper to\n     *  keep the menu inside a scoped theme (e.g. the Studio preview, where\n     *  the theme is applied to a div, not :root). */\n    container?: HTMLElement | null;\n  }\n>(({ className, children, position = \"popper\", size = \"default\", container, ...props }, ref) => (\n  <SelectPrimitive.Portal container={container ?? undefined}>\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          size === \"default\" ? \"p-1\" : \"p-0.5\",\n          position === \"popper\" &&\n            \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"\n        )}\n      >\n        <SelectMenuSizeContext.Provider value={size}>\n          {children}\n        </SelectMenuSizeContext.Provider>\n      </SelectPrimitive.Viewport>\n      <SelectScrollDownButton />\n    </SelectPrimitive.Content>\n  </SelectPrimitive.Portal>\n));\nSelectContent.displayName = SelectPrimitive.Content.displayName;\n\n/** Group-heading classes per menu density. The compact sizes read as\n *  quiet eyebrow labels (muted, smaller than the items) — a heading\n *  LARGER than the options it introduces reads upside-down at tool-\n *  panel density. Left padding matches the item text indent per size\n *  so headings and option labels align. */\nconst selectLabelSizeClasses: Record<SelectMenuSize, string> = {\n  default: \"py-1.5 pl-8 pr-2 text-sm font-semibold\",\n  sm: \"py-1 pl-7 pr-2 text-xs font-semibold\",\n  xs: \"py-1 pl-6 pr-2 text-2xs font-medium text-muted-foreground uppercase tracking-wide\",\n  \"2xs\": \"py-0.5 pl-6 pr-2 text-2xs font-medium text-muted-foreground uppercase tracking-wide\",\n};\n\nconst SelectLabel = React.forwardRef<\n  React.ComponentRef<typeof SelectPrimitive.Label>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => {\n  // Reads the menu density from SelectContent — same mechanism as\n  // SelectItem, so group headings scale with the menu they're in.\n  const size = React.useContext(SelectMenuSizeContext);\n  return (\n    <SelectPrimitive.Label\n      ref={ref}\n      className={cn(selectLabelSizeClasses[size], className)}\n      {...props}\n    />\n  );\n});\nSelectLabel.displayName = SelectPrimitive.Label.displayName;\n\nconst selectItemVariants = cva(\n  \"relative flex w-full cursor-default select-none items-center rounded-sm outline-none focus:bg-accent focus:text-accent-foreground focus:[&_svg]:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n  {\n    variants: {\n      size: {\n        default: \"py-1.5 pl-8 pr-2 text-sm\",\n        sm: \"py-1 pl-7 pr-2 text-sm\",\n        xs: \"py-1 pl-6 pr-2 text-xs\",\n        \"2xs\": \"py-0.5 pl-6 pr-2 text-2xs\",\n      },\n    },\n    defaultVariants: { size: \"default\" },\n  }\n);\n\nconst SelectItem = React.forwardRef<\n  React.ComponentRef<typeof SelectPrimitive.Item>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item> & {\n    /** Optional right-aligned secondary text (e.g. a token's resolved\n     *  value). Rendered in the menu row only — NOT inside ItemText, so\n     *  it never mirrors into the trigger via SelectValue. */\n    hint?: React.ReactNode;\n  }\n>(({ className, children, hint, ...props }, ref) => {\n  const size = React.useContext(SelectMenuSizeContext);\n  const compact = size !== \"default\";\n  return (\n    <SelectPrimitive.Item\n      ref={ref}\n      className={cn(\"group\", selectItemVariants({ size }), className)}\n      {...props}\n    >\n      <span\n        className={cn(\n          \"absolute flex items-center justify-center\",\n          compact ? \"left-1.5 h-3 w-3\" : \"left-2 h-3.5 w-3.5\",\n        )}\n      >\n        <SelectPrimitive.ItemIndicator>\n          <Check className={compact ? \"h-3 w-3\" : \"h-4 w-4\"} />\n        </SelectPrimitive.ItemIndicator>\n      </span>\n      <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n      {hint != null ? (\n        // Brightens on the highlighted row — muted-on-accent was\n        // unreadable under the hover/focus background.\n        <span className=\"ml-auto pl-3 tabular-nums text-muted-foreground/60 group-focus:text-accent-foreground/80 group-data-[highlighted]:text-accent-foreground/80\">\n          {hint}\n        </span>\n      ) : null}\n    </SelectPrimitive.Item>\n  );\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 { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\n\n/**\n * Swatch — a single colour chip.\n *\n * THE primitive for showing a colour: brand-pop strips, palette pickers,\n * theme previews, token galleries, \"pick an accent\" rows. A swatch reads a\n * value from one of two places, in priority order:\n *\n *   - `color`  — any raw CSS colour (`#1f6feb`, `oklch(...)`, `rgb(...)`,\n *                even `var(--whatever)`). Use for one-off / external colours.\n *   - `token`  — a Grade colour token NAME (no `--` and no `oklch()` wrap),\n *                resolved to `oklch(var(--<token>))`. This is the design-system\n *                path: `token=\"brand-3\"`, `token=\"primary\"`, `token=\"chart-2\"`.\n *                Because it points at the live CSS variable, the swatch\n *                re-voices automatically when the theme changes.\n *\n * A transparency checkerboard sits behind the fill (shared with the rest of\n * the system via `--gds-media-checker-*`), so semi-transparent values read\n * honestly instead of compositing against an opaque tile.\n *\n * Pass `onSelect` to make it pickable — it renders a real <button> with\n * `aria-pressed`, a focus ring, and a hover lift. `selected` draws the\n * shared selection ring (`--selected`). Pass `label` to caption it (the\n * caption also becomes the accessible name / tooltip).\n *\n * Sizing is the t-shirt scale (2xs → xl, 16px → 56px); reach for `size` over `h-*`/`w-*`\n * utilities so the scale stays on tokens. Shape is square / rounded (rides\n * `--radius`) / circle.\n */\nconst swatchVariants = cva(\n  // The border is drawn as an overlay ABOVE the fill (see the component) —\n  // an inset ring here would be painted over by an opaque fill and vanish.\n  \"relative inline-block shrink-0 overflow-hidden shadow-elevation-1\",\n  {\n    variants: {\n      size: {\n        \"2xs\": \"size-4\",\n        xs: \"size-5\",\n        sm: \"size-6\",\n        md: \"size-8\",\n        lg: \"size-10\",\n        xl: \"size-14\",\n      },\n      shape: {\n        square: \"rounded-none\",\n        rounded: \"rounded-[var(--radius)]\",\n        circle: \"rounded-full\",\n      },\n    },\n    compoundVariants: [\n      // At 16px the full --radius reads as a squircle — pin the rounded\n      // 2xs chip to a 2px hairline so it stays visually square.\n      { size: \"2xs\", shape: \"rounded\", class: \"rounded-[2px]\" },\n    ],\n    defaultVariants: {\n      size: \"md\",\n      shape: \"rounded\",\n    },\n  }\n);\n\n/** Resolve the displayed fill: raw `color` wins, else wrap a `token` name. */\nfunction resolveFill(color?: string, token?: string): string {\n  if (color) return color;\n  if (token) return `oklch(var(--${token.replace(/^--/, \"\")}))`;\n  return \"transparent\";\n}\n\n/** Native `<input type=\"color\">` only accepts #rgb / #rrggbb. */\nconst HEX_RE = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i;\n\ntype SwatchSize = NonNullable<VariantProps<typeof swatchVariants>[\"size\"]>;\ntype SwatchShape = NonNullable<VariantProps<typeof swatchVariants>[\"shape\"]>;\n\n/** SwatchGroup hands `size` / `shape` down so a strip stays consistent\n *  without repeating the prop on every chip. */\nconst SwatchGroupContext = React.createContext<{\n  size?: SwatchSize;\n  shape?: SwatchShape;\n}>({});\n\nexport interface SwatchProps\n  extends Omit<React.HTMLAttributes<HTMLElement>, \"color\">,\n    VariantProps<typeof swatchVariants> {\n  /** Any raw CSS colour. Takes precedence over `token`. */\n  color?: string;\n  /** A Grade colour token name (no `--`), resolved as `oklch(var(--<token>))`. */\n  token?: string;\n  /** Fill kind. Defaults to \"solid\", or is inferred from `image` / `gradient`\n   *  when omitted. Drives what the chip renders in place. */\n  type?: \"solid\" | \"gradient\" | \"image\";\n  /** CSS gradient for `type=\"gradient\"` — e.g. `\"linear-gradient(135deg,#6366f1,#ec4899)\"`. */\n  gradient?: string;\n  /** Image URL for `type=\"image\"` — rendered cover-fit behind the chip. */\n  image?: string;\n  /** Optional caption rendered beneath the chip; also the accessible name. */\n  label?: React.ReactNode;\n  /** Draws the shared selection ring (`--selected`). */\n  selected?: boolean;\n  /** Makes the swatch a pickable <button> and fires on activation. */\n  onSelect?: () => void;\n  /** Makes the swatch an editable colour well: hosts a native\n   *  `<input type=\"color\">` (the OS picker) behind the chip and fires with\n   *  the new `#rrggbb`. The presentation stays the DS chip; the interaction\n   *  stays native. Takes precedence over `onSelect`. */\n  onColorChange?: (value: string) => void;\n}\n\nconst Swatch = React.forwardRef<HTMLElement, SwatchProps>(function Swatch(\n  {\n    color,\n    token,\n    type,\n    gradient,\n    image,\n    size,\n    shape,\n    label,\n    selected,\n    onSelect,\n    onColorChange,\n    className,\n    style,\n    title,\n    \"aria-label\": ariaLabel,\n    ...props\n  },\n  ref\n) {\n  const group = React.useContext(SwatchGroupContext);\n  const resolvedSize = size ?? group.size;\n  const resolvedShape = shape ?? group.shape;\n  const resolvedType = type ?? (image ? \"image\" : gradient ? \"gradient\" : \"solid\");\n  const fill =\n    resolvedType === \"image\" && image\n      ? `url(\"${image}\") center / cover no-repeat`\n      : resolvedType === \"gradient\" && gradient\n        ? gradient\n        : resolveFill(color, token);\n  const editable = typeof onColorChange === \"function\";\n  const interactive = !editable && typeof onSelect === \"function\";\n  // Native colour input only accepts hex; fall back so it stays usable\n  // even when the displayed fill is a token/oklch/rgba value.\n  const hex = HEX_RE.test(color ?? \"\") ? (color as string) : \"#000000\";\n  const name =\n    (typeof label === \"string\" ? label : undefined) ??\n    token ??\n    color ??\n    \"colour swatch\";\n\n  // Shared transparency checkerboard — same tokens MediaSurface's image\n  // well uses, so a translucent fill reads honestly in both modes.\n  const checker: React.CSSProperties = {\n    backgroundImage:\n      \"repeating-conic-gradient(var(--gds-media-checker-color) 0% 25%, transparent 0% 50%)\",\n    backgroundSize:\n      \"var(--gds-media-checker-size) var(--gds-media-checker-size)\",\n  };\n\n  // editable → a <label> hosting the native picker; pickable → a <button>;\n  // otherwise a static <div>.\n  const Comp = (\n    editable ? \"label\" : interactive ? \"button\" : \"div\"\n  ) as React.ElementType;\n\n  const tile = (\n    <Comp\n      ref={ref as never}\n      data-gds-part=\"swatch\"\n      data-selected={selected ? \"\" : undefined}\n      title={title ?? name}\n      aria-label={ariaLabel ?? (interactive ? name : undefined)}\n      aria-pressed={interactive ? !!selected : undefined}\n      type={interactive ? \"button\" : undefined}\n      onClick={interactive ? onSelect : undefined}\n      className={cn(\n        swatchVariants({ size: resolvedSize, shape: resolvedShape }),\n        selected &&\n          \"ring-2 ring-selected ring-offset-2 ring-offset-background\",\n        (interactive || editable) &&\n          \"cursor-pointer outline-none transition-transform hover:scale-[1.06] focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2 focus-within:ring-offset-background focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n        // When captioned, the wrapper owns layout className; the tile keeps\n        // its own variant classes only.\n        !label && className\n      )}\n      style={{ ...checker, ...(label ? undefined : style) }}\n      {...(label ? {} : props)}\n    >\n      <span className=\"absolute inset-0\" style={{ background: fill }} />\n      {/* Border drawn on TOP of the fill so it survives an opaque colour;\n          foreground-based so it reads on any surface (light hairline on\n          dark, dark on light). Clipped to the chip's radius by the parent's\n          overflow-hidden. */}\n      <span\n        aria-hidden\n        className=\"pointer-events-none absolute inset-0 rounded-[inherit] ring-[0.5px] ring-inset ring-border\"\n      />\n      {editable && (\n        // Native OS colour picker, kept fully functional but visually\n        // replaced by the chip above. Covers the tile so the whole chip\n        // is the hit target.\n        <input\n          type=\"color\"\n          value={hex}\n          onChange={(e) => onColorChange!(e.currentTarget.value)}\n          aria-label={ariaLabel ?? name}\n          className=\"absolute inset-0 cursor-pointer opacity-0\"\n        />\n      )}\n    </Comp>\n  );\n\n  if (!label) return tile;\n\n  return (\n    <div\n      className={cn(\"inline-flex flex-col items-start gap-1.5\", className)}\n      style={style}\n      {...props}\n    >\n      {tile}\n      <span className=\"text-xs leading-none text-muted-foreground\">{label}</span>\n    </div>\n  );\n});\nSwatch.displayName = \"Swatch\";\n\n/* ──────────────────────────────────────────────────────────────────────\n   SwatchGroup — arrange a set of <Swatch>es.\n\n   `layout=\"row\"` (default) spaces them out; `layout=\"stack\"` overlaps them\n   into a single coin-stack (the theme-picker / \"key colours\" treatment),\n   where each chip's own ring reads as the separating edge. `size` / `shape`\n   set here cascade to every child so a strip stays consistent without\n   repeating the prop. The overlap tightens/loosens with `size`.\n   ────────────────────────────────────────────────────────────────────── */\n\nconst STACK_OVERLAP: Record<SwatchSize, string> = {\n  \"2xs\": \"-space-x-1\",\n  xs: \"-space-x-1.5\",\n  sm: \"-space-x-2\",\n  md: \"-space-x-2.5\",\n  lg: \"-space-x-3\",\n  xl: \"-space-x-4\",\n};\n\nconst GAP: Record<NonNullable<SwatchGroupProps[\"gap\"]>, string> = {\n  xs: \"gap-1\",\n  sm: \"gap-2\",\n  md: \"gap-3\",\n  lg: \"gap-4\",\n};\n\nexport interface SwatchGroupProps\n  extends React.HTMLAttributes<HTMLDivElement> {\n  /** `row` spaces them out; `stack` overlaps into a coin-stack. Default row. */\n  layout?: \"row\" | \"stack\";\n  /** Cascades to every child Swatch. */\n  size?: SwatchSize;\n  /** Cascades to every child Swatch. */\n  shape?: SwatchShape;\n  /** Spacing between chips in `row` layout. Default sm. */\n  gap?: \"xs\" | \"sm\" | \"md\" | \"lg\";\n}\n\nconst SwatchGroup = React.forwardRef<HTMLDivElement, SwatchGroupProps>(\n  function SwatchGroup(\n    { layout = \"row\", size, shape, gap = \"sm\", className, children, ...props },\n    ref\n  ) {\n    const stacked = layout === \"stack\";\n    return (\n      <SwatchGroupContext.Provider value={{ size, shape }}>\n        <div\n          ref={ref}\n          data-gds-part=\"swatch-group\"\n          data-layout={layout}\n          className={cn(\n            \"inline-flex flex-wrap items-center\",\n            stacked\n              ? cn(\n                  STACK_OVERLAP[size ?? \"md\"],\n                  // Each chip's edge reads as the page colour so overlaps\n                  // separate cleanly (higher specificity beats the base\n                  // border ring).\n                  \"[&_[data-gds-part=swatch]]:ring-2 [&_[data-gds-part=swatch]]:ring-background\"\n                )\n              : GAP[gap],\n            className\n          )}\n          {...props}\n        >\n          {children}\n        </div>\n      </SwatchGroupContext.Provider>\n    );\n  }\n);\nSwatchGroup.displayName = \"SwatchGroup\";\n\nexport { Swatch, SwatchGroup, swatchVariants };\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\";\nimport { SURFACE_CLASS, surfaceBg, type Surface } from \"@/lib/surface\";\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 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\nexport interface SheetContentProps\n  extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>,\n    VariantProps<typeof sheetVariants> {\n  /** Extra classes for the backdrop overlay. e.g. `bg-transparent`\n   *  keeps click-outside-to-close while removing the dimming — useful\n   *  when the whole point is watching the page behind the sheet\n   *  change (the embed theme playground). */\n  overlayClassName?: string;\n  /** Extra classes for the built-in close button — reposition it or\n   *  restyle it as a full icon button (the default is a bare X at\n   *  right-4 top-4 with an opacity hover). */\n  closeClassName?: string;\n  /**\n   * What the sheet panel is *made of*. `solid` is the default opaque\n   * `bg-background`. `glass` lets the page show through with a 14px\n   * blur — the canonical \"inspector panel\" feel. Composes with the\n   * overlay scrim. See sheet.md for scenarios.\n   */\n  surface?: Surface;\n}\n\nconst SheetContent = React.forwardRef<\n  React.ComponentRef<typeof SheetPrimitive.Content>,\n  SheetContentProps\n>(({ side = \"right\", surface = \"solid\", className, overlayClassName, closeClassName, children, ...props }, ref) => (\n  <SheetPortal>\n    <SheetOverlay className={overlayClassName} />\n    <SheetPrimitive.Content\n      ref={ref}\n      data-surface={surface}\n      className={cn(\n        sheetVariants({ side }),\n        surfaceBg(surface, \"bg-background\"),\n        SURFACE_CLASS[surface],\n        className\n      )}\n      {...props}\n    >\n      {children}\n      <SheetPrimitive.Close\n        className={cn(\n          \"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          closeClassName\n        )}\n      >\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 * as React from \"react\";\nimport { 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\n/**\n * `size` controls the visual weight. `default` is the standard control;\n * `sm` is the dense, subtle track for tool panels / inspectors (thin\n * muted track, small thumb) so a panel of sliders reads quietly.\n */\ntype SliderSize = \"default\" | \"sm\";\n\nconst SIZE: Record<\n  SliderSize,\n  { track: string; range: string; thumb: string }\n> = {\n  default: {\n    track: \"h-2 bg-secondary\",\n    range: \"bg-primary\",\n    thumb:\n      \"h-5 w-5 border-2 border-primary focus-visible:ring-2 focus-visible:ring-offset-2\",\n  },\n  sm: {\n    track: \"h-[3px] bg-border\",\n    range: \"bg-foreground/40\",\n    thumb:\n      \"h-3 w-3 border border-border hover:border-foreground/40 focus-visible:ring-2\",\n  },\n};\n\nconst Slider = React.forwardRef<\n  React.ComponentRef<typeof SliderPrimitive.Root>,\n  React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root> & {\n    size?: SliderSize;\n  }\n>(({ className, size = \"default\", ...props }, ref) => {\n  const s = SIZE[size];\n  return (\n    <SliderPrimitive.Root\n      ref={ref}\n      className={cn(\n        // py-2 gives a taller, transparent hit area (Radix moves the thumb to\n        // wherever you press inside the Root), so a thin track is still easy\n        // to grab. `-my-1` claws back most of that height from the layout so\n        // dense rows don't balloon. cursor-pointer signals the whole band.\n        \"relative flex w-full cursor-pointer touch-none select-none items-center py-2 -my-1\",\n        className\n      )}\n      {...props}\n    >\n      <SliderPrimitive.Track\n        className={cn(\n          \"relative w-full grow overflow-hidden rounded-full\",\n          s.track\n        )}\n      >\n        <SliderPrimitive.Range className={cn(\"absolute h-full rounded-full\", s.range)} />\n      </SliderPrimitive.Track>\n      <SliderPrimitive.Thumb\n        className={cn(\n          \"block rounded-full bg-background shadow-sm ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n          s.thumb\n        )}\n      />\n    </SliderPrimitive.Root>\n  );\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\" iconOnly>…</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","\"use client\";\n\nimport * as React from \"react\";\nimport * as SwitchPrimitives from \"@radix-ui/react-switch\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"@/lib/utils\";\n\n/**\n * Switch — shadcn (radix) styling (shadow-xs, ring-[3px] focus, dark\n * track + thumb variants) over Grade's size scale.\n *\n * Grade trait kept on purpose: four sizes (the upstream shadcn switch\n * ships only `sm`/`default`). Track + thumb scale together via the\n * shared control-size scale; dimensions stay on Tailwind's spacing\n * scale (no arbitrary values). With `border-2`, thumb travel =\n * trackWidth − thumbWidth − 2×border, which lands on a clean\n * `translate-x-*` step at each size. `xs`/`2xs` are the dense\n * tool-panel sizes (the Studio inspector).\n */\nconst switchTrackVariants = cva(\n  \"peer inline-flex shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-xs outline-none transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input dark:data-[state=unchecked]:bg-input/80\",\n  {\n    variants: {\n      size: {\n        default: \"h-6 w-11\", // 24×44 — thumb 20, travel 20\n        sm: \"h-5 w-9\", // 20×36 — thumb 16, travel 16\n        xs: \"h-4 w-7\", // 16×28 — thumb 12, travel 12\n        \"2xs\": \"h-3 w-5\", // 12×20 — thumb 8, travel 8\n      },\n    },\n    defaultVariants: { size: \"default\" },\n  }\n);\n\nconst switchThumbVariants = cva(\n  \"pointer-events-none block rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=unchecked]:translate-x-0 dark:data-[state=checked]:bg-primary-foreground dark:data-[state=unchecked]:bg-foreground\",\n  {\n    variants: {\n      size: {\n        default: \"h-5 w-5 data-[state=checked]:translate-x-5\",\n        sm: \"h-4 w-4 data-[state=checked]:translate-x-4\",\n        xs: \"h-3 w-3 data-[state=checked]:translate-x-3\",\n        \"2xs\": \"h-2 w-2 data-[state=checked]:translate-x-2\",\n      },\n    },\n    defaultVariants: { size: \"default\" },\n  }\n);\n\ntype SwitchSize = NonNullable<VariantProps<typeof switchTrackVariants>[\"size\"]>;\n\nconst Switch = React.forwardRef<\n  React.ComponentRef<typeof SwitchPrimitives.Root>,\n  Omit<React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>, \"size\"> & {\n    size?: SwitchSize;\n  }\n>(({ className, size = \"default\", ...props }, ref) => (\n  <SwitchPrimitives.Root\n    data-slot=\"switch\"\n    data-size={size}\n    className={cn(switchTrackVariants({ size }), className)}\n    {...props}\n    ref={ref}\n  >\n    <SwitchPrimitives.Thumb\n      data-slot=\"switch-thumb\"\n      className={cn(switchThumbVariants({ size }))}\n    />\n  </SwitchPrimitives.Root>\n));\nSwitch.displayName = SwitchPrimitives.Root.displayName;\n\nexport { Switch };\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<\"span\">) => {\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  //\n  // <span>, NOT <li> (where shadcn puts it): the model routinely\n  // composes the separator INSIDE <BreadcrumbItem> rather than as a\n  // sibling, and li-in-li is invalid HTML — React 19 throws a\n  // hydration error and the whole screen re-renders client-side. A\n  // span is valid in both positions (browsers tolerate it as an <ol>\n  // child; it's aria-hidden presentation either way), so the\n  // component absorbs both compositions instead of failing one.\n  const fromContext = React.useContext(BreadcrumbSeparatorContext)\n  return (\n    <span\n      role=\"presentation\"\n      aria-hidden=\"true\"\n      className={cn(\n        \"inline-flex items-center [&_svg]:size-3 [&_svg]:shrink-0 text-muted-foreground/60\",\n        className\n      )}\n      {...props}\n    >\n      {children ?? fromContext}\n    </span>\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 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-2xs 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","\"use client\"\n\nimport * as React from \"react\"\nimport * as RechartsPrimitive from \"recharts\"\n\nimport { cn } from \"@/lib/utils\"\n\n// Format: { THEME_NAME: CSS_SELECTOR }\nconst THEMES = { light: \"\", dark: \".dark\" } as const\n\nexport type ChartConfig = {\n  [k in string]: {\n    label?: React.ReactNode\n    icon?: React.ComponentType\n  } & (\n    | { color?: string; theme?: never }\n    | { color?: never; theme: Record<keyof typeof THEMES, string> }\n  )\n}\n\ntype ChartContextProps = {\n  config: ChartConfig\n}\n\nconst ChartContext = React.createContext<ChartContextProps | null>(null)\n\nfunction useChart() {\n  const context = React.useContext(ChartContext)\n\n  if (!context) {\n    throw new Error(\"useChart must be used within a <ChartContainer />\")\n  }\n\n  return context\n}\n\nconst ChartContainer = React.forwardRef<\n  HTMLDivElement,\n  React.ComponentProps<\"div\"> & {\n    config: ChartConfig\n    children: React.ComponentProps<\n      typeof RechartsPrimitive.ResponsiveContainer\n    >[\"children\"]\n  }\n>(({ id, className, children, config, onTouchEnd, onTouchCancel, ...props }, ref) => {\n  const uniqueId = React.useId()\n  const chartId = `chart-${id || uniqueId.replace(/:/g, \"\")}`\n  const containerRef = React.useRef<HTMLDivElement | null>(null)\n\n  const setRefs = React.useCallback(\n    (node: HTMLDivElement | null) => {\n      containerRef.current = node\n      if (typeof ref === \"function\") ref(node)\n      else if (ref) ref.current = node\n    },\n    [ref]\n  )\n\n  // Recharts only clears its tooltip on mouseleave — on touch the cursor\n  // never \"leaves\", so the readout, cursor line and active dot persist\n  // after the finger lifts. Synthesise the leave: a bubbling mouseout is\n  // what React derives onMouseLeave from. Two constraints shape this:\n  //   - DEFERRED a macrotask: after a plain tap (no touchmove) browsers\n  //     fire compatibility mouse events (mouseover/mousemove/…/click)\n  //     AFTER touchend, and recharts re-activates the tooltip from\n  //     those. The timeout runs after that sequence, so the dismissal\n  //     wins for taps as well as scrubs.\n  //   - relatedTarget is the chart CONTAINER, not document.body — React\n  //     fires synthetic mouseleave on every fiber between the target\n  //     and the common ancestor with relatedTarget, so body would leak\n  //     spurious onMouseLeave to every React ancestor (closing hover\n  //     cards / menus that wrap the chart). The container stops the\n  //     chain inside the chart while still covering recharts' wrapper.\n  const dismissTooltip = React.useCallback(() => {\n    window.setTimeout(() => {\n      const container = containerRef.current\n      const wrapper = container?.querySelector(\".recharts-wrapper\")\n      wrapper?.dispatchEvent(\n        new MouseEvent(\"mouseout\", { bubbles: true, relatedTarget: container })\n      )\n    }, 0)\n  }, [])\n  const handleTouchEnd = React.useCallback(\n    (event: React.TouchEvent<HTMLDivElement>) => {\n      onTouchEnd?.(event)\n      dismissTooltip()\n    },\n    [onTouchEnd, dismissTooltip]\n  )\n  const handleTouchCancel = React.useCallback(\n    (event: React.TouchEvent<HTMLDivElement>) => {\n      onTouchCancel?.(event)\n      dismissTooltip()\n    },\n    [onTouchCancel, dismissTooltip]\n  )\n\n  return (\n    <ChartContext.Provider value={{ config }}>\n      <div\n        data-chart={chartId}\n        ref={setRefs}\n        onTouchEnd={handleTouchEnd}\n        onTouchCancel={handleTouchCancel}\n        className={cn(\n          \"flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-none [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-sector]:outline-none [&_.recharts-surface]:outline-none\",\n          className\n        )}\n        {...props}\n      >\n        <ChartTouchStyle id={chartId} />\n        <ChartStyle id={chartId} config={config} />\n        <RechartsPrimitive.ResponsiveContainer>\n          {children}\n        </RechartsPrimitive.ResponsiveContainer>\n      </div>\n    </ChartContext.Provider>\n  )\n})\nChartContainer.displayName = \"Chart\"\n\n/**\n * Touch defaults every touch chart otherwise rediscovers by hand —\n * perfect on desktop, subtly broken on a phone without them:\n *\n *   - `touch-action: pan-y` on the SVG surface: Safari otherwise claims\n *     a horizontal scrub as a scroll and fires pointercancel mid-drag.\n *     pan-y (not none) keeps vertical page scrolling alive — `none`\n *     turns every full-width dashboard chart into a scroll dead-zone\n *     the reader's thumb gets stuck on.\n *   - selection / callout / tap-highlight suppression that reaches the\n *     SVG `text` / `tspan` nodes: inline styles on the wrapper don't\n *     cascade into them, so iOS shows the loupe on long-press.\n *\n * Emitted as real scoped CSS (not Tailwind arbitrary variants) so the\n * rules hold in every consumer regardless of its Tailwind build.\n */\nconst ChartTouchStyle = ({ id }: { id: string }) => (\n  <style\n    dangerouslySetInnerHTML={{\n      __html: `\n[data-chart=${id}] .recharts-surface {\n  touch-action: pan-y;\n  -webkit-tap-highlight-color: transparent;\n}\n[data-chart=${id}] .recharts-surface text,\n[data-chart=${id}] .recharts-surface tspan {\n  user-select: none;\n  -webkit-user-select: none;\n  -webkit-touch-callout: none;\n}\n`,\n    }}\n  />\n)\n\nconst ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {\n  const colorConfig = Object.entries(config).filter(\n    ([, config]) => config.theme || config.color\n  )\n\n  if (!colorConfig.length) {\n    return null\n  }\n\n  return (\n    <style\n      dangerouslySetInnerHTML={{\n        __html: Object.entries(THEMES)\n          .map(\n            ([theme, prefix]) => `\n${prefix} [data-chart=${id}] {\n${colorConfig\n  .map(([key, itemConfig]) => {\n    const color =\n      itemConfig.theme?.[theme as keyof typeof itemConfig.theme] ||\n      itemConfig.color\n    return color ? `  --color-${key}: ${color};` : null\n  })\n  .join(\"\\n\")}\n}\n`\n          )\n          .join(\"\\n\"),\n      }}\n    />\n  )\n}\n\nconst ChartTooltip = RechartsPrimitive.Tooltip\n\nconst ChartTooltipContent = React.forwardRef<\n  HTMLDivElement,\n  React.ComponentProps<typeof RechartsPrimitive.Tooltip> &\n    React.ComponentProps<\"div\"> & {\n      hideLabel?: boolean\n      hideIndicator?: boolean\n      indicator?: \"line\" | \"dot\" | \"dashed\"\n      nameKey?: string\n      labelKey?: string\n    }\n>(\n  (\n    {\n      active,\n      payload,\n      className,\n      indicator = \"dot\",\n      hideLabel = false,\n      hideIndicator = false,\n      label,\n      labelFormatter,\n      labelClassName,\n      formatter,\n      color,\n      nameKey,\n      labelKey,\n    },\n    ref\n  ) => {\n    const { config } = useChart()\n\n    const tooltipLabel = React.useMemo(() => {\n      if (hideLabel || !payload?.length) {\n        return null\n      }\n\n      const [item] = payload\n      const key = `${labelKey || item?.dataKey || item?.name || \"value\"}`\n      const itemConfig = getPayloadConfigFromPayload(config, item, key)\n      const value =\n        !labelKey && typeof label === \"string\"\n          ? config[label as keyof typeof config]?.label || label\n          : itemConfig?.label\n\n      if (labelFormatter) {\n        return (\n          <div className={cn(\"font-medium\", labelClassName)}>\n            {labelFormatter(value, payload)}\n          </div>\n        )\n      }\n\n      if (!value) {\n        return null\n      }\n\n      return <div className={cn(\"font-medium\", labelClassName)}>{value}</div>\n    }, [\n      label,\n      labelFormatter,\n      payload,\n      hideLabel,\n      labelClassName,\n      config,\n      labelKey,\n    ])\n\n    if (!active || !payload?.length) {\n      return null\n    }\n\n    const nestLabel = payload.length === 1 && indicator !== \"dot\"\n\n    return (\n      <div\n        ref={ref}\n        className={cn(\n          \"grid min-w-[8rem] items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl\",\n          className\n        )}\n      >\n        {!nestLabel ? tooltipLabel : null}\n        <div className=\"grid gap-1.5\">\n          {payload\n            .filter((item) => item.type !== \"none\")\n            .map((item, index) => {\n              const key = `${nameKey || item.name || item.dataKey || \"value\"}`\n              const itemConfig = getPayloadConfigFromPayload(config, item, key)\n              const indicatorColor = color || item.payload.fill || item.color\n\n              return (\n                <div\n                  key={item.dataKey}\n                  className={cn(\n                    \"flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground\",\n                    indicator === \"dot\" && \"items-center\"\n                  )}\n                >\n                  {formatter && item?.value !== undefined && item.name ? (\n                    formatter(item.value, item.name, item, index, item.payload)\n                  ) : (\n                    <>\n                      {itemConfig?.icon ? (\n                        <itemConfig.icon />\n                      ) : (\n                        !hideIndicator && (\n                          <div\n                            className={cn(\n                              \"shrink-0 rounded-[2px] border-(--color-border) bg-(--color-bg)\",\n                              {\n                                \"h-2.5 w-2.5\": indicator === \"dot\",\n                                \"w-1\": indicator === \"line\",\n                                \"w-0 border-[1.5px] border-dashed bg-transparent\":\n                                  indicator === \"dashed\",\n                                \"my-0.5\": nestLabel && indicator === \"dashed\",\n                              }\n                            )}\n                            style={\n                              {\n                                \"--color-bg\": indicatorColor,\n                                \"--color-border\": indicatorColor,\n                              } as React.CSSProperties\n                            }\n                          />\n                        )\n                      )}\n                      <div\n                        className={cn(\n                          \"flex flex-1 justify-between leading-none\",\n                          nestLabel ? \"items-end\" : \"items-center\"\n                        )}\n                      >\n                        <div className=\"grid gap-1.5\">\n                          {nestLabel ? tooltipLabel : null}\n                          <span className=\"text-muted-foreground\">\n                            {itemConfig?.label || item.name}\n                          </span>\n                        </div>\n                        {item.value && (\n                          <span className=\"font-mono font-medium tabular-nums text-foreground\">\n                            {item.value.toLocaleString()}\n                          </span>\n                        )}\n                      </div>\n                    </>\n                  )}\n                </div>\n              )\n            })}\n        </div>\n      </div>\n    )\n  }\n)\nChartTooltipContent.displayName = \"ChartTooltip\"\n\nconst ChartLegend = RechartsPrimitive.Legend\n\nconst ChartLegendContent = React.forwardRef<\n  HTMLDivElement,\n  React.ComponentProps<\"div\"> &\n    Pick<RechartsPrimitive.LegendProps, \"payload\" | \"verticalAlign\"> & {\n      hideIcon?: boolean\n      nameKey?: string\n    }\n>(\n  (\n    { className, hideIcon = false, payload, verticalAlign = \"bottom\", nameKey },\n    ref\n  ) => {\n    const { config } = useChart()\n\n    if (!payload?.length) {\n      return null\n    }\n\n    return (\n      <div\n        ref={ref}\n        className={cn(\n          \"flex items-center justify-center gap-4\",\n          verticalAlign === \"top\" ? \"pb-3\" : \"pt-3\",\n          className\n        )}\n      >\n        {payload\n          .filter((item) => item.type !== \"none\")\n          .map((item) => {\n            const key = `${nameKey || item.dataKey || \"value\"}`\n            const itemConfig = getPayloadConfigFromPayload(config, item, key)\n\n            return (\n              <div\n                key={item.value}\n                className={cn(\n                  \"flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground\"\n                )}\n              >\n                {itemConfig?.icon && !hideIcon ? (\n                  <itemConfig.icon />\n                ) : (\n                  <div\n                    className=\"h-2 w-2 shrink-0 rounded-[2px]\"\n                    style={{\n                      backgroundColor: item.color,\n                    }}\n                  />\n                )}\n                {itemConfig?.label}\n              </div>\n            )\n          })}\n      </div>\n    )\n  }\n)\nChartLegendContent.displayName = \"ChartLegend\"\n\n// Helper to extract item config from a payload.\nfunction getPayloadConfigFromPayload(\n  config: ChartConfig,\n  payload: unknown,\n  key: string\n) {\n  if (typeof payload !== \"object\" || payload === null) {\n    return undefined\n  }\n\n  const payloadPayload =\n    \"payload\" in payload &&\n    typeof payload.payload === \"object\" &&\n    payload.payload !== null\n      ? payload.payload\n      : undefined\n\n  let configLabelKey: string = key\n\n  if (\n    key in payload &&\n    typeof payload[key as keyof typeof payload] === \"string\"\n  ) {\n    configLabelKey = payload[key as keyof typeof payload] as string\n  } else if (\n    payloadPayload &&\n    key in payloadPayload &&\n    typeof payloadPayload[key as keyof typeof payloadPayload] === \"string\"\n  ) {\n    configLabelKey = payloadPayload[\n      key as keyof typeof payloadPayload\n    ] as string\n  }\n\n  return configLabelKey in config\n    ? config[configLabelKey]\n    : config[key as keyof typeof config]\n}\n\nexport {\n  ChartContainer,\n  ChartTooltip,\n  ChartTooltipContent,\n  ChartLegend,\n  ChartLegendContent,\n  ChartStyle,\n}\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   * Draw the sidebar's OUTER edge: the right-hand rule in `\"rail\"`, the\n   * full outline in `\"panel\"`. Default true, which is the long-standing\n   * look. Set false where the rail's own `bg-card` already separates it\n   * from the content beside it and the rule reads as an artefact, which\n   * is typical on dark, high-contrast themes.\n   *\n   * This controls the outer edge ONLY. The rules under `SidebarHeader`\n   * and above `SidebarFooter` are internal structure and stay put; they\n   * are not part of this switch.\n   */\n  bordered?: boolean;\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      bordered = true,\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 tracked width; panel\n              // floats as its own card and sizes from the parent\n              // flex/grid track. The outer edge each one draws is the\n              // `bordered` switch below, so a borderless rail keeps its\n              // width transition and a borderless panel keeps its\n              // rounding and clipping.\n              isPanel\n                ? \"w-full rounded-lg overflow-hidden\"\n                : \"transition-[width] duration-200 ease-out\",\n              bordered &&\n                (isPanel ? \"border border-border\" : \"border-r border-border\"),\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          // Same tuning seam as the header/content/section: an app can\n          // give the footer identity block more room without reaching\n          // past the component. Defaults are the previous values.\n          collapsed\n            ? \"px-2 py-[var(--gds-sidebar-footer-py,0.5rem)]\"\n            : \"px-[var(--gds-sidebar-footer-px,0.75rem)] py-[var(--gds-sidebar-footer-py,0.5rem)]\",\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  /** Title casing. The component should not silently dictate case\n   *  (Ali, 2026-06-11) — but the HISTORIC defaults differ per variant\n   *  and existing surfaces depend on them, so when unset, legacy\n   *  behaviour is preserved exactly: static headers render UPPERCASE\n   *  (the Notion/Linear treatment), collapsible headers render the\n   *  authored case (a long-standing `normal-case` override). Set\n   *  explicitly to get the same treatment from both variants:\n   *  `\"uppercase\"` for the shouty group label, `\"none\"` for\n   *  sentence-case headers like a \"Recents\" list. */\n  titleTransform?: \"uppercase\" | \"none\";\n}\n\nconst SidebarSection = React.forwardRef<HTMLDivElement, SidebarSectionProps>(\n  (\n    {\n      title,\n      icon,\n      trailing,\n      collapsible = true,\n      defaultExpanded = true,\n      titleTransform,\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                {/* Legacy: collapsible titles render authored case unless\n                    titleTransform asks for uppercase explicitly. */}\n                <span\n                  className={cn(\n                    \"flex-1 text-left truncate\",\n                    titleTransform === \"uppercase\" ? \"uppercase\" : \"normal-case\",\n                  )}\n                >\n                  {title}\n                </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 tracking-wide\",\n                // Legacy default for static headers is uppercase; only an\n                // explicit titleTransform=\"none\" renders authored case.\n                titleTransform === \"none\" ? \"\" : \"uppercase\",\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    // highlight in either size.\n    //\n    // ACTIVE LABEL IS FOREGROUND, NOT PRIMARY (Ali, 11 Aug 2026: \"the\n    // selected text should not be blue as its not readable\"). It was\n    // text-primary on bg-primary/10, which is the action colour sitting on\n    // a 10% wash of itself: on a dark theme whose primary is a saturated\n    // mid-blue that is close to unreadable, and it fails contrast for the\n    // one row a user most needs to identify. The background tint now\n    // carries the state on its own, a little stronger to compensate, and\n    // the label takes full foreground. Note this also changes any ICON in\n    // the row, which inherits currentColor.\n    const stateColor = active\n      ? \"bg-primary/15 text-foreground\"\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      /* cursor-pointer (Ali, 12 Aug: \"can we make sure the cursor changes\n         for the top left logo and buttons\"). A nav row renders as an <a>\n         with no href when it navigates through a click handler, and an\n         anchor without href gets the default cursor, so the rail read as\n         inert text. Buttons have the same gap: the browser default for\n         <button> is `default`, not `pointer`, and neither Button nor this\n         row was setting it. Disabled rows keep pointer-events-none, so\n         they cannot show it. */\n      \"group flex cursor-pointer 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          /* The glyph tracks the row size: a 16px icon in an md row\n             reads undersized against 14px text. sm rows keep 16px.\n             `:not([class*='size-'])` makes this a DEFAULT, not a pin —\n             pass any size-* on the icon itself and it wins. */\n          <span\n            className={cn(\n              \"shrink-0\",\n              isSm\n                ? \"[&>svg:not([class*='size-'])]:size-4\"\n                : \"[&>svg:not([class*='size-'])]:size-5\",\n            )}\n            aria-hidden\n          >\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            /* Tree rows sit at the md scale, so they match SidebarItem;\n               a size-* on the icon overrides this default. */\n            <span\n              className=\"shrink-0 [&>svg:not([class*='size-'])]:size-5\"\n              aria-hidden\n            >\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, RampKey } from \"./oklch\";\nexport type { ModeName, OKLCHTriplet, Ramp, RampKey } 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  poppins: \"var(--font-poppins), 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  poppins: \"Poppins\",\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  poppins: \"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/* ──────────────────────────────────────────────────────────────────────\n   Custom fonts — uploaded typefaces a theme carries WITH it.\n\n   The FONTS registry above covers fonts resident in the app (next/font\n   loaders in layout.tsx). A CustomFontFace is the portable alternative:\n   the theme itself names a family and points at a permanent public URL\n   (the user-assets bucket, migration 0014), and every renderer — root\n   provider, theme-builder scope, Fast Frame sandbox, share view, embed —\n   injects the @font-face at apply time. Deterministic + portable per the\n   STUDIO-THEMES contract: a saved/shared/embedded ThemeInput reproduces\n   the exact face anywhere with no registry registration.\n   ────────────────────────────────────────────────────────────────────── */\n\n/** One uploaded font face a theme carries. Stored on\n *  `ThemeInput.typography.customFonts` and emitted as an @font-face rule\n *  by `fontFaceCSS` (apply.ts) wherever the theme is applied. */\nexport interface CustomFontFace {\n  /** CSS font-family name, e.g. \"Pebble Sans\". Doubles as the display\n   *  label and as the reference target for `custom:<family>` selections. */\n  family: string;\n  /** Permanent public URL for the font file (user-assets bucket). Must be\n   *  publicly resolvable so cross-origin embeds can load it. */\n  url: string;\n  /** @font-face `format()` hint. Derived from the file extension. */\n  format?: \"woff2\" | \"woff\" | \"truetype\" | \"opentype\";\n  /** font-weight descriptor: \"400\", \"700\", or a variable range \"100 900\". */\n  weight?: string;\n  /** font-stretch descriptor range, e.g. \"75% 125%\" for a wdth axis.\n   *  Defaults to a generous \"50% 200%\" (browsers clamp to the font's\n   *  real range) so width-variable fonts respond to font-stretch. */\n  stretch?: string;\n  style?: \"normal\" | \"italic\";\n  /** Drives the generic fallback stack appended after the family. */\n  category?: \"sans\" | \"serif\" | \"mono\";\n  /** Provenance: the `assets` row this face came from (optional — a theme\n   *  must stay renderable even if the library row is gone). */\n  assetId?: string;\n}\n\n/** Prefix marking a typography selection as one of the theme's own\n *  customFonts rather than a FONTS registry key. */\nexport const CUSTOM_FONT_PREFIX = \"custom:\" as const;\n\n/** What `typography.display/body/mono` accept: a registry key, or a\n *  reference to an entry in `typography.customFonts` (\"custom:<family>\"). */\nexport type FontSelection = FontKey | `custom:${string}`;\n\n/** The family name inside a \"custom:<family>\" selection, or null when the\n *  selection is a plain registry FontKey. */\nexport function customFontFamily(sel: string): string | null {\n  return sel.startsWith(CUSTOM_FONT_PREFIX)\n    ? sel.slice(CUSTOM_FONT_PREFIX.length)\n    : null;\n}\n\n/** Generic fallback stacks appended after a custom family. */\nexport const CUSTOM_FONT_FALLBACK: Record<\"sans\" | \"serif\" | \"mono\", string> = {\n  sans: \"system-ui, sans-serif\",\n  serif: \"Georgia, serif\",\n  mono: \"ui-monospace, monospace\",\n};\n\n/** Type scale preset — controls how generous the size ladder is. */\nexport type TypeScalePreset = \"compact\" | \"default\" | \"spacious\";\n\n/** Modular (musical-interval) scale ids — mirror GDS_MODULAR_SCALES in\n *  @gradeui/core. Selecting one generates the type ladder middle-out from\n *  the body size (Utopia model): up by the ratio, down by the reciprocal,\n *  floored. */\nexport type ModularScaleId =\n  | \"minor-second\"\n  | \"major-second\"\n  | \"minor-third\"\n  | \"major-third\"\n  | \"perfect-fourth\"\n  | \"augmented-fourth\"\n  | \"perfect-fifth\"\n  | \"golden-ratio\";\n\n/** What `typography.scale` accepts: a legacy flat preset or a modular ratio. */\nexport type TypeScale = TypeScalePreset | ModularScaleId;\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 */\n/** One semantic token's mapping: a step on one of the three theme ramps,\n *  or an explicit OKLCH triplet for values outside them (pure white or\n *  black surfaces). Structurally identical to the generator's internal\n *  TokenRef, exported here so the Styles panel token editor and the\n *  ThemeInput contract share one shape. */\nexport type ThemeTokenRef =\n  | { source: \"neutral\" | \"primary\" | \"accent\"; step: RampKey }\n  | { source: \"pure\"; value: OKLCHTriplet };\n\n/** The remappable semantic tokens, in display order. Matches the\n *  generator's per-mode TokenMap key for key. */\nexport const SEMANTIC_TOKEN_KEYS = [\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  \"superMutedForeground\",\n  \"accent\",\n  \"accentForeground\",\n  \"border\",\n  \"input\",\n  \"ring\",\n] as const;\nexport type SemanticTokenKey = (typeof SEMANTIC_TOKEN_KEYS)[number];\n\n/** Per-token remap set for one mode. Absent keys keep the mode map's\n *  tuned default. */\nexport type ThemeTokenOverrides = Partial<\n  Record<SemanticTokenKey, ThemeTokenRef>\n>;\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   * Token mapping seam (8 Aug 2026): remap any semantic token to a ramp\n   * step, or a pure OKLCH value, PER MODE (light and dark tune\n   * independently, exactly like the built-in maps). Merged over the\n   * mode's map by the generator, so an absent entry keeps the tuned\n   * default. This is the contract the Styles panel's token editor\n   * writes; ramp-shaped refs keep themes portable and regenerate\n   * cleanly when hues change.\n   */\n  tokenOverrides?: Partial<Record<ModeName, ThemeTokenOverrides>>;\n\n  /**\n   * Focus ring colour. By default the ring (`--ring`) rides the PRIMARY\n   * ramp at a mode-tuned step (500 light / 400 dark / 300 superDark).\n   * `source` re-points it at another ramp; `hue` (0–360) gives the ring\n   * its own dedicated ramp at primary chroma — for brands whose focus\n   * colour is deliberately independent of primary/accent (e.g. a blue\n   * a11y ring on a warm-toned brand). `hue` wins over `source` when both\n   * are set. The mode-tuned step is preserved either way, so contrast\n   * behaviour per mode doesn't change. Deterministic + portable like\n   * every other ThemeInput field.\n   */\n  ring?: {\n    source?: \"primary\" | \"accent\" | \"neutral\";\n    hue?: number;\n  };\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: FontSelection;\n    body: FontSelection;\n    mono: FontSelection;\n    scale: TypeScale;\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    /** CSS font-stretch for body text (spans, paragraphs, component\n     *  text — it inherits everywhere). Meaningful for fonts with a\n     *  wdth axis, e.g. \"90%\" = TT Commons' Compact cut. Default\n     *  \"normal\". Fonts without the axis ignore it. */\n    bodyStretch?: string;\n    /** CSS font-stretch for display/heading text. Defaults to\n     *  bodyStretch so one knob re-cuts the whole theme. */\n    displayStretch?: string;\n    /** Uploaded faces this theme carries. A `custom:<family>` selection\n     *  above must have a matching entry here; unreferenced entries are\n     *  harmless (kept so switching back is instant). */\n    customFonts?: CustomFontFace[];\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  /** Quietest text tier: timestamps, ghost hints, fine print. */\n  superMutedForeground: 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  /** Custom @font-face sources carried through from the input. Whoever\n   *  applies the theme (apply.ts, Fast Frame, Sandpack, embed) is\n   *  responsible for injecting these — the font-family vars above already\n   *  reference the family names. Absent/empty for registry-only themes. */\n  fontFaces?: CustomFontFace[];\n  headingWeight: number;\n  bodyWeight: number;\n  headingTracking: string;\n  /** Resolved CSS font-stretch values (\"normal\" when unset). */\n  bodyStretch: string;\n  displayStretch: 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   * The full named Tailwind ladder (2xs…7xl), present ONLY when\n   * `typography.scale` is a modular ratio id (THEME-MIGRATION.md B2).\n   * Emitted as `--text-<name>` / `--text-<name>--line-height` so every\n   * text-* utility re-pitches when the ratio changes. Presets leave this\n   * undefined — the static ladder in the stylesheet stays untouched.\n   */\n  namedScale?: Record<string, { size: string; lineHeight: string }>;\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   * The Tailwind v4 `--spacing` base unit (e.g. \"0.2125rem\" for tight,\n   * \"0.25rem\" for default, \"0.3rem\" for roomy). Every spacing utility is\n   * calc(var(--spacing) * N), so this single variable re-scales padding,\n   * gaps, margins and sizes across every generated screen — retroactively\n   * (THEME-MIGRATION.md B1).\n   */\n  unit: string;\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  /**\n   * Role ramp families (THEME-MIGRATION.md B4) — every status alias is a\n   * whole ramp because status displays many ways (soft 100 bg, solid 600\n   * fill, 800 text). Seeded from the fixed status hues; emitted as\n   * `--gds-<role>-<step>` triplets alongside primary/accent/neutral\n   * (which reuse `ramps`). Optional so partially-constructed themes stay\n   * valid; generator output always includes it.\n   */\n  roleRamps?: {\n    success: Ramp;\n    warning: Ramp;\n    info: Ramp;\n    highlight: Ramp;\n    destructive: Ramp;\n    /**\n     * Expressive accent ramps — default = the primary hue rotated +60°·k in\n     * OKLCH (k = 1..5). Optional so partially-constructed themes stay valid;\n     * generator output always includes them. Emitted as `--gds-accent{1..5}-<step>`.\n     */\n    accent1?: Ramp;\n    accent2?: Ramp;\n    accent3?: Ramp;\n    accent4?: Ramp;\n    accent5?: 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  CUSTOM_FONT_FALLBACK,\n  customFontFamily,\n  FONTS,\n  type ChartPalette,\n  type ColorIntensity,\n  type CustomFontFace,\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 TypeScale,\n  type TypeScalePreset,\n  type ModularScaleId,\n  type ThemeTokenOverrides,\n  type SemanticTokenKey,\n  type ThemeTokenRef,\n} from \"./types\";\nimport {\n  GDS_MODULAR_SCALES,\n  GDS_TYPE_SIZE_NAMES,\n  modularTypeSizes,\n  type TypeSizeName,\n} from \"@gradeui/core\";\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  /** The quietest text tier (Ali, 8 Aug): timestamps, ghost hints,\n   *  fine print. Sits at the OLD mutedForeground step; mutedForeground\n   *  itself moved one step toward the foreground for firmer secondary\n   *  text (subtitles, field descriptions). */\n  superMutedForeground: 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(600),\n    superMutedForeground: 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(600),\n    superMutedForeground: 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(300),\n    superMutedForeground: 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(400),\n    superMutedForeground: 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\n/**\n * The EFFECTIVE token map for a mode: the tuned built-ins with any\n * ThemeInput.tokenOverrides merged over them. This is what the Styles\n * panel's token editor displays (\"background maps to neutral 50\") and\n * exactly what deriveColorsForMode resolves; keep both on this one\n * function.\n */\nexport function tokenRefsForMode(\n  mode: ModeName,\n  overrides?: ThemeTokenOverrides\n): Record<SemanticTokenKey, ThemeTokenRef> {\n  return {\n    ...MODE_TOKENS[mode],\n    ...(overrides ?? {}),\n  } as Record<SemanticTokenKey, ThemeTokenRef>;\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  /** Optional dedicated ring ramp (ThemeInput.ring). When present, the\n   *  ring token resolves from THIS ramp at the mode-tuned step instead\n   *  of the primary ramp — colour changes, per-mode contrast behaviour\n   *  doesn't. */\n  ringRamp?: Ramp,\n  /** Token mapping seam - see ThemeInput.tokenOverrides. */\n  tokenOverrides?: ThemeTokenOverrides\n): GeneratedColorsMode {\n  // Token mapping seam: ThemeInput.tokenOverrides[mode] wins per key;\n  // everything else keeps the mode's tuned default.\n  const map = { ...MODE_TOKENS[mode], ...(tokenOverrides ?? {}) };\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    superMutedForeground: resolveToken(map.superMutedForeground, 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:\n      ringRamp && map.ring.source !== \"pure\"\n        ? ringRamp[map.ring.step]\n        : 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\n/** Ratio lookup for the modular scales (mirrors GDS_MODULAR_SCALES). */\nconst MODULAR_RATIOS = Object.fromEntries(\n  GDS_MODULAR_SCALES.map((s) => [s.id, s.ratio])\n) as Record<ModularScaleId, number>;\n\n/* ── Phase B guards (THEME-MIGRATION.md B5) ──────────────────────────\n   Floors and clamps so no ratio/density input can produce unreadable\n   text or collapsed spacing. The style-panel sliders should mirror\n   these bounds. */\n/** Smallest font size any generated step may resolve to (10px). */\nconst MIN_TEXT_REM = 0.625;\n/** Modular ratios clamped to sane musical-interval territory. */\nconst MODULAR_RATIO_MIN = 1.02;\nconst MODULAR_RATIO_MAX = 1.8;\n\nconst clamp = (n: number, lo: number, hi: number) =>\n  Math.min(hi, Math.max(lo, n));\n\n/**\n * Per-step line-height curve for the generated named ladder — tighter as\n * size grows. Values mirror the ratios of Tailwind v4's default ladder\n * (and our --text-2xs token), so a generated scale keeps the same\n * vertical rhythm character as the static one it replaces.\n */\nconst TYPE_LINE_HEIGHT_CURVE: Record<TypeSizeName, number> = {\n  \"2xs\": 1.455, // 1rem / 0.6875rem — the static token's ratio\n  xs: 1.333,\n  sm: 1.429,\n  base: 1.5,\n  lg: 1.556,\n  xl: 1.4,\n  \"2xl\": 1.333,\n  \"3xl\": 1.2,\n  \"4xl\": 1.111,\n  \"5xl\": 1,\n  \"6xl\": 1,\n  \"7xl\": 1,\n};\n\n/**\n * Resolve the semantic ladder for a TypeScale.\n *\n * Presets keep the legacy behaviour: a flat multiplier over the\n * hand-tuned BASE_SCALE (zero visual change for existing themes).\n *\n * Modular ids generate MIDDLE-OUT (the Utopia model — utopia.fyi):\n * body anchors step 0 of the named ladder (2xs…7xl, base mid-ladder),\n * headings climb by the ratio, small text descends by the reciprocal\n * with a floor. Semantic slots then map onto named steps: h5=lg, h4=xl,\n * h3=2xl, h2=3xl, h1=4xl, display=6xl — so a ratio swap re-pitches the\n * whole hierarchy in one move.\n */\nfunction typeLadder(scale: TypeScale): Record<keyof typeof BASE_SCALE, number> {\n  if (scale in SCALE_MULTIPLIER) {\n    const mult = SCALE_MULTIPLIER[scale as TypeScalePreset];\n    return Object.fromEntries(\n      Object.entries(BASE_SCALE).map(([k, v]) => [k, v * mult])\n    ) as Record<keyof typeof BASE_SCALE, number>;\n  }\n  const sizes = modularNamedSizes(scale as ModularScaleId);\n  return {\n    display: sizes[\"6xl\"],\n    h1: sizes[\"4xl\"],\n    h2: sizes[\"3xl\"],\n    h3: sizes[\"2xl\"],\n    h4: sizes.xl,\n    h5: sizes.lg,\n    h6: sizes.base,\n    body: sizes.base,\n    bodySm: sizes.sm,\n  };\n}\n\n/** The full named ladder for a modular id — ratio clamped, sizes floored. */\nfunction modularNamedSizes(id: ModularScaleId): Record<TypeSizeName, number> {\n  const ratio = clamp(MODULAR_RATIOS[id], MODULAR_RATIO_MIN, MODULAR_RATIO_MAX);\n  return modularTypeSizes(1, ratio, MIN_TEXT_REM);\n}\n\n/** Resolve a font selection to a concrete font-family string. Registry\n *  keys go through FONTS; \"custom:<family>\" selections resolve to the\n *  quoted family + a generic fallback stack (the matching CustomFontFace\n *  is injected as @font-face at apply time). A custom selection with no\n *  matching face still resolves — the fallback stack renders until the\n *  face exists, and a theme never hard-fails on a missing font. */\nfunction resolveFontFamily(\n  sel: ThemeInput[\"typography\"][\"display\"],\n  faces: CustomFontFace[] | undefined,\n  fallbackCategory: \"sans\" | \"serif\" | \"mono\"\n): string {\n  const family = customFontFamily(sel);\n  if (family === null) return FONTS[sel as FontKey] ?? FONTS.system;\n  const face = faces?.find((f) => f.family === family);\n  const category = face?.category ?? fallbackCategory;\n  return `\"${family}\", ${CUSTOM_FONT_FALLBACK[category]}`;\n}\n\nfunction resolveTypography(\n  input: ThemeInput[\"typography\"]\n): GeneratedTypography {\n  const ladder = typeLadder(input.scale);\n  const rem = (n: number) => `${n.toFixed(3)}rem`;\n\n  // Phase B (THEME-MIGRATION.md B2): a modular scale doesn't just move the\n  // semantic h1…body slots — it re-pitches Tailwind's whole named ladder.\n  // Emitting 2xs…7xl as --text-* lets every `text-xl`-style utility in\n  // every screen ever generated re-scale when the ratio changes. Presets\n  // deliberately emit NO named ladder (today's static values stay).\n  let namedScale: GeneratedTypography[\"namedScale\"];\n  if (!(input.scale in SCALE_MULTIPLIER)) {\n    const sizes = modularNamedSizes(input.scale as ModularScaleId);\n    namedScale = Object.fromEntries(\n      GDS_TYPE_SIZE_NAMES.map((name) => [\n        name,\n        {\n          size: rem(sizes[name]),\n          lineHeight: String(TYPE_LINE_HEIGHT_CURVE[name]),\n        },\n      ])\n    );\n  }\n\n  return {\n    fontSans: resolveFontFamily(input.body, input.customFonts, \"sans\"),\n    fontMono: resolveFontFamily(input.mono, input.customFonts, \"mono\"),\n    fontDisplay: resolveFontFamily(input.display, input.customFonts, \"sans\"),\n    // Carry every face the theme owns (not just referenced ones) so\n    // switching display↔body↔mono between custom faces never races a\n    // network load that apply-time injection already paid for.\n    fontFaces: input.customFonts,\n    headingWeight: input.headingWeight ?? 600,\n    bodyWeight: input.bodyWeight ?? 400,\n    headingTracking: input.headingTracking ?? \"-0.01em\",\n    bodyStretch: input.bodyStretch ?? \"normal\",\n    // Display inherits the body cut unless told otherwise — one knob\n    // re-cuts the whole theme, same pattern as fontDisplay→fontSans.\n    displayStretch: input.displayStretch ?? input.bodyStretch ?? \"normal\",\n    scale: {\n      display: rem(ladder.display),\n      h1: rem(ladder.h1),\n      h2: rem(ladder.h2),\n      h3: rem(ladder.h3),\n      h4: rem(ladder.h4),\n      h5: rem(ladder.h5),\n      h6: rem(ladder.h6),\n      body: rem(ladder.body),\n      bodySm: rem(ladder.bodySm),\n    },\n    namedScale,\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\n/** Tailwind v4's default `--spacing` base. Every padding/gap/margin/size\n *  utility is calc(var(--spacing) * N), so re-pitching this one variable\n *  re-scales spacing across every screen ever generated (Phase B1 — the\n *  retroactive magic). */\nconst SPACING_BASE_REM = 0.25;\n/** Guard (B5): never let the base collapse below half the default. */\nconst MIN_SPACING_UNIT_REM = 0.125;\n\nfunction resolveSpacing(input: ThemeInput[\"spacing\"]): GeneratedSpacing {\n  const factor = clamp(DENSITY_FACTOR[input.density], 0.6, 1.6);\n  const unitRem = Math.max(\n    MIN_SPACING_UNIT_REM,\n    Math.round(SPACING_BASE_REM * factor * 10000) / 10000\n  );\n  return {\n    baseUnit: \"1rem\",\n    densityFactor: DENSITY_FACTOR[input.density],\n    unit: `${unitRem}rem`,\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  // 1b. Optional dedicated focus-ring ramp (ThemeInput.ring). An explicit\n  // `hue` mints its own ramp at primary chroma; `source` re-points at an\n  // existing ramp; absent = the mode map's default (primary). The\n  // mode-tuned STEP always comes from MODE_TOKENS, so only the colour\n  // moves, never the per-mode contrast calibration.\n  const ringRamp =\n    input.ring?.hue != null\n      ? hueToRamp({ hue: input.ring.hue, chromaScale: primaryChroma })\n      : input.ring?.source && input.ring.source !== \"primary\"\n        ? ramps[input.ring.source]\n        : undefined;\n\n  // 2. Derive semantic tokens for all four modes\n  const colors = Object.fromEntries(\n    ALL_MODES.map((mode) => [mode, deriveColorsForMode(ramps, mode, ringRamp, input.tokenOverrides?.[mode])])\n  ) as Record<ModeName, GeneratedColorsMode>;\n\n  // 2b. Role ramp families (THEME-MIGRATION.md B4, June 10 decision):\n  // EVERY semantic alias points at a whole ramp — status displays many\n  // ways (soft 100 bg, solid 600 fill, 800 text), so `--gds-success` is a\n  // family, not a single value. Status ramps are seeded from the FIXED\n  // status hues (the light set is canonical; ramps are mode-agnostic by\n  // construction — the lightness curve is pinned). primary/accent/neutral\n  // families reuse the base ramps and are emitted alongside these in\n  // themeToCSSVars.\n  const statusHue = (t: OKLCHTriplet) =>\n    parseFloat(t.trim().split(/\\s+/)[2] ?? \"0\");\n  const fixedLight = FIXED_SEMANTIC.light;\n  // Expressive accent ramps — DEFAULT = the primary hue rotated +60°·k in\n  // OKLCH (k = 1..5), at accent chroma. A theme-cohesive default (ported from\n  // the Astro build); consumers can override the emitted `--gds-accent{1..5}-*`\n  // vars downstream.\n  const norm360 = (h: number) => ((h % 360) + 360) % 360;\n  const accentHue = (k: number) => norm360(input.hues.primary + 60 * k);\n  const roleRamps: GeneratedTheme[\"roleRamps\"] = {\n    success: hueToRamp({ hue: statusHue(fixedLight.success) }),\n    warning: hueToRamp({ hue: statusHue(fixedLight.warning) }),\n    info: hueToRamp({ hue: statusHue(fixedLight.info) }),\n    highlight: hueToRamp({ hue: statusHue(fixedLight.highlight) }),\n    destructive: hueToRamp({ hue: statusHue(fixedLight.destructive) }),\n    accent1: hueToRamp({ hue: accentHue(1), chromaScale: accentChroma }),\n    accent2: hueToRamp({ hue: accentHue(2), chromaScale: accentChroma }),\n    accent3: hueToRamp({ hue: accentHue(3), chromaScale: accentChroma }),\n    accent4: hueToRamp({ hue: accentHue(4), chromaScale: accentChroma }),\n    accent5: hueToRamp({ hue: accentHue(5), chromaScale: accentChroma }),\n  };\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    roleRamps,\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 {\n  CustomFontFace,\n  GeneratedColorsMode,\n  GeneratedTheme,\n} 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 — the native @theme block) wraps each var with\n *   oklch(var(--x))\n * and Tailwind v4 derives opacity shortcuts via color-mix(), so\n * bg-primary/50-style classes 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    \"--super-muted-foreground\": c.superMutedForeground,\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    // --- Brand pops — 8 vivid, saturated accents (--brand-1 … --brand-8).\n    // Backgrounds, themes, and primaries are often deliberately muted; these\n    // are the LOUD slots an interface reaches for when it needs to pop —\n    // shader fills, highlights, gradient stops, scene fills. Auto-derived\n    // here from the chart hues (tonally cohesive) plus vivid stops of the\n    // primary/accent ramps, so every theme ships a usable set; a project's\n    // Branding panel can override any slot (STUDIO-BRANDING.md). OKLCH\n    // triplets — compose as `oklch(var(--brand-N))`.\n    ...brandPops(theme),\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    // Variable-font width cut (wdth axis). Consumed by globals.css on\n    // body (inherits into every span/component) and h1–h4. Per-element\n    // utilities (font-stretch-[75%]) still override — classes beat\n    // inherited values.\n    \"--font-body-stretch\": theme.typography.bodyStretch ?? \"normal\",\n    \"--font-display-stretch\": theme.typography.displayStretch ?? \"normal\",\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    // --- Spacing base (B1): Tailwind v4 derives EVERY spacing utility\n    // from this one variable (p-4 → calc(var(--spacing) * 4)), so the\n    // density control re-scales padding/gap/margin/size across every\n    // screen ever generated. Falls back to the v4 default for themes\n    // generated before the field existed.\n    \"--spacing\": theme.spacing.unit ?? \"0.25rem\",\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\n  // --- Named type ladder (B2) — present only for modular scales. Writes\n  // --text-2xs … --text-7xl (+ per-step line-heights), re-pitching every\n  // text-* utility. Preset scales emit nothing here, leaving the static\n  // ladder in the stylesheet untouched.\n  if (theme.typography.namedScale) {\n    for (const [name, step] of Object.entries(theme.typography.namedScale)) {\n      vars[`--text-${name}`] = step.size;\n      vars[`--text-${name}--line-height`] = step.lineHeight;\n    }\n  }\n\n  // --- Role ramp families (B4) — every semantic alias as a whole ramp.\n  // primary/accent/neutral reuse the base ramps; statuses come from\n  // roleRamps. Consumed by the --color-<role>-<step> @theme entries in\n  // globals.css, so utilities like bg-success-100 / text-warning-800\n  // track the theme.\n  const families: Array<[string, Ramp | undefined]> = [\n    [\"primary\", theme.ramps.primary],\n    [\"accent\", theme.ramps.accent],\n    [\"neutral\", theme.ramps.neutral],\n    [\"success\", theme.roleRamps?.success],\n    [\"warning\", theme.roleRamps?.warning],\n    [\"info\", theme.roleRamps?.info],\n    [\"highlight\", theme.roleRamps?.highlight],\n    [\"destructive\", theme.roleRamps?.destructive],\n    // Expressive accents — primary hue rotated +60°·k (k = 1..5).\n    [\"accent1\", theme.roleRamps?.accent1],\n    [\"accent2\", theme.roleRamps?.accent2],\n    [\"accent3\", theme.roleRamps?.accent3],\n    [\"accent4\", theme.roleRamps?.accent4],\n    [\"accent5\", theme.roleRamps?.accent5],\n  ];\n  for (const [role, ramp] of families) {\n    if (!ramp) continue;\n    for (const step of RAMP_KEYS) {\n      vars[`--gds-${role}-${step}`] = ramp[step];\n    }\n  }\n\n  return vars;\n}\n\n/**\n * The 8 brand-pop slots — genuinely LOUD. The earlier version reused the\n * chart palette (tuned for data-viz cohesion: mid-lightness, low chroma,\n * one stop basically grey), so the pops came out muted/dull. Instead we\n * build a vivid spectrum ANCHORED to the theme: take the primary and accent\n * hues and fan eight high-chroma hues across the wheel from them, all at\n * bright lightness. Stays on-brand (hues track the theme, so they re-voice\n * when you switch theme or drag hue) but actually pops. Every value is a\n * bare OKLCH triplet so it composes via `oklch(var(--brand-N))`. A theme\n * always has all 8; a project's Branding panel later overrides slots.\n */\nfunction brandPops(theme: GeneratedTheme): Record<string, string> {\n  const hueOf = (triplet: string): number =>\n    parseFloat(triplet.trim().split(/\\s+/)[2] ?? \"0\");\n  const wrap = (h: number): number => ((h % 360) + 360) % 360;\n\n  const pH = hueOf(theme.ramps.primary[500]);\n  const aH = hueOf(theme.ramps.accent[500]);\n\n  // Fan eight hues out from the two brand anchors so the set spans the\n  // wheel without drifting off-brand.\n  const hues = [\n    pH,\n    aH,\n    pH + 45,\n    aH + 60,\n    pH + 150,\n    aH - 75,\n    pH + 210,\n    aH + 165,\n  ].map(wrap);\n\n  // Vivid: high OKLCH chroma, bright lightness with a little step-to-step\n  // variation so neighbours don't read flat. Browsers gamut-map the few\n  // hues that exceed sRGB at this chroma.\n  const out: Record<string, string> = {};\n  hues.forEach((h, i) => {\n    const L = (0.68 + (i % 3) * 0.02).toFixed(3);\n    out[`--brand-${i + 1}`] = `${L} 0.200 ${h.toFixed(2)}`;\n  });\n  return out;\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   Custom font faces — the @font-face side of CustomFontFace.\n\n   themeToCSSVars already emits font-family vars that NAME a custom\n   family; these helpers materialise the face itself. Every surface that\n   applies a theme to a document must also inject this CSS, or a custom\n   family silently falls back.\n   ────────────────────────────────────────────────────────────────────── */\n\n/** id of the <style> tag `injectFontFaces` manages per document. */\nexport const FONT_FACE_STYLE_ID = \"gds-theme-fonts\";\n\n/** @font-face rules for a theme's custom faces. Empty string when the\n *  theme carries none (registry-only themes — the common case). */\nexport function fontFaceCSS(\n  faces: CustomFontFace[] | undefined | null\n): string {\n  if (!faces || faces.length === 0) return \"\";\n  return faces\n    .map((f) => {\n      const src = f.format\n        ? `url(\"${f.url}\") format(\"${f.format}\")`\n        : `url(\"${f.url}\")`;\n      return [\n        \"@font-face {\",\n        `  font-family: \"${f.family.replace(/\"/g, \"\")}\";`,\n        `  src: ${src};`,\n        `  font-weight: ${f.weight ?? \"100 900\"};`,\n        // Generous default range so a variable font's wdth axis is\n        // reachable via font-stretch utilities (font-stretch-[90%]).\n        // Browsers clamp to the font's real fvar range, and fonts with\n        // no wdth axis simply ignore it — safe either way. Without a\n        // declared range some browsers pin the axis at 100%.\n        `  font-stretch: ${f.stretch ?? \"50% 200%\"};`,\n        `  font-style: ${f.style ?? \"normal\"};`,\n        \"  font-display: swap;\",\n        \"}\",\n      ].join(\"\\n\");\n    })\n    .join(\"\\n\");\n}\n\n/**\n * Upsert the theme's @font-face rules into a document's <head> via a\n * single managed <style id=\"gds-theme-fonts\"> tag. Idempotent and\n * cheap to call on every theme apply: same CSS → no DOM write; a theme\n * with no custom faces removes the tag.\n */\nexport function injectFontFaces(\n  faces: CustomFontFace[] | undefined | null,\n  doc: Document = typeof document === \"undefined\"\n    ? (undefined as unknown as Document)\n    : document\n): void {\n  if (!doc) return;\n  const css = fontFaceCSS(faces);\n  let tag = doc.getElementById(FONT_FACE_STYLE_ID) as HTMLStyleElement | null;\n  if (!css) {\n    tag?.remove();\n    return;\n  }\n  if (!tag) {\n    tag = doc.createElement(\"style\");\n    tag.id = FONT_FACE_STYLE_ID;\n    doc.head.appendChild(tag);\n  }\n  if (tag.textContent !== css) tag.textContent = css;\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  // Custom uploaded faces — without this the family vars above name a\n  // font the document has never loaded.\n  injectFontFaces(theme.typography.fontFaces, document);\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.\n *\n * Returns \"{}\" rather than `undefined` when theme.input is missing —\n * `JSON.stringify(undefined, …)` evaluates to undefined (not the\n * literal string), which then blows up downstream callers that do\n * `.replace(/\\n/g, …)`. Surfaced as a runtime TypeError (\"Cannot read\n * properties of undefined (reading 'replace')\") on the home-diff-hero\n * scaffold whenever a theme was loaded without an input snapshot.\n */\nfunction stringifyInput(theme: GeneratedTheme): string {\n  if (!theme || theme.input == null) return \"{}\";\n  const out = JSON.stringify(theme.input, null, 2);\n  return out ?? \"{}\";\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, tokenRefsForMode } from \"./generator\";\nexport {\n  themeToCSSVars,\n  applyThemeToRoot,\n  fontFaceCSS,\n  injectFontFaces,\n  FONT_FACE_STYLE_ID,\n} from \"./apply\";\nexport type { ModeName } from \"./oklch\";\nexport { SEMANTIC_TOKEN_KEYS } from \"./types\";\nexport type {\n  SemanticTokenKey,\n  ThemeTokenRef,\n  ThemeTokenOverrides,\n} from \"./types\";\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\ntype MapProvider = \"maplibre\" | \"mapbox\" | \"google\" | \"leaflet\";\n\nconst ADAPTER_LOADERS: Record<MapProvider, () => Promise<AdapterFactory>> = {\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  // Worker-free raster adapter. Not selectable via the public `provider`\n  // prop (it's not in MapProps' union); reached only through the global\n  // override below, which the MCP preview View sets because the sandbox\n  // CSP blocks maplibre's worker.\n  leaflet: () =>\n    import(\"./adapters/leaflet\").then((m) => m.createLeafletAdapter),\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    tools = \"auto\",\n    toolsPosition = \"top-left\",\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  //\n  // Default is the worker-free **Leaflet** raster adapter. maplibre-gl does all\n  // its rendering in a Web Worker, which (a) the MCP App panel's `default-src\n  // 'none'` CSP blocks outright, and (b) silently fails to load in the\n  // production Next bundle on the share / embed / Studio surfaces (style loads,\n  // but the tile worker never runs → blank map, no markers). Leaflet paints\n  // raster `<img>` tiles on the main thread, so it renders everywhere. A screen\n  // can still opt into vector maps with `provider=\"maplibre\"`, and the MCP View\n  // pins leaflet explicitly via the global override below (belt-and-braces, and\n  // it also bundles leaflet's CSS for the CSP-locked panel).\n  const providerOverride = (globalThis as { __gradeMapProvider?: MapProvider })\n    .__gradeMapProvider;\n  const provider: MapProvider =\n    providerOverride ??\n    (rest as { provider?: MapProvider }).provider ??\n    \"leaflet\";\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  // Provider-less hosts (the Fast Frame sandbox behind Studio previews and\n  // /e/ embeds, the flat capture page) have no GradeThemeProvider — but\n  // their renderer stamps `.dark` on <html> when the pushed theme is dark\n  // (applyTheme in fast-sandbox/page.tsx). Watch that class as the\n  // fallback signal so `appearance=\"auto\"` maps restyle live when an\n  // embed's ?mode=dark / the EmbedTweaker's mode control flips the\n  // document — the adapter's setAppearance sync below picks the change\n  // up like any other isDark move. With a provider above us the context\n  // wins and the observer never attaches.\n  const hasThemeCtx = themeCtx !== null && themeCtx !== undefined;\n  const [rootDark, setRootDark] = React.useState(false);\n  React.useEffect(() => {\n    if (hasThemeCtx || typeof document === \"undefined\") return;\n    const root = document.documentElement;\n    const read = () => setRootDark(root.classList.contains(\"dark\"));\n    read();\n    const mo = new MutationObserver(read);\n    mo.observe(root, { attributes: true, attributeFilter: [\"class\"] });\n    return () => mo.disconnect();\n  }, [hasThemeCtx]);\n  const isDark = themeCtx?.isDark ?? rootDark;\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            tools,\n            toolsPosition,\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/tools changes — center/zoom/etc.\n    // are imperative. Tools re-init rather than mutate: control add/remove\n    // mid-flight differs per provider, and a tools change is a design-time\n    // decision (Studio settings panel), not a runtime hot path.\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [provider, styleUrl, accessToken, apiKey, mapId, tilerKey, tools, toolsPosition]);\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      // No baked-in radius/border: the Map is an unopinionated primitive.\n      // Consumers add `rounded-*` / `border` via className (the container\n      // already clips with overflow-hidden, so rounding via class works).\n      style={style}\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 =\n  | \"video\"\n  | \"standard\"\n  | \"square\"\n  | \"portrait\"\n  | \"wide\"\n  | \"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  standard: \"aspect-[4/3]\",\n  square: \"aspect-square\",\n  portrait: \"aspect-[3/4]\",\n  wide: \"aspect-[21/9]\",\n  auto: \"\",\n};\n\n// CSS aspect-ratio values, applied as an INLINE style when `aspect` is set\n// EXPLICITLY (not derived from the hint). Inline beats a className utility, so\n// an explicit `aspect` prop wins over a baked-in `className=\"aspect-video\"` —\n// otherwise setting the aspect in the inspector did nothing on slots the\n// scaffolds had hard-coded. Derived (hint-default) aspect still rides the\n// class so a deliberate `className=\"aspect-[2/1]\"` can override it.\nconst aspectRatioStyle: Record<MediaAspect, string> = {\n  video: \"16 / 9\",\n  standard: \"4 / 3\",\n  square: \"1 / 1\",\n  portrait: \"3 / 4\",\n  wide: \"21 / 9\",\n  auto: \"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    /** Source-keys with a Fill request currently in flight. Stamped by\n     *  the sandbox agent on `grade:set-media-pending`; drives the\n     *  placeholder's Presence shimmer (gds-aura-shimmer) so slots read\n     *  as \"being generated\" rather than inert while the resolver works. */\n    __gradeMediaPending?: Record<string, true>;\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 * Fill-in-flight flag for this surface's sourceKey. Mirrors the\n * useResolvedSrc plumbing: the canvas posts `grade:set-media-pending`\n * into the iframe before it hits `/api/media/resolve-batch`, the\n * sandbox agent stamps `window.__gradeMediaPending` and dispatches\n * `grade:media-pending-updated`, and this hook re-renders the surface.\n * The canvas clears the map (posts `pending: []` replace) in its\n * `finally` block, so an error never strands a slot mid-shimmer.\n */\nfunction useFillPending(source: MediaSource | undefined): boolean {\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-pending-updated\", handler);\n    return () =>\n      window.removeEventListener(\"grade:media-pending-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 false;\n  return Boolean(window.__gradeMediaPending?.[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 = \"none\",\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    // Explicit prop → win over any className aspect via inline aspect-ratio.\n    const aspectExplicit = aspect != null;\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    // Effective src — straight from the JSX, resolved BEFORE the\n    // placeholder gate below because the two are coupled: the\n    // placeholder only exists while the slot is unfilled. Track broken\n    // URLs so a 404/timeout doesn't leave the user staring at the\n    // browser's generic \"broken image\" icon — when `onError` fires we\n    // drop the src, the content layer unmounts, and the tiered\n    // placeholder re-renders, so the slot reads as \"not yet filled\"\n    // rather than \"broken.\" Reset whenever the candidate src changes\n    // (a new URL is its own retry).\n    const candidateSrc = src;\n    const [imgErrored, setImgErrored] = React.useState(false);\n    React.useEffect(() => {\n      setImgErrored(false);\n    }, [candidateSrc]);\n    const effectiveSrc = imgErrored ? undefined : candidateSrc;\n\n    // Size observer for the tiered placeholder. The placeholder stays\n    // MOUNTED beneath a filled `src` image but is hidden via CSS —\n    // `[data-filled]` → `visibility: hidden` in styles/globals.css —\n    // rather than unmounted. Two reasons:\n    //   1. Transparent imagery: an always-*visible* placeholder leaked\n    //      its glyph + `--gds-media-placeholder-bg` through the alpha\n    //      pixels of transparent PNGs (logo slots). `visibility:\n    //      hidden` fixes that without losing the layer.\n    //   2. Wireframe mode: `[data-fidelity=\"wireframe\"]` on any\n    //      ancestor (Studio iframe root, an embed wrapper) flips the\n    //      same pair of rules — content layer hidden, placeholder\n    //      re-revealed — with zero React involvement, so a fidelity\n    //      toggle works even in a static embed.\n    // Custom `children` (escape hatch — caller fully owns the surface)\n    // suppress the placeholder entirely: whatever they render IS the\n    // 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    // The DS stamps `data-media-source` as a JSON blob whenever a\n    // `source` is present so an external walker (Studio's selection-\n    // agent inside the Sandpack iframe) can collect runtime-evaluated\n    // sources, hand them to a resolver, and write the resulting URL\n    // back into the JSX. Once it's in the JSX it lives on `srcProp`\n    // and just renders — no parallel URL map, no override merge.\n    const sourceJson = React.useMemo(\n      () => (source ? JSON.stringify(source) : undefined),\n      [source],\n    );\n\n    // Fill-in-flight → Presence shimmer on the placeholder. Only while a\n    // resolve is actually pending AND the slot is still unfilled — once\n    // the URL lands in the JSX (or via the legacy URL map) the image\n    // layer covers the placeholder and the sweep stops being visible,\n    // and the canvas clears the pending map anyway.\n    const fillPending = useFillPending(source) && !effectiveSrc;\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          // Derived aspect rides the class (a deliberate className aspect can\n          // still override it); an EXPLICIT aspect prop goes inline below.\n          !aspectExplicit && aspectClass[resolvedAspect],\n          border && \"border border-border\",\n          className,\n        )}\n        style={{\n          ...(aspectExplicit\n            ? { aspectRatio: aspectRatioStyle[resolvedAspect] }\n            : {}),\n          borderRadius: `var(--gds-media-radius, ${radiusVar[radius]})`,\n          ...style,\n        }}\n        {...props}\n      >\n        {/* Tiered empty-state placeholder — rendered FIRST (lowest layer)\n            beneath any `src` image / `children` / `overlay`. When the slot\n            is filled, `data-filled` is stamped and a stylesheet rule\n            (styles/globals.css, \"MediaSurface fidelity\") sets\n            `visibility: hidden` so images with alpha never show the\n            glyph/bg through their transparent pixels. Wireframe mode\n            (`[data-fidelity=\"wireframe\"]` on an ancestor) reverses both\n            rules in pure CSS — content hidden, placeholder revealed — no\n            React state, no re-mount, works in static embeds. Surface and\n            icon colours come from the `--gds-media-placeholder-*` token\n            pair so they retheme with the active mode. */}\n        {hasPlaceholder && (\n          <div\n            data-gds-part=\"media-surface-placeholder\"\n            data-tier={tier}\n            data-filled={effectiveSrc ? \"\" : undefined}\n            data-fill-pending={fillPending || undefined}\n            className={cn(\n              \"absolute inset-0 z-0 flex flex-col items-center justify-center gap-2 pointer-events-none px-3 text-center\",\n              // Presence shimmer (diagonal sweep) while a Fill request is\n              // in flight for this slot's sourceKey — \"generation in\n              // progress\" is exactly what the aura system's shimmer is\n              // for. Tightened timing vs. the ambient default so it reads\n              // as active work, not decoration.\n              fillPending && \"gds-aura-shimmer\",\n            )}\n            style={{\n              // `gds-aura-shimmer` sets `position: relative`; this layer\n              // must stay absolutely positioned regardless of stylesheet\n              // order, so pin it inline.\n              position: \"absolute\",\n              background: \"var(--gds-media-placeholder-bg)\",\n              color: \"var(--gds-media-placeholder-fg)\",\n              ...(fillPending\n                ? ({\n                    \"--aura-shimmer-duration\": \"1400ms\",\n                    \"--aura-shimmer-delay-between\": \"400ms\",\n                  } as React.CSSProperties)\n                : null),\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 — the target the generator patches into when\n            filling slots. Both `src` and `children` are wrapped together\n            in `media-surface-content` so the wireframe rule in\n            globals.css can hide both with one selector and let the\n            placeholder underneath show through. In full fidelity a\n            transparent image sits directly on whatever's behind the\n            surface (the placeholder beneath is visibility-hidden), as a\n            plain <img> would. */}\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// The reduced-motion hook moved to lib/motion, where it now folds in the\n// global `data-motion=\"off\"` toggle as well as the OS query. Re-exported\n// here so the components that import it from this module\n// (ThreeScene/RivePlayer/VideoPlayer) keep resolving unchanged.\nexport { usePrefersReducedMotion } from \"@/lib/motion\";\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 iconOnly 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","import * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\n/**\n * Logo — a brand mark with lockup, background-mode, and monochrome\n * variations, fed bespoke artwork per slot.\n *\n * A brand rarely has one logo: there's a square mark for tight spaces, a\n * horizontal lockup for headers, and single-colour versions for busy or\n * inverted backgrounds. This component holds that set and renders the right\n * one for the context, so a sidenav, toolbar, and footer can all reach for\n * `<Logo>` and ask for the lockup/mode they need.\n *\n * Artwork is yours: each slot is any React node — an inline `<svg>`, an\n * `<img>`, or a component. Supply only what you have; the component falls\n * back across appearances and lockups so a partial set still renders\n * something. Monochrome artwork should paint with `currentColor` so it\n * inherits the surrounding text colour.\n *\n * Selection is explicit, not theme-coupled: set `mode=\"dark\"` when the logo\n * sits on a dark surface. (Wrap it in your own theme hook if you want it\n * automatic.)\n */\n\nexport type LogoLockup = \"square\" | \"horizontal\" | \"icon\";\nexport type LogoMode = \"light\" | \"dark\";\nexport type LogoSize = \"sm\" | \"md\" | \"lg\" | \"xl\";\n\n/** Artwork for one lockup. `light`/`dark` are the full-colour versions for a\n *  light or dark background; `mono` is a single-colour treatment that\n *  inherits `currentColor` and works on any background. */\nexport interface LogoVariant {\n  light?: React.ReactNode;\n  dark?: React.ReactNode;\n  mono?: React.ReactNode;\n}\n\n/** The brand artwork set, keyed by lockup then appearance. */\nexport interface LogoSources {\n  square?: LogoVariant;\n  horizontal?: LogoVariant;\n  icon?: LogoVariant;\n}\n\nexport interface LogoProps\n  extends Omit<React.HTMLAttributes<HTMLElement>, \"children\"> {\n  /** The brand artwork. Supply only the slots you have. Optional — with\n   *  no artwork at all the neutral placeholder renders, which keeps\n   *  layout intact (and keeps a model-emitted bare `<Logo />` from\n   *  crashing a Studio preview). */\n  sources?: LogoSources;\n  /** Which lockup to show. Falls back to another lockup if this one is\n   *  empty. Default `\"horizontal\"`. */\n  lockup?: LogoLockup;\n  /** The background the logo sits on — selects the light/dark artwork.\n   *  Explicit (not theme-coupled). Default `\"light\"`. */\n  mode?: LogoMode;\n  /** Render the monochrome artwork instead of full colour. Mono inherits\n   *  `currentColor`, so set the text colour on a parent. Default `false`. */\n  mono?: boolean;\n  /** Height of the logo — a t-shirt token or a raw pixel number. Width is\n   *  intrinsic (square/icon are 1:1, horizontal keeps its ratio).\n   *  Default `\"md\"`. */\n  size?: LogoSize | number;\n  /** Accessible name (e.g. the brand name) → `aria-label` + `role=\"img\"`.\n   *  Omit and set `decorative` when something nearby already names it. */\n  label?: string;\n  /** Mark the logo decorative (`aria-hidden`, no role). Use when the brand\n   *  name is already in the DOM beside it. */\n  decorative?: boolean;\n  /** Optional link target — renders the logo as an `<a>` (logo-links-home). */\n  href?: string;\n}\n\nconst SIZE_PX: Record<LogoSize, number> = {\n  sm: 20,\n  md: 28,\n  lg: 40,\n  xl: 56,\n};\n\n// Lockup fallback chains — if the requested lockup has no artwork at all, we\n// show the next-best shape rather than nothing.\nconst LOCKUP_FALLBACK: Record<LogoLockup, LogoLockup[]> = {\n  horizontal: [\"horizontal\", \"square\", \"icon\"],\n  square: [\"square\", \"icon\", \"horizontal\"],\n  icon: [\"icon\", \"square\", \"horizontal\"],\n};\n\n/** Resolve the best available node for the requested lockup/mode/mono,\n *  walking the fallback chain. Returns null when no artwork is supplied. */\nfunction resolveArtwork(\n  sources: LogoSources,\n  lockup: LogoLockup,\n  mode: LogoMode,\n  mono: boolean,\n): React.ReactNode | null {\n  for (const lk of LOCKUP_FALLBACK[lockup]) {\n    const variant = sources[lk];\n    if (!variant) continue;\n    // Within a lockup, prefer the requested appearance, then degrade.\n    const colour =\n      mode === \"dark\"\n        ? variant.dark ?? variant.light\n        : variant.light ?? variant.dark;\n    const node = mono\n      ? variant.mono ?? colour\n      : colour ?? variant.mono;\n    if (node != null) return node;\n  }\n  return null;\n}\n\nexport const Logo = React.forwardRef<HTMLElement, LogoProps>(function Logo(\n  {\n    sources = {},\n    lockup = \"horizontal\",\n    mode = \"light\",\n    mono = false,\n    size = \"md\",\n    label,\n    decorative = false,\n    href,\n    className,\n    style,\n    ...props\n  },\n  ref,\n) {\n  const heightPx = typeof size === \"number\" ? size : SIZE_PX[size];\n  const artwork = resolveArtwork(sources, lockup, mode, mono);\n\n  // a11y: a named logo is an image; a decorative one is hidden. When the\n  // logo links somewhere, the <a> carries the label instead.\n  const a11y = decorative\n    ? { \"aria-hidden\": true as const }\n    : label\n      ? href\n        ? {}\n        : { role: \"img\", \"aria-label\": label }\n      : {};\n\n  // No artwork supplied → THE GRADE MARK. The default brand of every\n  // unbranded screen is Grade: a bare `<Logo />` renders the square\n  // G-arrow (currentColor, so it sits correctly on any surface), not a\n  // placeholder. Supplying `sources` replaces it wholesale.\n  const body = artwork ?? <GradeDefaultMark label={label} />;\n\n  // The wrapper sets the height; intrinsic artwork (svg/img) scales to it and\n  // keeps its own aspect ratio. data-gds-part lets Studio target it.\n  const inner = (\n    <span\n      className={cn(\n        \"gds-logo inline-flex shrink-0 select-none items-center\",\n        \"[&_img]:h-full [&_img]:w-auto [&_svg]:h-full [&_svg]:w-auto\",\n        className,\n      )}\n      style={{ height: heightPx, ...style }}\n      data-gds-part=\"logo\"\n      data-gds-lockup={lockup}\n      data-gds-mode={mode}\n      {...(href ? {} : a11y)}\n      {...(href ? {} : props)}\n    >\n      {body}\n    </span>\n  );\n\n  if (href) {\n    return (\n      <a\n        ref={ref as React.Ref<HTMLAnchorElement>}\n        href={href}\n        aria-label={!decorative ? label : undefined}\n        className=\"inline-flex\"\n        {...(decorative ? { \"aria-hidden\": true } : {})}\n        {...props}\n      >\n        {inner}\n      </a>\n    );\n  }\n\n  return React.cloneElement(inner, {\n    ref: ref as React.Ref<HTMLSpanElement>,\n  });\n});\n\n/** The default artwork — Grade's square \"G-arrow\" mark. Paints with\n *  `currentColor` so it inherits the surrounding text colour and works\n *  on light, dark, and mono contexts alike. This is what a bare\n *  `<Logo />` renders: unbranded screens carry the Grade brand. */\nfunction GradeDefaultMark({ label }: { label?: string }) {\n  return (\n    <svg\n      viewBox=\"0 0 32 32\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...(label ? {} : { \"aria-hidden\": true })}\n    >\n      <path\n        d=\"M28 0L32 4V10L26 4H6L4 6V26L6 28H16L26 18V24L18 32H4L0 28V4L4 0H28ZM32 32H28V18H16V14H32V32Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\n/**\n * GradeLoader — THE indeterminate loading mark.\n *\n * One branded loader for every \"working, can't say how long\" moment:\n * scene boundaries warming a shader, Studio panels fetching, previews\n * compiling, anywhere a spinner would otherwise appear. It's the Grade\n * G-arrow mark with a diagonal shimmer sweeping along the arrow's own\n * direction — quiet, on-brand, instantly recognisable as \"Grade is\n * thinking\".\n *\n * Colour: paints with `currentColor`, so it inherits the surrounding\n * text colour — set `className=\"text-muted-foreground\"` on a light\n * surface, `text-white` over dark footage. The shimmer brightens toward\n * `oklch(var(--brand-1))` when brand pops are present (falls back to\n * plain currentColor without a theme).\n *\n * Reduced motion: the sweep is replaced by a gentle opacity pulse.\n *\n * Accessibility: renders `role=\"status\"` with the label (default\n * \"Loading…\") for screen readers; pass `label=\"\"` to silence it when a\n * parent already announces.\n */\n\n/** The Grade mark — the same G-arrow path `<Logo />` defaults to. */\nconst GRADE_MARK_PATH =\n  \"M28 0L32 4V10L26 4H6L4 6V26L6 28H16L26 18V24L18 32H4L0 28V4L4 0H28ZM32 32H28V18H16V14H32V32Z\";\n\nexport type GradeLoaderSize = \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nconst SIZE_PX: Record<GradeLoaderSize, number> = {\n  sm: 16,\n  md: 24,\n  lg: 32,\n  xl: 48,\n};\n\nexport interface GradeLoaderProps\n  extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n  /** Mark size — token or exact pixels. Default `\"md\"` (24px). */\n  size?: GradeLoaderSize | number;\n  /** Accessible status text (and the optional visible caption).\n   *  Default \"Loading…\"; pass \"\" to silence. */\n  label?: string;\n  /** Show the label visually under the mark (it's always announced). */\n  showLabel?: boolean;\n}\n\nexport const GradeLoader = React.forwardRef<HTMLDivElement, GradeLoaderProps>(\n  (\n    { size = \"md\", label = \"Loading…\", showLabel = false, className, style, ...rest },\n    ref,\n  ) => {\n    const px = typeof size === \"number\" ? size : SIZE_PX[size];\n    const id = React.useId().replace(/[^a-zA-Z0-9-]/g, \"\");\n\n    return (\n      <div\n        ref={ref}\n        data-gds-part=\"grade-loader\"\n        role=\"status\"\n        aria-label={label || undefined}\n        className={cn(\n          \"gds-grade-loader inline-flex flex-col items-center gap-2\",\n          className,\n        )}\n        style={style}\n        {...rest}\n      >\n        <style>{`\n          @keyframes gdsLoaderSweep { from { transform: translate(-48px, 48px) } to { transform: translate(48px, -48px) } }\n          @keyframes gdsLoaderPulse { 0%, 100% { opacity: 0.35 } 50% { opacity: 0.9 } }\n          @media (prefers-reduced-motion: reduce) {\n            .gds-grade-loader [data-sweep] { display: none }\n            .gds-grade-loader [data-mark] { animation: gdsLoaderPulse 2.2s ease-in-out infinite }\n          }\n        `}</style>\n        <svg\n          width={px}\n          height={px}\n          viewBox=\"0 0 32 32\"\n          fill=\"none\"\n          aria-hidden\n          style={{ display: \"block\" }}\n        >\n          <defs>\n            {/* The mark clips the shimmer — light only travels inside the G. */}\n            <clipPath id={`${id}-clip`}>\n              <path d={GRADE_MARK_PATH} />\n            </clipPath>\n            <linearGradient id={`${id}-shine`} x1=\"0\" y1=\"1\" x2=\"1\" y2=\"0\">\n              <stop offset=\"0.35\" stopColor=\"currentColor\" stopOpacity=\"0\" />\n              <stop\n                offset=\"0.5\"\n                stopColor=\"oklch(var(--brand-1, 0.7 0 0))\"\n                stopOpacity=\"0.95\"\n              />\n              <stop offset=\"0.65\" stopColor=\"currentColor\" stopOpacity=\"0\" />\n            </linearGradient>\n          </defs>\n          {/* The resting mark, dimmed — the thing being \"filled in\". */}\n          <path d={GRADE_MARK_PATH} fill=\"currentColor\" opacity={0.28} data-mark />\n          {/* The shimmer — a diagonal band riding the arrow's direction,\n              clipped to the glyph. transform animates the GROUP (cheap,\n              compositor-friendly). */}\n          <g clipPath={`url(#${id}-clip)`}>\n            <rect\n              data-sweep\n              x={-16}\n              y={-16}\n              width={64}\n              height={64}\n              fill={`url(#${id}-shine)`}\n              style={{ animation: \"gdsLoaderSweep 1.4s cubic-bezier(0.45, 0, 0.55, 1) infinite\" }}\n            />\n          </g>\n        </svg>\n        {showLabel && label ? (\n          <span className=\"text-xs text-muted-foreground\">{label}</span>\n        ) : null}\n        {/* Screen-reader text when no visible label. */}\n        {!showLabel && label ? <span className=\"sr-only\">{label}</span> : null}\n      </div>\n    );\n  },\n);\nGradeLoader.displayName = \"GradeLoader\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useInView } from \"motion/react\";\nimport { useReducedMotion, usePageActive } from \"../../lib/motion\";\nimport { cn } from \"@/lib/utils\";\n\n/**\n * ScreenAnimator — wrap any content in a directed camera.\n *\n * Give it a list of `shots` (a zoom + focal point + dwell) and it tours them:\n * flies in from offscreen, eases between shots, settles back to the start,\n * exits, and loops, with a focus spotlight, a synthetic cursor, captions, and\n * a play/pause/restart transport. The content stays live and interactive\n * underneath; the camera just directs the eye. It works around ANY children,\n * a dashboard, an app shell, a single card.\n *\n * It's the reusable form of the camera in the embed (`useCameraTimeline` /\n * `ZoomPan`) and the `camera-tour` scaffold — see STUDIO-DIRECTOR.md. Honours\n * reduced motion (settles on the starter frame, no movement).\n */\n\nexport interface ScreenAnimatorShot {\n  /** Magnification (1 = fit). >1 pushes in. */\n  zoom?: number;\n  /** Focal point as fractions of the content (0..1). Defaults to centre. */\n  cx?: number;\n  cy?: number;\n  /** Milliseconds to dwell on this shot. */\n  hold?: number;\n  /** Milliseconds to glide INTO this shot from the previous one. */\n  trans?: number;\n  /** Caption shown while on this shot. */\n  label?: string;\n}\n\nexport interface ScreenAnimatorProps {\n  /** The shot list. Omit (or one shot) for a static framed view. */\n  shots?: ScreenAnimatorShot[];\n  /** Start playing on mount. Default true. */\n  autoplay?: boolean;\n  /** Loop the tour (fly in → shots → back to start → exit → repeat). Default true. */\n  loop?: boolean;\n  /** Cap the number of loop cycles, then settle and stop — a demo is a movie,\n   *  it shouldn't spin forever. Default Infinity (loops while watched). Set a\n   *  small number for grid/embed contexts so it ends. */\n  maxLoops?: number;\n  /** Show the play / pause / restart transport. Default true. */\n  controls?: boolean;\n  /** Controlled pause override — a sequencer (e.g. `<Motion>`) holds the\n   *  transport. Leave undefined for self-managed playback. */\n  paused?: boolean;\n  /** Fires once when the tour runs to its end and stops (loop cap reached,\n   *  or `loop=false`). The hook a sequencer advances on. */\n  onEnded?: () => void;\n  /** Dim the edges when pushed in (focus vignette). Default false — opt in. */\n  spotlight?: boolean;\n  /** Render the synthetic cursor pulse on detail shots. Default true. */\n  cursor?: boolean;\n  /** Fly in from offscreen on start (and exit on loop). Default true. */\n  enter?: boolean;\n  /** Where the caption sits over the frame. Default \"bottom\". */\n  captionPosition?: \"top\" | \"bottom\";\n  /** Background of the stage the content sits on while it's small (fly in/out).\n   *  A CSS background string. Default a dark cinematic stage. */\n  stage?: string;\n  /** A live backdrop rendered BEHIND the content, filling the stage — an\n   *  image, a gradient, or a `<ThreeScene>` shader. Shows around the screen\n   *  while it's small (fly in/out) and behind any padding. */\n  backdrop?: React.ReactNode;\n  className?: string;\n  style?: React.CSSProperties;\n  children: React.ReactNode;\n}\n\nconst TRANS_MS = 1150;\nconst ENTER_MS = 1500;\nconst ENTER_TRANSFORM = \"translate(101%, 95%) scale(0.18)\";\nconst EXIT_TRANSFORM = \"translate(122%, 36%) scale(0.2)\";\n// The canvas behind the screen. Reads the design-system canvas-fill token so\n// every canvas surface (embed, share, animator) matches; falls back to a\n// cinematic dark gradient where the token isn't loaded. Pass `stage` (incl.\n// \"transparent\") to override per-instance.\nconst DEFAULT_STAGE =\n  \"var(--gds-canvas-fill, radial-gradient(circle at 50% 38%, #1b1b22, #0b0b0e))\";\nconst SETTLE = \"cubic-bezier(0.34, 1.16, 0.64, 1)\";\nconst PUSH = \"cubic-bezier(0.65, 0, 0.35, 1)\";\n\ninterface Frame {\n  transform: string;\n  zoom: number;\n  label: string | null;\n  opacity: number;\n  hold: number;\n  trans: number;\n}\n\nfunction shotToFrame(s: ScreenAnimatorShot, trans: number): Frame {\n  const zoom = s.zoom ?? 1;\n  const cx = s.cx ?? 0.5;\n  const cy = s.cy ?? 0.5;\n  return {\n    transform: `translate(${(0.5 - cx * zoom) * 100}%, ${(0.5 - cy * zoom) * 100}%) scale(${zoom})`,\n    zoom,\n    label: s.label ?? null,\n    opacity: 1,\n    hold: s.hold ?? 2400,\n    trans,\n  };\n}\n\nconst btn: React.CSSProperties = {\n  display: \"inline-flex\",\n  alignItems: \"center\",\n  justifyContent: \"center\",\n  width: 28,\n  height: 28,\n  borderRadius: 999,\n  border: \"none\",\n  background: \"transparent\",\n  color: \"#fff\",\n  cursor: \"pointer\",\n};\n\nfunction PlayIcon() {\n  return (\n    <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden>\n      <path d=\"M8 5v14l11-7z\" />\n    </svg>\n  );\n}\nfunction PauseIcon() {\n  return (\n    <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden>\n      <rect x=\"6\" y=\"5\" width=\"4\" height=\"14\" rx=\"1\" />\n      <rect x=\"14\" y=\"5\" width=\"4\" height=\"14\" rx=\"1\" />\n    </svg>\n  );\n}\nfunction RestartIcon() {\n  return (\n    <svg\n      width=\"14\"\n      height=\"14\"\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      stroke=\"currentColor\"\n      strokeWidth=\"2\"\n      strokeLinecap=\"round\"\n      strokeLinejoin=\"round\"\n      aria-hidden\n    >\n      <path d=\"M3 12a9 9 0 1 0 3-6.7L3 8\" />\n      <path d=\"M3 3v5h5\" />\n    </svg>\n  );\n}\n\nexport function ScreenAnimator({\n  shots,\n  autoplay = true,\n  loop = true,\n  maxLoops = Infinity,\n  controls = true,\n  paused,\n  onEnded,\n  spotlight = false,\n  cursor = true,\n  enter = true,\n  captionPosition = \"bottom\",\n  stage = DEFAULT_STAGE,\n  backdrop,\n  className,\n  style,\n  children,\n}: ScreenAnimatorProps) {\n  const reduced = useReducedMotion();\n\n  // Pause the camera when nobody's watching: tab hidden/unfocused, or the\n  // animator scrolled out of view. A movie stops when you look away. (Note:\n  // inside a grid iframe, `inView` only sees the iframe's own viewport, so the\n  // tab-visibility half of `pageActive` is what pauses an offscreen grid item;\n  // freeing the iframe's memory is the parent's job — see STUDIO-CAPTURE.md.)\n  const rootRef = React.useRef<HTMLDivElement>(null);\n  const pageActive = usePageActive();\n  const inView = useInView(rootRef, { amount: 0.25 });\n  const active = pageActive && inView;\n\n  // Build the full loop as explicit frames.\n  const frames = React.useMemo<Frame[]>(() => {\n    const list = shots && shots.length > 0 ? shots : [{ zoom: 1 }];\n    const out: Frame[] = [];\n    if (enter) {\n      out.push({\n        transform: ENTER_TRANSFORM,\n        zoom: 0.18,\n        label: null,\n        opacity: 0,\n        hold: 360,\n        trans: 0,\n      });\n    }\n    out.push(shotToFrame(list[0], enter ? ENTER_MS : 0));\n    for (let k = 1; k < list.length; k++) out.push(shotToFrame(list[k], TRANS_MS));\n    if (loop) {\n      out.push(shotToFrame(list[0], ENTER_MS)); // back to start\n      out.push({\n        transform: EXIT_TRANSFORM,\n        zoom: 0.2,\n        label: null,\n        opacity: 0,\n        hold: 520,\n        trans: ENTER_MS,\n      });\n    }\n    return out;\n  }, [shots, enter, loop]);\n\n  // The starter (poster) frame is the first real shot.\n  const starter = enter && frames.length > 1 ? 1 : 0;\n  const [i, setI] = React.useState(autoplay ? 0 : starter);\n  const [playing, setPlaying] = React.useState(autoplay);\n  // True once the tour has run to its end (and stopped — not merely paused).\n  // Drives the centred replay affordance, the way an ended video shows one.\n  const [finished, setFinished] = React.useState(false);\n  const loopsRef = React.useRef(0);\n\n  // Restart from the top: reset the loop counter and play from frame 0.\n  const replay = React.useCallback(() => {\n    loopsRef.current = 0;\n    setFinished(false);\n    setI(0);\n    setPlaying(true);\n  }, []);\n\n  // Controlled pause — a sequencer (Motion) holds the transport. Only\n  // engages when the prop is provided; otherwise playback is self-managed.\n  React.useEffect(() => {\n    if (paused === undefined) return;\n    if (paused) setPlaying(false);\n    else if (!finished) setPlaying(true);\n  }, [paused, finished]);\n\n  // Fire onEnded exactly once per run-to-completion (effect, not state\n  // updater, so StrictMode's double-invoke can't double-fire it).\n  const onEndedRef = React.useRef(onEnded);\n  React.useEffect(() => {\n    onEndedRef.current = onEnded;\n  });\n  React.useEffect(() => {\n    if (finished) onEndedRef.current?.();\n  }, [finished]);\n  React.useEffect(() => {\n    // Don't advance when reduced, paused, or unwatched (tab hidden / offscreen).\n    if (reduced || !playing || !active || frames.length <= 1) return;\n    const t = setTimeout(() => {\n      setI((n) => {\n        const next = n + 1;\n        if (next >= frames.length) {\n          // End of a cycle. Loop only while we're under the cap; otherwise\n          // settle on the starter frame and stop — a movie ends.\n          if (loop && loopsRef.current + 1 < maxLoops) {\n            loopsRef.current += 1;\n            return 0;\n          }\n          setPlaying(false);\n          setFinished(true);\n          return starter;\n        }\n        return next;\n      });\n    }, frames[i].hold);\n    return () => clearTimeout(t);\n  }, [i, playing, active, reduced, frames, loop, maxLoops, starter]);\n\n  // Reduced motion holds the starter frame, no movement.\n  const fi = reduced ? starter : Math.min(i, frames.length - 1);\n  const f = frames[fi] ?? frames[0];\n  const zoomed = f.opacity === 1 && f.zoom > 1.05;\n  const transMs = reduced ? 0 : f.trans;\n  const ease = f.zoom <= 1.05 ? SETTLE : PUSH;\n\n  return (\n    <div\n      ref={rootRef}\n      className={cn(\"gds-screen-animator\", className)}\n      data-gds-part=\"screen-animator\"\n      style={{\n        position: \"absolute\",\n        inset: 0,\n        overflow: \"hidden\",\n        background: stage,\n        ...style,\n      }}\n    >\n      <style>{`\n        @keyframes gdsSaPing { from { transform: scale(0.4); opacity: 0.9 } to { transform: scale(1.8); opacity: 0 } }\n        @keyframes gdsSaPulse { 0%,100% { opacity: 1 } 50% { opacity: 0.5 } }\n      `}</style>\n\n      {/* Backdrop — a fill / image / ThreeScene behind the content. Shows\n          around the screen while it's small. */}\n      {backdrop && (\n        <div\n          aria-hidden\n          style={{ position: \"absolute\", inset: 0, pointerEvents: \"none\" }}\n        >\n          {backdrop}\n        </div>\n      )}\n\n      {/* The content, transformed by the camera. */}\n      <div\n        style={{\n          position: \"absolute\",\n          inset: 0,\n          transform: f.transform,\n          transformOrigin: \"0 0\",\n          opacity: f.opacity,\n          transition: `transform ${transMs}ms ${ease}, opacity 700ms ease`,\n        }}\n      >\n        {children}\n      </div>\n\n      {/* Focus spotlight. */}\n      {spotlight && (\n        <div\n          aria-hidden\n          style={{\n            position: \"absolute\",\n            inset: 0,\n            pointerEvents: \"none\",\n            background:\n              \"radial-gradient(circle at 50% 50%, transparent 26%, rgba(0,0,0,0.46) 80%)\",\n            opacity: zoomed ? 1 : 0,\n            transition: `opacity ${TRANS_MS}ms ease`,\n          }}\n        />\n      )}\n\n      {/* Synthetic cursor + click ripple, centred on the focal point. */}\n      {cursor && (\n        <div\n          key={fi}\n          aria-hidden\n          style={{\n            position: \"absolute\",\n            left: \"50%\",\n            top: \"50%\",\n            transform: \"translate(-50%, -50%)\",\n            pointerEvents: \"none\",\n            opacity: zoomed ? 1 : 0,\n            transition: `opacity ${TRANS_MS}ms ease`,\n          }}\n        >\n          <span\n            style={{\n              position: \"absolute\",\n              left: -19,\n              top: -19,\n              width: 38,\n              height: 38,\n              borderRadius: 999,\n              border: \"2px solid rgba(59,130,246,0.75)\",\n              animation: \"gdsSaPing 1100ms ease-out 0.4s 1\",\n            }}\n          />\n          <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n            <path\n              d=\"M5 3l14 7-6 1.5L10 18 5 3z\"\n              fill=\"#fff\"\n              stroke=\"#111\"\n              strokeWidth=\"1.5\"\n              strokeLinejoin=\"round\"\n            />\n          </svg>\n        </div>\n      )}\n\n      {/* Caption — the narration track. It's a polite live region, so a\n          screen reader announces each beat's caption as the shot changes:\n          the closest thing to narrating the demo. Always mounted (stable\n          region); the visible pill renders only when there's a label. */}\n      <div\n        role=\"status\"\n        aria-live=\"polite\"\n        aria-atomic=\"true\"\n        style={{\n          position: \"absolute\",\n          left: \"50%\",\n          [captionPosition === \"top\" ? \"top\" : \"bottom\"]: 22,\n          transform: \"translateX(-50%)\",\n          pointerEvents: \"none\",\n        }}\n      >\n        {f.label && (\n          <span\n            style={{\n              display: \"inline-flex\",\n              alignItems: \"center\",\n              gap: 9,\n              padding: \"8px 14px\",\n              borderRadius: 999,\n              background: \"rgba(15,15,17,0.62)\",\n              color: \"#fff\",\n              fontSize: 13.5,\n              fontWeight: 600,\n              backdropFilter: \"blur(10px)\",\n              boxShadow: \"0 6px 22px rgba(0,0,0,0.25)\",\n            }}\n          >\n            <span\n              aria-hidden\n              style={{\n                width: 7,\n                height: 7,\n                borderRadius: 999,\n                background: \"#34d399\",\n                animation: \"gdsSaPulse 1600ms ease-in-out infinite\",\n              }}\n            />\n            {f.label}\n          </span>\n        )}\n      </div>\n\n      {/* Transport — it's a directed playback: play / pause / restart. */}\n      {controls && frames.length > 1 && !reduced && (\n        <div\n          role=\"group\"\n          aria-label=\"Demo playback controls\"\n          style={{\n            position: \"absolute\",\n            right: 16,\n            bottom: 16,\n            display: \"flex\",\n            gap: 4,\n            alignItems: \"center\",\n            padding: \"4px 6px\",\n            borderRadius: 999,\n            background: \"rgba(15,15,17,0.55)\",\n            backdropFilter: \"blur(10px)\",\n            boxShadow: \"0 6px 22px rgba(0,0,0,0.25)\",\n          }}\n        >\n          <button\n            type=\"button\"\n            onClick={() => (finished ? replay() : setPlaying((p) => !p))}\n            aria-label={finished ? \"Replay\" : playing ? \"Pause\" : \"Play\"}\n            style={btn}\n          >\n            {finished ? <RestartIcon /> : playing ? <PauseIcon /> : <PlayIcon />}\n          </button>\n          <button\n            type=\"button\"\n            onClick={replay}\n            aria-label=\"Restart\"\n            style={btn}\n          >\n            <RestartIcon />\n          </button>\n        </div>\n      )}\n\n      {/* Ended state — a centred replay button, like a video that's finished.\n          Appears only when the tour has run to its cap and stopped. */}\n      {finished && !reduced && (\n        <button\n          type=\"button\"\n          onClick={replay}\n          aria-label=\"Replay\"\n          style={{\n            position: \"absolute\",\n            inset: 0,\n            margin: \"auto\",\n            width: 64,\n            height: 64,\n            display: \"grid\",\n            placeItems: \"center\",\n            borderRadius: 999,\n            border: \"none\",\n            color: \"#fff\",\n            background: \"rgba(15,15,17,0.55)\",\n            backdropFilter: \"blur(10px)\",\n            boxShadow: \"0 8px 30px rgba(0,0,0,0.35)\",\n            cursor: \"pointer\",\n          }}\n        >\n          <svg width=\"26\" height=\"26\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n            <path d=\"M3 12a9 9 0 1 0 3-6.7L3 8\" />\n            <path d=\"M3 3v5h5\" />\n          </svg>\n        </button>\n      )}\n    </div>\n  );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useReducedMotion } from \"../../lib/motion\";\nimport { cn } from \"@/lib/utils\";\nimport { ScreenAnimator, type ScreenAnimatorShot } from \"./screen-animator\";\n\n/**\n * Motion — a directed sequence of scenes on one persistent stage.\n *\n * The grammar of a modern product demo: text → demo → video → text, any\n * order, any mix. A `<Motion>` owns the stage (one continuous backdrop) and\n * plays its `<MotionScene>`s in order. A scene is a *stage moment* holding\n * arbitrary content:\n *\n *   - `<MotionScreen>` — a framed screen with its OWN camera (`shots`,\n *     ScreenAnimator applied per-screen). Several can share a scene\n *     (mobile + desktop side by side).\n *   - `<MotionText>` — templated text animations (Motion Templates:\n *     title / lower-third / section-break).\n *   - anything else — a <video>, an image, plain JSX. Untimed content\n *     rides the scene's `durationMs`.\n *\n * THE COMPLETION CONTRACT: a scene advances when all its *timed* children\n * have finished (a camera tour ending, a text template completing), or\n * after `durationMs` when nothing in it keeps time. Timed children register\n * with the scene; static content doesn't. New content types plug in by\n * registering — nothing else changes.\n *\n * Two views of the same children: `view=\"play\"` (the film) and\n * `view=\"strip\"` (the arrangement — scenes left-to-right as labelled\n * cards, the Studio edit view). Under `prefers-reduced-motion` the play\n * view falls back to the strip: see everything, move nothing.\n *\n * See STUDIO-DIRECTOR.md (\"Grade Motion\") for the design doc.\n */\n\n// ─── Scene context: how content talks to its scene ─────────────────────\n\nexport interface MotionSceneRegistration {\n  /** Signal this timed child has finished its run. Idempotent. */\n  done: () => void;\n  /** Unregister (unmount) without deadlocking the scene. */\n  cancel: () => void;\n}\n\ninterface SceneCtxValue {\n  mode: \"play\" | \"strip\";\n  active: boolean;\n  paused: boolean;\n  /** Register as a timed child. Call in a mount effect; cancel on cleanup. */\n  register: () => MotionSceneRegistration;\n}\n\nconst SceneCtx = React.createContext<SceneCtxValue | null>(null);\n\nconst STANDALONE_CTX: SceneCtxValue = {\n  mode: \"play\",\n  active: true,\n  paused: false,\n  register: () => ({ done: () => {}, cancel: () => {} }),\n};\n\n/** Read the enclosing scene (or a permissive standalone default). */\nexport function useMotionScene(): SceneCtxValue {\n  return React.useContext(SceneCtx) ?? STANDALONE_CTX;\n}\n\n// Same canvas-fill token ScreenAnimator reads, so every stage matches.\nconst DEFAULT_STAGE =\n  \"var(--gds-canvas-fill, radial-gradient(circle at 50% 38%, #1b1b22, #0b0b0e))\";\n\n// ─── Scene error isolation ──────────────────────────────────────────────\n// A scene that throws must not take the film down. The boundary catches\n// the render error, shows a quiet chip, and (in play mode) auto-skips to\n// the next scene — the show goes on. Keyed per scene activation so a\n// failure in scene 4 never poisons scene 5.\n\nfunction SceneFailedCard({\n  label,\n  onSkip,\n}: {\n  label?: string;\n  onSkip?: () => void;\n}) {\n  React.useEffect(() => {\n    if (!onSkip) return;\n    const t = setTimeout(onSkip, 1400);\n    return () => clearTimeout(t);\n  }, [onSkip]);\n  return (\n    <div\n      style={{\n        position: \"absolute\",\n        inset: 0,\n        display: \"grid\",\n        placeItems: \"center\",\n        pointerEvents: \"none\",\n      }}\n    >\n      <span\n        style={{\n          padding: \"8px 14px\",\n          borderRadius: 999,\n          background: \"rgba(15,15,17,0.6)\",\n          border: \"1px solid rgba(255,255,255,0.16)\",\n          color: \"rgba(255,255,255,0.75)\",\n          fontSize: 12.5,\n          backdropFilter: \"blur(10px)\",\n        }}\n      >\n        {label ? `Scene “${label}” hit an error` : \"This scene hit an error\"}\n        {onSkip ? \" — skipping\" : \"\"}\n      </span>\n    </div>\n  );\n}\n\nclass SceneBoundary extends React.Component<\n  { label?: string; onSkip?: () => void; children: React.ReactNode },\n  { failed: boolean }\n> {\n  state = { failed: false };\n  static getDerivedStateFromError() {\n    return { failed: true };\n  }\n  componentDidCatch() {\n    // Quiet by design — the chip is the surface; the host's console\n    // still carries the original error for debugging.\n  }\n  render() {\n    if (this.state.failed)\n      return <SceneFailedCard label={this.props.label} onSkip={this.props.onSkip} />;\n    return this.props.children;\n  }\n}\n\n// ─── MiniRender: a screen at a virtual width, scaled to its frame ───────\n\nfunction MiniRender({\n  virtualWidth,\n  children,\n}: {\n  virtualWidth: number;\n  children: React.ReactNode;\n}) {\n  const ref = React.useRef<HTMLDivElement>(null);\n  const [box, setBox] = React.useState<{ w: number; h: number } | null>(null);\n  React.useEffect(() => {\n    const el = ref.current;\n    if (!el) return;\n    const measure = () =>\n      setBox({ w: el.clientWidth || 1, h: el.clientHeight || 1 });\n    measure();\n    const ro = new ResizeObserver(measure);\n    ro.observe(el);\n    return () => ro.disconnect();\n  }, []);\n  const scale = box ? box.w / virtualWidth : 0;\n  return (\n    <div ref={ref} style={{ position: \"absolute\", inset: 0, overflow: \"hidden\" }}>\n      {box && scale > 0 && (\n        <div\n          style={{\n            width: virtualWidth,\n            height: box.h / scale,\n            transform: `scale(${scale})`,\n            transformOrigin: \"0 0\",\n          }}\n        >\n          {children}\n        </div>\n      )}\n    </div>\n  );\n}\n\n// ─── FitBox: letterbox a fixed-aspect stage into the container ──────────\n\nfunction parseAspect(aspect: string): number | null {\n  const m = aspect.match(/^\\s*([0-9.]+)\\s*\\/\\s*([0-9.]+)\\s*$/);\n  if (!m) return null;\n  const r = Number(m[1]) / Number(m[2]);\n  return Number.isFinite(r) && r > 0 ? r : null;\n}\n\nfunction FitBox({\n  ratio,\n  children,\n}: {\n  ratio: number;\n  children: React.ReactNode;\n}) {\n  const ref = React.useRef<HTMLDivElement>(null);\n  const [box, setBox] = React.useState<{ w: number; h: number } | null>(null);\n  React.useEffect(() => {\n    const el = ref.current;\n    if (!el) return;\n    const measure = () => {\n      const cw = el.clientWidth || 1;\n      const ch = el.clientHeight || 1;\n      const w = Math.min(cw, ch * ratio);\n      setBox({ w, h: w / ratio });\n    };\n    measure();\n    const ro = new ResizeObserver(measure);\n    ro.observe(el);\n    return () => ro.disconnect();\n  }, [ratio]);\n  return (\n    <div ref={ref} style={{ position: \"absolute\", inset: 0 }}>\n      {box && (\n        <div\n          style={{\n            position: \"absolute\",\n            left: \"50%\",\n            top: \"50%\",\n            transform: \"translate(-50%, -50%)\",\n            width: box.w,\n            height: box.h,\n            overflow: \"hidden\",\n          }}\n        >\n          {children}\n        </div>\n      )}\n    </div>\n  );\n}\n\n// ─── MotionScreen — a framed screen with its own camera ─────────────────\n\nexport interface MotionScreenProps {\n  /** Frame preset. Desktop is a 16:10 browser-ish frame; mobile a tall\n   *  device frame. Default \"desktop\". */\n  device?: \"desktop\" | \"mobile\";\n  /** Camera shots for THIS screen (ScreenAnimator, per-screen). Omit for\n   *  fly-in + a single dwell. */\n  shots?: ScreenAnimatorShot[];\n  /** Virtual CSS width the content is laid out at before scaling into the\n   *  frame. Defaults: desktop 1100, mobile 390. */\n  virtualWidth?: number;\n  /** Dim edges when the camera pushes in. Default false. */\n  spotlight?: boolean;\n  /** Synthetic cursor on detail shots. Default true. */\n  cursor?: boolean;\n  /** Fly the CONTENT in from offscreen when the scene starts. Default\n   *  FALSE for framed screens — the full-screen fly-in choreography\n   *  reads badly inside a small clipped frame (content sliding around\n   *  in a box). Scene `transition` and frame `animate` are the\n   *  entrances here; opt back in for full-bleed hero screens. */\n  enter?: boolean;\n  /** Animate the FRAME in place within the scene — independent of (and\n   *  composable with) the camera inside it. \"rise\" / \"tilt-settle\" are\n   *  entrances; \"float\" / \"drift\" are ambient loops. Default \"none\".\n   *  Pair with enter={false} when using an entrance here. */\n  animate?: MotionScreenAnimate;\n  /** Provenance — the Studio screen this was copied from. Ignored at\n   *  render; read by tooling (the dock, future live-reference scenes). */\n  screenId?: string;\n  className?: string;\n  style?: React.CSSProperties;\n  children: React.ReactNode;\n}\n\nexport function MotionScreen({\n  device = \"desktop\",\n  shots,\n  virtualWidth,\n  spotlight = false,\n  cursor = true,\n  enter = false,\n  animate = \"none\",\n  screenId: _screenId,\n  className,\n  style,\n  children,\n}: MotionScreenProps) {\n  const scene = useMotionScene();\n  const vw = virtualWidth ?? (device === \"mobile\" ? 390 : 1100);\n\n  // Register as a timed child while active in play mode: the camera tour\n  // (or the default fly-in + dwell) is this screen's clock.\n  const regRef = React.useRef<MotionSceneRegistration | null>(null);\n  const playing = scene.mode === \"play\" && scene.active;\n  const { register } = scene;\n  React.useEffect(() => {\n    if (!playing) return;\n    const reg = register();\n    regRef.current = reg;\n    return () => {\n      regRef.current = null;\n      reg.cancel();\n    };\n  }, [playing, register]);\n\n  const frame: React.CSSProperties =\n    device === \"mobile\"\n      ? {\n          position: \"relative\",\n          height: \"76%\",\n          aspectRatio: \"390 / 800\",\n          borderRadius: 22,\n          flex: \"0 0 auto\",\n        }\n      : {\n          position: \"relative\",\n          flex: \"1 1 0%\",\n          maxWidth: \"82%\",\n          aspectRatio: \"16 / 10\",\n          minWidth: 0,\n          borderRadius: 12,\n        };\n\n  return (\n    <div\n      data-gds-part=\"motion-screen\"\n      className={cn(\"gds-motion-screen\", className)}\n      style={{\n        ...frame,\n        overflow: \"hidden\",\n        background: \"var(--gds-background, #fff)\",\n        boxShadow:\n          \"0 18px 60px rgba(0,0,0,0.38), 0 2px 10px rgba(0,0,0,0.22)\",\n        ...(playing && SCREEN_ANIMATE[animate]\n          ? { animation: SCREEN_ANIMATE[animate]! }\n          : {}),\n        ...style,\n      }}\n    >\n      {playing ? (\n        <ScreenAnimator\n          shots={shots}\n          loop={false}\n          controls={false}\n          enter={enter}\n          spotlight={spotlight}\n          cursor={cursor}\n          stage=\"transparent\"\n          paused={scene.paused}\n          onEnded={() => regRef.current?.done()}\n        >\n          <MiniRender virtualWidth={vw}>{children}</MiniRender>\n        </ScreenAnimator>\n      ) : (\n        // Strip / inactive: a static poster, no camera.\n        <MiniRender virtualWidth={vw}>{children}</MiniRender>\n      )}\n    </div>\n  );\n}\n\n// ─── MotionText — Motion Templates (pre-directed text animations) ───────\n\nexport type MotionTextTemplate =\n  | \"title\"\n  | \"lower-third\"\n  | \"section-break\"\n  | \"broadcast\"\n  | \"ticker\"\n  | \"stat\"\n  | \"quote\";\n\nconst TEMPLATE_DURATION: Record<MotionTextTemplate, number> = {\n  title: 3800,\n  \"lower-third\": 3200,\n  \"section-break\": 4200,\n  broadcast: 4200,\n  ticker: 6000,\n  stat: 4200,\n  quote: 5200,\n};\n\nexport interface MotionTextProps {\n  /** Which Motion Template. Default \"title\". */\n  template?: MotionTextTemplate;\n  heading: string;\n  /** Supporting line (title / lower-third). */\n  text?: string;\n  /** Override the template's run length (ms). */\n  durationMs?: number;\n  /** Text colour against the stage. Default \"light\" (for the dark stage). */\n  tone?: \"light\" | \"dark\";\n  /**\n   * Lift the type off a busy or low-contrast backdrop (pale shader washes,\n   * photos, video). `\"shadow\"` adds a soft contrast shadow to the glyphs;\n   * `\"scrim\"` additionally drops a quiet radial darkening behind the text\n   * block. Default \"none\" — flat fills don't need it.\n   */\n  lift?: \"none\" | \"shadow\" | \"scrim\";\n  className?: string;\n  style?: React.CSSProperties;\n}\n\nexport function MotionText({\n  template = \"title\",\n  heading,\n  text,\n  durationMs,\n  tone = \"light\",\n  lift = \"none\",\n  className,\n  style,\n}: MotionTextProps) {\n  const scene = useMotionScene();\n  const reduced = useReducedMotion();\n  const dur = durationMs ?? TEMPLATE_DURATION[template];\n  const playing = scene.mode === \"play\" && scene.active;\n  const animate = playing && !reduced;\n\n  // Timed child: register, run a pause-aware clock, signal done.\n  const regRef = React.useRef<MotionSceneRegistration | null>(null);\n  const remainRef = React.useRef(dur);\n  const { register, paused } = scene;\n  React.useEffect(() => {\n    if (!playing) return;\n    remainRef.current = dur;\n    const reg = register();\n    regRef.current = reg;\n    return () => {\n      regRef.current = null;\n      reg.cancel();\n    };\n  }, [playing, dur, register]);\n  React.useEffect(() => {\n    if (!playing || paused) return;\n    const started = Date.now();\n    const t = setTimeout(() => {\n      remainRef.current = 0;\n      regRef.current?.done();\n    }, remainRef.current);\n    return () => {\n      clearTimeout(t);\n      remainRef.current = Math.max(0, remainRef.current - (Date.now() - started));\n    };\n  }, [playing, paused]);\n\n  const color = tone === \"dark\" ? \"#16161a\" : \"#fff\";\n  // Lift — contrast treatment for busy/pale backdrops. The shadow tracks\n  // the tone (light type gets a dark shadow, dark type a light glow).\n  const liftShadow =\n    lift === \"none\"\n      ? undefined\n      : tone === \"dark\"\n        ? \"0 1px 2px rgba(255,255,255,0.55), 0 2px 24px rgba(255,255,255,0.45)\"\n        : \"0 1px 2px rgba(0,0,0,0.35), 0 2px 28px rgba(0,0,0,0.30)\";\n  const playState = paused ? (\"paused\" as const) : (\"running\" as const);\n  const anim = (name: string, ms: number, delay = 0): React.CSSProperties =>\n    animate\n      ? {\n          animation: `${name} ${ms}ms cubic-bezier(0.22, 1, 0.36, 1) ${delay}ms both`,\n          animationPlayState: playState,\n        }\n      : {};\n\n  return (\n    <div\n      data-gds-part=\"motion-text\"\n      className={cn(\"gds-motion-text\", className)}\n      style={{\n        position:\n          template === \"lower-third\" ||\n          template === \"broadcast\" ||\n          template === \"ticker\"\n            ? \"absolute\"\n            : \"relative\",\n        ...(template === \"lower-third\"\n          ? { left: \"6%\", bottom: \"9%\" }\n          : template === \"broadcast\"\n            ? { left: 0, right: 0, bottom: \"6%\" }\n            : template === \"ticker\"\n              ? { left: 0, right: 0, bottom: 0 }\n              : template === \"quote\"\n                ? { textAlign: \"center\", maxWidth: \"64%\" }\n                : { textAlign: \"center\", maxWidth: \"72%\" }),\n        color,\n        textShadow: liftShadow,\n        // The scrim child sits at z -1; isolating keeps it INSIDE this\n        // block's stacking context (above the scene's fill layers).\n        isolation: lift === \"scrim\" ? \"isolate\" : undefined,\n        pointerEvents: \"none\",\n        ...style,\n      }}\n    >\n      {lift === \"scrim\" && (\n        <div\n          aria-hidden\n          style={{\n            position: \"absolute\",\n            inset: \"-30% -20%\",\n            zIndex: -1,\n            pointerEvents: \"none\",\n            background:\n              tone === \"dark\"\n                ? \"radial-gradient(ellipse at center, rgba(255,255,255,0.45), transparent 70%)\"\n                : \"radial-gradient(ellipse at center, rgba(0,0,0,0.34), transparent 70%)\",\n            filter: \"blur(2px)\",\n          }}\n        />\n      )}\n      <style>{`\n        @keyframes gdsMotionFadeUp { from { opacity: 0; transform: translateY(18px) } to { opacity: 1; transform: translateY(0) } }\n        @keyframes gdsMotionSlideIn { from { opacity: 0; transform: translateX(-28px) } to { opacity: 1; transform: translateX(0) } }\n        @keyframes gdsMotionPush { from { opacity: 0; transform: scale(1.05) } to { opacity: 1; transform: scale(1) } }\n        @keyframes gdsMotionMarquee { from { transform: translateX(0) } to { transform: translateX(-50%) } }\n        @keyframes gdsMotionStatSlam { 0% { opacity: 0; transform: scale(2.2) } 60% { opacity: 1; transform: scale(0.96) } 80% { transform: scale(1.02) } 100% { opacity: 1; transform: scale(1) } }\n        @keyframes gdsMotionQuoteMark { from { opacity: 0; transform: translateY(10px) scale(0.9) } to { opacity: 0.14; transform: translateY(0) scale(1) } }\n      `}</style>\n\n      {template === \"title\" && (\n        <>\n          <div\n            style={{\n              fontSize: \"clamp(26px, 5.2vw, 60px)\",\n              fontWeight: 700,\n              letterSpacing: \"-0.02em\",\n              lineHeight: 1.06,\n              ...anim(\"gdsMotionFadeUp\", 700),\n            }}\n          >\n            {heading}\n          </div>\n          {text && (\n            <div\n              style={{\n                marginTop: 14,\n                fontSize: \"clamp(14px, 1.8vw, 20px)\",\n                opacity: 0.72,\n                ...anim(\"gdsMotionFadeUp\", 700, 160),\n              }}\n            >\n              {text}\n            </div>\n          )}\n        </>\n      )}\n\n      {template === \"lower-third\" && (\n        <div\n          style={{\n            display: \"inline-flex\",\n            flexDirection: \"column\",\n            gap: 3,\n            padding: \"10px 16px\",\n            borderRadius: 12,\n            background:\n              tone === \"dark\" ? \"rgba(255,255,255,0.78)\" : \"rgba(15,15,17,0.62)\",\n            backdropFilter: \"blur(10px)\",\n            boxShadow: \"0 6px 22px rgba(0,0,0,0.25)\",\n            ...anim(\"gdsMotionSlideIn\", 500),\n          }}\n        >\n          <span style={{ fontSize: 15, fontWeight: 650 }}>{heading}</span>\n          {text && <span style={{ fontSize: 12.5, opacity: 0.72 }}>{text}</span>}\n        </div>\n      )}\n\n      {template === \"broadcast\" && (\n        // The TV one — a full-width band that sits OVER the screen the\n        // way news graphics do. Brand-blue by default (primary token);\n        // a thin lighter strap on top carries the secondary line.\n        <div style={{ overflow: \"hidden\", ...anim(\"gdsMotionSlideIn\", 600) }}>\n          {text && (\n            <div\n              style={{\n                display: \"inline-block\",\n                marginLeft: \"6%\",\n                padding: \"5px 14px\",\n                fontSize: 12.5,\n                fontWeight: 600,\n                letterSpacing: \"0.04em\",\n                textTransform: \"uppercase\",\n                color: \"#fff\",\n                background:\n                  \"oklch(var(--primary, 0.45 0.18 264) / 0.85)\",\n              }}\n            >\n              {text}\n            </div>\n          )}\n          <div\n            style={{\n              padding: \"12px 6% 14px\",\n              background:\n                \"linear-gradient(90deg, oklch(var(--primary, 0.45 0.18 264)) 0%, oklch(var(--primary, 0.45 0.18 264) / 0.92) 70%, oklch(var(--primary, 0.45 0.18 264) / 0) 100%)\",\n              color: \"#fff\",\n            }}\n          >\n            <span style={{ fontSize: 22, fontWeight: 800, letterSpacing: \"-0.01em\" }}>\n              {heading}\n            </span>\n          </div>\n        </div>\n      )}\n\n      {template === \"section-break\" && (\n        <div\n          style={{\n            fontSize: \"clamp(30px, 6vw, 72px)\",\n            fontWeight: 700,\n            letterSpacing: \"-0.025em\",\n            lineHeight: 1.04,\n            ...anim(\"gdsMotionPush\", 1400),\n          }}\n        >\n          {heading}\n        </div>\n      )}\n\n      {template === \"ticker\" && (\n        // The news ticker — a thin dark-glass bar pinned to the very\n        // bottom; the heading is an uppercase label chip, the text scrolls\n        // as a seamless marquee (the line is duplicated so -50% loops).\n        <div\n          style={{\n            display: \"flex\",\n            alignItems: \"stretch\",\n            background:\n              tone === \"dark\" ? \"rgba(255,255,255,0.78)\" : \"rgba(15,15,17,0.62)\",\n            backdropFilter: \"blur(10px)\",\n            overflow: \"hidden\",\n            ...anim(\"gdsMotionFadeUp\", 500),\n          }}\n        >\n          <span\n            style={{\n              flex: \"0 0 auto\",\n              display: \"inline-flex\",\n              alignItems: \"center\",\n              padding: \"7px 14px\",\n              fontSize: 11.5,\n              fontWeight: 700,\n              letterSpacing: \"0.08em\",\n              textTransform: \"uppercase\",\n              color: \"#fff\",\n              background: \"oklch(var(--primary, 0.45 0.18 264))\",\n            }}\n          >\n            {heading}\n          </span>\n          {text && (\n            <div\n              style={{\n                flex: \"1 1 0%\",\n                minWidth: 0,\n                display: \"flex\",\n                alignItems: \"center\",\n                overflow: \"hidden\",\n                maskImage:\n                  \"linear-gradient(90deg, transparent 0, #000 24px, #000 calc(100% - 24px), transparent 100%)\",\n              }}\n            >\n              <div\n                style={{\n                  display: \"inline-flex\",\n                  whiteSpace: \"nowrap\",\n                  fontSize: 13,\n                  ...(animate\n                    ? {\n                        animation: \"gdsMotionMarquee 24000ms linear infinite\",\n                        animationPlayState: playState,\n                      }\n                    : {}),\n                }}\n              >\n                {/* Two copies = a seamless -50% loop. */}\n                <span style={{ padding: \"0 0 0 16px\" }}>{text} · </span>\n                <span style={{ padding: \"0 0 0 4px\" }}>{text} · </span>\n              </div>\n            </div>\n          )}\n        </div>\n      )}\n\n      {template === \"stat\" && (\n        // The oversized statistic — the number slams in (scale 2.2 →\n        // overshoot → settle), the label fades up beneath it.\n        <>\n          <div\n            style={{\n              fontSize: \"clamp(48px, 16vw, 180px)\",\n              fontWeight: 900,\n              letterSpacing: \"-0.04em\",\n              lineHeight: 1,\n              ...anim(\"gdsMotionStatSlam\", 800),\n            }}\n          >\n            {heading}\n          </div>\n          {text && (\n            <div\n              style={{\n                marginTop: 16,\n                fontSize: \"clamp(14px, 1.8vw, 20px)\",\n                opacity: 0.72,\n                ...anim(\"gdsMotionFadeUp\", 700, 420),\n              }}\n            >\n              {text}\n            </div>\n          )}\n        </>\n      )}\n\n      {template === \"quote\" && (\n        // The editorial pull-quote — an oversized low-opacity opening\n        // mark floats behind the quote; the attribution follows, staggered.\n        <div style={{ position: \"relative\" }}>\n          <span\n            aria-hidden\n            style={{\n              position: \"absolute\",\n              top: \"-0.45em\",\n              left: \"-0.18em\",\n              fontSize: \"clamp(80px, 12vw, 160px)\",\n              fontWeight: 800,\n              lineHeight: 1,\n              opacity: animate ? undefined : 0.14,\n              pointerEvents: \"none\",\n              ...anim(\"gdsMotionQuoteMark\", 900),\n            }}\n          >\n            &ldquo;\n          </span>\n          <div\n            style={{\n              position: \"relative\",\n              fontSize: \"clamp(22px, 3.6vw, 44px)\",\n              fontWeight: 600,\n              letterSpacing: \"-0.015em\",\n              lineHeight: 1.25,\n              ...anim(\"gdsMotionFadeUp\", 700),\n            }}\n          >\n            {heading}\n          </div>\n          {text && (\n            <div\n              style={{\n                marginTop: 18,\n                fontSize: \"clamp(13px, 1.6vw, 17px)\",\n                opacity: 0.65,\n                ...anim(\"gdsMotionFadeUp\", 700, 240),\n              }}\n            >\n              &mdash; {text}\n            </div>\n          )}\n        </div>\n      )}\n    </div>\n  );\n}\n\n// ─── MotionOverlay — the broadcast layer ────────────────────────────────\n// Persistent on-screen graphics that belong to the FILM, not a scene:\n// a network-bug logo, a live clock, a ticker, a video layer. Declared as\n// a direct child of <Motion> (a peer of scenes); renders above every\n// scene for the whole runtime, in a standard anchor zone. Ignored by the\n// strip view (it's film chrome, not a scene).\n\nexport type MotionOverlayZone =\n  | \"top-left\"\n  | \"top\"\n  | \"top-right\"\n  | \"center\"\n  | \"bottom-left\"\n  | \"bottom\"\n  | \"bottom-right\"\n  | \"lower-third\";\n\nconst OVERLAY_ZONE: Record<MotionOverlayZone, React.CSSProperties> = {\n  \"top-left\": { top: 18, left: 20 },\n  top: { top: 18, left: 0, right: 0, display: \"grid\", placeItems: \"center\" },\n  \"top-right\": { top: 18, right: 20 },\n  center: { inset: 0, display: \"grid\", placeItems: \"center\" },\n  \"bottom-left\": { bottom: 18, left: 20 },\n  bottom: { bottom: 18, left: 0, right: 0, display: \"grid\", placeItems: \"center\" },\n  \"bottom-right\": { bottom: 52, right: 20 }, // clears the transport\n  \"lower-third\": { left: \"6%\", right: \"6%\", bottom: \"8%\" },\n};\n\nexport interface MotionOverlayProps {\n  /** Anchor zone. Default \"top-right\" (the classic network-bug corner). */\n  zone?: MotionOverlayZone;\n  /** Visible from this scene index (inclusive). Default 0 — overlays are\n   *  a second TIMELINE: always-on is just the full-range case. */\n  fromScene?: number;\n  /** Visible through this scene index (inclusive). Default: the end. */\n  toScene?: number;\n  /** Re-enable pointer events for interactive overlays. Default false. */\n  interactive?: boolean;\n  className?: string;\n  style?: React.CSSProperties;\n  children: React.ReactNode;\n}\n\nexport function MotionOverlay({\n  zone = \"top-right\",\n  fromScene: _fromScene,\n  toScene: _toScene,\n  interactive = false,\n  className,\n  style,\n  children,\n}: MotionOverlayProps) {\n  return (\n    <div\n      data-gds-part=\"motion-overlay\"\n      className={cn(\"gds-motion-overlay\", className)}\n      style={{\n        position: \"absolute\",\n        zIndex: 20,\n        pointerEvents: interactive ? \"auto\" : \"none\",\n        ...OVERLAY_ZONE[zone],\n        ...style,\n      }}\n    >\n      {children}\n    </div>\n  );\n}\n\n// ─── MotionScene — one stage moment ─────────────────────────────────────\n\n/** How a scene ARRIVES on the stage. Entrance-only by design — the\n *  outgoing scene cuts; the incoming one performs. (True cross-fades\n *  need both scenes mounted; that rides the seekable-clock work.) */\nexport type MotionSceneTransition =\n  | \"fade\"\n  | \"slide-up\"\n  | \"slide-down\"\n  | \"slide-left\"\n  | \"slide-right\"\n  | \"pop\"\n  | \"zoom\"\n  | \"wipe-circle\"\n  | \"none\";\n\n/** Per-transition default timing (ms) — override per scene with\n *  `transitionMs`. Also the OVERLAP window the outgoing scene stays\n *  visible underneath. */\nexport const SCENE_TRANSITION_DEFAULT_MS: Record<MotionSceneTransition, number> = {\n  fade: 420,\n  \"slide-up\": 520,\n  \"slide-down\": 520,\n  \"slide-left\": 520,\n  \"slide-right\": 520,\n  pop: 420,\n  zoom: 650,\n  \"wipe-circle\": 750,\n  none: 0,\n};\n\nfunction sceneTransitionAnim(\n  t: MotionSceneTransition,\n  ms: number,\n): string | null {\n  switch (t) {\n    case \"fade\":\n      return `gdsMotionSceneIn ${ms}ms ease both`;\n    case \"slide-up\":\n      return `gdsMotionSceneUp ${ms}ms cubic-bezier(0.22, 1, 0.36, 1) both`;\n    case \"slide-down\":\n      return `gdsMotionSceneDown ${ms}ms cubic-bezier(0.22, 1, 0.36, 1) both`;\n    case \"slide-left\":\n      return `gdsMotionSceneLeft ${ms}ms cubic-bezier(0.22, 1, 0.36, 1) both`;\n    case \"slide-right\":\n      return `gdsMotionSceneRight ${ms}ms cubic-bezier(0.22, 1, 0.36, 1) both`;\n    case \"pop\":\n      return `gdsMotionScenePop ${ms}ms cubic-bezier(0.34, 1.56, 0.64, 1) both`;\n    case \"zoom\":\n      return `gdsMotionSceneZoom ${ms}ms cubic-bezier(0.22, 1, 0.36, 1) both`;\n    case \"wipe-circle\":\n      return `gdsMotionSceneWipe ${ms}ms cubic-bezier(0.65, 0, 0.35, 1) both`;\n    case \"none\":\n      return null;\n  }\n}\n\nconst SCENE_TRANSITION_KEYFRAMES = `\n@keyframes gdsMotionSceneIn    { from { opacity: 0 } to { opacity: 1 } }\n@keyframes gdsMotionSceneUp    { from { opacity: 0; transform: translateY(7%) }  to { opacity: 1; transform: translateY(0) } }\n@keyframes gdsMotionSceneDown  { from { opacity: 0; transform: translateY(-7%) } to { opacity: 1; transform: translateY(0) } }\n@keyframes gdsMotionSceneLeft  { from { opacity: 0; transform: translateX(7%) }  to { opacity: 1; transform: translateX(0) } }\n@keyframes gdsMotionSceneRight { from { opacity: 0; transform: translateX(-7%) } to { opacity: 1; transform: translateX(0) } }\n@keyframes gdsMotionScenePop   { from { opacity: 0; transform: scale(0.9) }      to { opacity: 1; transform: scale(1) } }\n@keyframes gdsMotionSceneZoom  { from { opacity: 0; transform: scale(1.1) }      to { opacity: 1; transform: scale(1) } }\n@keyframes gdsMotionSceneWipe  { from { clip-path: circle(0% at 50% 50%) }       to { clip-path: circle(141% at 50% 50%) } }\n@keyframes gdsMotionScreenRise  { from { opacity: 0; transform: translateY(7%) scale(0.97) } to { opacity: 1; transform: translateY(0) scale(1) } }\n@keyframes gdsMotionScreenFloat { from { transform: translateY(-1.2%) } to { transform: translateY(1.2%) } }\n@keyframes gdsMotionScreenTilt  { from { transform: perspective(1100px) rotateX(12deg) rotateY(-16deg) } to { transform: perspective(1100px) rotateX(0deg) rotateY(0deg) } }\n@keyframes gdsMotionScreenDrift { from { transform: translateX(-1.5%) } to { transform: translateX(1.5%) } }\n`;\n\n/** In-place frame animation for MotionScreen — the screen performs\n *  WITHIN the scene (independent of the camera inside it, composable\n *  with it). \"rise\" and \"tilt-settle\" are entrances; \"float\" and\n *  \"drift\" are ambient loops. */\nexport type MotionScreenAnimate =\n  | \"rise\"\n  | \"float\"\n  | \"tilt-settle\"\n  | \"drift\"\n  | \"none\";\n\nconst SCREEN_ANIMATE: Record<MotionScreenAnimate, string | null> = {\n  rise: \"gdsMotionScreenRise 900ms cubic-bezier(0.22, 1, 0.36, 1) both\",\n  float: \"gdsMotionScreenFloat 6s ease-in-out infinite alternate\",\n  \"tilt-settle\": \"gdsMotionScreenTilt 1800ms cubic-bezier(0.22, 1, 0.36, 1) both\",\n  drift: \"gdsMotionScreenDrift 9s ease-in-out infinite alternate\",\n  none: null,\n};\n\nexport interface MotionSceneProps {\n  /** Shown in the strip view + read by the timeline dock. */\n  label?: string;\n  /** Minimum runtime (ms); the whole clock when nothing inside keeps\n   *  time. Default 4000 for untimed scenes. */\n  durationMs?: number;\n  /** Scene background painted over the shared stage for this moment only\n   *  (a CSS background — the white title card, a brand fill). */\n  fill?: string;\n  /** How the scene arrives: fade · slide-up/down/left/right · pop ·\n   *  zoom · wipe-circle (a mask wipe) · none. Default \"fade\". The\n   *  OUTGOING scene stays visible underneath for the transition window,\n   *  so slides/wipes reveal it rather than the stage. */\n  transition?: MotionSceneTransition;\n  /** Transition timing override (ms). Defaults per transition — see\n   *  SCENE_TRANSITION_DEFAULT_MS. */\n  transitionMs?: number;\n  className?: string;\n  style?: React.CSSProperties;\n  children: React.ReactNode;\n}\n\nconst UNTIMED_FALLBACK_MS = 4000;\nconst ADVANCE_BEAT_MS = 420;\n\ninterface MotionSceneInternal {\n  active: boolean;\n  paused: boolean;\n  mode: \"play\" | \"strip\";\n  onSceneEnd: () => void;\n}\n\nfunction MotionSceneImpl({\n  label: _label,\n  durationMs,\n  fill,\n  transition = \"fade\",\n  transitionMs,\n  className,\n  style,\n  children,\n  internal,\n}: MotionSceneProps & { internal: MotionSceneInternal }) {\n  const { active, paused, mode, onSceneEnd } = internal;\n  const playing = mode === \"play\" && active;\n\n  // ── The completion registry ──\n  // Timed children register on mount (their effects run before ours, so by\n  // the time the scene's own effect looks, the count is settled). The scene\n  // advances when all registered children are done — or, with none, after\n  // `durationMs`. AND: an EXPLICIT `durationMs` is a MINIMUM runtime —\n  // a scene with a 3s caption and `durationMs={16000}` runs the full 16s\n  // (a lower-third finishing early must not cut a long visual mid-flight).\n  const explicitDur = durationMs != null;\n  const totalRef = React.useRef(0);\n  const doneRef = React.useRef(0);\n  const endedRef = React.useRef(false);\n  const minDoneRef = React.useRef(!explicitDur);\n  const endNow = React.useCallback(() => {\n    if (endedRef.current) return;\n    endedRef.current = true;\n    onSceneEnd();\n  }, [onSceneEnd]);\n  const endTimer = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n  // Pause-aware completion: a pause landing inside the advance \"breath\"\n  // (or arriving while children finish) must hold the cut, not lose it.\n  const pausedRef = React.useRef(paused);\n  pausedRef.current = paused;\n  const pendingEndRef = React.useRef(false);\n  const check = React.useCallback(() => {\n    if (!minDoneRef.current) return; // the duration floor hasn't elapsed\n    if (totalRef.current > 0 && doneRef.current < totalRef.current) return;\n    if (pausedRef.current) {\n      pendingEndRef.current = true; // resume re-arms the cut\n      return;\n    }\n    // A breath after the last child settles, then cut.\n    if (!endTimer.current)\n      endTimer.current = setTimeout(endNow, ADVANCE_BEAT_MS);\n  }, [endNow]);\n  React.useEffect(() => {\n    if (paused) {\n      // Pausing inside the breath: cancel the scheduled cut, remember it.\n      if (endTimer.current) {\n        clearTimeout(endTimer.current);\n        endTimer.current = null;\n        pendingEndRef.current = true;\n      }\n      return;\n    }\n    if (pendingEndRef.current) {\n      pendingEndRef.current = false;\n      check();\n    }\n  }, [paused, check]);\n  const register = React.useCallback((): MotionSceneRegistration => {\n    totalRef.current += 1;\n    let isDone = false;\n    return {\n      done: () => {\n        if (isDone) return;\n        isDone = true;\n        doneRef.current += 1;\n        check();\n      },\n      cancel: () => {\n        totalRef.current -= 1;\n        if (isDone) doneRef.current -= 1;\n        else check();\n      },\n    };\n  }, [check]);\n\n  // The duration clock (pause-aware). Runs as the ONLY clock for scenes\n  // with no timed children, and as the MINIMUM-runtime floor when an\n  // explicit `durationMs` coexists with timed children.\n  const remainRef = React.useRef(durationMs ?? UNTIMED_FALLBACK_MS);\n  React.useEffect(() => {\n    if (!playing) return;\n    remainRef.current = durationMs ?? UNTIMED_FALLBACK_MS;\n    endedRef.current = false;\n    minDoneRef.current = !explicitDur;\n    return () => {\n      if (endTimer.current) {\n        clearTimeout(endTimer.current);\n        endTimer.current = null;\n      }\n    };\n  }, [playing, durationMs, explicitDur]);\n  React.useEffect(() => {\n    if (!playing || paused) return;\n    // Without an explicit duration, timed children own the clock.\n    if (!explicitDur && totalRef.current > 0) return;\n    const started = Date.now();\n    const t = setTimeout(() => {\n      minDoneRef.current = true;\n      check();\n    }, remainRef.current);\n    return () => {\n      clearTimeout(t);\n      remainRef.current = Math.max(\n        0,\n        remainRef.current - (Date.now() - started),\n      );\n    };\n  }, [playing, paused, explicitDur, check]);\n\n  const ctx = React.useMemo<SceneCtxValue>(\n    () => ({ mode, active, paused, register }),\n    [mode, active, paused, register],\n  );\n\n  return (\n    <SceneCtx.Provider value={ctx}>\n      <div\n        data-gds-part=\"motion-scene\"\n        className={cn(\"gds-motion-scene\", className)}\n        style={{\n          position: \"absolute\",\n          inset: 0,\n          background: fill,\n          // Each scene is its OWN stacking context — without this, an\n          // outgoing scene's internal z-indexed layers (FX reels use\n          // z 1–5) interleave ABOVE the incoming scene's content during\n          // the transition overlap: \"artifacts of the last slide\".\n          isolation: \"isolate\",\n          ...(playing\n            ? (() => {\n                const ms =\n                  transitionMs ?? SCENE_TRANSITION_DEFAULT_MS[transition];\n                const a = sceneTransitionAnim(transition, ms);\n                return a ? { animation: a } : {};\n              })()\n            : {}),\n          ...style,\n        }}\n      >\n        <style>{SCENE_TRANSITION_KEYFRAMES}</style>\n        <div\n          style={{\n            position: \"absolute\",\n            inset: 0,\n            display: \"flex\",\n            alignItems: \"center\",\n            justifyContent: \"center\",\n            gap: \"4%\",\n            padding: \"6%\",\n          }}\n        >\n          {children}\n        </div>\n      </div>\n    </SceneCtx.Provider>\n  );\n}\n\n/**\n * One stage moment in a `<Motion>`. Holds arbitrary content; advances by\n * the completion contract (see the file header). Renders standalone too\n * (active, looping nothing) so a scene can be previewed in isolation —\n * each scene is independently editable.\n */\nexport function MotionScene(props: MotionSceneProps) {\n  // Standalone render (no Motion parent injecting internals): play, active.\n  return (\n    <MotionSceneImpl\n      {...props}\n      internal={{ active: true, paused: false, mode: \"play\", onSceneEnd: () => {} }}\n    />\n  );\n}\n\n// ─── Motion — the sequencer ─────────────────────────────────────────────\n\nexport interface MotionProps {\n  /** \"play\" runs the film; \"strip\" lays the scenes out left-to-right as\n   *  labelled cards (the arrangement / edit view). Default \"play\". */\n  view?: \"play\" | \"strip\";\n  /** Fixed artboard aspect for the film, letterboxed into the container —\n   *  \"16/9\" (landscape demo), \"9/16\" (TikTok / Reels / Shorts), \"1/1\".\n   *  Default \"auto\": the stage fills the container responsively. Strip\n   *  cards adopt the same ratio. */\n  aspect?: \"auto\" | \"16/9\" | \"9/16\" | \"1/1\" | (string & {});\n  /** The persistent stage behind every scene (CSS background). */\n  stage?: string;\n  /** A live layer behind all scenes (image, gradient, <ThreeScene>). */\n  backdrop?: React.ReactNode;\n  /** Start playing on mount. Default true. */\n  autoplay?: boolean;\n  /** Return to scene 1 and keep going at the end. Default false — a\n   *  motion is a movie; it ends. */\n  loop?: boolean;\n  /** Show the transport (play/pause, restart, scene dots). Default true. */\n  controls?: boolean;\n  className?: string;\n  style?: React.CSSProperties;\n  children: React.ReactNode;\n}\n\nconst btn: React.CSSProperties = {\n  display: \"inline-flex\",\n  alignItems: \"center\",\n  justifyContent: \"center\",\n  width: 28,\n  height: 28,\n  borderRadius: 999,\n  border: \"none\",\n  background: \"transparent\",\n  color: \"#fff\",\n  cursor: \"pointer\",\n};\n\nfunction PlayIcon() {\n  return (\n    <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden>\n      <path d=\"M8 5v14l11-7z\" />\n    </svg>\n  );\n}\nfunction PauseIcon() {\n  return (\n    <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden>\n      <rect x=\"6\" y=\"5\" width=\"4\" height=\"14\" rx=\"1\" />\n      <rect x=\"14\" y=\"5\" width=\"4\" height=\"14\" rx=\"1\" />\n    </svg>\n  );\n}\nfunction RestartIcon() {\n  return (\n    <svg\n      width=\"14\"\n      height=\"14\"\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      stroke=\"currentColor\"\n      strokeWidth=\"2\"\n      strokeLinecap=\"round\"\n      strokeLinejoin=\"round\"\n      aria-hidden\n    >\n      <path d=\"M3 12a9 9 0 1 0 3-6.7L3 8\" />\n      <path d=\"M3 3v5h5\" />\n    </svg>\n  );\n}\n\nfunction isOverlayElement(\n  child: React.ReactNode,\n): child is React.ReactElement<MotionOverlayProps> {\n  return React.isValidElement(child) && child.type === MotionOverlay;\n}\n\nfunction isMotionScene(\n  child: React.ReactNode,\n): child is React.ReactElement<MotionSceneProps> {\n  // Permissive on purpose (any element that isn't film chrome is a\n  // scene) — matches how the strip/play views have always treated\n  // children.\n  return React.isValidElement(child) && child.type !== MotionOverlay;\n}\n\n// ─── THE CLOCK — one master timeline per film ───────────────────────────\n// Scene durations are computed from the element tree (camera tours, text\n// templates, explicit floors), summed into a schedule, and a single\n// rAF-driven `timeMs` advances through it. Scrub = set the number;\n// pause = stop it; scene selection = a lookup. CSS animations inside the\n// active scene are puppeted through the Web Animations API\n// (getAnimations({subtree:true})) so seeking lands keyframes mid-flight\n// WITHOUT rewriting any scene content. Known v1 limit: ScreenAnimator's\n// JS-driven camera restarts from its first shot on an intra-scene seek.\n\nconst CAMERA_ENTER_MS = 1500;\nconst CAMERA_DEFAULT_HOLD = 2400;\nconst CAMERA_DEFAULT_TRANS = 1150;\n\nfunction cameraDurationMs(props: MotionScreenProps): number {\n  const shots = props.shots && props.shots.length > 0 ? props.shots : [{}];\n  let total = props.enter === true ? CAMERA_ENTER_MS : 0;\n  shots.forEach((s: ScreenAnimatorShot, i: number) => {\n    total += (s.hold ?? CAMERA_DEFAULT_HOLD) + (i > 0 ? (s.trans ?? CAMERA_DEFAULT_TRANS) : 0);\n  });\n  return total;\n}\n\n/** Deep-walk a scene's children for timed content. */\nfunction walkTimed(node: React.ReactNode, depth: number, out: number[]): void {\n  if (depth > 7) return;\n  React.Children.forEach(node, (child) => {\n    if (!React.isValidElement(child)) return;\n    if (child.type === MotionScreen) {\n      out.push(cameraDurationMs(child.props as MotionScreenProps));\n      return;\n    }\n    if (child.type === MotionText) {\n      const p = child.props as MotionTextProps;\n      out.push(p.durationMs ?? TEMPLATE_DURATION[p.template ?? \"title\"]);\n      return;\n    }\n    const inner = (child.props as { children?: React.ReactNode }).children;\n    if (inner) walkTimed(inner, depth + 1, out);\n  });\n}\n\nexport function computeSceneDurationMs(\n  scene: React.ReactElement<MotionSceneProps>,\n): number {\n  const timed: number[] = [];\n  walkTimed(scene.props.children, 0, timed);\n  const fromChildren = timed.length > 0 ? Math.max(...timed) : 0;\n  const floor = scene.props.durationMs ?? 0;\n  const base =\n    Math.max(fromChildren, floor) ||\n    (scene.props.durationMs ?? UNTIMED_FALLBACK_MS);\n  return base + ADVANCE_BEAT_MS;\n}\n\n/** Sync every CSS animation inside `host` to `offsetMs` (and pause them\n *  when `hold`). The WAAPI puppet that makes arbitrary scene content\n *  seekable without rewriting it. */\nfunction syncSubtreeAnimations(\n  host: Element | null,\n  offsetMs: number,\n  hold: boolean,\n): void {\n  if (!host || typeof (host as HTMLElement).getAnimations !== \"function\")\n    return;\n  try {\n    for (const anim of (host as HTMLElement).getAnimations({\n      subtree: true,\n    })) {\n      try {\n        anim.currentTime = offsetMs;\n        if (hold) anim.pause();\n        else anim.play();\n      } catch {\n        // Individual animations can be in non-seekable states; skip.\n      }\n    }\n  } catch {\n    // getAnimations unsupported — seek still lands scene-accurately.\n  }\n}\n\nexport function Motion({\n  view = \"play\",\n  aspect = \"auto\",\n  stage = DEFAULT_STAGE,\n  backdrop,\n  autoplay = true,\n  loop = false,\n  controls = true,\n  className,\n  style,\n  children,\n}: MotionProps) {\n  const reduced = useReducedMotion();\n  const kids = React.Children.toArray(children);\n  const scenes = kids.filter(isMotionScene);\n  const overlays = kids.filter(isOverlayElement);\n  const count = scenes.length;\n  const ratio = aspect !== \"auto\" ? parseAspect(aspect) : null;\n  const cardAspect = ratio ? aspect : \"16 / 9\";\n  // Vertical formats want narrower strip cards.\n  const cardWidth =\n    ratio && ratio < 1 ? \"clamp(150px, 17%, 250px)\" : \"clamp(260px, 30%, 440px)\";\n\n  const [idx, setIdx] = React.useState(0);\n  const [paused, setPaused] = React.useState(!autoplay);\n  const [done, setDone] = React.useState(false);\n  // Remount the active scene per activation so its clocks start fresh.\n  const [runId, setRunId] = React.useState(0);\n  // Host-driven view override (the dock's Film/Arrange toggle posts\n  // \"set-view\" over the control channel) — beats the `view` prop without\n  // a source mutation. Reduced motion still forces the strip.\n  const [viewOverride, setViewOverride] = React.useState<\n    \"play\" | \"strip\" | null\n  >(null);\n  const effectiveView = viewOverride ?? view;\n  // Export mode (control: {action:\"export-mode\", enabled}) — hides the\n  // transport chrome from the recording and shows the minimal corner\n  // watermark (AI-generated-content marking + brand provenance).\n  const [exportMode, setExportMode] = React.useState(false);\n\n  // ── THE CLOCK ──\n  // The schedule: per-scene durations computed from the element tree,\n  // cumulative starts, the film's total.\n  const schedule = React.useMemo(() => {\n    const durations = scenes.map((s) =>\n      computeSceneDurationMs(s as React.ReactElement<MotionSceneProps>),\n    );\n    const starts: number[] = [];\n    let t = 0;\n    for (const d of durations) {\n      starts.push(t);\n      t += d;\n    }\n    return { durations, starts, totalMs: Math.max(t, 1) };\n  }, [scenes]);\n\n  const timeRef = React.useRef(0);\n  const filmRef = React.useRef<HTMLDivElement>(null);\n  const idxRef = React.useRef(0);\n  idxRef.current = idx;\n\n  const sceneAtTime = React.useCallback(\n    (ms: number) => {\n      const { starts, durations } = schedule;\n      for (let i = starts.length - 1; i >= 0; i--) {\n        if (ms >= starts[i]) return Math.min(i, starts.length - 1);\n      }\n      return 0;\n      void durations;\n    },\n    [schedule],\n  );\n\n  /** The active scene's DOM node (outgoing overlay renders first, so\n   *  the active scene is always the LAST motion-scene in the film). */\n  const activeSceneEl = React.useCallback((): Element | null => {\n    const list = filmRef.current?.querySelectorAll(\n      '[data-gds-part=\"motion-scene\"]',\n    );\n    return list && list.length > 0 ? list[list.length - 1] : null;\n  }, []);\n\n  /** Set the master time. The single entry point for scrub, scene\n   *  jumps, restarts, and restore — playback state is untouched.\n   *  FAST PATH: a seek within the current scene skips React entirely\n   *  (no remount) and just retargets the live animations — this is what\n   *  makes drag-scrubbing smooth. */\n  const seekMs = React.useCallback(\n    (ms: number, opts?: { resume?: boolean }) => {\n      const t = Math.max(0, Math.min(ms, schedule.totalMs - 1));\n      timeRef.current = t;\n      setDone(false);\n      if (opts?.resume) setPaused(false);\n      const fastTarget = sceneAtTime(t);\n      if (fastTarget === idxRef.current && !opts?.resume) {\n        const offset = t - schedule.starts[fastTarget];\n        syncSubtreeAnimations(\n          activeSceneEl(),\n          offset,\n          pausedNowRef.current,\n        );\n        try {\n          window.parent?.postMessage(\n            {\n              type: \"grade:motion-time\",\n              timeMs: Math.round(t),\n              totalMs: schedule.totalMs,\n              durations: schedule.durations,\n            },\n            \"*\",\n          );\n        } catch {\n          /* no host */\n        }\n        return;\n      }\n      // Echo the new position immediately — the dock's playhead must\n      // track a paused scrub, not just the playing tick loop.\n      try {\n        window.parent?.postMessage(\n          {\n            type: \"grade:motion-time\",\n            timeMs: Math.round(t),\n            totalMs: schedule.totalMs,\n            durations: schedule.durations,\n          },\n          \"*\",\n        );\n      } catch {\n        /* no host */\n      }\n      // SLOW PATH (scene boundary crossed): remount the scene so its\n      // animations restart at zero, then puppet them to the in-scene\n      // offset on the next frames (WAAPI).\n      const target = fastTarget;\n      setIdx(target);\n      setRunId((r) => r + 1);\n      const offset = t - schedule.starts[target];\n      const hold = !(opts?.resume) && pausedNowRef.current;\n      requestAnimationFrame(() =>\n        requestAnimationFrame(() => {\n          syncSubtreeAnimations(activeSceneEl(), offset, hold);\n        }),\n      );\n    },\n    [schedule, sceneAtTime, activeSceneEl],\n  );\n  const pausedNowRef = React.useRef(paused);\n  pausedNowRef.current = paused;\n\n  // The tick: one rAF loop advances timeMs while playing; scene index is\n  // a lookup; the end is a comparison. Broadcasts ride the same loop\n  // (throttled) so the dock's playhead is the SAME number.\n  // The tick reads the schedule through a REF, never a closure. Under\n  // heavy load (export recording, shader compiles) effect teardown can\n  // lag — a tick whose closure held a STALE schedule (e.g. totalMs from a\n  // partial render) would clamp/end the clock at that old total while the\n  // fresh loop pushed forward: the clock sawed back and forth and the film\n  // sat \"stuck\" flickering at a boundary. The ref makes every loop read\n  // the CURRENT schedule on every frame, so a stale loop is harmless.\n  const scheduleRef = React.useRef(schedule);\n  scheduleRef.current = schedule;\n  React.useEffect(() => {\n    if (paused || done || reduced || effectiveView !== \"play\" || count === 0)\n      return;\n    let raf = 0;\n    let last = performance.now();\n    let lastPost = 0;\n    const tick = (now: number) => {\n      const sched = scheduleRef.current;\n      // Clamp dt: a blocked main thread (shader compile, encoder) must\n      // not teleport the clock — the film loses a beat, not its place.\n      const dt = Math.min(now - last, 120);\n      last = now;\n      timeRef.current += dt;\n      if (timeRef.current >= sched.totalMs) {\n        if (loop) {\n          timeRef.current = 0;\n          setIdx(0);\n          setRunId((r) => r + 1);\n        } else {\n          timeRef.current = sched.totalMs;\n          setDone(true);\n          setPaused(true);\n          return;\n        }\n      } else {\n        const { starts } = sched;\n        let target = 0;\n        for (let i = starts.length - 1; i >= 0; i--) {\n          if (timeRef.current >= starts[i]) {\n            target = i;\n            break;\n          }\n        }\n        if (target !== idxRef.current) {\n          setIdx(target);\n          setRunId((r) => r + 1);\n        }\n      }\n      if (now - lastPost > 150) {\n        lastPost = now;\n        try {\n          window.parent?.postMessage(\n            {\n              type: \"grade:motion-time\",\n              timeMs: Math.round(timeRef.current),\n              totalMs: sched.totalMs,\n              durations: sched.durations,\n            },\n            \"*\",\n          );\n        } catch {\n          /* no host */\n        }\n      }\n      raf = requestAnimationFrame(tick);\n    };\n    raf = requestAnimationFrame(tick);\n    return () => cancelAnimationFrame(raf);\n  }, [paused, done, reduced, effectiveView, count, loop]);\n\n  // Pause/resume freezes EVERYTHING in the active scene — including\n  // author-written CSS keyframes — via the WAAPI puppet.\n  React.useEffect(() => {\n    if (reduced || effectiveView !== \"play\") return;\n    const scenesInDom = filmRef.current?.querySelectorAll(\n      '[data-gds-part=\"motion-scene\"]',\n    );\n    const activeEl = scenesInDom?.[scenesInDom.length - 1] ?? null;\n    if (!activeEl || typeof (activeEl as HTMLElement).getAnimations !== \"function\")\n      return;\n    try {\n      for (const anim of (activeEl as HTMLElement).getAnimations({ subtree: true })) {\n        try {\n          if (paused) anim.pause();\n          else anim.play();\n        } catch {\n          /* skip */\n        }\n      }\n    } catch {\n      /* unsupported */\n    }\n  }, [paused, reduced, effectiveView, idx, runId]);\n  // ── Transition overlap ──\n  // The OUTGOING scene stays mounted as a static layer UNDER the incoming\n  // one for the incoming scene's transition window — so a slide reveals\n  // the previous scene, a wipe cuts through it, a fade dissolves over it,\n  // instead of flashing the bare stage. Cleared on a timer.\n  const [outgoing, setOutgoing] = React.useState<number | null>(null);\n  const prevIdxRef = React.useRef<number | null>(null);\n  React.useEffect(() => {\n    const prev = prevIdxRef.current;\n    prevIdxRef.current = idx;\n    if (prev === null || prev === idx) return;\n    const incoming = scenes[idx];\n    if (!incoming) return;\n    const t = (incoming.props.transition ?? \"fade\") as MotionSceneTransition;\n    const overlapMs =\n      incoming.props.transitionMs ?? SCENE_TRANSITION_DEFAULT_MS[t] ?? 0;\n    // No overlap while PAUSED (i.e. while scrubbing): boundary crossings\n    // should be clean cuts, not flashes of the previous scene.\n    if (overlapMs <= 0 || pausedNowRef.current) {\n      setOutgoing(null);\n      return;\n    }\n    setOutgoing(prev);\n    const timer = setTimeout(() => setOutgoing(null), overlapMs + 60);\n    return () => clearTimeout(timer);\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [idx, runId]);\n  // Transport jumps: a dot/restart is \"play from the start of scene i\" —\n  // a seek that also resumes.\n  const goTo = React.useCallback(\n    (i: number) => {\n      seekMs(schedule.starts[Math.max(0, Math.min(i, count - 1))] ?? 0, {\n        resume: true,\n      });\n    },\n    [seekMs, schedule, count],\n  );\n  // Skip (used by the scene error boundary): jump past the broken scene.\n  const advance = React.useCallback(() => {\n    const next = idxRef.current + 1;\n    if (next < count) {\n      seekMs(schedule.starts[next], { resume: true });\n    } else if (loop && count > 0) {\n      seekMs(0, { resume: true });\n    } else {\n      setDone(true);\n      setPaused(true);\n    }\n  }, [count, loop, seekMs, schedule]);\n\n  // ── External control + state broadcast (the scrub channel) ──\n  // The component itself is the protocol handler, so it works in any\n  // host iframe (Fast Frame AND Sandpack) with zero host wiring:\n  //   parent → iframe  { type: \"grade:motion-control\", scene? , action? }\n  //   iframe → parent  { type: \"grade:motion-state\", scene, paused, done, count }\n  // Scene-level seek today (jump to scene i); intra-scene time scrub\n  // arrives with the seekable-clock refactor (STUDIO-DIRECTOR, D4/M2).\n  const isPlay = effectiveView === \"play\" && !reduced;\n  React.useEffect(() => {\n    if (reduced || typeof window === \"undefined\") return;\n    const onMsg = (e: MessageEvent) => {\n      const d = e.data as\n        | {\n            type?: string;\n            action?: string;\n            scene?: number;\n            ms?: number;\n            view?: string;\n          }\n        | null;\n      if (!d || d.type !== \"grade:motion-control\") return;\n      if (d.action === \"set-view\") {\n        if (d.view === \"play\" || d.view === \"strip\") setViewOverride(d.view);\n        return;\n      }\n      if (d.action === \"export-mode\") {\n        setExportMode(\n          !!(d as { enabled?: boolean }).enabled,\n        );\n        return;\n      }\n      if (d.action === \"seek\" && typeof d.ms === \"number\") {\n        // THE scrub: set the master clock. Playback state untouched —\n        // a paused film stays paused (frozen mid-frame via WAAPI).\n        setViewOverride(\"play\");\n        seekMs(d.ms);\n        return;\n      }\n      if (typeof d.scene === \"number\") {\n        // Editor scene-jump: seek to the scene's start, keep pause state.\n        setViewOverride(\"play\");\n        seekMs(\n          schedule.starts[\n            Math.max(0, Math.min(count - 1, Math.round(d.scene)))\n          ] ?? 0,\n        );\n      } else if (d.action === \"pause\") {\n        setPaused(true);\n      } else if (d.action === \"play\") {\n        setViewOverride(\"play\");\n        setDone(false);\n        setPaused(false);\n      } else if (d.action === \"restart\") {\n        setViewOverride(\"play\");\n        goTo(0);\n      }\n    };\n    window.addEventListener(\"message\", onMsg);\n    return () => window.removeEventListener(\"message\", onMsg);\n  }, [reduced, goTo, count, seekMs, schedule]);\n  // ── DETERMINISTIC RENDER KERNEL (Playwright export, D7 v2) ──\n  //\n  // Real-time capture can never be smooth — a slow shader frame drops a\n  // video frame. The render pipeline instead STEPS the film: seek to an\n  // exact frame time, wait for it to fully paint (however long that\n  // takes), screenshot, advance. Output is locked to a perfect fps no\n  // matter how heavy the scene.\n  //\n  // We expose that contract on `window.__gradeMotion` so a headless\n  // driver (scripts/render-motion.mjs) can: read meta (totalMs), then\n  // call `renderFrame(ms)` which seeks + resolves once the frame is\n  // committed (double-rAF = layout + paint flushed). The film must be\n  // paused for this — the kernel forces it.\n  const seekMsRef = React.useRef(seekMs);\n  seekMsRef.current = seekMs;\n  React.useEffect(() => {\n    if (typeof window === \"undefined\") return;\n    const w = window as unknown as {\n      __gradeMotion?: {\n        ready: boolean;\n        meta: () => { totalMs: number; durations: number[]; count: number };\n        renderFrame: (ms: number) => Promise<void>;\n        enterRenderMode: () => void;\n      };\n    };\n    w.__gradeMotion = {\n      ready: true,\n      meta: () => ({\n        totalMs: scheduleRef.current.totalMs,\n        durations: scheduleRef.current.durations,\n        count,\n      }),\n      enterRenderMode: () => {\n        // Freeze the live clock and hide transport; show the watermark\n        // exactly as the recorded film should look.\n        setPaused(true);\n        setViewOverride(\"play\");\n        setExportMode(true);\n      },\n      renderFrame: (ms: number) =>\n        new Promise<void>((resolve) => {\n          setPaused(true);\n          // seekMs FAST-PATHs within a scene and remounts at boundaries;\n          // either way the WAAPI puppet lands the exact offset. Wait two\n          // frames so React commit + browser paint are flushed before the\n          // driver screenshots.\n          seekMsRef.current(Math.max(0, ms));\n          let done = false;\n          const fin = () => {\n            if (done) return;\n            done = true;\n            resolve();\n          };\n          requestAnimationFrame(() => requestAnimationFrame(fin));\n          // SAFETY VALVE: if rAF is starved (a heavy shader stalling\n          // SwiftShader during headless render), the double-rAF above may\n          // never fire and the whole render would hang on this frame. A\n          // wall-clock fallback guarantees forward progress — the worst\n          // case is one slightly-less-settled frame, not a dead render.\n          setTimeout(fin, 4000);\n        }),\n    };\n    return () => {\n      delete (window as unknown as { __gradeMotion?: unknown }).__gradeMotion;\n    };\n  }, [count]);\n\n  // Spacebar = play/pause, the universal transport key. Guarded so\n  // typing in any input / textarea / contenteditable (a live composer\n  // in a scene!) never toggles playback.\n  React.useEffect(() => {\n    if (reduced || typeof window === \"undefined\") return;\n    const onKey = (e: KeyboardEvent) => {\n      if (e.code !== \"Space\") return;\n      const t = e.target as HTMLElement | null;\n      if (\n        t &&\n        (t.tagName === \"INPUT\" ||\n          t.tagName === \"TEXTAREA\" ||\n          t.tagName === \"BUTTON\" ||\n          t.isContentEditable)\n      )\n        return;\n      e.preventDefault();\n      setViewOverride(\"play\");\n      setDone(false);\n      setPaused((p) => !p);\n    };\n    window.addEventListener(\"keydown\", onKey);\n    return () => window.removeEventListener(\"keydown\", onKey);\n  }, [reduced]);\n\n  React.useEffect(() => {\n    if (reduced || typeof window === \"undefined\") return;\n    try {\n      window.parent?.postMessage(\n        {\n          type: \"grade:motion-state\",\n          scene: idx,\n          paused,\n          done,\n          count,\n          view: effectiveView,\n        },\n        \"*\",\n      );\n    } catch {\n      // Cross-origin parent that rejects the message — fine, no dock there.\n    }\n  }, [reduced, idx, paused, done, count, effectiveView]);\n\n  // Reduced motion (or strip view): the arrangement, nothing moves.\n  // TEASER CAP: when we land here via reduced/motion-off (grid tiles,\n  // posters) rather than an explicit strip request, render only the\n  // first two scenes + a \"+N scenes\" chip — a tile is a teaser, and\n  // mounting every scene's full screen copies makes tiles meaty.\n  // An explicit Arrange view (view prop or host override) stays complete.\n  const explicitStrip = view === \"strip\" || viewOverride === \"strip\";\n  if (effectiveView === \"strip\" || reduced) {\n    const TEASER = 2;\n    const teaser = !explicitStrip && scenes.length > TEASER;\n    const shown = teaser ? scenes.slice(0, TEASER) : scenes;\n    const hidden = scenes.length - shown.length;\n    return (\n      <div\n        data-gds-part=\"motion\"\n        className={cn(\"gds-motion\", className)}\n        style={{\n          position: \"absolute\",\n          inset: 0,\n          overflow: \"hidden\",\n          background: stage,\n          ...style,\n        }}\n      >\n        {backdrop && (\n          <div aria-hidden style={{ position: \"absolute\", inset: 0, pointerEvents: \"none\" }}>\n            {backdrop}\n          </div>\n        )}\n        <div\n          style={{\n            position: \"absolute\",\n            inset: 0,\n            display: \"flex\",\n            alignItems: \"center\",\n            gap: 28,\n            padding: \"0 48px\",\n            overflowX: \"auto\",\n          }}\n        >\n          {shown.map((scene, i) => (\n            <figure\n              key={i}\n              style={{ margin: 0, flex: \"0 0 auto\", width: cardWidth }}\n            >\n              <figcaption\n                style={{\n                  marginBottom: 8,\n                  fontSize: 12,\n                  fontWeight: 500,\n                  color: \"rgba(255,255,255,0.66)\",\n                }}\n              >\n                {scene.props.label ?? `Scene ${i + 1}`}\n              </figcaption>\n              <div\n                style={{\n                  position: \"relative\",\n                  aspectRatio: cardAspect,\n                  borderRadius: 10,\n                  overflow: \"hidden\",\n                  background: scene.props.fill ?? \"rgba(127,127,127,0.10)\",\n                  border: \"1px solid rgba(127,127,127,0.22)\",\n                  boxShadow: \"0 10px 34px rgba(0,0,0,0.28)\",\n                }}\n              >\n                <SceneBoundary label={scene.props.label}>\n                  <MotionSceneImpl\n                    {...scene.props}\n                    // The card already paints the fill; don't double-paint.\n                    fill={undefined}\n                    internal={{\n                      active: false,\n                      paused: true,\n                      mode: \"strip\",\n                      onSceneEnd: () => {},\n                    }}\n                  />\n                </SceneBoundary>\n              </div>\n            </figure>\n          ))}\n\n          {/* The teaser's \"+N scenes\" chip — same footprint, no content\n              mounted, so the tile stays light. */}\n          {teaser && hidden > 0 && (\n            <figure style={{ margin: 0, flex: \"0 0 auto\", width: cardWidth }}>\n              <figcaption\n                style={{\n                  marginBottom: 8,\n                  fontSize: 12,\n                  fontWeight: 500,\n                  color: \"rgba(255,255,255,0.66)\",\n                }}\n              >\n                …\n              </figcaption>\n              <div\n                style={{\n                  aspectRatio: cardAspect,\n                  borderRadius: 10,\n                  display: \"grid\",\n                  placeItems: \"center\",\n                  border: \"1px dashed rgba(127,127,127,0.4)\",\n                  color: \"rgba(255,255,255,0.55)\",\n                  fontSize: 14,\n                  fontWeight: 600,\n                }}\n              >\n                +{hidden} scene{hidden === 1 ? \"\" : \"s\"}\n              </div>\n            </figure>\n          )}\n        </div>\n      </div>\n    );\n  }\n\n  const active = scenes[Math.min(idx, Math.max(0, count - 1))];\n\n  // The film frame: stage + backdrop + active scene + transport. With a\n  // fixed aspect it letterboxes into the container (9/16 = TikTok/Reels);\n  // with \"auto\" it fills responsively.\n  const film = (\n    <div\n      ref={filmRef}\n      style={{\n        position: \"absolute\",\n        inset: 0,\n        overflow: \"hidden\",\n        background: stage,\n      }}\n    >\n      {backdrop && (\n        <div aria-hidden style={{ position: \"absolute\", inset: 0, pointerEvents: \"none\" }}>\n          {backdrop}\n        </div>\n      )}\n\n      {/* The outgoing scene, frozen UNDER the incoming one during the\n          transition window (active=false → no clocks, posters not\n          players). Rendered first in DOM = beneath. */}\n      {outgoing !== null && outgoing !== idx && scenes[outgoing] && (\n        <SceneBoundary key={`out:${outgoing}`} label={scenes[outgoing].props.label}>\n          <MotionSceneImpl\n            {...scenes[outgoing].props}\n            transition=\"none\"\n            internal={{\n              active: false,\n              paused: true,\n              mode: \"play\",\n              onSceneEnd: () => {},\n            }}\n          />\n        </SceneBoundary>\n      )}\n\n      {active && (\n        <SceneBoundary\n          key={`${idx}:${runId}`}\n          label={active.props.label}\n          onSkip={count > 1 ? advance : undefined}\n        >\n          <MotionSceneImpl\n            {...active.props}\n            // THE CLOCK owns scene advancement now — the per-scene\n            // completion registry still runs (it's harmless and keeps\n            // standalone scenes working) but its end signal is inert\n            // inside a film.\n            internal={{ active: true, paused, mode: \"play\", onSceneEnd: () => {} }}\n          />\n        </SceneBoundary>\n      )}\n\n      {/* The broadcast layer — film-level overlays (network bug, live\n          clock, ticker, persistent video). A second timeline: each\n          overlay shows for its fromScene..toScene range (default: the\n          whole film). Rendered above scenes, below the transport. */}\n      {overlays.filter((o) => {\n        const from = o.props.fromScene ?? 0;\n        const to = o.props.toScene ?? Infinity;\n        return idx >= from && idx <= to;\n      })}\n\n      {/* Export watermark — the minimal corner mark: brand provenance +\n          honest AI-generated-content marking on every exported video.\n          Bottom-left (the transport owns bottom-right). Default artwork\n          is the Grade mark; the branding profile swaps it later. */}\n      {exportMode && (\n        <div\n          aria-hidden\n          style={{\n            position: \"absolute\",\n            left: 14,\n            bottom: 14,\n            zIndex: 30,\n            width: 16,\n            height: 16,\n            opacity: 0.55,\n            color: \"#fff\",\n            mixBlendMode: \"difference\",\n            pointerEvents: \"none\",\n          }}\n        >\n          <svg viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n            <path\n              d=\"M28 0L32 4V10L26 4H6L4 6V26L6 28H16L26 18V24L18 32H4L0 28V4L4 0H28ZM32 32H28V18H16V14H32V32Z\"\n              fill=\"currentColor\"\n            />\n          </svg>\n        </div>\n      )}\n\n      {/* Transport — COLLAPSED to a lone play/pause button; restart + the\n          scene dots reveal on hover/focus of the pill (they eat stage\n          space and a film should look like a film at rest). Hidden in\n          export mode so chrome never lands in the recording. */}\n      {controls && count > 0 && !exportMode && (\n        <div\n          role=\"group\"\n          aria-label=\"Motion playback controls\"\n          className=\"gds-motion-transport\"\n          style={{\n            position: \"absolute\",\n            right: 16,\n            bottom: 16,\n            display: \"flex\",\n            gap: 4,\n            alignItems: \"center\",\n            padding: \"4px 6px\",\n            borderRadius: 999,\n            background: \"rgba(15,15,17,0.55)\",\n            backdropFilter: \"blur(10px)\",\n            boxShadow: \"0 6px 22px rgba(0,0,0,0.25)\",\n          }}\n        >\n          <style>{`\n            .gds-motion-transport [data-gds-transport-extras] {\n              display: flex; align-items: center; gap: 4px;\n              max-width: 0; opacity: 0; overflow: hidden;\n              transition: max-width 240ms cubic-bezier(0.22, 1, 0.36, 1), opacity 180ms ease;\n            }\n            .gds-motion-transport:hover [data-gds-transport-extras],\n            .gds-motion-transport:focus-within [data-gds-transport-extras] {\n              max-width: 360px; opacity: 1;\n            }\n          `}</style>\n          <button\n            type=\"button\"\n            onClick={() => (done ? goTo(0) : setPaused((p) => !p))}\n            aria-label={done ? \"Replay\" : paused ? \"Play\" : \"Pause\"}\n            style={btn}\n          >\n            {done ? <RestartIcon /> : paused ? <PlayIcon /> : <PauseIcon />}\n          </button>\n          <div data-gds-transport-extras>\n            <button type=\"button\" onClick={() => goTo(0)} aria-label=\"Restart\" style={btn}>\n              <RestartIcon />\n            </button>\n            <div style={{ display: \"flex\", gap: 5, padding: \"0 6px\" }} aria-hidden>\n              {scenes.map((s, i) => (\n                <button\n                  key={i}\n                  type=\"button\"\n                  onClick={() => goTo(i)}\n                  aria-label={`Go to ${s.props.label ?? `scene ${i + 1}`}`}\n                  tabIndex={-1}\n                  style={{\n                    ...btn,\n                    width: 14,\n                    height: 14,\n                  }}\n                >\n                  <span\n                    style={{\n                      width: 6,\n                      height: 6,\n                      borderRadius: 999,\n                      background:\n                        i === idx ? \"#fff\" : \"rgba(255,255,255,0.35)\",\n                      transition: \"background 200ms ease\",\n                    }}\n                  />\n                </button>\n              ))}\n            </div>\n          </div>\n        </div>\n      )}\n\n      {/* Ended — centred replay, like a finished video. */}\n      {done && (\n        <button\n          type=\"button\"\n          onClick={() => goTo(0)}\n          aria-label=\"Replay\"\n          style={{\n            position: \"absolute\",\n            inset: 0,\n            margin: \"auto\",\n            width: 64,\n            height: 64,\n            display: \"grid\",\n            placeItems: \"center\",\n            borderRadius: 999,\n            border: \"none\",\n            color: \"#fff\",\n            background: \"rgba(15,15,17,0.55)\",\n            backdropFilter: \"blur(10px)\",\n            boxShadow: \"0 8px 30px rgba(0,0,0,0.35)\",\n            cursor: \"pointer\",\n          }}\n        >\n          <svg\n            width=\"26\"\n            height=\"26\"\n            viewBox=\"0 0 24 24\"\n            fill=\"none\"\n            stroke=\"currentColor\"\n            strokeWidth=\"2\"\n            strokeLinecap=\"round\"\n            strokeLinejoin=\"round\"\n            aria-hidden\n          >\n            <path d=\"M3 12a9 9 0 1 0 3-6.7L3 8\" />\n            <path d=\"M3 3v5h5\" />\n          </svg>\n        </button>\n      )}\n    </div>\n  );\n\n  return (\n    <div\n      data-gds-part=\"motion\"\n      className={cn(\"gds-motion\", className)}\n      style={{\n        position: \"absolute\",\n        inset: 0,\n        overflow: \"hidden\",\n        // Letterbox: TRANSPARENT in the editor (the bars blend into the\n        // host surface and the film just floats centered — visible black\n        // bars read as a defect); true black only in export mode, where\n        // bars are video-correct.\n        background: ratio ? (exportMode ? \"#000\" : \"transparent\") : stage,\n        ...style,\n      }}\n    >\n      {ratio ? <FitBox ratio={ratio}>{film}</FitBox> : film}\n    </div>\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  GlitchMode,\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  // Off by default. GlitchEffect self-triggers in SPORADIC mode regardless\n  // of strength, so we kill it two ways: DISABLED mode + zero blend opacity\n  // (it then contributes nothing), the same pattern noise/scanlines use.\n  glitch.mode = GlitchMode.DISABLED;\n  glitch.blendMode.opacity.value = 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  //\n  // IMPORTANT: we NEVER disable a pass. The composer renders the literal\n  // last pass to screen, so a disabled pass can blank the whole output\n  // (that was the \"nothing renders unless glitch>0\" bug). Every pass stays\n  // enabled; effects are turned off by zeroing their blend (opacity / mode\n  // / offset), so rendering never depends on which effects are active.\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    const glitchMax = e.glitch?.strength?.[1] ?? 0;\n    if (e.glitch && glitchMax > 0) {\n      glitch.mode = GlitchMode.SPORADIC;\n      glitch.blendMode.opacity.value = 1;\n      glitch.minStrength = e.glitch.strength?.[0] ?? 0;\n      glitch.maxStrength = glitchMax;\n    } else {\n      // Off — never disable the pass (that can blank the composer's\n      // screen output). DISABLED mode stops the self-trigger and zero\n      // blend opacity makes it contribute nothing.\n      glitch.mode = GlitchMode.DISABLED;\n      glitch.blendMode.opacity.value = 0;\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 * 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\";\nimport type { ControlSpec } from \"./schema\";\n\n/** Uniform name for a contract param key: `coolTone` → `uCoolTone`. The\n *  shader author references these directly (e.g. `uRefraction`, `uRamp`). */\nexport function paramUniformName(key: string): string {\n  return \"u\" + key.charAt(0).toUpperCase() + key.slice(1);\n}\n\n/** Max swatches a colour-list param declares as a fixed-size GLSL array. */\nconst COLOR_LIST_CAP = 8;\n\n/** GLSL uniform declarations generated from a control contract. Appended to\n *  FRAGMENT_HEADER so the author can read each param as a typed uniform:\n *    slider / toggle / select / segmented → `uniform float u<Key>;`\n *    color                                → `uniform vec3  u<Key>;`\n *    colorList                            → `uniform vec3  u<Key>[N];`\n *                                            `uniform int   u<Key>Count;`\n */\nfunction paramUniformDeclarations(controls: readonly ControlSpec[]): string {\n  const lines: string[] = [];\n  for (const c of controls) {\n    if (c.type === \"divider\") continue;\n    const u = paramUniformName(c.key);\n    if (c.type === \"color\") lines.push(`uniform vec3 ${u};`);\n    else if (c.type === \"colorList\") {\n      const n = Math.min(c.max ?? c.default.length, COLOR_LIST_CAP);\n      lines.push(`uniform vec3 ${u}[${n}];`, `uniform int ${u}Count;`);\n    } else {\n      // slider / toggle / select / segmented all ride a float uniform.\n      lines.push(`uniform float ${u};`);\n    }\n  }\n  return lines.join(\"\\n  \");\n}\n\n/** Safe THREE.Color from a string — falls back to mid-grey on a value\n *  THREE can't parse (e.g. an unresolved oklch()/var()). Hosts resolve\n *  colours to rgb() before calling setParams, so this is just a guard. */\nfunction safeColor(value: string): THREE.Color {\n  const c = new THREE.Color();\n  try {\n    c.set(value);\n  } catch {\n    c.setRGB(0.5, 0.5, 0.5);\n  }\n  return c;\n}\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(\n  userFragment: string,\n  /** Optional param contract — each non-divider control becomes a uniform\n   *  the shader can read (see paramUniformName) and `setParams` can drive\n   *  live without a remount. */\n  controls?: readonly ControlSpec[],\n): SceneFactory {\n  return ({ renderer, width, height, palette }) => {\n    const paramDecls = controls?.length\n      ? paramUniformDeclarations(controls)\n      : \"\";\n    const combined = `${FRAGMENT_HEADER}\\n  ${paramDecls}\\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    // Seed param uniforms from the contract defaults so the shader compiles\n    // and paints sensibly before the host pushes resolved values via\n    // setParams (which runs immediately after build).\n    if (controls?.length) {\n      for (const c of controls) {\n        if (c.type === \"divider\") continue;\n        const u = paramUniformName(c.key);\n        if (c.type === \"color\") {\n          uniforms[u] = { value: safeColor(c.default) };\n        } else if (c.type === \"colorList\") {\n          const n = Math.min(c.max ?? c.default.length, COLOR_LIST_CAP);\n          const arr = Array.from({ length: n }, (_, i) =>\n            safeColor(c.default[Math.min(i, c.default.length - 1)] ?? \"#888\"),\n          );\n          uniforms[u] = { value: arr };\n          uniforms[`${u}Count`] = { value: Math.min(c.default.length, n) };\n        } else if (c.type === \"select\" || c.type === \"segmented\") {\n          const idx = c.options.findIndex((o) => o.value === c.default);\n          uniforms[u] = { value: Math.max(0, idx) };\n        } else if (c.type === \"toggle\") {\n          uniforms[u] = { value: c.default ? 1 : 0 };\n        } else {\n          uniforms[u] = { value: c.default };\n        }\n      }\n    }\n\n    // Index the controls by key so setParams knows each param's type.\n    const controlByKey = new Map<string, ControlSpec>();\n    for (const c of controls ?? []) {\n      if (c.type !== \"divider\") controlByKey.set(c.key, c);\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      setParams: (params) => {\n        for (const [key, raw] of Object.entries(params)) {\n          const c = controlByKey.get(key);\n          if (!c) continue;\n          const u = paramUniformName(key);\n          const uni = uniforms[u];\n          if (!uni) continue;\n          if (c.type === \"color\") {\n            (uni.value as THREE.Color).set(String(raw));\n          } else if (c.type === \"colorList\") {\n            const list = Array.isArray(raw) ? (raw as string[]) : [];\n            const arr = uni.value as THREE.Color[];\n            for (let i = 0; i < arr.length; i++) {\n              const v = list[Math.min(i, list.length - 1)];\n              if (v) arr[i].set(v);\n            }\n            const countUni = uniforms[`${u}Count`];\n            if (countUni) countUni.value = Math.min(list.length, arr.length);\n          } else if (c.type === \"select\" || c.type === \"segmented\") {\n            const idx = c.options.findIndex((o) => o.value === raw);\n            uni.value = Math.max(0, idx);\n          } else if (c.type === \"toggle\") {\n            uni.value = raw ? 1 : 0;\n          } else {\n            uni.value = Number(raw);\n          }\n        }\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","/**\n * Fragment-shader presets.\n *\n * These are full-screen-quad GLSL scenes built via\n * `buildFragmentShaderScene`, so they get the standard uniform contract\n * (uTime, uResolution, uMouse, uPrimary/uSecondary/uAccent/uBackground)\n * — which means they're THEME-REACTIVE for free: ThreeScene's palette\n * observer re-resolves the CSS-var palette and pushes new colours into\n * these uniforms on theme change, no remount.\n *\n * Authoring against the palette uniforms (not hard-coded colours) is the\n * whole point — switch the page theme and every preset re-tints.\n */\n\nimport { buildFragmentShaderScene } from \"../custom-fragment\";\nimport type { ControlSpec } from \"../schema\";\n\n/** Mesh gradient — smooth moving blobs of primary/secondary/accent over\n *  the background. The \"nice mesh shader\" default. */\nexport const meshScene = buildFragmentShaderScene(/* glsl */ `\n  void main() {\n    vec2 uv = vUv;\n    float t = uTime * 0.15;\n\n    vec2 p1 = vec2(0.5 + 0.36 * sin(t * 1.1),       0.5 + 0.30 * cos(t * 0.9));\n    vec2 p2 = vec2(0.5 + 0.40 * cos(t * 0.7 + 1.0), 0.4 + 0.34 * sin(t * 1.3));\n    vec2 p3 = vec2(0.45 + 0.32 * sin(t * 0.5 + 2.0),0.6 + 0.30 * cos(t * 1.7));\n\n    float w1 = smoothstep(0.62, 0.0, distance(uv, p1));\n    float w2 = smoothstep(0.62, 0.0, distance(uv, p2));\n    float w3 = smoothstep(0.62, 0.0, distance(uv, p3));\n\n    vec3 col = uBackground;\n    col = mix(col, uPrimary,   w1);\n    col = mix(col, uSecondary, w2 * 0.9);\n    col = mix(col, uAccent,    w3 * 0.85);\n    gl_FragColor = vec4(col, 1.0);\n  }\n`);\n\n/** Undertones — original, in the soft-tonal-wash genre (low-saturation\n *  layered washes drifting very slowly), and MOUSE-REACTIVE: the field\n *  bends gently toward the cursor and a soft light follows it. Theme-\n *  reactive like every fragment preset (palette uniforms, not colours).\n *  Fine grain on top kills gradient banding. */\nexport const undertonesScene = buildFragmentShaderScene(/* glsl */ `\n  float uHash(vec2 p) {\n    return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453);\n  }\n  float uNoise(vec2 p) {\n    vec2 i = floor(p);\n    vec2 f = fract(p);\n    f = f * f * (3.0 - 2.0 * f);\n    float a = uHash(i);\n    float b = uHash(i + vec2(1.0, 0.0));\n    float c = uHash(i + vec2(0.0, 1.0));\n    float d = uHash(i + vec2(1.0, 1.0));\n    return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);\n  }\n  float uFbm(vec2 p) {\n    float v = 0.0;\n    float amp = 0.5;\n    for (int i = 0; i < 4; i++) {\n      v += amp * uNoise(p);\n      p *= 2.03;\n      amp *= 0.5;\n    }\n    return v;\n  }\n  void main() {\n    vec2 uv = vUv;\n    float t = uTime * 0.06; // undertones move like weather, not water\n\n    // The field bends gently toward the cursor…\n    vec2 toMouse = uv - uMouse;\n    float md = length(toMouse);\n    vec2 warp = normalize(toMouse + 1e-4) * 0.12 * exp(-md * 2.2);\n\n    vec2 p = uv * 1.6 + warp;\n    float n1 = uFbm(p + vec2(t, -t * 0.6));\n    float n2 = uFbm(p * 1.4 - vec2(t * 0.8, t * 0.4) + 3.7);\n    float diag = uv.x * 0.55 + uv.y * 0.45;\n\n    // Washes, not blobs — but the brand pops carry enough weight to read.\n    vec3 col = uBackground;\n    col = mix(col, uPrimary,   smoothstep(0.18, 0.92, n1) * 0.62);\n    col = mix(col, uSecondary, smoothstep(0.28, 1.00, n2) * 0.50);\n    col = mix(col, uAccent,    smoothstep(0.45, 1.00, n1 * n2 + diag * 0.2) * 0.38);\n\n    // …and a soft light follows the cursor, in brand.\n    col += (uPrimary - uBackground) * 0.22 * exp(-md * 3.0);\n\n    // Fine grain to kill banding.\n    col += (uNoise(uv * 900.0) - 0.5) * 0.012;\n\n    gl_FragColor = vec4(col, 1.0);\n  }\n`);\n\n/** Flowing dots — original, in the dot-matrix flow-field genre: a grid\n *  of dots whose size and tint ride a slowly flowing noise field, so\n *  waves of dots swell and fade as the field passes through. Mouse-\n *  reactive: dots swell and brighten near the cursor. */\nexport const flowingDotsScene = buildFragmentShaderScene(/* glsl */ `\n  float dHash(vec2 p) {\n    return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453);\n  }\n  float dNoise(vec2 p) {\n    vec2 i = floor(p);\n    vec2 f = fract(p);\n    f = f * f * (3.0 - 2.0 * f);\n    float a = dHash(i);\n    float b = dHash(i + vec2(1.0, 0.0));\n    float c = dHash(i + vec2(0.0, 1.0));\n    float d = dHash(i + vec2(1.0, 1.0));\n    return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);\n  }\n  void main() {\n    float aspect = uResolution.x / max(uResolution.y, 1.0);\n    vec2 uv = vec2(vUv.x * aspect, vUv.y);\n    float t = uTime * 0.25;\n\n    const float N = 26.0; // dots per unit height\n    vec2 cell = fract(uv * N) - 0.5;\n    vec2 id = floor(uv * N) / N;\n\n    // The flow field — each dot samples it at its own cell.\n    float flow = dNoise(id * 2.2 + vec2(t * 0.6, -t * 0.35));\n    float flow2 = dNoise(id * 3.6 - vec2(t * 0.4, t * 0.5) + 7.3);\n\n    // Mouse swell — cursor distance in the same aspect-corrected space.\n    vec2 m = vec2(uMouse.x * aspect, uMouse.y);\n    float md = length(id + 0.5 / N - m);\n    float swell = exp(-md * 5.0);\n\n    // Dot radius rides the field + the cursor.\n    float r = 0.08 + 0.30 * smoothstep(0.35, 0.95, flow) + 0.22 * swell;\n    float d = length(cell);\n    float dot_ = smoothstep(r, r - 0.06, d);\n\n    vec3 dotCol = mix(uPrimary, uAccent, smoothstep(0.3, 0.9, flow2));\n    dotCol = mix(dotCol, uSecondary, swell * 0.6);\n\n    // Dots read at near-full brand saturation (the grid was too dim).\n    vec3 col = mix(uBackground, dotCol, dot_ * (0.78 + 0.22 * flow));\n    gl_FragColor = vec4(col, 1.0);\n  }\n`);\n\n/** Grain — a barely-moving tonal wash under HEAVY animated film grain.\n *  The wash is quiet on purpose (the grain is the texture); brand colours\n *  arrive as broad diagonal tints. Reads beautifully in light AND dark\n *  tones — the editorial/print-feeling backdrop. */\nexport const grainScene = buildFragmentShaderScene(/* glsl */ `\n  float gHash(vec2 p) {\n    return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453);\n  }\n  float gNoise(vec2 p) {\n    vec2 i = floor(p);\n    vec2 f = fract(p);\n    f = f * f * (3.0 - 2.0 * f);\n    float a = gHash(i);\n    float b = gHash(i + vec2(1.0, 0.0));\n    float c = gHash(i + vec2(0.0, 1.0));\n    float d = gHash(i + vec2(1.0, 1.0));\n    return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);\n  }\n  void main() {\n    vec2 uv = vUv;\n    float t = uTime * 0.04; // glacial — the grain carries the motion\n\n    // Broad diagonal wash — two slow tints crossing the frame.\n    float w1 = gNoise(uv * 1.2 + vec2(t, -t * 0.7));\n    float w2 = gNoise(uv * 0.9 - vec2(t * 0.6, t * 0.3) + 5.1);\n    vec3 col = uBackground;\n    col = mix(col, uPrimary, smoothstep(0.30, 1.00, w1 + (uv.x + uv.y) * 0.15) * 0.40);\n    col = mix(col, uAccent,  smoothstep(0.45, 1.00, w2) * 0.25);\n\n    // THE GRAIN — animated per-frame (time-salted hash), two scales:\n    // fine print grain + a coarser fleck that catches the eye.\n    float salt = fract(uTime * 7.0);\n    float fine   = gHash(uv * uResolution.xy * 0.9 + salt * 113.0) - 0.5;\n    float coarse = gHash(floor(uv * uResolution.xy * 0.22) + salt * 71.0) - 0.5;\n    col += fine * 0.085 + coarse * 0.045;\n\n    // Gentle vignette keeps edges from going flat.\n    float vig = smoothstep(1.25, 0.45, length(uv - 0.5) * 1.6);\n    col *= 0.92 + 0.08 * vig;\n\n    gl_FragColor = vec4(col, 1.0);\n  }\n`);\n\n/** Waves — flowing banded ribbons. */\nexport const wavesScene = buildFragmentShaderScene(/* glsl */ `\n  void main() {\n    vec2 uv = vUv;\n    float t = uTime * 0.4;\n    float band = sin(uv.x * 6.2831 + sin(uv.y * 4.0 + t) * 1.5 + t);\n    float m = 0.5 + 0.5 * band;\n    vec3 col = mix(uBackground, uPrimary, smoothstep(0.3, 0.7, m));\n    col = mix(col, uSecondary, smoothstep(0.6, 1.0, m));\n    col = mix(col, uAccent, smoothstep(0.85, 1.0, m));\n    gl_FragColor = vec4(col, 1.0);\n  }\n`);\n\n/** Glass — frosted, refractive \"studio glass\". A soft brand-tinted wash\n *  seen THROUGH a sheet of slumped glass: an fbm height-field refracts the\n *  backdrop (chromatically — the three channels sample at slightly offset\n *  positions, so bright edges fringe), anisotropic specular streaks catch\n *  a moving key light, and a faint caustic shimmer pools in the troughs.\n *  Mouse-reactive: the glass bulges toward the cursor like a lens, and the\n *  highlight tracks it. Theme-reactive like every fragment preset — the\n *  wash and the light are brand colours, never hard-coded. Fine grain on\n *  top reads as the frost and kills banding. */\nexport const glassScene = buildFragmentShaderScene(/* glsl */ `\n  float gHash(vec2 p) {\n    return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453);\n  }\n  float gNoise(vec2 p) {\n    vec2 i = floor(p);\n    vec2 f = fract(p);\n    f = f * f * (3.0 - 2.0 * f);\n    float a = gHash(i);\n    float b = gHash(i + vec2(1.0, 0.0));\n    float c = gHash(i + vec2(0.0, 1.0));\n    float d = gHash(i + vec2(1.0, 1.0));\n    return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);\n  }\n  float gFbm(vec2 p) {\n    float v = 0.0;\n    float amp = 0.5;\n    for (int i = 0; i < 5; i++) {\n      v += amp * gNoise(p);\n      p = p * 2.02 + 11.3;\n      amp *= 0.5;\n    }\n    return v;\n  }\n\n  // The backdrop seen through the glass — a slow brand-tinted wash. This is\n  // what the glass refracts, so it's sampled at the displaced coordinate.\n  vec3 backdrop(vec2 uv, float t) {\n    float w1 = gFbm(uv * 1.7 + vec2(t, -t * 0.6));\n    float w2 = gFbm(uv * 1.2 - vec2(t * 0.7, t * 0.35) + 4.2);\n    float diag = uv.x * 0.55 + uv.y * 0.45;\n    vec3 col = uBackground;\n    col = mix(col, uPrimary,   smoothstep(0.20, 0.95, w1) * 0.60);\n    col = mix(col, uSecondary, smoothstep(0.30, 1.00, w2) * 0.48);\n    col = mix(col, uAccent,    smoothstep(0.45, 1.00, w1 * w2 + diag * 0.2) * 0.40);\n    return col;\n  }\n\n  void main() {\n    float aspect = uResolution.x / max(uResolution.y, 1.0);\n    vec2 uv = vUv;\n    float t = uTime * 0.05; // slumped glass moves like weather, slowly\n\n    // Glass height-field — large slow ripples (the slump) over finer ridges.\n    vec2 hp = vec2(uv.x * aspect, uv.y);\n    float h = gFbm(hp * 2.4 + vec2(t * 1.2, -t))\n            + 0.5 * gFbm(hp * 5.5 - vec2(t * 0.6, t * 0.9) + 9.0);\n\n    // Cursor lens — the sheet bulges toward the pointer.\n    vec2 m = vec2(uMouse.x * aspect, uMouse.y);\n    vec2 toM = vec2(uv.x * aspect, uv.y) - m;\n    float md = length(toM);\n    float bulge = exp(-md * md * 6.0);\n    h += bulge * 1.1;\n\n    // Surface normal from the height-field gradient → refraction vector.\n    float e = 0.0018;\n    float hx = gFbm((hp + vec2(e, 0.0)) * 2.4 + vec2(t * 1.2, -t))\n             - gFbm((hp - vec2(e, 0.0)) * 2.4 + vec2(t * 1.2, -t));\n    float hy = gFbm((hp + vec2(0.0, e)) * 2.4 + vec2(t * 1.2, -t))\n             - gFbm((hp - vec2(0.0, e)) * 2.4 + vec2(t * 1.2, -t));\n    vec2 grad = vec2(hx, hy) / (2.0 * e);\n    vec2 refr = grad * 0.045 - normalize(toM + 1e-4) * bulge * 0.06;\n\n    // Chromatic refraction — sample the backdrop per-channel at offset\n    // coordinates so the glass fringes red↔blue at steep slopes.\n    float disp = 0.012 + bulge * 0.02;\n    vec3 col;\n    col.r = backdrop(uv + refr * (1.0 + disp), t).r;\n    col.g = backdrop(uv + refr, t).g;\n    col.b = backdrop(uv + refr * (1.0 - disp), t).b;\n\n    // Caustic shimmer — bright thin lines where the height-field folds.\n    float caustic = pow(1.0 - abs(fract(h) - 0.5) * 2.0, 8.0);\n    col += (uAccent * 0.6 + 0.4) * caustic * 0.10;\n\n    // Anisotropic specular — a soft key light streaks across the ridges and\n    // pools under the cursor. Brightens toward white, tinted by primary.\n    vec2 lightDir = normalize(vec2(0.6, 1.0));\n    float spec = pow(max(dot(normalize(grad + 1e-4), lightDir) * 0.5 + 0.5, 0.0), 6.0);\n    spec *= 0.18 + 0.5 * bulge;\n    col += mix(vec3(1.0), uPrimary, 0.35) * spec;\n\n    // Fresnel rim — edges of the sheet read brighter, the glassy lift.\n    float rim = pow(smoothstep(0.0, 1.0, length(uv - 0.5) * 1.4), 2.0);\n    col += (uPrimary - uBackground) * rim * 0.06;\n\n    // Frost — fine grain reads as the etched surface and kills banding.\n    col += (gNoise(uv * uResolution.xy * 0.8) - 0.5) * 0.022;\n\n    gl_FragColor = vec4(col, 1.0);\n  }\n`);\n\n/** Holographic — iridescent foil: a brushed anisotropic grain (a diffraction\n *  grating) running on the diagonal, with the spectrum sweeping ALONG the\n *  sheet so dense rainbow-ish bands shimmer across it. Unlike a fixed-rainbow\n *  holo, the spectrum is built by cycling the BRAND colours\n *  (secondary→primary→accent), so it's theme-reactive like every fragment\n *  preset — mirrors the cool/warm/blob colour stops of the reference. Mouse-\n *  reactive: the cursor acts as the view angle, sliding the whole spectrum\n *  the way a holographic card shifts as you tilt it. Sharp glints ride the\n *  grain peaks for the metallic-foil sparkle; fine grain reads as the foil\n *  surface and kills banding. */\nexport const holographicScene = buildFragmentShaderScene(/* glsl */ `\n  float hHash(vec2 p) {\n    return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453);\n  }\n  float hNoise(vec2 p) {\n    vec2 i = floor(p);\n    vec2 f = fract(p);\n    f = f * f * (3.0 - 2.0 * f);\n    float a = hHash(i);\n    float b = hHash(i + vec2(1.0, 0.0));\n    float c = hHash(i + vec2(0.0, 1.0));\n    float d = hHash(i + vec2(1.0, 1.0));\n    return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);\n  }\n  float hFbm(vec2 p) {\n    float v = 0.0;\n    float amp = 0.5;\n    for (int i = 0; i < 4; i++) {\n      v += amp * hNoise(p);\n      p = p * 2.03 + 7.1;\n      amp *= 0.5;\n    }\n    return v;\n  }\n  // Cyclic iridescent ramp through the brand colours — the spectrum is\n  // theme-reactive (mirrors the reference's cool/warm/blob colour stops).\n  vec3 hRamp(float t) {\n    t = fract(t) * 3.0;\n    if (t < 1.0) return mix(uSecondary, uPrimary, smoothstep(0.0, 1.0, t));\n    if (t < 2.0) return mix(uPrimary, uAccent, smoothstep(0.0, 1.0, t - 1.0));\n    return mix(uAccent, uSecondary, smoothstep(0.0, 1.0, t - 2.0));\n  }\n  void main() {\n    float aspect = uResolution.x / max(uResolution.y, 1.0);\n    vec2 uv = vec2(vUv.x * aspect, vUv.y);\n    float t = uTime * 0.05;\n\n    // Cursor = view angle: tilting the foil slides the whole spectrum.\n    vec2 m = vec2(uMouse.x * aspect, uMouse.y);\n    float view = ((uv.x - m.x) - (uv.y - m.y)) * 0.5;\n\n    // Slow flow so the sheet ripples like bent foil.\n    float flow = hFbm(uv * 1.3 + vec2(t, -t * 0.6));\n\n    // Diagonal axes — colour runs ALONG, the grain runs ACROSS.\n    float along  = (uv.x + uv.y) * 0.5 + flow * 0.30;\n    float across = (uv.x - uv.y);\n\n    // Dense anisotropic grain — the brushed-foil striping / diffraction grating.\n    float gph = across * 90.0 + flow * 7.0 + t * 2.0;\n    float grain = 0.5 + 0.5 * sin(gph);\n\n    // Diffraction: the spectrum advances with position, grain phase, flow, view.\n    float phase = along * 1.6 + grain * 0.5 + flow * 0.5 + view * 1.2 + t * 0.35;\n    vec3 col = hRamp(phase);\n\n    // Brushed anisotropy — brightness rides the grain stripes.\n    col *= 0.62 + 0.45 * grain;\n\n    // Sharp glints where stripe peaks align — the metallic-foil sparkle.\n    col += pow(grain, 14.0) * 0.28;\n\n    // Fine surface grain reads as the foil texture + kills banding.\n    col += (hNoise(uv * uResolution.xy * 0.7) - 0.5) * 0.03;\n\n    gl_FragColor = vec4(col, 1.0);\n  }\n`);\n\n// ── Standard-set presets (June 2026) ───────────────────────────────────\n// Each ships a param CONTRACT (ControlSpec[]) — colours are slot-bound so\n// they re-theme, numbers expose meaningful ranges. The contract both builds\n// the scene's uniforms (via buildFragmentShaderScene) AND drives the auto\n// tweak panel; shader-presets.ts re-exports the same arrays as preset.controls.\n\n/** Fluid — soft liquid metaballs / lava lamp. */\nexport const fluidControls: ControlSpec[] = [\n  { type: \"slider\", key: \"speed\", label: \"Speed\", min: 0, max: 3, step: 0.01, default: 1 },\n  { type: \"slider\", key: \"scale\", label: \"Scale\", min: 0.4, max: 2.5, step: 0.01, default: 1 },\n  { type: \"slider\", key: \"viscosity\", label: \"Viscosity\", min: 0, max: 1, step: 0.01, default: 0.55 },\n  { type: \"slider\", key: \"contrast\", label: \"Contrast\", min: 0, max: 1, step: 0.01, default: 0.45 },\n  { type: \"divider\", key: \"palette\", label: \"Colours\" },\n  { type: \"color\", key: \"colorA\", label: \"Liquid A\", slot: \"secondary\", default: \"#6d5cff\" },\n  { type: \"color\", key: \"colorB\", label: \"Liquid B\", slot: \"primary\", default: \"#22d3ee\" },\n  { type: \"color\", key: \"colorC\", label: \"Core\", slot: \"accent\", default: \"#f0abfc\" },\n  { type: \"divider\", key: \"interact\", label: \"Interaction\" },\n  { type: \"slider\", key: \"mouseWarp\", label: \"Pointer warp\", min: 0, max: 2, step: 0.01, default: 0.8 },\n  { type: \"slider\", key: \"grain\", label: \"Grain\", min: 0, max: 1.5, step: 0.01, default: 1 },\n];\nexport const fluidScene = buildFragmentShaderScene(/* glsl */ `\n  float hash(vec2 p){ return fract(sin(dot(p, vec2(127.1,311.7)))*43758.5453); }\n  float noise(vec2 p){\n    vec2 i=floor(p), f=fract(p); f=f*f*(3.0-2.0*f);\n    float a=hash(i), b=hash(i+vec2(1,0)), c=hash(i+vec2(0,1)), d=hash(i+vec2(1,1));\n    return mix(mix(a,b,f.x), mix(c,d,f.x), f.y);\n  }\n  float ball(vec2 p, vec2 c, float r){ float d=length(p-c); return r/max(d*d,1e-4); }\n  void main(){\n    vec2 uv = vUv;\n    float asp = uResolution.x / max(uResolution.y, 1.0);\n    vec2 p = (uv - 0.5) * vec2(asp, 1.0);\n    p *= (3.5 / max(uScale, 0.2));\n    float t = uTime * uSpeed * 0.4;\n    vec2 mp = (uMouse - 0.5) * vec2(asp, 1.0) * (3.5 / max(uScale, 0.2));\n    vec2 toM = p - mp;\n    float md = length(toM);\n    float warp = uMouseWarp * exp(-md*md*0.6);\n    p += normalize(toM + 1e-4) * warp;\n    float field = 0.0;\n    const int N = 6;\n    for(int i=0;i<N;i++){\n      float fi = float(i);\n      float a = fi * 2.39996;\n      float sp = 0.6 + fract(fi*0.41)*0.9;\n      vec2 c = vec2(\n        sin(t*sp + a*1.7) * 1.3 + cos(t*0.7 + fi)*0.4,\n        cos(t*sp*0.9 + a) * 1.1 + sin(t*0.5 + fi*1.3)*0.4\n      );\n      float r = mix(0.22, 0.5, fract(fi*0.73));\n      field += ball(p, c, r);\n    }\n    float thresh = mix(2.2, 5.5, clamp(uViscosity,0.0,1.0));\n    float m = smoothstep(thresh*0.55, thresh, field);\n    float inner = smoothstep(thresh*0.9, thresh*1.8, field);\n    float swirl = noise(p*0.8 + t*0.3);\n    vec3 liquid = mix(uColorA, uColorB, smoothstep(0.2,0.8,m + swirl*0.25 - 0.1));\n    liquid = mix(liquid, uColorC, inner*0.85);\n    liquid = (liquid - 0.5) * mix(0.85, 1.6, clamp(uContrast,0.0,1.0)) + 0.5;\n    vec3 col = mix(uBackground, liquid, m);\n    col += vec3(0.06) * pow(inner, 2.0);\n    col += (hash(uv*uResolution.xy + t) - 0.5) * 0.02 * uGrain;\n    col = clamp(col, 0.0, 1.0);\n    gl_FragColor = vec4(col, 1.0);\n  }\n`, fluidControls);\n\n/** Aurora — northern-lights curtains over a dark sky. */\nexport const auroraControls: ControlSpec[] = [\n  { type: \"slider\", key: \"speed\", label: \"Speed\", min: 0, max: 3, step: 0.01, default: 1 },\n  { type: \"slider\", key: \"bandCount\", label: \"Curtains\", min: 1, max: 5, step: 1, default: 3 },\n  { type: \"slider\", key: \"waviness\", label: \"Waviness\", min: 0, max: 2, step: 0.01, default: 1 },\n  { type: \"slider\", key: \"height\", label: \"Height\", min: 0.2, max: 0.9, step: 0.01, default: 0.5 },\n  { type: \"slider\", key: \"glow\", label: \"Glow\", min: 0.2, max: 2.5, step: 0.01, default: 1.2 },\n  { type: \"divider\", key: \"palette\", label: \"Aurora colours\" },\n  { type: \"color\", key: \"colorLow\", label: \"Low (ground)\", slot: \"primary\", default: \"#22e0a3\" },\n  { type: \"color\", key: \"colorMid\", label: \"Mid\", slot: \"secondary\", default: \"#19c2d6\" },\n  { type: \"color\", key: \"colorHigh\", label: \"High (sky)\", slot: \"accent\", default: \"#9b5cff\" },\n  { type: \"divider\", key: \"interact\", label: \"Interaction\" },\n  { type: \"slider\", key: \"mouseSway\", label: \"Pointer sway\", min: 0, max: 1, step: 0.01, default: 0.35 },\n  { type: \"slider\", key: \"grain\", label: \"Grain\", min: 0, max: 1.5, step: 0.01, default: 1 },\n];\nexport const auroraScene = buildFragmentShaderScene(/* glsl */ `\n  float hash(vec2 p){ return fract(sin(dot(p, vec2(127.1,311.7)))*43758.5453); }\n  float noise(vec2 p){\n    vec2 i=floor(p), f=fract(p); f=f*f*(3.0-2.0*f);\n    float a=hash(i), b=hash(i+vec2(1,0)), c=hash(i+vec2(0,1)), d=hash(i+vec2(1,1));\n    return mix(mix(a,b,f.x), mix(c,d,f.x), f.y);\n  }\n  float fbm(vec2 p){ float v=0.0,a=0.5; for(int i=0;i<5;i++){ v+=a*noise(p); p=p*2.03+7.1; a*=0.5; } return v; }\n  void main(){\n    vec2 uv = vUv;\n    float t = uTime * uSpeed * 0.25;\n    float sway = (uMouse.x - 0.5) * uMouseSway;\n    vec3 col = uBackground * (0.5 + 0.5*uv.y);\n    float stars = pow(hash(floor(uv*vec2(220.0,360.0))), 60.0);\n    col += stars * smoothstep(0.45, 1.0, uv.y) * 0.6;\n    float bands = clamp(uBandCount, 1.0, 5.0);\n    vec3 auroraAccum = vec3(0.0);\n    for(int i=0;i<5;i++){\n      if(float(i) >= bands) break;\n      float fi = float(i);\n      float turb = fbm(vec2(uv.x*3.0 + fi*5.1, t + fi*1.7)) * uWaviness;\n      float ridge = uv.x + sway + turb*0.35 + 0.12*sin(uv.y*4.0 + t*2.0 + fi*2.1);\n      float centre = 0.5 + 0.32*sin(t*0.7 + fi*1.9);\n      float dd = (ridge - centre) / 0.14;\n      float sheet = exp(-dd*dd);\n      float base = 0.05 + 0.18*fi/bands;\n      float h = smoothstep(base, base + uHeight, uv.y) * (1.0 - smoothstep(base + uHeight, base + uHeight + 0.5, uv.y));\n      float shimmer = 0.6 + 0.4*sin(uv.y*22.0 - t*6.0 + turb*4.0 + fi*3.0);\n      float intensity = sheet * h * shimmer;\n      vec3 lo = mix(uColorLow, uColorMid, smoothstep(base, base+uHeight*0.6, uv.y));\n      vec3 ribbon = mix(lo, uColorHigh, smoothstep(base+uHeight*0.4, base+uHeight, uv.y));\n      auroraAccum += ribbon * intensity;\n    }\n    col += auroraAccum * uGlow;\n    col += auroraAccum * auroraAccum * uGlow * 0.4;\n    col += (hash(uv*uResolution.xy + t) - 0.5) * 0.02 * uGrain;\n    col = clamp(col, 0.0, 1.0);\n    gl_FragColor = vec4(col, 1.0);\n  }\n`, auroraControls);\n\n/** Water caustics — animated underwater light net. */\nexport const causticsControls: ControlSpec[] = [\n  { type: \"slider\", key: \"speed\", label: \"Speed\", min: 0, max: 3, step: 0.01, default: 1 },\n  { type: \"slider\", key: \"scale\", label: \"Scale\", min: 0.4, max: 3, step: 0.01, default: 1 },\n  { type: \"slider\", key: \"sharpness\", label: \"Sharpness\", min: 0, max: 1, step: 0.01, default: 0.5 },\n  { type: \"slider\", key: \"brightness\", label: \"Brightness\", min: 0.2, max: 2.5, step: 0.01, default: 1.1 },\n  { type: \"divider\", key: \"palette\", label: \"Water tint\" },\n  { type: \"color\", key: \"deep\", label: \"Deep\", slot: \"secondary\", default: \"#0b2a4a\" },\n  { type: \"color\", key: \"shallow\", label: \"Shallow\", slot: \"primary\", default: \"#2bb0c9\" },\n  { type: \"divider\", key: \"interact\", label: \"Interaction\" },\n  { type: \"slider\", key: \"chroma\", label: \"Chromatic split\", min: 0, max: 2, step: 0.01, default: 0.6 },\n  { type: \"slider\", key: \"mouseRipple\", label: \"Pointer ripple\", min: 0, max: 2, step: 0.01, default: 0.8 },\n  { type: \"slider\", key: \"grain\", label: \"Grain\", min: 0, max: 1.5, step: 0.01, default: 1 },\n];\nexport const causticsScene = buildFragmentShaderScene(/* glsl */ `\n  vec2 hash2(vec2 p){\n    p = vec2(dot(p, vec2(127.1,311.7)), dot(p, vec2(269.5,183.3)));\n    return fract(sin(p)*43758.5453);\n  }\n  float worley(vec2 p, float t){\n    vec2 ip = floor(p), fp = fract(p);\n    float d = 1.0;\n    for(int y=-1;y<=1;y++){\n      for(int x=-1;x<=1;x++){\n        vec2 g = vec2(float(x), float(y));\n        vec2 o = hash2(ip + g);\n        o = 0.5 + 0.5*sin(t + 6.2831*o);\n        vec2 r = g + o - fp;\n        d = min(d, dot(r, r));\n      }\n    }\n    return sqrt(d);\n  }\n  float causticAt(vec2 p, float t, float sharp){\n    float w1 = worley(p, t);\n    float w2 = worley(p*1.9 + 4.3, t*1.3);\n    float veins = w1*0.65 + w2*0.35;\n    float c = 1.0 - veins;\n    c = pow(clamp(c,0.0,1.0), mix(2.0, 9.0, clamp(sharp,0.0,1.0)));\n    return c;\n  }\n  void main(){\n    vec2 uv = vUv;\n    float asp = uResolution.x / max(uResolution.y, 1.0);\n    vec2 p = vec2(uv.x*asp, uv.y) * (4.0 * uScale);\n    float t = uTime * uSpeed * 0.5;\n    vec2 m = vec2(uMouse.x*asp, uMouse.y) * (4.0 * uScale);\n    vec2 toM = p - m;\n    float md = length(toM);\n    float ripple = sin(md*3.0 - uTime*4.0) * exp(-md*0.8) * uMouseRipple;\n    p += normalize(toM + 1e-4) * ripple;\n    p += vec2(t*0.15, t*0.1);\n    float off = uChroma * 0.06;\n    float cr = causticAt(p + vec2( off, 0.0), t, uSharpness);\n    float cg = causticAt(p, t, uSharpness);\n    float cb = causticAt(p + vec2(-off, 0.0), t, uSharpness);\n    vec3 water = mix(uDeep, uShallow, smoothstep(0.0, 1.0, uv.y));\n    vec3 light = vec3(cr, cg, cb) * uBrightness;\n    vec3 col = water + light * (0.6 + 0.4*uv.y);\n    col += uShallow * pow(uv.y, 3.0) * 0.15;\n    col += (hash2(uv*uResolution.xy + t).x - 0.5) * 0.02 * uGrain;\n    col = clamp(col, 0.0, 1.0);\n    gl_FragColor = vec4(col, 1.0);\n  }\n`, causticsControls);\n\n/** Flowing ribbon — silky iridescent satin sweep. */\nexport const ribbonControls: ControlSpec[] = [\n  { type: \"divider\", key: \"motion\", label: \"Motion\" },\n  { type: \"slider\", key: \"speed\", label: \"Speed\", min: 0, max: 3, step: 0.01, default: 0.6 },\n  { type: \"slider\", key: \"mouseSway\", label: \"Mouse sway\", min: 0, max: 1, step: 0.01, default: 0.3 },\n  { type: \"divider\", key: \"form\", label: \"Ribbon\" },\n  { type: \"slider\", key: \"ribbonWidth\", label: \"Ribbon width\", min: 0.08, max: 0.6, step: 0.01, default: 0.26 },\n  { type: \"slider\", key: \"twist\", label: \"Twist\", min: 0, max: 2.5, step: 0.01, default: 1.0 },\n  { type: \"slider\", key: \"sheen\", label: \"Sheen\", min: 0, max: 1, step: 0.01, default: 0.7 },\n  { type: \"divider\", key: \"palette\", label: \"Palette\" },\n  { type: \"color\", key: \"ribbonA\", label: \"Ribbon A\", default: \"#f7a8c4\", slot: \"primary\" },\n  { type: \"color\", key: \"ribbonB\", label: \"Ribbon B\", default: \"#8fe3d8\", slot: \"secondary\" },\n  { type: \"color\", key: \"ribbonC\", label: \"Ribbon C\", default: \"#c9b8ff\", slot: \"accent\" },\n  { type: \"color\", key: \"bg\", label: \"Background\", default: \"#f4f1ec\", slot: \"background\" },\n  { type: \"divider\", key: \"finish\", label: \"Finish\" },\n  { type: \"slider\", key: \"grain\", label: \"Grain\", min: 0, max: 0.08, step: 0.001, default: 0.02 },\n];\nexport const ribbonScene = buildFragmentShaderScene(/* glsl */ `\n  float hash(vec2 p){ return fract(sin(dot(p, vec2(127.1,311.7)))*43758.5453); }\n  float vnoise(vec2 p){\n    vec2 i=floor(p), f=fract(p); f=f*f*(3.0-2.0*f);\n    float a=hash(i), b=hash(i+vec2(1.0,0.0));\n    float c=hash(i+vec2(0.0,1.0)), d=hash(i+vec2(1.0,1.0));\n    return mix(mix(a,b,f.x), mix(c,d,f.x), f.y);\n  }\n  float fbm(vec2 p){ float v=0.0,a=0.5; for(int i=0;i<5;i++){ v+=a*vnoise(p); p*=2.02; a*=0.5; } return v; }\n  void main(){\n    vec2 uv = vUv;\n    float t = uTime * uSpeed;\n    float aspect = uResolution.x / max(uResolution.y, 1.0);\n    vec2 p = uv - 0.5;\n    p.x *= aspect;\n    float mouseY = (uMouse.y - 0.5) * uMouseSway;\n    float curve = sin(p.x*2.3 + t*0.9)*0.18*uTwist + sin(p.x*4.7 - t*1.3)*0.07*uTwist + sin(p.x*1.1 + t*0.5)*0.10;\n    float centre = curve + mouseY;\n    float d = p.y - centre;\n    float taper = mix(0.55, 1.0, 0.5 + 0.5*sin(p.x*1.7 - t*0.7));\n    float halfW = uRibbonWidth * 0.5 * taper;\n    float edge = 0.06 + 0.02*uRibbonWidth;\n    float mask = smoothstep(halfW + edge, halfW - edge, abs(d));\n    float slope = cos(p.x*2.3 + t*0.9)*2.3*0.18*uTwist + cos(p.x*4.7 - t*1.3)*4.7*0.07*uTwist + cos(p.x*1.1 + t*0.5)*1.1*0.10;\n    float across = clamp(d / max(halfW, 0.001) * 0.5 + 0.5, 0.0, 1.0);\n    float folds = fbm(vec2(p.x*3.0 - t*0.6, across*2.5));\n    float fold = sin(across*6.2831*2.0 + slope*2.5 + folds*3.0 - t);\n    float shade = 0.5 + 0.5*fold;\n    float irid = fract(across + fold*0.25 + p.x*0.4 + t*0.05);\n    vec3 col3a = mix(uRibbonA, uRibbonB, smoothstep(0.0, 0.5, irid));\n    vec3 ribCol = mix(col3a, uRibbonC, smoothstep(0.5, 1.0, irid));\n    vec3 ribbon = ribCol * mix(0.55, 1.15, shade);\n    float spec = pow(clamp(shade, 0.0, 1.0), mix(40.0, 4.0, 1.0 - uSheen));\n    float specBand = smoothstep(0.0, 0.4, across) * smoothstep(1.0, 0.6, across);\n    ribbon += vec3(1.0) * spec * specBand * uSheen * 0.9;\n    float rim = smoothstep(halfW, halfW - edge*1.5, abs(d)) - smoothstep(halfW - edge*1.5, halfW - edge*3.0, abs(d));\n    ribbon += uRibbonC * max(rim, 0.0) * 0.6 * uSheen;\n    vec3 ground = mix(uBg, mix(uBg, uRibbonA, 0.06), smoothstep(0.0, 1.0, uv.y));\n    float bloom = smoothstep(halfW*3.0, 0.0, abs(d)) * 0.18;\n    ground += uRibbonB * bloom;\n    vec3 col = mix(ground, ribbon, mask);\n    col += (hash(uv*uResolution.xy + t) - 0.5) * uGrain;\n    col = clamp(col, 0.0, 1.0);\n    gl_FragColor = vec4(col, 1.0);\n  }\n`, ribbonControls);\n\n/** Concentric — rings rippling from a centre with moiré. */\nexport const concentricControls: ControlSpec[] = [\n  { type: \"divider\", key: \"motion\", label: \"Motion\" },\n  { type: \"slider\", key: \"speed\", label: \"Speed\", min: 0, max: 3, step: 0.01, default: 0.7 },\n  { type: \"divider\", key: \"rings\", label: \"Rings\" },\n  { type: \"slider\", key: \"ringCount\", label: \"Ring count\", min: 2, max: 40, step: 0.5, default: 14 },\n  { type: \"slider\", key: \"ringSharpness\", label: \"Ring sharpness\", min: 0, max: 1, step: 0.01, default: 0.45 },\n  { type: \"slider\", key: \"moire\", label: \"Moiré\", min: 0, max: 1, step: 0.01, default: 0.5 },\n  { type: \"slider\", key: \"glow\", label: \"Centre glow\", min: 0, max: 1, step: 0.01, default: 0.5 },\n  { type: \"divider\", key: \"center\", label: \"Centre\" },\n  { type: \"toggle\", key: \"followMouse\", label: \"Follow cursor\", default: true },\n  { type: \"slider\", key: \"centerX\", label: \"Centre X\", min: 0, max: 1, step: 0.01, default: 0.5 },\n  { type: \"slider\", key: \"centerY\", label: \"Centre Y\", min: 0, max: 1, step: 0.01, default: 0.5 },\n  { type: \"divider\", key: \"palette\", label: \"Palette\" },\n  { type: \"color\", key: \"colorA\", label: \"Colour A\", default: \"#b45cff\", slot: \"primary\" },\n  { type: \"color\", key: \"colorB\", label: \"Colour B\", default: \"#ff4fd8\", slot: \"secondary\" },\n  { type: \"color\", key: \"colorC\", label: \"Colour C\", default: \"#6a2fb0\", slot: \"accent\" },\n  { type: \"color\", key: \"bg\", label: \"Background\", default: \"#1a0e2a\", slot: \"background\" },\n  { type: \"divider\", key: \"finish\", label: \"Finish\" },\n  { type: \"slider\", key: \"grain\", label: \"Grain\", min: 0, max: 0.08, step: 0.001, default: 0.02 },\n];\nexport const concentricScene = buildFragmentShaderScene(/* glsl */ `\n  float hash(vec2 p){ return fract(sin(dot(p, vec2(127.1,311.7)))*43758.5453); }\n  void main(){\n    vec2 uv = vUv;\n    float t = uTime * uSpeed;\n    float aspect = uResolution.x / max(uResolution.y, 1.0);\n    vec2 centre = vec2(uCenterX, uCenterY);\n    centre = mix(centre, uMouse, step(0.5, uFollowMouse));\n    vec2 p = uv - centre;\n    p.x *= aspect;\n    float r = length(p);\n    float ang = atan(p.y, p.x);\n    float pulse = 1.0 + 0.06*sin(t*1.5);\n    float rr = r * pulse;\n    float phase = rr * uRingCount * 6.2831 - t*3.0;\n    float rings = pow(0.5 + 0.5*sin(phase), mix(1.0, 6.0, uRingSharpness));\n    float phase2 = rr * uRingCount * 6.2831 * 1.07 - t*2.3 + ang*0.5;\n    float rings2 = pow(0.5 + 0.5*sin(phase2), mix(1.0, 6.0, uRingSharpness));\n    float moire = mix(rings, rings * rings2, uMoire);\n    float radialMix = fract(rr*1.2 - t*0.1);\n    vec3 base = mix(uColorA, uColorB, smoothstep(0.0, 0.6, radialMix));\n    base = mix(base, uColorC, smoothstep(0.6, 1.0, radialMix));\n    vec3 col = mix(uBg, base, moire);\n    float glow = exp(-rr * mix(6.0, 1.5, uGlow)) * uGlow;\n    col += uColorA * glow;\n    float vig = smoothstep(1.3, 0.2, r);\n    col = mix(uBg * 0.85, col, vig);\n    col += (hash(uv*uResolution.xy + t) - 0.5) * uGrain;\n    col = clamp(col, 0.0, 1.0);\n    gl_FragColor = vec4(col, 1.0);\n  }\n`, concentricControls);\n\n/** Deep vortex — dark spiralling streaks with starfield. */\nexport const vortexControls: ControlSpec[] = [\n  { type: \"divider\", key: \"motion\", label: \"Motion\" },\n  { type: \"slider\", key: \"speed\", label: \"Speed\", min: 0, max: 3, step: 0.01, default: 0.7 },\n  { type: \"slider\", key: \"mousePull\", label: \"Mouse pull\", min: 0, max: 1, step: 0.01, default: 0.35 },\n  { type: \"divider\", key: \"swirl\", label: \"Swirl\" },\n  { type: \"slider\", key: \"spin\", label: \"Spin\", min: -6, max: 6, step: 0.1, default: 3.0 },\n  { type: \"slider\", key: \"armCount\", label: \"Arms\", min: 1, max: 16, step: 1, default: 5 },\n  { type: \"slider\", key: \"depth\", label: \"Depth\", min: 0, max: 1, step: 0.01, default: 0.6 },\n  { type: \"divider\", key: \"palette\", label: \"Palette\" },\n  { type: \"color\", key: \"colorA\", label: \"Colour A\", default: \"#3a1d6e\", slot: \"primary\" },\n  { type: \"color\", key: \"colorB\", label: \"Colour B\", default: \"#a24be0\", slot: \"secondary\" },\n  { type: \"color\", key: \"bg\", label: \"Background\", default: \"#0a0612\", slot: \"background\" },\n  { type: \"divider\", key: \"finish\", label: \"Finish\" },\n  { type: \"slider\", key: \"sparkle\", label: \"Sparkle\", min: 0, max: 1, step: 0.01, default: 0.4 },\n  { type: \"slider\", key: \"grain\", label: \"Grain\", min: 0, max: 0.08, step: 0.001, default: 0.02 },\n];\nexport const vortexScene = buildFragmentShaderScene(/* glsl */ `\n  float hash(vec2 p){ return fract(sin(dot(p, vec2(127.1,311.7)))*43758.5453); }\n  float vnoise(vec2 p){\n    vec2 i=floor(p), f=fract(p); f=f*f*(3.0-2.0*f);\n    float a=hash(i), b=hash(i+vec2(1.0,0.0));\n    float c=hash(i+vec2(0.0,1.0)), d=hash(i+vec2(1.0,1.0));\n    return mix(mix(a,b,f.x), mix(c,d,f.x), f.y);\n  }\n  void main(){\n    vec2 uv = vUv;\n    float t = uTime * uSpeed;\n    float aspect = uResolution.x / max(uResolution.y, 1.0);\n    vec2 centre = mix(vec2(0.5), uMouse, uMousePull);\n    vec2 p = uv - centre;\n    p.x *= aspect;\n    float r = length(p);\n    float ang = atan(p.y, p.x);\n    float twist = uSpin * log(r*3.0 + 0.18);\n    float spiralAng = ang + twist + t*0.6;\n    float arms = pow(0.5 + 0.5*sin(spiralAng * uArmCount), 2.2);\n    float flow = vnoise(vec2(spiralAng * uArmCount * 0.5, r*8.0 - t*1.5));\n    arms = mix(arms, arms * (0.5 + flow), 0.6);\n    float depth = pow(clamp(r * mix(2.4, 1.1, uDepth), 0.0, 1.0), mix(0.6, 2.5, uDepth));\n    vec3 streakCol = mix(uColorA, uColorB, smoothstep(0.0, 0.7, r));\n    float intensity = arms * depth;\n    vec3 col = mix(uBg, streakCol, clamp(intensity, 0.0, 1.0));\n    float throat = exp(-r*5.0);\n    col += uColorB * throat * 0.5 * depth;\n    col = mix(uBg * 0.4, col, smoothstep(0.0, 0.12, r));\n    vec2 sgrid = floor(uv * uResolution / 2.5);\n    float star = hash(sgrid);\n    float spark = step(0.992, star);\n    float twinkle = 0.5 + 0.5*sin(t*3.0 + star*100.0);\n    col += vec3(1.0) * spark * twinkle * uSparkle * smoothstep(0.1, 0.9, r);\n    col += (hash(uv*uResolution.xy + t) - 0.5) * uGrain;\n    col = clamp(col, 0.0, 1.0);\n    gl_FragColor = vec4(col, 1.0);\n  }\n`, vortexControls);\n\n/** Spectral bloom — kaleidoscopic radial spectrum burst. */\nexport const spectralControls: ControlSpec[] = [\n  { type: \"slider\", key: \"speed\", label: \"Speed\", min: 0, max: 3, step: 0.01, default: 0.6 },\n  { type: \"slider\", key: \"petalCount\", label: \"Petals\", min: 3, max: 24, step: 1, default: 8 },\n  { type: \"slider\", key: \"bloomRadius\", label: \"Bloom radius\", min: 0.1, max: 1.2, step: 0.01, default: 0.5 },\n  { type: \"slider\", key: \"spread\", label: \"Spectrum spread\", min: 0.1, max: 1.5, step: 0.01, default: 0.7 },\n  { type: \"slider\", key: \"cycle\", label: \"Spectral cycling\", min: 0, max: 2, step: 0.01, default: 0.6 },\n  { type: \"slider\", key: \"glow\", label: \"Glow\", min: 0, max: 1.5, step: 0.01, default: 0.6 },\n  { type: \"divider\", key: \"palette\", label: \"Palette\" },\n  { type: \"color\", key: \"colorA\", label: \"Colour A\", default: \"#2dd4bf\", slot: \"primary\" },\n  { type: \"color\", key: \"colorB\", label: \"Colour B\", default: \"#3b82f6\", slot: \"secondary\" },\n  { type: \"color\", key: \"colorC\", label: \"Colour C\", default: \"#a855f7\", slot: \"accent\" },\n  { type: \"color\", key: \"bg\", label: \"Background\", default: \"#05060a\", slot: \"background\" },\n  { type: \"divider\", key: \"interaction\", label: \"Interaction\" },\n  { type: \"slider\", key: \"mouseInfluence\", label: \"Mouse pull\", min: 0, max: 1, step: 0.01, default: 0.6 },\n];\nexport const spectralScene = buildFragmentShaderScene(/* glsl */ `\n  #define PI 3.14159265359\n  #define TAU 6.28318530718\n  float hash(vec2 p){ return fract(sin(dot(p, vec2(127.1,311.7)))*43758.5453); }\n  vec3 spectralShift(vec3 base, float h){\n    const vec3 k = vec3(0.57735);\n    float c = cos(h), s = sin(h);\n    return base*c + cross(k, base)*s + k*dot(k, base)*(1.0-c);\n  }\n  void main(){\n    vec2 uv = vUv;\n    float aspect = uResolution.x / max(uResolution.y, 1.0);\n    vec2 mc = mix(vec2(0.5), uMouse, uMouseInfluence);\n    vec2 p = uv - mc;\n    p.x *= aspect;\n    float t = uTime * uSpeed;\n    float r = length(p);\n    float a = atan(p.y, p.x);\n    float sym = max(uPetalCount, 1.0);\n    float seg = TAU / sym;\n    float af = mod(a, seg);\n    af = abs(af - seg*0.5);\n    float ang = af / (seg*0.5);\n    float petalShape = pow(cos(ang*PI - PI*0.5), 2.0 + uSpread*6.0);\n    float bloom = uBloomRadius * (0.8 + 0.2*sin(t*1.3));\n    float ray = petalShape / (1.0 + pow(r/bloom, 2.2));\n    float subA = a*sym + t*1.2;\n    float ripple = 0.5 + 0.5*sin(subA*1.0 - r*14.0 + t*2.0);\n    ray *= mix(0.6, 1.0, ripple);\n    float spec = r*uSpread*4.0 - t*uCycle + ang*0.4;\n    vec3 c1 = mix(uColorA, uColorB, 0.5 + 0.5*sin(spec*TAU));\n    vec3 c2 = mix(uColorB, uColorC, 0.5 + 0.5*sin(spec*TAU + 2.094));\n    vec3 petalCol = mix(c1, c2, 0.5 + 0.5*sin(spec*TAU + 4.188));\n    petalCol = spectralShift(petalCol, (r*2.0 - t*0.6)*uSpread);\n    float core = uGlow / (1.0 + r*r*60.0);\n    vec3 col = uBg;\n    col += petalCol * ray * (1.2 + uGlow*1.5);\n    col += petalCol * core * 1.5;\n    col += (uColorA + uColorB) * core * 0.4;\n    col *= 1.0 - 0.35*smoothstep(0.4, 1.1, r);\n    col += hash(uv*uResolution.xy + t)*0.02 - 0.01;\n    col = max(col, 0.0);\n    gl_FragColor = vec4(col, 1.0);\n  }\n`, spectralControls);\n\n/** Halftone pop — pop-art print-dot field over a palette gradient. */\nexport const halftoneControls: ControlSpec[] = [\n  { type: \"slider\", key: \"speed\", label: \"Speed\", min: 0, max: 3, step: 0.01, default: 0.7 },\n  { type: \"slider\", key: \"dotSize\", label: \"Dot size\", min: 6, max: 48, step: 1, default: 18, unit: \"px\" },\n  { type: \"slider\", key: \"gridAngle\", label: \"Grid angle\", min: 0, max: 90, step: 1, default: 27, unit: \"deg\" },\n  { type: \"slider\", key: \"contrast\", label: \"Contrast\", min: 0.5, max: 4, step: 0.01, default: 1.6 },\n  { type: \"slider\", key: \"dotSoftness\", label: \"Dot softness\", min: 0, max: 1, step: 0.01, default: 0.35 },\n  { type: \"divider\", key: \"palette\", label: \"Palette\" },\n  { type: \"color\", key: \"colorA\", label: \"Ink A\", default: \"#f97316\", slot: \"primary\" },\n  { type: \"color\", key: \"colorB\", label: \"Ink B\", default: \"#fb7185\", slot: \"secondary\" },\n  { type: \"color\", key: \"colorC\", label: \"Ink C\", default: \"#fbbf24\", slot: \"accent\" },\n  { type: \"color\", key: \"bg\", label: \"Paper\", default: \"#0b0b0f\", slot: \"background\" },\n  { type: \"divider\", key: \"interaction\", label: \"Interaction\" },\n  { type: \"slider\", key: \"mouseInfluence\", label: \"Mouse swell\", min: 0, max: 2, step: 0.01, default: 0.8 },\n];\nexport const halftoneScene = buildFragmentShaderScene(/* glsl */ `\n  float hash(vec2 p){ return fract(sin(dot(p, vec2(127.1,311.7)))*43758.5453); }\n  float noise(vec2 p){ vec2 i=floor(p),f=fract(p); f=f*f*(3.0-2.0*f);\n    float a=hash(i),b=hash(i+vec2(1,0)),c=hash(i+vec2(0,1)),d=hash(i+vec2(1,1));\n    return mix(mix(a,b,f.x),mix(c,d,f.x),f.y); }\n  mat2 rot(float a){ float c=cos(a),s=sin(a); return mat2(c,-s,s,c); }\n  void main(){\n    vec2 uv = vUv;\n    float aspect = uResolution.x / max(uResolution.y, 1.0);\n    float t = uTime * uSpeed;\n    vec2 g = uv; g.x *= aspect;\n    float diag = (g.x + g.y) * 0.7;\n    float wave = sin(diag*3.0 - t*1.4) * 0.5 + 0.5;\n    float n = noise(g*2.2 + vec2(t*0.3, -t*0.2));\n    float field = mix(wave, n, 0.35);\n    vec2 mp = uMouse; mp.x *= aspect;\n    float md = distance(g, mp);\n    field += uMouseInfluence * (0.6 / (1.0 + md*md*18.0));\n    field = clamp((field - 0.5) * uContrast + 0.5, 0.0, 1.0);\n    vec3 grad = mix(uColorA, uColorB, smoothstep(0.0, 0.7, field));\n    grad = mix(grad, uColorC, smoothstep(0.55, 1.0, field));\n    vec2 frag = gl_FragCoord.xy;\n    float ga = radians(uGridAngle);\n    vec2 rg = rot(ga) * frag;\n    rg += vec2(t * 30.0);\n    float cell = max(uDotSize, 2.0);\n    vec2 gp = mod(rg, cell) - cell*0.5;\n    float dist = length(gp);\n    float radius = (cell*0.5) * sqrt(clamp(field, 0.0, 1.0));\n    float soft = mix(0.5, cell*0.45, clamp(uDotSoftness, 0.0, 1.0));\n    float dot = 1.0 - smoothstep(radius - soft, radius + soft, dist);\n    vec3 col = mix(uBg, grad, dot);\n    float halo = smoothstep(radius + soft, radius - soft*2.0, dist);\n    col += grad * halo * 0.06;\n    col += hash(uv*uResolution.xy + t)*0.02 - 0.01;\n    col = clamp(col, 0.0, 1.0);\n    gl_FragColor = vec4(col, 1.0);\n  }\n`, halftoneControls);\n\n/** Digital grid — data-activity cells, pulses, ring + spotlight. */\nexport const digitalControls: ControlSpec[] = [\n  { type: \"slider\", key: \"speed\", label: \"Speed\", min: 0, max: 3, step: 0.01, default: 0.8 },\n  { type: \"slider\", key: \"gridDensity\", label: \"Grid density\", min: 6, max: 60, step: 1, default: 26 },\n  { type: \"slider\", key: \"pulseSpeed\", label: \"Pulse speed\", min: 0, max: 4, step: 0.01, default: 1.2 },\n  { type: \"slider\", key: \"glow\", label: \"Glow / intensity\", min: 0, max: 2, step: 0.01, default: 0.9 },\n  { type: \"slider\", key: \"ringRadius\", label: \"Ring radius\", min: 0.1, max: 0.6, step: 0.01, default: 0.32 },\n  { type: \"slider\", key: \"scanline\", label: \"Scanline mix\", min: 0, max: 1, step: 0.01, default: 0.3 },\n  { type: \"divider\", key: \"palette\", label: \"Palette\" },\n  { type: \"color\", key: \"colorA\", label: \"Accent\", default: \"#22c55e\", slot: \"primary\" },\n  { type: \"color\", key: \"colorB\", label: \"Rim\", default: \"#4ade80\", slot: \"accent\" },\n  { type: \"color\", key: \"bg\", label: \"Background\", default: \"#03060a\", slot: \"background\" },\n  { type: \"divider\", key: \"interaction\", label: \"Interaction\" },\n  { type: \"slider\", key: \"mouseInfluence\", label: \"Mouse spotlight\", min: 0, max: 2, step: 0.01, default: 1.0 },\n];\nexport const digitalScene = buildFragmentShaderScene(/* glsl */ `\n  float hash(vec2 p){ return fract(sin(dot(p, vec2(127.1,311.7)))*43758.5453); }\n  float hash1(float n){ return fract(sin(n)*43758.5453); }\n  void main(){\n    vec2 uv = vUv;\n    float aspect = uResolution.x / max(uResolution.y, 1.0);\n    float t = uTime * uSpeed;\n    vec2 cc = uv - 0.5; cc.x *= aspect;\n    float r = length(cc);\n    vec2 g = uv; g.x *= aspect;\n    float dens = max(uGridDensity, 2.0);\n    vec2 cellId = floor(g * dens);\n    vec2 cellUv = fract(g * dens);\n    float perCell = hash(cellId);\n    float pt = uTime * uPulseSpeed;\n    float wavePos = (cellId.x + cellId.y) * 0.18;\n    float wave = sin(wavePos - pt*2.0);\n    float flick = step(0.55, hash1(perCell*37.0 + floor(pt + perCell*4.0)));\n    float activity = smoothstep(0.4, 1.0, wave) * mix(0.4, 1.0, flick);\n    activity = max(activity, 0.12);\n    vec2 d = abs(cellUv - 0.5);\n    float pad = max(d.x, d.y);\n    float cellMask = 1.0 - smoothstep(0.30, 0.46, pad);\n    float line = smoothstep(0.46, 0.5, pad);\n    float ring = abs(r - uRingRadius);\n    float ringGlow = uGlow * 0.02 / (ring + 0.005);\n    float disc = smoothstep(uRingRadius - 0.02, uRingRadius + 0.02, r);\n    vec2 mp = uMouse; mp.x *= aspect;\n    float md = distance(g, mp);\n    float spot = uMouseInfluence * (0.5 / (1.0 + md*md*10.0));\n    float scan = mix(1.0, 0.5 + 0.5*sin(uv.y*uResolution.y*0.6 - t*8.0), uScanline);\n    vec3 accent = uColorA;\n    float lit = activity * cellMask;\n    lit *= disc;\n    lit += spot * cellMask;\n    vec3 col = uBg;\n    col += accent * lit * (1.0 + uGlow) * scan;\n    col += mix(uColorA, uColorB, 0.5) * line * 0.06 * disc;\n    col += uColorB * ringGlow;\n    col += accent * spot * 0.5;\n    col += hash(uv*uResolution.xy + t)*0.02 - 0.01;\n    col = max(col, 0.0);\n    gl_FragColor = vec4(col, 1.0);\n  }\n`, digitalControls);\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\";\nimport {\n  meshScene,\n  wavesScene,\n  undertonesScene,\n  flowingDotsScene,\n  grainScene,\n  glassScene,\n  holographicScene,\n  fluidScene, fluidControls,\n  auroraScene, auroraControls,\n  causticsScene, causticsControls,\n  ribbonScene, ribbonControls,\n  concentricScene, concentricControls,\n  vortexScene, vortexControls,\n  spectralScene, spectralControls,\n  halftoneScene, halftoneControls,\n  digitalScene, digitalControls,\n} from \"./scenes/fragment-scenes\";\n\nexport const sceneRegistry: Record<string, SceneFactory> = {\n  space: spaceScene,\n  plasma: plasmaScene,\n  voronoi: voronoiScene,\n  synthwave: synthwaveScene,\n  mesh: meshScene,\n  waves: wavesScene,\n  undertones: undertonesScene,\n  \"flowing-dots\": flowingDotsScene,\n  grain: grainScene,\n  glass: glassScene,\n  holographic: holographicScene,\n  fluid: fluidScene,\n  aurora: auroraScene,\n  caustics: causticsScene,\n  ribbon: ribbonScene,\n  concentric: concentricScene,\n  vortex: vortexScene,\n  spectral: spectralScene,\n  halftone: halftoneScene,\n  digital: digitalScene,\n  // Further candidates: icosa, oscilloscope, retro-sunset, sdf\n};\n\nexport const shaderPresets: ShaderPreset[] = [\n  {\n    id: \"mesh\",\n    label: \"Mesh gradient\",\n    description:\n      \"Smooth moving blobs of the primary / secondary / accent colours over the background — the go-to soft, theme-reactive background.\",\n    tags: [\"gradient\", \"mesh\", \"abstract\", \"hero\", \"background\"],\n    scene: \"mesh\",\n    defaultPostPreset: \"none\",\n  },\n  {\n    id: \"waves\",\n    label: \"Waves\",\n    description:\n      \"Flowing banded ribbons that ripple across the surface. Clean motion for headers and hero backdrops.\",\n    tags: [\"waves\", \"motion\", \"abstract\", \"hero\"],\n    scene: \"waves\",\n    defaultPostPreset: \"none\",\n  },\n  {\n    id: \"undertones\",\n    label: \"Undertones\",\n    description:\n      \"Soft low-saturation tonal washes drifting like weather — the field bends gently toward the cursor and a faint light follows it. The calm, expensive-feeling backdrop.\",\n    tags: [\"gradient\", \"soft\", \"subtle\", \"mouse\", \"hero\", \"background\", \"calm\"],\n    scene: \"undertones\",\n    defaultPostPreset: \"none\",\n  },\n  {\n    id: \"flowing-dots\",\n    label: \"Flowing dots\",\n    description:\n      \"A dot-matrix grid where waves of dots swell and tint as a flow field passes through — and swell toward the cursor. Playful, technical, great behind type.\",\n    tags: [\"dots\", \"grid\", \"halftone\", \"mouse\", \"motion\", \"background\", \"playful\"],\n    scene: \"flowing-dots\",\n    defaultPostPreset: \"none\",\n  },\n  {\n    id: \"grain\",\n    label: \"Grain\",\n    description:\n      \"A glacial tonal wash under heavy animated film grain — fine print grain plus a coarser fleck, with a gentle vignette. The editorial, print-feeling backdrop; lovely in light AND dark tones.\",\n    tags: [\"grain\", \"film\", \"texture\", \"editorial\", \"print\", \"subtle\", \"hero\", \"background\"],\n    scene: \"grain\",\n    defaultPostPreset: \"none\",\n  },\n  {\n    id: \"holographic\",\n    label: \"Holographic foil\",\n    description:\n      \"Iridescent foil — a brushed diagonal grain (a diffraction grating) under a spectrum that sweeps across the sheet in dense shimmering bands, with metallic glints riding the grain. The spectrum cycles the brand colours (secondary → primary → accent) so it re-tints with the theme rather than being a fixed rainbow. The cursor acts as the view angle, sliding the whole spectrum like tilting a holographic card.\",\n    tags: [\"holographic\", \"foil\", \"iridescent\", \"diffraction\", \"grain\", \"mouse\", \"hero\", \"background\"],\n    scene: \"holographic\",\n    defaultPostPreset: \"none\",\n  },\n  {\n    id: \"glass\",\n    label: \"Studio glass\",\n    description:\n      \"A brand-tinted wash seen through a sheet of frosted, slumped glass — chromatic refraction fringes the edges, anisotropic specular streaks catch a moving key light, and a faint caustic shimmer pools in the folds. The glass bulges toward the cursor like a lens and the highlight tracks it. The expensive, tactile backdrop; lovely in light AND dark tones.\",\n    tags: [\"glass\", \"frosted\", \"refraction\", \"caustic\", \"mouse\", \"soft\", \"hero\", \"background\"],\n    scene: \"glass\",\n    defaultPostPreset: \"none\",\n  },\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    id: \"fluid\",\n    label: \"Fluid\",\n    description:\n      \"Soft liquid metaballs — large slow blobs of palette colour merge and split like a lava lamp. The cursor warps the liquid around it.\",\n    tags: [\"lava lamp\", \"liquid\", \"metaballs\", \"organic\", \"gradient\", \"ambient\", \"background\"],\n    scene: \"fluid\",\n    defaultPostPreset: \"none\",\n    controls: fluidControls,\n  },\n  {\n    id: \"aurora\",\n    label: \"Aurora\",\n    description:\n      \"Vertical curtains of northern-light ribbons drift and shimmer over a dark sky, with a faint star field. Lovely on dark surfaces.\",\n    tags: [\"aurora\", \"northern lights\", \"ribbons\", \"dark\", \"glow\", \"atmospheric\", \"background\"],\n    scene: \"aurora\",\n    defaultPostPreset: \"none\",\n    controls: auroraControls,\n  },\n  {\n    id: \"caustics\",\n    label: \"Water caustics\",\n    description:\n      \"Animated underwater caustic light net — bright cellular veins ripple across a tinted water surface, with depth-graded colour and a pointer ripple.\",\n    tags: [\"caustics\", \"water\", \"underwater\", \"ripple\", \"cellular\", \"light\", \"background\"],\n    scene: \"caustics\",\n    defaultPostPreset: \"none\",\n    controls: causticsControls,\n  },\n  {\n    id: \"ribbon\",\n    label: \"Flowing ribbon\",\n    description:\n      \"A silky satin ribbon sweeps and folds across the frame, catching shifting palette colours with an iridescent specular sheen on a light ground.\",\n    tags: [\"ribbon\", \"satin\", \"iridescent\", \"elegant\", \"light\", \"hero\", \"background\"],\n    scene: \"ribbon\",\n    defaultPostPreset: \"none\",\n    controls: ribbonControls,\n  },\n  {\n    id: \"concentric\",\n    label: \"Concentric\",\n    description:\n      \"Concentric rings ripple outward from a centre with soft moiré interference and a gentle pulse. The centre can follow the cursor.\",\n    tags: [\"rings\", \"ripple\", \"moire\", \"radial\", \"hypnotic\", \"background\"],\n    scene: \"concentric\",\n    defaultPostPreset: \"none\",\n    controls: concentricControls,\n  },\n  {\n    id: \"vortex\",\n    label: \"Deep vortex\",\n    description:\n      \"A dark radial vortex of spiralling streaks pulling into a deep centre, dusted with starfield sparkle. Brooding and atmospheric.\",\n    tags: [\"vortex\", \"spiral\", \"dark\", \"cosmic\", \"radial\", \"atmospheric\", \"background\"],\n    scene: \"vortex\",\n    defaultPostPreset: \"none\",\n    controls: vortexControls,\n  },\n  {\n    id: \"spectral\",\n    label: \"Spectral bloom\",\n    description:\n      \"A kaleidoscopic radial spectrum burst — petals of shifting spectrum colour bloom from a cursor-driven centre over a dark ground.\",\n    tags: [\"radial\", \"spectrum\", \"kaleidoscope\", \"bloom\", \"luminous\", \"background\"],\n    scene: \"spectral\",\n    defaultPostPreset: \"none\",\n    controls: spectralControls,\n  },\n  {\n    id: \"halftone\",\n    label: \"Halftone pop\",\n    description:\n      \"A bold pop-art halftone field — a palette gradient resolved into a rotated grid of luminance-sized print dots, with a diagonal sweep and mouse swell.\",\n    tags: [\"halftone\", \"pop-art\", \"retro\", \"print\", \"dots\", \"gradient\", \"background\"],\n    scene: \"halftone\",\n    defaultPostPreset: \"none\",\n    controls: halftoneControls,\n  },\n  {\n    id: \"digital\",\n    label: \"Digital grid\",\n    description:\n      \"A techy data-activity field — a grid of cells lighting up in travelling waves with scanning pulses, a glowing ring, and a mouse spotlight on a near-black ground.\",\n    tags: [\"grid\", \"digital\", \"data\", \"techy\", \"scanline\", \"glow\", \"background\"],\n    scene: \"digital\",\n    defaultPostPreset: \"none\",\n    controls: digitalControls,\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","\"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  PostPreset,\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/**\n * Theme-friendly default palette — reads the BRAND POP slots\n * (`--brand-1..3`, vivid by construction) rather than primary/secondary,\n * which themes often deliberately mute. This is why an unconfigured shader\n * now pops AND tracks the project's brand: the pops are theme-derived (and\n * Branding-overridable, STUDIO-BRANDING.md). The hex fallbacks in the\n * var() cover the no-theme case. Consumers can still pass an explicit\n * `palette` per tile. */\nconst DEFAULT_PALETTE: Palette = {\n  primary: \"oklch(var(--brand-1, 0.62 0.20 20))\",\n  secondary: \"oklch(var(--brand-2, 0.70 0.16 200))\",\n  accent: \"oklch(var(--brand-3, 0.78 0.17 90))\",\n  background: \"oklch(var(--background, 0.12 0.01 265))\",\n};\n\n/**\n * Tone — pin the shader's canvas independently of the page theme.\n *\n * `\"auto\"` (default) follows `--background`, so a shader on a page\n * re-tints with light/dark mode. But a film frame or a hero with white\n * type wants a STABLE ground: in light mode `--background` is near-white\n * and every wash goes pastel under it. `tone=\"dark\"` / `tone=\"light\"`\n * pins just the background uniform (brand pops still flow through), and\n * an explicit `palette.background` always wins over both.\n */\nexport type SceneTone = \"auto\" | \"dark\" | \"light\";\nconst TONE_BACKGROUNDS: Record<Exclude<SceneTone, \"auto\">, string> = {\n  dark: \"oklch(0.13 0.015 265)\",\n  light: \"oklch(0.97 0.005 265)\",\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    Omit<React.HTMLAttributes<HTMLDivElement>, keyof BaseMediaProps> {\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. Either a registry id (`\"vhs\"`) OR a full `PostPreset`\n   *  object — pass an object (e.g. from `postStateToPreset`) to drive the\n   *  stack live from a controls panel; changes are applied via the\n   *  composer's `setPreset` WITHOUT remounting WebGL. Defaults to the\n   *  base preset's `defaultPostPreset` or \"vhs\". */\n  postPreset?: string | PostPreset;\n  /** Palette overrides. Unset slots fall back to `DEFAULT_PALETTE`. */\n  palette?: Partial<Palette>;\n  /** Pin the canvas tone regardless of page theme (see `SceneTone`).\n   *  An explicit `palette.background` wins over this. */\n  tone?: SceneTone;\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   * Controlled play/pause. When provided, pauses/resumes the render loop\n   * WITHOUT remounting the WebGL context (unlike `autoPlay`, which only\n   * sets the initial state and remounts on change). Use for \"animate on\n   * hover\" thumbnails. Reduced-motion still forces paused.\n   */\n  play?: boolean;\n  /**\n   * Release the WebGL context entirely while the scene is scrolled out of\n   * view (and rebuild it when it returns), instead of merely pausing the\n   * render loop. A live `WebGLRenderer` holds a real GL context for its\n   * whole lifetime, and browsers cap simultaneous contexts (~16 Chrome,\n   * ~8 Safari) — so a gallery of many `ThreeScene`s blows the budget and\n   * the browser silently evicts the OLDEST (those cards go blank with a\n   * \"Context Lost\" log). Galleries / thumbnail grids should set this so\n   * only the on-screen scenes hold a context; a global budget (below) caps\n   * the live total. Default `false` — single hero shaders keep their context.\n   */\n  releaseOffscreen?: boolean;\n}\n\n// ── Global WebGL context budget ────────────────────────────────────────\n// Browsers hard-cap the number of simultaneously-live WebGL contexts (~16\n// Chrome, ~8 Safari) and, when exceeded, silently evict the OLDEST context\n// (logging \"THREE.WebGLRenderer: Context Lost\") — which on a gallery page\n// blanks whatever rendered first. A single page can stack several shader\n// galleries whose on-screen cards together breach that cap (e.g. two preset\n// pickers, each a full grid that fits in the viewport at once).\n//\n// So we run our own budget. Scenes with `releaseOffscreen` register when\n// they enter the viewport; we grant a live context to the N most-recently-\n// seen and deny the rest. Eviction is therefore deterministic — the least-\n// recently-visible scene loses its context, never the card the user just\n// scrolled to — and the live total never reaches the browser's hard limit,\n// so the ungraceful browser-side eviction never fires. Kept comfortably\n// under the Chrome cap to leave room for non-gallery scenes on the page.\nconst MAX_LIVE_CONTEXTS = 12;\ntype BudgetEntry = { touched: number; setGranted: (g: boolean) => void };\nconst budgetEntries = new Set<BudgetEntry>();\nlet budgetSeq = 0;\nfunction enforceBudget() {\n  const sorted = [...budgetEntries].sort((a, b) => b.touched - a.touched);\n  sorted.forEach((e, i) => e.setGranted(i < MAX_LIVE_CONTEXTS));\n}\nfunction budgetAcquire(e: BudgetEntry) {\n  e.touched = ++budgetSeq;\n  budgetEntries.add(e);\n  enforceBudget();\n}\nfunction budgetRelease(e: BudgetEntry) {\n  if (budgetEntries.delete(e)) enforceBudget();\n}\n\nexport const ThreeScene = React.forwardRef<HTMLDivElement, ThreeSceneProps>(\n  (\n    {\n      preset,\n      fragmentShader,\n      onShaderError,\n      postPreset,\n      palette: paletteProp,\n      tone = \"auto\",\n      createScene: createSceneProp,\n      controls = false,\n      autoPlay = true,\n      play,\n      pauseOffscreen = true,\n      releaseOffscreen = false,\n      aspect = \"video\",\n      radius = \"lg\",\n      border = false,\n      poster,\n      label,\n      className,\n      style,\n      maxDpr,\n      ...rest\n    },\n    ref,\n  ) => {\n    const hostRef = React.useRef<HTMLDivElement | null>(null);\n    const [playing, setPlaying] = React.useState(play ?? autoPlay);\n    const [ready, setReady] = React.useState(false);\n    const reduced = usePrefersReducedMotion();\n\n    // Context-budget gate. When `releaseOffscreen` is on, the WebGL context\n    // is only built while the host is on-screen AND granted by the global\n    // budget (above). Scenes without `releaseOffscreen` are always in/granted.\n    const [inView, setInView] = React.useState(!releaseOffscreen);\n    const [granted, setGranted] = React.useState(!releaseOffscreen);\n    const budgetRef = React.useRef<BudgetEntry | null>(null);\n    React.useEffect(() => {\n      if (!releaseOffscreen) {\n        setGranted(true);\n        return;\n      }\n      const entry: BudgetEntry = { touched: 0, setGranted };\n      budgetRef.current = entry;\n      return () => {\n        budgetRelease(entry);\n        budgetRef.current = null;\n      };\n    }, [releaseOffscreen]);\n    // Acquire/release the budget slot as the scene enters/leaves the viewport.\n    React.useEffect(() => {\n      if (!releaseOffscreen) return;\n      const entry = budgetRef.current;\n      if (!entry) return;\n      if (inView) budgetAcquire(entry);\n      else budgetRelease(entry);\n    }, [inView, releaseOffscreen]);\n\n    React.useEffect(() => {\n      if (!releaseOffscreen) {\n        setInView(true);\n        return;\n      }\n      const host = hostRef.current;\n      if (!host) return;\n      const io = new IntersectionObserver(\n        ([entry]) => setInView(entry.isIntersecting),\n        // No pre-warm margin: only scenes actually in the viewport hold a GL\n        // context. A page can stack several galleries (e.g. two pickers), and\n        // a pre-warm band lets the tail of one plus the head of the next both\n        // stay live at the scroll boundary — enough to breach the browser's\n        // simultaneous-context cap. Bounding the live set to what's truly\n        // visible (plus the budget cap) keeps it under the cap everywhere.\n        { rootMargin: \"0px\", threshold: 0 },\n      );\n      io.observe(host);\n      return () => io.disconnect();\n    }, [releaseOffscreen]);\n\n    // Merge palette prop with defaults. Tone pins the background slot\n    // unless the consumer set palette.background explicitly.\n    const palette = React.useMemo<Palette>(() => {\n      const merged = { ...DEFAULT_PALETTE, ...paletteProp };\n      if (tone !== \"auto\" && !paletteProp?.background) {\n        merged.background = TONE_BACKGROUNDS[tone];\n      }\n      return merged;\n    }, [paletteProp, tone]);\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 the post-FX preset to a concrete PostPreset object. A\n    // string is looked up in the registry; an object is used as-is (the\n    // live-driven path). Falls back to the base preset's default, then\n    // the global default.\n    const resolvedPost = React.useMemo<PostPreset>(() => {\n      if (postPreset && typeof postPreset === \"object\") return postPreset;\n      const id =\n        typeof postPreset === \"string\"\n          ? postPreset\n          : (preset ? shaderPresetById[preset]?.defaultPostPreset : undefined) ??\n            defaultPostPreset;\n      return postPresets[id] ?? postPresets[defaultPostPreset];\n    }, [postPreset, preset]);\n\n    // Ref mirror so the build effect reads the CURRENT post object for\n    // its initial composer without depending on `resolvedPost` (which\n    // would remount WebGL on every slider tweak). Ongoing changes flow\n    // through the live effect below via the composer's `setPreset`.\n    const resolvedPostRef = React.useRef(resolvedPost);\n    resolvedPostRef.current = resolvedPost;\n\n    // Palette identity guard — consumers (and especially model-generated\n    // JSX) pass `palette={{ … }}` INLINE, a fresh object on every parent\n    // render. With the raw object in the build effect's dep list, every\n    // re-render of the host app remounted the ENTIRE WebGL pipeline\n    // (renderer dispose + recreate = a visible black flash). A page with\n    // a 3s setInterval flashed all of its shader fills every 3 seconds.\n    // Key the effect on the palette's VALUE (serialized) and read the\n    // live object through a ref; real palette changes still remount.\n    // Same treatment for onShaderError — an inline callback identity\n    // must not churn WebGL either.\n    const paletteRef = React.useRef(palette);\n    paletteRef.current = palette;\n    const paletteSig = React.useMemo(\n      () => JSON.stringify(palette ?? null),\n      [palette],\n    );\n    const onShaderErrorRef = React.useRef(onShaderError);\n    onShaderErrorRef.current = onShaderError;\n\n    React.useEffect(() => {\n      const host = hostRef.current;\n      if (!host || !resolvedFactory) return;\n      // Context budget: when releaseOffscreen is on, don't hold a GL context\n      // while scrolled away or denied by the budget — the cleanup below\n      // disposes it, and re-entering the viewport (and regaining a grant)\n      // re-runs this effect to rebuild.\n      if (releaseOffscreen && (!inView || !granted)) {\n        setReady(false);\n        return;\n      }\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      // Read via ref — the effect is keyed on paletteSig (value), not the\n      // object identity. See the guard above the effect.\n      const livePalette = resolvePalette(paletteRef.current, 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          onShaderErrorRef.current?.(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 = resolvedPostRef.current;\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 = (play ?? 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      // Always paint ONE frame, even when not auto-playing, so a paused\n      // scene shows a static still (preset thumbnails rely on this) rather\n      // than a blank surface. The raf loop only continues while `running`.\n      handle.update?.(0, 0);\n      post.composer.render(0);\n      setReady(true);\n      tick();\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        // When PAUSED (thumbnail, autoPlay=false, or reduced-motion) the\n        // raf loop isn't running, so the one-shot mount frame can land at\n        // 0×0 before layout and stay blank. Re-paint the still frame on\n        // every resize so a paused scene always shows correct content.\n        if (!running) {\n          handle.update?.(clock.getElapsedTime(), 0);\n          post.composer.render(0);\n        }\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(paletteRef.current, 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        setRunning: (next: boolean) => {\n          // Pause/resume WITHOUT remounting (the raf loop stays alive and\n          // just skips rendering while paused). Reduced-motion always wins.\n          running = next && !reduced;\n          setPlaying(running);\n        },\n        setPalette: (p: Palette) => {\n          renderer.setClearColor(new THREE.Color(p.background), 1);\n          handle.setPalette?.(p);\n        },\n        setPostPreset: (p: string | PostPreset) => {\n          const next = typeof p === \"string\" ? postPresets[p] : p;\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-VALUE/post-preset changes remount the whole thing\n      // (simpler than rebuilding in place, and real palette changes are\n      // rare enough that it's fine). Identity-only churn must NOT remount\n      // — see the paletteSig/onShaderErrorRef guard above the effect.\n      // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [\n      resolvedFactory,\n      paletteSig,\n      autoPlay,\n      reduced,\n      pauseOffscreen,\n      releaseOffscreen,\n      inView,\n      granted,\n      maxDpr,\n    ]);\n\n    const liveRef = React.useRef<{\n      toggle: () => void;\n      setRunning: (next: boolean) => void;\n      setPalette: (p: Palette) => void;\n      setPostPreset: (p: string | PostPreset) => void;\n    } | null>(null);\n\n    // Live post-FX updates — push the resolved post object through the\n    // composer's setPreset on change, no remount. No-op until the build\n    // effect has wired liveRef.\n    React.useEffect(() => {\n      liveRef.current?.setPostPreset(resolvedPost);\n    }, [resolvedPost]);\n\n    // Controlled play/pause — pause/resume WITHOUT remounting (used by\n    // preset thumbnails to animate on hover without a context churn). Only\n    // active when `play` is explicitly controlled.\n    React.useEffect(() => {\n      if (play !== undefined) liveRef.current?.setRunning(play);\n    }, [play]);\n\n    const togglePlay = () => liveRef.current?.toggle();\n\n    return (\n      <MediaSurface\n        {...rest}\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 iconOnly 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","/**\n * Control schema — the canonical, UI-agnostic descriptor for a shader's\n * (or effect layer's) tweakable parameters. Shared by base demos AND the\n * universal post stack, so a single `<ShaderControls schema={...} />`\n * renders any of them.\n *\n * Ported from the three-lab experiments (the proven shape) and extended\n * with two controls from the Paper reference — `segmented` and\n * `colorList` (Paper's colorCount) — plus an optional palette-slot\n * binding on `color` (the \"Line colour → accent\" affordance).\n *\n * Kept free of three.js / React imports so post-stack.ts and any other\n * renderer can depend on it without a circular import.\n */\n\n/** Global palette slots a colour control can bind to. */\nexport type PaletteSlot = \"primary\" | \"secondary\" | \"accent\" | \"background\";\n\nexport type NumberControl = {\n  type: \"slider\";\n  key: string;\n  label: string;\n  min: number;\n  max: number;\n  step: number;\n  default: number;\n  /** Display unit appended in the readout (e.g. \"px\", \"°\", \"%\"). */\n  unit?: string;\n  /** Readout normalisation. \"percent\" shows the value as 0–100% of its\n   *  [min,max] range (the slider still drives the real value) — for the\n   *  abstract 0.3753-style knobs where a percentage reads far clearer.\n   *  Omit for the raw number. A panel-level `format` setting can opt every\n   *  eligible slider into percent without per-control flags. */\n  display?: \"percent\";\n};\n\nexport type ColorControl = {\n  type: \"color\";\n  key: string;\n  label: string;\n  default: string;\n  /** When set, the control FOLLOWS this palette slot (re-tints with the\n   *  theme, shows a \"→ accent\" affordance) until the user overrides it. */\n  slot?: PaletteSlot;\n};\n\n/** A variable-length list of colours — Paper's colorCount + swatches. */\nexport type ColorListControl = {\n  type: \"colorList\";\n  key: string;\n  label: string;\n  default: string[];\n  /** Min / max swatches the user can add. */\n  min?: number;\n  max?: number;\n};\n\nexport type ToggleControl = {\n  type: \"toggle\";\n  key: string;\n  label: string;\n  default: boolean;\n};\n\nexport type SelectControl = {\n  type: \"select\";\n  key: string;\n  label: string;\n  options: ReadonlyArray<{ value: string; label: string }>;\n  default: string;\n};\n\n/** Same data as a select, rendered as a segmented toggle (≤4 options). */\nexport type SegmentedControl = {\n  type: \"segmented\";\n  key: string;\n  label: string;\n  options: ReadonlyArray<{ value: string; label: string }>;\n  default: string;\n};\n\nexport type DividerControl = {\n  type: \"divider\";\n  key: string;\n  /** Optional section heading above the divider line. */\n  label?: string;\n};\n\nexport type ControlSpec =\n  | NumberControl\n  | ColorControl\n  | ColorListControl\n  | ToggleControl\n  | SelectControl\n  | SegmentedControl\n  | DividerControl;\n\n/** A flat bag of current values, keyed by ControlSpec.key. */\nexport type DemoState = Record<string, number | string | boolean | string[]>;\n\n/** Build the default state object from a control schema. */\nexport function defaultsOf(controls: readonly ControlSpec[]): DemoState {\n  const out: DemoState = {};\n  for (const c of controls) {\n    if (c.type === \"divider\") continue;\n    out[c.key] = c.default;\n  }\n  return out;\n}\n\n// Typed getters with fallbacks. Renderer code reads state via these.\nexport function getNum(s: DemoState, k: string, d: number): number {\n  const v = s[k];\n  return typeof v === \"number\" ? v : d;\n}\nexport function getStr(s: DemoState, k: string, d: string): string {\n  const v = s[k];\n  return typeof v === \"string\" ? v : d;\n}\nexport function getBool(s: DemoState, k: string, d: boolean): boolean {\n  const v = s[k];\n  return typeof v === \"boolean\" ? v : d;\n}\nexport function getColors(s: DemoState, k: string, d: string[]): string[] {\n  const v = s[k];\n  return Array.isArray(v) ? v : d;\n}\n","\"use client\";\n\n/**\n * ShaderControls — renders a `ControlSpec[]` schema into a DS-native control\n * panel. The single renderer behind every shader's params, the universal\n * post stack, and any effect layer (they all describe themselves as\n * ControlSpec[]).\n *\n * DS-consistent by construction: it composes the design-system primitives at\n * tool-panel density (Label size=\"xs\", Slider size=\"sm\", Input size=\"2xs\"\n * variant=\"ghost\", ToggleGroup size=\"sm\", Select size=\"xs\", Switch) — no\n * bespoke markup, so it reads identically to the Studio inspector and the\n * homepage tweaker.\n *\n * `labelPosition` switches between the dense inline layout (label left,\n * control + value right) and label-above (label + value on top, control\n * below). Controlled: parent owns `DemoState`, gets `onChange(key, value)`.\n */\n\nimport * as React from \"react\";\nimport { Minus, Plus } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { Label } from \"@/components/ui/label\";\nimport { Input } from \"@/components/ui/input\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { Slider } from \"@/components/ui/slider\";\nimport { ToggleGroup, ToggleGroupItem } from \"@/components/ui/toggle-group\";\nimport { Swatch } from \"@/components/ui/swatch\";\nimport {\n  Select,\n  SelectContent,\n  SelectItem,\n  SelectTrigger,\n  SelectValue,\n} from \"@/components/ui/select\";\nimport {\n  getBool,\n  getColors,\n  getNum,\n  getStr,\n  type ControlSpec,\n  type DemoState,\n} from \"@/lib/three/schema\";\n\nexport type ControlLabelPosition = \"inline\" | \"above\";\n\nexport interface ShaderControlsProps {\n  controls: readonly ControlSpec[];\n  state: DemoState;\n  onChange: (key: string, value: number | string | boolean | string[]) => void;\n  disabled?: boolean;\n  /** Label placement: dense inline (default) or stacked above the control. */\n  labelPosition?: ControlLabelPosition;\n  /** Number-readout format. \"percent\" normalises every eligible slider (no\n   *  unit, fractional step, non-negative range) to 0–100%, killing the\n   *  abstract 0.3753 readouts. A control's own `display: \"percent\"` always\n   *  wins. Default \"raw\". */\n  format?: \"raw\" | \"percent\";\n  className?: string;\n}\n\n/** Whether a slider should read as a percentage. */\nfunction isPercent(\n  c: Extract<ControlSpec, { type: \"slider\" }>,\n  format: \"raw\" | \"percent\",\n): boolean {\n  if (c.display === \"percent\") return true;\n  return format === \"percent\" && !c.unit && c.step < 1 && c.min >= 0;\n}\n\nexport function ShaderControls({\n  controls,\n  state,\n  onChange,\n  disabled,\n  labelPosition = \"inline\",\n  format = \"raw\",\n  className,\n}: ShaderControlsProps) {\n  return (\n    <div\n      className={cn(\n        \"flex flex-col\",\n        labelPosition === \"above\" ? \"gap-2.5\" : \"gap-1\",\n        className,\n      )}\n    >\n      {controls.map((c) => {\n        if (c.type === \"divider\") {\n          return (\n            <div key={c.key} className=\"mt-2 mb-0.5 first:mt-0\">\n              {c.label ? (\n                <span className=\"text-[11px] font-medium text-foreground/70\">\n                  {c.label}\n                </span>\n              ) : null}\n            </div>\n          );\n        }\n\n        if (c.type === \"slider\") {\n          const value = getNum(state, c.key, c.default);\n          return (\n            <Row\n              key={c.key}\n              labelPosition={labelPosition}\n              label={c.label}\n              value={\n                <NumberValue\n                  spec={c}\n                  value={value}\n                  percent={isPercent(c, format)}\n                  disabled={disabled}\n                  onChange={(v) => onChange(c.key, v)}\n                />\n              }\n              control={\n                <Slider\n                  size=\"sm\"\n                  className=\"flex-1\"\n                  value={[value]}\n                  min={c.min}\n                  max={c.max}\n                  step={c.step}\n                  disabled={disabled}\n                  aria-label={c.label}\n                  onValueChange={(v) =>\n                    onChange(\n                      c.key,\n                      Math.min(c.max, Math.max(c.min, v[0] ?? c.default)),\n                    )\n                  }\n                />\n              }\n            />\n          );\n        }\n\n        if (c.type === \"segmented\") {\n          const v = getStr(state, c.key, c.default);\n          return (\n            <Row\n              key={c.key}\n              labelPosition={labelPosition}\n              label={c.label}\n              control={\n                <ToggleGroup\n                  type=\"single\"\n                  variant=\"segmented\"\n                  size=\"2xs\"\n                  value={v}\n                  disabled={disabled}\n                  onValueChange={(next) => next && onChange(c.key, next)}\n                  className={labelPosition === \"above\" ? \"w-full\" : \"\"}\n                >\n                  {c.options.map((o) => (\n                    <ToggleGroupItem\n                      key={o.value}\n                      value={o.value}\n                      className=\"px-2.5 text-[11px] font-medium\"\n                    >\n                      {o.label}\n                    </ToggleGroupItem>\n                  ))}\n                </ToggleGroup>\n              }\n            />\n          );\n        }\n\n        if (c.type === \"select\") {\n          const v = getStr(state, c.key, c.default);\n          return (\n            <Row\n              key={c.key}\n              labelPosition={labelPosition}\n              label={c.label}\n              control={\n                <Select\n                  value={v}\n                  onValueChange={(next) => onChange(c.key, next)}\n                  disabled={disabled}\n                >\n                  <SelectTrigger\n                    size=\"xs\"\n                    className={labelPosition === \"above\" ? \"w-full\" : \"w-auto\"}\n                  >\n                    <SelectValue />\n                  </SelectTrigger>\n                  <SelectContent size=\"xs\">\n                    {c.options.map((o) => (\n                      <SelectItem key={o.value} value={o.value}>\n                        {o.label}\n                      </SelectItem>\n                    ))}\n                  </SelectContent>\n                </Select>\n              }\n            />\n          );\n        }\n\n        if (c.type === \"toggle\") {\n          const v = getBool(state, c.key, c.default);\n          return (\n            <Row\n              key={c.key}\n              labelPosition={labelPosition}\n              label={c.label}\n              control={\n                <Switch\n                  checked={v}\n                  onCheckedChange={(next) => onChange(c.key, next)}\n                  disabled={disabled}\n                />\n              }\n            />\n          );\n        }\n\n        if (c.type === \"color\") {\n          const v = getStr(state, c.key, c.default);\n          return (\n            <Row\n              key={c.key}\n              labelPosition={labelPosition}\n              label={c.label}\n              hint={c.slot}\n              control={\n                <ColorField\n                  value={v}\n                  disabled={disabled}\n                  onChange={(next) => onChange(c.key, next)}\n                />\n              }\n            />\n          );\n        }\n\n        // colorList\n        const colors = getColors(state, c.key, c.default);\n        return (\n          <ColorListField\n            key={c.key}\n            spec={c}\n            value={colors}\n            disabled={disabled}\n            onChange={(next) => onChange(c.key, next)}\n          />\n        );\n      })}\n    </div>\n  );\n}\n\n/** Lays a label + control (+ optional value readout) inline or stacked. */\nfunction Row({\n  labelPosition,\n  label,\n  hint,\n  control,\n  value,\n}: {\n  labelPosition: ControlLabelPosition;\n  label: string;\n  hint?: string;\n  control: React.ReactNode;\n  value?: React.ReactNode;\n}) {\n  const lab = (\n    <Label\n      size=\"xs\"\n      className={cn(\n        \"text-muted-foreground\",\n        labelPosition === \"inline\" && \"w-24 shrink-0 truncate\",\n      )}\n    >\n      {label}\n      {hint ? (\n        <span className=\"ml-1.5 text-[10px] text-muted-foreground/50\">\n          {hint}\n        </span>\n      ) : null}\n    </Label>\n  );\n\n  if (labelPosition === \"above\") {\n    return (\n      <div className=\"space-y-1\">\n        <div className=\"flex items-baseline justify-between gap-2\">\n          {lab}\n          {value}\n        </div>\n        {control}\n      </div>\n    );\n  }\n\n  return (\n    <div className=\"flex items-center gap-2\">\n      {lab}\n      <div className=\"flex min-w-0 flex-1 items-center justify-end gap-2\">\n        {control}\n        {value}\n      </div>\n    </div>\n  );\n}\n\n/** Borderless DS number field (Input 2xs ghost) + optional unit. */\nfunction NumberValue({\n  spec,\n  value,\n  percent,\n  disabled,\n  onChange,\n}: {\n  spec: Extract<ControlSpec, { type: \"slider\" }>;\n  value: number;\n  percent?: boolean;\n  disabled?: boolean;\n  onChange: (v: number) => void;\n}) {\n  const span = spec.max - spec.min || 1;\n  const decimals = spec.step < 1 ? (spec.step < 0.1 ? 3 : 2) : 0;\n  const clamp = (n: number) => Math.min(spec.max, Math.max(spec.min, n));\n  // Display: percent normalises to 0–100% of the range; raw shows the value.\n  const toDisplay = (v: number) =>\n    percent\n      ? String(Math.round(((v - spec.min) / span) * 100))\n      : v.toFixed(decimals);\n  // Edit: a typed percent maps back to the real value, then snaps to step.\n  const fromInput = (raw: string): number | null => {\n    let n = Number(raw.replace(\"%\", \"\"));\n    if (!Number.isFinite(n)) return null;\n    if (percent) n = spec.min + (n / 100) * span;\n    return clamp(Math.round(n / spec.step) * spec.step);\n  };\n  const unit = percent ? \"%\" : spec.unit;\n  const [draft, setDraft] = React.useState<string | null>(null);\n  const display = draft ?? toDisplay(value);\n  const commit = (raw: string) => {\n    const n = fromInput(raw);\n    if (n !== null) onChange(n);\n    setDraft(null);\n  };\n  return (\n    <div className=\"flex w-14 shrink-0 items-center justify-end gap-0.5\">\n      <Input\n        size=\"2xs\"\n        variant=\"ghost\"\n        inputMode=\"decimal\"\n        aria-label={spec.label}\n        className=\"w-full px-0 text-right tabular-nums\"\n        value={display}\n        disabled={disabled}\n        onChange={(e) => setDraft(e.currentTarget.value)}\n        onBlur={(e) => commit(e.currentTarget.value)}\n        onKeyDown={(e) => {\n          if (e.key === \"Enter\") commit(e.currentTarget.value);\n        }}\n      />\n      {unit ? (\n        <span className=\"text-[9px] text-muted-foreground/50\">{unit}</span>\n      ) : null}\n    </div>\n  );\n}\n\n/** Borderless DS hex field + the editable DS Swatch (native OS picker\n *  lives inside Swatch). Value first so its right-aligned digits sit\n *  directly against the chip — no dead gap. No hand-rolled colour square. */\nfunction ColorField({\n  value,\n  disabled,\n  onChange,\n}: {\n  value: string;\n  disabled?: boolean;\n  onChange: (v: string) => void;\n}) {\n  return (\n    <div className=\"flex items-center gap-1.5\">\n      <Input\n        size=\"2xs\"\n        variant=\"ghost\"\n        value={value}\n        disabled={disabled}\n        onChange={(e) => onChange(e.currentTarget.value)}\n        className=\"w-20 px-0 text-right font-mono\"\n        aria-label=\"Colour value\"\n      />\n      <Swatch\n        color={value}\n        size=\"xs\"\n        shape=\"rounded\"\n        onColorChange={disabled ? undefined : onChange}\n        className={disabled ? \"opacity-50\" : undefined}\n      />\n    </div>\n  );\n}\n\n/** Variable-length colour list. */\nfunction ColorListField({\n  spec,\n  value,\n  disabled,\n  onChange,\n}: {\n  spec: Extract<ControlSpec, { type: \"colorList\" }>;\n  value: string[];\n  disabled?: boolean;\n  onChange: (v: string[]) => void;\n}) {\n  const min = spec.min ?? 1;\n  const max = spec.max ?? 8;\n  const setAt = (i: number, c: string) =>\n    onChange(value.map((v, idx) => (idx === i ? c : v)));\n  const add = () =>\n    value.length < max &&\n    onChange([...value, value[value.length - 1] ?? \"#ffffff\"]);\n  const removeAt = (i: number) =>\n    value.length > min && onChange(value.filter((_, idx) => idx !== i));\n\n  return (\n    <div>\n      <div className=\"flex items-center gap-2\">\n        <Label size=\"xs\" className=\"w-24 shrink-0 truncate text-muted-foreground\">\n          {spec.label}\n        </Label>\n        <div className=\"flex flex-1 justify-end\">\n          <button\n            type=\"button\"\n            onClick={add}\n            disabled={disabled || value.length >= max}\n            aria-label=\"Add colour\"\n            className=\"inline-flex h-5 w-5 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground disabled:opacity-40 [&_svg]:size-3.5\"\n          >\n            <Plus />\n          </button>\n        </div>\n      </div>\n      <div className=\"mt-1 space-y-1 pl-24\">\n        {value.map((c, i) => (\n          <div key={i} className=\"flex items-center justify-end gap-1.5\">\n            <ColorField\n              value={c}\n              disabled={disabled}\n              onChange={(next) => setAt(i, next)}\n            />\n            <button\n              type=\"button\"\n              onClick={() => removeAt(i)}\n              disabled={disabled || value.length <= min}\n              aria-label=\"Remove colour\"\n              className=\"inline-flex h-6 w-5 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground disabled:opacity-40 [&_svg]:size-3.5\"\n            >\n              <Minus />\n            </button>\n          </div>\n        ))}\n      </div>\n    </div>\n  );\n}\n","\"use client\";\n\n/**\n * BackgroundFill — a frame's background *paint*, as a layer.\n *\n * This is the render boundary for the \"fill\" model: a generative\n * background (shader), an image, a video, a gradient, a repeating\n * texture, or a solid token is NEVER a free-standing selectable node.\n * It is a paint that belongs to a frame, exactly like a fill in Figma /\n * Paper. The frame is the thing you select; this layer is plumbing.\n *\n * Drop it as the FIRST child of a `relative` frame. It paints an\n * `absolute inset-0`, `z-0`, `pointer-events-none` layer behind the\n * frame's content — so siblings that carry `relative z-10` (or any\n * positioned/z-indexed content) sit on top automatically. It is marked\n * `data-gds-part=\"frame-fill\"` + `aria-hidden` so Studio treats it as\n * chrome (not separately selectable) and a11y trees skip it.\n *\n * The `type` switch picks what gets painted:\n *   none     → renders nothing\n *   solid    → a theme token (or any CSS colour)\n *   gradient → a linear-gradient from from/via/to stops\n *   image    → an <img> (object-fit) or a tiled background (repeat)\n *   video    → a muted, looping, autoplaying <video>\n *   shader   → a <ThreeScene> generative shader (preset or GLSL)\n *\n * Common controls — `opacity` and `blendMode` — apply to every type,\n * mirroring the inspector's Blending section.\n */\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\nimport { ThreeScene, type SceneTone } from \"./three-scene\";\nimport type { Palette, PostPreset } from \"@/lib/three/types\";\nimport type { MediaRadius } from \"./media-surface\";\n\nexport type BackgroundFillType =\n  | \"none\"\n  | \"solid\"\n  | \"gradient\"\n  | \"image\"\n  | \"video\"\n  | \"shader\";\n\nexport type BackgroundFillFit = \"cover\" | \"contain\" | \"fill\" | \"none\";\n\n/** Solid-fill tokens — kept in step with the inspector's FILL_COLOR_TOKENS. */\nconst TOKEN_COLORS: Record<string, string> = {\n  background: \"oklch(var(--background))\",\n  card: \"oklch(var(--card))\",\n  muted: \"oklch(var(--muted))\",\n  secondary: \"oklch(var(--secondary))\",\n  accent: \"oklch(var(--accent))\",\n  primary: \"oklch(var(--primary))\",\n  destructive: \"oklch(var(--destructive))\",\n  transparent: \"transparent\",\n};\n\n/** Resolve a colour value: a known token name → `oklch(var(--token))`,\n *  anything else (hex / rgb / oklch / named) passes through untouched. */\nfunction resolveColor(value?: string): string | undefined {\n  if (!value) return undefined;\n  return TOKEN_COLORS[value] ?? value;\n}\n\nconst radiusClass: Record<MediaRadius, string> = {\n  none: \"rounded-none\",\n  sm: \"rounded-sm\",\n  md: \"rounded-md\",\n  lg: \"rounded-lg\",\n  xl: \"rounded-xl\",\n};\n\nconst objectFitClass: Record<BackgroundFillFit, string> = {\n  cover: \"object-cover\",\n  contain: \"object-contain\",\n  fill: \"object-fill\",\n  none: \"object-none\",\n};\n\nexport interface BackgroundFillProps {\n  /** Which paint to render. */\n  type: BackgroundFillType;\n\n  // ── solid ──────────────────────────────────────────────────────────\n  /** Token name (`primary`, `card`, …) or any CSS colour. */\n  color?: string;\n\n  // ── gradient ───────────────────────────────────────────────────────\n  /** Gradient stops — token names or CSS colours. `shape: \"radial\"`\n   *  swaps the linear paint for a radial wash (the classic \"soft glow\n   *  behind the hero\"); `at` positions its centre, `size` fixes the\n   *  ellipse (e.g. \"45rem 50rem\" — defaults to farthest-corner).\n   *  `angle` is linear-only; `at`/`size` are radial-only. */\n  gradient?: {\n    from?: string;\n    via?: string;\n    to?: string;\n    angle?: number;\n    shape?: \"linear\" | \"radial\";\n    at?: string;\n    size?: string;\n  };\n\n  // ── image / video ──────────────────────────────────────────────────\n  /** Image or video URL. */\n  src?: string;\n  /** object-fit for image / video. Default `cover`. */\n  fit?: BackgroundFillFit;\n  /** CSS object-position / background-position. Default `center`. */\n  position?: string;\n  /** Tile the image (uses background-image + repeat instead of <img>). */\n  repeat?: boolean;\n  /** Tile size when `repeat` (CSS background-size, e.g. \"120px\"). */\n  tileSize?: string;\n\n  // ── shader ─────────────────────────────────────────────────────────\n  /** Shader preset id (see ThreeScene). */\n  preset?: string;\n  /** Custom GLSL fragment shader (takes precedence over preset). */\n  fragmentShader?: string;\n  /** Palette overrides for the shader. */\n  palette?: Partial<Palette>;\n  /** Pin the shader's canvas tone — \"dark\" | \"light\" | \"auto\" (default).\n   *  Film frames and heroes with fixed-colour type should pin their tone\n   *  rather than inherit the page's light/dark mode (in light mode the\n   *  theme background washes every shader pastel). See ThreeScene. */\n  tone?: SceneTone;\n  /** Post-FX preset id or live PostPreset object. */\n  postPreset?: string | PostPreset;\n\n  // ── common ─────────────────────────────────────────────────────────\n  /** Layer opacity (0–1). */\n  opacity?: number;\n  /** CSS mix-blend-mode against the frame behind it. */\n  blendMode?: React.CSSProperties[\"mixBlendMode\"];\n  /** Corner radius — match the frame's so the paint clips cleanly. */\n  radius?: MediaRadius;\n  className?: string;\n  style?: React.CSSProperties;\n}\n\nexport const BackgroundFill = React.forwardRef<\n  HTMLDivElement,\n  BackgroundFillProps\n>(\n  (\n    {\n      type,\n      color,\n      gradient,\n      src,\n      fit = \"cover\",\n      position = \"center\",\n      repeat = false,\n      tileSize,\n      preset,\n      fragmentShader,\n      palette,\n      tone,\n      postPreset,\n      opacity,\n      blendMode,\n      radius = \"none\",\n      className,\n      style,\n    },\n    ref,\n  ) => {\n    if (type === \"none\") return null;\n\n    const layerStyle: React.CSSProperties = {\n      opacity,\n      mixBlendMode: blendMode,\n      ...style,\n    };\n\n    let paint: React.ReactNode = null;\n\n    if (type === \"solid\") {\n      layerStyle.background = resolveColor(color) ?? \"oklch(var(--background))\";\n    } else if (type === \"gradient\") {\n      const stops = [\n        resolveColor(gradient?.from) ?? \"oklch(var(--primary))\",\n        resolveColor(gradient?.via),\n        resolveColor(gradient?.to) ?? \"oklch(var(--accent))\",\n      ].filter(Boolean) as string[];\n      if (gradient?.shape === \"radial\") {\n        // radial-gradient([size ]at position, stops). Size omitted →\n        // farthest-corner, the CSS default — fills the frame softly.\n        const at = gradient.at ?? \"center\";\n        const size = gradient.size ? `${gradient.size} ` : \"\";\n        layerStyle.backgroundImage = `radial-gradient(${size}at ${at}, ${stops.join(\", \")})`;\n      } else {\n        const angle = gradient?.angle ?? 135;\n        layerStyle.backgroundImage = `linear-gradient(${angle}deg, ${stops.join(\", \")})`;\n      }\n    } else if (type === \"image\") {\n      if (repeat && src) {\n        layerStyle.backgroundImage = `url(${src})`;\n        layerStyle.backgroundRepeat = \"repeat\";\n        layerStyle.backgroundPosition = position;\n        if (tileSize) layerStyle.backgroundSize = tileSize;\n      } else if (src) {\n        paint = (\n          // eslint-disable-next-line @next/next/no-img-element\n          <img\n            src={src}\n            alt=\"\"\n            className={cn(\n              \"absolute inset-0 h-full w-full\",\n              objectFitClass[fit],\n            )}\n            style={{ objectPosition: position }}\n          />\n        );\n      }\n    } else if (type === \"video\") {\n      if (src) {\n        paint = (\n          <video\n            src={src}\n            autoPlay\n            muted\n            loop\n            playsInline\n            className={cn(\n              \"absolute inset-0 h-full w-full\",\n              objectFitClass[fit],\n            )}\n            style={{ objectPosition: position }}\n          />\n        );\n      }\n    } else if (type === \"shader\") {\n      paint = (\n        <ThreeScene\n          preset={preset}\n          fragmentShader={fragmentShader}\n          palette={palette}\n          tone={tone}\n          postPreset={postPreset}\n          aspect=\"auto\"\n          radius=\"none\"\n          className=\"absolute inset-0\"\n        />\n      );\n    }\n\n    return (\n      <div\n        ref={ref}\n        data-gds-part=\"frame-fill\"\n        data-gds-fill-type={type}\n        aria-hidden=\"true\"\n        className={cn(\n          \"absolute inset-0 z-0 overflow-hidden pointer-events-none\",\n          radius !== \"none\" && radiusClass[radius],\n          className,\n        )}\n        style={layerStyle}\n      >\n        {paint}\n      </div>\n    );\n  },\n);\nBackgroundFill.displayName = \"BackgroundFill\";\n","\"use client\";\n\n/**\n * ColorPicker — a token-led, grouped, searchable colour picker. The\n * single-select sibling of FillPicker's solid tab: where FillPicker is the\n * full Figma paint popover (solid / gradient / image / …), ColorPicker is\n * the focused \"pick one colour token\" control.\n *\n * Two exports:\n *   - <ColorPickerPanel> — the popover BODY (header + search + grouped\n *     list). Reusable: the inspector's colour fields host it inside their\n *     own TokenField-chrome popover so every colour control shares ONE\n *     panel. Matches the Figma \"Color Picker\" frame: a \"Color\" title with\n *     a ghost close button, a search input, then DropdownMenuItem-style\n *     rows (Swatch + token name + check) grouped by family.\n *   - <ColorPicker> — panel + a self-contained trigger (swatch + name or,\n *     with `triggerVariant=\"inline\"`, just the swatch).\n *\n * Grade is token-led, so the value is a token NAME (\"action/primary\"), the\n * literal \"transparent\", or null. The Swatch resolves the live CSS variable,\n * so every chip re-voices when the theme changes.\n */\n\nimport * as React from \"react\";\nimport { Check, X } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { Swatch } from \"@/components/ui/swatch\";\nimport {\n  Command,\n  CommandEmpty,\n  CommandGroup,\n  CommandInput,\n  CommandItem,\n  CommandList,\n} from \"@/components/ui/command\";\nimport {\n  Popover,\n  PopoverContent,\n  PopoverTrigger,\n} from \"@/components/ui/popover\";\n\n/** A named family of colour tokens, rendered as one group in the list. */\nexport interface ColorTokenGroup {\n  /** Group heading (e.g. \"action\"). */\n  group: string;\n  /** Token NAMES in this group (e.g. \"action/primary\"). */\n  tokens: string[];\n}\n\n/** Default token groups — the Grade semantic colour families. */\nexport const DEFAULT_COLOR_TOKEN_GROUPS: ColorTokenGroup[] = [\n  {\n    group: \"surface\",\n    tokens: [\"surface/background\", \"surface/card\", \"surface/popover\"],\n  },\n  {\n    group: \"action\",\n    tokens: [\n      \"action/primary\",\n      \"action/secondary\",\n      \"action/accent\",\n      \"action/muted\",\n      \"action/destructive\",\n    ],\n  },\n  {\n    group: \"status\",\n    tokens: [\n      \"status/success\",\n      \"status/warning\",\n      \"status/info\",\n      \"status/highlight\",\n    ],\n  },\n];\n\n/** The literal value for \"no fill\". */\nexport const TRANSPARENT = \"transparent\";\n\ntype ColorPickerTriggerVariant = \"default\" | \"inline\";\n\n/** Short label = the last path segment of a token name. */\nexport function colorTokenShortName(value: string): string {\n  if (value === TRANSPARENT) return \"Transparent\";\n  const seg = value.split(\"/\").pop() ?? value;\n  return seg.charAt(0).toUpperCase() + seg.slice(1);\n}\n\n/** A small Swatch for a token name or the transparent literal. */\nfunction TokenSwatch({ value }: { value: string }) {\n  if (value === TRANSPARENT) {\n    return <Swatch size=\"2xs\" shape=\"rounded\" type=\"solid\" color=\"transparent\" />;\n  }\n  return <Swatch size=\"2xs\" shape=\"rounded\" token={value} />;\n}\n\nexport interface ColorPickerPanelProps {\n  /** Current value (token name, \"transparent\", or null). */\n  value?: string | null;\n  /** Fired with the next value. */\n  onValueChange?: (value: string | null) => void;\n  /** Token families offered in the list. */\n  tokens?: ColorTokenGroup[];\n  /** Show the search input. Default true. */\n  searchable?: boolean;\n  searchPlaceholder?: string;\n  emptyMessage?: string;\n  /** Include a \"Transparent\" option at the top. Default true. */\n  allowTransparent?: boolean;\n  /** Header title. Pass null to drop the header entirely. Default \"Color\". */\n  title?: string | null;\n  /** When provided, renders the header's ghost close button. */\n  onClose?: () => void;\n}\n\n/**\n * ColorPickerPanel — the popover body. Header (title + close), search, then\n * the grouped token rows. Hosted by <ColorPicker> and by the inspector's\n * colour fields alike, so there's a single source of truth for the list.\n */\nexport function ColorPickerPanel({\n  value = null,\n  onValueChange,\n  tokens = DEFAULT_COLOR_TOKEN_GROUPS,\n  searchable = true,\n  searchPlaceholder = \"Search…\",\n  emptyMessage = \"No colours match.\",\n  allowTransparent = true,\n  title = \"Color\",\n  onClose,\n}: ColorPickerPanelProps) {\n  const pick = (next: string) => onValueChange?.(next);\n\n  return (\n    <div className=\"flex flex-col gap-2\">\n      {title != null ? (\n        <div className=\"flex items-center justify-between gap-1 pl-1\">\n          <span className=\"text-[13px] leading-none text-foreground\">\n            {title}\n          </span>\n          {onClose ? (\n            <button\n              type=\"button\"\n              aria-label=\"Close\"\n              onClick={onClose}\n              className=\"inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring [&_svg]:size-3.5\"\n            >\n              <X />\n            </button>\n          ) : null}\n        </div>\n      ) : null}\n      <Command\n        filter={(itemValue, search, keywords) => {\n          const haystack =\n            `${itemValue} ${(keywords ?? []).join(\" \")}`.toLowerCase();\n          return haystack.includes(search.toLowerCase()) ? 1 : 0;\n        }}\n      >\n        {searchable && (\n          <CommandInput placeholder={searchPlaceholder} className=\"h-8 text-xs\" />\n        )}\n        {/* FIXED height (not max-h): the popover size stays constant while\n            you type, so filtering the list never resizes the content and\n            Radix never repositions the popover mid-search. Long sets scroll\n            within it; short sets leave quiet space below. */}\n        <CommandList className=\"h-56 overflow-y-auto overflow-x-hidden\">\n          <CommandEmpty>{emptyMessage}</CommandEmpty>\n          {allowTransparent && (\n            <CommandGroup>\n              <ColorRow\n                value={TRANSPARENT}\n                selected={value === TRANSPARENT}\n                onSelect={pick}\n              />\n            </CommandGroup>\n          )}\n          {tokens.map(({ group, tokens: list }) => (\n            <CommandGroup key={group} heading={group}>\n              {list.map((tok) => (\n                <ColorRow\n                  key={tok}\n                  value={tok}\n                  selected={value === tok}\n                  onSelect={pick}\n                />\n              ))}\n            </CommandGroup>\n          ))}\n        </CommandList>\n      </Command>\n    </div>\n  );\n}\n\nexport interface ColorPickerProps {\n  /** A Grade colour token NAME (\"action/primary\"), the literal \"transparent\",\n   *  or null when nothing is picked. */\n  value?: string | null;\n  /** Fired with the next value (token name, \"transparent\", or null). */\n  onValueChange?: (value: string | null) => void;\n  /** Token families offered in the list. Defaults to the Grade semantic set. */\n  tokens?: ColorTokenGroup[];\n  /** Show the search input. Default true. */\n  searchable?: boolean;\n  /** `default` (form-control surface, swatch + name) or `inline` (just a\n   *  clickable swatch — the inspector / fill-row affordance). */\n  triggerVariant?: ColorPickerTriggerVariant;\n  /** Trigger text when nothing is selected. */\n  placeholder?: string;\n  /** Search-input placeholder. */\n  searchPlaceholder?: string;\n  /** Message rendered when search returns no rows. */\n  emptyMessage?: string;\n  /** Include a \"Transparent\" option at the top. Default true. */\n  allowTransparent?: boolean;\n  /** Popover header title. Default \"Color\"; pass null to drop the header. */\n  title?: string | null;\n  /** PopoverContent alignment. Default \"start\". */\n  align?: \"start\" | \"center\" | \"end\";\n  /** Lock the control to a display of its current value. */\n  disabled?: boolean;\n  /** Extra classes on the trigger. */\n  className?: string;\n  /** Forwarded to the trigger for tests / Studio selection. */\n  id?: string;\n  \"aria-label\"?: string;\n}\n\nexport const ColorPicker = React.forwardRef<HTMLButtonElement, ColorPickerProps>(\n  function ColorPicker(\n    {\n      value = null,\n      onValueChange,\n      tokens = DEFAULT_COLOR_TOKEN_GROUPS,\n      searchable = true,\n      triggerVariant = \"default\",\n      placeholder = \"Pick a colour\",\n      searchPlaceholder = \"Search…\",\n      emptyMessage = \"No colours match.\",\n      allowTransparent = true,\n      title = \"Color\",\n      align = \"start\",\n      disabled = false,\n      className,\n      id,\n      \"aria-label\": ariaLabel,\n      ...rest\n    },\n    ref,\n  ) {\n    const [open, setOpen] = React.useState(false);\n\n    const inline = triggerVariant === \"inline\";\n    const hasValue = value != null;\n\n    return (\n      <Popover open={open} onOpenChange={setOpen}>\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 ?? placeholder}\n            disabled={disabled}\n            data-gds-part=\"color-picker\"\n            data-variant={triggerVariant}\n            className={cn(\n              \"ring-offset-background focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50\",\n              inline\n                ? // Chrome-free — just the swatch as a hit target.\n                  \"inline-flex items-center rounded-md p-0.5 hover:bg-muted data-[state=open]:bg-muted\"\n                : // Form-control surface — lines up with Input / Select siblings.\n                  \"flex min-h-9 w-full items-center gap-2 rounded-md border border-input bg-transparent px-2.5 text-sm shadow-sm data-[state=open]:ring-1 data-[state=open]:ring-ring\",\n              className,\n            )}\n            {...rest}\n          >\n            {hasValue ? (\n              <>\n                <TokenSwatch value={value!} />\n                {!inline && (\n                  <span className=\"truncate\">{colorTokenShortName(value!)}</span>\n                )}\n              </>\n            ) : inline ? (\n              <span className=\"size-4 rounded-[2px] border border-dashed border-input\" />\n            ) : (\n              <span className=\"text-muted-foreground\">{placeholder}</span>\n            )}\n          </button>\n        </PopoverTrigger>\n        <PopoverContent\n          align={align}\n          className=\"w-64 rounded-xl p-2\"\n          data-gds-part=\"color-picker-content\"\n        >\n          <ColorPickerPanel\n            value={value}\n            onValueChange={(v) => {\n              onValueChange?.(v);\n              setOpen(false);\n            }}\n            tokens={tokens}\n            searchable={searchable}\n            searchPlaceholder={searchPlaceholder}\n            emptyMessage={emptyMessage}\n            allowTransparent={allowTransparent}\n            title={title}\n            onClose={() => setOpen(false)}\n          />\n        </PopoverContent>\n      </Popover>\n    );\n  },\n);\nColorPicker.displayName = \"ColorPicker\";\n\nfunction ColorRow({\n  value,\n  selected,\n  onSelect,\n}: {\n  value: string;\n  selected: boolean;\n  onSelect: (value: string) => void;\n}) {\n  return (\n    <CommandItem\n      value={value}\n      keywords={[colorTokenShortName(value)]}\n      onSelect={() => onSelect(value)}\n      data-gds-part=\"color-picker-item\"\n      data-selected={selected || undefined}\n      className=\"gap-2 px-2 py-1 text-xs [&_svg]:size-3.5\"\n    >\n      <TokenSwatch value={value} />\n      <span className=\"truncate\">{colorTokenShortName(value)}</span>\n      <Check\n        className={cn(\"ml-auto h-3.5 w-3.5\", selected ? \"opacity-100\" : \"opacity-0\")}\n        aria-hidden\n      />\n    </CommandItem>\n  );\n}\n","\"use client\";\n\n/**\n * GradientEditor — edit a multi-stop CSS gradient with token-led stops.\n *\n * A type Select (Linear / Radial / Angular) with reverse + rotate actions, a\n * live full-width preview bar (a <Swatch type=\"gradient\">), then a \"Stops\"\n * list: each stop is a position %, a colour (token via <ColorPicker>, or a\n * raw colour), an opacity %, and a remove button. An add button in the Stops\n * header appends a stop.\n *\n * The CSS gradient string is computed from type + angle + stops; token stops\n * resolve to `oklch(var(--<token>))` so the preview re-voices with the theme.\n * It emits the structured `GradientValue` (NOT a string) so the value stays\n * editable and serialisable — the caller renders the string via\n * `gradientToCss(value)` (exported alongside).\n */\n\nimport * as React from \"react\";\nimport { ArrowLeftRight, RotateCw, Plus, Minus } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { Swatch } from \"@/components/ui/swatch\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { ColorPicker } from \"@/components/ui/color-picker\";\nimport {\n  Select,\n  SelectContent,\n  SelectItem,\n  SelectTrigger,\n  SelectValue,\n} from \"@/components/ui/select\";\n\nexport type GradientType = \"linear\" | \"radial\" | \"angular\";\n\n/** A single colour stop. `token` wins over `color`; `opacity` is 0–1. */\nexport interface GradientStop {\n  /** Stable key for list rendering / edits. */\n  id: string;\n  /** Position along the gradient, 0–100 (%). */\n  position: number;\n  /** A Grade colour token NAME (\"action/primary\"). Takes precedence. */\n  token?: string;\n  /** A raw CSS colour, used when no `token`. */\n  color?: string;\n  /** Stop opacity, 0–1. */\n  opacity: number;\n}\n\nexport interface GradientValue {\n  type: GradientType;\n  /** Angle in degrees for linear / angular gradients. */\n  angle?: number;\n  stops: GradientStop[];\n}\n\nconst TYPE_OPTIONS: { value: GradientType; label: string }[] = [\n  { value: \"linear\", label: \"Linear\" },\n  { value: \"radial\", label: \"Radial\" },\n  { value: \"angular\", label: \"Angular\" },\n];\n\n/** Resolve a stop to a CSS colour, applying its opacity via color-mix. */\nfunction stopColor(stop: GradientStop): string {\n  const base =\n    stop.token && stop.token !== \"transparent\"\n      ? `oklch(var(--${stop.token.replace(/^--/, \"\")}))`\n      : stop.token === \"transparent\"\n        ? \"transparent\"\n        : (stop.color ?? \"transparent\");\n  if (stop.opacity >= 1) return base;\n  const pct = Math.round(stop.opacity * 100);\n  // color-mix lets us apply opacity to any colour form (token / oklch / hex)\n  // without parsing it — fade toward transparent.\n  return `color-mix(in oklab, ${base} ${pct}%, transparent)`;\n}\n\n/** Compute the CSS gradient string from a structured value. */\nexport function gradientToCss(value: GradientValue): string {\n  const stops = [...value.stops].sort((a, b) => a.position - b.position);\n  const parts = stops.map((s) => `${stopColor(s)} ${s.position}%`);\n  const list = parts.join(\", \");\n  const angle = value.angle ?? 90;\n  if (value.type === \"radial\") return `radial-gradient(circle, ${list})`;\n  if (value.type === \"angular\")\n    return `conic-gradient(from ${angle}deg, ${list})`;\n  return `linear-gradient(${angle}deg, ${list})`;\n}\n\nlet stopSeq = 0;\nfunction newStopId(): string {\n  stopSeq += 1;\n  return `stop-${Date.now().toString(36)}-${stopSeq}`;\n}\n\nexport interface GradientEditorProps {\n  value: GradientValue;\n  onChange: (value: GradientValue) => void;\n  className?: string;\n}\n\nconst LABEL = \"text-[11px] font-medium text-muted-foreground\";\n\nexport const GradientEditor = React.forwardRef<\n  HTMLDivElement,\n  GradientEditorProps\n>(function GradientEditor({ value, onChange, className }, ref) {\n  const set = (patch: Partial<GradientValue>) => onChange({ ...value, ...patch });\n\n  const setStop = (id: string, patch: Partial<GradientStop>) =>\n    set({\n      stops: value.stops.map((s) => (s.id === id ? { ...s, ...patch } : s)),\n    });\n\n  const addStop = () =>\n    set({\n      stops: [\n        ...value.stops,\n        {\n          id: newStopId(),\n          position: 100,\n          token: \"action/primary\",\n          opacity: 1,\n        },\n      ],\n    });\n\n  const removeStop = (id: string) =>\n    set({ stops: value.stops.filter((s) => s.id !== id) });\n\n  const reverse = () =>\n    set({\n      stops: value.stops.map((s) => ({ ...s, position: 100 - s.position })),\n    });\n\n  const rotate = () => set({ angle: ((value.angle ?? 90) + 45) % 360 });\n\n  const css = gradientToCss(value);\n\n  return (\n    <div ref={ref} className={cn(\"flex flex-col gap-3\", className)}>\n      {/* Type + actions */}\n      <div className=\"flex items-center gap-1.5\">\n        <Select\n          value={value.type}\n          onValueChange={(v) => set({ type: v as GradientType })}\n        >\n          <SelectTrigger size=\"sm\" className=\"flex-1\">\n            <SelectValue />\n          </SelectTrigger>\n          <SelectContent size=\"sm\">\n            {TYPE_OPTIONS.map((o) => (\n              <SelectItem key={o.value} value={o.value}>\n                {o.label}\n              </SelectItem>\n            ))}\n          </SelectContent>\n        </Select>\n        <Button\n          size=\"sm\"\n          iconOnly\n          variant=\"ghost\"\n          onClick={reverse}\n          aria-label=\"Reverse stops\"\n          title=\"Reverse stops\"\n        >\n          <ArrowLeftRight />\n        </Button>\n        <Button\n          size=\"sm\"\n          iconOnly\n          variant=\"ghost\"\n          onClick={rotate}\n          aria-label=\"Rotate gradient\"\n          title=\"Rotate gradient\"\n        >\n          <RotateCw />\n        </Button>\n      </div>\n\n      {/* Preview bar */}\n      <Swatch\n        type=\"gradient\"\n        gradient={css}\n        shape=\"rounded\"\n        className=\"h-8 w-full\"\n      />\n\n      {/* Stops */}\n      <div className=\"flex items-center justify-between\">\n        <span className={LABEL}>Stops</span>\n        <Button\n          size=\"2xs\"\n          iconOnly\n          variant=\"ghost\"\n          onClick={addStop}\n          aria-label=\"Add stop\"\n          title=\"Add stop\"\n        >\n          <Plus />\n        </Button>\n      </div>\n\n      <div className=\"flex flex-col gap-1.5\">\n        {value.stops.map((stop) => (\n          <div key={stop.id} className=\"flex items-center gap-1.5\">\n            <Input\n              size=\"xs\"\n              type=\"number\"\n              min={0}\n              max={100}\n              value={stop.position}\n              onChange={(e) =>\n                setStop(stop.id, { position: Number(e.target.value) })\n              }\n              endSlot=\"%\"\n              aria-label=\"Stop position\"\n              className=\"w-16\"\n            />\n            <ColorPicker\n              triggerVariant=\"inline\"\n              value={stop.token ?? null}\n              onValueChange={(v) =>\n                setStop(stop.id, { token: v ?? undefined, color: undefined })\n              }\n              aria-label=\"Stop colour\"\n            />\n            <Input\n              size=\"xs\"\n              type=\"number\"\n              min={0}\n              max={100}\n              value={Math.round(stop.opacity * 100)}\n              onChange={(e) =>\n                setStop(stop.id, {\n                  opacity: Math.max(0, Math.min(100, Number(e.target.value))) / 100,\n                })\n              }\n              endSlot=\"%\"\n              aria-label=\"Stop opacity\"\n              className=\"w-16\"\n            />\n            <Button\n              size=\"xs\"\n              iconOnly\n              variant=\"ghost\"\n              onClick={() => removeStop(stop.id)}\n              disabled={value.stops.length <= 2}\n              aria-label=\"Remove stop\"\n              title=\"Remove stop\"\n              className=\"ml-auto\"\n            >\n              <Minus />\n            </Button>\n          </div>\n        ))}\n      </div>\n    </div>\n  );\n});\nGradientEditor.displayName = \"GradientEditor\";\n","import type { Palette } from \"./types\";\n\n/**\n * Theme-reactive shader palette. Every slot reads a theme token wrapped\n * in `oklch()` (the gradeui contract — bare `var(--token)` triplets\n * aren't valid CSS colours), so a scene re-tints automatically when the\n * page theme/dark-mode changes (ThreeScene's palette observer pushes the\n * resolved colours into the running shader, no remount).\n *\n * Slot mapping follows the ThreeScene guidance: `secondary → --accent`\n * (gradeui's `--secondary` is a neutral surface) and\n * `background → --foreground` (the raw `--background` is the page bg and\n * washes the shader out).\n */\nexport const THEME_REACTIVE_PALETTE: Partial<Palette> = {\n  primary: \"oklch(var(--primary))\",\n  secondary: \"oklch(var(--accent))\",\n  accent: \"oklch(var(--primary))\",\n  background: \"oklch(var(--foreground))\",\n};\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 { THEME_REACTIVE_PALETTE } from \"@/lib/three/theme-palette\";\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\" | \"standard\" | \"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    // `live=\"never\"` stays a static poster/placeholder. Otherwise the\n    // scene is always mounted so the thumbnail shows a real STILL frame\n    // of the shader (ThreeScene paints one frame even when paused); it\n    // only ANIMATES on hover (or when live=\"always\").\n    const showScene = live !== \"never\";\n    const animate = 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        {showScene ? (\n          <ThreeScene\n            key={preset}\n            preset={preset}\n            postPreset={postPreset}\n            // Theme-reactive by default so thumbnails re-tint with the page\n            // theme (same as the live playground). Caller can override.\n            palette={palette ?? THEME_REACTIVE_PALETTE}\n            aspect={aspect}\n            radius={radius}\n            // Mount PAUSED (still frame), animate on hover via the\n            // controlled `play` prop — no remount, no context churn.\n            autoPlay={false}\n            play={animate}\n            controls={false}\n            pauseOffscreen\n            // A gallery page can mount dozens of thumbnails; a live\n            // WebGLRenderer holds a GL context for its whole lifetime and\n            // browsers cap simultaneous contexts (~16 Chrome, ~8 Safari),\n            // silently evicting the OLDEST when exceeded (those cards blank\n            // with a \"Context Lost\" log). Thumbnails therefore RELEASE their\n            // context while scrolled out of view, and a global budget in\n            // ThreeScene caps the live total. See ThreeScene.releaseOffscreen.\n            releaseOffscreen\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\n/**\n * FillPicker — Grade's paint picker, modelled on Figma's fill popover.\n *\n * A type-icon row across the top (solid · gradient · image · pattern ·\n * video · shader) switches the panel below to that paint's controls,\n * with a global opacity at the foot. It emits a `FillValue` that maps\n * 1:1 onto `<BackgroundFill>` props, so the inspector's Fill section and\n * any frame background share one control + one data shape.\n *\n * Grade is token-led, so the SOLID tab leads with theme-token swatches\n * (the \"Libraries\" half of Figma's picker) rather than a freeform HSV\n * square. A custom-colour square is a deliberate later pass.\n */\n\nimport * as React from \"react\";\nimport {\n  Square,\n  Blend,\n  Image as ImageIcon,\n  Grid3x3,\n  Video as VideoIcon,\n  Sparkles,\n  Eye,\n  EyeOff,\n  Plus,\n  Trash2,\n} from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { ToggleGroup, ToggleGroupItem } from \"./toggle-group\";\nimport { Input } from \"./input\";\nimport { Slider } from \"./slider\";\nimport { Switch } from \"./switch\";\nimport { Button } from \"./button\";\nimport { ColorPicker } from \"./color-picker\";\nimport {\n  GradientEditor,\n  gradientToCss,\n  type GradientValue,\n} from \"./gradient-editor\";\nimport {\n  Popover,\n  PopoverContent,\n  PopoverTrigger,\n} from \"./popover\";\nimport { ShaderPresetPicker } from \"./shader-preset-picker\";\nimport type { BackgroundFillType, BackgroundFillFit } from \"./background-fill\";\nimport type { Palette, PostPreset } from \"@/lib/three/types\";\n\n/** A paint value — the serialisable shape both the picker and\n *  `<BackgroundFill>` speak. */\nexport interface FillValue {\n  type: BackgroundFillType;\n  color?: string;\n  gradient?: { from?: string; via?: string; to?: string; angle?: number };\n  src?: string;\n  fit?: BackgroundFillFit;\n  repeat?: boolean;\n  tileSize?: string;\n  preset?: string;\n  palette?: Partial<Palette>;\n  postPreset?: string | PostPreset;\n  opacity?: number;\n}\n\n/** Theme tokens offered as solid / gradient swatches. */\nexport const FILL_TOKENS = [\n  \"primary\",\n  \"accent\",\n  \"secondary\",\n  \"muted\",\n  \"card\",\n  \"background\",\n  \"destructive\",\n  \"transparent\",\n] as const;\n\nfunction tokenColor(token: string): string {\n  return token === \"transparent\" ? \"transparent\" : `oklch(var(--${token}))`;\n}\n\n/** UI tabs — \"pattern\" is sugar for an image fill with repeat on. */\ntype FillTab =\n  | \"solid\"\n  | \"gradient\"\n  | \"image\"\n  | \"pattern\"\n  | \"video\"\n  | \"shader\";\n\nconst TABS: { tab: FillTab; icon: React.ElementType; label: string }[] = [\n  { tab: \"solid\", icon: Square, label: \"Solid\" },\n  { tab: \"gradient\", icon: Blend, label: \"Gradient\" },\n  { tab: \"image\", icon: ImageIcon, label: \"Image\" },\n  { tab: \"pattern\", icon: Grid3x3, label: \"Pattern\" },\n  { tab: \"video\", icon: VideoIcon, label: \"Video\" },\n  { tab: \"shader\", icon: Sparkles, label: \"Shader\" },\n];\n\nfunction tabOf(v: FillValue): FillTab {\n  if (v.type === \"image\" && v.repeat) return \"pattern\";\n  if (v.type === \"image\") return \"image\";\n  return v.type as FillTab;\n}\n\nexport interface FillPickerProps {\n  value: FillValue;\n  onChange: (value: FillValue) => void;\n  className?: string;\n}\n\nconst LABEL = \"text-[11px] font-medium text-muted-foreground\";\n\nfunction Swatch({\n  token,\n  active,\n  onClick,\n}: {\n  token: string;\n  active: boolean;\n  onClick: () => void;\n}) {\n  return (\n    <button\n      type=\"button\"\n      title={token}\n      onClick={onClick}\n      className={cn(\n        \"h-7 w-7 rounded-md border border-border/60 transition-shadow\",\n        token === \"transparent\" &&\n          \"bg-[linear-gradient(45deg,#bbb_25%,transparent_25%,transparent_75%,#bbb_75%),linear-gradient(45deg,#bbb_25%,transparent_25%,transparent_75%,#bbb_75%)] bg-[length:8px_8px] bg-[position:0_0,4px_4px]\",\n        active && \"ring-2 ring-primary ring-offset-1 ring-offset-background\",\n      )}\n      style={\n        token === \"transparent\" ? undefined : { background: tokenColor(token) }\n      }\n    />\n  );\n}\n\nexport function FillPicker({ value, onChange, className }: FillPickerProps) {\n  const tab = tabOf(value);\n  const set = (patch: Partial<FillValue>) => onChange({ ...value, ...patch });\n\n  const selectTab = (next: FillTab) => {\n    if (!next) return;\n    if (next === \"pattern\") set({ type: \"image\", repeat: true });\n    else if (next === \"image\") set({ type: \"image\", repeat: false });\n    else set({ type: next as BackgroundFillType });\n  };\n\n  return (\n    <div className={cn(\"flex flex-col gap-3\", className)}>\n      {/* Type row */}\n      <ToggleGroup\n        type=\"single\"\n        size=\"sm\"\n        value={tab}\n        onValueChange={(v) => selectTab(v as FillTab)}\n        className=\"justify-start gap-0.5\"\n      >\n        {TABS.map(({ tab: t, icon: Icon, label }) => (\n          <ToggleGroupItem key={t} value={t} aria-label={label} title={label}>\n            <Icon className=\"h-4 w-4\" />\n          </ToggleGroupItem>\n        ))}\n      </ToggleGroup>\n\n      {/* Per-type panel */}\n      {tab === \"solid\" && (\n        <div className=\"flex flex-col gap-1.5\">\n          <span className={LABEL}>Token</span>\n          <div className=\"flex flex-wrap gap-1.5\">\n            {FILL_TOKENS.map((t) => (\n              <Swatch\n                key={t}\n                token={t}\n                active={value.color === t}\n                onClick={() => set({ color: t })}\n              />\n            ))}\n          </div>\n        </div>\n      )}\n\n      {tab === \"gradient\" && (\n        <div className=\"flex flex-col gap-2\">\n          <div className=\"flex flex-col gap-1.5\">\n            <span className={LABEL}>From</span>\n            <div className=\"flex flex-wrap gap-1.5\">\n              {FILL_TOKENS.map((t) => (\n                <Swatch\n                  key={t}\n                  token={t}\n                  active={value.gradient?.from === t}\n                  onClick={() =>\n                    set({ gradient: { ...value.gradient, from: t } })\n                  }\n                />\n              ))}\n            </div>\n          </div>\n          <div className=\"flex flex-col gap-1.5\">\n            <span className={LABEL}>To</span>\n            <div className=\"flex flex-wrap gap-1.5\">\n              {FILL_TOKENS.map((t) => (\n                <Swatch\n                  key={t}\n                  token={t}\n                  active={value.gradient?.to === t}\n                  onClick={() => set({ gradient: { ...value.gradient, to: t } })}\n                />\n              ))}\n            </div>\n          </div>\n          <div className=\"flex flex-col gap-1.5\">\n            <span className={LABEL}>\n              Angle — {value.gradient?.angle ?? 135}°\n            </span>\n            <Slider\n              value={[value.gradient?.angle ?? 135]}\n              min={0}\n              max={360}\n              step={5}\n              onValueChange={([a]) =>\n                set({ gradient: { ...value.gradient, angle: a } })\n              }\n            />\n          </div>\n        </div>\n      )}\n\n      {(tab === \"image\" || tab === \"pattern\") && (\n        <div className=\"flex flex-col gap-2\">\n          <div className=\"flex flex-col gap-1.5\">\n            <span className={LABEL}>Image URL</span>\n            <Input\n              size=\"sm\"\n              value={value.src ?? \"\"}\n              placeholder=\"https://… or /asset.png\"\n              onChange={(e) => set({ src: e.target.value })}\n            />\n          </div>\n          {tab === \"image\" && (\n            <div className=\"flex flex-col gap-1.5\">\n              <span className={LABEL}>Fit</span>\n              <ToggleGroup\n                type=\"single\"\n                size=\"sm\"\n                value={value.fit ?? \"cover\"}\n                onValueChange={(v) =>\n                  v && set({ fit: v as BackgroundFillFit })\n                }\n                className=\"justify-start gap-0.5\"\n              >\n                {([\"cover\", \"contain\", \"fill\", \"none\"] as BackgroundFillFit[]).map(\n                  (f) => (\n                    <ToggleGroupItem\n                      key={f}\n                      value={f}\n                      className=\"px-2 text-[11px] capitalize\"\n                    >\n                      {f}\n                    </ToggleGroupItem>\n                  ),\n                )}\n              </ToggleGroup>\n            </div>\n          )}\n          {tab === \"pattern\" && (\n            <div className=\"flex flex-col gap-1.5\">\n              <span className={LABEL}>Tile size</span>\n              <Input\n                size=\"sm\"\n                value={value.tileSize ?? \"\"}\n                placeholder=\"120px\"\n                onChange={(e) => set({ tileSize: e.target.value })}\n              />\n            </div>\n          )}\n        </div>\n      )}\n\n      {tab === \"video\" && (\n        <div className=\"flex flex-col gap-1.5\">\n          <span className={LABEL}>Video URL</span>\n          <Input\n            size=\"sm\"\n            value={value.src ?? \"\"}\n            placeholder=\"https://….mp4\"\n            onChange={(e) => set({ src: e.target.value })}\n          />\n        </div>\n      )}\n\n      {tab === \"shader\" && (\n        <div className=\"flex flex-col gap-1.5\">\n          <span className={LABEL}>Shader</span>\n          <ShaderPresetPicker\n            value={value.preset}\n            onChange={(id) => set({ preset: id })}\n            live=\"hover\"\n            columns={3}\n          />\n        </div>\n      )}\n\n      {/* Global opacity */}\n      {value.type !== \"none\" && (\n        <div className=\"flex items-center gap-2 border-t border-border/50 pt-2.5\">\n          <span className={cn(LABEL, \"shrink-0\")}>Opacity</span>\n          <Slider\n            value={[value.opacity ?? 1]}\n            min={0}\n            max={1}\n            step={0.05}\n            onValueChange={([o]) => set({ opacity: o })}\n            className=\"flex-1\"\n          />\n          <span className=\"w-9 shrink-0 text-right text-[11px] tabular-nums text-foreground\">\n            {Math.round((value.opacity ?? 1) * 100)}%\n          </span>\n        </div>\n      )}\n    </div>\n  );\n}\nFillPicker.displayName = \"FillPicker\";\n\n/* ──────────────────────────────────────────────────────────────────────\n   FillSection — the multi-fill list (Figma's \"Fill\" inspector section).\n\n   Where <FillPicker> edits ONE paint with the full type-icon row,\n   <FillSection> stacks a LIST of fills: each row is a Solid/Gradient/Image\n   toggle, the matching value control (ColorPicker / GradientEditor popover /\n   image URL), an opacity %, a visibility eye, and a remove button. The header\n   carries an \"add fill\" button. Reuses FillValue + the new ColorPicker +\n   GradientEditor so the data shape stays the one <BackgroundFill> speaks.\n\n   `visible` rides FillValue.opacity: hiding a fill stashes its opacity and\n   sets 0; showing restores it.\n   ────────────────────────────────────────────────────────────────────── */\n\n/** The three fill kinds FillSection rows can switch between. */\ntype RowKind = \"solid\" | \"gradient\" | \"image\";\n\nconst ROW_KINDS: { kind: RowKind; icon: React.ElementType; label: string }[] = [\n  { kind: \"solid\", icon: Square, label: \"Solid\" },\n  { kind: \"gradient\", icon: Blend, label: \"Gradient\" },\n  { kind: \"image\", icon: ImageIcon, label: \"Image\" },\n];\n\nfunction rowKindOf(v: FillValue): RowKind {\n  if (v.type === \"gradient\") return \"gradient\";\n  if (v.type === \"image\") return \"image\";\n  return \"solid\";\n}\n\n/** Bridge FillValue.gradient ({from,via,to,angle}) → the structured\n *  GradientValue the GradientEditor edits, and back. */\nfunction toGradientValue(v: FillValue): GradientValue {\n  const g = v.gradient ?? {};\n  const stops: GradientValue[\"stops\"] = [];\n  const push = (token: string | undefined, position: number, id: string) => {\n    if (token == null) return;\n    stops.push({ id, position, token, opacity: 1 });\n  };\n  push(g.from ?? \"primary\", 0, \"g-from\");\n  if (g.via != null) push(g.via, 50, \"g-via\");\n  push(g.to ?? \"accent\", 100, \"g-to\");\n  return { type: \"linear\", angle: g.angle ?? 90, stops };\n}\n\nfunction fromGradientValue(gv: GradientValue): FillValue[\"gradient\"] {\n  const sorted = [...gv.stops].sort((a, b) => a.position - b.position);\n  const from = sorted[0]?.token;\n  const to = sorted[sorted.length - 1]?.token;\n  const via = sorted.length > 2 ? sorted[1]?.token : undefined;\n  return { from, via, to, angle: gv.angle };\n}\n\nexport interface FillSectionProps {\n  /** The ordered list of fills (top-most last, Figma-style — but the list\n   *  renders in array order; the consumer owns z-ordering semantics). */\n  value: FillValue[];\n  /** Fired with the next list on any add / edit / remove / reorder. */\n  onChange: (value: FillValue[]) => void;\n  /** Section heading. Default \"Fills\". */\n  title?: string;\n  className?: string;\n}\n\n/** A sensible new solid fill. */\nfunction defaultFill(): FillValue {\n  return { type: \"solid\", color: \"primary\", opacity: 1 };\n}\n\nexport function FillSection({\n  value,\n  onChange,\n  title = \"Fills\",\n  className,\n}: FillSectionProps) {\n  const setAt = (index: number, patch: Partial<FillValue>) =>\n    onChange(value.map((f, i) => (i === index ? { ...f, ...patch } : f)));\n\n  const removeAt = (index: number) =>\n    onChange(value.filter((_, i) => i !== index));\n\n  const add = () => onChange([...value, defaultFill()]);\n\n  const switchKind = (index: number, kind: RowKind) => {\n    if (kind === \"image\") setAt(index, { type: \"image\", repeat: false });\n    else setAt(index, { type: kind as BackgroundFillType });\n  };\n\n  return (\n    <div className={cn(\"flex flex-col gap-2\", className)}>\n      <div className=\"flex items-center justify-between\">\n        <span className={LABEL}>{title}</span>\n        <Button\n          size=\"2xs\"\n          iconOnly\n          variant=\"ghost\"\n          onClick={add}\n          aria-label=\"Add fill\"\n          title=\"Add fill\"\n        >\n          <Plus />\n        </Button>\n      </div>\n\n      {value.length === 0 && (\n        <p className=\"text-[11px] text-muted-foreground\">No fills.</p>\n      )}\n\n      <div className=\"flex flex-col gap-1.5\">\n        {value.map((fill, index) => {\n          const kind = rowKindOf(fill);\n          const opacity = fill.opacity ?? 1;\n          const visible = opacity > 0;\n          const stashed = (fill as { _opacity?: number })._opacity;\n\n          const toggleVisible = () => {\n            if (visible)\n              setAt(index, {\n                opacity: 0,\n                ...({ _opacity: opacity } as Partial<FillValue>),\n              });\n            else setAt(index, { opacity: stashed ?? 1 });\n          };\n\n          return (\n            <div\n              key={index}\n              data-gds-part=\"fill-row\"\n              className=\"flex items-center gap-1.5\"\n            >\n              <ToggleGroup\n                type=\"single\"\n                size=\"sm\"\n                value={kind}\n                onValueChange={(v) => v && switchKind(index, v as RowKind)}\n                className=\"gap-0.5\"\n              >\n                {ROW_KINDS.map(({ kind: k, icon: Icon, label }) => (\n                  <ToggleGroupItem\n                    key={k}\n                    value={k}\n                    aria-label={label}\n                    title={label}\n                  >\n                    <Icon className=\"h-4 w-4\" />\n                  </ToggleGroupItem>\n                ))}\n              </ToggleGroup>\n\n              {/* Value control per kind */}\n              <div className=\"min-w-0 flex-1\">\n                {kind === \"solid\" && (\n                  <ColorPicker\n                    triggerVariant=\"inline\"\n                    value={fill.color ?? null}\n                    onValueChange={(v) =>\n                      setAt(index, { color: v ?? undefined })\n                    }\n                    aria-label=\"Fill colour\"\n                  />\n                )}\n                {kind === \"gradient\" && (\n                  <Popover>\n                    <PopoverTrigger asChild>\n                      <button\n                        type=\"button\"\n                        aria-label=\"Edit gradient\"\n                        className=\"h-6 w-full rounded-md border border-border/60\"\n                        style={{\n                          background: gradientToCss(toGradientValue(fill)),\n                        }}\n                      />\n                    </PopoverTrigger>\n                    <PopoverContent align=\"start\" className=\"w-64\">\n                      <GradientEditor\n                        value={toGradientValue(fill)}\n                        onChange={(gv) =>\n                          setAt(index, { gradient: fromGradientValue(gv) })\n                        }\n                      />\n                    </PopoverContent>\n                  </Popover>\n                )}\n                {kind === \"image\" && (\n                  <Input\n                    size=\"xs\"\n                    value={fill.src ?? \"\"}\n                    placeholder=\"https://… or /asset.png\"\n                    onChange={(e) => setAt(index, { src: e.target.value })}\n                    aria-label=\"Image URL\"\n                  />\n                )}\n              </div>\n\n              {/* Opacity */}\n              <Input\n                size=\"xs\"\n                type=\"number\"\n                min={0}\n                max={100}\n                value={Math.round(opacity * 100)}\n                onChange={(e) =>\n                  setAt(index, {\n                    opacity:\n                      Math.max(0, Math.min(100, Number(e.target.value))) / 100,\n                  })\n                }\n                endSlot=\"%\"\n                aria-label=\"Fill opacity\"\n                className=\"w-14\"\n              />\n\n              {/* Visibility */}\n              <Button\n                size=\"xs\"\n                iconOnly\n                variant=\"ghost\"\n                onClick={toggleVisible}\n                aria-label={visible ? \"Hide fill\" : \"Show fill\"}\n                title={visible ? \"Hide fill\" : \"Show fill\"}\n              >\n                {visible ? <Eye /> : <EyeOff />}\n              </Button>\n\n              {/* Remove */}\n              <Button\n                size=\"xs\"\n                iconOnly\n                variant=\"ghost\"\n                onClick={() => removeAt(index)}\n                aria-label=\"Remove fill\"\n                title=\"Remove fill\"\n              >\n                <Trash2 />\n              </Button>\n            </div>\n          );\n        })}\n      </div>\n    </div>\n  );\n}\nFillSection.displayName = \"FillSection\";\n","\"use client\";\n\nimport * as React from \"react\";\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 * as React from \"react\";\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"]}