@weasel-js/labkit 0.7.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +11 -3
- package/dist/_dts/{DrawCommand-CEvS5AdV.d.ts → DrawCommand-BwRCZYuo.d.ts} +106 -52
- package/dist/_dts/{useExperimentState-eSvpwV_P.d.ts → useExperimentState-CJn2hHzd.d.ts} +6 -4
- package/dist/{chunk-SSMHPMDV.js → chunk-53XSBIUK.js} +12 -11
- package/dist/chunk-53XSBIUK.js.map +1 -0
- package/dist/{chunk-BG6NLMOL.js → chunk-FP5LYDVX.js} +1229 -1227
- package/dist/chunk-FP5LYDVX.js.map +1 -0
- package/dist/{chunk-ERZQAU4N.js → chunk-HNXVLKBG.js} +3 -3
- package/dist/{chunk-ERZQAU4N.js.map → chunk-HNXVLKBG.js.map} +1 -1
- package/dist/{chunk-5XDFILHZ.js → chunk-XVBXYKFJ.js} +1675 -670
- package/dist/chunk-XVBXYKFJ.js.map +1 -0
- package/dist/fonts/inter-latin.woff2 +0 -0
- package/dist/fonts/oswald-latin-variable.woff2 +0 -0
- package/dist/index.d.ts +37 -13
- package/dist/index.js +776 -27
- package/dist/index.js.map +1 -1
- package/dist/passthrough/weasel-canvas.d.ts +1 -1
- package/dist/passthrough/weasel-canvas.js +1 -1
- package/dist/passthrough/weasel-ui.d.ts +332 -189
- package/dist/passthrough/weasel-ui.js +2 -2
- package/dist/state/index.d.ts +2 -2
- package/dist/state/index.js +2 -2
- package/dist/styles.css +229 -288
- package/dist/ui/layers/index.js +3 -3
- package/package.json +5 -6
- package/src/canvas/CanvasStack.less +1 -1
- package/src/controls/ControlPanel.less +12 -12
- package/src/dragdrop/DragGhost.less +2 -2
- package/src/dragdrop/Palette.less +6 -6
- package/src/index.ts +2 -0
- package/src/lab/Lab.test.tsx +20 -15
- package/src/lab/Lab.tsx +33 -32
- package/src/lab/LabContext.ts +3 -3
- package/src/lab/LabShell.less +14 -14
- package/src/lab/LabShell.test.tsx +7 -20
- package/src/lab/LabShell.tsx +22 -13
- package/src/lab/WorkspaceGrid.less +1 -1
- package/src/lab/WorkspaceGrid.stories.tsx +4 -4
- package/src/lab/index.ts +1 -1
- package/src/lab/useSystemMode.ts +30 -0
- package/src/layers/LayerList.less +9 -9
- package/src/primitives/FpsMeter.less +5 -5
- package/src/primitives/ScaleIndicator.less +7 -7
- package/src/primitives/Sidebar.less +12 -12
- package/src/primitives/StatusBar.less +10 -10
- package/src/primitives/Toolbar.less +16 -16
- package/src/state/store.test.ts +17 -9
- package/src/state/store.ts +13 -10
- package/src/state/types.ts +5 -2
- package/src/theme/Interstellar.stories.less +20 -20
- package/src/theme/Interstellar.stories.tsx +44 -59
- package/src/theme/base.less +29 -28
- package/src/theme/interstellar.test.ts +30 -0
- package/src/theme/interstellar.tokens.json +57 -0
- package/src/theme/interstellar.ts +9 -0
- package/src/ui/layers/LayerStack.less +21 -21
- package/src/ui/properties/CurveField.less +5 -5
- package/src/ui/properties/EffectCard.tsx +2 -2
- package/src/ui/properties/PropertyGroup.less +6 -6
- package/src/ui/properties/PropertyPanel.less +70 -70
- package/src/ui/properties/SpeechBalloonPanels.stories.tsx +1 -1
- package/src/ui/properties/storyLayouts.tsx +1 -1
- package/src/workspace/Workspace.less +14 -14
- package/src/workspace/Workspace.stories.tsx +2 -2
- package/src/workspace/Workspace.test.tsx +2 -2
- package/dist/chunk-5XDFILHZ.js.map +0 -1
- package/dist/chunk-BG6NLMOL.js.map +0 -1
- package/dist/chunk-SSMHPMDV.js.map +0 -1
- package/dist/theme-interstellar.css +0 -25
- package/dist/theme-light.css +0 -13
- package/src/fonts/oswald-latin-variable.woff2 +0 -0
- package/src/theme/interstellar.less +0 -34
- package/src/theme/light.less +0 -14
- package/src/theme/tokens.less +0 -85
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/instrument/capabilityDetector.ts","../src/instrument/defineInstrument.ts","../src/instrument/validateConfigSchema.ts","../src/lab/gridDims.ts","../src/dragdrop/DragGhost.tsx","../src/dragdrop/DragDropRuntime.tsx","../src/dragdrop/Palette.tsx","../src/lab/LabContext.ts","../src/workspace/DefaultSidebar.tsx","../src/workspace/DefaultStatusBar.tsx","../src/workspace/DefaultToolbar.tsx","../src/workspace/WorkspaceChrome.tsx","../src/workspace/Workspace.tsx","../src/workspace/workspaceOps.ts","../src/lab/LabShell.tsx","../src/lab/WorkspaceGrid.tsx","../src/lab/Lab.tsx","../src/ui/properties/CurveField.tsx","../src/ui/properties/EffectCard.tsx","../src/ui/properties/PropertyGroup.tsx","../src/ui/format.ts","../src/ui/properties/PropertyPanel.tsx"],"names":["useState","useEffect","jsx","jsxs","useContext","useStore","useRef","useMemo","p","Fragment","useCallback"],"mappings":"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","file":"index.js","sourcesContent":["import type { Instrument } from './types';\n\nexport interface CapabilityFlags {\n hasCanvas: boolean;\n hasLayers: boolean;\n hasDragDrop: boolean;\n hasUndo: boolean;\n}\n\nexport function detectCapabilities(instrument: Instrument<unknown, unknown>): CapabilityFlags {\n return {\n hasCanvas: instrument.canvas != null,\n hasLayers: instrument.layers != null,\n hasDragDrop: instrument.dragDrop != null,\n hasUndo: instrument.undo != null,\n };\n}\n","import type { Instrument } from './types';\n\nexport function defineInstrument<TS, TC>(spec: Instrument<TS, TC>): Instrument<TS, TC> {\n return spec;\n}\n","import type { ConfigField, ConfigFieldType } from '../controls/types';\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\nconst KNOWN_TYPES: ConfigFieldType[] = ['slider', 'checkbox', 'select', 'number', 'text', 'color'];\n\nexport function validateConfigSchema(fields: ConfigField[]): ValidationResult {\n const errors: string[] = [];\n const seenKeys = new Set<string>();\n\n for (const field of fields) {\n if (field.key === '') {\n errors.push('Field has empty key');\n } else if (seenKeys.has(field.key)) {\n errors.push(`Duplicate config key: \"${field.key}\"`);\n } else {\n seenKeys.add(field.key);\n }\n\n if (field.label === '') {\n errors.push(`Field \"${field.key}\" has empty label`);\n }\n\n if (!KNOWN_TYPES.includes(field.type)) {\n errors.push(`Unknown field type: \"${field.type}\" on key \"${field.key}\"`);\n continue;\n }\n\n if (field.type === 'slider') {\n if (!Number.isFinite(field.default)) {\n errors.push(`Field \"${field.key}\": default must be a finite number`);\n }\n if (field.min >= field.max) {\n errors.push(`Slider \"${field.key}\": min must be < max`);\n } else if (field.default < field.min || field.default > field.max) {\n errors.push(`Slider \"${field.key}\": default ${field.default} is outside [min, max]`);\n }\n } else if (field.type === 'number') {\n if (!Number.isFinite(field.default)) {\n errors.push(`Field \"${field.key}\": default must be a finite number`);\n }\n } else if (field.type === 'select') {\n if (field.options.length === 0) {\n errors.push(`Select \"${field.key}\": options array must not be empty`);\n } else {\n const seenValues = new Set<string>();\n for (const opt of field.options) {\n if (seenValues.has(opt.value)) {\n errors.push(`Select \"${field.key}\": duplicate option value \"${opt.value}\"`);\n } else {\n seenValues.add(opt.value);\n }\n }\n if (!seenValues.has(field.default)) {\n errors.push(`Select \"${field.key}\": default \"${field.default}\" is not among options`);\n }\n }\n }\n }\n\n return { valid: errors.length === 0, errors };\n}\n","export interface GridDims {\n cols: number;\n rows: number;\n}\n\nexport function gridDims(count: number): GridDims {\n if (count <= 1) return { cols: 1, rows: 1 };\n const cols = Math.ceil(Math.sqrt(count));\n const rows = Math.ceil(count / cols);\n return { cols, rows };\n}\n","import { type ReactPortal, useEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { PaletteItem, Point } from '../instrument/types';\n\nexport interface DragGhostProps {\n item: PaletteItem;\n screenPos: Point;\n}\n\nexport function DragGhost({ item, screenPos }: DragGhostProps): ReactPortal | null {\n const [mounted, setMounted] = useState(false);\n useEffect(() => setMounted(true), []);\n if (!mounted || typeof document === 'undefined') return null;\n const style = {\n left: `${screenPos.x + 12}px`,\n top: `${screenPos.y + 12}px`,\n };\n return createPortal(\n <div className=\"lk-drag-ghost\" style={style}>\n <span className=\"lk-drag-ghost__label\">{item.label}</span>\n </div>,\n document.body,\n );\n}\n","import { type RefObject, useCallback, useEffect, useRef, useState } from 'react';\nimport { screenToWorld } from '../canvas/canvasCoords';\nimport type {\n DragDropCapability,\n DragFeedback,\n PaletteItem,\n Point,\n ViewTransform,\n} from '../instrument/types';\nimport { DragGhost } from './DragGhost';\n\nexport interface DragState {\n item: PaletteItem;\n screenPos: Point;\n feedback: DragFeedback | null;\n}\n\nexport interface UseDragDropArgs<TS, TC> {\n capability: DragDropCapability<TS, TC>;\n canvasContainerRef: RefObject<HTMLElement | null>;\n view: ViewTransform;\n state: TS;\n config: TC;\n setState: (next: TS | ((prev: TS) => TS)) => void;\n emit: (event: string) => void;\n}\n\nexport interface UseDragDropResult {\n drag: DragState | null;\n startDrag: (item: PaletteItem, originScreenPos: Point) => void;\n}\n\nexport function useDragDrop<TS, TC>({\n capability,\n canvasContainerRef,\n view,\n state,\n config,\n setState,\n emit,\n}: UseDragDropArgs<TS, TC>): UseDragDropResult {\n const [drag, setDrag] = useState<DragState | null>(null);\n const dragRef = useRef<DragState | null>(null);\n dragRef.current = drag;\n const rafThrottle = useRef<number | null>(null);\n\n const isOverCanvas = useCallback(\n (screenPos: Point): boolean => {\n const el = canvasContainerRef.current;\n if (!el) return false;\n const r = el.getBoundingClientRect();\n return (\n screenPos.x >= r.left &&\n screenPos.x <= r.right &&\n screenPos.y >= r.top &&\n screenPos.y <= r.bottom\n );\n },\n [canvasContainerRef],\n );\n\n const screenToWorldFromContainer = useCallback(\n (screenPos: Point): Point | null => {\n const el = canvasContainerRef.current;\n if (!el) return null;\n const r = el.getBoundingClientRect();\n return screenToWorld({ x: screenPos.x - r.left, y: screenPos.y - r.top }, view);\n },\n [canvasContainerRef, view],\n );\n\n useEffect(() => {\n if (!drag) return;\n const handleMove = (e: PointerEvent) => {\n const screenPos = { x: e.clientX, y: e.clientY };\n const current = dragRef.current;\n if (!current) return;\n if (rafThrottle.current !== null) {\n dragRef.current = { ...current, screenPos };\n setDrag(dragRef.current);\n return;\n }\n rafThrottle.current = requestAnimationFrame(() => {\n rafThrottle.current = null;\n const active = dragRef.current;\n if (!active) return;\n let feedback: DragFeedback | null = null;\n if (capability.onDragOver && isOverCanvas(screenPos)) {\n const world = screenToWorldFromContainer(screenPos);\n if (world) feedback = capability.onDragOver(world, active.item, state, config);\n }\n setDrag({ ...active, screenPos, feedback });\n });\n };\n const handleUp = (e: PointerEvent) => {\n const screenPos = { x: e.clientX, y: e.clientY };\n const active = dragRef.current;\n if (!active) return;\n if (rafThrottle.current !== null) {\n cancelAnimationFrame(rafThrottle.current);\n rafThrottle.current = null;\n }\n if (isOverCanvas(screenPos)) {\n const world = screenToWorldFromContainer(screenPos);\n if (world) {\n const nextState = capability.onDrop(world, active.item, state, config);\n setState(nextState);\n emit('canvas.itemAdded');\n }\n }\n setDrag(null);\n };\n window.addEventListener('pointermove', handleMove);\n window.addEventListener('pointerup', handleUp);\n return () => {\n window.removeEventListener('pointermove', handleMove);\n window.removeEventListener('pointerup', handleUp);\n };\n }, [drag, capability, state, config, setState, emit, isOverCanvas, screenToWorldFromContainer]);\n\n const startDrag = useCallback((item: PaletteItem, originScreenPos: Point) => {\n setDrag({ item, screenPos: originScreenPos, feedback: null });\n }, []);\n\n return { drag, startDrag };\n}\n\nexport interface DragOverlayProps {\n drag: DragState | null;\n}\n\nexport function DragOverlay({ drag }: DragOverlayProps) {\n if (!drag) return null;\n return <DragGhost item={drag.item} screenPos={drag.screenPos} />;\n}\n","import type { PaletteItem, Point } from '../instrument/types';\n\nexport interface PaletteProps {\n items: PaletteItem[];\n onDragStart: (item: PaletteItem, originScreenPos: Point) => void;\n className?: string;\n}\n\nexport function Palette({ items, onDragStart, className }: PaletteProps) {\n return (\n <div className={className ? `lk-palette ${className}` : 'lk-palette'}>\n {items.map((item) => (\n <button\n type=\"button\"\n key={item.id}\n className=\"lk-palette__item\"\n onPointerDown={(e) => {\n e.preventDefault();\n onDragStart(item, { x: e.clientX, y: e.clientY });\n }}\n >\n <span className=\"lk-palette__label\">{item.label}</span>\n </button>\n ))}\n </div>\n );\n}\n","import { createContext, useContext } from 'react';\nimport type { Instrument } from '../instrument/types';\nimport type { SavedSnapshot, WorkspaceRecord } from '../state/types';\n\nexport interface LabContextValue {\n instruments: Instrument[];\n workspaces: WorkspaceRecord[];\n addWorkspace: (instrumentName: string) => void;\n cloneWorkspace: (id: string) => void;\n closeWorkspace: (id: string) => void;\n resetWorkspace: (id: string) => void;\n savedSnapshots: SavedSnapshot[];\n saveSnapshot: (workspaceId: string, name?: string) => void;\n loadSnapshot: (workspaceId: string, snapshotId: string) => void;\n deleteSnapshot: (snapshotId: string) => void;\n theme: 'auto' | 'light' | 'interstellar';\n setTheme: (t: 'auto' | 'light' | 'interstellar') => void;\n}\n\nexport const LabContext = createContext<LabContextValue | null>(null);\n\nexport function useLabContext(): LabContextValue {\n const ctx = useContext(LabContext);\n if (ctx === null) {\n throw new Error('useLabContext must be used inside <Lab>');\n }\n return ctx;\n}\n","import { ControlPanel } from '../controls/ControlPanel';\nimport { Sidebar } from '../primitives/Sidebar';\nimport type { WorkspaceSidebarContext } from './slotTypes';\n\nexport interface DefaultSidebarProps {\n ctx: WorkspaceSidebarContext;\n}\n\nexport function DefaultSidebar({ ctx }: DefaultSidebarProps) {\n if (ctx.configFields.length === 0) {\n return (\n <Sidebar title={ctx.instrumentName}>\n <div className=\"lk-sidebar__placeholder\">{ctx.instrumentName} has no config fields.</div>\n </Sidebar>\n );\n }\n return (\n <Sidebar title={ctx.instrumentName}>\n <ControlPanel\n fields={ctx.configFields}\n config={ctx.config as Record<string, unknown>}\n setConfig={(key, value) => ctx.setConfig(key as string, value)}\n />\n </Sidebar>\n );\n}\n","import { StatusBar } from '../primitives/StatusBar';\nimport type { WorkspaceStatusBarContext } from './slotTypes';\n\nexport interface DefaultStatusBarProps {\n ctx: WorkspaceStatusBarContext;\n}\n\nexport function DefaultStatusBar({ ctx }: DefaultStatusBarProps) {\n return (\n <StatusBar>\n <StatusBar.Section>{ctx.instrumentName}</StatusBar.Section>\n <StatusBar.Section>{Math.round(ctx.zoom * 100)}%</StatusBar.Section>\n </StatusBar>\n );\n}\n","import { Toolbar } from '../primitives/Toolbar';\nimport type { WorkspaceToolbarContext } from './slotTypes';\n\nexport interface DefaultToolbarProps {\n ctx: WorkspaceToolbarContext;\n}\n\nexport function DefaultToolbar({ ctx }: DefaultToolbarProps) {\n return (\n <Toolbar>\n {ctx.hasUndo && (\n <>\n <Toolbar.Button onClick={ctx.undo} disabled={!ctx.canUndo} title=\"Undo (Cmd/Ctrl+Z)\">\n Undo\n </Toolbar.Button>\n <Toolbar.Button\n onClick={ctx.redo}\n disabled={!ctx.canRedo}\n title=\"Redo (Cmd/Ctrl+Shift+Z)\"\n >\n Redo\n </Toolbar.Button>\n <Toolbar.Spacer />\n </>\n )}\n\n {ctx.hasCanvas && (\n <>\n <Toolbar.Button onClick={ctx.zoomOut} title=\"Zoom out\">\n −\n </Toolbar.Button>\n <span className=\"lk-toolbar__zoom-label\">{Math.round(ctx.zoom * 100)}%</span>\n <Toolbar.Button onClick={ctx.zoomIn} title=\"Zoom in\">\n +\n </Toolbar.Button>\n <Toolbar.Button onClick={ctx.resetZoom} title=\"Reset zoom\">\n 1:1\n </Toolbar.Button>\n <Toolbar.Spacer />\n </>\n )}\n\n <Toolbar.Button onClick={() => ctx.saveSnapshot()} title=\"Save snapshot (Cmd/Ctrl+S)\">\n Save\n </Toolbar.Button>\n\n {ctx.savedSnapshots.length > 0 && (\n <select\n className=\"lk-toolbar__load-select\"\n aria-label=\"Load snapshot\"\n defaultValue=\"\"\n onChange={(e) => {\n const id = e.target.value;\n if (id) {\n ctx.loadSnapshot(id);\n e.target.value = '';\n }\n }}\n >\n <option value=\"\" disabled>\n Load…\n </option>\n {ctx.savedSnapshots.map((sn) => (\n <option key={sn.id} value={sn.id}>\n {sn.name}\n </option>\n ))}\n </select>\n )}\n\n <Toolbar.Spacer />\n\n <Toolbar.Button onClick={ctx.clone} title=\"Clone workspace\">\n Clone\n </Toolbar.Button>\n <Toolbar.Button onClick={ctx.reset} title=\"Reset workspace\">\n Reset\n </Toolbar.Button>\n <Toolbar.Button\n onClick={ctx.close}\n disabled={ctx.isLastWorkspace}\n title={ctx.isLastWorkspace ? 'Cannot close the last workspace' : 'Close workspace'}\n >\n Close\n </Toolbar.Button>\n </Toolbar>\n );\n}\n","import { type KeyboardEvent, type ReactNode, useContext, useMemo } from 'react';\nimport { useStore } from 'zustand/react';\nimport type { Instrument } from '../instrument/types';\nimport { useLabContext } from '../lab/LabContext';\nimport { LabStoreContext } from '../state/context';\nimport type { WorkspaceRecord } from '../state/types';\nimport { DefaultSidebar } from './DefaultSidebar';\nimport { DefaultStatusBar } from './DefaultStatusBar';\nimport { DefaultToolbar } from './DefaultToolbar';\nimport type {\n SidebarSlot,\n StatusBarSlot,\n ToolbarSlot,\n WorkspaceSidebarContext,\n WorkspaceStatusBarContext,\n WorkspaceToolbarContext,\n} from './slotTypes';\n\nexport interface UndoBindings {\n canUndo: boolean;\n canRedo: boolean;\n undo: () => void;\n redo: () => void;\n}\n\nexport interface WorkspaceChromeProps {\n workspaceId: string;\n record: WorkspaceRecord;\n instrument: Instrument;\n isLastWorkspace: boolean;\n toolbar?: ToolbarSlot;\n sidebar?: SidebarSlot;\n statusBar?: StatusBarSlot;\n undoBindings?: UndoBindings;\n sidebarExtras?: ReactNode;\n children: ReactNode;\n}\n\nexport function WorkspaceChrome({\n workspaceId,\n record,\n instrument,\n isLastWorkspace,\n toolbar,\n sidebar,\n statusBar,\n undoBindings,\n sidebarExtras,\n children,\n}: WorkspaceChromeProps) {\n const lab = useLabContext();\n const storeCtx = useContext(LabStoreContext);\n if (!storeCtx) throw new Error('[labkit] WorkspaceChrome requires <LabStoreProvider>');\n const updateWorkspaceView = useStore(storeCtx.store, (s) => s.updateWorkspaceView);\n const updateWorkspaceConfig = useStore(storeCtx.store, (s) => s.updateWorkspaceConfig);\n const updateWorkspaceState = useStore(storeCtx.store, (s) => s.updateWorkspaceState);\n\n const toolbarCtx = useMemo<WorkspaceToolbarContext>(() => {\n const setZoom = (z: number): void => {\n updateWorkspaceView(workspaceId, { ...record.view, zoom: z });\n };\n return {\n workspaceId,\n instrumentName: record.instrumentName,\n hasUndo: instrument.undo != null,\n canUndo: undoBindings?.canUndo ?? false,\n canRedo: undoBindings?.canRedo ?? false,\n undo: undoBindings?.undo ?? (() => {}),\n redo: undoBindings?.redo ?? (() => {}),\n zoom: record.view.zoom,\n setZoom,\n zoomIn: () => setZoom(record.view.zoom * 1.25),\n zoomOut: () => setZoom(record.view.zoom * 0.8),\n resetZoom: () => setZoom(1),\n hasCanvas: instrument.canvas != null,\n savedSnapshots: lab.savedSnapshots.filter((s) => s.workspaceId === workspaceId),\n saveSnapshot: (name) => lab.saveSnapshot(workspaceId, name),\n loadSnapshot: (snapshotId) => lab.loadSnapshot(workspaceId, snapshotId),\n clone: () => lab.cloneWorkspace(workspaceId),\n reset: () => lab.resetWorkspace(workspaceId),\n close: () => lab.closeWorkspace(workspaceId),\n isLastWorkspace,\n };\n }, [workspaceId, record, instrument, lab, isLastWorkspace, updateWorkspaceView, undoBindings]);\n\n const sidebarCtx = useMemo<WorkspaceSidebarContext>(\n () => ({\n workspaceId,\n instrumentName: record.instrumentName,\n configFields: instrument.configSchema?.() ?? [],\n config: record.config,\n setConfig: (key, value) => {\n const prevConfig = record.config as Record<string, unknown>;\n if (process.env.NODE_ENV !== 'production' && !(key in prevConfig)) {\n console.warn(\n `[labkit] setConfig: unknown key \"${key}\" for instrument \"${record.instrumentName}\"`,\n );\n }\n updateWorkspaceConfig(workspaceId, key as never, value as never);\n if (instrument.onConfigChange) {\n const nextConfig = { ...prevConfig, [key]: value };\n const nextState = instrument.onConfigChange(nextConfig, prevConfig, record.state);\n updateWorkspaceState(workspaceId, nextState as never);\n }\n },\n }),\n [workspaceId, record, instrument, updateWorkspaceConfig, updateWorkspaceState],\n );\n\n const statusCtx: WorkspaceStatusBarContext = {\n workspaceId,\n instrumentName: record.instrumentName,\n zoom: record.view.zoom,\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLDivElement>): void => {\n const mod = e.metaKey || e.ctrlKey;\n if (!mod) return;\n if (e.key === 'z' || e.key === 'Z') {\n e.preventDefault();\n if (e.shiftKey) toolbarCtx.redo();\n else toolbarCtx.undo();\n } else if (e.key === 's' || e.key === 'S') {\n e.preventDefault();\n toolbarCtx.saveSnapshot();\n }\n };\n\n return (\n <section\n className=\"lk-workspace\"\n aria-label={`Workspace ${record.instrumentName}`}\n onKeyDown={handleKeyDown}\n >\n <div className=\"lk-workspace__toolbar\">\n {toolbar ? toolbar(toolbarCtx) : <DefaultToolbar ctx={toolbarCtx} />}\n </div>\n <div className=\"lk-workspace__body\">\n <div className=\"lk-workspace__sidebar\">\n {sidebar ? sidebar(sidebarCtx) : <DefaultSidebar ctx={sidebarCtx} />}\n {sidebarExtras}\n </div>\n <div className=\"lk-workspace__content\">{children}</div>\n </div>\n <div className=\"lk-workspace__status\">\n {statusBar ? statusBar(statusCtx) : <DefaultStatusBar ctx={statusCtx} />}\n </div>\n </section>\n );\n}\n","import { type ReactNode, useContext, useMemo, useRef, useState } from 'react';\nimport { useStore } from 'zustand/react';\nimport { CanvasStack } from '../canvas/CanvasStack';\nimport type { CanvasLayerDescriptor } from '../canvas/useLayerScheduler';\nimport { DragOverlay, useDragDrop } from '../dragdrop/DragDropRuntime';\nimport { Palette } from '../dragdrop/Palette';\nimport type {\n Instrument,\n LayerDescriptor,\n PaletteItem,\n RenderContext,\n ViewTransform,\n} from '../instrument/types';\nimport { useLabContext } from '../lab/LabContext';\nimport { LayerList } from '../layers/LayerList';\nimport { LabStoreContext } from '../state/context';\nimport type { LabStore } from '../state/store';\nimport type { WorkspaceRecord } from '../state/types';\nimport { createEventBus, type EventBus } from '../undo/eventBus';\nimport { pushSnapshot, redo as undoRedo, undo as undoUndo } from '../undo/undoStack';\nimport type { UndoBindings } from './WorkspaceChrome';\nimport { WorkspaceChrome } from './WorkspaceChrome';\n\nexport interface WorkspaceProps {\n id: string;\n}\n\nexport function Workspace({ id }: WorkspaceProps) {\n const lab = useLabContext();\n const storeCtx = useContext(LabStoreContext);\n if (!storeCtx) throw new Error('[labkit] <Workspace> requires <LabStoreProvider>');\n const record = useStore(storeCtx.store, (s) => s.workspaces.find((w) => w.id === id));\n if (!record) {\n return <div className=\"lk-workspace lk-workspace--unknown\">Workspace not found: {id}</div>;\n }\n const instrument = lab.instruments.find((i) => i.name === record.instrumentName);\n if (!instrument) {\n return (\n <div className=\"lk-workspace lk-workspace--unknown\">\n Unknown instrument: {record.instrumentName}\n </div>\n );\n }\n return (\n <WorkspaceRuntime\n record={record}\n instrument={instrument}\n store={storeCtx.store}\n isLast={lab.workspaces.length <= 1}\n />\n );\n}\n\ninterface WorkspaceRuntimeProps {\n record: WorkspaceRecord;\n instrument: Instrument;\n store: LabStore;\n isLast: boolean;\n}\n\nfunction WorkspaceRuntime({ record, instrument, store, isLast }: WorkspaceRuntimeProps) {\n const canvasContainerRef = useRef<HTMLDivElement | null>(null);\n const updateWorkspaceState = useStore(store, (s) => s.updateWorkspaceState);\n const updateWorkspaceConfig = useStore(store, (s) => s.updateWorkspaceConfig);\n const updateWorkspaceView = useStore(store, (s) => s.updateWorkspaceView);\n const updateWorkspaceUndoStack = useStore(store, (s) => s.updateWorkspaceUndoStack);\n\n const busRef = useRef<EventBus | null>(null);\n if (busRef.current === null) busRef.current = createEventBus();\n const bus = busRef.current;\n\n const [layerVisibility, setLayerVisibility] = useState<Record<string, boolean>>({});\n const [layerOrder, setLayerOrder] = useState<string[] | null>(null);\n\n const undoCap = instrument.undo;\n const undoEvents = useMemo(() => new Set(undoCap?.snapshotOn ?? ['state.change']), [undoCap]);\n const maxDepth = undoCap?.maxDepth ?? 50;\n\n const snapshotIfNeeded = (event: string): void => {\n if (!undoCap || !undoEvents.has(event)) return;\n const current = store.getState().workspaces.find((w) => w.id === record.id);\n if (!current) return;\n const snap = structuredClone(current.state);\n updateWorkspaceUndoStack(record.id, (prev) => pushSnapshot(prev, snap, maxDepth));\n };\n\n const setView = (v: ViewTransform): void => updateWorkspaceView(record.id, v);\n\n const renderCtx: RenderContext<unknown, unknown> = {\n state: record.state,\n config: record.config,\n setState: (next) => {\n snapshotIfNeeded('state.change');\n updateWorkspaceState(record.id, next);\n bus.emit('state.change');\n },\n setConfig: (key, value) => {\n const evt = `config.change:${String(key)}`;\n snapshotIfNeeded('config.change');\n snapshotIfNeeded(evt);\n updateWorkspaceConfig(record.id, key as never, value as never);\n bus.emit('config.change');\n bus.emit(evt);\n },\n workspace: {\n id: record.id,\n zoom: record.view.zoom,\n setZoom: (z) => updateWorkspaceView(record.id, { ...record.view, zoom: z }),\n },\n emit: (event) => {\n snapshotIfNeeded(event);\n bus.emit(event);\n },\n };\n\n const undoBindings: UndoBindings | undefined = undoCap\n ? {\n canUndo: record.undoStack.past.length > 0,\n canRedo: record.undoStack.future.length > 0,\n undo: () => {\n const result = undoUndo(record.undoStack, structuredClone(record.state));\n if (!result) return;\n updateWorkspaceState(record.id, result.snapshot as never);\n updateWorkspaceUndoStack(record.id, result.stack);\n },\n redo: () => {\n const result = undoRedo(record.undoStack, structuredClone(record.state));\n if (!result) return;\n updateWorkspaceState(record.id, result.snapshot as never);\n updateWorkspaceUndoStack(record.id, result.stack);\n },\n }\n : undefined;\n\n const canvasLayers: CanvasLayerDescriptor[] = useMemo(() => {\n if (!instrument.canvas) return [];\n const baseLayers = instrument.canvas.layers;\n const ordered = layerOrder\n ? [...baseLayers].sort((a, b) => layerOrder.indexOf(a.id) - layerOrder.indexOf(b.id))\n : baseLayers;\n return ordered.map((layer) => ({\n id: layer.id,\n visible: layerVisibility[layer.id] !== false,\n render: (ctx, view) =>\n layer.draw(ctx, { state: record.state, config: record.config, zoom: view.zoom }),\n }));\n }, [instrument.canvas, record.state, record.config, layerVisibility, layerOrder]);\n\n const layerDescriptors: LayerDescriptor[] = useMemo(() => {\n if (!instrument.layers) return [];\n return instrument.layers.ids.map((lid) => ({ id: lid, label: lid }));\n }, [instrument.layers]);\n\n const dragDropResult = useDragDrop({\n capability: instrument.dragDrop ?? { palette: [], onDrop: (_p, _i, s) => s },\n canvasContainerRef,\n view: record.view,\n state: record.state,\n config: record.config,\n setState: (next) => {\n snapshotIfNeeded('canvas.itemAdded');\n updateWorkspaceState(record.id, next as never);\n },\n emit: (evt) => {\n snapshotIfNeeded(evt);\n bus.emit(evt);\n },\n });\n\n const paletteItems: PaletteItem[] = useMemo(() => {\n if (!instrument.dragDrop) return [];\n const p = instrument.dragDrop.palette;\n return typeof p === 'function' ? p(record.state, record.config) : p;\n }, [instrument.dragDrop, record.state, record.config]);\n\n const layersWithFeedback: CanvasLayerDescriptor[] = useMemo(() => {\n if (!dragDropResult.drag?.feedback) return canvasLayers;\n const fb = dragDropResult.drag.feedback;\n const screen = dragDropResult.drag.screenPos;\n return [\n ...canvasLayers,\n {\n id: '__lk_drag_feedback',\n visible: true,\n render: (ctx) => {\n const el = canvasContainerRef.current;\n if (!el) return;\n const r = el.getBoundingClientRect();\n ctx.save();\n ctx.strokeStyle = fb.ok ? '#3a7' : '#c44';\n ctx.lineWidth = 2;\n ctx.beginPath();\n ctx.arc(screen.x - r.left, screen.y - r.top, 16, 0, Math.PI * 2);\n ctx.stroke();\n ctx.restore();\n },\n },\n ];\n }, [canvasLayers, dragDropResult.drag]);\n\n let body: ReactNode;\n if (instrument.canvas) {\n body = (\n <div\n ref={canvasContainerRef}\n className=\"lk-workspace__canvas-host\"\n style={{ width: '100%', height: '100%', position: 'relative' }}\n >\n <CanvasStack layers={layersWithFeedback} view={record.view} onViewChange={setView} />\n <DragOverlay drag={dragDropResult.drag} />\n </div>\n );\n } else {\n body = instrument.render(renderCtx);\n }\n\n const paletteNode =\n paletteItems.length > 0 ? (\n <Palette items={paletteItems} onDragStart={dragDropResult.startDrag} />\n ) : null;\n\n const layerListNode =\n instrument.layers && layerDescriptors.length > 0 ? (\n <LayerList\n layers={layerDescriptors}\n visibility={layerVisibility}\n onReorder={(next) => {\n setLayerOrder(next.map((l) => l.id));\n bus.emit('layers.reorder');\n }}\n onToggle={(lid, visible) => {\n setLayerVisibility((prev) => ({ ...prev, [lid]: visible }));\n bus.emit('layers.toggle');\n }}\n />\n ) : null;\n\n return (\n <WorkspaceChrome\n workspaceId={record.id}\n record={record}\n instrument={instrument}\n isLastWorkspace={isLast}\n undoBindings={undoBindings}\n sidebarExtras={\n <>\n {paletteNode}\n {layerListNode}\n </>\n }\n >\n {body}\n </WorkspaceChrome>\n );\n}\n","import type { Instrument } from '../instrument/types';\nimport type { WorkspaceRecord } from '../state/types';\n\nconst DEFAULT_VIEW = { zoom: 1, pan: { x: 0, y: 0 } } as const;\n\nfunction findInstrument(instruments: Instrument[], name: string): Instrument {\n const found = instruments.find((i) => i.name === name);\n if (!found) {\n throw new Error(`[labkit] Unknown instrument: \"${name}\"`);\n }\n return found;\n}\n\nfunction initialView(instrument: Instrument): WorkspaceRecord['view'] {\n return instrument.canvas?.initialView\n ? structuredClone(instrument.canvas.initialView)\n : { ...DEFAULT_VIEW, pan: { ...DEFAULT_VIEW.pan } };\n}\n\nexport function addWorkspace(\n workspaces: WorkspaceRecord[],\n instruments: Instrument[],\n instrumentName: string,\n): WorkspaceRecord[] {\n const instrument = findInstrument(instruments, instrumentName);\n const config = instrument.defaultConfig();\n const state = instrument.initialState(config);\n const record: WorkspaceRecord = {\n id: crypto.randomUUID(),\n instrumentName,\n config,\n state,\n view: initialView(instrument),\n undoStack: { past: [], future: [] },\n };\n return [...workspaces, record];\n}\n\nexport function cloneWorkspace(workspaces: WorkspaceRecord[], id: string): WorkspaceRecord[] {\n const sourceIdx = workspaces.findIndex((w) => w.id === id);\n const source = workspaces[sourceIdx];\n if (!source) return workspaces;\n const clone: WorkspaceRecord = {\n ...source,\n id: crypto.randomUUID(),\n config: structuredClone(source.config),\n state: structuredClone(source.state),\n view: structuredClone(source.view),\n undoStack: { past: [], future: [] },\n };\n return [...workspaces.slice(0, sourceIdx + 1), clone, ...workspaces.slice(sourceIdx + 1)];\n}\n\nexport function closeWorkspace(workspaces: WorkspaceRecord[], id: string): WorkspaceRecord[] {\n if (workspaces.length <= 1) return workspaces;\n const next = workspaces.filter((w) => w.id !== id);\n return next.length === workspaces.length ? workspaces : next;\n}\n\nexport function resetWorkspace(\n workspaces: WorkspaceRecord[],\n id: string,\n instruments: Instrument[],\n): WorkspaceRecord[] {\n const idx = workspaces.findIndex((w) => w.id === id);\n const current = workspaces[idx];\n if (!current) return workspaces;\n const instrument = findInstrument(instruments, current.instrumentName);\n const config = instrument.defaultConfig();\n const state = instrument.initialState(config);\n const reset: WorkspaceRecord = {\n ...current,\n config,\n state,\n view: initialView(instrument),\n };\n return [...workspaces.slice(0, idx), reset, ...workspaces.slice(idx + 1)];\n}\n","import type { ReactNode } from 'react';\n\nexport type LabTheme = 'auto' | 'light' | 'interstellar';\n\nexport interface LabShellProps {\n title: string;\n children: ReactNode;\n /** Optional content rendered into the header (e.g., action buttons). */\n header?: ReactNode;\n /** Optional content rendered into the footer. */\n footer?: ReactNode;\n /** Theme override. \"auto\" (default) follows prefers-color-scheme. */\n theme?: LabTheme;\n}\n\nexport function LabShell({ title, children, header, footer, theme = 'auto' }: LabShellProps) {\n const themeClass =\n theme === 'light'\n ? ' lk-theme-light'\n : theme === 'interstellar'\n ? ' lk-theme-interstellar'\n : '';\n return (\n <div className={`lk-root lk-shell${themeClass}`}>\n <header className=\"lk-shell-header\">\n <h1 className=\"lk-shell-title\">{title}</h1>\n {header && <div className=\"lk-shell-header-actions\">{header}</div>}\n </header>\n <main className=\"lk-shell-body\">{children}</main>\n {footer && <footer className=\"lk-shell-footer\">{footer}</footer>}\n </div>\n );\n}\n","import { Children, type CSSProperties, type ReactNode } from 'react';\nimport { gridDims } from './gridDims';\n\nexport interface WorkspaceGridProps {\n children: ReactNode;\n}\n\nexport function WorkspaceGrid({ children }: WorkspaceGridProps) {\n const count = Children.count(children);\n const { cols, rows } = gridDims(count);\n const style = {\n '--lk-grid-cols': String(cols),\n '--lk-grid-rows': String(rows),\n } as CSSProperties;\n return (\n <div className=\"lk-workspace-grid\" style={style}>\n {children}\n </div>\n );\n}\n","import { type CSSProperties, type ReactNode, useEffect, useMemo, useRef } from 'react';\nimport { useStore } from 'zustand/react';\nimport type { Instrument } from '../instrument/types';\nimport { noneAdapter } from '../state/adapters';\nimport { LabStoreContext } from '../state/context';\nimport { createLabStore, type LabStore } from '../state/store';\nimport type { StorageAdapter, WorkspaceRecord } from '../state/types';\nimport { Workspace } from '../workspace/Workspace';\nimport {\n addWorkspace as addWorkspaceOp,\n cloneWorkspace as cloneWorkspaceOp,\n closeWorkspace as closeWorkspaceOp,\n resetWorkspace as resetWorkspaceOp,\n} from '../workspace/workspaceOps';\nimport { LabContext, type LabContextValue } from './LabContext';\nimport { LabShell } from './LabShell';\nimport { WorkspaceGrid } from './WorkspaceGrid';\n\nexport interface LabProps {\n instruments: Instrument[];\n defaultInstrument: string;\n storage?: StorageAdapter | null;\n storageKey?: string;\n theme?: 'auto' | 'light' | 'interstellar';\n /**\n * Optional list of CSS colors used to compose the interstellar theme's\n * cosmic backdrop. Each color becomes one radial-gradient blob on the\n * dark void base. Order maps to a fixed spread of positions; extras wrap\n * around. Ignored unless `theme=\"interstellar\"` is active.\n */\n nebula?: readonly string[];\n title?: string;\n children?: ReactNode;\n}\n\nfunction buildStore(\n instruments: Instrument[],\n defaultInstrument: string,\n storage: StorageAdapter,\n storageKey: string,\n initialTheme: 'auto' | 'light' | 'interstellar',\n): LabStore {\n const store = createLabStore({ storageKey, storage, initialTheme });\n if (store.getState().workspaces.length === 0) {\n const seeded = addWorkspaceOp([], instruments, defaultInstrument);\n const record = seeded[0];\n if (record) {\n const { undoStack: _undoStack, ...rest } = record;\n store.getState().addWorkspace(rest);\n }\n }\n return store;\n}\n\n// Fixed spread of nebula blob positions / sizes / fall-off stops. Colors\n// supplied via the `nebula` prop are slotted into these slots in order;\n// callers passing more than 5 wrap around (intentional — keeps the look\n// readable and bounded).\nconst NEBULA_SLOTS = [\n { cx: '18%', cy: '30%', sx: '60%', sy: '80%', stop: '70%' },\n { cx: '78%', cy: '70%', sx: '55%', sy: '90%', stop: '65%' },\n { cx: '50%', cy: '50%', sx: '50%', sy: '70%', stop: '75%' },\n { cx: '12%', cy: '82%', sx: '50%', sy: '70%', stop: '70%' },\n { cx: '85%', cy: '18%', sx: '55%', sy: '80%', stop: '70%' },\n] as const;\n\nfunction buildNebula(colors: readonly string[]): string {\n const blobs = colors.map((c, i) => {\n const p = NEBULA_SLOTS[i % NEBULA_SLOTS.length]!;\n return `radial-gradient(ellipse ${p.sx} ${p.sy} at ${p.cx} ${p.cy}, color-mix(in srgb, ${c} 22%, transparent), transparent ${p.stop})`;\n });\n blobs.push('radial-gradient(ellipse at center, #0a0a18 0%, #02020a 100%)');\n return blobs.join(', ');\n}\n\nexport function Lab({\n instruments,\n defaultInstrument,\n storage,\n storageKey,\n theme,\n nebula,\n title,\n children,\n}: LabProps) {\n if (process.env.NODE_ENV !== 'production' && instruments.length === 0) {\n throw new Error('[labkit] <Lab> requires a non-empty `instruments` array');\n }\n\n const storeRef = useRef<LabStore | null>(null);\n if (storeRef.current === null) {\n storeRef.current = buildStore(\n instruments,\n defaultInstrument,\n storage ?? noneAdapter,\n storageKey ?? 'labkit',\n theme ?? 'auto',\n );\n }\n const store = storeRef.current;\n\n const workspaces = useStore(store, (s) => s.workspaces);\n const savedSnapshots = useStore(store, (s) => s.savedSnapshots);\n const themeValue = useStore(store, (s) => s.theme);\n\n useEffect(() => {\n if (theme && theme !== store.getState().theme) {\n store.getState().setTheme(theme);\n }\n }, [theme, store]);\n\n const contextValue = useMemo<LabContextValue>(() => {\n const replaceWorkspaces = (next: WorkspaceRecord[]): void => {\n const currentById = new Map(store.getState().workspaces.map((w) => [w.id, w]));\n const merged = next.map((w) => currentById.get(w.id) ?? w);\n store.setState({ workspaces: merged });\n // Trigger persistence flush via a tracked action.\n store.getState().setTheme(store.getState().theme);\n };\n\n return {\n instruments,\n workspaces,\n addWorkspace: (instrumentName) => {\n const next = addWorkspaceOp(store.getState().workspaces, instruments, instrumentName);\n replaceWorkspaces(next);\n },\n cloneWorkspace: (id) => {\n const next = cloneWorkspaceOp(store.getState().workspaces, id);\n replaceWorkspaces(next);\n },\n closeWorkspace: (id) => {\n const next = closeWorkspaceOp(store.getState().workspaces, id);\n replaceWorkspaces(next);\n },\n resetWorkspace: (id) => {\n const next = resetWorkspaceOp(store.getState().workspaces, id, instruments);\n const record = next.find((w) => w.id === id);\n if (!record) return;\n store.setState((s) => ({\n workspaces: s.workspaces.map((w) =>\n w.id === id\n ? { ...w, config: record.config, state: record.state, view: record.view }\n : w,\n ),\n }));\n store.getState().updateWorkspaceView(id, record.view);\n },\n savedSnapshots,\n saveSnapshot: (workspaceId, name) => {\n store.getState().saveSnapshot(workspaceId, name ?? `Save ${new Date().toLocaleString()}`);\n },\n loadSnapshot: (workspaceId, snapshotId) => {\n store.getState().loadSnapshot(snapshotId, workspaceId);\n },\n deleteSnapshot: (snapshotId) => {\n store.getState().deleteSnapshot(snapshotId);\n },\n theme: themeValue,\n setTheme: (t) => {\n store.getState().setTheme(t);\n },\n };\n }, [instruments, workspaces, savedSnapshots, themeValue, store]);\n\n const themeClass =\n themeValue === 'light'\n ? 'lk-theme-light'\n : themeValue === 'interstellar'\n ? 'lk-theme-interstellar'\n : '';\n\n // Only apply the nebula override when interstellar is active and at\n // least one color is provided. Setting a CSS custom property is the\n // sanctioned use of inline style.\n const nebulaStyle =\n themeValue === 'interstellar' && nebula && nebula.length > 0\n ? ({ ['--lk-space-nebula' as string]: buildNebula(nebula) } as CSSProperties)\n : undefined;\n\n return (\n <LabStoreContext.Provider value={{ store }}>\n <LabContext.Provider value={contextValue}>\n <div className={`lk-lab ${themeClass}`.trim()} style={nebulaStyle}>\n <LabShell title={title ?? 'Labkit'} theme={themeValue} header={children}>\n <WorkspaceGrid>\n {workspaces.map((w) => (\n <Workspace key={w.id} id={w.id} />\n ))}\n </WorkspaceGrid>\n </LabShell>\n </div>\n </LabContext.Provider>\n </LabStoreContext.Provider>\n );\n}\n","import { useCallback, useMemo } from 'react';\nimport { type ControlPoint, CurveEditor, dlog } from '../../passthrough/weasel-ui';\n\nexport type CurveMark =\n | { kind: 'band'; x: [number, number]; color?: string }\n | { kind: 'line'; x: number; color?: string };\n\nexport interface CurveFieldProps {\n /** Flat [x0, y0, x1, y1, …] — matches how curve-as-array configs\n * serialize in JSON snapshots. */\n values: number[];\n min: number;\n max: number;\n step: number;\n /** Plot width in CSS px. Caller sizes (typically uses a ResizeObserver). */\n width: number;\n /** Plot height in CSS px. Default 110. */\n height?: number;\n /** Flat default curve. When provided, a Reset button restores it. */\n defaults?: readonly number[];\n onChange: (next: number[]) => void;\n /** Optional vertical marks overlaid on the plot (e.g. landmarks). */\n marks?: readonly CurveMark[];\n}\n\n/**\n * A function-domain (y = f(x), x ∈ [0,1]) curve editor with per-stop\n * numeric readouts and flip buttons. Wraps weasel-ui's\n * `CurveEditor`; consumers wanting the raw editor (2D paths,\n * custom anchors) should import it from `@weasel-js/labkit/weasel-ui`.\n */\nexport function CurveField({\n values,\n min,\n max,\n step,\n width,\n height = 110,\n defaults,\n onChange,\n marks,\n}: CurveFieldProps) {\n const points: ControlPoint[] = useMemo(() => {\n const out: ControlPoint[] = [];\n for (let i = 0; i + 1 < values.length; i += 2) out.push({ x: values[i]!, y: values[i + 1]! });\n return out;\n }, [values]);\n\n const handleChange = useCallback(\n (next: ControlPoint[]) => {\n const flat: number[] = new Array(next.length * 2);\n for (let i = 0; i < next.length; i++) {\n const ySnap = Math.round(next[i]!.y / step) * step;\n const y = Math.max(min, Math.min(max, ySnap));\n flat[i * 2] = next[i]!.x;\n flat[i * 2 + 1] = y;\n }\n dlog('curve-field', 'handleChange', {\n nLen: next.length,\n flatLen: flat.length,\n sample: flat.slice(0, 4),\n });\n onChange(flat);\n },\n [onChange, min, max, step],\n );\n\n const handleFlip = useCallback(() => {\n const flipped: Array<{ x: number; y: number }> = [];\n for (let i = 0; i + 1 < values.length; i += 2) {\n flipped.push({ x: 1 - values[i]!, y: values[i + 1]! });\n }\n flipped.sort((a, b) => a.x - b.x);\n const out: number[] = [];\n for (const p of flipped) out.push(p.x, p.y);\n onChange(out);\n }, [values, onChange]);\n\n const handleFlipVertical = useCallback(() => {\n const mid = (min + max) / 2;\n const flipped: number[] = new Array(values.length);\n for (let i = 0; i + 1 < values.length; i += 2) {\n flipped[i] = values[i]!;\n flipped[i + 1] = 2 * mid - values[i + 1]!;\n }\n onChange(flipped);\n }, [values, min, max, onChange]);\n\n return (\n <div className=\"lk-curve-field\">\n <div className=\"lk-curve-field__plot\">\n <CurveEditor\n value={points}\n onChange={handleChange}\n domain=\"1d\"\n constrain=\"function\"\n xRange={[0, 1]}\n yRange={[min, max]}\n width={width}\n height={height}\n endpoints=\"pinned-x\"\n addPointMode=\"click-curve\"\n minPoints={2}\n grid={{}}\n history={false}\n />\n {marks && marks.length > 0 && (\n <svg\n className=\"lk-curve-field__marks\"\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n aria-hidden=\"true\"\n >\n {marks.map((m) => {\n const color = m.color ?? '#ffcc00';\n if (m.kind === 'band') {\n const x0 = Math.max(0, Math.min(1, m.x[0])) * width;\n const x1 = Math.max(0, Math.min(1, m.x[1])) * width;\n const left = Math.min(x0, x1);\n const w = Math.abs(x1 - x0);\n return (\n <g key={`band-${m.x[0]}-${m.x[1]}-${color}`}>\n <rect x={left} y={0} width={w} height={height} fill={color} fillOpacity={0.4} />\n <line\n x1={left}\n y1={0}\n x2={left}\n y2={height}\n stroke={color}\n strokeOpacity={0.85}\n strokeWidth={1}\n />\n <line\n x1={left + w}\n y1={0}\n x2={left + w}\n y2={height}\n stroke={color}\n strokeOpacity={0.85}\n strokeWidth={1}\n />\n </g>\n );\n }\n const x = Math.max(0, Math.min(1, m.x)) * width;\n return (\n <line\n key={`mark-${m.x}-${color}`}\n x1={x}\n y1={0}\n x2={x}\n y2={height}\n stroke={color}\n strokeWidth={1}\n />\n );\n })}\n </svg>\n )}\n </div>\n <div className=\"lk-curve-field__actions\">\n <button type=\"button\" className=\"lk-curve-field__action\" onClick={handleFlip}>\n Flip horizontally\n </button>\n <button type=\"button\" className=\"lk-curve-field__action\" onClick={handleFlipVertical}>\n Flip vertically\n </button>\n {defaults && (\n <button\n type=\"button\"\n className=\"lk-curve-field__action\"\n onClick={() => onChange([...defaults])}\n >\n Reset\n </button>\n )}\n </div>\n </div>\n );\n}\n","import { type CSSProperties, type ReactNode, useState } from 'react';\n\n// ── Subpanel ─────────────────────────────────────────────────────────\n// Headered group of controls inside a wider panel/list. The header is a\n// label flanked by a horizontal rule — no background, padding, or border;\n// purely a typographic divider. Ported from speech-balloons styles.css:277-313.\n\nexport interface SubpanelProps {\n title: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\nexport function Subpanel({ title, children, className }: SubpanelProps) {\n const cls = className ? `lk-subpanel ${className}` : 'lk-subpanel';\n return (\n <div className={cls}>\n <h4 className=\"lk-subpanel__title\">\n <span>{title}</span>\n <hr />\n </h4>\n {children}\n </div>\n );\n}\n\n// ── EffectCard ───────────────────────────────────────────────────────\n// Draggable, collapsible card for stacked effect editors. Optional --lk-panel-accent\n// per-instance recolors the title bar, border-left, and (via re-binding --lk-accent\n// inside the card) every descendant control that reads from the accent token.\n\nexport interface EffectCardProps {\n /** Card title rendered in the title bar (e.g. effect kind label or a select). */\n title: ReactNode;\n /** Optional badge/chip displayed before the remove button (e.g. primary value summary). */\n primary?: ReactNode;\n /** Optional accent color in any CSS color form. Sets --lk-panel-accent on the card. */\n accent?: string;\n /** Optional ordinal badge that doubles as the drag handle (used by tail cards in SB). */\n index?: number;\n expanded?: boolean;\n onToggleExpanded?: () => void;\n onRemove?: () => void;\n /**\n * Drag-handle wiring. When provided, an inline handle (⋮⋮ icon or `index`)\n * activates HTML5 drag on press. Consumer owns the drag/drop coordination —\n * see EffectCardList for the batteries-included wrapper.\n */\n draggable?: boolean;\n onPressHandle?: () => void;\n onReleaseHandle?: () => void;\n onDragStart?: (e: React.DragEvent<HTMLDivElement>) => void;\n onDragEnd?: (e: React.DragEvent<HTMLDivElement>) => void;\n onDragOver?: (e: React.DragEvent<HTMLDivElement>) => void;\n onDragLeave?: (e: React.DragEvent<HTMLDivElement>) => void;\n onDrop?: (e: React.DragEvent<HTMLDivElement>) => void;\n dragging?: boolean;\n children?: ReactNode;\n className?: string;\n}\n\nexport function EffectCard({\n title,\n primary,\n accent,\n index,\n expanded = true,\n onToggleExpanded,\n onRemove,\n draggable,\n onPressHandle,\n onReleaseHandle,\n onDragStart,\n onDragEnd,\n onDragOver,\n onDragLeave,\n onDrop,\n dragging,\n children,\n className,\n}: EffectCardProps) {\n const stateClass = `${expanded ? 'is-expanded' : 'is-collapsed'}${dragging ? ' is-dragging' : ''}${accent ? ' has-accent' : ''}`;\n const cls = `lk-effect-card ${stateClass}${className ? ` ${className}` : ''}`;\n // Per-instance dynamic color → CSS custom property requires inline style.\n // The card's CSS re-binds --lk-accent to --lk-panel-accent so descendants tint.\n const style = accent ? ({ '--lk-panel-accent': accent } as CSSProperties) : undefined;\n\n // When a toggle handler is supplied the header acts as a disclosure button:\n // role + tab stop + Enter/Space. Bundled together so the interactive props are\n // applied as a set (no half-interactive element when onToggleExpanded is absent).\n const headProps = onToggleExpanded\n ? {\n role: 'button' as const,\n tabIndex: 0,\n onClick: onToggleExpanded,\n onKeyDown: (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onToggleExpanded();\n }\n },\n }\n : {};\n\n return (\n // biome-ignore lint/a11y/noStaticElementInteractions: native HTML5 drag-and-drop container — drag events are not click/keyboard interactions and have no semantic element; the in-card handle and header carry the a11y affordances.\n <div\n className={cls}\n style={style}\n draggable={draggable}\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n onDragOver={onDragOver}\n onDragLeave={onDragLeave}\n onDrop={onDrop}\n >\n <div className=\"lk-effect-card__head\" {...headProps}>\n {index != null ? (\n <button\n type=\"button\"\n className=\"lk-effect-card__index-badge lk-effect-card__handle\"\n title=\"Drag to reorder · click to toggle\"\n aria-label={`Item ${index + 1} — drag to reorder, click to toggle`}\n onMouseDown={onPressHandle}\n onMouseUp={onReleaseHandle}\n onClick={(e) => {\n e.stopPropagation();\n onToggleExpanded?.();\n }}\n >\n {index + 1}\n </button>\n ) : (\n <span\n className=\"lk-effect-card__handle\"\n aria-hidden=\"true\"\n title=\"Drag to reorder\"\n onMouseDown={onPressHandle}\n onMouseUp={onReleaseHandle}\n >\n <DragHandleIcon />\n </span>\n )}\n <span className=\"lk-effect-card__title\">{title}</span>\n {primary != null && <span className=\"lk-effect-card__primary\">{primary}</span>}\n {onRemove && (\n <button\n type=\"button\"\n className=\"lk-effect-card__remove\"\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n title=\"Remove\"\n aria-label=\"Remove\"\n >\n ✕\n </button>\n )}\n </div>\n {expanded && <div className=\"lk-effect-card__body\">{children}</div>}\n </div>\n );\n}\n\nfunction DragHandleIcon() {\n return (\n <svg width=\"10\" height=\"14\" viewBox=\"0 0 10 14\" aria-hidden=\"true\">\n <circle cx=\"3\" cy=\"3\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"7\" cy=\"3\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"3\" cy=\"7\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"7\" cy=\"7\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"3\" cy=\"11\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"7\" cy=\"11\" r=\"1.3\" fill=\"currentColor\" />\n </svg>\n );\n}\n\n// ── EffectCardList ───────────────────────────────────────────────────\n// Batteries-included list wrapper that coordinates HTML5 drag-and-drop across\n// a list of EffectCards. Consumer supplies items + a renderItem callback;\n// onReorder fires with (sourceId, targetId, position) on drop. Mirrors the\n// LayerStack pattern from speech-balloons Lab.tsx:630-707.\n\nexport interface EffectCardListItem {\n id: string | number;\n}\n\nexport interface EffectCardListProps<T extends EffectCardListItem> {\n items: ReadonlyArray<T>;\n renderItem: (\n item: T,\n helpers: {\n isExpanded: boolean;\n isDragging: boolean;\n toggleExpanded: () => void;\n cardProps: Pick<\n EffectCardProps,\n | 'expanded'\n | 'dragging'\n | 'draggable'\n | 'onToggleExpanded'\n | 'onPressHandle'\n | 'onReleaseHandle'\n | 'onDragStart'\n | 'onDragEnd'\n | 'onDragOver'\n | 'onDragLeave'\n | 'onDrop'\n >;\n },\n ) => ReactNode;\n onReorder: (sourceId: T['id'], targetId: T['id'], position: 'before' | 'after') => void;\n /** Optional rendered when the list is empty. */\n empty?: ReactNode;\n /** IDs to render expanded on first mount. Defaults to all collapsed. */\n defaultExpandedIds?: ReadonlyArray<T['id']>;\n}\n\nexport function EffectCardList<T extends EffectCardListItem>({\n items,\n renderItem,\n onReorder,\n empty,\n defaultExpandedIds,\n}: EffectCardListProps<T>) {\n const [expanded, setExpanded] = useState<Set<T['id']>>(() => new Set(defaultExpandedIds ?? []));\n const [draggingId, setDraggingId] = useState<T['id'] | null>(null);\n const [pressedId, setPressedId] = useState<T['id'] | null>(null);\n const [dropHint, setDropHint] = useState<{ id: T['id']; position: 'before' | 'after' } | null>(\n null,\n );\n\n if (items.length === 0) {\n return <>{empty ?? <div className=\"lk-effect-card-list__empty\">No items.</div>}</>;\n }\n\n return (\n <div className=\"lk-effect-card-list\">\n {items.map((item) => {\n const isExpanded = expanded.has(item.id);\n const isDragging = draggingId === item.id;\n const isPressed = pressedId === item.id;\n const showHintBefore =\n dropHint && dropHint.id === item.id && dropHint.position === 'before';\n const showHintAfter = dropHint && dropHint.id === item.id && dropHint.position === 'after';\n\n const toggleExpanded = () =>\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(item.id)) next.delete(item.id);\n else next.add(item.id);\n return next;\n });\n\n return (\n <div key={String(item.id)} className=\"lk-effect-card-list__wrap\">\n {showHintBefore && <div className=\"lk-effect-card-list__drop-hint\" />}\n {renderItem(item, {\n isExpanded,\n isDragging,\n toggleExpanded,\n cardProps: {\n expanded: isExpanded,\n dragging: isDragging,\n draggable: isPressed,\n onToggleExpanded: toggleExpanded,\n onPressHandle: () => setPressedId(item.id),\n onReleaseHandle: () => setPressedId(null),\n onDragStart: (e) => {\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('text/plain', String(item.id));\n setDraggingId(item.id);\n },\n onDragEnd: () => {\n setDraggingId(null);\n setPressedId(null);\n setDropHint(null);\n },\n onDragOver: (e) => {\n if (draggingId === null || draggingId === item.id) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n const rect = (e.currentTarget as HTMLDivElement).getBoundingClientRect();\n const position: 'before' | 'after' =\n e.clientY < rect.top + rect.height / 2 ? 'before' : 'after';\n setDropHint({ id: item.id, position });\n },\n onDragLeave: () => {\n setDropHint((h) => (h && h.id === item.id ? null : h));\n },\n onDrop: (e) => {\n e.preventDefault();\n if (draggingId === null || draggingId === item.id) {\n setDropHint(null);\n return;\n }\n const rect = (e.currentTarget as HTMLDivElement).getBoundingClientRect();\n const position: 'before' | 'after' =\n e.clientY < rect.top + rect.height / 2 ? 'before' : 'after';\n onReorder(draggingId, item.id, position);\n setDropHint(null);\n },\n },\n })}\n {showHintAfter && <div className=\"lk-effect-card-list__drop-hint\" />}\n </div>\n );\n })}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\nexport interface PropertyGroupProps {\n /** Title rendered between two rules at the top of the group. */\n title: ReactNode;\n /** When true the group renders nothing — useful for conditional sections. */\n hidden?: boolean;\n children: ReactNode;\n className?: string;\n /**\n * How rows pack into the 2-column grid.\n * - `'auto-color'` (default): only color rows pair side-by-side; everything\n * else spans the full width.\n * - `'pairs'`: every row auto-places into the 2-column grid two-per-row.\n */\n pack?: 'auto-color' | 'pairs';\n}\n\n/**\n * Visually-bordered group inside a PropertyList. Use to scope a set of\n * related rows under a heading (e.g. \"Aqua\", \"Bevel\", \"Dome\" sections\n * inside a fill effect's controls).\n */\nexport function PropertyGroup({\n title,\n hidden,\n children,\n className,\n pack = 'auto-color',\n}: PropertyGroupProps) {\n if (hidden) return null;\n const packClass = pack === 'pairs' ? ' lk-property-group--pairs' : '';\n const cls = `lk-property-group${packClass}${className ? ` ${className}` : ''}`;\n return (\n <div className={cls}>\n <h3 className=\"lk-property-group__title\">\n <hr />\n <span>{title}</span>\n <hr />\n </h3>\n <div className=\"lk-property-group__body\">{children}</div>\n </div>\n );\n}\n","// Display formatting helpers shared across the UI.\n//\n// House style: render negative numbers with the typographic MINUS SIGN\n// (U+2212, \"−\") instead of ASCII hyphen-minus (\"-\"). Editing surfaces should\n// accept either glyph on input via `parseSignedNumber`.\n\nconst MINUS = '−';\n\n/** Format a finite number for display, swapping the leading \"-\" to U+2212. */\nexport function formatNumber(n: number, fractionDigits?: number): string {\n if (!Number.isFinite(n)) return String(n);\n const s = fractionDigits == null ? String(n) : n.toFixed(fractionDigits);\n return s.startsWith('-') ? MINUS + s.slice(1) : s;\n}\n\n/** Parse a string that may use U+2212 or ASCII hyphen-minus for the negative sign. */\nexport function parseSignedNumber(s: string): number {\n return Number(s.replace(MINUS, '-'));\n}\n","import { type ReactNode, useState } from 'react';\nimport { dlog } from '../../passthrough/weasel-ui';\nimport { formatNumber, parseSignedNumber } from '../format';\n\nexport interface PropertyPanelProps {\n title?: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\nexport function PropertyPanel({ title, children, className }: PropertyPanelProps) {\n const cls = className ? `lk-property-panel ${className}` : 'lk-property-panel';\n return (\n <div className={cls}>\n {title != null && <h2 className=\"lk-property-panel__title\">{title}</h2>}\n {children}\n </div>\n );\n}\n\nexport type PropertyListPack = 'auto-color' | 'pairs';\n\nexport interface PropertyListProps {\n children: ReactNode;\n className?: string;\n /**\n * How rows pack into the 2-column grid.\n * - `'auto-color'` (default): only color rows pair side-by-side; everything\n * else spans the full width. Right for sparse top-level panels.\n * - `'pairs'`: every row auto-places into the 2-column grid two-per-row.\n * Headers, subpanels, and full-width children (`<hr>`, curve blocks)\n * still span via `lk-property-list__span`. Right for dense effect bodies.\n */\n pack?: PropertyListPack;\n}\n\n/**\n * Grid container for PropertyRows. Use standalone for chrome-less layouts, or\n * nest inside <PropertyPanel/> for the standard glass card.\n */\nexport function PropertyList({ children, className, pack = 'auto-color' }: PropertyListProps) {\n const packClass = pack === 'pairs' ? ' lk-property-list--pairs' : '';\n const cls = `lk-property-list${packClass}${className ? ` ${className}` : ''}`;\n return <div className={cls}>{children}</div>;\n}\n\nexport type PropertyRowVariant = 'default' | 'color' | 'checkbox';\nexport type PropertyRowLayout = 'block' | 'inline';\n\nexport interface PropertyRowProps {\n label: ReactNode;\n /** Right-aligned readout shown next to the label (e.g. current value). */\n readout?: ReactNode;\n variant?: PropertyRowVariant;\n /**\n * Label position relative to the control. \"block\" (default) stacks\n * label above control; \"inline\" places the label to the left.\n * Color and checkbox variants are always inline by their own nature.\n */\n layout?: PropertyRowLayout;\n children: ReactNode;\n htmlFor?: string;\n className?: string;\n}\n\nexport function PropertyRow({\n label,\n readout,\n variant = 'default',\n layout = 'block',\n children,\n htmlFor,\n className,\n}: PropertyRowProps) {\n const variantClass = variant === 'default' ? '' : ` lk-property-row--${variant}`;\n // Layout only meaningfully applies to the default variant; color and\n // checkbox have their own intrinsic orientation.\n const layoutClass =\n variant === 'default' && layout === 'inline' ? ' lk-property-row--inline' : '';\n const cls = `lk-property-row${variantClass}${layoutClass}${className ? ` ${className}` : ''}`;\n return (\n <label className={cls} htmlFor={htmlFor}>\n <span className=\"lk-property-row__label\">\n {label}\n {readout != null && <em className=\"lk-property-row__readout\">{readout}</em>}\n </span>\n {children}\n </label>\n );\n}\n\n// ── Row implementations ──────────────────────────────────────────────\n\nexport interface SliderRowProps {\n label: ReactNode;\n value: number;\n min: number;\n max: number;\n step?: number;\n onChange: (next: number) => void;\n /** Override how the value is rendered next to the label. Defaults to `value.toString()`. */\n format?: (value: number) => ReactNode;\n /**\n * Optional suffix rendered next to the readout. A string becomes a\n * baseline-aligned dim \"word\" unit (e.g. \"px\"); pass JSX like `<sup>°</sup>`\n * to get the browser's native super positioning for symbol units.\n */\n unit?: ReactNode;\n layout?: PropertyRowLayout;\n}\n\nexport function SliderRow({\n label,\n value,\n min,\n max,\n step = 1,\n onChange,\n format,\n unit,\n layout,\n}: SliderRowProps) {\n // Default readout precision tracks `step`: integer steps → 0 decimals,\n // 0.1 → 1 decimal, 0.05/0.02/0.01 → 2 decimals, 0.005 → 3, etc. Callers\n // can still pass an explicit `format` to override (e.g. for a custom\n // unit string or a non-decimal display like fractions).\n const decimals = step >= 1 ? 0 : Math.min(6, Math.max(0, Math.ceil(-Math.log10(step))));\n const effectiveFormat = format ?? ((n: number) => formatNumber(n, decimals));\n return (\n <PropertyRow\n label={label}\n readout={\n <EditableReadout\n value={value}\n min={min}\n max={max}\n format={effectiveFormat}\n unit={unit}\n onCommit={onChange}\n />\n }\n layout={layout}\n >\n <input\n type=\"range\"\n tabIndex={-1}\n min={min}\n max={max}\n step={step}\n value={value}\n onChange={(e) => {\n const v = Number(e.target.value);\n dlog('property-panel', 'slider', { label, value: v });\n onChange(v);\n }}\n />\n </PropertyRow>\n );\n}\n\ninterface EditableReadoutProps {\n value: number;\n min: number;\n max: number;\n format?: (value: number) => ReactNode;\n unit?: ReactNode;\n onCommit: (next: number) => void;\n}\n\n/**\n * Readout that swaps to a number input on click, commits on Enter/blur,\n * cancels on Escape. Clicks are stopped so the wrapping <label> doesn't\n * forward focus to the slider thumb.\n */\nfunction EditableReadout({ value, min, max, format, unit, onCommit }: EditableReadoutProps) {\n // Draft is non-null only while the input is focused. Live value mirrors\n // into the input otherwise. Pattern mirrors speech-balloons Lab.tsx:893-942.\n const [draft, setDraft] = useState<string | null>(null);\n const fmt = (n: number) => (format ? format(n) : formatNumber(n));\n const displayValue =\n draft !== null\n ? draft\n : (() => {\n const formatted = fmt(value);\n return typeof formatted === 'string' ? formatted : String(formatted);\n })();\n\n const suffix =\n unit == null ? null : typeof unit === 'string' ? (\n <span className=\"lk-property-row__readout-unit\">{unit}</span>\n ) : (\n unit\n );\n\n const commit = () => {\n if (draft !== null) {\n const n = parseSignedNumber(draft);\n if (Number.isFinite(n)) onCommit(Math.min(max, Math.max(min, n)));\n }\n setDraft(null);\n };\n\n return (\n <span className=\"lk-property-row__readout-group\">\n <input\n type=\"text\"\n inputMode=\"decimal\"\n className=\"lk-property-row__readout-input\"\n value={displayValue}\n onFocus={(e) => {\n const formatted = fmt(value);\n setDraft(typeof formatted === 'string' ? formatted : String(formatted));\n e.currentTarget.select();\n }}\n onChange={(e) => setDraft(e.target.value.replace(/-/g, '−'))}\n onBlur={commit}\n onClick={(e) => {\n // Stop the click from reaching the wrapping <label> (which would\n // forward focus to the slider thumb).\n e.preventDefault();\n e.stopPropagation();\n e.currentTarget.focus();\n }}\n onMouseDown={(e) => e.stopPropagation()}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n commit();\n e.currentTarget.blur();\n } else if (e.key === 'Escape') {\n setDraft(null);\n e.currentTarget.blur();\n }\n }}\n />\n {suffix}\n </span>\n );\n}\n\nexport interface ColorRowProps {\n label: ReactNode;\n value: string;\n onChange: (next: string) => void;\n /** 0..1 alpha. When provided, a translucent slider renders beneath the swatch. */\n alpha?: number;\n onAlphaChange?: (next: number) => void;\n /**\n * Render the alpha track as inert (dimmed, no thumb, not-allowed cursor).\n * Use when the color's consumer drops alpha so the affordance reads dead.\n */\n alphaDisabled?: boolean;\n}\n\nexport function ColorRow({\n label,\n value,\n onChange,\n alpha,\n onAlphaChange,\n alphaDisabled,\n}: ColorRowProps) {\n const showAlpha = alpha != null;\n const className = alphaDisabled ? 'lk-property-row--alpha-disabled' : undefined;\n return (\n <PropertyRow label={label} variant=\"color\" className={className}>\n <input type=\"color\" value={value} onChange={(e) => onChange(e.target.value)} />\n {showAlpha && (\n <input\n type=\"range\"\n className=\"lk-property-row__alpha\"\n min={0}\n max={1}\n step={0.01}\n value={alpha}\n disabled={alphaDisabled}\n onChange={(e) => onAlphaChange?.(Number(e.target.value))}\n />\n )}\n </PropertyRow>\n );\n}\n\nexport interface CheckboxRowProps {\n label: ReactNode;\n value: boolean;\n onChange: (next: boolean) => void;\n}\n\nexport function CheckboxRow({ label, value, onChange }: CheckboxRowProps) {\n return (\n <PropertyRow label={label} variant=\"checkbox\">\n <input type=\"checkbox\" checked={value} onChange={(e) => onChange(e.target.checked)} />\n </PropertyRow>\n );\n}\n\nexport interface TextRowProps {\n label: ReactNode;\n value: string;\n onChange: (next: string) => void;\n placeholder?: string;\n maxLength?: number;\n layout?: PropertyRowLayout;\n}\n\nexport function TextRow({ label, value, onChange, placeholder, maxLength, layout }: TextRowProps) {\n return (\n <PropertyRow label={label} layout={layout}>\n <input\n type=\"text\"\n value={value}\n placeholder={placeholder}\n maxLength={maxLength}\n onChange={(e) => onChange(e.target.value)}\n />\n </PropertyRow>\n );\n}\n\nexport interface NumberRowProps {\n label: ReactNode;\n value: number;\n onChange: (next: number) => void;\n min?: number;\n max?: number;\n step?: number;\n placeholder?: string;\n layout?: PropertyRowLayout;\n}\n\nexport function NumberRow({\n label,\n value,\n onChange,\n min,\n max,\n step,\n placeholder,\n layout,\n}: NumberRowProps) {\n return (\n <PropertyRow label={label} layout={layout}>\n <input\n type=\"number\"\n value={value}\n min={min}\n max={max}\n step={step}\n placeholder={placeholder}\n onChange={(e) => {\n const raw = e.target.value;\n if (raw === '') return;\n const n = Number(raw);\n if (Number.isFinite(n)) onChange(n);\n }}\n />\n </PropertyRow>\n );\n}\n\nexport interface SelectOption<T extends string> {\n value: T;\n label: ReactNode;\n}\n\nexport interface SelectRowProps<T extends string> {\n label: ReactNode;\n value: T;\n options: ReadonlyArray<SelectOption<T>>;\n onChange: (next: T) => void;\n layout?: PropertyRowLayout;\n}\n\nexport function SelectRow<T extends string>({\n label,\n value,\n options,\n onChange,\n layout,\n}: SelectRowProps<T>) {\n return (\n <PropertyRow label={label} layout={layout}>\n <select\n value={value}\n onChange={(e) => {\n const v = e.target.value as T;\n dlog('property-panel', 'select', { label, value: v });\n onChange(v);\n }}\n >\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {/* HTML <option> only renders text; ReactNode → string coerce */}\n {opt.label as string}\n </option>\n ))}\n </select>\n </PropertyRow>\n );\n}\n\nexport interface ToggleRowProps<T extends string> {\n label: ReactNode;\n value: T;\n options: ReadonlyArray<SelectOption<T>>;\n onChange: (next: T) => void;\n layout?: PropertyRowLayout;\n}\n\nexport function ToggleRow<T extends string>({\n label,\n value,\n options,\n onChange,\n layout,\n}: ToggleRowProps<T>) {\n return (\n <PropertyRow label={label} layout={layout}>\n <div className=\"lk-property-row__toggle\">\n {options.map((opt) => {\n const selected = opt.value === value;\n return (\n <button\n key={opt.value}\n type=\"button\"\n aria-pressed={selected}\n className={\n selected\n ? 'lk-property-row__toggle-button lk-property-row__toggle-button--selected'\n : 'lk-property-row__toggle-button'\n }\n onClick={() => onChange(opt.value)}\n >\n {opt.label}\n </button>\n );\n })}\n </div>\n </PropertyRow>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/instrument/capabilityDetector.ts","../src/instrument/defineInstrument.ts","../src/instrument/validateConfigSchema.ts","../src/lab/gridDims.ts","../../theme/src/generated/themes.ts","../../theme/src/theme.ts","../../theme/src/dtcg/color.ts","../../theme/src/dtcg/resolve.ts","../../theme/src/resolveTheme.ts","../../theme/src/applyTheme.ts","../../theme/src/react.tsx","../../theme/src/dtcg/types.ts","../../theme/src/dtcg/flatten.ts","../../theme/src/loadDTCG.ts","../src/theme/interstellar.tokens.json","../src/theme/interstellar.ts","../src/lab/useSystemMode.ts","../src/dragdrop/DragGhost.tsx","../src/dragdrop/DragDropRuntime.tsx","../src/dragdrop/Palette.tsx","../src/lab/LabContext.ts","../src/workspace/DefaultSidebar.tsx","../src/workspace/DefaultStatusBar.tsx","../src/workspace/DefaultToolbar.tsx","../src/workspace/WorkspaceChrome.tsx","../src/workspace/Workspace.tsx","../src/workspace/workspaceOps.ts","../src/lab/LabShell.tsx","../src/lab/WorkspaceGrid.tsx","../src/lab/Lab.tsx","../src/ui/properties/CurveField.tsx","../src/ui/properties/EffectCard.tsx","../src/ui/properties/PropertyGroup.tsx","../src/ui/format.ts","../src/ui/properties/PropertyPanel.tsx"],"names":["useState","useEffect","jsx","useRef","createContext","useContext","jsxs","useMemo","useStore","p","Fragment","useCallback"],"mappings":"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","file":"index.js","sourcesContent":["import type { Instrument } from './types';\n\nexport interface CapabilityFlags {\n hasCanvas: boolean;\n hasLayers: boolean;\n hasDragDrop: boolean;\n hasUndo: boolean;\n}\n\nexport function detectCapabilities(instrument: Instrument<unknown, unknown>): CapabilityFlags {\n return {\n hasCanvas: instrument.canvas != null,\n hasLayers: instrument.layers != null,\n hasDragDrop: instrument.dragDrop != null,\n hasUndo: instrument.undo != null,\n };\n}\n","import type { Instrument } from './types';\n\nexport function defineInstrument<TS, TC>(spec: Instrument<TS, TC>): Instrument<TS, TC> {\n return spec;\n}\n","import type { ConfigField, ConfigFieldType } from '../controls/types';\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\nconst KNOWN_TYPES: ConfigFieldType[] = ['slider', 'checkbox', 'select', 'number', 'text', 'color'];\n\nexport function validateConfigSchema(fields: ConfigField[]): ValidationResult {\n const errors: string[] = [];\n const seenKeys = new Set<string>();\n\n for (const field of fields) {\n if (field.key === '') {\n errors.push('Field has empty key');\n } else if (seenKeys.has(field.key)) {\n errors.push(`Duplicate config key: \"${field.key}\"`);\n } else {\n seenKeys.add(field.key);\n }\n\n if (field.label === '') {\n errors.push(`Field \"${field.key}\" has empty label`);\n }\n\n if (!KNOWN_TYPES.includes(field.type)) {\n errors.push(`Unknown field type: \"${field.type}\" on key \"${field.key}\"`);\n continue;\n }\n\n if (field.type === 'slider') {\n if (!Number.isFinite(field.default)) {\n errors.push(`Field \"${field.key}\": default must be a finite number`);\n }\n if (field.min >= field.max) {\n errors.push(`Slider \"${field.key}\": min must be < max`);\n } else if (field.default < field.min || field.default > field.max) {\n errors.push(`Slider \"${field.key}\": default ${field.default} is outside [min, max]`);\n }\n } else if (field.type === 'number') {\n if (!Number.isFinite(field.default)) {\n errors.push(`Field \"${field.key}\": default must be a finite number`);\n }\n } else if (field.type === 'select') {\n if (field.options.length === 0) {\n errors.push(`Select \"${field.key}\": options array must not be empty`);\n } else {\n const seenValues = new Set<string>();\n for (const opt of field.options) {\n if (seenValues.has(opt.value)) {\n errors.push(`Select \"${field.key}\": duplicate option value \"${opt.value}\"`);\n } else {\n seenValues.add(opt.value);\n }\n }\n if (!seenValues.has(field.default)) {\n errors.push(`Select \"${field.key}\": default \"${field.default}\" is not among options`);\n }\n }\n }\n }\n\n return { valid: errors.length === 0, errors };\n}\n","export interface GridDims {\n cols: number;\n rows: number;\n}\n\nexport function gridDims(count: number): GridDims {\n if (count <= 1) return { cols: 1, rows: 1 };\n const cols = Math.ceil(Math.sqrt(count));\n const rows = Math.ceil(count / cols);\n return { cols, rows };\n}\n","// GENERATED by packages/theme/scripts/build-tokens.ts — do not edit.\n\nimport type { RawToken } from '../dtcg/types';\n\nexport type TokenName =\n | '--wzl-accent'\n | '--wzl-accent-base'\n | '--wzl-accent-fg'\n | '--wzl-accent-hover'\n | '--wzl-accent-soft'\n | '--wzl-accent-strong'\n | '--wzl-backdrop'\n | '--wzl-border'\n | '--wzl-border-strong'\n | '--wzl-border-w'\n | '--wzl-control-h'\n | '--wzl-curve-color'\n | '--wzl-curve-width'\n | '--wzl-danger'\n | '--wzl-danger-base'\n | '--wzl-ease-in-cubic'\n | '--wzl-ease-in-out-cubic'\n | '--wzl-ease-out-back'\n | '--wzl-ease-out-cubic'\n | '--wzl-fg'\n | '--wzl-fg-inverse'\n | '--wzl-fg-muted'\n | '--wzl-fg-on-accent'\n | '--wzl-fg-subtle'\n | '--wzl-focus-ring'\n | '--wzl-font-body'\n | '--wzl-font-display'\n | '--wzl-font-mono'\n | '--wzl-font-size'\n | '--wzl-font-size-sm'\n | '--wzl-font-ui'\n | '--wzl-font-weight-bold'\n | '--wzl-font-weight-light'\n | '--wzl-font-weight-medium'\n | '--wzl-font-weight-normal'\n | '--wzl-glass-blur'\n | '--wzl-glass-tint'\n | '--wzl-gray-100'\n | '--wzl-gray-200'\n | '--wzl-gray-300'\n | '--wzl-gray-400'\n | '--wzl-gray-50'\n | '--wzl-gray-500'\n | '--wzl-gray-600'\n | '--wzl-gray-700'\n | '--wzl-gray-800'\n | '--wzl-gray-900'\n | '--wzl-line'\n | '--wzl-line-strong'\n | '--wzl-line-subtle'\n | '--wzl-line-width'\n | '--wzl-motion-fast'\n | '--wzl-motion-medium'\n | '--wzl-radius-lg'\n | '--wzl-radius-md'\n | '--wzl-radius-sm'\n | '--wzl-space-lg'\n | '--wzl-space-md'\n | '--wzl-space-sm'\n | '--wzl-space-xs'\n | '--wzl-success'\n | '--wzl-success-base'\n | '--wzl-surface'\n | '--wzl-surface-hover'\n | '--wzl-surface-pressed'\n | '--wzl-surface-raised'\n | '--wzl-surface-sunken'\n | '--wzl-swatch-amber'\n | '--wzl-swatch-cyan'\n | '--wzl-swatch-gold'\n | '--wzl-swatch-green'\n | '--wzl-swatch-magenta'\n | '--wzl-swatch-mint'\n | '--wzl-swatch-orange'\n | '--wzl-swatch-pink'\n | '--wzl-swatch-sky'\n | '--wzl-swatch-violet'\n | '--wzl-tb-height'\n | '--wzl-warning'\n | '--wzl-warning-base'\n | '--wzl-z-modal'\n | '--wzl-z-overlay'\n | '--wzl-z-toolbar';\n\nexport interface GeneratedTheme {\n readonly name: string;\n readonly defaultMode: string;\n readonly modes: Readonly<Record<string, Readonly<Record<TokenName, string>>>>;\n}\n\nexport const THEMES = {\n \"weasel\": {\n name: \"weasel\",\n defaultMode: \"dark\",\n modes: {\n \"dark\": {\n '--wzl-gray-50': \"#f5f5f6\",\n '--wzl-gray-100': \"#e6e7e9\",\n '--wzl-gray-200': \"#c9cbcf\",\n '--wzl-gray-300': \"#9ea1a8\",\n '--wzl-gray-400': \"#6f737b\",\n '--wzl-gray-500': \"#4d5058\",\n '--wzl-gray-600': \"#383b42\",\n '--wzl-gray-700': \"#25272c\",\n '--wzl-gray-800': \"#181a1e\",\n '--wzl-gray-900': \"#0e0f12\",\n '--wzl-accent-soft': \"#1d1454\",\n '--wzl-accent-base': \"#2e1f7a\",\n '--wzl-accent-strong': \"#5841b8\",\n '--wzl-danger-base': \"#d94a3f\",\n '--wzl-warning-base': \"#d99a3f\",\n '--wzl-success-base': \"#2ec27e\",\n '--wzl-fg-on-accent': \"#f5f5f6\",\n '--wzl-fg': \"#e6e7e9\",\n '--wzl-line-subtle': \"rgba(230, 231, 233, 0.1)\",\n '--wzl-line': \"rgba(230, 231, 233, 0.2)\",\n '--wzl-line-strong': \"rgba(230, 231, 233, 0.4)\",\n '--wzl-curve-color': \"#5841b8\",\n '--wzl-accent': \"#2e1f7a\",\n '--wzl-accent-hover': \"#5841b8\",\n '--wzl-danger': \"#d94a3f\",\n '--wzl-warning': \"#d99a3f\",\n '--wzl-success': \"#2ec27e\",\n '--wzl-focus-ring': \"#5841b8\",\n '--wzl-glass-tint': \"#2e1f7a\",\n '--wzl-surface-hover': \"rgba(230, 231, 233, 0.1)\",\n '--wzl-surface-pressed': \"rgba(230, 231, 233, 0.18)\",\n '--wzl-swatch-green': \"#2fdd18\",\n '--wzl-swatch-pink': \"#ff5885\",\n '--wzl-swatch-cyan': \"#00dfff\",\n '--wzl-swatch-gold': \"#dcb700\",\n '--wzl-swatch-amber': \"#ff8c00\",\n '--wzl-swatch-violet': \"#a497ff\",\n '--wzl-swatch-mint': \"#00e7af\",\n '--wzl-swatch-sky': \"#00b8ff\",\n '--wzl-swatch-orange': \"#ff6b00\",\n '--wzl-swatch-magenta': \"#ff6eff\",\n '--wzl-radius-sm': \"3px\",\n '--wzl-radius-md': \"5px\",\n '--wzl-border-w': \"1px\",\n '--wzl-line-width': \"2px\",\n '--wzl-curve-width': \"3px\",\n '--wzl-tb-height': \"28px\",\n '--wzl-radius-lg': \"14px\",\n '--wzl-control-h': \"28px\",\n '--wzl-glass-blur': \"3px\",\n '--wzl-font-size': \"13px\",\n '--wzl-font-size-sm': \"11px\",\n '--wzl-space-xs': \"4px\",\n '--wzl-space-sm': \"8px\",\n '--wzl-space-md': \"12px\",\n '--wzl-space-lg': \"16px\",\n '--wzl-z-toolbar': \"10\",\n '--wzl-z-overlay': \"20\",\n '--wzl-z-modal': \"30\",\n '--wzl-backdrop': \"none\",\n '--wzl-motion-fast': \"120ms\",\n '--wzl-motion-medium': \"240ms\",\n '--wzl-ease-in-cubic': \"cubic-bezier(0.32, 0, 0.67, 0)\",\n '--wzl-ease-out-cubic': \"cubic-bezier(0.33, 1, 0.68, 1)\",\n '--wzl-ease-in-out-cubic': \"cubic-bezier(0.65, 0, 0.35, 1)\",\n '--wzl-ease-out-back': \"cubic-bezier(0.34, 1.56, 0.64, 1)\",\n '--wzl-font-ui': \"Oswald, 'Helvetica Neue Condensed', 'Arial Narrow', system-ui, sans-serif\",\n '--wzl-font-display': \"Oswald, 'Helvetica Neue Condensed', 'Arial Narrow', system-ui, sans-serif\",\n '--wzl-font-body': \"Inter, system-ui, -apple-system, 'Segoe UI', sans-serif\",\n '--wzl-font-mono': \"ui-monospace, SFMono-Regular, Menlo, Consolas, monospace\",\n '--wzl-font-weight-light': \"200\",\n '--wzl-font-weight-normal': \"300\",\n '--wzl-font-weight-medium': \"350\",\n '--wzl-font-weight-bold': \"400\",\n '--wzl-surface': \"#181a1e\",\n '--wzl-surface-raised': \"#25272c\",\n '--wzl-surface-sunken': \"#0e0f12\",\n '--wzl-fg-muted': \"#9ea1a8\",\n '--wzl-fg-subtle': \"#6f737b\",\n '--wzl-border': \"#25272c\",\n '--wzl-border-strong': \"#383b42\",\n '--wzl-accent-fg': \"#5841b8\",\n '--wzl-fg-inverse': \"#0e0f12\",\n },\n \"light\": {\n '--wzl-gray-50': \"#f5f5f6\",\n '--wzl-gray-100': \"#e6e7e9\",\n '--wzl-gray-200': \"#c9cbcf\",\n '--wzl-gray-300': \"#9ea1a8\",\n '--wzl-gray-400': \"#6f737b\",\n '--wzl-gray-500': \"#4d5058\",\n '--wzl-gray-600': \"#383b42\",\n '--wzl-gray-700': \"#25272c\",\n '--wzl-gray-800': \"#181a1e\",\n '--wzl-gray-900': \"#0e0f12\",\n '--wzl-accent-soft': \"#1d1454\",\n '--wzl-accent-base': \"#2e1f7a\",\n '--wzl-accent-strong': \"#5841b8\",\n '--wzl-danger-base': \"#d94a3f\",\n '--wzl-warning-base': \"#d99a3f\",\n '--wzl-success-base': \"#2ec27e\",\n '--wzl-fg-on-accent': \"#f5f5f6\",\n '--wzl-fg': \"#0e0f12\",\n '--wzl-line-subtle': \"rgba(14, 15, 18, 0.1)\",\n '--wzl-line': \"rgba(14, 15, 18, 0.2)\",\n '--wzl-line-strong': \"rgba(14, 15, 18, 0.4)\",\n '--wzl-curve-color': \"#5841b8\",\n '--wzl-accent': \"#2e1f7a\",\n '--wzl-accent-hover': \"#5841b8\",\n '--wzl-danger': \"#d94a3f\",\n '--wzl-warning': \"#d99a3f\",\n '--wzl-success': \"#2ec27e\",\n '--wzl-focus-ring': \"#5841b8\",\n '--wzl-glass-tint': \"#2e1f7a\",\n '--wzl-surface-hover': \"rgba(14, 15, 18, 0.1)\",\n '--wzl-surface-pressed': \"rgba(14, 15, 18, 0.18)\",\n '--wzl-swatch-green': \"#2fdd18\",\n '--wzl-swatch-pink': \"#ff5885\",\n '--wzl-swatch-cyan': \"#00dfff\",\n '--wzl-swatch-gold': \"#dcb700\",\n '--wzl-swatch-amber': \"#ff8c00\",\n '--wzl-swatch-violet': \"#a497ff\",\n '--wzl-swatch-mint': \"#00e7af\",\n '--wzl-swatch-sky': \"#00b8ff\",\n '--wzl-swatch-orange': \"#ff6b00\",\n '--wzl-swatch-magenta': \"#ff6eff\",\n '--wzl-radius-sm': \"3px\",\n '--wzl-radius-md': \"5px\",\n '--wzl-border-w': \"1px\",\n '--wzl-line-width': \"2px\",\n '--wzl-curve-width': \"3px\",\n '--wzl-tb-height': \"28px\",\n '--wzl-radius-lg': \"14px\",\n '--wzl-control-h': \"28px\",\n '--wzl-glass-blur': \"3px\",\n '--wzl-font-size': \"13px\",\n '--wzl-font-size-sm': \"11px\",\n '--wzl-space-xs': \"4px\",\n '--wzl-space-sm': \"8px\",\n '--wzl-space-md': \"12px\",\n '--wzl-space-lg': \"16px\",\n '--wzl-z-toolbar': \"10\",\n '--wzl-z-overlay': \"20\",\n '--wzl-z-modal': \"30\",\n '--wzl-backdrop': \"none\",\n '--wzl-motion-fast': \"120ms\",\n '--wzl-motion-medium': \"240ms\",\n '--wzl-ease-in-cubic': \"cubic-bezier(0.32, 0, 0.67, 0)\",\n '--wzl-ease-out-cubic': \"cubic-bezier(0.33, 1, 0.68, 1)\",\n '--wzl-ease-in-out-cubic': \"cubic-bezier(0.65, 0, 0.35, 1)\",\n '--wzl-ease-out-back': \"cubic-bezier(0.34, 1.56, 0.64, 1)\",\n '--wzl-font-ui': \"Oswald, 'Helvetica Neue Condensed', 'Arial Narrow', system-ui, sans-serif\",\n '--wzl-font-display': \"Oswald, 'Helvetica Neue Condensed', 'Arial Narrow', system-ui, sans-serif\",\n '--wzl-font-body': \"Inter, system-ui, -apple-system, 'Segoe UI', sans-serif\",\n '--wzl-font-mono': \"ui-monospace, SFMono-Regular, Menlo, Consolas, monospace\",\n '--wzl-font-weight-light': \"200\",\n '--wzl-font-weight-normal': \"300\",\n '--wzl-font-weight-medium': \"350\",\n '--wzl-font-weight-bold': \"400\",\n '--wzl-surface': \"#f5f5f6\",\n '--wzl-surface-raised': \"#e6e7e9\",\n '--wzl-surface-sunken': \"#c9cbcf\",\n '--wzl-fg-muted': \"#383b42\",\n '--wzl-fg-subtle': \"#4d5058\",\n '--wzl-border': \"#c9cbcf\",\n '--wzl-border-strong': \"#9ea1a8\",\n '--wzl-accent-fg': \"#2e1f7a\",\n '--wzl-fg-inverse': \"#f5f5f6\",\n },\n },\n },\n} as const satisfies Record<string, GeneratedTheme>;\n\n/** Unresolved token graph. `extends` needs the aliases intact so an override\n * of a base primitive still reaches everything referencing it. */\nexport interface ThemeSource {\n readonly primitives: Readonly<Record<string, RawToken>>;\n readonly modes: Readonly<Record<string, Readonly<Record<string, RawToken>>>>;\n}\n\nexport const THEME_SOURCES: Readonly<Record<string, ThemeSource>> = {\n \"weasel\": {\n \"primitives\": {\n \"gray-50\": {\n \"type\": \"color\",\n \"value\": \"#f5f5f6\"\n },\n \"gray-100\": {\n \"type\": \"color\",\n \"value\": \"#e6e7e9\"\n },\n \"gray-200\": {\n \"type\": \"color\",\n \"value\": \"#c9cbcf\"\n },\n \"gray-300\": {\n \"type\": \"color\",\n \"value\": \"#9ea1a8\"\n },\n \"gray-400\": {\n \"type\": \"color\",\n \"value\": \"#6f737b\"\n },\n \"gray-500\": {\n \"type\": \"color\",\n \"value\": \"#4d5058\"\n },\n \"gray-600\": {\n \"type\": \"color\",\n \"value\": \"#383b42\"\n },\n \"gray-700\": {\n \"type\": \"color\",\n \"value\": \"#25272c\"\n },\n \"gray-800\": {\n \"type\": \"color\",\n \"value\": \"#181a1e\"\n },\n \"gray-900\": {\n \"type\": \"color\",\n \"value\": \"#0e0f12\"\n },\n \"accent-soft\": {\n \"type\": \"color\",\n \"value\": \"#1d1454\"\n },\n \"accent-base\": {\n \"type\": \"color\",\n \"value\": \"#2e1f7a\",\n \"description\": \"Midnight blue-violet. Deep and saturated; anchors primary actions on light and dark surfaces alike.\"\n },\n \"accent-strong\": {\n \"type\": \"color\",\n \"value\": \"#5841b8\"\n },\n \"danger-base\": {\n \"type\": \"color\",\n \"value\": \"#d94a3f\"\n },\n \"warning-base\": {\n \"type\": \"color\",\n \"value\": \"#d99a3f\"\n },\n \"success-base\": {\n \"type\": \"color\",\n \"value\": \"#2ec27e\"\n },\n \"fg-on-accent\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-50}\"\n },\n \"line-subtle\": {\n \"type\": \"color\",\n \"value\": \"{color.fg}\",\n \"alpha\": 0.1,\n \"description\": \"Barely-there separators (table rows).\"\n },\n \"line\": {\n \"type\": \"color\",\n \"value\": \"{color.fg}\",\n \"alpha\": 0.2,\n \"description\": \"Primary gridlines on sunken surfaces.\"\n },\n \"line-strong\": {\n \"type\": \"color\",\n \"value\": \"{color.fg}\",\n \"alpha\": 0.4,\n \"description\": \"Axes and emphasized dividers.\"\n },\n \"curve-color\": {\n \"type\": \"color\",\n \"value\": \"{color.accent-strong}\",\n \"description\": \"Drawn data curves. Routes through the bright accent because accent-base is too dim on sunken surfaces.\"\n },\n \"accent\": {\n \"type\": \"color\",\n \"value\": \"{color.accent-base}\"\n },\n \"accent-hover\": {\n \"type\": \"color\",\n \"value\": \"{color.accent-strong}\"\n },\n \"danger\": {\n \"type\": \"color\",\n \"value\": \"{color.danger-base}\"\n },\n \"warning\": {\n \"type\": \"color\",\n \"value\": \"{color.warning-base}\"\n },\n \"success\": {\n \"type\": \"color\",\n \"value\": \"{color.success-base}\"\n },\n \"focus-ring\": {\n \"type\": \"color\",\n \"value\": \"{color.accent-strong}\"\n },\n \"glass-tint\": {\n \"type\": \"color\",\n \"value\": \"{color.accent}\",\n \"description\": \"Frosted-glass tint. Components compose it as color-mix(in srgb, var(--wzl-glass-tint) 78%, transparent) with backdrop-filter: blur(3px).\"\n },\n \"surface-hover\": {\n \"type\": \"color\",\n \"value\": \"{color.fg}\",\n \"alpha\": 0.1,\n \"description\": \"Hover wash over a raised surface. Same formula as line-subtle, different job — do not collapse them.\"\n },\n \"surface-pressed\": {\n \"type\": \"color\",\n \"value\": \"{color.fg}\",\n \"alpha\": 0.18,\n \"description\": \"Pressed wash over a raised surface.\"\n },\n \"swatch-green\": {\n \"type\": \"color\",\n \"value\": \"#2fdd18\",\n \"description\": \"First of ten categorical spot colors for plotting, status and data viz. Ordered — take them in sequence. Mode-invariant on purpose: a series keeps its color when the mode flips.\"\n },\n \"swatch-pink\": {\n \"type\": \"color\",\n \"value\": \"#ff5885\"\n },\n \"swatch-cyan\": {\n \"type\": \"color\",\n \"value\": \"#00dfff\"\n },\n \"swatch-gold\": {\n \"type\": \"color\",\n \"value\": \"#dcb700\"\n },\n \"swatch-amber\": {\n \"type\": \"color\",\n \"value\": \"#ff8c00\"\n },\n \"swatch-violet\": {\n \"type\": \"color\",\n \"value\": \"#a497ff\"\n },\n \"swatch-mint\": {\n \"type\": \"color\",\n \"value\": \"#00e7af\"\n },\n \"swatch-sky\": {\n \"type\": \"color\",\n \"value\": \"#00b8ff\"\n },\n \"swatch-orange\": {\n \"type\": \"color\",\n \"value\": \"#ff6b00\"\n },\n \"swatch-magenta\": {\n \"type\": \"color\",\n \"value\": \"#ff6eff\"\n },\n \"radius-sm\": {\n \"type\": \"dimension\",\n \"value\": \"3px\"\n },\n \"radius-md\": {\n \"type\": \"dimension\",\n \"value\": \"5px\"\n },\n \"border-w\": {\n \"type\": \"dimension\",\n \"value\": \"1px\"\n },\n \"line-width\": {\n \"type\": \"dimension\",\n \"value\": \"2px\",\n \"description\": \"Structural lines — gridlines, dividers, axes.\"\n },\n \"curve-width\": {\n \"type\": \"dimension\",\n \"value\": \"3px\",\n \"description\": \"Drawn data curves. Heavier than structural lines so data reads as primary content.\"\n },\n \"tb-height\": {\n \"type\": \"dimension\",\n \"value\": \"28px\",\n \"description\": \"Height of a horizontal toolbar strip (ActionsBar, OptionsBar, ToggleBar, ToolOptionsBar).\"\n },\n \"radius-lg\": {\n \"type\": \"dimension\",\n \"value\": \"14px\"\n },\n \"control-h\": {\n \"type\": \"dimension\",\n \"value\": \"28px\",\n \"description\": \"Height of an interactive control — button, input, select. Distinct from tb-height, which sizes the strip a row of them sits in.\"\n },\n \"glass-blur\": {\n \"type\": \"dimension\",\n \"value\": \"3px\",\n \"description\": \"Backdrop blur radius for frosted surfaces. Pairs with glass-tint.\"\n },\n \"font-size\": {\n \"type\": \"dimension\",\n \"value\": \"13px\"\n },\n \"font-size-sm\": {\n \"type\": \"dimension\",\n \"value\": \"11px\"\n },\n \"space-xs\": {\n \"type\": \"dimension\",\n \"value\": \"4px\"\n },\n \"space-sm\": {\n \"type\": \"dimension\",\n \"value\": \"8px\"\n },\n \"space-md\": {\n \"type\": \"dimension\",\n \"value\": \"12px\"\n },\n \"space-lg\": {\n \"type\": \"dimension\",\n \"value\": \"16px\"\n },\n \"z-toolbar\": {\n \"type\": \"number\",\n \"value\": 10\n },\n \"z-overlay\": {\n \"type\": \"number\",\n \"value\": 20\n },\n \"z-modal\": {\n \"type\": \"number\",\n \"value\": 30\n },\n \"backdrop\": {\n \"type\": \"gradient\",\n \"value\": \"none\",\n \"description\": \"Layered backdrop fill for a page or lab root. `none` here; a theme with a signature background sets it.\"\n },\n \"motion-fast\": {\n \"type\": \"duration\",\n \"value\": \"120ms\",\n \"description\": \"Micro-interactions — hover, focus, pressed.\"\n },\n \"motion-medium\": {\n \"type\": \"duration\",\n \"value\": \"240ms\",\n \"description\": \"Entrances and exits — toasts, popovers, panels.\"\n },\n \"ease-in-cubic\": {\n \"type\": \"cubicBezier\",\n \"value\": [\n 0.32,\n 0,\n 0.67,\n 0\n ]\n },\n \"ease-out-cubic\": {\n \"type\": \"cubicBezier\",\n \"value\": [\n 0.33,\n 1,\n 0.68,\n 1\n ]\n },\n \"ease-in-out-cubic\": {\n \"type\": \"cubicBezier\",\n \"value\": [\n 0.65,\n 0,\n 0.35,\n 1\n ]\n },\n \"ease-out-back\": {\n \"type\": \"cubicBezier\",\n \"value\": [\n 0.34,\n 1.56,\n 0.64,\n 1\n ]\n },\n \"font-ui\": {\n \"type\": \"fontFamily\",\n \"value\": [\n \"Oswald\",\n \"Helvetica Neue Condensed\",\n \"Arial Narrow\",\n \"system-ui\",\n \"sans-serif\"\n ],\n \"description\": \"Condensed UI/display face. The heavier cuts get blocky at any size, so the weight tokens stay in the 200-400 range.\"\n },\n \"font-display\": {\n \"type\": \"fontFamily\",\n \"value\": [\n \"Oswald\",\n \"Helvetica Neue Condensed\",\n \"Arial Narrow\",\n \"system-ui\",\n \"sans-serif\"\n ]\n },\n \"font-body\": {\n \"type\": \"fontFamily\",\n \"value\": [\n \"Inter\",\n \"system-ui\",\n \"-apple-system\",\n \"Segoe UI\",\n \"sans-serif\"\n ]\n },\n \"font-mono\": {\n \"type\": \"fontFamily\",\n \"value\": [\n \"ui-monospace\",\n \"SFMono-Regular\",\n \"Menlo\",\n \"Consolas\",\n \"monospace\"\n ]\n },\n \"font-weight-light\": {\n \"type\": \"fontWeight\",\n \"value\": 200\n },\n \"font-weight-normal\": {\n \"type\": \"fontWeight\",\n \"value\": 300\n },\n \"font-weight-medium\": {\n \"type\": \"fontWeight\",\n \"value\": 350\n },\n \"font-weight-bold\": {\n \"type\": \"fontWeight\",\n \"value\": 400\n }\n },\n \"modes\": {\n \"dark\": {\n \"surface\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-800}\"\n },\n \"surface-raised\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-700}\"\n },\n \"surface-sunken\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-900}\"\n },\n \"fg\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-100}\"\n },\n \"fg-muted\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-300}\"\n },\n \"fg-subtle\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-400}\"\n },\n \"border\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-700}\"\n },\n \"border-strong\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-600}\"\n },\n \"accent-fg\": {\n \"type\": \"color\",\n \"value\": \"{color.accent-strong}\",\n \"description\": \"Accent for foreground use — text, icons, selected labels drawn on a surface. accent is a fill; the midnight base is too dim to read as text on dark surfaces.\"\n },\n \"fg-inverse\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-900}\",\n \"description\": \"Text drawn on a filled foreground-colored element (e.g. a slider thumb). Flips with the mode, so it is a semantic, not an alias to a primitive.\"\n }\n },\n \"light\": {\n \"surface\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-50}\"\n },\n \"surface-raised\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-100}\"\n },\n \"surface-sunken\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-200}\"\n },\n \"fg\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-900}\"\n },\n \"fg-muted\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-600}\"\n },\n \"fg-subtle\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-500}\"\n },\n \"border\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-200}\"\n },\n \"border-strong\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-300}\"\n },\n \"accent-fg\": {\n \"type\": \"color\",\n \"value\": \"{color.accent-base}\",\n \"description\": \"Flips to the deep base in light mode, where it is the legible one.\"\n },\n \"fg-inverse\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-50}\",\n \"description\": \"Flips with the mode — see the dark layer.\"\n }\n }\n }\n }\n};\n","import type { FlatTokens, RawToken } from './dtcg/types';\nimport { THEME_SOURCES } from './generated/themes';\n\n/** Authoring shorthand: a bare string is a literal or a `{ref}`. */\nexport type TokenInput = string | number | RawToken;\n\nexport interface ThemeInput {\n readonly name: string;\n /** Base to layer onto. Defaults to `weaselTheme`; `null` opts out. */\n readonly extends?: Theme | null;\n readonly defaultMode?: string;\n /** Mode-invariant overrides. */\n readonly tokens?: Readonly<Record<string, TokenInput>>;\n readonly modes: Readonly<Record<string, Readonly<Record<string, TokenInput>>>>;\n}\n\nexport interface Theme {\n readonly name: string;\n readonly extends: Theme | null;\n readonly defaultMode: string;\n readonly tokens: FlatTokens;\n readonly modes: Readonly<Record<string, FlatTokens>>;\n}\n\nfunction normalize(input: Readonly<Record<string, TokenInput>>): FlatTokens {\n const out: FlatTokens = {};\n for (const [name, v] of Object.entries(input)) {\n out[name] =\n typeof v === 'object'\n ? v\n : { type: 'unknown', value: v, alpha: undefined, description: undefined };\n }\n return out;\n}\n\n/** The built-in theme, materialized from the generated source. */\nexport const weaselTheme: Theme = {\n name: 'weasel',\n extends: null,\n defaultMode: 'dark',\n tokens: THEME_SOURCES.weasel.primitives as FlatTokens,\n modes: THEME_SOURCES.weasel.modes as Record<string, FlatTokens>,\n};\n\nexport function defineTheme(input: ThemeInput): Theme {\n const base = input.extends === undefined ? weaselTheme : input.extends;\n const modes: Record<string, FlatTokens> = {};\n for (const [mode, tokens] of Object.entries(input.modes)) modes[mode] = normalize(tokens);\n return {\n name: input.name,\n extends: base,\n defaultMode: input.defaultMode ?? base?.defaultMode ?? 'dark',\n tokens: normalize(input.tokens ?? {}),\n modes,\n };\n}\n","/**\n * Hex → `rgba()`. The JS side of the alpha extension; the CSS side emits\n * `color-mix()` instead so DOM chrome keeps tracking a downstream override of\n * the referenced token.\n */\nexport function hexToRgba(hex: string, alpha: number): string {\n const m = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(hex.trim());\n if (!m) throw new Error(`Expected a hex color, got \"${hex}\"`);\n\n const body = m[1];\n const full = body.length === 3 ? body.replace(/./g, (c) => c + c) : body;\n const r = Number.parseInt(full.slice(0, 2), 16);\n const g = Number.parseInt(full.slice(2, 4), 16);\n const b = Number.parseInt(full.slice(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n","import { hexToRgba } from './color';\nimport type { FlatTokens, ResolvedTokenMap, TokenValue } from './types';\n\n/** `{color.gray-100}` → `gray-100`. The type group is dropped, per the naming rule. */\nconst REF = /^\\{([^}]+)\\}$/;\n\nfunction refTarget(value: TokenValue): string | null {\n if (typeof value !== 'string') return null;\n const m = REF.exec(value.trim());\n if (!m) return null;\n const path = m[1];\n const dot = path.indexOf('.');\n return dot === -1 ? path : path.slice(dot + 1);\n}\n\n/**\n * Quote family names containing whitespace; leave everything else bare.\n * Generic keywords (`sans-serif`) and hyphen-prefixed identifiers\n * (`-apple-system`) break if quoted, and neither contains a space.\n */\nfunction fontStack(value: readonly (string | number)[]): string {\n return value.map((f) => (typeof f === 'string' && /\\s/.test(f) ? `'${f}'` : String(f))).join(', ');\n}\n\nfunction serialize(type: string, value: TokenValue): string {\n if (Array.isArray(value)) {\n if (type === 'cubicBezier') return `cubic-bezier(${value.join(', ')})`;\n if (type === 'fontFamily') return fontStack(value);\n return value.join(', ');\n }\n return String(value);\n}\n\n/**\n * Resolve flat tokens to final CSS-ready strings.\n *\n * Merge modes before calling: this function has no notion of modes, only of a\n * complete token set.\n */\nexport function resolveTokens(tokens: FlatTokens): ResolvedTokenMap {\n const out: ResolvedTokenMap = {};\n const inProgress = new Set<string>();\n\n const resolveOne = (name: string): string => {\n const cached = out[name];\n if (cached !== undefined) return cached;\n\n const token = tokens[name];\n if (!token) throw new Error(`Unknown token \"${name}\"`);\n\n if (inProgress.has(name)) {\n throw new Error(`Reference cycle at token \"${name}\" (${[...inProgress].join(' → ')})`);\n }\n inProgress.add(name);\n\n const target = refTarget(token.value);\n let value: string;\n if (target === null) {\n value = serialize(token.type, token.value);\n } else if (!tokens[target]) {\n throw new Error(`Token \"${name}\" references \"${target}\", which is not defined`);\n } else {\n value = resolveOne(target);\n }\n\n if (token.alpha !== undefined) value = hexToRgba(value, token.alpha);\n\n inProgress.delete(name);\n out[name] = value;\n return value;\n };\n\n for (const name of Object.keys(tokens)) resolveOne(name);\n return out;\n}\n\n/** Merge a mode's tokens over the mode-invariant set. Later wins. */\nexport function mergeTokens(base: FlatTokens, mode: FlatTokens): FlatTokens {\n return { ...base, ...mode };\n}\n","import { resolveTokens } from './dtcg/resolve';\nimport type { FlatTokens } from './dtcg/types';\nimport type { Theme } from './theme';\nimport type { TokenName } from './generated/themes';\n\nexport type ResolvedTheme = Readonly<Record<TokenName, string>>;\n\n/** Root-first so the leaf theme's overrides land last. */\nfunction chain(theme: Theme): Theme[] {\n const out: Theme[] = [];\n for (let t: Theme | null = theme; t; t = t.extends) out.unshift(t);\n return out;\n}\n\n/**\n * Merge the extends chain, layer the mode over it, resolve every alias, and\n * key the result by CSS custom-property name.\n *\n * Pure — no DOM. An unresolvable reference throws rather than falling back.\n */\nexport function resolveTheme(theme: Theme, mode: string): ResolvedTheme {\n const themes = chain(theme);\n const effectiveMode = themes.some((t) => mode in t.modes) ? mode : theme.defaultMode;\n\n // Each theme contributes its mode-invariant tokens and then its mode layer,\n // before the next theme down the chain gets a turn. Collecting all `tokens`\n // first and all mode layers second would let the *base's* mode layer outrank\n // a derived theme's deliberate mode-invariant override.\n let merged: FlatTokens = {};\n for (const t of themes) {\n merged = { ...merged, ...t.tokens, ...(t.modes[effectiveMode] ?? {}) };\n }\n\n const resolved = resolveTokens(merged);\n const out: Record<string, string> = {};\n for (const [name, value] of Object.entries(resolved)) out[`--wzl-${name}`] = value;\n return out as ResolvedTheme;\n}\n","import { resolveTheme } from './resolveTheme';\nimport type { Theme } from './theme';\n\nconst STYLE_ID = 'wzl-themes';\nconst emitted = new Set<string>();\nlet sheet: CSSStyleSheet | null = null;\nlet styleEl: HTMLStyleElement | null = null;\n\n/** Test seam — drops the module-level cache so each case starts clean. */\nexport function __resetThemeSheet(): void {\n emitted.clear();\n sheet = null;\n styleEl = null;\n}\n\nfunction canAdopt(): boolean {\n return (\n typeof CSSStyleSheet !== 'undefined' &&\n 'replaceSync' in CSSStyleSheet.prototype &&\n Array.isArray(document.adoptedStyleSheets)\n );\n}\n\nfunction appendRule(css: string): void {\n if (canAdopt()) {\n if (!sheet) {\n sheet = new CSSStyleSheet();\n document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet];\n }\n sheet.insertRule(css, sheet.cssRules.length);\n return;\n }\n if (!styleEl) {\n styleEl = document.createElement('style');\n styleEl.id = STYLE_ID;\n document.head.appendChild(styleEl);\n }\n styleEl.textContent += `${css}\\n`;\n}\n\n/**\n * Apply `theme` at `mode` to `el`'s subtree.\n *\n * Stamps two data attributes and ensures a matching rule block exists in a\n * module-owned stylesheet. Deliberately not inline properties: the cascade\n * then does the work, per-subtree overrides are just a different theme name,\n * and no `!important` is ever needed. No-op outside a DOM.\n */\nexport function applyTheme(el: HTMLElement, theme: Theme, mode: string): void {\n if (typeof document === 'undefined') return;\n\n const key = `${theme.name}::${mode}`;\n if (!emitted.has(key)) {\n const resolved = resolveTheme(theme, mode);\n const body = Object.entries(resolved)\n .map(([name, value]) => `${name}: ${value};`)\n .join(' ');\n appendRule(`[data-wzl-theme='${theme.name}'][data-wzl-mode='${mode}'] { ${body} }`);\n emitted.add(key);\n }\n\n el.setAttribute('data-wzl-theme', theme.name);\n el.setAttribute('data-wzl-mode', mode);\n}\n","import React, { createContext, useContext, useMemo, useRef, useLayoutEffect } from 'react';\nimport { applyTheme } from './applyTheme';\nimport { resolveTheme, type ResolvedTheme } from './resolveTheme';\nimport { weaselTheme, type Theme } from './theme';\n\nexport interface ThemeContextValue {\n readonly theme: Theme;\n readonly mode: string;\n readonly resolved: ResolvedTheme;\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\nexport interface ThemeProviderProps {\n readonly theme?: Theme;\n readonly mode?: string;\n /** Applied to the wrapper element, so it can be the layout element too. */\n readonly className?: string;\n readonly style?: React.CSSProperties;\n readonly children: React.ReactNode;\n}\n\n/**\n * Applies a theme to a wrapper element and publishes the resolved record.\n *\n * Consumers that draw outside the DOM (the WebGL HUD) read `resolved` and\n * never touch `getComputedStyle`.\n *\n * The wrapper is a real element in the layout. Pass `className` rather than\n * nesting your own div inside — an anonymous div between a flex parent and\n * its child breaks percentage heights.\n */\nexport function ThemeProvider({\n theme = weaselTheme,\n mode,\n className,\n style,\n children,\n}: ThemeProviderProps): React.ReactElement {\n const ref = useRef<HTMLDivElement>(null);\n const effectiveMode = mode ?? theme.defaultMode;\n\n const value = useMemo<ThemeContextValue>(\n () => ({ theme, mode: effectiveMode, resolved: resolveTheme(theme, effectiveMode) }),\n [theme, effectiveMode],\n );\n\n useLayoutEffect(() => {\n if (ref.current) applyTheme(ref.current, theme, effectiveMode);\n }, [theme, effectiveMode]);\n\n return (\n <ThemeContext.Provider value={value}>\n <div\n ref={ref}\n className={className}\n style={style}\n data-wzl-theme={theme.name}\n data-wzl-mode={effectiveMode}\n >\n {children}\n </div>\n </ThemeContext.Provider>\n );\n}\n\nexport function useTheme(): ThemeContextValue {\n const ctx = useContext(ThemeContext);\n if (!ctx) throw new Error('useTheme must be used inside a <ThemeProvider>');\n return ctx;\n}\n\n/**\n * The theme if one is provided, `null` otherwise.\n *\n * For kit internals that should follow a theme when the app supplies one but\n * must still work in an app that never mounted a provider — `useHud` is the\n * motivating case.\n */\nexport function useThemeOptional(): ThemeContextValue | null {\n return useContext(ThemeContext);\n}\n","/** The one `$extensions` key this kit defines. */\nexport const ALPHA_EXT = 'com.weasel.alpha';\n\nexport type TokenValue = string | number | readonly (string | number)[];\n\nexport interface RawToken {\n readonly type: string;\n readonly value: TokenValue;\n /** Render the referenced color at this alpha, 0–1. */\n readonly alpha?: number | undefined;\n readonly description?: string | undefined;\n}\n\nexport type FlatTokens = Record<string, RawToken>;\n\n/** A resolved theme: every token name mapped to its final CSS-ready string.\n * Named ...Map, not ...Tokens, to stay distinct from hud's public `ResolvedTokens`. */\nexport type ResolvedTokenMap = Record<string, string>;\n","import { ALPHA_EXT, type FlatTokens, type RawToken, type TokenValue } from './types';\n\ninterface DtcgToken {\n $value: TokenValue;\n $type?: string;\n $description?: string;\n $extensions?: Record<string, unknown>;\n}\n\nconst isToken = (v: unknown): v is DtcgToken =>\n typeof v === 'object' && v !== null && '$value' in v;\n\n/**\n * Collapse a DTCG document into flat token names.\n *\n * Groups exist only to carry `$type`; they contribute nothing to the name, so\n * `color.fg-muted` becomes `fg-muted` and in turn `--wzl-fg-muted`. This shape\n * is forced by the token set: `--wzl-accent` and `--wzl-accent-base` are both\n * real tokens, and DTCG forbids a token that is also a group.\n */\nexport function flattenTokens(doc: Record<string, unknown>): FlatTokens {\n const out: FlatTokens = {};\n\n for (const [groupName, group] of Object.entries(doc)) {\n if (groupName.startsWith('$')) continue;\n if (typeof group !== 'object' || group === null) continue;\n\n const g = group as Record<string, unknown> & { $type?: string };\n const groupType = g.$type;\n\n for (const [leaf, node] of Object.entries(g)) {\n if (leaf.startsWith('$')) continue;\n if (!isToken(node)) continue;\n\n const type = node.$type ?? groupType;\n if (!type) {\n throw new Error(`Token \"${leaf}\" has no $type and its group \"${groupName}\" declares none`);\n }\n if (leaf in out) {\n throw new Error(`Duplicate token name \"${leaf}\" — leaf keys must be unique across type groups`);\n }\n\n const alphaRaw = node.$extensions?.[ALPHA_EXT];\n const token: RawToken = {\n type,\n value: node.$value,\n alpha: typeof alphaRaw === 'number' ? alphaRaw : undefined,\n description: node.$description,\n };\n out[leaf] = token;\n }\n }\n\n return out;\n}\n","import { flattenTokens } from './dtcg/flatten';\nimport type { FlatTokens } from './dtcg/types';\nimport { weaselTheme, type Theme } from './theme';\n\ninterface DtcgDocument {\n name?: unknown;\n defaultMode?: unknown;\n extends?: Theme | null;\n primitives?: Record<string, unknown>;\n modes?: Record<string, Record<string, unknown>>;\n}\n\n/**\n * Build a `Theme` from a DTCG document — the interchange path, for tokens\n * exported by a design tool rather than authored in TS.\n */\nexport function loadDTCG(doc: DtcgDocument): Theme {\n if (typeof doc.name !== 'string' || doc.name === '') {\n throw new Error('DTCG document needs a string \"name\"');\n }\n const modes: Record<string, FlatTokens> = {};\n for (const [mode, body] of Object.entries(doc.modes ?? {})) {\n modes[mode] = flattenTokens(body);\n }\n const base = doc.extends === undefined ? weaselTheme : doc.extends;\n return {\n name: doc.name,\n extends: base,\n defaultMode:\n typeof doc.defaultMode === 'string' ? doc.defaultMode : (base?.defaultMode ?? 'dark'),\n tokens: flattenTokens(doc.primitives ?? {}),\n modes,\n };\n}\n","{\n \"name\": \"interstellar\",\n \"defaultMode\": \"dark\",\n \"primitives\": {\n \"dimension\": {\n \"$type\": \"dimension\",\n \"radius-md\": { \"$value\": \"6px\" },\n \"glass-blur\": { \"$value\": \"12px\" }\n },\n \"fontWeight\": {\n \"$type\": \"fontWeight\",\n \"font-weight-light\": { \"$value\": 300 },\n \"font-weight-medium\": { \"$value\": 500 },\n \"font-weight-bold\": { \"$value\": 700 }\n }\n },\n \"modes\": {\n \"dark\": {\n \"color\": {\n \"$type\": \"color\",\n \"surface\": { \"$value\": \"#0a0a14\" },\n \"surface-raised\": { \"$value\": \"rgba(20, 20, 36, 0.55)\" },\n \"surface-sunken\": { \"$value\": \"#02020a\" },\n \"border\": { \"$value\": \"rgba(255, 255, 255, 0.14)\" },\n \"line-subtle\": { \"$value\": \"rgba(255, 255, 255, 0.08)\" },\n \"fg\": { \"$value\": \"#e8e8f0\" },\n \"fg-muted\": { \"$value\": \"#a8a8c0\" },\n \"fg-subtle\": { \"$value\": \"#5a5a78\" },\n \"accent\": { \"$value\": \"#b08adb\" },\n \"accent-hover\": { \"$value\": \"#c6a3ee\" },\n \"focus-ring\": { \"$value\": \"rgba(176, 138, 219, 0.45)\" }\n },\n \"gradient\": {\n \"$type\": \"gradient\",\n \"backdrop\": {\n \"$value\": \"radial-gradient(ellipse 60% 80% at 18% 30%, rgba(150, 80, 200, 0.22), transparent 70%), radial-gradient(ellipse 55% 90% at 78% 70%, rgba(220, 100, 140, 0.18), transparent 65%), radial-gradient(ellipse 50% 70% at 50% 50%, rgba(60, 110, 200, 0.18), transparent 75%), radial-gradient(ellipse at center, #0a0a18 0%, #02020a 100%)\"\n }\n }\n },\n \"light\": {\n \"color\": {\n \"$type\": \"color\",\n \"surface\": { \"$value\": \"#fafaf7\" },\n \"surface-raised\": { \"$value\": \"#ffffff\" },\n \"surface-sunken\": { \"$value\": \"#f0ebe2\" },\n \"border\": { \"$value\": \"#c9bba5\" },\n \"line-subtle\": { \"$value\": \"rgba(0, 0, 0, 0.08)\" },\n \"fg\": { \"$value\": \"#2a2018\" },\n \"fg-muted\": { \"$value\": \"#6b5c4a\" },\n \"fg-subtle\": { \"$value\": \"#a89b85\" },\n \"accent\": { \"$value\": \"#a86f3c\" },\n \"accent-hover\": { \"$value\": \"#c2854f\" },\n \"focus-ring\": { \"$value\": \"rgba(168, 111, 60, 0.35)\" }\n }\n }\n }\n}\n","import { loadDTCG, type Theme } from '@weasel-js/theme';\nimport doc from './interstellar.tokens.json' with { type: 'json' };\n\n/**\n * labkit's theme: a cosmic dark and a warm parchment light, extending the\n * built-in weasel theme. Authored as DTCG and loaded at import time — the\n * interchange path a theme exported from a design tool would take.\n */\nexport const interstellarTheme: Theme = loadDTCG(doc);\n","import { useEffect, useState } from 'react';\nimport type { LabMode } from '../state/types';\n\nfunction query(): MediaQueryList | null {\n if (typeof window === 'undefined' || !window.matchMedia) return null;\n return window.matchMedia('(prefers-color-scheme: light)');\n}\n\n/**\n * Resolve a `LabMode` to the mode the theme resolver understands.\n *\n * `auto` is not a mode — it means \"read the OS\", live. An explicit choice\n * opts out of the subscription entirely.\n */\nexport function useResolvedMode(mode: LabMode): 'light' | 'dark' {\n const [system, setSystem] = useState<'light' | 'dark'>(() =>\n query()?.matches ? 'light' : 'dark',\n );\n\n useEffect(() => {\n if (mode !== 'auto') return;\n const mq = query();\n if (!mq) return;\n const onChange = (e: MediaQueryListEvent) => setSystem(e.matches ? 'light' : 'dark');\n mq.addEventListener('change', onChange);\n return () => mq.removeEventListener('change', onChange);\n }, [mode]);\n\n return mode === 'auto' ? system : mode;\n}\n","import { type ReactPortal, useEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { PaletteItem, Point } from '../instrument/types';\n\nexport interface DragGhostProps {\n item: PaletteItem;\n screenPos: Point;\n}\n\nexport function DragGhost({ item, screenPos }: DragGhostProps): ReactPortal | null {\n const [mounted, setMounted] = useState(false);\n useEffect(() => setMounted(true), []);\n if (!mounted || typeof document === 'undefined') return null;\n const style = {\n left: `${screenPos.x + 12}px`,\n top: `${screenPos.y + 12}px`,\n };\n return createPortal(\n <div className=\"lk-drag-ghost\" style={style}>\n <span className=\"lk-drag-ghost__label\">{item.label}</span>\n </div>,\n document.body,\n );\n}\n","import { type RefObject, useCallback, useEffect, useRef, useState } from 'react';\nimport { screenToWorld } from '../canvas/canvasCoords';\nimport type {\n DragDropCapability,\n DragFeedback,\n PaletteItem,\n Point,\n ViewTransform,\n} from '../instrument/types';\nimport { DragGhost } from './DragGhost';\n\nexport interface DragState {\n item: PaletteItem;\n screenPos: Point;\n feedback: DragFeedback | null;\n}\n\nexport interface UseDragDropArgs<TS, TC> {\n capability: DragDropCapability<TS, TC>;\n canvasContainerRef: RefObject<HTMLElement | null>;\n view: ViewTransform;\n state: TS;\n config: TC;\n setState: (next: TS | ((prev: TS) => TS)) => void;\n emit: (event: string) => void;\n}\n\nexport interface UseDragDropResult {\n drag: DragState | null;\n startDrag: (item: PaletteItem, originScreenPos: Point) => void;\n}\n\nexport function useDragDrop<TS, TC>({\n capability,\n canvasContainerRef,\n view,\n state,\n config,\n setState,\n emit,\n}: UseDragDropArgs<TS, TC>): UseDragDropResult {\n const [drag, setDrag] = useState<DragState | null>(null);\n const dragRef = useRef<DragState | null>(null);\n dragRef.current = drag;\n const rafThrottle = useRef<number | null>(null);\n\n const isOverCanvas = useCallback(\n (screenPos: Point): boolean => {\n const el = canvasContainerRef.current;\n if (!el) return false;\n const r = el.getBoundingClientRect();\n return (\n screenPos.x >= r.left &&\n screenPos.x <= r.right &&\n screenPos.y >= r.top &&\n screenPos.y <= r.bottom\n );\n },\n [canvasContainerRef],\n );\n\n const screenToWorldFromContainer = useCallback(\n (screenPos: Point): Point | null => {\n const el = canvasContainerRef.current;\n if (!el) return null;\n const r = el.getBoundingClientRect();\n return screenToWorld({ x: screenPos.x - r.left, y: screenPos.y - r.top }, view);\n },\n [canvasContainerRef, view],\n );\n\n useEffect(() => {\n if (!drag) return;\n const handleMove = (e: PointerEvent) => {\n const screenPos = { x: e.clientX, y: e.clientY };\n const current = dragRef.current;\n if (!current) return;\n if (rafThrottle.current !== null) {\n dragRef.current = { ...current, screenPos };\n setDrag(dragRef.current);\n return;\n }\n rafThrottle.current = requestAnimationFrame(() => {\n rafThrottle.current = null;\n const active = dragRef.current;\n if (!active) return;\n let feedback: DragFeedback | null = null;\n if (capability.onDragOver && isOverCanvas(screenPos)) {\n const world = screenToWorldFromContainer(screenPos);\n if (world) feedback = capability.onDragOver(world, active.item, state, config);\n }\n setDrag({ ...active, screenPos, feedback });\n });\n };\n const handleUp = (e: PointerEvent) => {\n const screenPos = { x: e.clientX, y: e.clientY };\n const active = dragRef.current;\n if (!active) return;\n if (rafThrottle.current !== null) {\n cancelAnimationFrame(rafThrottle.current);\n rafThrottle.current = null;\n }\n if (isOverCanvas(screenPos)) {\n const world = screenToWorldFromContainer(screenPos);\n if (world) {\n const nextState = capability.onDrop(world, active.item, state, config);\n setState(nextState);\n emit('canvas.itemAdded');\n }\n }\n setDrag(null);\n };\n window.addEventListener('pointermove', handleMove);\n window.addEventListener('pointerup', handleUp);\n return () => {\n window.removeEventListener('pointermove', handleMove);\n window.removeEventListener('pointerup', handleUp);\n };\n }, [drag, capability, state, config, setState, emit, isOverCanvas, screenToWorldFromContainer]);\n\n const startDrag = useCallback((item: PaletteItem, originScreenPos: Point) => {\n setDrag({ item, screenPos: originScreenPos, feedback: null });\n }, []);\n\n return { drag, startDrag };\n}\n\nexport interface DragOverlayProps {\n drag: DragState | null;\n}\n\nexport function DragOverlay({ drag }: DragOverlayProps) {\n if (!drag) return null;\n return <DragGhost item={drag.item} screenPos={drag.screenPos} />;\n}\n","import type { PaletteItem, Point } from '../instrument/types';\n\nexport interface PaletteProps {\n items: PaletteItem[];\n onDragStart: (item: PaletteItem, originScreenPos: Point) => void;\n className?: string;\n}\n\nexport function Palette({ items, onDragStart, className }: PaletteProps) {\n return (\n <div className={className ? `lk-palette ${className}` : 'lk-palette'}>\n {items.map((item) => (\n <button\n type=\"button\"\n key={item.id}\n className=\"lk-palette__item\"\n onPointerDown={(e) => {\n e.preventDefault();\n onDragStart(item, { x: e.clientX, y: e.clientY });\n }}\n >\n <span className=\"lk-palette__label\">{item.label}</span>\n </button>\n ))}\n </div>\n );\n}\n","import { createContext, useContext } from 'react';\nimport type { Instrument } from '../instrument/types';\nimport type { LabMode, SavedSnapshot, WorkspaceRecord } from '../state/types';\n\nexport interface LabContextValue {\n instruments: Instrument[];\n workspaces: WorkspaceRecord[];\n addWorkspace: (instrumentName: string) => void;\n cloneWorkspace: (id: string) => void;\n closeWorkspace: (id: string) => void;\n resetWorkspace: (id: string) => void;\n savedSnapshots: SavedSnapshot[];\n saveSnapshot: (workspaceId: string, name?: string) => void;\n loadSnapshot: (workspaceId: string, snapshotId: string) => void;\n deleteSnapshot: (snapshotId: string) => void;\n mode: LabMode;\n setMode: (m: LabMode) => void;\n}\n\nexport const LabContext = createContext<LabContextValue | null>(null);\n\nexport function useLabContext(): LabContextValue {\n const ctx = useContext(LabContext);\n if (ctx === null) {\n throw new Error('useLabContext must be used inside <Lab>');\n }\n return ctx;\n}\n","import { ControlPanel } from '../controls/ControlPanel';\nimport { Sidebar } from '../primitives/Sidebar';\nimport type { WorkspaceSidebarContext } from './slotTypes';\n\nexport interface DefaultSidebarProps {\n ctx: WorkspaceSidebarContext;\n}\n\nexport function DefaultSidebar({ ctx }: DefaultSidebarProps) {\n if (ctx.configFields.length === 0) {\n return (\n <Sidebar title={ctx.instrumentName}>\n <div className=\"lk-sidebar__placeholder\">{ctx.instrumentName} has no config fields.</div>\n </Sidebar>\n );\n }\n return (\n <Sidebar title={ctx.instrumentName}>\n <ControlPanel\n fields={ctx.configFields}\n config={ctx.config as Record<string, unknown>}\n setConfig={(key, value) => ctx.setConfig(key as string, value)}\n />\n </Sidebar>\n );\n}\n","import { StatusBar } from '../primitives/StatusBar';\nimport type { WorkspaceStatusBarContext } from './slotTypes';\n\nexport interface DefaultStatusBarProps {\n ctx: WorkspaceStatusBarContext;\n}\n\nexport function DefaultStatusBar({ ctx }: DefaultStatusBarProps) {\n return (\n <StatusBar>\n <StatusBar.Section>{ctx.instrumentName}</StatusBar.Section>\n <StatusBar.Section>{Math.round(ctx.zoom * 100)}%</StatusBar.Section>\n </StatusBar>\n );\n}\n","import { Toolbar } from '../primitives/Toolbar';\nimport type { WorkspaceToolbarContext } from './slotTypes';\n\nexport interface DefaultToolbarProps {\n ctx: WorkspaceToolbarContext;\n}\n\nexport function DefaultToolbar({ ctx }: DefaultToolbarProps) {\n return (\n <Toolbar>\n {ctx.hasUndo && (\n <>\n <Toolbar.Button onClick={ctx.undo} disabled={!ctx.canUndo} title=\"Undo (Cmd/Ctrl+Z)\">\n Undo\n </Toolbar.Button>\n <Toolbar.Button\n onClick={ctx.redo}\n disabled={!ctx.canRedo}\n title=\"Redo (Cmd/Ctrl+Shift+Z)\"\n >\n Redo\n </Toolbar.Button>\n <Toolbar.Spacer />\n </>\n )}\n\n {ctx.hasCanvas && (\n <>\n <Toolbar.Button onClick={ctx.zoomOut} title=\"Zoom out\">\n −\n </Toolbar.Button>\n <span className=\"lk-toolbar__zoom-label\">{Math.round(ctx.zoom * 100)}%</span>\n <Toolbar.Button onClick={ctx.zoomIn} title=\"Zoom in\">\n +\n </Toolbar.Button>\n <Toolbar.Button onClick={ctx.resetZoom} title=\"Reset zoom\">\n 1:1\n </Toolbar.Button>\n <Toolbar.Spacer />\n </>\n )}\n\n <Toolbar.Button onClick={() => ctx.saveSnapshot()} title=\"Save snapshot (Cmd/Ctrl+S)\">\n Save\n </Toolbar.Button>\n\n {ctx.savedSnapshots.length > 0 && (\n <select\n className=\"lk-toolbar__load-select\"\n aria-label=\"Load snapshot\"\n defaultValue=\"\"\n onChange={(e) => {\n const id = e.target.value;\n if (id) {\n ctx.loadSnapshot(id);\n e.target.value = '';\n }\n }}\n >\n <option value=\"\" disabled>\n Load…\n </option>\n {ctx.savedSnapshots.map((sn) => (\n <option key={sn.id} value={sn.id}>\n {sn.name}\n </option>\n ))}\n </select>\n )}\n\n <Toolbar.Spacer />\n\n <Toolbar.Button onClick={ctx.clone} title=\"Clone workspace\">\n Clone\n </Toolbar.Button>\n <Toolbar.Button onClick={ctx.reset} title=\"Reset workspace\">\n Reset\n </Toolbar.Button>\n <Toolbar.Button\n onClick={ctx.close}\n disabled={ctx.isLastWorkspace}\n title={ctx.isLastWorkspace ? 'Cannot close the last workspace' : 'Close workspace'}\n >\n Close\n </Toolbar.Button>\n </Toolbar>\n );\n}\n","import { type KeyboardEvent, type ReactNode, useContext, useMemo } from 'react';\nimport { useStore } from 'zustand/react';\nimport type { Instrument } from '../instrument/types';\nimport { useLabContext } from '../lab/LabContext';\nimport { LabStoreContext } from '../state/context';\nimport type { WorkspaceRecord } from '../state/types';\nimport { DefaultSidebar } from './DefaultSidebar';\nimport { DefaultStatusBar } from './DefaultStatusBar';\nimport { DefaultToolbar } from './DefaultToolbar';\nimport type {\n SidebarSlot,\n StatusBarSlot,\n ToolbarSlot,\n WorkspaceSidebarContext,\n WorkspaceStatusBarContext,\n WorkspaceToolbarContext,\n} from './slotTypes';\n\nexport interface UndoBindings {\n canUndo: boolean;\n canRedo: boolean;\n undo: () => void;\n redo: () => void;\n}\n\nexport interface WorkspaceChromeProps {\n workspaceId: string;\n record: WorkspaceRecord;\n instrument: Instrument;\n isLastWorkspace: boolean;\n toolbar?: ToolbarSlot;\n sidebar?: SidebarSlot;\n statusBar?: StatusBarSlot;\n undoBindings?: UndoBindings;\n sidebarExtras?: ReactNode;\n children: ReactNode;\n}\n\nexport function WorkspaceChrome({\n workspaceId,\n record,\n instrument,\n isLastWorkspace,\n toolbar,\n sidebar,\n statusBar,\n undoBindings,\n sidebarExtras,\n children,\n}: WorkspaceChromeProps) {\n const lab = useLabContext();\n const storeCtx = useContext(LabStoreContext);\n if (!storeCtx) throw new Error('[labkit] WorkspaceChrome requires <LabStoreProvider>');\n const updateWorkspaceView = useStore(storeCtx.store, (s) => s.updateWorkspaceView);\n const updateWorkspaceConfig = useStore(storeCtx.store, (s) => s.updateWorkspaceConfig);\n const updateWorkspaceState = useStore(storeCtx.store, (s) => s.updateWorkspaceState);\n\n const toolbarCtx = useMemo<WorkspaceToolbarContext>(() => {\n const setZoom = (z: number): void => {\n updateWorkspaceView(workspaceId, { ...record.view, zoom: z });\n };\n return {\n workspaceId,\n instrumentName: record.instrumentName,\n hasUndo: instrument.undo != null,\n canUndo: undoBindings?.canUndo ?? false,\n canRedo: undoBindings?.canRedo ?? false,\n undo: undoBindings?.undo ?? (() => {}),\n redo: undoBindings?.redo ?? (() => {}),\n zoom: record.view.zoom,\n setZoom,\n zoomIn: () => setZoom(record.view.zoom * 1.25),\n zoomOut: () => setZoom(record.view.zoom * 0.8),\n resetZoom: () => setZoom(1),\n hasCanvas: instrument.canvas != null,\n savedSnapshots: lab.savedSnapshots.filter((s) => s.workspaceId === workspaceId),\n saveSnapshot: (name) => lab.saveSnapshot(workspaceId, name),\n loadSnapshot: (snapshotId) => lab.loadSnapshot(workspaceId, snapshotId),\n clone: () => lab.cloneWorkspace(workspaceId),\n reset: () => lab.resetWorkspace(workspaceId),\n close: () => lab.closeWorkspace(workspaceId),\n isLastWorkspace,\n };\n }, [workspaceId, record, instrument, lab, isLastWorkspace, updateWorkspaceView, undoBindings]);\n\n const sidebarCtx = useMemo<WorkspaceSidebarContext>(\n () => ({\n workspaceId,\n instrumentName: record.instrumentName,\n configFields: instrument.configSchema?.() ?? [],\n config: record.config,\n setConfig: (key, value) => {\n const prevConfig = record.config as Record<string, unknown>;\n if (process.env.NODE_ENV !== 'production' && !(key in prevConfig)) {\n console.warn(\n `[labkit] setConfig: unknown key \"${key}\" for instrument \"${record.instrumentName}\"`,\n );\n }\n updateWorkspaceConfig(workspaceId, key as never, value as never);\n if (instrument.onConfigChange) {\n const nextConfig = { ...prevConfig, [key]: value };\n const nextState = instrument.onConfigChange(nextConfig, prevConfig, record.state);\n updateWorkspaceState(workspaceId, nextState as never);\n }\n },\n }),\n [workspaceId, record, instrument, updateWorkspaceConfig, updateWorkspaceState],\n );\n\n const statusCtx: WorkspaceStatusBarContext = {\n workspaceId,\n instrumentName: record.instrumentName,\n zoom: record.view.zoom,\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLDivElement>): void => {\n const mod = e.metaKey || e.ctrlKey;\n if (!mod) return;\n if (e.key === 'z' || e.key === 'Z') {\n e.preventDefault();\n if (e.shiftKey) toolbarCtx.redo();\n else toolbarCtx.undo();\n } else if (e.key === 's' || e.key === 'S') {\n e.preventDefault();\n toolbarCtx.saveSnapshot();\n }\n };\n\n return (\n <section\n className=\"lk-workspace\"\n aria-label={`Workspace ${record.instrumentName}`}\n onKeyDown={handleKeyDown}\n >\n <div className=\"lk-workspace__toolbar\">\n {toolbar ? toolbar(toolbarCtx) : <DefaultToolbar ctx={toolbarCtx} />}\n </div>\n <div className=\"lk-workspace__body\">\n <div className=\"lk-workspace__sidebar\">\n {sidebar ? sidebar(sidebarCtx) : <DefaultSidebar ctx={sidebarCtx} />}\n {sidebarExtras}\n </div>\n <div className=\"lk-workspace__content\">{children}</div>\n </div>\n <div className=\"lk-workspace__status\">\n {statusBar ? statusBar(statusCtx) : <DefaultStatusBar ctx={statusCtx} />}\n </div>\n </section>\n );\n}\n","import { type ReactNode, useContext, useMemo, useRef, useState } from 'react';\nimport { useStore } from 'zustand/react';\nimport { CanvasStack } from '../canvas/CanvasStack';\nimport type { CanvasLayerDescriptor } from '../canvas/useLayerScheduler';\nimport { DragOverlay, useDragDrop } from '../dragdrop/DragDropRuntime';\nimport { Palette } from '../dragdrop/Palette';\nimport type {\n Instrument,\n LayerDescriptor,\n PaletteItem,\n RenderContext,\n ViewTransform,\n} from '../instrument/types';\nimport { useLabContext } from '../lab/LabContext';\nimport { LayerList } from '../layers/LayerList';\nimport { LabStoreContext } from '../state/context';\nimport type { LabStore } from '../state/store';\nimport type { WorkspaceRecord } from '../state/types';\nimport { createEventBus, type EventBus } from '../undo/eventBus';\nimport { pushSnapshot, redo as undoRedo, undo as undoUndo } from '../undo/undoStack';\nimport type { UndoBindings } from './WorkspaceChrome';\nimport { WorkspaceChrome } from './WorkspaceChrome';\n\nexport interface WorkspaceProps {\n id: string;\n}\n\nexport function Workspace({ id }: WorkspaceProps) {\n const lab = useLabContext();\n const storeCtx = useContext(LabStoreContext);\n if (!storeCtx) throw new Error('[labkit] <Workspace> requires <LabStoreProvider>');\n const record = useStore(storeCtx.store, (s) => s.workspaces.find((w) => w.id === id));\n if (!record) {\n return <div className=\"lk-workspace lk-workspace--unknown\">Workspace not found: {id}</div>;\n }\n const instrument = lab.instruments.find((i) => i.name === record.instrumentName);\n if (!instrument) {\n return (\n <div className=\"lk-workspace lk-workspace--unknown\">\n Unknown instrument: {record.instrumentName}\n </div>\n );\n }\n return (\n <WorkspaceRuntime\n record={record}\n instrument={instrument}\n store={storeCtx.store}\n isLast={lab.workspaces.length <= 1}\n />\n );\n}\n\ninterface WorkspaceRuntimeProps {\n record: WorkspaceRecord;\n instrument: Instrument;\n store: LabStore;\n isLast: boolean;\n}\n\nfunction WorkspaceRuntime({ record, instrument, store, isLast }: WorkspaceRuntimeProps) {\n const canvasContainerRef = useRef<HTMLDivElement | null>(null);\n const updateWorkspaceState = useStore(store, (s) => s.updateWorkspaceState);\n const updateWorkspaceConfig = useStore(store, (s) => s.updateWorkspaceConfig);\n const updateWorkspaceView = useStore(store, (s) => s.updateWorkspaceView);\n const updateWorkspaceUndoStack = useStore(store, (s) => s.updateWorkspaceUndoStack);\n\n const busRef = useRef<EventBus | null>(null);\n if (busRef.current === null) busRef.current = createEventBus();\n const bus = busRef.current;\n\n const [layerVisibility, setLayerVisibility] = useState<Record<string, boolean>>({});\n const [layerOrder, setLayerOrder] = useState<string[] | null>(null);\n\n const undoCap = instrument.undo;\n const undoEvents = useMemo(() => new Set(undoCap?.snapshotOn ?? ['state.change']), [undoCap]);\n const maxDepth = undoCap?.maxDepth ?? 50;\n\n const snapshotIfNeeded = (event: string): void => {\n if (!undoCap || !undoEvents.has(event)) return;\n const current = store.getState().workspaces.find((w) => w.id === record.id);\n if (!current) return;\n const snap = structuredClone(current.state);\n updateWorkspaceUndoStack(record.id, (prev) => pushSnapshot(prev, snap, maxDepth));\n };\n\n const setView = (v: ViewTransform): void => updateWorkspaceView(record.id, v);\n\n const renderCtx: RenderContext<unknown, unknown> = {\n state: record.state,\n config: record.config,\n setState: (next) => {\n snapshotIfNeeded('state.change');\n updateWorkspaceState(record.id, next);\n bus.emit('state.change');\n },\n setConfig: (key, value) => {\n const evt = `config.change:${String(key)}`;\n snapshotIfNeeded('config.change');\n snapshotIfNeeded(evt);\n updateWorkspaceConfig(record.id, key as never, value as never);\n bus.emit('config.change');\n bus.emit(evt);\n },\n workspace: {\n id: record.id,\n zoom: record.view.zoom,\n setZoom: (z) => updateWorkspaceView(record.id, { ...record.view, zoom: z }),\n },\n emit: (event) => {\n snapshotIfNeeded(event);\n bus.emit(event);\n },\n };\n\n const undoBindings: UndoBindings | undefined = undoCap\n ? {\n canUndo: record.undoStack.past.length > 0,\n canRedo: record.undoStack.future.length > 0,\n undo: () => {\n const result = undoUndo(record.undoStack, structuredClone(record.state));\n if (!result) return;\n updateWorkspaceState(record.id, result.snapshot as never);\n updateWorkspaceUndoStack(record.id, result.stack);\n },\n redo: () => {\n const result = undoRedo(record.undoStack, structuredClone(record.state));\n if (!result) return;\n updateWorkspaceState(record.id, result.snapshot as never);\n updateWorkspaceUndoStack(record.id, result.stack);\n },\n }\n : undefined;\n\n const canvasLayers: CanvasLayerDescriptor[] = useMemo(() => {\n if (!instrument.canvas) return [];\n const baseLayers = instrument.canvas.layers;\n const ordered = layerOrder\n ? [...baseLayers].sort((a, b) => layerOrder.indexOf(a.id) - layerOrder.indexOf(b.id))\n : baseLayers;\n return ordered.map((layer) => ({\n id: layer.id,\n visible: layerVisibility[layer.id] !== false,\n render: (ctx, view) =>\n layer.draw(ctx, { state: record.state, config: record.config, zoom: view.zoom }),\n }));\n }, [instrument.canvas, record.state, record.config, layerVisibility, layerOrder]);\n\n const layerDescriptors: LayerDescriptor[] = useMemo(() => {\n if (!instrument.layers) return [];\n return instrument.layers.ids.map((lid) => ({ id: lid, label: lid }));\n }, [instrument.layers]);\n\n const dragDropResult = useDragDrop({\n capability: instrument.dragDrop ?? { palette: [], onDrop: (_p, _i, s) => s },\n canvasContainerRef,\n view: record.view,\n state: record.state,\n config: record.config,\n setState: (next) => {\n snapshotIfNeeded('canvas.itemAdded');\n updateWorkspaceState(record.id, next as never);\n },\n emit: (evt) => {\n snapshotIfNeeded(evt);\n bus.emit(evt);\n },\n });\n\n const paletteItems: PaletteItem[] = useMemo(() => {\n if (!instrument.dragDrop) return [];\n const p = instrument.dragDrop.palette;\n return typeof p === 'function' ? p(record.state, record.config) : p;\n }, [instrument.dragDrop, record.state, record.config]);\n\n const layersWithFeedback: CanvasLayerDescriptor[] = useMemo(() => {\n if (!dragDropResult.drag?.feedback) return canvasLayers;\n const fb = dragDropResult.drag.feedback;\n const screen = dragDropResult.drag.screenPos;\n return [\n ...canvasLayers,\n {\n id: '__lk_drag_feedback',\n visible: true,\n render: (ctx) => {\n const el = canvasContainerRef.current;\n if (!el) return;\n const r = el.getBoundingClientRect();\n ctx.save();\n ctx.strokeStyle = fb.ok ? '#3a7' : '#c44';\n ctx.lineWidth = 2;\n ctx.beginPath();\n ctx.arc(screen.x - r.left, screen.y - r.top, 16, 0, Math.PI * 2);\n ctx.stroke();\n ctx.restore();\n },\n },\n ];\n }, [canvasLayers, dragDropResult.drag]);\n\n let body: ReactNode;\n if (instrument.canvas) {\n body = (\n <div\n ref={canvasContainerRef}\n className=\"lk-workspace__canvas-host\"\n style={{ width: '100%', height: '100%', position: 'relative' }}\n >\n <CanvasStack layers={layersWithFeedback} view={record.view} onViewChange={setView} />\n <DragOverlay drag={dragDropResult.drag} />\n </div>\n );\n } else {\n body = instrument.render(renderCtx);\n }\n\n const paletteNode =\n paletteItems.length > 0 ? (\n <Palette items={paletteItems} onDragStart={dragDropResult.startDrag} />\n ) : null;\n\n const layerListNode =\n instrument.layers && layerDescriptors.length > 0 ? (\n <LayerList\n layers={layerDescriptors}\n visibility={layerVisibility}\n onReorder={(next) => {\n setLayerOrder(next.map((l) => l.id));\n bus.emit('layers.reorder');\n }}\n onToggle={(lid, visible) => {\n setLayerVisibility((prev) => ({ ...prev, [lid]: visible }));\n bus.emit('layers.toggle');\n }}\n />\n ) : null;\n\n return (\n <WorkspaceChrome\n workspaceId={record.id}\n record={record}\n instrument={instrument}\n isLastWorkspace={isLast}\n undoBindings={undoBindings}\n sidebarExtras={\n <>\n {paletteNode}\n {layerListNode}\n </>\n }\n >\n {body}\n </WorkspaceChrome>\n );\n}\n","import type { Instrument } from '../instrument/types';\nimport type { WorkspaceRecord } from '../state/types';\n\nconst DEFAULT_VIEW = { zoom: 1, pan: { x: 0, y: 0 } } as const;\n\nfunction findInstrument(instruments: Instrument[], name: string): Instrument {\n const found = instruments.find((i) => i.name === name);\n if (!found) {\n throw new Error(`[labkit] Unknown instrument: \"${name}\"`);\n }\n return found;\n}\n\nfunction initialView(instrument: Instrument): WorkspaceRecord['view'] {\n return instrument.canvas?.initialView\n ? structuredClone(instrument.canvas.initialView)\n : { ...DEFAULT_VIEW, pan: { ...DEFAULT_VIEW.pan } };\n}\n\nexport function addWorkspace(\n workspaces: WorkspaceRecord[],\n instruments: Instrument[],\n instrumentName: string,\n): WorkspaceRecord[] {\n const instrument = findInstrument(instruments, instrumentName);\n const config = instrument.defaultConfig();\n const state = instrument.initialState(config);\n const record: WorkspaceRecord = {\n id: crypto.randomUUID(),\n instrumentName,\n config,\n state,\n view: initialView(instrument),\n undoStack: { past: [], future: [] },\n };\n return [...workspaces, record];\n}\n\nexport function cloneWorkspace(workspaces: WorkspaceRecord[], id: string): WorkspaceRecord[] {\n const sourceIdx = workspaces.findIndex((w) => w.id === id);\n const source = workspaces[sourceIdx];\n if (!source) return workspaces;\n const clone: WorkspaceRecord = {\n ...source,\n id: crypto.randomUUID(),\n config: structuredClone(source.config),\n state: structuredClone(source.state),\n view: structuredClone(source.view),\n undoStack: { past: [], future: [] },\n };\n return [...workspaces.slice(0, sourceIdx + 1), clone, ...workspaces.slice(sourceIdx + 1)];\n}\n\nexport function closeWorkspace(workspaces: WorkspaceRecord[], id: string): WorkspaceRecord[] {\n if (workspaces.length <= 1) return workspaces;\n const next = workspaces.filter((w) => w.id !== id);\n return next.length === workspaces.length ? workspaces : next;\n}\n\nexport function resetWorkspace(\n workspaces: WorkspaceRecord[],\n id: string,\n instruments: Instrument[],\n): WorkspaceRecord[] {\n const idx = workspaces.findIndex((w) => w.id === id);\n const current = workspaces[idx];\n if (!current) return workspaces;\n const instrument = findInstrument(instruments, current.instrumentName);\n const config = instrument.defaultConfig();\n const state = instrument.initialState(config);\n const reset: WorkspaceRecord = {\n ...current,\n config,\n state,\n view: initialView(instrument),\n };\n return [...workspaces.slice(0, idx), reset, ...workspaces.slice(idx + 1)];\n}\n","import type { ReactNode } from 'react';\nimport { ThemeProvider, useThemeOptional } from '@weasel-js/theme/react';\nimport type { LabMode } from '../state/types';\nimport { interstellarTheme } from '../theme/interstellar';\nimport { useResolvedMode } from './useSystemMode';\n\nexport interface LabShellProps {\n title: string;\n children: ReactNode;\n /** Optional content rendered into the header (e.g., action buttons). */\n header?: ReactNode;\n /** Optional content rendered into the footer. */\n footer?: ReactNode;\n /** Color mode. \"auto\" (default) follows prefers-color-scheme. */\n mode?: LabMode;\n}\n\nexport function LabShell({ title, children, header, footer, mode = 'auto' }: LabShellProps) {\n const resolved = useResolvedMode(mode);\n const outer = useThemeOptional();\n\n const shell = (\n <div className=\"lk-root lk-shell\">\n <header className=\"lk-shell-header\">\n <h1 className=\"lk-shell-title\">{title}</h1>\n {header && <div className=\"lk-shell-header-actions\">{header}</div>}\n </header>\n <main className=\"lk-shell-body\">{children}</main>\n {footer && <footer className=\"lk-shell-footer\">{footer}</footer>}\n </div>\n );\n\n // Inside <Lab> the theme is already applied on `.lk-lab`; wrapping again\n // would only add a div.\n return outer ? (\n shell\n ) : (\n <ThemeProvider theme={interstellarTheme} mode={resolved}>\n {shell}\n </ThemeProvider>\n );\n}\n","import { Children, type CSSProperties, type ReactNode } from 'react';\nimport { gridDims } from './gridDims';\n\nexport interface WorkspaceGridProps {\n children: ReactNode;\n}\n\nexport function WorkspaceGrid({ children }: WorkspaceGridProps) {\n const count = Children.count(children);\n const { cols, rows } = gridDims(count);\n const style = {\n '--lk-grid-cols': String(cols),\n '--lk-grid-rows': String(rows),\n } as CSSProperties;\n return (\n <div className=\"lk-workspace-grid\" style={style}>\n {children}\n </div>\n );\n}\n","import { type CSSProperties, type ReactNode, useEffect, useMemo, useRef } from 'react';\nimport { useStore } from 'zustand/react';\nimport { ThemeProvider } from '@weasel-js/theme/react';\nimport type { Instrument } from '../instrument/types';\nimport { noneAdapter } from '../state/adapters';\nimport { LabStoreContext } from '../state/context';\nimport { createLabStore, type LabStore } from '../state/store';\nimport type { LabMode, StorageAdapter, WorkspaceRecord } from '../state/types';\nimport { interstellarTheme } from '../theme/interstellar';\nimport { useResolvedMode } from './useSystemMode';\nimport { Workspace } from '../workspace/Workspace';\nimport {\n addWorkspace as addWorkspaceOp,\n cloneWorkspace as cloneWorkspaceOp,\n closeWorkspace as closeWorkspaceOp,\n resetWorkspace as resetWorkspaceOp,\n} from '../workspace/workspaceOps';\nimport { LabContext, type LabContextValue } from './LabContext';\nimport { LabShell } from './LabShell';\nimport { WorkspaceGrid } from './WorkspaceGrid';\n\nexport interface LabProps {\n instruments: Instrument[];\n defaultInstrument: string;\n storage?: StorageAdapter | null;\n storageKey?: string;\n mode?: LabMode;\n /**\n * Optional list of CSS colors used to compose the interstellar theme's\n * cosmic backdrop. Each color becomes one radial-gradient blob on the\n * dark void base. Order maps to a fixed spread of positions; extras wrap\n * around. Ignored unless the resolved mode is dark.\n */\n nebula?: readonly string[];\n title?: string;\n children?: ReactNode;\n}\n\nfunction buildStore(\n instruments: Instrument[],\n defaultInstrument: string,\n storage: StorageAdapter,\n storageKey: string,\n initialMode: LabMode,\n): LabStore {\n const store = createLabStore({ storageKey, storage, initialMode });\n if (store.getState().workspaces.length === 0) {\n const seeded = addWorkspaceOp([], instruments, defaultInstrument);\n const record = seeded[0];\n if (record) {\n const { undoStack: _undoStack, ...rest } = record;\n store.getState().addWorkspace(rest);\n }\n }\n return store;\n}\n\n// Fixed spread of nebula blob positions / sizes / fall-off stops. Colors\n// supplied via the `nebula` prop are slotted into these slots in order;\n// callers passing more than 5 wrap around (intentional — keeps the look\n// readable and bounded).\nconst NEBULA_SLOTS = [\n { cx: '18%', cy: '30%', sx: '60%', sy: '80%', stop: '70%' },\n { cx: '78%', cy: '70%', sx: '55%', sy: '90%', stop: '65%' },\n { cx: '50%', cy: '50%', sx: '50%', sy: '70%', stop: '75%' },\n { cx: '12%', cy: '82%', sx: '50%', sy: '70%', stop: '70%' },\n { cx: '85%', cy: '18%', sx: '55%', sy: '80%', stop: '70%' },\n] as const;\n\nfunction buildNebula(colors: readonly string[]): string {\n const blobs = colors.map((c, i) => {\n const p = NEBULA_SLOTS[i % NEBULA_SLOTS.length]!;\n return `radial-gradient(ellipse ${p.sx} ${p.sy} at ${p.cx} ${p.cy}, color-mix(in srgb, ${c} 22%, transparent), transparent ${p.stop})`;\n });\n blobs.push('radial-gradient(ellipse at center, #0a0a18 0%, #02020a 100%)');\n return blobs.join(', ');\n}\n\nexport function Lab({\n instruments,\n defaultInstrument,\n storage,\n storageKey,\n mode,\n nebula,\n title,\n children,\n}: LabProps) {\n if (process.env.NODE_ENV !== 'production' && instruments.length === 0) {\n throw new Error('[labkit] <Lab> requires a non-empty `instruments` array');\n }\n\n const storeRef = useRef<LabStore | null>(null);\n if (storeRef.current === null) {\n storeRef.current = buildStore(\n instruments,\n defaultInstrument,\n storage ?? noneAdapter,\n storageKey ?? 'labkit',\n mode ?? 'auto',\n );\n }\n const store = storeRef.current;\n\n const workspaces = useStore(store, (s) => s.workspaces);\n const savedSnapshots = useStore(store, (s) => s.savedSnapshots);\n const modeValue = useStore(store, (s) => s.mode);\n const resolvedMode = useResolvedMode(modeValue);\n\n useEffect(() => {\n if (mode && mode !== store.getState().mode) {\n store.getState().setMode(mode);\n }\n }, [mode, store]);\n\n const contextValue = useMemo<LabContextValue>(() => {\n const replaceWorkspaces = (next: WorkspaceRecord[]): void => {\n const currentById = new Map(store.getState().workspaces.map((w) => [w.id, w]));\n const merged = next.map((w) => currentById.get(w.id) ?? w);\n store.setState({ workspaces: merged });\n // Trigger persistence flush via a tracked action.\n store.getState().setMode(store.getState().mode);\n };\n\n return {\n instruments,\n workspaces,\n addWorkspace: (instrumentName) => {\n const next = addWorkspaceOp(store.getState().workspaces, instruments, instrumentName);\n replaceWorkspaces(next);\n },\n cloneWorkspace: (id) => {\n const next = cloneWorkspaceOp(store.getState().workspaces, id);\n replaceWorkspaces(next);\n },\n closeWorkspace: (id) => {\n const next = closeWorkspaceOp(store.getState().workspaces, id);\n replaceWorkspaces(next);\n },\n resetWorkspace: (id) => {\n const next = resetWorkspaceOp(store.getState().workspaces, id, instruments);\n const record = next.find((w) => w.id === id);\n if (!record) return;\n store.setState((s) => ({\n workspaces: s.workspaces.map((w) =>\n w.id === id\n ? { ...w, config: record.config, state: record.state, view: record.view }\n : w,\n ),\n }));\n store.getState().updateWorkspaceView(id, record.view);\n },\n savedSnapshots,\n saveSnapshot: (workspaceId, name) => {\n store.getState().saveSnapshot(workspaceId, name ?? `Save ${new Date().toLocaleString()}`);\n },\n loadSnapshot: (workspaceId, snapshotId) => {\n store.getState().loadSnapshot(snapshotId, workspaceId);\n },\n deleteSnapshot: (snapshotId) => {\n store.getState().deleteSnapshot(snapshotId);\n },\n mode: modeValue,\n setMode: (m) => {\n store.getState().setMode(m);\n },\n };\n }, [instruments, workspaces, savedSnapshots, modeValue, store]);\n\n // Only override the backdrop in dark, where there is one to override.\n // Setting a CSS custom property is the sanctioned use of inline style.\n const backdropStyle =\n resolvedMode === 'dark' && nebula && nebula.length > 0\n ? ({ ['--wzl-backdrop' as string]: buildNebula(nebula) } as CSSProperties)\n : undefined;\n\n return (\n <LabStoreContext.Provider value={{ store }}>\n <LabContext.Provider value={contextValue}>\n <ThemeProvider\n theme={interstellarTheme}\n mode={resolvedMode}\n className=\"lk-lab\"\n style={backdropStyle}\n >\n <LabShell title={title ?? 'Labkit'} mode={modeValue} header={children}>\n <WorkspaceGrid>\n {workspaces.map((w) => (\n <Workspace key={w.id} id={w.id} />\n ))}\n </WorkspaceGrid>\n </LabShell>\n </ThemeProvider>\n </LabContext.Provider>\n </LabStoreContext.Provider>\n );\n}\n","import { useCallback, useMemo } from 'react';\nimport { type ControlPoint, CurveEditor, dlog } from '../../passthrough/weasel-ui';\n\nexport type CurveMark =\n | { kind: 'band'; x: [number, number]; color?: string }\n | { kind: 'line'; x: number; color?: string };\n\nexport interface CurveFieldProps {\n /** Flat [x0, y0, x1, y1, …] — matches how curve-as-array configs\n * serialize in JSON snapshots. */\n values: number[];\n min: number;\n max: number;\n step: number;\n /** Plot width in CSS px. Caller sizes (typically uses a ResizeObserver). */\n width: number;\n /** Plot height in CSS px. Default 110. */\n height?: number;\n /** Flat default curve. When provided, a Reset button restores it. */\n defaults?: readonly number[];\n onChange: (next: number[]) => void;\n /** Optional vertical marks overlaid on the plot (e.g. landmarks). */\n marks?: readonly CurveMark[];\n}\n\n/**\n * A function-domain (y = f(x), x ∈ [0,1]) curve editor with per-stop\n * numeric readouts and flip buttons. Wraps weasel-ui's\n * `CurveEditor`; consumers wanting the raw editor (2D paths,\n * custom anchors) should import it from `@weasel-js/labkit/weasel-ui`.\n */\nexport function CurveField({\n values,\n min,\n max,\n step,\n width,\n height = 110,\n defaults,\n onChange,\n marks,\n}: CurveFieldProps) {\n const points: ControlPoint[] = useMemo(() => {\n const out: ControlPoint[] = [];\n for (let i = 0; i + 1 < values.length; i += 2) out.push({ x: values[i]!, y: values[i + 1]! });\n return out;\n }, [values]);\n\n const handleChange = useCallback(\n (next: ControlPoint[]) => {\n const flat: number[] = new Array(next.length * 2);\n for (let i = 0; i < next.length; i++) {\n const ySnap = Math.round(next[i]!.y / step) * step;\n const y = Math.max(min, Math.min(max, ySnap));\n flat[i * 2] = next[i]!.x;\n flat[i * 2 + 1] = y;\n }\n dlog('curve-field', 'handleChange', {\n nLen: next.length,\n flatLen: flat.length,\n sample: flat.slice(0, 4),\n });\n onChange(flat);\n },\n [onChange, min, max, step],\n );\n\n const handleFlip = useCallback(() => {\n const flipped: Array<{ x: number; y: number }> = [];\n for (let i = 0; i + 1 < values.length; i += 2) {\n flipped.push({ x: 1 - values[i]!, y: values[i + 1]! });\n }\n flipped.sort((a, b) => a.x - b.x);\n const out: number[] = [];\n for (const p of flipped) out.push(p.x, p.y);\n onChange(out);\n }, [values, onChange]);\n\n const handleFlipVertical = useCallback(() => {\n const mid = (min + max) / 2;\n const flipped: number[] = new Array(values.length);\n for (let i = 0; i + 1 < values.length; i += 2) {\n flipped[i] = values[i]!;\n flipped[i + 1] = 2 * mid - values[i + 1]!;\n }\n onChange(flipped);\n }, [values, min, max, onChange]);\n\n return (\n <div className=\"lk-curve-field\">\n <div className=\"lk-curve-field__plot\">\n <CurveEditor\n value={points}\n onChange={handleChange}\n domain=\"1d\"\n constrain=\"function\"\n xRange={[0, 1]}\n yRange={[min, max]}\n width={width}\n height={height}\n endpoints=\"pinned-x\"\n addPointMode=\"click-curve\"\n minPoints={2}\n grid={{}}\n history={false}\n />\n {marks && marks.length > 0 && (\n <svg\n className=\"lk-curve-field__marks\"\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n aria-hidden=\"true\"\n >\n {marks.map((m) => {\n const color = m.color ?? '#ffcc00';\n if (m.kind === 'band') {\n const x0 = Math.max(0, Math.min(1, m.x[0])) * width;\n const x1 = Math.max(0, Math.min(1, m.x[1])) * width;\n const left = Math.min(x0, x1);\n const w = Math.abs(x1 - x0);\n return (\n <g key={`band-${m.x[0]}-${m.x[1]}-${color}`}>\n <rect x={left} y={0} width={w} height={height} fill={color} fillOpacity={0.4} />\n <line\n x1={left}\n y1={0}\n x2={left}\n y2={height}\n stroke={color}\n strokeOpacity={0.85}\n strokeWidth={1}\n />\n <line\n x1={left + w}\n y1={0}\n x2={left + w}\n y2={height}\n stroke={color}\n strokeOpacity={0.85}\n strokeWidth={1}\n />\n </g>\n );\n }\n const x = Math.max(0, Math.min(1, m.x)) * width;\n return (\n <line\n key={`mark-${m.x}-${color}`}\n x1={x}\n y1={0}\n x2={x}\n y2={height}\n stroke={color}\n strokeWidth={1}\n />\n );\n })}\n </svg>\n )}\n </div>\n <div className=\"lk-curve-field__actions\">\n <button type=\"button\" className=\"lk-curve-field__action\" onClick={handleFlip}>\n Flip horizontally\n </button>\n <button type=\"button\" className=\"lk-curve-field__action\" onClick={handleFlipVertical}>\n Flip vertically\n </button>\n {defaults && (\n <button\n type=\"button\"\n className=\"lk-curve-field__action\"\n onClick={() => onChange([...defaults])}\n >\n Reset\n </button>\n )}\n </div>\n </div>\n );\n}\n","import { type CSSProperties, type ReactNode, useState } from 'react';\n\n// ── Subpanel ─────────────────────────────────────────────────────────\n// Headered group of controls inside a wider panel/list. The header is a\n// label flanked by a horizontal rule — no background, padding, or border;\n// purely a typographic divider. Ported from speech-balloons styles.css:277-313.\n\nexport interface SubpanelProps {\n title: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\nexport function Subpanel({ title, children, className }: SubpanelProps) {\n const cls = className ? `lk-subpanel ${className}` : 'lk-subpanel';\n return (\n <div className={cls}>\n <h4 className=\"lk-subpanel__title\">\n <span>{title}</span>\n <hr />\n </h4>\n {children}\n </div>\n );\n}\n\n// ── EffectCard ───────────────────────────────────────────────────────\n// Draggable, collapsible card for stacked effect editors. Optional --lk-panel-accent\n// per-instance recolors the title bar, border-left, and (via re-binding --wzl-accent\n// inside the card) every descendant control that reads from the accent token.\n\nexport interface EffectCardProps {\n /** Card title rendered in the title bar (e.g. effect kind label or a select). */\n title: ReactNode;\n /** Optional badge/chip displayed before the remove button (e.g. primary value summary). */\n primary?: ReactNode;\n /** Optional accent color in any CSS color form. Sets --lk-panel-accent on the card. */\n accent?: string;\n /** Optional ordinal badge that doubles as the drag handle (used by tail cards in SB). */\n index?: number;\n expanded?: boolean;\n onToggleExpanded?: () => void;\n onRemove?: () => void;\n /**\n * Drag-handle wiring. When provided, an inline handle (⋮⋮ icon or `index`)\n * activates HTML5 drag on press. Consumer owns the drag/drop coordination —\n * see EffectCardList for the batteries-included wrapper.\n */\n draggable?: boolean;\n onPressHandle?: () => void;\n onReleaseHandle?: () => void;\n onDragStart?: (e: React.DragEvent<HTMLDivElement>) => void;\n onDragEnd?: (e: React.DragEvent<HTMLDivElement>) => void;\n onDragOver?: (e: React.DragEvent<HTMLDivElement>) => void;\n onDragLeave?: (e: React.DragEvent<HTMLDivElement>) => void;\n onDrop?: (e: React.DragEvent<HTMLDivElement>) => void;\n dragging?: boolean;\n children?: ReactNode;\n className?: string;\n}\n\nexport function EffectCard({\n title,\n primary,\n accent,\n index,\n expanded = true,\n onToggleExpanded,\n onRemove,\n draggable,\n onPressHandle,\n onReleaseHandle,\n onDragStart,\n onDragEnd,\n onDragOver,\n onDragLeave,\n onDrop,\n dragging,\n children,\n className,\n}: EffectCardProps) {\n const stateClass = `${expanded ? 'is-expanded' : 'is-collapsed'}${dragging ? ' is-dragging' : ''}${accent ? ' has-accent' : ''}`;\n const cls = `lk-effect-card ${stateClass}${className ? ` ${className}` : ''}`;\n // Per-instance dynamic color → CSS custom property requires inline style.\n // The card's CSS re-binds --wzl-accent to --lk-panel-accent so descendants tint.\n const style = accent ? ({ '--lk-panel-accent': accent } as CSSProperties) : undefined;\n\n // When a toggle handler is supplied the header acts as a disclosure button:\n // role + tab stop + Enter/Space. Bundled together so the interactive props are\n // applied as a set (no half-interactive element when onToggleExpanded is absent).\n const headProps = onToggleExpanded\n ? {\n role: 'button' as const,\n tabIndex: 0,\n onClick: onToggleExpanded,\n onKeyDown: (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onToggleExpanded();\n }\n },\n }\n : {};\n\n return (\n // biome-ignore lint/a11y/noStaticElementInteractions: native HTML5 drag-and-drop container — drag events are not click/keyboard interactions and have no semantic element; the in-card handle and header carry the a11y affordances.\n <div\n className={cls}\n style={style}\n draggable={draggable}\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n onDragOver={onDragOver}\n onDragLeave={onDragLeave}\n onDrop={onDrop}\n >\n <div className=\"lk-effect-card__head\" {...headProps}>\n {index != null ? (\n <button\n type=\"button\"\n className=\"lk-effect-card__index-badge lk-effect-card__handle\"\n title=\"Drag to reorder · click to toggle\"\n aria-label={`Item ${index + 1} — drag to reorder, click to toggle`}\n onMouseDown={onPressHandle}\n onMouseUp={onReleaseHandle}\n onClick={(e) => {\n e.stopPropagation();\n onToggleExpanded?.();\n }}\n >\n {index + 1}\n </button>\n ) : (\n <span\n className=\"lk-effect-card__handle\"\n aria-hidden=\"true\"\n title=\"Drag to reorder\"\n onMouseDown={onPressHandle}\n onMouseUp={onReleaseHandle}\n >\n <DragHandleIcon />\n </span>\n )}\n <span className=\"lk-effect-card__title\">{title}</span>\n {primary != null && <span className=\"lk-effect-card__primary\">{primary}</span>}\n {onRemove && (\n <button\n type=\"button\"\n className=\"lk-effect-card__remove\"\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n title=\"Remove\"\n aria-label=\"Remove\"\n >\n ✕\n </button>\n )}\n </div>\n {expanded && <div className=\"lk-effect-card__body\">{children}</div>}\n </div>\n );\n}\n\nfunction DragHandleIcon() {\n return (\n <svg width=\"10\" height=\"14\" viewBox=\"0 0 10 14\" aria-hidden=\"true\">\n <circle cx=\"3\" cy=\"3\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"7\" cy=\"3\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"3\" cy=\"7\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"7\" cy=\"7\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"3\" cy=\"11\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"7\" cy=\"11\" r=\"1.3\" fill=\"currentColor\" />\n </svg>\n );\n}\n\n// ── EffectCardList ───────────────────────────────────────────────────\n// Batteries-included list wrapper that coordinates HTML5 drag-and-drop across\n// a list of EffectCards. Consumer supplies items + a renderItem callback;\n// onReorder fires with (sourceId, targetId, position) on drop. Mirrors the\n// LayerStack pattern from speech-balloons Lab.tsx:630-707.\n\nexport interface EffectCardListItem {\n id: string | number;\n}\n\nexport interface EffectCardListProps<T extends EffectCardListItem> {\n items: ReadonlyArray<T>;\n renderItem: (\n item: T,\n helpers: {\n isExpanded: boolean;\n isDragging: boolean;\n toggleExpanded: () => void;\n cardProps: Pick<\n EffectCardProps,\n | 'expanded'\n | 'dragging'\n | 'draggable'\n | 'onToggleExpanded'\n | 'onPressHandle'\n | 'onReleaseHandle'\n | 'onDragStart'\n | 'onDragEnd'\n | 'onDragOver'\n | 'onDragLeave'\n | 'onDrop'\n >;\n },\n ) => ReactNode;\n onReorder: (sourceId: T['id'], targetId: T['id'], position: 'before' | 'after') => void;\n /** Optional rendered when the list is empty. */\n empty?: ReactNode;\n /** IDs to render expanded on first mount. Defaults to all collapsed. */\n defaultExpandedIds?: ReadonlyArray<T['id']>;\n}\n\nexport function EffectCardList<T extends EffectCardListItem>({\n items,\n renderItem,\n onReorder,\n empty,\n defaultExpandedIds,\n}: EffectCardListProps<T>) {\n const [expanded, setExpanded] = useState<Set<T['id']>>(() => new Set(defaultExpandedIds ?? []));\n const [draggingId, setDraggingId] = useState<T['id'] | null>(null);\n const [pressedId, setPressedId] = useState<T['id'] | null>(null);\n const [dropHint, setDropHint] = useState<{ id: T['id']; position: 'before' | 'after' } | null>(\n null,\n );\n\n if (items.length === 0) {\n return <>{empty ?? <div className=\"lk-effect-card-list__empty\">No items.</div>}</>;\n }\n\n return (\n <div className=\"lk-effect-card-list\">\n {items.map((item) => {\n const isExpanded = expanded.has(item.id);\n const isDragging = draggingId === item.id;\n const isPressed = pressedId === item.id;\n const showHintBefore =\n dropHint && dropHint.id === item.id && dropHint.position === 'before';\n const showHintAfter = dropHint && dropHint.id === item.id && dropHint.position === 'after';\n\n const toggleExpanded = () =>\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(item.id)) next.delete(item.id);\n else next.add(item.id);\n return next;\n });\n\n return (\n <div key={String(item.id)} className=\"lk-effect-card-list__wrap\">\n {showHintBefore && <div className=\"lk-effect-card-list__drop-hint\" />}\n {renderItem(item, {\n isExpanded,\n isDragging,\n toggleExpanded,\n cardProps: {\n expanded: isExpanded,\n dragging: isDragging,\n draggable: isPressed,\n onToggleExpanded: toggleExpanded,\n onPressHandle: () => setPressedId(item.id),\n onReleaseHandle: () => setPressedId(null),\n onDragStart: (e) => {\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('text/plain', String(item.id));\n setDraggingId(item.id);\n },\n onDragEnd: () => {\n setDraggingId(null);\n setPressedId(null);\n setDropHint(null);\n },\n onDragOver: (e) => {\n if (draggingId === null || draggingId === item.id) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n const rect = (e.currentTarget as HTMLDivElement).getBoundingClientRect();\n const position: 'before' | 'after' =\n e.clientY < rect.top + rect.height / 2 ? 'before' : 'after';\n setDropHint({ id: item.id, position });\n },\n onDragLeave: () => {\n setDropHint((h) => (h && h.id === item.id ? null : h));\n },\n onDrop: (e) => {\n e.preventDefault();\n if (draggingId === null || draggingId === item.id) {\n setDropHint(null);\n return;\n }\n const rect = (e.currentTarget as HTMLDivElement).getBoundingClientRect();\n const position: 'before' | 'after' =\n e.clientY < rect.top + rect.height / 2 ? 'before' : 'after';\n onReorder(draggingId, item.id, position);\n setDropHint(null);\n },\n },\n })}\n {showHintAfter && <div className=\"lk-effect-card-list__drop-hint\" />}\n </div>\n );\n })}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\nexport interface PropertyGroupProps {\n /** Title rendered between two rules at the top of the group. */\n title: ReactNode;\n /** When true the group renders nothing — useful for conditional sections. */\n hidden?: boolean;\n children: ReactNode;\n className?: string;\n /**\n * How rows pack into the 2-column grid.\n * - `'auto-color'` (default): only color rows pair side-by-side; everything\n * else spans the full width.\n * - `'pairs'`: every row auto-places into the 2-column grid two-per-row.\n */\n pack?: 'auto-color' | 'pairs';\n}\n\n/**\n * Visually-bordered group inside a PropertyList. Use to scope a set of\n * related rows under a heading (e.g. \"Aqua\", \"Bevel\", \"Dome\" sections\n * inside a fill effect's controls).\n */\nexport function PropertyGroup({\n title,\n hidden,\n children,\n className,\n pack = 'auto-color',\n}: PropertyGroupProps) {\n if (hidden) return null;\n const packClass = pack === 'pairs' ? ' lk-property-group--pairs' : '';\n const cls = `lk-property-group${packClass}${className ? ` ${className}` : ''}`;\n return (\n <div className={cls}>\n <h3 className=\"lk-property-group__title\">\n <hr />\n <span>{title}</span>\n <hr />\n </h3>\n <div className=\"lk-property-group__body\">{children}</div>\n </div>\n );\n}\n","// Display formatting helpers shared across the UI.\n//\n// House style: render negative numbers with the typographic MINUS SIGN\n// (U+2212, \"−\") instead of ASCII hyphen-minus (\"-\"). Editing surfaces should\n// accept either glyph on input via `parseSignedNumber`.\n\nconst MINUS = '−';\n\n/** Format a finite number for display, swapping the leading \"-\" to U+2212. */\nexport function formatNumber(n: number, fractionDigits?: number): string {\n if (!Number.isFinite(n)) return String(n);\n const s = fractionDigits == null ? String(n) : n.toFixed(fractionDigits);\n return s.startsWith('-') ? MINUS + s.slice(1) : s;\n}\n\n/** Parse a string that may use U+2212 or ASCII hyphen-minus for the negative sign. */\nexport function parseSignedNumber(s: string): number {\n return Number(s.replace(MINUS, '-'));\n}\n","import { type ReactNode, useState } from 'react';\nimport { dlog } from '../../passthrough/weasel-ui';\nimport { formatNumber, parseSignedNumber } from '../format';\n\nexport interface PropertyPanelProps {\n title?: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\nexport function PropertyPanel({ title, children, className }: PropertyPanelProps) {\n const cls = className ? `lk-property-panel ${className}` : 'lk-property-panel';\n return (\n <div className={cls}>\n {title != null && <h2 className=\"lk-property-panel__title\">{title}</h2>}\n {children}\n </div>\n );\n}\n\nexport type PropertyListPack = 'auto-color' | 'pairs';\n\nexport interface PropertyListProps {\n children: ReactNode;\n className?: string;\n /**\n * How rows pack into the 2-column grid.\n * - `'auto-color'` (default): only color rows pair side-by-side; everything\n * else spans the full width. Right for sparse top-level panels.\n * - `'pairs'`: every row auto-places into the 2-column grid two-per-row.\n * Headers, subpanels, and full-width children (`<hr>`, curve blocks)\n * still span via `lk-property-list__span`. Right for dense effect bodies.\n */\n pack?: PropertyListPack;\n}\n\n/**\n * Grid container for PropertyRows. Use standalone for chrome-less layouts, or\n * nest inside <PropertyPanel/> for the standard glass card.\n */\nexport function PropertyList({ children, className, pack = 'auto-color' }: PropertyListProps) {\n const packClass = pack === 'pairs' ? ' lk-property-list--pairs' : '';\n const cls = `lk-property-list${packClass}${className ? ` ${className}` : ''}`;\n return <div className={cls}>{children}</div>;\n}\n\nexport type PropertyRowVariant = 'default' | 'color' | 'checkbox';\nexport type PropertyRowLayout = 'block' | 'inline';\n\nexport interface PropertyRowProps {\n label: ReactNode;\n /** Right-aligned readout shown next to the label (e.g. current value). */\n readout?: ReactNode;\n variant?: PropertyRowVariant;\n /**\n * Label position relative to the control. \"block\" (default) stacks\n * label above control; \"inline\" places the label to the left.\n * Color and checkbox variants are always inline by their own nature.\n */\n layout?: PropertyRowLayout;\n children: ReactNode;\n htmlFor?: string;\n className?: string;\n}\n\nexport function PropertyRow({\n label,\n readout,\n variant = 'default',\n layout = 'block',\n children,\n htmlFor,\n className,\n}: PropertyRowProps) {\n const variantClass = variant === 'default' ? '' : ` lk-property-row--${variant}`;\n // Layout only meaningfully applies to the default variant; color and\n // checkbox have their own intrinsic orientation.\n const layoutClass =\n variant === 'default' && layout === 'inline' ? ' lk-property-row--inline' : '';\n const cls = `lk-property-row${variantClass}${layoutClass}${className ? ` ${className}` : ''}`;\n return (\n <label className={cls} htmlFor={htmlFor}>\n <span className=\"lk-property-row__label\">\n {label}\n {readout != null && <em className=\"lk-property-row__readout\">{readout}</em>}\n </span>\n {children}\n </label>\n );\n}\n\n// ── Row implementations ──────────────────────────────────────────────\n\nexport interface SliderRowProps {\n label: ReactNode;\n value: number;\n min: number;\n max: number;\n step?: number;\n onChange: (next: number) => void;\n /** Override how the value is rendered next to the label. Defaults to `value.toString()`. */\n format?: (value: number) => ReactNode;\n /**\n * Optional suffix rendered next to the readout. A string becomes a\n * baseline-aligned dim \"word\" unit (e.g. \"px\"); pass JSX like `<sup>°</sup>`\n * to get the browser's native super positioning for symbol units.\n */\n unit?: ReactNode;\n layout?: PropertyRowLayout;\n}\n\nexport function SliderRow({\n label,\n value,\n min,\n max,\n step = 1,\n onChange,\n format,\n unit,\n layout,\n}: SliderRowProps) {\n // Default readout precision tracks `step`: integer steps → 0 decimals,\n // 0.1 → 1 decimal, 0.05/0.02/0.01 → 2 decimals, 0.005 → 3, etc. Callers\n // can still pass an explicit `format` to override (e.g. for a custom\n // unit string or a non-decimal display like fractions).\n const decimals = step >= 1 ? 0 : Math.min(6, Math.max(0, Math.ceil(-Math.log10(step))));\n const effectiveFormat = format ?? ((n: number) => formatNumber(n, decimals));\n return (\n <PropertyRow\n label={label}\n readout={\n <EditableReadout\n value={value}\n min={min}\n max={max}\n format={effectiveFormat}\n unit={unit}\n onCommit={onChange}\n />\n }\n layout={layout}\n >\n <input\n type=\"range\"\n tabIndex={-1}\n min={min}\n max={max}\n step={step}\n value={value}\n onChange={(e) => {\n const v = Number(e.target.value);\n dlog('property-panel', 'slider', { label, value: v });\n onChange(v);\n }}\n />\n </PropertyRow>\n );\n}\n\ninterface EditableReadoutProps {\n value: number;\n min: number;\n max: number;\n format?: (value: number) => ReactNode;\n unit?: ReactNode;\n onCommit: (next: number) => void;\n}\n\n/**\n * Readout that swaps to a number input on click, commits on Enter/blur,\n * cancels on Escape. Clicks are stopped so the wrapping <label> doesn't\n * forward focus to the slider thumb.\n */\nfunction EditableReadout({ value, min, max, format, unit, onCommit }: EditableReadoutProps) {\n // Draft is non-null only while the input is focused. Live value mirrors\n // into the input otherwise. Pattern mirrors speech-balloons Lab.tsx:893-942.\n const [draft, setDraft] = useState<string | null>(null);\n const fmt = (n: number) => (format ? format(n) : formatNumber(n));\n const displayValue =\n draft !== null\n ? draft\n : (() => {\n const formatted = fmt(value);\n return typeof formatted === 'string' ? formatted : String(formatted);\n })();\n\n const suffix =\n unit == null ? null : typeof unit === 'string' ? (\n <span className=\"lk-property-row__readout-unit\">{unit}</span>\n ) : (\n unit\n );\n\n const commit = () => {\n if (draft !== null) {\n const n = parseSignedNumber(draft);\n if (Number.isFinite(n)) onCommit(Math.min(max, Math.max(min, n)));\n }\n setDraft(null);\n };\n\n return (\n <span className=\"lk-property-row__readout-group\">\n <input\n type=\"text\"\n inputMode=\"decimal\"\n className=\"lk-property-row__readout-input\"\n value={displayValue}\n onFocus={(e) => {\n const formatted = fmt(value);\n setDraft(typeof formatted === 'string' ? formatted : String(formatted));\n e.currentTarget.select();\n }}\n onChange={(e) => setDraft(e.target.value.replace(/-/g, '−'))}\n onBlur={commit}\n onClick={(e) => {\n // Stop the click from reaching the wrapping <label> (which would\n // forward focus to the slider thumb).\n e.preventDefault();\n e.stopPropagation();\n e.currentTarget.focus();\n }}\n onMouseDown={(e) => e.stopPropagation()}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n commit();\n e.currentTarget.blur();\n } else if (e.key === 'Escape') {\n setDraft(null);\n e.currentTarget.blur();\n }\n }}\n />\n {suffix}\n </span>\n );\n}\n\nexport interface ColorRowProps {\n label: ReactNode;\n value: string;\n onChange: (next: string) => void;\n /** 0..1 alpha. When provided, a translucent slider renders beneath the swatch. */\n alpha?: number;\n onAlphaChange?: (next: number) => void;\n /**\n * Render the alpha track as inert (dimmed, no thumb, not-allowed cursor).\n * Use when the color's consumer drops alpha so the affordance reads dead.\n */\n alphaDisabled?: boolean;\n}\n\nexport function ColorRow({\n label,\n value,\n onChange,\n alpha,\n onAlphaChange,\n alphaDisabled,\n}: ColorRowProps) {\n const showAlpha = alpha != null;\n const className = alphaDisabled ? 'lk-property-row--alpha-disabled' : undefined;\n return (\n <PropertyRow label={label} variant=\"color\" className={className}>\n <input type=\"color\" value={value} onChange={(e) => onChange(e.target.value)} />\n {showAlpha && (\n <input\n type=\"range\"\n className=\"lk-property-row__alpha\"\n min={0}\n max={1}\n step={0.01}\n value={alpha}\n disabled={alphaDisabled}\n onChange={(e) => onAlphaChange?.(Number(e.target.value))}\n />\n )}\n </PropertyRow>\n );\n}\n\nexport interface CheckboxRowProps {\n label: ReactNode;\n value: boolean;\n onChange: (next: boolean) => void;\n}\n\nexport function CheckboxRow({ label, value, onChange }: CheckboxRowProps) {\n return (\n <PropertyRow label={label} variant=\"checkbox\">\n <input type=\"checkbox\" checked={value} onChange={(e) => onChange(e.target.checked)} />\n </PropertyRow>\n );\n}\n\nexport interface TextRowProps {\n label: ReactNode;\n value: string;\n onChange: (next: string) => void;\n placeholder?: string;\n maxLength?: number;\n layout?: PropertyRowLayout;\n}\n\nexport function TextRow({ label, value, onChange, placeholder, maxLength, layout }: TextRowProps) {\n return (\n <PropertyRow label={label} layout={layout}>\n <input\n type=\"text\"\n value={value}\n placeholder={placeholder}\n maxLength={maxLength}\n onChange={(e) => onChange(e.target.value)}\n />\n </PropertyRow>\n );\n}\n\nexport interface NumberRowProps {\n label: ReactNode;\n value: number;\n onChange: (next: number) => void;\n min?: number;\n max?: number;\n step?: number;\n placeholder?: string;\n layout?: PropertyRowLayout;\n}\n\nexport function NumberRow({\n label,\n value,\n onChange,\n min,\n max,\n step,\n placeholder,\n layout,\n}: NumberRowProps) {\n return (\n <PropertyRow label={label} layout={layout}>\n <input\n type=\"number\"\n value={value}\n min={min}\n max={max}\n step={step}\n placeholder={placeholder}\n onChange={(e) => {\n const raw = e.target.value;\n if (raw === '') return;\n const n = Number(raw);\n if (Number.isFinite(n)) onChange(n);\n }}\n />\n </PropertyRow>\n );\n}\n\nexport interface SelectOption<T extends string> {\n value: T;\n label: ReactNode;\n}\n\nexport interface SelectRowProps<T extends string> {\n label: ReactNode;\n value: T;\n options: ReadonlyArray<SelectOption<T>>;\n onChange: (next: T) => void;\n layout?: PropertyRowLayout;\n}\n\nexport function SelectRow<T extends string>({\n label,\n value,\n options,\n onChange,\n layout,\n}: SelectRowProps<T>) {\n return (\n <PropertyRow label={label} layout={layout}>\n <select\n value={value}\n onChange={(e) => {\n const v = e.target.value as T;\n dlog('property-panel', 'select', { label, value: v });\n onChange(v);\n }}\n >\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {/* HTML <option> only renders text; ReactNode → string coerce */}\n {opt.label as string}\n </option>\n ))}\n </select>\n </PropertyRow>\n );\n}\n\nexport interface ToggleRowProps<T extends string> {\n label: ReactNode;\n value: T;\n options: ReadonlyArray<SelectOption<T>>;\n onChange: (next: T) => void;\n layout?: PropertyRowLayout;\n}\n\nexport function ToggleRow<T extends string>({\n label,\n value,\n options,\n onChange,\n layout,\n}: ToggleRowProps<T>) {\n return (\n <PropertyRow label={label} layout={layout}>\n <div className=\"lk-property-row__toggle\">\n {options.map((opt) => {\n const selected = opt.value === value;\n return (\n <button\n key={opt.value}\n type=\"button\"\n aria-pressed={selected}\n className={\n selected\n ? 'lk-property-row__toggle-button lk-property-row__toggle-button--selected'\n : 'lk-property-row__toggle-button'\n }\n onClick={() => onChange(opt.value)}\n >\n {opt.label}\n </button>\n );\n })}\n </div>\n </PropertyRow>\n );\n}\n"]}
|