@weasel-js/labkit 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/README.md +27 -0
  2. package/dist/_dts/{DrawCommand-BkZztJsW.d.ts → DrawCommand-C_XboUpz.d.ts} +48 -6
  3. package/dist/_dts/{index-iAP6XbH3.d.ts → index-JFAYj5Tv.d.ts} +12 -0
  4. package/dist/_dts/types-DJ79Tg5J.d.ts +56 -0
  5. package/dist/_dts/{useTrialState-DYe2vUwN.d.ts → useTrialState-BMNIx3Cy.d.ts} +5 -9
  6. package/dist/canvas/index.d.ts +2 -1
  7. package/dist/{chunk-C6GJKPUI.js → chunk-73KA7WBO.js} +69 -63
  8. package/dist/chunk-73KA7WBO.js.map +1 -0
  9. package/dist/{chunk-DJLDIRFN.js → chunk-BOHF3PQO.js} +4375 -3720
  10. package/dist/chunk-BOHF3PQO.js.map +1 -0
  11. package/dist/{chunk-NRKWVTVT.js → chunk-G5TJVQQT.js} +3 -3
  12. package/dist/{chunk-NRKWVTVT.js.map → chunk-G5TJVQQT.js.map} +1 -1
  13. package/dist/chunk-LN6JDUGB.js +106 -0
  14. package/dist/chunk-LN6JDUGB.js.map +1 -0
  15. package/dist/chunk-THBG7FQZ.js +167 -0
  16. package/dist/chunk-THBG7FQZ.js.map +1 -0
  17. package/dist/{chunk-3TYUJR7Z.js → chunk-VUU5UXHE.js} +6 -3
  18. package/dist/chunk-VUU5UXHE.js.map +1 -0
  19. package/dist/dragdrop/index.d.ts +2 -1
  20. package/dist/index.d.ts +71 -11
  21. package/dist/index.js +165 -22
  22. package/dist/index.js.map +1 -1
  23. package/dist/job/index.d.ts +13 -0
  24. package/dist/job/index.js +3 -0
  25. package/dist/job/index.js.map +1 -0
  26. package/dist/layers/index.d.ts +3 -2
  27. package/dist/passthrough/weasel-canvas.d.ts +1 -1
  28. package/dist/passthrough/weasel-canvas.js +1 -1
  29. package/dist/passthrough/weasel-ui.d.ts +20 -4
  30. package/dist/passthrough/weasel-ui.js +2 -2
  31. package/dist/state/index.d.ts +2 -2
  32. package/dist/state/index.js +2 -2
  33. package/dist/styles.css +10 -0
  34. package/dist/surface/index.d.ts +77 -0
  35. package/dist/surface/index.js +3 -0
  36. package/dist/surface/index.js.map +1 -0
  37. package/dist/ui/layers/index.js +3 -3
  38. package/dist/undo/index.d.ts +2 -1
  39. package/package.json +9 -1
  40. package/src/canvas/AGENTS.md +8 -0
  41. package/src/canvas/useOrbit.test.ts +71 -0
  42. package/src/canvas/useOrbit.ts +149 -0
  43. package/src/index.test.ts +18 -0
  44. package/src/index.ts +13 -0
  45. package/src/instrument/SineWave.smoke.test.tsx +2 -1
  46. package/src/instrument/types.ts +13 -1
  47. package/src/job/index.ts +3 -0
  48. package/src/job/types.ts +47 -0
  49. package/src/job/useJob.test.tsx +210 -0
  50. package/src/job/useJob.ts +134 -0
  51. package/src/lab/Lab.stories.tsx +1 -2
  52. package/src/lab/Workspace.surface.test.tsx +49 -0
  53. package/src/lab/Workspace.tsx +14 -1
  54. package/src/state/store.ts +8 -2
  55. package/src/state/types.ts +4 -2
  56. package/src/state/view.test.ts +127 -0
  57. package/src/state/view.ts +18 -0
  58. package/src/surface/AGENTS.md +64 -0
  59. package/src/surface/SurfaceContext.ts +5 -0
  60. package/src/surface/composeRects.test.ts +50 -0
  61. package/src/surface/composeRects.ts +19 -0
  62. package/src/surface/deviceRect.test.ts +40 -0
  63. package/src/surface/deviceRect.ts +19 -0
  64. package/src/surface/index.ts +7 -0
  65. package/src/surface/rect.ts +16 -0
  66. package/src/surface/useSurfaceTile.test.tsx +67 -0
  67. package/src/surface/useSurfaceTile.ts +32 -0
  68. package/src/surface/useTiledSurface.test.tsx +231 -0
  69. package/src/surface/useTiledSurface.ts +157 -0
  70. package/src/trial/DefaultStatusBar.tsx +2 -2
  71. package/src/trial/Trial.job.test.tsx +75 -0
  72. package/src/trial/Trial.less +12 -0
  73. package/src/trial/Trial.stories.tsx +8 -1
  74. package/src/trial/Trial.tsx +32 -6
  75. package/src/trial/TrialChrome.tsx +33 -6
  76. package/src/trial/slotTypes.ts +2 -1
  77. package/dist/chunk-3TYUJR7Z.js.map +0 -1
  78. package/dist/chunk-C6GJKPUI.js.map +0 -1
  79. package/dist/chunk-DJLDIRFN.js.map +0 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
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/trial/DefaultSidebar.tsx","../src/ui/format.ts","../src/trial/DefaultStatusBar.tsx","../src/trial/DefaultToolbar.tsx","../src/trial/TrialChrome.tsx","../src/trial/Trial.tsx","../src/trial/trialOps.ts","../src/lab/useSystemMode.ts","../src/lab/LabShell.tsx","../src/lab/Workspace.tsx","../src/lab/Lab.tsx","../src/ui/properties/CurveField.tsx","../src/ui/properties/EffectCard.tsx","../src/ui/properties/PropertyGroup.tsx","../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 trial\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';\n/** `theme.name::mode` → the rule text currently published for it. Keyed by\n * name because that is what the rule's selector matches on, and holding the\n * text is what lets a redefinition under the same name replace its rule\n * rather than be swallowed as a cache hit. */\nconst emitted = new Map<string, 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\n/** Republish every rule from `emitted`. Rewriting the whole sheet rather than\n * appending keeps it the size of the theme set: a theme redefined under a\n * name it already used replaces its rule instead of stacking another one. */\nfunction flushRules(): void {\n const css = [...emitted.values()].join('\\n');\n if (canAdopt()) {\n if (!sheet) {\n sheet = new CSSStyleSheet();\n document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet];\n }\n sheet.replaceSync(css);\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 * 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 const resolved = resolveTheme(theme, mode);\n const body = Object.entries(resolved)\n .map(([name, value]) => `${name}: ${value};`)\n .join(' ');\n const rule = `[data-wzl-theme='${theme.name}'][data-wzl-mode='${mode}'] { ${body} }`;\n if (emitted.get(key) !== rule) {\n emitted.set(key, rule);\n flushRules();\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 { InstrumentList } from '../instrument/types';\nimport type { LabMode, SavedSnapshot, TrialRecord } from '../state/types';\n\n/** Lab-wide state and commands: the available instruments, the open\n * trials and the operations over them, saved snapshots, and the color\n * mode. */\nexport interface LabContextValue {\n instruments: InstrumentList;\n trials: TrialRecord[];\n addTrial: (instrumentName: string) => void;\n cloneTrial: (id: string) => void;\n closeTrial: (id: string) => void;\n resetTrial: (id: string) => void;\n reorderTrials: (ids: readonly string[]) => void;\n savedSnapshots: SavedSnapshot[];\n saveSnapshot: (trialId: string, name?: string) => void;\n loadSnapshot: (trialId: 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 { TrialSidebarContext } from './slotTypes';\n\n/** Props for `<DefaultSidebar>`. */\nexport interface DefaultSidebarProps {\n ctx: TrialSidebarContext;\n}\n\n/** The sidebar a trial 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","// 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\n/** Zoom for display. Below 2x a percentage reads naturally; past it the\n * numbers get long and a multiplier is what people say out loud, so 250%\n * shows as `2.5x`. Past 100x a tenth is noise, so the decimal is dropped\n * and thousands are grouped: `1009.74` reads as `1,010x`. */\nexport function formatZoom(zoom: number): string {\n if (!Number.isFinite(zoom)) return String(zoom);\n if (zoom <= 2) return `${formatNumber(Math.round(zoom * 100))}%`;\n if (zoom >= 100) return `${Math.round(zoom).toLocaleString('en-US')}x`;\n return `${formatNumber(Math.round(zoom * 10) / 10)}x`;\n}\n","import { StatusBar } from '../primitives/StatusBar';\nimport { formatZoom } from '../ui/format';\nimport type { TrialStatusBarContext } from './slotTypes';\n\n/** Props for `<DefaultStatusBar>`. */\nexport interface DefaultStatusBarProps {\n ctx: TrialStatusBarContext;\n}\n\n/** The status bar a trial 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>{formatZoom(ctx.zoom)}</StatusBar.Section>\n </StatusBar>\n );\n}\n","import { Toolbar } from '../primitives/Toolbar';\nimport { formatZoom } from '../ui/format';\nimport type { TrialToolbarContext } from './slotTypes';\n\n/** Props for `<DefaultToolbar>`. */\nexport interface DefaultToolbarProps {\n ctx: TrialToolbarContext;\n}\n\n/** The toolbar a trial 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\">{formatZoom(ctx.zoom)}</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 trial\">\n Clone\n </Toolbar.Button>\n <Toolbar.Button onClick={ctx.reset} title=\"Reset trial\">\n Reset\n </Toolbar.Button>\n <Toolbar.Button\n onClick={ctx.close}\n disabled={ctx.isLastTrial}\n title={ctx.isLastTrial ? 'Cannot close the last trial' : 'Close trial'}\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 { TrialRecord } from '../state/types';\nimport { DefaultSidebar } from './DefaultSidebar';\nimport { DefaultStatusBar } from './DefaultStatusBar';\nimport { DefaultToolbar } from './DefaultToolbar';\nimport type {\n SidebarSlot,\n StatusBarSlot,\n ToolbarSlot,\n TrialSidebarContext,\n TrialStatusBarContext,\n TrialToolbarContext,\n} from './slotTypes';\n\nexport interface UndoBindings {\n canUndo: boolean;\n canRedo: boolean;\n undo: () => void;\n redo: () => void;\n}\n\n/** Props for `<TrialChrome>`. */\nexport interface TrialChromeProps {\n trialId: string;\n record: TrialRecord;\n instrument: Instrument;\n isLastTrial: 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 TrialChrome({\n trialId,\n record,\n instrument,\n isLastTrial,\n toolbar,\n sidebar,\n statusBar,\n undoBindings,\n sidebarExtras,\n children,\n}: TrialChromeProps) {\n const lab = useLabContext();\n const storeCtx = useContext(LabStoreContext);\n if (!storeCtx) throw new Error('[labkit] TrialChrome requires <LabStoreProvider>');\n const updateTrialView = useStore(storeCtx.store, (s) => s.updateTrialView);\n const updateTrialConfig = useStore(storeCtx.store, (s) => s.updateTrialConfig);\n const updateTrialState = useStore(storeCtx.store, (s) => s.updateTrialState);\n\n const toolbarCtx = useMemo<TrialToolbarContext>(() => {\n const setZoom = (z: number): void => {\n updateTrialView(trialId, { ...record.view, zoom: z });\n };\n return {\n trialId,\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.trialId === trialId),\n saveSnapshot: (name) => lab.saveSnapshot(trialId, name),\n loadSnapshot: (snapshotId) => lab.loadSnapshot(trialId, snapshotId),\n clone: () => lab.cloneTrial(trialId),\n reset: () => lab.resetTrial(trialId),\n close: () => lab.closeTrial(trialId),\n isLastTrial,\n };\n }, [trialId, record, instrument, lab, isLastTrial, updateTrialView, undoBindings]);\n\n const sidebarCtx = useMemo<TrialSidebarContext>(\n () => ({\n trialId,\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 updateTrialConfig(trialId, 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 updateTrialState(trialId, nextState as never);\n }\n },\n }),\n [trialId, record, instrument, updateTrialConfig, updateTrialState],\n );\n\n const statusCtx: TrialStatusBarContext = {\n trialId,\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-trial\"\n aria-label={`Trial ${record.instrumentName}`}\n onKeyDown={handleKeyDown}\n >\n <div className=\"lk-trial__toolbar\">\n {toolbar ? toolbar(toolbarCtx) : <DefaultToolbar ctx={toolbarCtx} />}\n </div>\n <div className=\"lk-trial__body\">\n <div className=\"lk-trial__sidebar\">\n {sidebar ? sidebar(sidebarCtx) : <DefaultSidebar ctx={sidebarCtx} />}\n {sidebarExtras}\n </div>\n <div className=\"lk-trial__content\">{children}</div>\n </div>\n <div className=\"lk-trial__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 { TrialRecord } 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 './TrialChrome';\nimport { TrialChrome } from './TrialChrome';\n\n/** Props for `<Trial>`. */\nexport interface TrialProps {\n id: string;\n}\n\n/** Renders one trial from the lab store: looks up its record and\n * instrument, and mounts the instrument inside the trial chrome. */\nexport function Trial({ id }: TrialProps) {\n const lab = useLabContext();\n const storeCtx = useContext(LabStoreContext);\n if (!storeCtx) throw new Error('[labkit] <Trial> requires <LabStoreProvider>');\n const record = useStore(storeCtx.store, (s) => s.trials.find((w) => w.id === id));\n if (!record) {\n return <div className=\"lk-trial lk-trial--unknown\">Trial 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-trial lk-trial--unknown\">Unknown instrument: {record.instrumentName}</div>\n );\n }\n return (\n <TrialRuntime\n record={record}\n instrument={instrument}\n store={storeCtx.store}\n isLast={lab.trials.length <= 1}\n />\n );\n}\n\ninterface TrialRuntimeProps {\n record: TrialRecord;\n instrument: Instrument;\n store: LabStore;\n isLast: boolean;\n}\n\nfunction TrialRuntime({ record, instrument, store, isLast }: TrialRuntimeProps) {\n const canvasContainerRef = useRef<HTMLDivElement | null>(null);\n const updateTrialState = useStore(store, (s) => s.updateTrialState);\n const updateTrialConfig = useStore(store, (s) => s.updateTrialConfig);\n const updateTrialView = useStore(store, (s) => s.updateTrialView);\n const updateTrialUndoStack = useStore(store, (s) => s.updateTrialUndoStack);\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().trials.find((w) => w.id === record.id);\n if (!current) return;\n const snap = structuredClone(current.state);\n updateTrialUndoStack(record.id, (prev) => pushSnapshot(prev, snap, maxDepth));\n };\n\n const setView = (v: ViewTransform): void => updateTrialView(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 updateTrialState(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 updateTrialConfig(record.id, key as never, value as never);\n bus.emit('config.change');\n bus.emit(evt);\n },\n trial: {\n id: record.id,\n zoom: record.view.zoom,\n setZoom: (z) => updateTrialView(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 updateTrialState(record.id, result.snapshot as never);\n updateTrialUndoStack(record.id, result.stack);\n },\n redo: () => {\n const result = undoRedo(record.undoStack, structuredClone(record.state));\n if (!result) return;\n updateTrialState(record.id, result.snapshot as never);\n updateTrialUndoStack(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 // Camera applied here, so a layer draws in world coordinates. `zoom`\n // stays in the args for line widths, which must not scale with it.\n ctx.translate(view.pan.x, view.pan.y);\n ctx.scale(view.zoom, view.zoom);\n layer.draw(ctx, { state: record.state, config: record.config, zoom: view.zoom });\n },\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 updateTrialState(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-trial__canvas-host\"\n style={{ width: '100%', height: '100%', position: 'relative' }}\n >\n <CanvasStack layers={layersWithFeedback} view={record.view} onViewChange={setView}>\n {instrument.render(renderCtx)}\n </CanvasStack>\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 <TrialChrome\n trialId={record.id}\n record={record}\n instrument={instrument}\n isLastTrial={isLast}\n undoBindings={undoBindings}\n sidebarExtras={\n <>\n {paletteNode}\n {layerListNode}\n </>\n }\n >\n {body}\n </TrialChrome>\n );\n}\n","import type { Instrument, InstrumentList } from '../instrument/types';\nimport type { TrialRecord } from '../state/types';\n\nconst DEFAULT_VIEW = { zoom: 1, pan: { x: 0, y: 0 } } as const;\n\nfunction findInstrument(instruments: InstrumentList, 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): TrialRecord['view'] {\n return instrument.canvas?.initialView\n ? structuredClone(instrument.canvas.initialView)\n : { ...DEFAULT_VIEW, pan: { ...DEFAULT_VIEW.pan } };\n}\n\n/** Append a new trial running `instrumentName`, at that instrument's\n * default config and initial state. */\nexport function addTrial(\n trials: TrialRecord[],\n instruments: InstrumentList,\n instrumentName: string,\n): TrialRecord[] {\n const instrument = findInstrument(instruments, instrumentName);\n const config = instrument.defaultConfig();\n const state = instrument.initialState(config);\n const record: TrialRecord = {\n id: crypto.randomUUID(),\n instrumentName,\n config,\n state,\n view: initialView(instrument),\n undoStack: { past: [], future: [] },\n };\n return [...trials, record];\n}\n\n/** Insert a deep copy of a trial directly after it. The copy starts with\n * an empty undo history — the original's is not shared. */\nexport function cloneTrial(trials: TrialRecord[], id: string): TrialRecord[] {\n const sourceIdx = trials.findIndex((w) => w.id === id);\n const source = trials[sourceIdx];\n if (!source) return trials;\n const clone: TrialRecord = {\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 [...trials.slice(0, sourceIdx + 1), clone, ...trials.slice(sourceIdx + 1)];\n}\n\n/** Remove a trial, unless it is the last one — a lab always has at least\n * one. */\nexport function closeTrial(trials: TrialRecord[], id: string): TrialRecord[] {\n if (trials.length <= 1) return trials;\n const next = trials.filter((w) => w.id !== id);\n return next.length === trials.length ? trials : next;\n}\n\n/** Return a trial to its instrument's defaults, keeping its id and its\n * place in the list. */\nexport function resetTrial(\n trials: TrialRecord[],\n id: string,\n instruments: InstrumentList,\n): TrialRecord[] {\n const idx = trials.findIndex((w) => w.id === id);\n const current = trials[idx];\n if (!current) return trials;\n const instrument = findInstrument(instruments, current.instrumentName);\n const config = instrument.defaultConfig();\n const state = instrument.initialState(config);\n const reset: TrialRecord = {\n ...current,\n config,\n state,\n view: initialView(instrument),\n };\n return [...trials.slice(0, idx), reset, ...trials.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 trial.\n */\nexport function reorderTrials(trials: TrialRecord[], ids: readonly string[]): TrialRecord[] {\n const byId = new Map(trials.map((w) => [w.id, w]));\n const named = ids.map((id) => byId.get(id)).filter((w): w is TrialRecord => w !== undefined);\n const seen = new Set(named.map((w) => w.id));\n const rest = trials.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 trial 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-workspace');\nconst STRATEGIES = { grid: gridStrategy as never };\nconst KIND = 'trial';\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 TrialLayout = Record<\n string,\n { size?: { w?: number; h?: number }; span?: { cols?: number; rows?: number } }\n>;\n\nexport interface WorkspaceProps {\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?: TrialLayout;\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: TrialLayout) => 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): TrialLayout[string] | null {\n const p = store.getNode(id)?.membership?.placement as TrialLayout[string] | undefined;\n if (!p) return null;\n const out: TrialLayout[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 trials, `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 Workspace({\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}: WorkspaceProps) {\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: TrialLayout = {};\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-trial-tile\">\n <DragHandle nodeId={node.id} className=\"lk-trial-tile__grip\">\n <span className=\"lk-trial-tile__grip-dots\" aria-hidden=\"true\" />\n </DragHandle>\n <div className=\"lk-trial-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 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 { InstrumentList } from '../instrument/types';\nimport { noneAdapter } from '../state/adapters';\nimport { LabStoreContext } from '../state/context';\nimport { createLabStore, type LabStore } from '../state/store';\nimport type { LabMode, StorageAdapter, TrialRecord } from '../state/types';\nimport { interstellarTheme } from '../theme/interstellar';\nimport { Trial } from '../trial/Trial';\nimport {\n addTrial as addTrialOp,\n cloneTrial as cloneTrialOp,\n closeTrial as closeTrialOp,\n reorderTrials as reorderTrialsOp,\n resetTrial as resetTrialOp,\n} from '../trial/trialOps';\nimport { LabContext, type LabContextValue } from './LabContext';\nimport { LabShell } from './LabShell';\nimport { useResolvedMode } from './useSystemMode';\nimport { type TrialLayout, Workspace } from './Workspace';\n\n/** Props for `<Lab>`. */\nexport interface LabProps {\n instruments: InstrumentList;\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: InstrumentList,\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().trials.length === 0) {\n const seeded = addTrialOp([], instruments, defaultInstrument);\n const record = seeded[0];\n if (record) {\n const { undoStack: _undoStack, ...rest } = record;\n store.getState().addTrial(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 trial\n * per record in a grid. Each trial 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 trials = useStore(store, (s) => s.trials);\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 replaceTrials = (next: TrialRecord[]): void => {\n const currentById = new Map(store.getState().trials.map((w) => [w.id, w]));\n const merged = next.map((w) => currentById.get(w.id) ?? w);\n store.setState({ trials: merged });\n // Trigger persistence flush via a tracked action.\n store.getState().setMode(store.getState().mode);\n };\n\n return {\n instruments,\n trials,\n addTrial: (instrumentName) => {\n const next = addTrialOp(store.getState().trials, instruments, instrumentName);\n replaceTrials(next);\n },\n cloneTrial: (id) => {\n const next = cloneTrialOp(store.getState().trials, id);\n replaceTrials(next);\n },\n closeTrial: (id) => {\n const next = closeTrialOp(store.getState().trials, id);\n replaceTrials(next);\n },\n reorderTrials: (ids) => {\n replaceTrials(reorderTrialsOp(store.getState().trials, ids));\n },\n resetTrial: (id) => {\n const next = resetTrialOp(store.getState().trials, id, instruments);\n const record = next.find((w) => w.id === id);\n if (!record) return;\n store.setState((s) => ({\n trials: s.trials.map((w) =>\n w.id === id\n ? { ...w, config: record.config, state: record.state, view: record.view }\n : w,\n ),\n }));\n store.getState().updateTrialView(id, record.view);\n },\n savedSnapshots,\n saveSnapshot: (trialId, name) => {\n store.getState().saveSnapshot(trialId, name ?? `Save ${new Date().toLocaleString()}`);\n },\n loadSnapshot: (trialId, snapshotId) => {\n store.getState().loadSnapshot(snapshotId, trialId);\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, trials, 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 <Workspace\n ids={trials.map((w) => w.id)}\n resizable\n reorderable\n onReorder={(ids) => contextValue.reorderTrials(ids)}\n layout={layout as TrialLayout}\n onLayoutChange={(next) => store.getState().setLayout(next)}\n >\n {trials.map((w) => (\n <Trial key={w.id} id={w.id} />\n ))}\n </Workspace>\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","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"]}
1
+ {"version":3,"sources":["../src/canvas/useOrbit.ts","../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/state/view.ts","../src/trial/DefaultSidebar.tsx","../src/ui/format.ts","../src/trial/DefaultStatusBar.tsx","../src/trial/DefaultToolbar.tsx","../src/trial/TrialChrome.tsx","../src/trial/Trial.tsx","../src/trial/trialOps.ts","../src/lab/useSystemMode.ts","../src/lab/LabShell.tsx","../src/lab/Workspace.tsx","../src/lab/Lab.tsx","../src/ui/properties/CurveField.tsx","../src/ui/properties/EffectCard.tsx","../src/ui/properties/PropertyGroup.tsx","../src/ui/properties/PropertyPanel.tsx"],"names":["useRef","jsx","useState","useCallback","useEffect","createContext","useContext","jsxs","useMemo","useStore","p","Fragment","DEFAULT_VIEW","store","useLayoutEffect"],"mappings":"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","file":"index.js","sourcesContent":["import { type PointerEvent, useCallback, useRef, type WheelEvent } from 'react';\n\n/** A point in the space the instrument works in. */\nexport interface Vec3 {\n x: number;\n y: number;\n z: number;\n}\n\n/** An orbit camera as a trial view: where it looks from, and what it looks at.\n * labkit does not turn this into a matrix — the host's renderer does. */\nexport interface OrbitView {\n yaw: number;\n pitch: number;\n distance: number;\n target: Vec3;\n}\n\n/** Just short of the pole. At exactly ±PI/2 the azimuth is undefined and the\n * camera rolls, which reads as the model jumping rather than as a limit. */\nexport const PITCH_LIMIT = Math.PI / 2 - 0.01;\n\nconst YAW_PER_PX = 0.008;\nconst PITCH_PER_PX = 0.008;\nconst DISTANCE_PER_NOTCH = 0.0015;\nconst DRAG_THRESHOLD = 3;\n\nexport function clampPitch(pitch: number): number {\n return Math.min(PITCH_LIMIT, Math.max(-PITCH_LIMIT, pitch));\n}\n\nexport function wrapYaw(yaw: number): number {\n const wrapped = ((((yaw + Math.PI) % (2 * Math.PI)) + 2 * Math.PI) % (2 * Math.PI)) - Math.PI;\n return wrapped === -Math.PI ? Math.PI : wrapped;\n}\n\n/** The view a drag of (dx, dy) from `start` produces. Absolute against the drag\n * start, so it can be re-applied any number of times without compounding. */\nexport function orbitAfterDrag(start: OrbitView, dx: number, dy: number): OrbitView {\n return {\n ...start,\n yaw: wrapYaw(start.yaw + dx * YAW_PER_PX),\n pitch: clampPitch(start.pitch + dy * PITCH_PER_PX),\n };\n}\n\n/** Multiplicative, so one notch covers the same proportion of the distance\n * whether the camera is near or far. */\nexport function orbitAfterWheel(\n view: OrbitView,\n deltaY: number,\n minDistance: number,\n maxDistance: number,\n): OrbitView {\n const factor = Math.exp(deltaY * DISTANCE_PER_NOTCH);\n return {\n ...view,\n distance: Math.min(maxDistance, Math.max(minDistance, view.distance * factor)),\n };\n}\n\nexport interface UseOrbitOptions {\n view: OrbitView;\n onViewChange: (v: OrbitView) => void;\n /** Restored on double-click. Defaults to the view the hook first saw. */\n home?: OrbitView;\n minDistance?: number;\n maxDistance?: number;\n}\n\nexport interface OrbitHandlers {\n onWheel: (e: WheelEvent<HTMLElement>) => void;\n onPointerDown: (e: PointerEvent<HTMLElement>) => void;\n onPointerMove: (e: PointerEvent<HTMLElement>) => void;\n onPointerUp: (e: PointerEvent<HTMLElement>) => void;\n onDoubleClick: () => void;\n isDragging: () => boolean;\n}\n\ninterface DragState {\n pointerId: number;\n startX: number;\n startY: number;\n startView: OrbitView;\n moved: boolean;\n}\n\n/** Pointer gestures over an orbit view: drag to turn, wheel or pinch to dolly,\n * double-click to go home. The 3D peer of `usePanZoom`. */\nexport function useOrbit({\n view,\n onViewChange,\n home,\n minDistance = 0.1,\n maxDistance = 1000,\n}: UseOrbitOptions): OrbitHandlers {\n const dragRef = useRef<DragState | null>(null);\n const viewRef = useRef(view);\n viewRef.current = view;\n const homeRef = useRef(home ?? view);\n if (home) homeRef.current = home;\n\n const onWheel = useCallback(\n (e: WheelEvent<HTMLElement>) => {\n e.preventDefault();\n onViewChange(orbitAfterWheel(viewRef.current, e.deltaY, minDistance, maxDistance));\n },\n [onViewChange, minDistance, maxDistance],\n );\n\n const onPointerDown = useCallback((e: PointerEvent<HTMLElement>) => {\n if (e.button !== 0) return;\n e.currentTarget.setPointerCapture(e.pointerId);\n dragRef.current = {\n pointerId: e.pointerId,\n startX: e.clientX,\n startY: e.clientY,\n startView: viewRef.current,\n moved: false,\n };\n }, []);\n\n const onPointerMove = useCallback(\n (e: PointerEvent<HTMLElement>) => {\n const drag = dragRef.current;\n if (!drag || drag.pointerId !== e.pointerId) return;\n const dx = e.clientX - drag.startX;\n const dy = e.clientY - drag.startY;\n if (!drag.moved && Math.hypot(dx, dy) < DRAG_THRESHOLD) return;\n drag.moved = true;\n onViewChange(orbitAfterDrag(drag.startView, dx, dy));\n },\n [onViewChange],\n );\n\n const onPointerUp = useCallback((e: PointerEvent<HTMLElement>) => {\n const drag = dragRef.current;\n if (!drag || drag.pointerId !== e.pointerId) return;\n if (e.currentTarget.hasPointerCapture(e.pointerId)) {\n e.currentTarget.releasePointerCapture(e.pointerId);\n }\n dragRef.current = null;\n }, []);\n\n const onDoubleClick = useCallback(() => onViewChange(homeRef.current), [onViewChange]);\n const isDragging = useCallback(() => dragRef.current?.moved === true, []);\n\n return { onWheel, onPointerDown, onPointerMove, onPointerUp, onDoubleClick, isDragging };\n}\n","import type { Instrument } from './types';\n\n/** Which optional capabilities an instrument declared — what the trial\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';\n/** `theme.name::mode` → the rule text currently published for it. Keyed by\n * name because that is what the rule's selector matches on, and holding the\n * text is what lets a redefinition under the same name replace its rule\n * rather than be swallowed as a cache hit. */\nconst emitted = new Map<string, 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\n/** Republish every rule from `emitted`. Rewriting the whole sheet rather than\n * appending keeps it the size of the theme set: a theme redefined under a\n * name it already used replaces its rule instead of stacking another one. */\nfunction flushRules(): void {\n const css = [...emitted.values()].join('\\n');\n if (canAdopt()) {\n if (!sheet) {\n sheet = new CSSStyleSheet();\n document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet];\n }\n sheet.replaceSync(css);\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 * 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 const resolved = resolveTheme(theme, mode);\n const body = Object.entries(resolved)\n .map(([name, value]) => `${name}: ${value};`)\n .join(' ');\n const rule = `[data-wzl-theme='${theme.name}'][data-wzl-mode='${mode}'] { ${body} }`;\n if (emitted.get(key) !== rule) {\n emitted.set(key, rule);\n flushRules();\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 { InstrumentList } from '../instrument/types';\nimport type { LabMode, SavedSnapshot, TrialRecord } from '../state/types';\n\n/** Lab-wide state and commands: the available instruments, the open\n * trials and the operations over them, saved snapshots, and the color\n * mode. */\nexport interface LabContextValue {\n instruments: InstrumentList;\n trials: TrialRecord[];\n addTrial: (instrumentName: string) => void;\n cloneTrial: (id: string) => void;\n closeTrial: (id: string) => void;\n resetTrial: (id: string) => void;\n reorderTrials: (ids: readonly string[]) => void;\n savedSnapshots: SavedSnapshot[];\n saveSnapshot: (trialId: string, name?: string) => void;\n loadSnapshot: (trialId: 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 type { ViewTransform } from '../instrument/types';\n\n/** The 2D view labkit has always shipped, and what a trial gets when it names no\n * other. Re-exported under its own name so a consumer can say which it means. */\nexport type ViewTransform2D = ViewTransform;\n\nexport const DEFAULT_VIEW: ViewTransform2D = { zoom: 1, pan: { x: 0, y: 0 } };\n\n/** A trial's view is opaque to labkit, so anything that needs the 2D shape — the\n * zoom chrome, `CanvasStack` — asks for it and handles not getting it. */\nexport function as2DView(view: unknown): ViewTransform2D | null {\n if (typeof view !== 'object' || view === null) return null;\n const v = view as Partial<ViewTransform2D>;\n if (typeof v.zoom !== 'number') return null;\n if (typeof v.pan !== 'object' || v.pan === null) return null;\n if (typeof v.pan.x !== 'number' || typeof v.pan.y !== 'number') return null;\n return { zoom: v.zoom, pan: { x: v.pan.x, y: v.pan.y } };\n}\n","import { ControlPanel } from '../controls/ControlPanel';\nimport { Sidebar } from '../primitives/Sidebar';\nimport type { TrialSidebarContext } from './slotTypes';\n\n/** Props for `<DefaultSidebar>`. */\nexport interface DefaultSidebarProps {\n ctx: TrialSidebarContext;\n}\n\n/** The sidebar a trial 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","// 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\n/** Zoom for display. Below 2x a percentage reads naturally; past it the\n * numbers get long and a multiplier is what people say out loud, so 250%\n * shows as `2.5x`. Past 100x a tenth is noise, so the decimal is dropped\n * and thousands are grouped: `1009.74` reads as `1,010x`. */\nexport function formatZoom(zoom: number): string {\n if (!Number.isFinite(zoom)) return String(zoom);\n if (zoom <= 2) return `${formatNumber(Math.round(zoom * 100))}%`;\n if (zoom >= 100) return `${Math.round(zoom).toLocaleString('en-US')}x`;\n return `${formatNumber(Math.round(zoom * 10) / 10)}x`;\n}\n","import { StatusBar } from '../primitives/StatusBar';\nimport { formatZoom } from '../ui/format';\nimport type { TrialStatusBarContext } from './slotTypes';\n\n/** Props for `<DefaultStatusBar>`. */\nexport interface DefaultStatusBarProps {\n ctx: TrialStatusBarContext;\n}\n\n/** The status bar a trial renders when no `statusBar` slot is supplied:\n * the instrument's name, and the zoom when the trial's view has one. */\nexport function DefaultStatusBar({ ctx }: DefaultStatusBarProps) {\n return (\n <StatusBar>\n <StatusBar.Section>{ctx.instrumentName}</StatusBar.Section>\n {ctx.zoom === null ? null : <StatusBar.Section>{formatZoom(ctx.zoom)}</StatusBar.Section>}\n </StatusBar>\n );\n}\n","import { Toolbar } from '../primitives/Toolbar';\nimport { formatZoom } from '../ui/format';\nimport type { TrialToolbarContext } from './slotTypes';\n\n/** Props for `<DefaultToolbar>`. */\nexport interface DefaultToolbarProps {\n ctx: TrialToolbarContext;\n}\n\n/** The toolbar a trial 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\">{formatZoom(ctx.zoom)}</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 trial\">\n Clone\n </Toolbar.Button>\n <Toolbar.Button onClick={ctx.reset} title=\"Reset trial\">\n Reset\n </Toolbar.Button>\n <Toolbar.Button\n onClick={ctx.close}\n disabled={ctx.isLastTrial}\n title={ctx.isLastTrial ? 'Cannot close the last trial' : 'Close trial'}\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 type { JobHandle } from '../job/types';\nimport { useLabContext } from '../lab/LabContext';\nimport { LabStoreContext } from '../state/context';\nimport type { TrialRecord } from '../state/types';\nimport { as2DView } from '../state/view';\nimport { DefaultSidebar } from './DefaultSidebar';\nimport { DefaultStatusBar } from './DefaultStatusBar';\nimport { DefaultToolbar } from './DefaultToolbar';\nimport type {\n SidebarSlot,\n StatusBarSlot,\n ToolbarSlot,\n TrialSidebarContext,\n TrialStatusBarContext,\n TrialToolbarContext,\n} from './slotTypes';\n\nexport interface UndoBindings {\n canUndo: boolean;\n canRedo: boolean;\n undo: () => void;\n redo: () => void;\n}\n\n/** Props for `<TrialChrome>`. */\nexport interface TrialChromeProps {\n trialId: string;\n record: TrialRecord;\n instrument: Instrument;\n isLastTrial: boolean;\n toolbar?: ToolbarSlot;\n sidebar?: SidebarSlot;\n statusBar?: StatusBarSlot;\n undoBindings?: UndoBindings;\n /** Supplied when the instrument declares a `job`. */\n job?: JobHandle;\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 TrialChrome({\n trialId,\n record,\n instrument,\n isLastTrial,\n toolbar,\n sidebar,\n statusBar,\n undoBindings,\n job,\n sidebarExtras,\n children,\n}: TrialChromeProps) {\n const lab = useLabContext();\n const storeCtx = useContext(LabStoreContext);\n if (!storeCtx) throw new Error('[labkit] TrialChrome requires <LabStoreProvider>');\n const updateTrialView = useStore(storeCtx.store, (s) => s.updateTrialView);\n const updateTrialConfig = useStore(storeCtx.store, (s) => s.updateTrialConfig);\n const updateTrialState = useStore(storeCtx.store, (s) => s.updateTrialState);\n\n // The trial view is opaque to labkit, so the zoom chrome asks for the 2D shape\n // and goes inert when the trial holds something else — an orbit, say.\n const view2d = as2DView(record.view);\n\n const toolbarCtx = useMemo<TrialToolbarContext>(() => {\n const setZoom = (z: number): void => {\n if (!view2d) return;\n updateTrialView(trialId, { ...view2d, zoom: z });\n };\n return {\n trialId,\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: view2d?.zoom ?? 1,\n setZoom,\n zoomIn: () => setZoom((view2d?.zoom ?? 1) * 1.25),\n zoomOut: () => setZoom((view2d?.zoom ?? 1) * 0.8),\n resetZoom: () => setZoom(1),\n hasCanvas: instrument.canvas != null,\n savedSnapshots: lab.savedSnapshots.filter((s) => s.trialId === trialId),\n saveSnapshot: (name) => lab.saveSnapshot(trialId, name),\n loadSnapshot: (snapshotId) => lab.loadSnapshot(trialId, snapshotId),\n clone: () => lab.cloneTrial(trialId),\n reset: () => lab.resetTrial(trialId),\n close: () => lab.closeTrial(trialId),\n isLastTrial,\n };\n }, [trialId, record, instrument, lab, isLastTrial, updateTrialView, undoBindings, view2d]);\n\n const sidebarCtx = useMemo<TrialSidebarContext>(\n () => ({\n trialId,\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 updateTrialConfig(trialId, 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 updateTrialState(trialId, nextState as never);\n }\n },\n }),\n [trialId, record, instrument, updateTrialConfig, updateTrialState],\n );\n\n const statusCtx: TrialStatusBarContext = {\n trialId,\n instrumentName: record.instrumentName,\n zoom: view2d ? view2d.zoom : null,\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-trial\"\n aria-label={`Trial ${record.instrumentName}`}\n onKeyDown={handleKeyDown}\n >\n <div className=\"lk-trial__toolbar\">\n {toolbar ? toolbar(toolbarCtx) : <DefaultToolbar ctx={toolbarCtx} />}\n </div>\n <div className=\"lk-trial__body\">\n <div className=\"lk-trial__sidebar\">\n {sidebar ? sidebar(sidebarCtx) : <DefaultSidebar ctx={sidebarCtx} />}\n {sidebarExtras}\n </div>\n <div className=\"lk-trial__content\">{children}</div>\n </div>\n <div className=\"lk-trial__status\">\n {job ? (\n <div className=\"lk-trial__job\">\n <span className=\"lk-trial__job-count\">\n {job.done}\n {job.total === null ? '' : ` / ${job.total}`}\n </span>\n {job.failures.length > 0 ? (\n <span className=\"lk-trial__job-failures\">{job.failures.length} failed</span>\n ) : null}\n {job.error ? <span className=\"lk-trial__job-error\">{job.error}</span> : null}\n {job.status === 'running' ? (\n <button type=\"button\" className=\"lk-trial__job-cancel\" onClick={job.cancel}>\n Cancel\n </button>\n ) : null}\n </div>\n ) : null}\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} from '../instrument/types';\nimport { useJob } from '../job/useJob';\nimport { useLabContext } from '../lab/LabContext';\nimport { LayerList } from '../layers/LayerList';\nimport { LabStoreContext } from '../state/context';\nimport type { LabStore } from '../state/store';\nimport type { TrialRecord } from '../state/types';\nimport { as2DView, DEFAULT_VIEW } from '../state/view';\nimport { createEventBus, type EventBus } from '../undo/eventBus';\nimport { pushSnapshot, redo as undoRedo, undo as undoUndo } from '../undo/undoStack';\nimport type { UndoBindings } from './TrialChrome';\nimport { TrialChrome } from './TrialChrome';\n\n/** Props for `<Trial>`. */\nexport interface TrialProps {\n id: string;\n}\n\n/** Renders one trial from the lab store: looks up its record and\n * instrument, and mounts the instrument inside the trial chrome. */\nexport function Trial({ id }: TrialProps) {\n const lab = useLabContext();\n const storeCtx = useContext(LabStoreContext);\n if (!storeCtx) throw new Error('[labkit] <Trial> requires <LabStoreProvider>');\n const record = useStore(storeCtx.store, (s) => s.trials.find((w) => w.id === id));\n if (!record) {\n return <div className=\"lk-trial lk-trial--unknown\">Trial 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-trial lk-trial--unknown\">Unknown instrument: {record.instrumentName}</div>\n );\n }\n return (\n <TrialRuntime\n record={record}\n instrument={instrument}\n store={storeCtx.store}\n isLast={lab.trials.length <= 1}\n />\n );\n}\n\ninterface TrialRuntimeProps {\n record: TrialRecord;\n instrument: Instrument;\n store: LabStore;\n isLast: boolean;\n}\n\nfunction TrialRuntime({ record, instrument, store, isLast }: TrialRuntimeProps) {\n const canvasContainerRef = useRef<HTMLDivElement | null>(null);\n const updateTrialState = useStore(store, (s) => s.updateTrialState);\n const updateTrialConfig = useStore(store, (s) => s.updateTrialConfig);\n const updateTrialView = useStore(store, (s) => s.updateTrialView);\n const updateTrialUndoStack = useStore(store, (s) => s.updateTrialUndoStack);\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().trials.find((w) => w.id === record.id);\n if (!current) return;\n const snap = structuredClone(current.state);\n updateTrialUndoStack(record.id, (prev) => pushSnapshot(prev, snap, maxDepth));\n };\n\n const setView = (v: unknown): void => updateTrialView(record.id, v);\n\n // `CanvasStack` and the zoom controls are 2D; a trial holding another view shape\n // gets the default here and simply never renders them.\n const view2d = as2DView(record.view);\n\n const jobCap = instrument.job;\n // Hooks cannot be conditional, so a trial without the capability still calls\n // this — with a runner that yields nothing and is never started.\n const job = useJob({\n capability: jobCap ?? { run: async function* () {}, onItem: (_i, st) => st },\n config: record.config,\n state: record.state,\n setState: (next) => updateTrialState(record.id, next as never),\n });\n\n const renderCtx: RenderContext<unknown, unknown> = {\n state: record.state,\n config: record.config,\n setState: (next) => {\n snapshotIfNeeded('state.change');\n updateTrialState(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 updateTrialConfig(record.id, key as never, value as never);\n bus.emit('config.change');\n bus.emit(evt);\n },\n trial: {\n id: record.id,\n view: record.view,\n setView,\n zoom: view2d?.zoom ?? 1,\n setZoom: (z) => {\n if (!view2d) return;\n updateTrialView(record.id, { ...view2d, zoom: z });\n },\n },\n emit: (event) => {\n snapshotIfNeeded(event);\n bus.emit(event);\n },\n job: jobCap ? job : undefined,\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 updateTrialState(record.id, result.snapshot as never);\n updateTrialUndoStack(record.id, result.stack);\n },\n redo: () => {\n const result = undoRedo(record.undoStack, structuredClone(record.state));\n if (!result) return;\n updateTrialState(record.id, result.snapshot as never);\n updateTrialUndoStack(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 // Camera applied here, so a layer draws in world coordinates. `zoom`\n // stays in the args for line widths, which must not scale with it.\n ctx.translate(view.pan.x, view.pan.y);\n ctx.scale(view.zoom, view.zoom);\n layer.draw(ctx, { state: record.state, config: record.config, zoom: view.zoom });\n },\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: view2d ?? DEFAULT_VIEW,\n state: record.state,\n config: record.config,\n setState: (next) => {\n snapshotIfNeeded('canvas.itemAdded');\n updateTrialState(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-trial__canvas-host\"\n style={{ width: '100%', height: '100%', position: 'relative' }}\n >\n <CanvasStack\n layers={layersWithFeedback}\n view={view2d ?? DEFAULT_VIEW}\n onViewChange={setView}\n >\n {instrument.render(renderCtx)}\n </CanvasStack>\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 <TrialChrome\n job={jobCap ? job : undefined}\n trialId={record.id}\n record={record}\n instrument={instrument}\n isLastTrial={isLast}\n undoBindings={undoBindings}\n sidebarExtras={\n <>\n {paletteNode}\n {layerListNode}\n </>\n }\n >\n {body}\n </TrialChrome>\n );\n}\n","import type { Instrument, InstrumentList } from '../instrument/types';\nimport type { TrialRecord } from '../state/types';\n\nconst DEFAULT_VIEW = { zoom: 1, pan: { x: 0, y: 0 } } as const;\n\nfunction findInstrument(instruments: InstrumentList, 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): TrialRecord['view'] {\n return instrument.canvas?.initialView\n ? structuredClone(instrument.canvas.initialView)\n : { ...DEFAULT_VIEW, pan: { ...DEFAULT_VIEW.pan } };\n}\n\n/** Append a new trial running `instrumentName`, at that instrument's\n * default config and initial state. */\nexport function addTrial(\n trials: TrialRecord[],\n instruments: InstrumentList,\n instrumentName: string,\n): TrialRecord[] {\n const instrument = findInstrument(instruments, instrumentName);\n const config = instrument.defaultConfig();\n const state = instrument.initialState(config);\n const record: TrialRecord = {\n id: crypto.randomUUID(),\n instrumentName,\n config,\n state,\n view: initialView(instrument),\n undoStack: { past: [], future: [] },\n };\n return [...trials, record];\n}\n\n/** Insert a deep copy of a trial directly after it. The copy starts with\n * an empty undo history — the original's is not shared. */\nexport function cloneTrial(trials: TrialRecord[], id: string): TrialRecord[] {\n const sourceIdx = trials.findIndex((w) => w.id === id);\n const source = trials[sourceIdx];\n if (!source) return trials;\n const clone: TrialRecord = {\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 [...trials.slice(0, sourceIdx + 1), clone, ...trials.slice(sourceIdx + 1)];\n}\n\n/** Remove a trial, unless it is the last one — a lab always has at least\n * one. */\nexport function closeTrial(trials: TrialRecord[], id: string): TrialRecord[] {\n if (trials.length <= 1) return trials;\n const next = trials.filter((w) => w.id !== id);\n return next.length === trials.length ? trials : next;\n}\n\n/** Return a trial to its instrument's defaults, keeping its id and its\n * place in the list. */\nexport function resetTrial(\n trials: TrialRecord[],\n id: string,\n instruments: InstrumentList,\n): TrialRecord[] {\n const idx = trials.findIndex((w) => w.id === id);\n const current = trials[idx];\n if (!current) return trials;\n const instrument = findInstrument(instruments, current.instrumentName);\n const config = instrument.defaultConfig();\n const state = instrument.initialState(config);\n const reset: TrialRecord = {\n ...current,\n config,\n state,\n view: initialView(instrument),\n };\n return [...trials.slice(0, idx), reset, ...trials.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 trial.\n */\nexport function reorderTrials(trials: TrialRecord[], ids: readonly string[]): TrialRecord[] {\n const byId = new Map(trials.map((w) => [w.id, w]));\n const named = ids.map((id) => byId.get(id)).filter((w): w is TrialRecord => w !== undefined);\n const seen = new Set(named.map((w) => w.id));\n const rest = trials.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 trial 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\nimport { useSurfaceOptional } from '../surface/useSurfaceTile';\n\nconst ZONE_ID = asNodeId('lk-workspace');\nconst STRATEGIES = { grid: gridStrategy as never };\nconst KIND = 'trial';\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 TrialLayout = Record<\n string,\n { size?: { w?: number; h?: number }; span?: { cols?: number; rows?: number } }\n>;\n\nexport interface WorkspaceProps {\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?: TrialLayout;\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: TrialLayout) => 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): TrialLayout[string] | null {\n const p = store.getNode(id)?.membership?.placement as TrialLayout[string] | undefined;\n if (!p) return null;\n const out: TrialLayout[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 trials, `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 Workspace({\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}: WorkspaceProps) {\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]); // eslint-disable-line react-hooks/exhaustive-deps\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 // A tile that only moves reports nothing to a ResizeObserver, and only this\n // component knows the grid moved one. Optional: a lab may own no surface.\n const surface = useSurfaceOptional();\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 // biome-ignore lint/correctness/useExhaustiveDependencies: nodeIds is the signal that the tile set changed — a re-tile moves tiles without resizing any — not a value this reads\n useEffect(() => {\n if (!surface) return;\n surface.invalidateRects();\n return store.events.on('node.placementChanged', () => surface.invalidateRects());\n }, [store, surface, nodeIds]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n if (!onLayoutChange) return;\n return store.events.on('node.placementChanged', () => {\n const next: TrialLayout = {};\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-trial-tile\">\n <DragHandle nodeId={node.id} className=\"lk-trial-tile__grip\">\n <span className=\"lk-trial-tile__grip-dots\" aria-hidden=\"true\" />\n </DragHandle>\n <div className=\"lk-trial-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 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 { InstrumentList } from '../instrument/types';\nimport { noneAdapter } from '../state/adapters';\nimport { LabStoreContext } from '../state/context';\nimport { createLabStore, type LabStore } from '../state/store';\nimport type { LabMode, StorageAdapter, TrialRecord } from '../state/types';\nimport { interstellarTheme } from '../theme/interstellar';\nimport { Trial } from '../trial/Trial';\nimport {\n addTrial as addTrialOp,\n cloneTrial as cloneTrialOp,\n closeTrial as closeTrialOp,\n reorderTrials as reorderTrialsOp,\n resetTrial as resetTrialOp,\n} from '../trial/trialOps';\nimport { LabContext, type LabContextValue } from './LabContext';\nimport { LabShell } from './LabShell';\nimport { useResolvedMode } from './useSystemMode';\nimport { type TrialLayout, Workspace } from './Workspace';\n\n/** Props for `<Lab>`. */\nexport interface LabProps {\n instruments: InstrumentList;\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: InstrumentList,\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().trials.length === 0) {\n const seeded = addTrialOp([], instruments, defaultInstrument);\n const record = seeded[0];\n if (record) {\n const { undoStack: _undoStack, ...rest } = record;\n store.getState().addTrial(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 trial\n * per record in a grid. Each trial 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 trials = useStore(store, (s) => s.trials);\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 replaceTrials = (next: TrialRecord[]): void => {\n const currentById = new Map(store.getState().trials.map((w) => [w.id, w]));\n const merged = next.map((w) => currentById.get(w.id) ?? w);\n store.setState({ trials: merged });\n // Trigger persistence flush via a tracked action.\n store.getState().setMode(store.getState().mode);\n };\n\n return {\n instruments,\n trials,\n addTrial: (instrumentName) => {\n const next = addTrialOp(store.getState().trials, instruments, instrumentName);\n replaceTrials(next);\n },\n cloneTrial: (id) => {\n const next = cloneTrialOp(store.getState().trials, id);\n replaceTrials(next);\n },\n closeTrial: (id) => {\n const next = closeTrialOp(store.getState().trials, id);\n replaceTrials(next);\n },\n reorderTrials: (ids) => {\n replaceTrials(reorderTrialsOp(store.getState().trials, ids));\n },\n resetTrial: (id) => {\n const next = resetTrialOp(store.getState().trials, id, instruments);\n const record = next.find((w) => w.id === id);\n if (!record) return;\n store.setState((s) => ({\n trials: s.trials.map((w) =>\n w.id === id\n ? { ...w, config: record.config, state: record.state, view: record.view }\n : w,\n ),\n }));\n store.getState().updateTrialView(id, record.view);\n },\n savedSnapshots,\n saveSnapshot: (trialId, name) => {\n store.getState().saveSnapshot(trialId, name ?? `Save ${new Date().toLocaleString()}`);\n },\n loadSnapshot: (trialId, snapshotId) => {\n store.getState().loadSnapshot(snapshotId, trialId);\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, trials, 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 <Workspace\n ids={trials.map((w) => w.id)}\n resizable\n reorderable\n onReorder={(ids) => contextValue.reorderTrials(ids)}\n layout={layout as TrialLayout}\n onLayoutChange={(next) => store.getState().setLayout(next)}\n >\n {trials.map((w) => (\n <Trial key={w.id} id={w.id} />\n ))}\n </Workspace>\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","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"]}