@weasel-js/labkit 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_dts/{DrawCommand-CitWPxMY.d.ts → DrawCommand-BkZztJsW.d.ts} +59 -1
- package/dist/_dts/{index-C6Yze7sQ.d.ts → index-CFlDPeZh.d.ts} +30 -1
- package/dist/_dts/{types-Si4Fw-1F.d.ts → types-x92Kfeme.d.ts} +14 -0
- package/dist/_dts/{useExperimentState-CJn2hHzd.d.ts → useExperimentState-D7EQnnwJ.d.ts} +47 -0
- package/dist/canvas/index.d.ts +13 -2
- package/dist/canvas/index.js +2 -2
- package/dist/{chunk-54IQ2DX7.js → chunk-574LJAV4.js} +3 -3
- package/dist/chunk-574LJAV4.js.map +1 -0
- package/dist/{chunk-VLAHRJOC.js → chunk-5R2ATYPJ.js} +2 -2
- package/dist/{chunk-VLAHRJOC.js.map → chunk-5R2ATYPJ.js.map} +1 -1
- package/dist/{chunk-R4TACNW7.js → chunk-BAPZPDDA.js} +631 -591
- package/dist/chunk-BAPZPDDA.js.map +1 -0
- package/dist/{chunk-PWC7AQZM.js → chunk-CPUJ3QXL.js} +2 -2
- package/dist/chunk-CPUJ3QXL.js.map +1 -0
- package/dist/{chunk-2ZRE7WGQ.js → chunk-DEWXYFEU.js} +6 -6
- package/dist/chunk-DEWXYFEU.js.map +1 -0
- package/dist/{chunk-3P56ZCCJ.js → chunk-DWV7SFKR.js} +601 -269
- package/dist/chunk-DWV7SFKR.js.map +1 -0
- package/dist/{chunk-53XSBIUK.js → chunk-KSTEW2AF.js} +18 -2
- package/dist/chunk-KSTEW2AF.js.map +1 -0
- package/dist/{chunk-HXZHVU4G.js → chunk-PMAU3SEE.js} +3 -3
- package/dist/chunk-PMAU3SEE.js.map +1 -0
- package/dist/{chunk-7BKDG73Z.js → chunk-RL2LOLNI.js} +2 -2
- package/dist/chunk-RL2LOLNI.js.map +1 -0
- package/dist/{chunk-2QNYYL3V.js → chunk-SFL7NFKN.js} +2 -2
- package/dist/chunk-SFL7NFKN.js.map +1 -0
- package/dist/controls/index.d.ts +4 -2
- package/dist/controls/index.js +1 -1
- package/dist/dragdrop/index.d.ts +2 -2
- package/dist/index.d.ts +180 -15
- package/dist/index.js +146 -37
- package/dist/index.js.map +1 -1
- package/dist/layers/index.d.ts +6 -3
- package/dist/layers/index.js +1 -1
- package/dist/passthrough/weasel-canvas.d.ts +5 -1
- package/dist/passthrough/weasel-canvas.js +1 -1
- package/dist/passthrough/weasel-ui.d.ts +444 -7
- package/dist/passthrough/weasel-ui.js +2 -2
- package/dist/primitives/index.d.ts +13 -0
- package/dist/primitives/index.js +2 -2
- package/dist/state/index.d.ts +16 -3
- package/dist/state/index.js +2 -2
- package/dist/state/index.js.map +1 -1
- package/dist/styles.css +163 -6
- package/dist/ui/layers/index.d.ts +5 -0
- package/dist/ui/layers/index.js +3 -3
- package/dist/undo/index.d.ts +17 -2
- package/dist/undo/index.js +1 -1
- package/package.json +2 -1
- package/src/canvas/CanvasStack.tsx +4 -0
- package/src/canvas/CanvasStackContext.ts +3 -0
- package/src/canvas/canvasCoords.ts +2 -0
- package/src/canvas/useLayerScheduler.ts +2 -0
- package/src/controls/ControlPanel.tsx +2 -0
- package/src/controls/types.ts +14 -0
- package/src/instrument/capabilityDetector.ts +3 -0
- package/src/instrument/defineInstrument.ts +2 -0
- package/src/instrument/types.ts +29 -0
- package/src/instrument/validateConfigSchema.ts +5 -0
- package/src/lab/Lab.tsx +17 -2
- package/src/lab/LabContext.ts +6 -0
- package/src/lab/LabShell.tsx +4 -0
- package/src/lab/WorkspaceGrid.less +37 -5
- package/src/lab/WorkspaceGrid.stories.tsx +16 -0
- package/src/lab/WorkspaceGrid.test.tsx +84 -10
- package/src/lab/WorkspaceGrid.tsx +188 -12
- package/src/lab/index.ts +0 -2
- package/src/layers/LayerList.tsx +3 -0
- package/src/primitives/FpsMeter.tsx +1 -0
- package/src/primitives/ScaleIndicator.tsx +4 -0
- package/src/primitives/Sidebar.tsx +3 -0
- package/src/primitives/StatusBar.tsx +3 -0
- package/src/primitives/Toolbar.tsx +6 -0
- package/src/state/SingletonExperiment.tsx +1 -0
- package/src/state/adapters.ts +8 -0
- package/src/state/context.tsx +9 -0
- package/src/state/helpers.ts +13 -1
- package/src/state/store.test.ts +2 -1
- package/src/state/store.ts +25 -0
- package/src/state/types.ts +20 -0
- package/src/state/useExperimentState.ts +3 -0
- package/src/test-setup.ts +19 -0
- package/src/ui/layers/LayerStack.tsx +5 -0
- package/src/ui/properties/CurveField.tsx +4 -1
- package/src/ui/properties/EffectCard.tsx +12 -0
- package/src/ui/properties/PropertyGroup.tsx +1 -0
- package/src/ui/properties/PropertyPanel.tsx +28 -0
- package/src/undo/eventBus.ts +4 -0
- package/src/undo/undoStack.ts +11 -0
- package/src/workspace/DefaultSidebar.tsx +3 -0
- package/src/workspace/DefaultStatusBar.tsx +3 -0
- package/src/workspace/DefaultToolbar.tsx +3 -0
- package/src/workspace/Workspace.stories.tsx +1 -0
- package/src/workspace/Workspace.test.tsx +1 -0
- package/src/workspace/Workspace.tsx +3 -0
- package/src/workspace/WorkspaceChrome.tsx +4 -0
- package/src/workspace/index.ts +1 -0
- package/src/workspace/slotTypes.ts +9 -0
- package/src/workspace/workspaceOps.test.ts +34 -1
- package/src/workspace/workspaceOps.ts +24 -0
- package/dist/chunk-2QNYYL3V.js.map +0 -1
- package/dist/chunk-2ZRE7WGQ.js.map +0 -1
- package/dist/chunk-3P56ZCCJ.js.map +0 -1
- package/dist/chunk-53XSBIUK.js.map +0 -1
- package/dist/chunk-54IQ2DX7.js.map +0 -1
- package/dist/chunk-7BKDG73Z.js.map +0 -1
- package/dist/chunk-HXZHVU4G.js.map +0 -1
- package/dist/chunk-PWC7AQZM.js.map +0 -1
- package/dist/chunk-R4TACNW7.js.map +0 -1
- package/src/lab/gridDims.test.ts +0 -35
- package/src/lab/gridDims.ts +0 -11
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","../../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/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/useSystemMode.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":["jsx","useState","useRef","useEffect","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 { 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 { 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 { ThemeProvider, useThemeOptional } from '@weasel-js/theme/react';\nimport type { ReactNode } from '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 { ThemeProvider } from '@weasel-js/theme/react';\nimport { 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 { LabMode, StorageAdapter, WorkspaceRecord } from '../state/types';\nimport { interstellarTheme } from '../theme/interstellar';\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 { useResolvedMode } from './useSystemMode';\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/instrument/capabilityDetector.ts","../src/instrument/defineInstrument.ts","../src/instrument/validateConfigSchema.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/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/useSystemMode.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":["jsx","useState","useRef","useEffect","createContext","useContext","jsxs","useMemo","useStore","p","Fragment","store","useLayoutEffect","useCallback"],"mappings":"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","file":"index.js","sourcesContent":["import type { Instrument } from './types';\n\n/** Which optional capabilities an instrument declared — what the workspace\n * consults to decide which chrome to show. */\nexport interface CapabilityFlags {\n hasCanvas: boolean;\n hasLayers: boolean;\n hasDragDrop: boolean;\n hasUndo: boolean;\n}\n\n/** Read an instrument's declared capabilities off its definition. */\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\n/** Identity at runtime; exists so an instrument's state and config types are\n * inferred from the spec rather than having to be written out. */\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\n/** Whether a config schema is usable, and every problem found rather than\n * just the first. */\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\nconst KNOWN_TYPES: ConfigFieldType[] = ['slider', 'checkbox', 'select', 'number', 'text', 'color'];\n\n/** Check a config schema for the mistakes that would otherwise surface as a\n * silently broken control: empty or duplicate keys, unknown field types, and\n * fields whose own constraints do not hold. */\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","// GENERATED by packages/theme/scripts/build-tokens.ts — do not edit.\n\nimport type { RawToken } from '../dtcg/types';\n\n/** Every design token the built-in themes declare, spelled as the CSS\n * custom property it becomes. */\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\n/** A built-in theme with its aliases already collapsed: every mode maps\n * every token name to a final CSS value. */\nexport interface GeneratedTheme {\n readonly name: string;\n readonly defaultMode: string;\n readonly modes: Readonly<Record<string, Readonly<Record<TokenName, string>>>>;\n}\n\n/** The built-in themes, resolved, keyed by theme name. Read this to list\n * or preview themes without resolving a token graph yourself. */\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\n/** The same built-in themes as `THEMES`, unresolved. This is what\n * `defineTheme` layers onto. */\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\n/** What `defineTheme` accepts: a name, the base theme to layer onto, and the\n * token overrides, split into mode-invariant and per-mode. */\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\n/**\n * A theme: a named set of design tokens, organized into a mode-invariant layer\n * plus one layer per mode (light, dark, …), optionally extending another theme.\n * Tokens are held unresolved — aliases between them are collapsed later by\n * `resolveTheme`, so an override of a base primitive still reaches everything\n * that references it.\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\n/** Build a theme from authoring shorthand. Unless `extends` says otherwise the\n * result layers onto `weaselTheme`, so a theme only needs to name what it\n * changes. */\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\n/** The output of `resolveTheme`: every token of a theme, for one mode, keyed\n * by CSS custom-property name and flattened to a final CSS value. */\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\n/** What `<ThemeProvider>` publishes: the theme, the mode in force, and the\n * fully resolved token record for that pair. */\nexport interface ThemeContextValue {\n readonly theme: Theme;\n readonly mode: string;\n readonly resolved: ResolvedTheme;\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\n/** Props for `<ThemeProvider>`. */\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\n/** The theme in force. Throws outside a `<ThemeProvider>`; use\n * `useThemeOptional` where the provider is not guaranteed. */\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\n/**\n * A single design token as authored, before aliases are resolved: a DTCG-shaped\n * `{ type, value }` pair where `value` may still be a `{ref}` to another token.\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\n/** A token graph flattened to one level, keyed by token name (no `--wzl-`\n * prefix). Still unresolved — see `ResolvedTokenMap` for the output side. */\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 { 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\n/** Lab-wide state and commands: the available instruments, the open\n * workspaces and the operations over them, saved snapshots, and the color\n * mode. */\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 reorderWorkspaces: (ids: readonly 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\n/** Context carrying the surrounding lab. Prefer `useLabContext`. */\nexport const LabContext = createContext<LabContextValue | null>(null);\n\n/** The surrounding lab. Throws outside a `<Lab>`. */\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\n/** Props for `<DefaultSidebar>`. */\nexport interface DefaultSidebarProps {\n ctx: WorkspaceSidebarContext;\n}\n\n/** The sidebar a workspace renders when no `sidebar` slot is supplied: a\n * control panel over the instrument's config schema. */\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\n/** Props for `<DefaultStatusBar>`. */\nexport interface DefaultStatusBarProps {\n ctx: WorkspaceStatusBarContext;\n}\n\n/** The status bar a workspace renders when no `statusBar` slot is supplied:\n * the instrument's name and the current zoom. */\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\n/** Props for `<DefaultToolbar>`. */\nexport interface DefaultToolbarProps {\n ctx: WorkspaceToolbarContext;\n}\n\n/** The toolbar a workspace renders when no `toolbar` slot is supplied. Only\n * shows the controls the instrument's declared capabilities support. */\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\n/** Props for `<WorkspaceChrome>`. */\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\n/** The frame around a running instrument — toolbar, sidebar, status bar —\n * each replaceable by a slot. Assembles the slot contexts and wires the undo\n * keyboard shortcuts. */\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\n/** Props for `<Workspace>`. */\nexport interface WorkspaceProps {\n id: string;\n}\n\n/** Renders one workspace from the lab store: looks up its record and\n * instrument, and mounts the instrument inside the workspace chrome. */\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\n/** Append a new workspace running `instrumentName`, at that instrument's\n * default config and initial state. */\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\n/** Insert a deep copy of a workspace directly after it. The copy starts with\n * an empty undo history — the original's is not shared. */\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\n/** Remove a workspace, unless it is the last one — a lab always has at least\n * one. */\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\n/** Return a workspace to its instrument's defaults, keeping its id and its\n * place in the list. */\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\n/**\n * Reorder to match `ids`. Ids the list doesn't mention keep their relative\n * order at the end, and ids it names that no longer exist are dropped — a\n * reorder that raced a close should not resurrect the closed workspace.\n */\nexport function reorderWorkspaces(\n workspaces: WorkspaceRecord[],\n ids: readonly string[],\n): WorkspaceRecord[] {\n const byId = new Map(workspaces.map((w) => [w.id, w]));\n const named = ids.map((id) => byId.get(id)).filter((w): w is WorkspaceRecord => w !== undefined);\n const seen = new Set(named.map((w) => w.id));\n const rest = workspaces.filter((w) => !seen.has(w.id));\n return [...named, ...rest];\n}\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 { ThemeProvider, useThemeOptional } from '@weasel-js/theme/react';\nimport type { ReactNode } from 'react';\nimport type { LabMode } from '../state/types';\nimport { interstellarTheme } from '../theme/interstellar';\nimport { useResolvedMode } from './useSystemMode';\n\n/** Props for `<LabShell>`. */\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\n/** Page frame for a lab: a titled header, a body, and an optional footer,\n * themed for the resolved color mode. Presentational only — use `<Lab>` when\n * the workspace runtime is wanted too. */\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 {\n Children,\n type ReactNode,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from 'react';\nimport { asNodeId, createNode, gridStrategy, type NodeId, Store } from 'windease';\nimport {\n type ChromeMap,\n Container,\n DragHandle,\n DragProvider,\n Provider,\n StrategyRegistryProvider,\n} from 'windease/react';\n\nconst ZONE_ID = asNodeId('lk-workspaces');\nconst STRATEGIES = { grid: gridStrategy as never };\nconst KIND = 'workspace';\n\n/** A tile's persisted extent, keyed by the id its caller gave it. Grid resizes\n * write `span`; `size` is here because a strategy swap would write that. */\nexport type WorkspaceLayout = Record<\n string,\n { size?: { w?: number; h?: number }; span?: { cols?: number; rows?: number } }\n>;\n\nexport interface WorkspaceGridProps {\n children: ReactNode;\n /**\n * Stable id per child, positionally matched. Supply these whenever a tile\n * can be closed from the middle: without them a tile is identified by its\n * position, so closing one shifts every id after it and the panes inherit\n * each other's dragged extents. `layout` and `reorderable` both key off\n * these, so neither means much without them.\n */\n ids?: readonly string[];\n /** Draggable seams between tiles. Off by default — an even tiling is the\n * behavior every existing caller has. */\n resizable?: boolean;\n /** Let a tile be dragged to a new position. Off by default. The grid never\n * reorders `children` itself: it reports the order a drop would produce and\n * the caller commits it. */\n reorderable?: boolean;\n /** The full id list a drop would produce, in its new order. */\n onReorder?: (ids: string[]) => void;\n /** Extents from a previous session, applied to tiles as they register. */\n layout?: WorkspaceLayout;\n /** Fires when a tile's extent changes. Persist it and hand it back as\n * `layout` to make a resize survive a reload. */\n onLayoutChange?: (layout: WorkspaceLayout) => void;\n gap?: number;\n padding?: number;\n /**\n * Fixed tiling extent. Omit in an app — the grid measures its own box. Supply\n * it where nothing measures, notably jsdom: at a zero measurement the grid\n * renders no tiles at all.\n */\n viewport?: { w: number; h: number };\n}\n\nfunction extentOf(store: Store, id: NodeId): WorkspaceLayout[string] | null {\n const p = store.getNode(id)?.membership?.placement as WorkspaceLayout[string] | undefined;\n if (!p) return null;\n const out: WorkspaceLayout[string] = {};\n if (p.size) out.size = p.size;\n if (p.span) out.span = p.span;\n return Object.keys(out).length > 0 ? out : null;\n}\n\n/**\n * Auto-balanced tiling of workspaces, `ceil(sqrt(n))` columns wide.\n *\n * Tiles are absolutely positioned at the rects `gridStrategy` computes, not\n * laid out by CSS — `windease/styles.css` (folded into\n * `@weasel-js/labkit/styles.css`) carries the rules that positioning depends on.\n */\nexport function WorkspaceGrid({\n children,\n ids,\n resizable = false,\n reorderable = false,\n onReorder,\n layout,\n onLayoutChange,\n gap = 12,\n padding = 0,\n viewport,\n}: WorkspaceGridProps) {\n const items = Children.toArray(children);\n const idKey = ids ? ids.join(',') : `#${items.length}`;\n // biome-ignore lint/correctness/useExhaustiveDependencies: idKey is the stable projection of items/ids; depending on those directly rebuilds every render and re-runs the sync effect forever\n const nodeIds = useMemo(() => items.map((_, i) => asNodeId(ids?.[i] ?? `lk-ws-${i}`)), [idKey]);\n\n // Held in refs rather than depended on: a fresh object each render would\n // re-run the sync effect, and only a newly registered tile reads `layout`.\n const layoutRef = useRef(layout);\n layoutRef.current = layout;\n const onLayoutChangeRef = useRef(onLayoutChange);\n onLayoutChangeRef.current = onLayoutChange;\n\n // One store for the component's lifetime: a tile's dragged extent lives in\n // its node, so rebuilding the store on every add or close would silently\n // reset every pane.\n const storeRef = useRef<Store | null>(null);\n if (storeRef.current === null) {\n const store = new Store();\n store.registerNode(\n createNode({\n kind: 'zone',\n id: ZONE_ID,\n container: { strategyId: 'grid', config: { resizable, gap, padding } },\n }),\n );\n storeRef.current = store;\n }\n const store = storeRef.current;\n\n useLayoutEffect(() => {\n store.updateContainerConfig(ZONE_ID, { resizable, gap, padding });\n }, [store, resizable, gap, padding]);\n\n useLayoutEffect(() => {\n const present = new Set(store.getContainerView(ZONE_ID)?.childOrder ?? []);\n const wanted = new Set(nodeIds);\n for (const id of present) {\n if (!wanted.has(id)) store.unregisterNode(id);\n }\n for (const id of nodeIds) {\n if (present.has(id)) continue;\n store.registerNode(createNode({ kind: KIND, id, parentId: ZONE_ID, focus: true }));\n store.showNode(id);\n const saved = layoutRef.current?.[id];\n if (saved) store.patchPlacement(id, saved);\n }\n store.setChildOrder(ZONE_ID, [...nodeIds]);\n }, [store, nodeIds]);\n\n useEffect(() => {\n if (!onLayoutChange) return;\n return store.events.on('node.placementChanged', () => {\n const next: WorkspaceLayout = {};\n for (const child of store.getChildren(ZONE_ID)) {\n const extent = extentOf(store, child.id);\n if (extent) next[child.id] = extent;\n }\n onLayoutChangeRef.current?.(next);\n });\n }, [store, onLayoutChange]);\n\n const commitOrder = useCallback(\n (nextIds: NodeId[]) => onReorder?.(nextIds.map(String)),\n [onReorder],\n );\n\n const chrome = useMemo<ChromeMap>(() => {\n const byId = new Map<string, ReactNode>(nodeIds.map((id, i) => [id, items[i]]));\n return {\n [KIND]: ({ node }) => {\n const content = byId.get(node.id) ?? null;\n if (!reorderable) return content;\n // A tile is full of controls, so the whole thing can't be the handle.\n return (\n <div className=\"lk-workspace-tile\">\n <DragHandle nodeId={node.id} className=\"lk-workspace-tile__grip\">\n <span className=\"lk-workspace-tile__grip-dots\" aria-hidden=\"true\" />\n </DragHandle>\n <div className=\"lk-workspace-tile__body\">{content}</div>\n </div>\n );\n },\n };\n }, [nodeIds, items, reorderable]);\n\n const grid = (\n <Container\n parentId={ZONE_ID}\n chrome={chrome}\n className=\"lk-workspace-grid windease-zone\"\n affordances={resizable}\n viewport={viewport}\n onChildOrderChange={reorderable ? commitOrder : undefined}\n />\n );\n\n return (\n <Provider store={store}>\n <StrategyRegistryProvider strategies={STRATEGIES}>\n {reorderable ? <DragProvider>{grid}</DragProvider> : grid}\n </StrategyRegistryProvider>\n </Provider>\n );\n}\n","import { ThemeProvider } from '@weasel-js/theme/react';\nimport { 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 { LabMode, StorageAdapter, WorkspaceRecord } from '../state/types';\nimport { interstellarTheme } from '../theme/interstellar';\nimport { Workspace } from '../workspace/Workspace';\nimport {\n addWorkspace as addWorkspaceOp,\n cloneWorkspace as cloneWorkspaceOp,\n closeWorkspace as closeWorkspaceOp,\n reorderWorkspaces as reorderWorkspacesOp,\n resetWorkspace as resetWorkspaceOp,\n} from '../workspace/workspaceOps';\nimport { LabContext, type LabContextValue } from './LabContext';\nimport { LabShell } from './LabShell';\nimport { useResolvedMode } from './useSystemMode';\nimport { WorkspaceGrid, type WorkspaceLayout } from './WorkspaceGrid';\n\n/** Props for `<Lab>`. */\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\n/** The lab runtime: creates the store, provides it, and renders one workspace\n * per record in a grid. Each workspace runs one of `instruments`. */\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 layout = useStore(store, (s) => s.layout);\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 reorderWorkspaces: (ids) => {\n replaceWorkspaces(reorderWorkspacesOp(store.getState().workspaces, ids));\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 ids={workspaces.map((w) => w.id)}\n resizable\n reorderable\n onReorder={(ids) => contextValue.reorderWorkspaces(ids)}\n layout={layout as WorkspaceLayout}\n onLayoutChange={(next) => store.getState().setLayout(next)}\n >\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\n/** An annotation drawn over a curve plot: a shaded band across a range of x,\n * or a vertical line at one x. */\nexport type CurveMark =\n | { kind: 'band'; x: [number, number]; color?: string }\n | { kind: 'line'; x: number; color?: string };\n\n/** Props for `<CurveField>`. */\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 onInput={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\n/** Props for `<Subpanel>`. */\nexport interface SubpanelProps {\n title: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\n/** A typographic divider inside a property list: a small title flanked by a\n * rule. Purely a heading — use `<PropertyGroup>` for a bordered section. */\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\n/** Props for `<EffectCard>`. */\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\n/** An accented, collapsible card for one item in a list of like things —\n * effects, layers, tails. The accent color rebinds the theme accent token\n * within the card, so its controls pick it up too. */\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\n/** The minimum an item must carry to appear in an `<EffectCardList>`. */\nexport interface EffectCardListItem {\n id: string | number;\n}\n\n/** Props for `<EffectCardList>`. */\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\n/** A drag-reorderable list of `<EffectCard>`s. Owns the expanded and dragging\n * state and hands it back to `renderItem`, so the caller only supplies each\n * card's contents. */\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\n/** Props for `<PropertyGroup>`. */\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\n/** Props for `<PropertyPanel>`. */\nexport interface PropertyPanelProps {\n title?: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\n/** A titled panel holding property rows — the sidebar container the rest of\n * this module's components fill. */\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\n/** How a property list packs its rows into two columns. */\nexport type PropertyListPack = 'auto-color' | 'pairs';\n\n/** Props for `<PropertyList>`. */\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\n/** Which control shape a row holds, which decides its intrinsic layout. */\nexport type PropertyRowVariant = 'default' | 'color' | 'checkbox';\n/** Whether a row's label sits above its control or beside it. */\nexport type PropertyRowLayout = 'block' | 'inline';\n\n/** Props for `<PropertyRow>`. */\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\n/** The label-plus-control frame every typed row below is built from. Use it\n * directly for a control this module does not cover. */\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\n/** Props for `<SliderRow>`. */\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\n/** A bounded number edited by dragging, with a live readout whose precision\n * follows `step`. */\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\n/** Props for `<ColorRow>`. */\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\n/** A color swatch, optionally with an alpha slider beneath it. */\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\n/** Props for `<CheckboxRow>`. */\nexport interface CheckboxRowProps {\n label: ReactNode;\n value: boolean;\n onChange: (next: boolean) => void;\n}\n\n/** A boolean checkbox. */\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\n/** Props for `<TextRow>`. */\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\n/** A single-line text input. */\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\n/** Props for `<NumberRow>`. */\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\n/** A number typed directly. Reach for `<SliderRow>` when the range matters\n * more than the exact value. */\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\n/** Props for `<SelectRow>`. */\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\n/** A dropdown over a fixed set of choices. Prefer `<ToggleRow>` when there\n * are only two or three and they should all stay visible. */\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\n/** Props for `<ToggleRow>`. */\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\n/** A segmented control: the same choice as a select, with every option\n * visible at once. */\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"]}
|