@weasel-js/labkit 1.7.0 → 1.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/_dts/{CanvasStackContext-D2jnIwfk.d.ts → CanvasStackContext-Cjy6I-Iv.d.ts} +4 -1
- package/dist/_dts/{Stage-CCWfQQWM.d.ts → Stage-D6t7o0pF.d.ts} +3 -2
- package/dist/_dts/{index-CsYqUHD3.d.ts → index-BTmaRy6a.d.ts} +10 -6
- package/dist/_dts/{types-CSm9jgol.d.ts → index-DCMA4Fy1.d.ts} +59 -113
- package/dist/_dts/{types-CRPSGFAp.d.ts → types-BUBSIZuV.d.ts} +8 -7
- package/dist/_dts/{useTrialState-CTZPgeZ7.d.ts → useTrialState-Bh8bzFgE.d.ts} +1 -1
- package/dist/canvas/index.d.ts +8 -6
- package/dist/canvas/index.js +6 -6
- package/dist/chrome/index.d.ts +7 -5
- package/dist/chrome/index.js +10 -9
- package/dist/chunk-2ES4W47N.js +8 -0
- package/dist/chunk-2ES4W47N.js.map +1 -0
- package/dist/{chunk-WPLAANH4.js → chunk-2N7UBSS2.js} +12 -12
- package/dist/chunk-2N7UBSS2.js.map +1 -0
- package/dist/{chunk-275JRRVD.js → chunk-E23Q6A3Y.js} +232 -37
- package/dist/chunk-E23Q6A3Y.js.map +1 -0
- package/dist/{chunk-GOZLNM4L.js → chunk-E6NARGU7.js} +5 -5
- package/dist/{chunk-GOZLNM4L.js.map → chunk-E6NARGU7.js.map} +1 -1
- package/dist/{chunk-IJJUK4FU.js → chunk-EESJUSYR.js} +5 -6
- package/dist/chunk-EESJUSYR.js.map +1 -0
- package/dist/{chunk-HXXTULDN.js → chunk-EFXRM6XQ.js} +8 -11
- package/dist/chunk-EFXRM6XQ.js.map +1 -0
- package/dist/chunk-F4ACIK7Z.js +210 -0
- package/dist/chunk-F4ACIK7Z.js.map +1 -0
- package/dist/{chunk-AWQG7FCC.js → chunk-FG3EXZDV.js} +3 -3
- package/dist/{chunk-AWQG7FCC.js.map → chunk-FG3EXZDV.js.map} +1 -1
- package/dist/{chunk-YT75VYRD.js → chunk-IBVRMHW5.js} +5 -5
- package/dist/{chunk-YT75VYRD.js.map → chunk-IBVRMHW5.js.map} +1 -1
- package/dist/{chunk-RWNDDKOH.js → chunk-PMLZP7RT.js} +18 -15
- package/dist/chunk-PMLZP7RT.js.map +1 -0
- package/dist/{chunk-Y23G2VZL.js → chunk-READTDQX.js} +2 -2
- package/dist/chunk-READTDQX.js.map +1 -0
- package/dist/{chunk-I5DUQ5HM.js → chunk-RODIY7HI.js} +75 -72
- package/dist/chunk-RODIY7HI.js.map +1 -0
- package/dist/{chunk-JVBYV6TL.js → chunk-ROGJWDQA.js} +3 -3
- package/dist/{chunk-JVBYV6TL.js.map → chunk-ROGJWDQA.js.map} +1 -1
- package/dist/{chunk-ZIFPHIWZ.js → chunk-T6DLGEJB.js} +12 -14
- package/dist/chunk-T6DLGEJB.js.map +1 -0
- package/dist/chunk-U6UQVGFP.js +15583 -0
- package/dist/chunk-U6UQVGFP.js.map +1 -0
- package/dist/{chunk-24W5VEJW.js → chunk-ULYYNWGP.js} +2 -2
- package/dist/{chunk-24W5VEJW.js.map → chunk-ULYYNWGP.js.map} +1 -1
- package/dist/{chunk-UNAZSLWE.js → chunk-VYVGVBGY.js} +17 -20
- package/dist/chunk-VYVGVBGY.js.map +1 -0
- package/dist/chunk-WFALF2X2.js +302 -0
- package/dist/chunk-WFALF2X2.js.map +1 -0
- package/dist/{chunk-KMJ7RWD3.js → chunk-WLMDTI2Q.js} +3 -3
- package/dist/{chunk-KMJ7RWD3.js.map → chunk-WLMDTI2Q.js.map} +1 -1
- package/dist/{chunk-T5IBSPAM.js → chunk-WWJDPNZZ.js} +43 -33
- package/dist/chunk-WWJDPNZZ.js.map +1 -0
- package/dist/{chunk-J7OWWTCW.js → chunk-XE5HJOPL.js} +5 -6
- package/dist/chunk-XE5HJOPL.js.map +1 -0
- package/dist/{chunk-7BO7HNGF.js → chunk-XRX5S5NT.js} +8 -61
- package/dist/chunk-XRX5S5NT.js.map +1 -0
- package/dist/chunk-XVUKDSYV.js +38 -0
- package/dist/chunk-XVUKDSYV.js.map +1 -0
- package/dist/{chunk-FMK7UQ6V.js → chunk-XZDCEMEL.js} +64 -47
- package/dist/chunk-XZDCEMEL.js.map +1 -0
- package/dist/{chunk-FZ7YFQN7.js → chunk-YCFKW5RX.js} +3 -3
- package/dist/chunk-YCFKW5RX.js.map +1 -0
- package/dist/{chunk-CQLQPQ4P.js → chunk-ZQIHJXP4.js} +2 -2
- package/dist/chunk-ZQIHJXP4.js.map +1 -0
- package/dist/config/index.d.ts +18 -10
- package/dist/config/index.js +4 -4
- package/dist/controls/index.d.ts +58 -9
- package/dist/controls/index.js +7 -5
- package/dist/dragdrop/index.d.ts +23 -3
- package/dist/dragdrop/index.js +4 -3
- package/dist/fonts/oswald-tabular-digits.woff2 +0 -0
- package/dist/index.d.ts +61 -715
- package/dist/index.js +456 -432
- package/dist/index.js.map +1 -1
- package/dist/job/index.d.ts +8 -0
- package/dist/job/index.js +1 -1
- package/dist/layers/index.d.ts +6 -5
- package/dist/layers/index.js +3 -2
- package/dist/loupe/index.d.ts +100 -30
- package/dist/loupe/index.js +585 -6
- package/dist/loupe/index.js.map +1 -1
- package/dist/overview/index.d.ts +4 -2
- package/dist/overview/index.js +15 -14
- package/dist/overview/index.js.map +1 -1
- package/dist/passthrough/weasel-canvas.d.ts +2 -0
- package/dist/passthrough/weasel-ui.d.ts +2 -2871
- package/dist/passthrough/weasel-ui.js +3 -2
- package/dist/primitives/index.d.ts +213 -3
- package/dist/primitives/index.js +8 -7
- package/dist/state/index.d.ts +7 -5
- package/dist/state/index.js +6 -6
- package/dist/styles.css +284 -51
- package/dist/surface/index.d.ts +10 -2
- package/dist/surface/index.js +1 -1
- package/dist/undo/index.d.ts +5 -3
- package/package.json +11 -11
- package/src/annotations/AnnotationOverlay.abandon.test.tsx +143 -0
- package/src/annotations/AnnotationOverlay.tsx +50 -31
- package/src/annotations/Annotations.overlay.test.tsx +31 -0
- package/src/annotations/capture.browser.test.ts +47 -0
- package/src/annotations/capture.ts +14 -7
- package/src/annotations/drawOne.ts +2 -2
- package/src/annotations/frac.test.ts +44 -1
- package/src/annotations/frac.ts +46 -18
- package/src/annotations/index.ts +1 -0
- package/src/annotations/paint.test.ts +74 -33
- package/src/annotations/paint.ts +70 -32
- package/src/annotations/store.test.ts +212 -2
- package/src/annotations/store.ts +130 -27
- package/src/annotations/svgNodes.test.ts +22 -10
- package/src/annotations/svgNodes.ts +3 -3
- package/src/annotations/types.ts +29 -10
- package/src/canvas/CameraInput.test.tsx +30 -0
- package/src/canvas/CameraInput.tsx +16 -15
- package/src/canvas/CanvasStack.tsx +5 -5
- package/src/canvas/CanvasStackContext.ts +4 -1
- package/src/canvas/Stage.test.tsx +34 -25
- package/src/canvas/Stage.tsx +3 -3
- package/src/canvas/cameraRegistry.ts +1 -0
- package/src/canvas/worldSpec.ts +3 -1
- package/src/chrome/builtins.test.ts +7 -6
- package/src/chrome/builtins.tsx +5 -1
- package/src/chrome/index.ts +1 -1
- package/src/chrome/labRegions.test.tsx +37 -26
- package/src/chrome/merge.test.ts +5 -0
- package/src/chrome/merge.ts +4 -2
- package/src/chrome/regions/PaletteRegion.test.tsx +4 -5
- package/src/chrome/regions/PaletteRegion.tsx +3 -4
- package/src/chrome/regions/ViewportRegion.browser.test.less +6 -0
- package/src/chrome/regions/ViewportRegion.browser.test.tsx +38 -0
- package/src/chrome/regions/ViewportRegion.less +6 -0
- package/src/chrome/regions/ViewportRegion.tsx +10 -4
- package/src/chrome/types.ts +4 -2
- package/src/config/auto.ts +1 -0
- package/src/config/builder.ts +6 -0
- package/src/config/types.ts +2 -1
- package/src/controls/ControlMatrix.less +245 -0
- package/src/controls/ControlMatrix.stories.less +13 -0
- package/src/controls/ControlMatrix.stories.tsx +135 -0
- package/src/controls/ControlMatrix.test.tsx +206 -0
- package/src/controls/ControlMatrix.tsx +446 -0
- package/src/controls/ControlPanel.test.tsx +37 -3
- package/src/controls/ControlPanel.tsx +16 -5
- package/src/controls/index.ts +6 -0
- package/src/dragdrop/DragDropRuntime.tsx +22 -13
- package/src/dragdrop/DragGhost.tsx +3 -0
- package/src/dragdrop/Palette.tsx +2 -0
- package/src/dragdrop/dragDrop.test.tsx +34 -33
- package/src/index.test.ts +5 -0
- package/src/index.ts +7 -1
- package/src/instrument/types.ts +0 -6
- package/src/job/useJob.ts +14 -9
- package/src/lab/Lab.chrome.test.tsx +15 -10
- package/src/lab/Lab.nebula.test.tsx +5 -5
- package/src/lab/Lab.surface.test.tsx +30 -21
- package/src/lab/Lab.test.tsx +75 -74
- package/src/lab/Lab.tsx +5 -1
- package/src/lab/Lab.undock.test.tsx +15 -10
- package/src/lab/LabHeader.test.tsx +15 -14
- package/src/lab/LabPalette.test.tsx +12 -7
- package/src/lab/LabShell.less +1 -1
- package/src/lab/LabSwitcher.browser.test.tsx +27 -0
- package/src/lab/LabSwitcher.less +2 -0
- package/src/lab/LabZoom.test.tsx +55 -44
- package/src/lab/LabZoom.tsx +4 -4
- package/src/lab/Workspace.surface.test.tsx +16 -13
- package/src/lab/Workspace.test.tsx +32 -27
- package/src/lab/Workspace.tsx +48 -52
- package/src/loupe/AGENTS.md +28 -15
- package/src/loupe/CanvasLoupe.tsx +2 -3
- package/src/loupe/DomLoupe.tsx +1 -7
- package/src/loupe/Loupe.less +16 -0
- package/src/loupe/TrialLoupe.tsx +120 -57
- package/src/loupe/index.ts +1 -6
- package/src/loupe/types.test.ts +3 -3
- package/src/loupe/types.ts +24 -27
- package/src/loupe/useLoupe.test.tsx +29 -4
- package/src/loupe/useLoupe.ts +20 -17
- package/src/overview/OverviewMarks.test.tsx +9 -8
- package/src/overview/OverviewMarks.tsx +12 -4
- package/src/overview/TrialOverview.test.tsx +18 -17
- package/src/overview/TrialOverview.tsx +3 -3
- package/src/passthrough/weasel-ui.test.ts +1 -1
- package/src/passthrough/weasel-ui.ts +1 -1
- package/src/primitives/FloatingPanel.tsx +7 -3
- package/src/primitives/FpsMeter.less +1 -2
- package/src/primitives/JobProgress.less +1 -1
- package/src/primitives/Readout.test.tsx +2 -2
- package/src/primitives/ScaleIndicator.less +1 -1
- package/src/primitives/Split.tsx +69 -41
- package/src/primitives/StatusBar.less +1 -1
- package/src/primitives/Toolbar.tsx +3 -3
- package/src/primitives/ZoomControl.less +1 -2
- package/src/specimen/Specimen.less +1 -0
- package/src/specimen/Specimen.tsx +0 -1
- package/src/state/undock.ts +3 -0
- package/src/state/useOpenOnce.ts +20 -16
- package/src/state/view.ts +1 -0
- package/src/styles.less +3 -0
- package/src/surface/index.ts +1 -1
- package/src/surface/useTiledSurface.test.tsx +14 -0
- package/src/surface/useTiledSurface.ts +11 -3
- package/src/trial/Trial.annotations.persist.test.tsx +20 -9
- package/src/trial/Trial.annotations.test.tsx +105 -27
- package/src/trial/Trial.canvas.test.tsx +21 -17
- package/src/trial/Trial.config.test.tsx +34 -27
- package/src/trial/Trial.less +0 -16
- package/src/trial/Trial.loupe.test.tsx +51 -25
- package/src/trial/Trial.targets.test.tsx +9 -8
- package/src/trial/Trial.test.tsx +51 -46
- package/src/trial/Trial.trialId.test.tsx +7 -6
- package/src/trial/Trial.tsx +74 -62
- package/src/trial/TrialChrome.tsx +6 -3
- package/src/trial/index.ts +2 -0
- package/src/trial/loupeSwitch.ts +15 -0
- package/dist/_dts/LayerList.d-DiuEArKq.d.ts +0 -83
- package/dist/_dts/PrefsRow.d-TOZ7BgD9.d.ts +0 -79
- package/dist/_dts/PropertyPanel.d-D-1paCbE.d.ts +0 -141
- package/dist/_dts/Select.d-Bensr_MT.d.ts +0 -579
- package/dist/_dts/index-B2Yj5aA0.d.ts +0 -274
- package/dist/chunk-275JRRVD.js.map +0 -1
- package/dist/chunk-4LJSC7MB.js +0 -143
- package/dist/chunk-4LJSC7MB.js.map +0 -1
- package/dist/chunk-7BO7HNGF.js.map +0 -1
- package/dist/chunk-CQLQPQ4P.js.map +0 -1
- package/dist/chunk-FMK7UQ6V.js.map +0 -1
- package/dist/chunk-FZ7YFQN7.js.map +0 -1
- package/dist/chunk-HXXTULDN.js.map +0 -1
- package/dist/chunk-I5DUQ5HM.js.map +0 -1
- package/dist/chunk-IJJUK4FU.js.map +0 -1
- package/dist/chunk-J7OWWTCW.js.map +0 -1
- package/dist/chunk-M7HP3FTK.js +0 -549
- package/dist/chunk-M7HP3FTK.js.map +0 -1
- package/dist/chunk-MIM5R4ZT.js +0 -14972
- package/dist/chunk-MIM5R4ZT.js.map +0 -1
- package/dist/chunk-RWNDDKOH.js.map +0 -1
- package/dist/chunk-T5IBSPAM.js.map +0 -1
- package/dist/chunk-UNAZSLWE.js.map +0 -1
- package/dist/chunk-WPLAANH4.js.map +0 -1
- package/dist/chunk-Y23G2VZL.js.map +0 -1
- package/dist/chunk-ZIFPHIWZ.js.map +0 -1
- package/src/primitives/useRovingTabIndex.test.ts +0 -48
- package/src/primitives/useRovingTabIndex.ts +0 -88
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/annotations/staleness.ts","../src/annotations/drawOne.ts","../src/annotations/capture.ts","../src/annotations/frac.ts","../src/annotations/history.ts","../src/annotations/store.ts","../src/annotations/view.ts","../src/annotations/AnnotationOverlay.tsx","../src/annotations/AnnotationTargets.tsx","../src/instrument/defineInstrument.ts","../src/instrument/validateConfigSchema.ts","../src/annotations/preload.ts","../src/theme/interstellar.theme.json","../src/theme/interstellar.ts","../src/canvas/cameraZoom.ts","../src/trial/TrialBody.tsx","../src/trial/TrialDragContext.ts","../src/trial/TrialTitleBar.tsx","../src/lab/panelHost.ts","../src/trial/UndockedSections.tsx","../src/trial/TrialChrome.tsx","../src/trial/Trial.tsx","../src/trial/trialOps.ts","../src/lab/fitCheck.ts","../src/lab/LabHeader.tsx","../src/lab/LabPalette.tsx","../src/lab/LabRoot.tsx","../src/lab/LabSwitcher.tsx","../src/lab/LabShell.tsx","../src/lab/LabZoom.tsx","../src/lab/Workspace.tsx","../src/lab/Lab.tsx","../src/lab/LabBoundary.tsx","../src/specimen/Specimen.tsx"],"names":["s","w","asNodeId","f","r","i","a","n","b","p","jsx","Fragment","createContext","useContext","jsxs","createPortal","c","auto","useSyncExternalStore","z","useStore","useState","useEffect","useRef","useMemo","l","E","x","WeaselProvider","DEFAULT_VIEW","y","bound","hit","addTrial","d","o","useCallback","noSubscribe","_","store","useResolvedColorMode","ThemeProvider","useLayoutEffect","m","useId","u","re","ie","S","j"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Whether a stored mark still describes the picture the current config\n * produces. A target names the config keys its positions depend on; labkit\n * snapshots and compares them without knowing what any of them mean.\n */\n\n/** The values of `keys` in `config`, for storing beside a new mark. Keys the\n * config does not carry are omitted rather than stored as undefined, so the\n * snapshot says what was known rather than what was asked. */\nexport function seenFrom(config: unknown, keys: readonly string[]): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n if (config === null || typeof config !== 'object') return out;\n const src = config as Record<string, unknown>;\n for (const k of keys) {\n if (k in src) out[k] = src[k];\n }\n return out;\n}\n\n/**\n * Whether the picture moved under the mark.\n *\n * Only keys present in `seen` are compared. A mark filed before its target\n * declared a new dependency must not go stale retroactively: nothing can know\n * what that key was at the time, and guessing would grey out every old mark\n * the first time a target grows a key.\n */\nexport function isStale(\n seen: Readonly<Record<string, unknown>> | undefined,\n config: unknown,\n keys: readonly string[],\n): boolean {\n if (!seen || keys.length === 0) return false;\n if (config === null || typeof config !== 'object') return false;\n const src = config as Record<string, unknown>;\n for (const k of keys) {\n if (!(k in seen)) continue;\n if (!Object.is(seen[k], src[k])) return true;\n }\n return false;\n}\n","import type { DrawCommand, SceneNode, View } from '@weasel-js/core';\nimport type { WorldRect } from './frac';\nimport { type MarkStyle, markCommands } from './paint';\nimport { isStale } from './staleness';\nimport type { AnnotationData, AnnotationMeaning } from './types';\n\n/** What resolving a mark's appearance needs beyond the mark itself. */\nexport interface MarkDrawOptions {\n /** The target's content box — the world a mark's geometry is in. */\n content: { w: number; h: number };\n /** The target's `positionDependsOn`, for staleness. */\n positionDependsOn?: readonly string[];\n /** The trial's config at the time of the draw. */\n config: unknown;\n /** The instrument's vocabulary, for a status's color. */\n meaning?: AnnotationMeaning;\n}\n\n/**\n * How one mark is drawn — shared by the pane on screen and by an export.\n *\n * One function rather than two call sites building their own, because an\n * export that resolves a status color or a stale dash differently from the\n * screen produces a picture nobody was looking at.\n */\nexport function createMarkDrawOne(\n opts: MarkDrawOptions,\n): (\n node: SceneNode<AnnotationData, 'marks', WorldRect>,\n pose: WorldRect,\n view: View,\n) => DrawCommand[] {\n return (node, pose) =>\n markCommands({ pose, data: node.data }, opts.content, resolveMarkStyle(node.data, opts));\n}\n\n/** How a mark looks, as opposed to where it is. Separate from the callback\n * above because an SVG export resolves the same appearance without ever\n * building a draw command. */\nexport function resolveMarkStyle(data: AnnotationData, opts: MarkDrawOptions): MarkStyle {\n return {\n color: opts.meaning?.statuses?.find((s) => s.id === data.status)?.color,\n // Read off the node rather than through the store's `isStale`, which\n // wants a projected Annotation this path does not have.\n stale: isStale(data.seen, opts.config, opts.positionDependsOn ?? []),\n };\n}\n","import { asNodeId, renderSceneToPixels } from '@weasel-js/core';\nimport { serializeSvg } from '@weasel-js/svg';\nimport { createMarkDrawOne, type MarkDrawOptions, resolveMarkStyle } from './drawOne';\nimport type { MarkScene } from './store';\nimport { markSvgNodes } from './svgNodes';\nimport type { AnnotationData, CaptureOptions, CaptureResult, CaptureSource } from './types';\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\n/** Which of the two composition routes an export takes. */\nexport type CapturePlan = 'svg-document' | 'raster-stack';\n\n/**\n * Vector all the way through, or both sides rasterized and stacked.\n *\n * An SVG base is the only one that nests: the marks serialize beside the\n * artifact's own markup and the whole document rasterizes once at the end. A\n * raster base, or none at all, takes the renderer's own path instead — which\n * is also what draws marks onto transparency for a target that declares no\n * base.\n */\nexport function capturePlan(base: CaptureSource | undefined, format: 'png' | 'svg'): CapturePlan {\n if (format === 'svg') return 'svg-document';\n return base?.kind === 'svg' ? 'svg-document' : 'raster-stack';\n}\n\n/** Re-frame a base's own `<svg>` onto the content box, keeping its `viewBox`.\n * Parsed rather than string-spliced: a base whose declared width disagrees\n * with its viewBox would otherwise land at the wrong scale. */\nfunction nestBaseSvg(markup: string, w: number, h: number): string {\n const doc = new DOMParser().parseFromString(markup, 'image/svg+xml');\n const root = doc.documentElement;\n if (doc.getElementsByTagName('parsererror').length > 0 || root.localName !== 'svg') {\n throw new Error(\"[labkit] a target's `base()` returned markup that is not an <svg> document\");\n }\n root.setAttribute('x', '0');\n root.setAttribute('y', '0');\n root.setAttribute('width', String(w));\n root.setAttribute('height', String(h));\n return new XMLSerializer().serializeToString(root);\n}\n\n/** A raster base as an `<image>` filling the content box. An external `src`\n * round-trips as a reference, so the export is only self-contained when it\n * is already a `data:` URI. */\nfunction embedRasterBase(\n base: CaptureSource,\n w: number,\n h: number,\n onWarn?: (m: string) => void,\n): string {\n const href =\n base.kind === 'canvas' ? base.canvas.toDataURL() : base.kind === 'image' ? base.src : '';\n if (base.kind === 'image' && !href.startsWith('data:')) {\n onWarn?.(`base image '${href}' is a reference, so this SVG is not self-contained`);\n }\n return serializeSvg([{ kind: 'image', href, x: 0, y: 0, width: w, height: h }], {\n viewBox: { x: 0, y: 0, width: w, height: h },\n });\n}\n\n/** Every mark on a scene, as SVG nodes, styled the way the pane styles them. */\nfunction markNodesOf(scene: MarkScene, draw: MarkDrawOptions) {\n return [...scene.renderOrder()].flatMap((id) => {\n const node = scene.get(asNodeId(String(id)));\n if (!node) return [];\n return markSvgNodes(\n { pose: node.pose, data: node.data as AnnotationData },\n draw.content,\n resolveMarkStyle(node.data as AnnotationData, draw),\n );\n });\n}\n\nexport interface ComposeSvgArgs {\n base?: CaptureSource;\n scene: MarkScene;\n draw: MarkDrawOptions;\n scale: number;\n onWarn?: (message: string) => void;\n}\n\n/**\n * The base and the marks in one SVG document.\n *\n * The outer `viewBox` is the content box, so marks — which are already in it —\n * need no transform, and `width`/`height` carry the export scale. Both halves\n * nest as child `<svg>` elements, which each establish their own viewport and\n * so keep their own `viewBox` maths out of this function.\n */\nexport function composeCaptureSvg(args: ComposeSvgArgs): string {\n const { base, scene, draw, scale, onWarn } = args;\n const { w, h } = draw.content;\n const baseXml =\n base === undefined\n ? ''\n : base.kind === 'svg'\n ? nestBaseSvg(base.markup, w, h)\n : embedRasterBase(base, w, h, onWarn);\n // No width/height on the marks document: a nested <svg> without them fills\n // the outer viewport exactly, which is the alignment this relies on.\n const marksXml = serializeSvg(markNodesOf(scene, draw), {\n viewBox: { x: 0, y: 0, width: w, height: h },\n onWarn,\n });\n const outW = Math.max(1, Math.round(w * scale));\n const outH = Math.max(1, Math.round(h * scale));\n return `<svg xmlns=\"${SVG_NS}\" width=\"${outW}\" height=\"${outH}\" viewBox=\"0 0 ${w} ${h}\">${baseXml}${marksXml}</svg>`;\n}\n\nfunction context2d(width: number, height: number): CanvasRenderingContext2D {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('[labkit] capture needs a 2D canvas context, and this one has none');\n return ctx;\n}\n\nfunction toPngBlob(canvas: HTMLCanvasElement): Promise<Blob> {\n return new Promise((resolve, reject) => {\n let done: (b: Blob | null) => void;\n try {\n done = (blob) =>\n blob ? resolve(blob) : reject(new Error('[labkit] the browser produced no PNG'));\n canvas.toBlob(done, 'image/png');\n } catch (err) {\n // A base referencing an image from another origin taints the canvas and\n // `toBlob` throws SecurityError. Name the cause: the DOM exception on\n // its own sends people looking at labkit.\n reject(\n new Error(\n '[labkit] the capture canvas is tainted, so it cannot be read back — a base referencing a cross-origin image does this. Embed it as a data: URI.',\n { cause: err },\n ),\n );\n }\n });\n}\n\nfunction loadImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = () => reject(new Error(`[labkit] a capture base failed to load: ${src}`));\n img.src = src;\n });\n}\n\n/** Rasterize a composed document by handing it to the browser's own SVG\n * renderer — one pass over base and marks together. */\nasync function rasterizeSvg(svg: string, width: number, height: number): Promise<Blob> {\n const url = URL.createObjectURL(new Blob([svg], { type: 'image/svg+xml;charset=utf-8' }));\n try {\n const img = await loadImage(url);\n const ctx = context2d(width, height);\n ctx.drawImage(img, 0, 0, width, height);\n return await toPngBlob(ctx.canvas);\n } finally {\n URL.revokeObjectURL(url);\n }\n}\n\n/** Base pixels, then mark pixels over them. The marks come from\n * `renderSceneToPixels` rather than a readback of the live surface, so a\n * capture neither depends on nor disturbs what is on screen. */\nasync function stackRaster(\n args: ComposeSvgArgs & { width: number; height: number },\n): Promise<Blob> {\n const { base, scene, draw, scale, width, height } = args;\n const ctx = context2d(width, height);\n if (base?.kind === 'image') ctx.drawImage(await loadImage(base.src), 0, 0, width, height);\n else if (base?.kind === 'canvas') ctx.drawImage(base.canvas, 0, 0, width, height);\n\n const raster = renderSceneToPixels({\n scene,\n sourceRect: { x: 0, y: 0, width: draw.content.w, height: draw.content.h },\n scale: { x: scale, y: scale },\n drawOne: createMarkDrawOne(draw),\n });\n // Through a second canvas rather than `putImageData` on this one, which\n // replaces pixels instead of compositing and would erase the base.\n const marks = context2d(raster.width, raster.height);\n marks.putImageData(\n new ImageData(Uint8ClampedArray.from(raster.data), raster.width, raster.height),\n 0,\n 0,\n );\n ctx.drawImage(marks.canvas, 0, 0, width, height);\n return toPngBlob(ctx.canvas);\n}\n\n/** What a capture needs about the target it is exporting. */\nexport interface CaptureArgs {\n target: string;\n scene: MarkScene;\n draw: MarkDrawOptions;\n base?: () => CaptureSource | Promise<CaptureSource>;\n onWarn?: (message: string) => void;\n}\n\n/** Export one target's picture with its marks on it. */\nexport async function captureTarget(\n args: CaptureArgs,\n opts: CaptureOptions = {},\n): Promise<CaptureResult> {\n const format = opts.format ?? 'png';\n const scale = opts.scale ?? 2;\n const { content } = args.draw;\n const width = Math.max(1, Math.round(content.w * scale));\n const height = Math.max(1, Math.round(content.h * scale));\n const base = await args.base?.();\n const compose: ComposeSvgArgs = {\n base,\n scene: args.scene,\n draw: args.draw,\n scale,\n onWarn: args.onWarn,\n };\n\n if (capturePlan(base, format) === 'raster-stack') {\n return {\n target: args.target,\n blob: await stackRaster({ ...compose, width, height }),\n format,\n width,\n height,\n };\n }\n\n const svg = composeCaptureSvg(compose);\n const blob =\n format === 'svg'\n ? new Blob([svg], { type: 'image/svg+xml;charset=utf-8' })\n : await rasterizeSvg(svg, width, height);\n return { target: args.target, blob, format, width, height };\n}\n","import type { FracPoint, FracRect } from './types';\n\n/** A mark's box in its target's world: CSS pixels at zoom 1. Matches weasel's\n * default `RectPose`, which is what the scene stores. */\nexport interface WorldRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/** Where a fraction lands on a content box of this size. */\nexport function fracToWorld(f: FracRect, content: { w: number; h: number }): WorldRect {\n return {\n x: f.x * content.w,\n y: f.y * content.h,\n width: f.w * content.w,\n height: f.h * content.h,\n };\n}\n\n/** What fraction of the content box a world rect covers.\n *\n * A pane measured before layout is 0×0, and dividing by that would seed every\n * stored position with `NaN` — which compares false against everything and so\n * fails silently rather than loudly. Zero sides give zeros. */\nexport function worldToFrac(r: WorldRect, content: { w: number; h: number }): FracRect {\n const sx = content.w === 0 ? 0 : 1 / content.w;\n const sy = content.h === 0 ? 0 : 1 / content.h;\n return { x: r.x * sx, y: r.y * sy, w: r.width * sx, h: r.height * sy };\n}\n\nconst DP = 10_000;\n\n/** Snap to 4dp. Positions are diffed by humans in stored documents, so the\n * last digits of a float are noise that hides the change that matters. */\nexport function roundFrac(f: FracRect): FracRect {\n return {\n x: Math.round(f.x * DP) / DP,\n y: Math.round(f.y * DP) / DP,\n w: Math.round(f.w * DP) / DP,\n h: Math.round(f.h * DP) / DP,\n };\n}\n\n/** Whether `pt` falls in `box`, widened by `tol` on every side so a hairline\n * mark stays reachable. */\nexport function fracContains(box: FracRect, pt: FracPoint, tol = 0): boolean {\n return (\n pt.x >= box.x - tol &&\n pt.x <= box.x + box.w + tol &&\n pt.y >= box.y - tol &&\n pt.y <= box.y + box.h + tol\n );\n}\n\n/** Whether `outer` wholly encloses `inner`. A marquee takes what it encloses,\n * not what it grazes — brushing selection is a different gesture, and this\n * answers false for two rects that merely overlap. */\nexport function fracEncloses(outer: FracRect, inner: FracRect): boolean {\n return (\n inner.x >= outer.x &&\n inner.y >= outer.y &&\n inner.x + inner.w <= outer.x + outer.w &&\n inner.y + inner.h <= outer.y + outer.h\n );\n}\n","import type { Scene } from '@weasel-js/core';\n\n/** What the ordering needs of a scene: its history depth, and the two moves. */\nexport interface HistoryScene {\n historyIndex(): number;\n undo(): boolean;\n redo(): boolean;\n canUndo(): boolean;\n canRedo(): boolean;\n}\n\n/**\n * One undo ordering over several scenes.\n *\n * Each target's marks live in their own scene and each scene owns its own undo\n * stack, so \"take back the last thing I did\" is a question no single scene can\n * answer. This keeps the order changes arrived in.\n *\n * The order is maintained from each scene's `historyIndex()`, not from its\n * subscribe callback: a scene notifies on ephemeral changes that are not\n * history at all, and an undo driven from inside a pane's own keymap has to\n * *move* this ordering rather than append to it.\n */\nexport class MarkHistory {\n private readonly depth = new Map<string, number>();\n private undoable: string[] = [];\n private redoable: string[] = [];\n /** Set while this class is driving, so a redo is not read as a new change. */\n private replaying: 'undo' | 'redo' | null = null;\n\n /** Start following `scene` under `target`. Idempotent per target. */\n track(target: string, scene: HistoryScene): void {\n if (this.depth.has(target)) return;\n this.depth.set(target, scene.historyIndex());\n }\n\n /** Call on every notification from `target`'s scene. */\n observe(target: string, scene: HistoryScene): void {\n const now = scene.historyIndex();\n const before = this.depth.get(target) ?? 0;\n this.depth.set(target, now);\n if (now > before) {\n if (this.replaying === 'redo') {\n drop(this.redoable, target);\n } else {\n // A change dropped whatever was redoable — weasel's own scene did the\n // same to its stack.\n this.redoable = [];\n }\n this.undoable.push(target);\n } else if (now < before) {\n drop(this.undoable, target);\n this.redoable.push(target);\n }\n }\n\n /** The target `undo` would act on, skipping any whose scene has nothing\n * left — a scene can drop entries this ordering still lists. */\n private next(\n stack: string[],\n can: (s: HistoryScene) => boolean,\n at: (t: string) => HistoryScene | undefined,\n ): string | null {\n for (let i = stack.length - 1; i >= 0; i--) {\n const target = stack[i];\n if (target === undefined) continue;\n const scene = at(target);\n if (scene && can(scene)) return target;\n }\n return null;\n }\n\n canUndo(at: (t: string) => HistoryScene | undefined): boolean {\n return this.next(this.undoable, (s) => s.canUndo(), at) !== null;\n }\n\n canRedo(at: (t: string) => HistoryScene | undefined): boolean {\n return this.next(this.redoable, (s) => s.canRedo(), at) !== null;\n }\n\n undo(at: (t: string) => HistoryScene | undefined): boolean {\n const target = this.next(this.undoable, (s) => s.canUndo(), at);\n const scene = target === null ? undefined : at(target);\n if (!scene) return false;\n this.replaying = 'undo';\n try {\n return scene.undo();\n } finally {\n this.replaying = null;\n }\n }\n\n redo(at: (t: string) => HistoryScene | undefined): boolean {\n const target = this.next(this.redoable, (s) => s.canRedo(), at);\n const scene = target === null ? undefined : at(target);\n if (!scene) return false;\n this.replaying = 'redo';\n try {\n return scene.redo();\n } finally {\n this.replaying = null;\n }\n }\n}\n\n/** Remove the last occurrence of `value`, in place. */\nfunction drop(stack: string[], value: string): void {\n for (let i = stack.length - 1; i >= 0; i--) {\n if (stack[i] === value) {\n stack.splice(i, 1);\n return;\n }\n }\n}\n\n/** A `Scene` satisfies `HistoryScene`; this names the narrowing once. */\nexport const asHistoryScene = (scene: Scene<never, never, never> | HistoryScene): HistoryScene =>\n scene as HistoryScene;\n","import {\n asNodeId,\n createScene,\n type Scene,\n type SerializedScene,\n sceneFromJSON,\n} from '@weasel-js/core';\nimport { captureTarget } from './capture';\nimport { type MarkDrawOptions, resolveMarkStyle } from './drawOne';\nimport type { WorldRect } from './frac';\nimport { fracContains, fracEncloses, fracToWorld, roundFrac, worldToFrac } from './frac';\nimport { MarkHistory } from './history';\nimport { isStale as isStaleAgainst, seenFrom } from './staleness';\nimport type {\n Annotation,\n AnnotationData,\n AnnotationInit,\n AnnotationMeaning,\n AnnotationPatch,\n AnnotationQuery,\n AnnotationsApi,\n AnnotationTargetInfo,\n CaptureOptions,\n CaptureResult,\n FracPoint,\n FracRect,\n SerializedAnnotations,\n} from './types';\n\n/** A mark's box in its target's world. Matches weasel's default `RectPose`. */\ntype MarkPose = WorldRect;\n\n/** The scene one target's marks live in. */\nexport type MarkScene = Scene<AnnotationData, 'marks', MarkPose>;\n\n/** A mark scene: one layer, because marks do not stack in tiers. */\nexport function createAnnotationScene(): MarkScene {\n return createScene<AnnotationData, 'marks', MarkPose>({ systemLayers: [{ id: 'marks' }] });\n}\n\nexport interface AnnotationStoreOptions {\n /** Re-read on every call, so a target resizing or gaining a dependency takes\n * effect without rebuilding the store. */\n targets: () => readonly AnnotationTargetInfo[];\n /** Serialized scenes from a previous `toJSON`, keyed by target. */\n restore?: Readonly<Record<string, unknown>>;\n /** The instrument's vocabulary, so an export draws a mark in the color its\n * status gives it. A thunk is read at each capture, for a vocabulary that\n * changes under a store built once. */\n meaning?: AnnotationMeaning | (() => AnnotationMeaning | undefined);\n /** The trial's live config. A getter for the same reason `targets` is: the\n * store is built once and the config changes under it. */\n config?: () => unknown;\n /** Notified after every finished export. */\n onCapture?: (result: CaptureResult) => void;\n}\n\n/** Everything a capture needs that is not the store's own state. Split out so\n * `capture.ts` takes data rather than reaching back into the store. */\nexport interface CaptureDeps {\n scene: MarkScene;\n target: AnnotationTargetInfo;\n meaning?: AnnotationMeaning;\n config: unknown;\n}\n\nconst NO_CONTENT = { w: 0, h: 0 };\n\n/** A mark's id is its target and its node. One scene per target, so a node id\n * is only unique within one — and an annotation is addressed by both. */\nfunction splitId(id: string): { target: string; node: string } | undefined {\n const at = id.lastIndexOf('/');\n return at <= 0 ? undefined : { target: id.slice(0, at), node: id.slice(at + 1) };\n}\n\n/**\n * A facade over one weasel scene per target: the scenes are the truth, this\n * answers questions about them. Everything crossing this boundary is in\n * fractions of a target's content box; the scenes hold world units.\n *\n * A scene per target rather than one scene with a `target` field, because a\n * pane's hit-test, marquee and paint all walk the whole scene it is given and\n * take no filter — one shared scene puts every other pane's marks under the\n * pointer.\n */\nexport function createAnnotationStore(opts: AnnotationStoreOptions): AnnotationsApi {\n const { targets, restore } = opts;\n const scenes = new Map<string, MarkScene>();\n const subs = new Set<() => void>();\n const history = new MarkHistory();\n const notify = (): void => {\n for (const fn of subs) fn();\n };\n\n const sceneFor = (target: string): MarkScene => {\n const known = scenes.get(target);\n if (known) return known;\n const raw = restore?.[target];\n const scene = raw\n ? sceneFromJSON<AnnotationData, 'marks', MarkPose>(\n raw as SerializedScene<AnnotationData, 'marks', MarkPose>,\n {},\n )\n : createAnnotationScene();\n scenes.set(target, scene);\n history.track(target, scene);\n scene.subscribe(() => {\n history.observe(target, scene);\n notify();\n });\n return scene;\n };\n\n /** Only for scenes that exist: asking for one would create it, and the\n * ordering never names a target it has not seen. */\n const historySceneAt = (target: string) => scenes.get(target);\n\n // Restored scenes are materialized up front: everything below reads\n // `scenes`, and a mark that only appears once its pane asks for its scene is\n // a mark a sidebar cannot list.\n for (const target of Object.keys(restore ?? {})) sceneFor(target);\n\n const targetOf = (id: string): AnnotationTargetInfo | undefined =>\n targets().find((t) => t.id === id);\n\n const contentOf = (id: string) => targetOf(id)?.content ?? NO_CONTENT;\n /** How a target's marks are drawn right now — one answer for the pane, an\n * export and an overview, so none can disagree on a color or a dash. */\n const drawOptionsFor = (info: AnnotationTargetInfo): MarkDrawOptions => ({\n content: info.content,\n positionDependsOn: info.positionDependsOn,\n config: opts.config?.(),\n meaning: typeof opts.meaning === 'function' ? opts.meaning() : opts.meaning,\n });\n\n const project = (target: string, node: string): Annotation | undefined => {\n const found = scenes.get(target)?.get(asNodeId(node));\n if (!found) return undefined;\n return {\n ...found.data,\n target,\n id: `${target}/${node}`,\n frac: roundFrac(worldToFrac(found.pose as MarkPose, contentOf(target))),\n };\n };\n\n /** Every target with a scene, in declaration order — then any whose target\n * the instrument has since stopped declaring, so its marks are not lost. */\n const liveTargets = (): string[] => {\n const declared = targets().map((t) => t.id);\n const rest = [...scenes.keys()].filter((id) => !declared.includes(id));\n return [...declared, ...rest];\n };\n\n const marksOn = (target: string): Annotation[] => {\n const scene = scenes.get(target);\n if (!scene) return [];\n const out: Annotation[] = [];\n for (const id of scene.renderOrder()) {\n const a = project(target, String(id));\n if (a) out.push(a);\n }\n return out;\n };\n\n const all = (): Annotation[] => liveTargets().flatMap(marksOn);\n\n const matches = (a: Annotation, q: AnnotationQuery): boolean => {\n if (q.target !== undefined && a.target !== q.target) return false;\n if (q.kind !== undefined && a.kind !== q.kind) return false;\n if (q.status !== undefined && a.status !== q.status) return false;\n if (q.tags !== undefined) {\n const have = a.tags ?? [];\n for (const t of q.tags) if (!have.includes(t)) return false;\n }\n if (q.where && !q.where(a)) return false;\n return true;\n };\n\n /** The node behind a public id, or undefined. */\n const nodeOf = (id: string) => {\n const parts = splitId(id);\n if (!parts) return undefined;\n const scene = scenes.get(parts.target);\n const node = scene?.get(asNodeId(parts.node));\n return node && scene ? { ...parts, scene, node } : undefined;\n };\n\n return {\n sceneFor,\n\n targets,\n\n get(id) {\n const parts = splitId(id);\n return parts ? project(parts.target, parts.node) : undefined;\n },\n\n query(q) {\n return q ? all().filter((a) => matches(a, q)) : all();\n },\n\n hitTest(target, pt: FracPoint, tol = 0) {\n return marksOn(target)\n .filter((a) => fracContains(a.frac, pt, tol))\n .reverse();\n },\n\n within(target, box: FracRect) {\n return marksOn(target).filter((a) => fracEncloses(box, a.frac));\n },\n\n isStale(a, config) {\n const keys = targetOf(a.target)?.positionDependsOn ?? [];\n return isStaleAgainst(a.seen, config, keys);\n },\n\n canUndo() {\n return history.canUndo(historySceneAt);\n },\n\n canRedo() {\n return history.canRedo(historySceneAt);\n },\n\n undo() {\n return history.undo(historySceneAt);\n },\n\n redo() {\n return history.redo(historySceneAt);\n },\n\n selection() {\n const out: string[] = [];\n for (const target of liveTargets()) {\n const scene = scenes.get(target);\n if (!scene) continue;\n for (const node of scene.getSelection()) {\n if (scene.get(node)) out.push(`${target}/${String(node)}`);\n }\n }\n return out;\n },\n\n setSelection(ids) {\n const wanted = new Map<string, string[]>();\n for (const id of ids) {\n const found = nodeOf(id);\n if (!found) continue;\n const node = String(found.node.id);\n const on = wanted.get(found.target);\n if (!on) wanted.set(found.target, [node]);\n else if (!on.includes(node)) on.push(node);\n }\n for (const [target, scene] of scenes) {\n const next = wanted.get(target) ?? [];\n const now = scene.getSelection();\n if (now.length === next.length && next.every((n, i) => String(now[i]) === n)) continue;\n scene.setSelection(next.map(asNodeId));\n }\n },\n\n subscribe(fn) {\n subs.add(fn);\n return () => {\n subs.delete(fn);\n };\n },\n\n add(init: AnnotationInit, config?: unknown) {\n const target = targetOf(init.target);\n const data: AnnotationData = {\n target: init.target,\n kind: init.kind,\n ...(init.points ? { points: init.points } : {}),\n ...(init.title !== undefined ? { title: init.title } : {}),\n ...(init.status !== undefined ? { status: init.status } : {}),\n ...(init.tags !== undefined ? { tags: init.tags } : {}),\n ...(init.meta !== undefined ? { meta: init.meta } : {}),\n seen: seenFrom(config, target?.positionDependsOn ?? []),\n };\n const node = sceneFor(init.target).add({\n kind: 'leaf',\n layer: 'marks',\n pose: fracToWorld(roundFrac(init.frac), target?.content ?? NO_CONTENT),\n data,\n });\n return `${init.target}/${String(node)}`;\n },\n\n update(id, patch: AnnotationPatch) {\n const found = nodeOf(id);\n if (!found) return;\n const { frac, ...meaning } = patch;\n const nid = asNodeId(found.node.id);\n if (Object.keys(meaning).length > 0) {\n found.scene.update(nid, { data: { ...found.node.data, ...meaning } });\n }\n if (frac) {\n found.scene.setPose(nid, fracToWorld(roundFrac(frac), contentOf(found.target)));\n }\n },\n\n setMeta(id, meta) {\n const found = nodeOf(id);\n if (!found) return;\n found.scene.update(asNodeId(found.node.id), { data: { ...found.node.data, meta } });\n },\n\n remove(id) {\n const found = nodeOf(id);\n if (found) found.scene.remove(asNodeId(found.node.id));\n },\n\n paintedMarks(target) {\n const info = targetOf(target);\n const scene = scenes.get(target);\n if (!info || !scene) return [];\n const draw = drawOptionsFor(info);\n return [...scene.renderOrder()].flatMap((id) => {\n const node = scene.get(asNodeId(String(id)));\n if (!node) return [];\n const data = node.data as AnnotationData;\n return [\n { mark: { pose: node.pose as MarkPose, data }, style: resolveMarkStyle(data, draw) },\n ];\n });\n },\n\n async capture(target: string, captureOpts?: CaptureOptions) {\n const info = targetOf(target);\n if (!info) throw new Error(`[labkit] no annotation target called '${target}'`);\n const result = await captureTarget(\n {\n target,\n scene: sceneFor(target),\n draw: drawOptionsFor(info),\n base: info.base,\n onWarn: (message) => console.warn(`[labkit] capture: ${message}`),\n },\n captureOpts,\n );\n opts.onCapture?.(result);\n return result;\n },\n\n toJSON(): SerializedAnnotations {\n const out: Record<string, unknown> = {};\n for (const [target, scene] of scenes) out[target] = scene.toJSON();\n return { version: 1, scenes: out };\n },\n };\n}\n\n/** Rebuild a store from what `toJSON` wrote. Unknown or future versions give\n * an empty store rather than throwing: a lab that cannot read its marks\n * should still open. */\nexport function annotationsFromJSON(\n raw: unknown,\n targets: () => readonly AnnotationTargetInfo[],\n rest: Omit<AnnotationStoreOptions, 'targets' | 'restore'> = {},\n): AnnotationsApi {\n const doc = raw as Partial<SerializedAnnotations> | null;\n if (doc?.version !== 1 || !doc.scenes) return createAnnotationStore({ targets, ...rest });\n return createAnnotationStore({ targets, restore: doc.scenes, ...rest });\n}\n","import type { View } from '@weasel-js/core';\nimport type { ViewTransform } from '../instrument/types';\n\n/** A target's world in CSS pixels: the box its fractions are fractions of. */\nexport interface ContentSize {\n w: number;\n h: number;\n}\n\n/** A target's drawn box on the surface, in CSS pixels. */\nexport interface PaneSize {\n w: number;\n h: number;\n}\n\n/** labkit's camera in weasel's shape. Zoom is uniform, so it lands on both\n * scale axes; pan is weasel's translation unchanged. */\nexport function toWeaselView(v: ViewTransform): View {\n return { x: v.pan.x, y: v.pan.y, scale: { x: v.zoom, y: v.zoom } };\n}\n\n/** The inverse. A weasel view with unequal axis scales collapses to its x —\n * labkit's camera has one zoom and cannot hold the other. */\nexport function fromWeaselView(v: View): ViewTransform {\n return { zoom: v.scale.x, pan: { x: v.x, y: v.y } };\n}\n\n/**\n * The camera a target with none of its own draws through: its content box\n * scaled to fit the box it is drawn in, anchored at the origin.\n *\n * The spec calls the camera \"a plain scale\" at zoom 1; zoom 1 is only right\n * when the pane happens to be the content's size, and a mark drawn on a\n * scaled-down pane otherwise lands outside it.\n */\nexport function fitView(content: ContentSize, pane: PaneSize): ViewTransform {\n const zoom =\n content.w > 0 && content.h > 0 ? Math.min(pane.w / content.w, pane.h / content.h) : 1;\n return { zoom: Number.isFinite(zoom) && zoom > 0 ? zoom : 1, pan: { x: 0, y: 0 } };\n}\n","import {\n type InsertNodeFactory,\n SceneCanvas,\n type SceneCanvasApi,\n useActiveToolContext,\n type View,\n WeaselProvider,\n} from '@weasel-js/core';\nimport { type CSSProperties, useCallback, useContext, useEffect, useRef, useState } from 'react';\nimport { createPortal, flushSync } from 'react-dom';\nimport { CameraWheelContext } from '../canvas/CameraWheelContext';\nimport type { Rect } from '../surface/rect';\nimport { useSurfaceCanvas, useSurfaceOptional, useTileId } from '../surface/useSurfaceTile';\nimport { createMarkDrawOne } from './drawOne';\nimport type { WorldRect } from './frac';\nimport { seenFrom } from './staleness';\nimport type { MarkScene } from './store';\nimport { ANNOTATION_WEASEL_TOOLS, annotationToolInfo } from './toolMap';\nimport type {\n AnnotationData,\n AnnotationKind,\n AnnotationMeaning,\n AnnotationTarget,\n FracPoint,\n} from './types';\nimport { fitView, toWeaselView } from './view';\n\n/** Props for `<AnnotationOverlay>`. */\nexport interface AnnotationOverlayProps {\n target: AnnotationTarget;\n /** The trial's mark scene — shared by every target; a mark's own `target`\n * field is what separates them. */\n scene: MarkScene;\n /** Snapshotted onto each new mark, so staleness can be answered later. */\n config: unknown;\n /** The trial's resolved tool slot. */\n activeToolId: string | null;\n /** The instrument's vocabulary, for a status's color. */\n meaning?: AnnotationMeaning;\n}\n\nconst sameRect = (a: Rect | null, b: Rect): boolean =>\n a !== null && a.x === b.x && a.y === b.y && a.w === b.w && a.h === b.h;\n\n/** Pushes the trial's tool into the weasel scope this pane owns. Its own\n * component because the context only exists below `<WeaselProvider>`. */\nfunction ToolBridge({ toolId }: { toolId: string }) {\n const tools = useActiveToolContext();\n const setActive = tools.setActive;\n useEffect(() => {\n setActive(toolId);\n }, [toolId, setActive]);\n return null;\n}\n\n/** Every vertex the insert carried, in fractions of the content box. */\nfunction pointsOf(\n extras: Record<string, unknown>,\n content: { w: number; h: number },\n): readonly FracPoint[] | undefined {\n const toFrac = (p: { x: number; y: number }): FracPoint => ({\n x: content.w === 0 ? 0 : p.x / content.w,\n y: content.h === 0 ? 0 : p.y / content.h,\n });\n if (extras.kind === 'line') {\n return [toFrac(extras.a as FracPoint), toFrac(extras.b as FracPoint)];\n }\n if (extras.kind === 'pencil') {\n return (extras.samples as { x: number; y: number }[]).map(toFrac);\n }\n return undefined;\n}\n\n/**\n * One target's drawing surface: a transparent box over the target's element\n * taking the input, and a `<SceneCanvas>` painting into the lab's shared\n * buffer at that box's rect.\n *\n * The box is portalled into the surface container because that is what tile\n * rects are measured against; positioning it among the instrument's own DOM\n * would put it in whatever positioning context happened to be there.\n */\nexport function AnnotationOverlay({\n target,\n scene,\n config,\n activeToolId,\n meaning,\n}: AnnotationOverlayProps) {\n const surface = useSurfaceOptional();\n const canvas = useSurfaceCanvas();\n const [rect, setRect] = useState<Rect | null>(null);\n const [input, setInput] = useState<HTMLDivElement | null>(null);\n const sceneCanvas = useRef<SceneCanvasApi | null>(null);\n\n // Read in the insert factory, which is built once and must see the tool the\n // pane is holding now — `arrow` and `stroke` are indistinguishable from\n // `line` and `pencil` at the weasel end.\n const toolRef = useRef(activeToolId);\n toolRef.current = activeToolId;\n const configRef = useRef(config);\n configRef.current = config;\n\n const id = target.id;\n // The surface's tile namespace is the whole lab's, and every trial of an\n // instrument declares the same target ids — so the tile is registered under\n // the trial-scoped key, not under `id`.\n const tileId = useTileId(id);\n const lastTile = useRef<HTMLElement | null>(null);\n useEffect(() => {\n const el = target.ref.current ?? null;\n if (el === lastTile.current) return;\n lastTile.current = el;\n surface?.registerTile(tileId, el);\n });\n useEffect(\n () => () => {\n // Clearing this is what lets the effect above re-register on the next\n // commit. StrictMode's mount / unmount / mount would otherwise take the\n // tile out and never put it back, and the surface would measure nothing.\n lastTile.current = null;\n surface?.registerTile(tileId, null);\n },\n [surface, tileId],\n );\n\n // Erases the whole shared buffer when the tiles move: a tile that moved took\n // its scissor with it, and what it painted last frame stays where it was.\n // Each renderer on the context re-applies its viewport and scissor per frame,\n // so resetting them here is safe.\n // Only once this pane has painted: a bare `getContext` on a buffer no\n // renderer has opened creates the context without the stencil buffer marks\n // need, and every later request gets that context back.\n const painted = useRef(false);\n const canvasRef = useRef(canvas);\n if (canvasRef.current !== canvas) painted.current = false;\n canvasRef.current = canvas;\n const unsubscribeFrame = useRef<(() => void) | null>(null);\n const attachSceneCanvas = useCallback((api: SceneCanvasApi | null) => {\n sceneCanvas.current = api;\n unsubscribeFrame.current?.();\n unsubscribeFrame.current = api\n ? api.subscribeFrame(() => {\n painted.current = true;\n })\n : null;\n }, []);\n useEffect(() => {\n if (!surface) return;\n return surface.registerClear(tileId, (size, dpr) => {\n if (!painted.current) return;\n const gl = canvasRef.current?.getContext('webgl2');\n if (!gl) return;\n gl.disable(gl.SCISSOR_TEST);\n gl.viewport(0, 0, Math.round(size.width * dpr), Math.round(size.height * dpr));\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);\n });\n }, [surface, tileId]);\n\n // The box is portalled out of whatever the picture sits in, so a wheel over\n // a mark would never reach the trial's camera without being handed to it.\n const wheelSlot = useContext(CameraWheelContext);\n useEffect(() => {\n if (!input || !wheelSlot) return;\n const wheel = (e: WheelEvent): void => wheelSlot.current?.(e);\n input.addEventListener('wheel', wheel, { passive: false });\n return () => input.removeEventListener('wheel', wheel);\n }, [input, wheelSlot]);\n\n useEffect(\n () =>\n surface?.registerPainter(tileId, (next) => {\n // Committed before the redraw is asked for: the renderer reads its\n // position from the last render, so a redraw landing first repaints the\n // tile where it was — after this frame's clear, which leaves a ghost.\n flushSync(() => setRect((prev) => (sameRect(prev, next) ? prev : next)));\n // The shared buffer was cleared if it resized this frame; this pane's\n // own loop has no way to know that.\n sceneCanvas.current?.requestRedraw();\n }),\n [surface, tileId],\n );\n\n const container = surface?.getContainer() ?? null;\n if (!container || !rect) return null;\n\n const view: View = toWeaselView(target.view ?? fitView(target.content, { w: rect.w, h: rect.h }));\n\n const drawOne = createMarkDrawOne({\n content: target.content,\n positionDependsOn: target.positionDependsOn,\n config,\n meaning,\n });\n\n const factories: Record<string, InsertNodeFactory> = {};\n for (const weaselTool of ANNOTATION_WEASEL_TOOLS) {\n factories[weaselTool] = (_bounds, extras) => {\n const info = annotationToolInfo(toolRef.current);\n const kind: AnnotationKind | undefined = info?.kind;\n if (!kind) return null;\n const points = pointsOf(extras as unknown as Record<string, unknown>, target.content);\n const data: AnnotationData = {\n target: id,\n kind,\n ...(points ? { points } : {}),\n seen: seenFrom(configRef.current, target.positionDependsOn ?? []),\n };\n return { data };\n };\n }\n\n // A measured rect has nowhere to live but the element's own style. Set as\n // custom properties, which the stylesheet reads — the sanctioned use.\n const box = {\n ['--lk-anno-x' as string]: `${rect.x}px`,\n ['--lk-anno-y' as string]: `${rect.y}px`,\n ['--lk-anno-w' as string]: `${rect.w}px`,\n ['--lk-anno-h' as string]: `${rect.h}px`,\n } as CSSProperties;\n\n return createPortal(\n <>\n <div\n ref={setInput}\n className=\"lk-annotate__input\"\n data-annotation-target={id}\n // Pass-through while the rail holds a tool that makes no marks, so the\n // instrument under the overlay stays clickable.\n data-idle={annotationToolInfo(activeToolId) ? undefined : ''}\n role=\"application\"\n aria-label={`Annotations on ${id}`}\n // biome-ignore lint/a11y/noNoninteractiveTabindex: role=\"application\" IS the interactive case — a region with its own keymap. The rule's allowed-role list stops at the native widget roles and does not include it, and the gesture dispatcher listens on this element, so without focus no tool's keyboard binding ever fires.\n tabIndex={0}\n style={box}\n />\n {canvas && input ? (\n // Isolated so each pane keeps its own selection and tool.\n <WeaselProvider isolate>\n <ToolBridge toolId={annotationToolInfo(activeToolId)?.weaselTool ?? 'select'} />\n <SceneCanvas<AnnotationData, 'marks', WorldRect>\n features={['pick', 'move', 'transform', 'edit']}\n ref={attachSceneCanvas}\n scene={scene}\n width={rect.w}\n height={rect.h}\n view={view}\n paintInto={{ canvas, x: rect.x, y: rect.y }}\n inputElement={input}\n defaultTools={ANNOTATION_WEASEL_TOOLS}\n insertNodeFactories={factories}\n layers={{ scene: { drawOne } }}\n />\n </WeaselProvider>\n ) : null}\n </>,\n container,\n );\n}\n","import type { TrialInfo } from '../state/types';\nimport { AnnotationOverlay } from './AnnotationOverlay';\nimport type { AnnotationsApi, AnnotationsCapability } from './types';\n\n/** Props for `<AnnotationTargets>`. */\nexport interface AnnotationTargetsProps {\n capability: AnnotationsCapability;\n state: unknown;\n config: unknown;\n /** The trial these targets belong to. `capability.targets` is told it, so a\n * consumer holding per-trial refs can hand back this trial's. */\n trial: TrialInfo;\n annotations: AnnotationsApi;\n activeToolId: string | null;\n}\n\n/** One overlay per region the instrument said accepts marks. */\nexport function AnnotationTargets({\n capability,\n state,\n config,\n trial,\n annotations,\n activeToolId,\n}: AnnotationTargetsProps) {\n const targets = capability.targets(state, config, trial);\n\n return (\n <>\n {targets.map((t) => (\n <AnnotationOverlay\n key={t.id}\n target={t}\n scene={annotations.sceneFor(t.id)}\n meaning={capability.meaning}\n config={config}\n activeToolId={activeToolId}\n />\n ))}\n </>\n );\n}\n","import type { ConfigSchema } from '../config/types';\nimport type { Instrument } from './types';\n\n/** An instrument as it is written: either the legacy `defaultConfig` (plus an\n * optional `configSchema`), or a `config` schema that supplies both. */\nexport type InstrumentSpec<TS, TC, TItem = unknown> =\n | Instrument<TS, TC, TItem>\n | (Omit<Instrument<TS, TC, TItem>, 'defaultConfig'> & { config: ConfigSchema<TC> });\n\n/**\n * Normalizes an instrument spec, and infers its state and config types from\n * the literal rather than making them be written out.\n *\n * A spec declaring `config` gets its `defaultConfig` synthesized from the\n * schema, so nothing downstream branches on which way the config was\n * declared. A spec written the legacy way is returned unchanged, by\n * reference.\n *\n * Resolving the schema into controls does not happen here: rules are\n * lab-scoped and this runs at module load. `useConfigSchema` does that.\n *\n * TypeScript infers all three type arguments or none, so a call that names\n * `TS` and `TC` leaves `TItem` at `unknown` and a job's `onItem` needs a cast.\n * Name the item type too, or pass no type arguments at all.\n */\nexport function defineInstrument<TS, TC, TItem = unknown>(\n spec: InstrumentSpec<TS, TC, TItem>,\n): Instrument<TS, TC, TItem> {\n if (spec.config && !('defaultConfig' in spec && spec.defaultConfig)) {\n const schema = spec.config;\n return { ...spec, defaultConfig: () => schema.defaults() } as Instrument<TS, TC, TItem>;\n }\n return spec as Instrument<TS, TC, TItem>;\n}\n","import type { ConfigField } 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\n/** Check a config schema for the mistakes that would otherwise surface as a\n * silently broken control: empty or duplicate keys, and fields whose own\n * constraints do not hold.\n *\n * An unrecognized type is not an error — a lab supplies controls for its own\n * kinds through `ControlPanel`'s `renderers`, and this cannot see them. Such\n * a field simply has no constraints to check here. */\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 (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","import { createContext } from 'react';\n\n/** Marks an instrument keeps in its own `AnnotationStorage`, already loaded by\n * `<Lab>` for the trials present when it opened, keyed by trial id. A trial\n * missing from it loads its own. */\nexport const AnnotationPreloadContext = createContext<ReadonlyMap<string, unknown> | null>(null);\n","{\n \"name\": \"interstellar\",\n \"extends\": \"weasel\",\n \"pins\": {\n \"radius-md\": {\n \"value\": \"6px\",\n \"type\": \"dimension\"\n },\n \"glass-blur\": {\n \"value\": \"12px\",\n \"type\": \"dimension\"\n },\n \"font-weight-light\": {\n \"value\": 300,\n \"type\": \"fontWeight\"\n },\n \"font-weight-medium\": {\n \"value\": 500,\n \"type\": \"fontWeight\"\n },\n \"font-weight-bold\": {\n \"value\": 700,\n \"type\": \"fontWeight\"\n },\n \"surface\": {\n \"by\": \"mode\",\n \"dark\": {\n \"value\": \"#0a0a14\",\n \"type\": \"color\"\n }\n },\n \"surface-raised\": {\n \"by\": \"mode\",\n \"dark\": {\n \"value\": \"rgba(20, 20, 36, 0.55)\",\n \"type\": \"color\"\n }\n },\n \"surface-sunken\": {\n \"by\": \"mode\",\n \"dark\": {\n \"value\": \"#02020a\",\n \"type\": \"color\"\n }\n },\n \"border\": {\n \"by\": \"mode\",\n \"dark\": {\n \"value\": \"rgba(255, 255, 255, 0.14)\",\n \"type\": \"color\"\n }\n },\n \"line-subtle\": {\n \"by\": \"mode\",\n \"dark\": {\n \"value\": \"rgba(255, 255, 255, 0.08)\",\n \"type\": \"color\"\n }\n },\n \"fg\": {\n \"by\": \"mode\",\n \"dark\": {\n \"value\": \"#e8e8f0\",\n \"type\": \"color\"\n }\n },\n \"fg-muted\": {\n \"by\": \"mode\",\n \"dark\": {\n \"value\": \"#a8a8c0\",\n \"type\": \"color\"\n }\n },\n \"fg-subtle\": {\n \"by\": \"mode\",\n \"dark\": {\n \"value\": \"#5a5a78\",\n \"type\": \"color\"\n }\n },\n \"accent\": {\n \"by\": \"mode\",\n \"dark\": {\n \"value\": \"#4f46e5\",\n \"type\": \"color\"\n }\n },\n \"accent-hover\": {\n \"by\": \"mode\",\n \"dark\": {\n \"value\": \"#6d5dfc\",\n \"type\": \"color\"\n }\n },\n \"accent-strong\": {\n \"by\": \"mode\",\n \"dark\": {\n \"value\": \"#7474fe\",\n \"type\": \"color\"\n }\n },\n \"focus-ring\": {\n \"by\": \"mode\",\n \"dark\": {\n \"value\": \"rgba(116, 116, 254, 0.5)\",\n \"type\": \"color\"\n }\n },\n \"shadow\": {\n \"by\": \"mode\",\n \"dark\": {\n \"value\": \"rgba(0, 0, 0, 0.7)\",\n \"type\": \"color\"\n }\n },\n \"border-strong\": {\n \"by\": \"mode\",\n \"dark\": {\n \"value\": \"rgba(255, 255, 255, 0.36)\",\n \"type\": \"color\"\n }\n },\n \"backdrop\": {\n \"by\": \"mode\",\n \"dark\": {\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 \"type\": \"gradient\"\n }\n }\n }\n}\n","import { defineTheme, type Theme, type ThemeInput, weaselTheme } from '@weasel-js/theme';\nimport definition from './interstellar.theme.json' with { type: 'json' };\n\n/**\n * labkit's theme: a cosmic dark over the built-in weasel theme, whose light\n * mode it keeps as is. A pins-only theme definition: nothing in it is\n * derived, so it loads without the engine.\n */\nexport const interstellarTheme: Theme = defineTheme({\n ...definition,\n extends: weaselTheme,\n} as ThemeInput);\n","import type { View } from '@weasel-js/core';\nimport type { CameraView } from './CameraInput';\n\n/** `view` at `scale`, about the screen point `at`. */\nexport function atScale(view: View, scale: number, at: { x: number; y: number }): View {\n return {\n x: view.x + at.x / view.scale.x - at.x / scale,\n y: view.y + at.y / view.scale.y - at.y / scale,\n scale: { x: scale, y: scale },\n };\n}\n\n/** The middle of the camera's host, in its own screen space; the origin when it cannot measure. */\nexport function viewMiddle(camera: CameraView): { x: number; y: number } {\n const size = camera.hostSize?.();\n return size ? { x: size.width / 2, y: size.height / 2 } : { x: 0, y: 0 };\n}\n\n/** Zoom `camera` to `zoom` about the middle of its view, within its range. */\nexport function zoomCameraTo(camera: CameraView, zoom: number): void {\n const { min, max } = camera.zoomRange();\n const scale = Math.min(max, Math.max(min, zoom));\n camera.set(atScale(camera.get(), scale, viewMiddle(camera)));\n}\n","import type { ReactNode } from 'react';\nimport { Split, type SplitProps } from '../primitives/Split';\n\n/** Props for `<TrialBody>`. */\nexport interface TrialBodyProps\n extends Omit<SplitProps, 'sidebar' | 'children' | 'className' | 'sidebarClassName' | 'label'> {\n /** The sidebar region's sections. */\n sidebar: ReactNode;\n /** The instrument's own output. */\n children: ReactNode;\n /** Extra class on the content pane — `Trial` marks a canvas instrument's\n * well flush. */\n contentClassName?: string;\n}\n\n/** A trial's sidebar and content as a `Split`, wearing the trial's classes. */\nexport function TrialBody({ sidebar, children, contentClassName, ...rest }: TrialBodyProps) {\n return (\n <Split\n {...rest}\n sidebar={sidebar}\n className=\"lk-trial__panes\"\n sidebarClassName=\"lk-trial__sidebar\"\n contentClassName={\n contentClassName ? `lk-trial__content ${contentClassName}` : 'lk-trial__content'\n }\n >\n {children}\n </Split>\n );\n}\n","import { createContext, useContext } from 'react';\nimport type { NodeId } from 'windease';\n\n/** Supplied by `<Workspace>` when trials are reorderable, so a trial's title\n * bar can be the drag surface. Null when reordering is off. */\nexport const TrialDragContext = createContext<{ nodeId: NodeId } | null>(null);\n\nexport function useTrialDrag(): { nodeId: NodeId } | null {\n return useContext(TrialDragContext);\n}\n","import type { ReactNode } from 'react';\nimport type { NodeId } from 'windease';\nimport { useDragHandle } from 'windease/react';\nimport { useTrialDrag } from './TrialDragContext';\n\n/** Props for `<TrialTitleBar>`. */\nexport interface TrialTitleBarProps {\n title: string;\n /** Rendered at the leading edge, before the title. */\n lead?: ReactNode;\n children?: ReactNode;\n}\n\n// `useDragHandle` needs a node id and windease's DragProvider, so the draggable\n// form is a separate component rather than a conditional hook.\nfunction Draggable({ nodeId, title, lead, children }: TrialTitleBarProps & { nodeId: NodeId }) {\n const handlers = useDragHandle(nodeId);\n return (\n <div className=\"lk-trial__titlebar lk-trial__titlebar--draggable\" {...handlers}>\n {lead}\n <span className=\"lk-trial__title\">{title}</span>\n {children}\n </div>\n );\n}\n\n/** A trial's title bar. When the workspace allows reordering the whole bar is\n * the drag surface — there is no separate grip, because a window's title bar\n * is already the thing you expect to drag. */\nexport function TrialTitleBar({ title, lead, children }: TrialTitleBarProps) {\n const drag = useTrialDrag();\n if (drag)\n return (\n <Draggable nodeId={drag.nodeId} title={title} lead={lead}>\n {children}\n </Draggable>\n );\n return (\n <div className=\"lk-trial__titlebar\">\n {lead}\n <span className=\"lk-trial__title\">{title}</span>\n {children}\n </div>\n );\n}\n","import { createContext, useContext } from 'react';\n\n/** Where an undocked panel's DOM lives. The panel's *content* stays owned by\n * its trial — it is React-portalled into the host — so a torn-out section\n * keeps the trial's context, state and subscriptions instead of being rebuilt\n * as a sibling of the trial it came from. */\nexport interface PanelHostRegistry {\n set: (key: string, el: HTMLElement | null) => void;\n get: (key: string) => HTMLElement | null;\n subscribe: (fn: () => void) => () => void;\n}\n\nexport function createPanelHostRegistry(): PanelHostRegistry {\n const hosts = new Map<string, HTMLElement>();\n const listeners = new Set<() => void>();\n const notify = () => {\n for (const fn of listeners) fn();\n };\n return {\n set: (key, el) => {\n if (el) hosts.set(key, el);\n else hosts.delete(key);\n notify();\n },\n get: (key) => hosts.get(key) ?? null,\n subscribe: (fn) => {\n listeners.add(fn);\n return () => listeners.delete(fn);\n },\n };\n}\n\nexport const PanelHostContext = createContext<PanelHostRegistry | null>(null);\n\nexport function usePanelHosts(): PanelHostRegistry | null {\n return useContext(PanelHostContext);\n}\n","import { useSyncExternalStore } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { SidebarSection, TrialContribution } from '../chrome/types';\nimport { usePanelHosts } from '../lab/panelHost';\nimport { panelKey } from '../state/undock';\n\n/** Props for `<UndockedSections>`. */\nexport interface UndockedSectionsProps {\n trialId: string;\n /** The trial's sidebar contributions that are currently torn out. */\n sections: readonly TrialContribution[];\n onDock: (sectionId: string) => void;\n}\n\nfunction Portalled({\n trialId,\n contribution,\n onDock,\n}: {\n trialId: string;\n contribution: TrialContribution;\n onDock: (sectionId: string) => void;\n}) {\n const hosts = usePanelHosts();\n const key = panelKey(trialId, contribution.id);\n const host = useSyncExternalStore(\n (fn) => hosts?.subscribe(fn) ?? (() => {}),\n () => hosts?.get(key) ?? null,\n () => null,\n );\n if (!host || !contribution.item) return null;\n const item = contribution.item as SidebarSection;\n return createPortal(\n <>\n <div className=\"lk-panel-tile__titlebar\">\n <span className=\"lk-panel-tile__title\">{item.title}</span>\n <button\n type=\"button\"\n className=\"lk-panel-tile__dock\"\n aria-label={`Dock ${item.title}`}\n title={`Dock ${item.title}`}\n onClick={() => onDock(contribution.id)}\n >\n ⇤\n </button>\n </div>\n {item.body}\n </>,\n host,\n );\n}\n\n/** Renders a torn-out section's body into the workspace panel holding it. The\n * body stays mounted in the trial's React tree — only its DOM moves — so it\n * keeps the trial's context and its own state across an undock. */\nexport function UndockedSections({ trialId, sections, onDock }: UndockedSectionsProps) {\n if (sections.length === 0) return null;\n return (\n <>\n {sections.map((c) => (\n <Portalled key={c.id} trialId={trialId} contribution={c} onDock={onDock} />\n ))}\n </>\n );\n}\n","import {\n type KeyboardEvent,\n type ReactNode,\n useContext,\n useMemo,\n useSyncExternalStore,\n} from 'react';\nimport { useStore } from 'zustand/react';\nimport { CameraRegistryContext } from '../canvas/cameraRegistry';\nimport { zoomCameraTo } from '../canvas/cameraZoom';\nimport { builtinContributions } from '../chrome/builtins';\nimport { mergeContributions, suppressContributions } from '../chrome/merge';\nimport { PaletteRegion } from '../chrome/regions/PaletteRegion';\nimport { SidebarRegion } from '../chrome/regions/SidebarRegion';\nimport { StatusRegion } from '../chrome/regions/StatusRegion';\nimport { TitleBarRegion } from '../chrome/regions/TitleBarRegion';\nimport { ToolbarRegion } from '../chrome/regions/ToolbarRegion';\nimport { ViewportRegion } from '../chrome/regions/ViewportRegion';\nimport type { TrialChromeContext, TrialContribution, TrialRegion } from '../chrome/types';\nimport { applyConfigWrite, resolveAutoConfig } from '../config/autoConfig';\nimport { hasConfigPath, schemaNodeAtPath } from '../config/path';\nimport { useConfigSchema } from '../config/useConfigSchema';\nimport { useResolvedConfig } from '../config/useResolvedConfig';\nimport type { Instrument } from '../instrument/types';\nimport type { JobHandle } from '../job/types';\nimport { useLabContext } from '../lab/LabContext';\nimport { JobProgress } from '../primitives/JobProgress';\nimport { LabStoreContext } from '../state/context';\nimport type { TrialRecord } from '../state/types';\nimport { as2DView, withZoom } from '../state/view';\nimport { TrialBody } from './TrialBody';\nimport { TrialTitleBar } from './TrialTitleBar';\nimport { UndockedSections } from './UndockedSections';\n\n/** The trial's loupe as its chrome sees it: a switch and its position. */\nexport interface LoupeBindings {\n on: boolean;\n toggle: () => void;\n}\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 undoBindings?: UndoBindings;\n /** Supplied when the instrument declares a `job`. */\n job?: JobHandle;\n /** Supplied when the instrument declares a `loupe`. The lens itself is the\n * trial's to mount; the chrome only offers the switch. */\n loupe?: LoupeBindings;\n /** Contributions the trial runtime itself adds — the drag palette and the\n * layer list, which depend on runtime state the instrument cannot reach. */\n trialChrome?: readonly TrialContribution[];\n /** Contributions from the lab, merged last. */\n chrome?: readonly TrialContribution[];\n /** Built-in contribution ids to drop. Throws on an id that is not there. */\n suppress?: readonly string[];\n /** The trial's resolved tool slot, and the setter that writes whichever\n * slot it resolved to. `Trial` owns the resolution. */\n activeToolId?: string | null;\n setActiveTool?: (id: string) => void;\n children: ReactNode;\n}\n\nconst NO_OP = (): void => {};\n\n/** One frozen empty map, so a trial that has folded nothing keeps a stable\n * context identity across renders. */\nconst NO_SECTIONS: Readonly<Record<string, boolean>> = Object.freeze({});\nconst noSubscribe = (): (() => void) => NO_OP;\n\n/** The frame around a running instrument. Builds one chrome context, assembles\n * the contributions the instrument, the runtime and the lab declare, and hands\n * each region its slice. */\nexport function TrialChrome({\n trialId,\n record,\n instrument,\n isLastTrial,\n undoBindings,\n job,\n loupe,\n trialChrome,\n chrome,\n suppress,\n activeToolId = null,\n setActiveTool = NO_OP,\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 updateTrialSidebarWidth = useStore(storeCtx.store, (s) => s.updateTrialSidebarWidth);\n const setTrialTitle = useStore(storeCtx.store, (s) => s.setTrialTitle);\n const setTrialSectionCollapsed = useStore(storeCtx.store, (s) => s.setTrialSectionCollapsed);\n const updateTrialConfig = useStore(storeCtx.store, (s) => s.updateTrialConfig);\n const updateTrialState = useStore(storeCtx.store, (s) => s.updateTrialState);\n const undockPanelAction = useStore(storeCtx.store, (s) => s.undockPanel);\n const dockPanelAction = useStore(storeCtx.store, (s) => s.dockPanel);\n const undockedPanels = useStore(storeCtx.store, (s) => s.undockedPanels);\n const undockedIds = useMemo(\n () =>\n Object.values(undockedPanels)\n .filter((p) => p.trialId === trialId)\n .map((p) => p.sectionId),\n [undockedPanels, trialId],\n );\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 configSchema = useConfigSchema(instrument);\n // What the instrument is looking at right now. The panel reads `record.config`\n // — the pinned values — but anything instrument-facing gets the resolved one.\n const { config: resolvedConfig, auto } = useResolvedConfig(\n configSchema,\n record.config,\n record.auto,\n );\n\n const title = record.title ?? instrument.title ?? instrument.name;\n const collapsedSections = record.collapsedSections ?? NO_SECTIONS;\n\n // The trial's own camera, where it has one: zoom goes through it, about the\n // middle of the view and inside the instrument's range, as the lab's does.\n const cameras = useContext(CameraRegistryContext);\n const camera = useSyncExternalStore(\n cameras?.subscribe ?? noSubscribe,\n () => cameras?.get(trialId) ?? null,\n );\n\n const ctx = useMemo<TrialChromeContext>(() => {\n const setZoom = (z: number): void => {\n if (camera) zoomCameraTo(camera, z);\n else if (view2d) updateTrialView(trialId, withZoom(view2d, z));\n };\n return {\n trialId,\n instrumentName: record.instrumentName,\n title,\n setTitle: (next) => setTrialTitle(trialId, next),\n isLastTrial,\n zoom: view2d ? view2d.zoom : null,\n setZoom,\n canUndo: undoBindings?.canUndo ?? false,\n canRedo: undoBindings?.canRedo ?? false,\n undo: undoBindings?.undo ?? NO_OP,\n redo: undoBindings?.redo ?? NO_OP,\n loupeOn: loupe?.on ?? false,\n toggleLoupe: loupe?.toggle ?? NO_OP,\n configSchema,\n configFields: instrument.config ? [] : (instrument.configSchema?.() ?? []),\n config: record.config,\n auto,\n setConfig: (path, value) => {\n const prevConfig = record.config as Record<string, unknown>;\n if (\n process.env.NODE_ENV !== 'production' &&\n !hasConfigPath(prevConfig, path) &&\n schemaNodeAtPath(configSchema.group, path) === undefined\n ) {\n console.warn(\n `[labkit] setConfig: unknown path \"${path}\" for instrument \"${record.instrumentName}\"`,\n );\n }\n updateTrialConfig(trialId, path, value);\n if (instrument.onConfigChange) {\n const next = applyConfigWrite(prevConfig, record.auto ?? [], path, value);\n const nextConfig = resolveAutoConfig(configSchema, next.config, new Set(next.autoPaths));\n const nextState = instrument.onConfigChange(nextConfig, resolvedConfig, record.state);\n updateTrialState(trialId, nextState as never);\n }\n },\n collapsedSections,\n setSectionCollapsed: (key, collapsed) => setTrialSectionCollapsed(trialId, key, collapsed),\n undockedPanels: undockedIds,\n undockPanel: (sectionId, as) => undockPanelAction(trialId, sectionId, as),\n dockPanel: (sectionId) => dockPanelAction(trialId, sectionId),\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 activeToolId,\n setActiveTool,\n };\n }, [\n trialId,\n record,\n instrument,\n lab,\n title,\n isLastTrial,\n updateTrialView,\n updateTrialConfig,\n updateTrialState,\n undoBindings,\n loupe,\n view2d,\n activeToolId,\n setActiveTool,\n configSchema,\n resolvedConfig,\n auto,\n undockedIds,\n undockPanelAction,\n dockPanelAction,\n setTrialTitle,\n setTrialSectionCollapsed,\n collapsedSections,\n camera,\n ]);\n\n const contributions = useMemo(\n () =>\n suppressContributions(\n mergeContributions(\n builtinContributions(instrument, ctx, lab.controls),\n [...(instrument.chrome ?? [])],\n [...(trialChrome ?? [])],\n [...(chrome ?? [])],\n ),\n suppress ?? [],\n ),\n [instrument, ctx, trialChrome, chrome, suppress, lab.controls],\n );\n\n const inRegion = (region: TrialRegion): TrialContribution[] =>\n contributions.filter((c) => c.region === region);\n\n const handleKeyDown = (e: KeyboardEvent<HTMLElement>): 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) ctx.redo();\n else ctx.undo();\n } else if (e.key === 's' || e.key === 'S') {\n e.preventDefault();\n ctx.saveSnapshot();\n }\n };\n\n return (\n <section\n className=\"lk-trial\"\n data-trial-id={trialId}\n data-focused={lab.trials.length > 1 && lab.focusedTrialId === trialId ? 'true' : undefined}\n aria-label={`Trial ${title}`}\n tabIndex={-1}\n onKeyDown={handleKeyDown}\n >\n <TrialTitleBar\n title={title}\n lead={<TitleBarRegion placement=\"lead\" contributions={inRegion('titlebar')} ctx={ctx} />}\n >\n <TitleBarRegion contributions={inRegion('titlebar')} ctx={ctx} />\n </TrialTitleBar>\n <div className=\"lk-trial__toolbar\">\n <ToolbarRegion contributions={inRegion('toolbar')} ctx={ctx} />\n </div>\n <div className=\"lk-trial__body\">\n <PaletteRegion contributions={inRegion('palette')} ctx={ctx} />\n <TrialBody\n width={record.sidebarWidth}\n onWidthChange={(w) => updateTrialSidebarWidth(trialId, w)}\n contentClassName={\n instrument.canvas || instrument.stage ? 'lk-trial__content--flush' : undefined\n }\n sidebar={\n <>\n <SidebarRegion contributions={inRegion('sidebar')} ctx={ctx} />\n <UndockedSections\n trialId={trialId}\n sections={inRegion('sidebar').filter((c) => undockedIds.includes(c.id))}\n onDock={ctx.dockPanel}\n />\n </>\n }\n >\n {children}\n <ViewportRegion contributions={inRegion('viewport')} ctx={ctx} />\n </TrialBody>\n </div>\n <div className=\"lk-trial__status\">\n {job ? <JobProgress job={job} /> : null}\n <StatusRegion contributions={inRegion('status')} ctx={ctx} />\n </div>\n </section>\n );\n}\n","import { createPointerStore, PointerContextProvider, WeaselProvider } from '@weasel-js/core';\nimport { type ReactNode, useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport { useStore } from 'zustand/react';\nimport { AnnotationsContext } from '../annotations/AnnotationsContext';\nimport { AnnotationTargets } from '../annotations/AnnotationTargets';\nimport { AnnotationPreloadContext } from '../annotations/preload';\nimport { annotationsFromJSON } from '../annotations/store';\nimport type { AnnotationStorage, AnnotationTargetInfo } from '../annotations/types';\nimport type { CameraView } from '../canvas/CameraInput';\nimport { CameraWheelContext, type CameraWheelSlot } from '../canvas/CameraWheelContext';\nimport { CanvasStack } from '../canvas/CanvasStack';\nimport { CameraPublishContext, CameraRegistryContext } from '../canvas/cameraRegistry';\nimport { fitStage, Stage } from '../canvas/Stage';\nimport type { CanvasLayerDescriptor } from '../canvas/useLayerScheduler';\nimport { applyCamera, type ViewportSize } from '../canvas/worldSpec';\nimport type { TrialContribution } from '../chrome/types';\nimport { useConfigSchema } from '../config/useConfigSchema';\nimport { useResolvedConfig } from '../config/useResolvedConfig';\nimport { DragOverlay, useDragDrop } from '../dragdrop/DragDropRuntime';\nimport { Palette } from '../dragdrop/Palette';\nimport type {\n Instrument,\n InstrumentList,\n LayerDescriptor,\n PaletteItem,\n RenderContext,\n} from '../instrument/types';\nimport { useJob } from '../job/useJob';\nimport { useLabContext } from '../lab/LabContext';\nimport { TrialLoupe } from '../loupe/TrialLoupe';\nimport { resolveLoupe } from '../loupe/types';\nimport { LayerList, type LayerListItem, moveLayers } from '../passthrough/weasel-ui';\nimport { LabStoreContext, TrialIdProvider } from '../state/context';\nimport type { LabStore } from '../state/store';\nimport type { TrialRecord } from '../state/types';\nimport { as2DView, DEFAULT_VIEW, withZoom } from '../state/view';\nimport { resolveLabTool } from '../tools/labTool';\nimport { createEventBus, type EventBus } from '../undo/eventBus';\nimport { pushSnapshot, redo as undoRedo, undo as undoUndo } from '../undo/undoStack';\nimport type { LoupeBindings, UndoBindings } from './TrialChrome';\nimport { TrialChrome } from './TrialChrome';\n\n/** Props for `<Trial>`. */\nexport interface TrialProps {\n id: string;\n /** Contributions the lab adds to this trial's chrome, merged after the\n * instrument's own. */\n chrome?: readonly TrialContribution[];\n /** Built-in contribution ids to drop. Throws on an id that is not there. */\n suppress?: readonly 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, chrome, suppress }: TrialProps) {\n const lab = useLabContext();\n const storeCtx = useContext(LabStoreContext);\n if (!storeCtx) throw new Error('[labkit] <Trial> requires <LabStoreProvider>');\n const instruments = useStore(storeCtx.store, (s) => s.instruments) ?? lab.instruments;\n const record = useStore(storeCtx.store, (s) => s.trials.find((w) => w.id === id));\n const instrument = record ? instruments.find((i) => i.name === record.instrumentName) : undefined;\n const kept = useKeptMarks(instrument?.annotations?.storage, id);\n if (!record) {\n return <div className=\"lk-trial lk-trial--unknown\">Trial not found: {id}</div>;\n }\n if (!instrument) {\n return (\n <div className=\"lk-trial lk-trial--unknown\">Unknown instrument: {record.instrumentName}</div>\n );\n }\n if (!kept.ready) return <div className=\"lk-trial lk-trial--loading\" />;\n return (\n <TrialRuntime\n keptMarks={kept.value}\n record={record}\n instrument={instrument}\n instruments={instruments}\n store={storeCtx.store}\n isLast={lab.trials.length <= 1}\n chrome={chrome}\n suppress={suppress}\n />\n );\n}\n\n/** The marks an instrument keeps in its own storage: preloaded by the lab for\n * the trials it opened with, loaded here for any added since. */\nfunction useKeptMarks(\n storage: AnnotationStorage | undefined,\n trialId: string,\n): { ready: boolean; value: unknown } {\n const preload = useContext(AnnotationPreloadContext);\n const [loaded, setLoaded] = useState<{ value: unknown } | null>(() =>\n storage && preload?.has(trialId) ? { value: preload.get(trialId) } : null,\n );\n useEffect(() => {\n if (!storage || loaded) return;\n let live = true;\n storage.load().then(\n (value) => {\n if (live) setLoaded({ value });\n },\n (error) => {\n console.warn(`[labkit] could not load the marks of trial \"${trialId}\"`, error);\n if (live) setLoaded({ value: null });\n },\n );\n return () => {\n live = false;\n };\n }, [storage, loaded, trialId]);\n if (!storage) return { ready: true, value: undefined };\n return loaded ? { ready: true, value: loaded.value } : { ready: false, value: undefined };\n}\n\ninterface TrialRuntimeProps {\n /** The marks an instrument's own `AnnotationStorage` loaded. */\n keptMarks: unknown;\n record: TrialRecord;\n instrument: Instrument;\n /** The lab's instruments as the store holds them now. */\n instruments: InstrumentList;\n store: LabStore;\n isLast: boolean;\n chrome?: readonly TrialContribution[];\n suppress?: readonly string[];\n}\n\nfunction TrialRuntime({\n keptMarks,\n record,\n instrument,\n instruments,\n store,\n isLast,\n chrome,\n suppress,\n}: TrialRuntimeProps) {\n const wheelSlot = useRef<CameraWheelSlot['current']>(null);\n const cameras = useContext(CameraRegistryContext);\n const trialId = record.id;\n const publishCamera = useMemo(\n () => (cameras ? (camera: CameraView) => cameras.register(trialId, camera) : null),\n [cameras, trialId],\n );\n const [pointer] = useState(createPointerStore);\n const canvasContainerRef = useRef<HTMLDivElement | null>(null);\n const loupeHostRef = 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 const updateTrialAnnotations = useStore(store, (s) => s.updateTrialAnnotations);\n const labToolId = useStore(store, (s) => s.activeToolId);\n const setLabTool = useStore(store, (s) => s.setLabTool);\n const setTrialTool = useStore(store, (s) => s.setTrialTool);\n\n // Everything below reads `config`; `record.config` is the panel's view, and\n // reaches it through `record` on `TrialChrome`.\n const schema = useConfigSchema(instrument);\n const { config } = useResolvedConfig(schema, record.config, record.auto);\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 const [loupeOn, setLoupeOn] = useState(false);\n\n const visibleLayers = useMemo(\n () =>\n (instrument.canvas?.layers ?? [])\n .filter((l) => layerVisibility[l.id] !== false)\n .map((l) => l.id),\n [instrument.canvas, layerVisibility],\n );\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 // A function `initialView` needs the canvas size, so `trialOps` leaves the\n // view null and the first measurement resolves it. Reset nulls it again,\n // which re-frames — so the guard is the null itself, not a \"have I run\" flag.\n const stage = instrument.canvas ? undefined : instrument.stage;\n const placeView = (size: ViewportSize): void => {\n const declared =\n instrument.canvas?.initialView ??\n (stage ? (stage.initialView ?? ((vp: ViewportSize) => fitStage(stage.size, vp))) : undefined);\n if (typeof declared !== 'function') return;\n if (record.view != null) return;\n setView(declared(size));\n };\n\n // The capability's own `targets` thunk, re-read on every call: a target\n // resizing or gaining a dependency must not need the store rebuilt. Held in\n // a ref because the store is built once and closes over it.\n const annotationsCap = instrument.annotations;\n const targetsRef = useRef<() => readonly AnnotationTargetInfo[]>(() => []);\n targetsRef.current = () =>\n annotationsCap\n ? annotationsCap.targets(record.state, config, { id: record.id, view: record.view })\n : [];\n\n // One store for the trial's lifetime.\n const annotationsRef = useRef<ReturnType<typeof annotationsFromJSON> | null>(null);\n // Read through refs for the same reason `targets` is: the store is built\n // once, and an export must draw against the config the trial holds now.\n const configRef = useRef<unknown>(config);\n configRef.current = config;\n // The instrument can be swapped under a live trial, so the capability is read at use too.\n const capRef = useRef(annotationsCap);\n capRef.current = annotationsCap;\n if (annotationsRef.current === null) {\n // Seeded from wherever the marks were kept: the instrument's own store if\n // it declared one, else this trial's slot.\n const kept = annotationsCap?.storage ? keptMarks : record.annotations;\n annotationsRef.current = annotationsFromJSON(kept, () => targetsRef.current(), {\n meaning: () => capRef.current?.meaning,\n config: () => configRef.current,\n onCapture: (result) => capRef.current?.onCapture?.(result),\n });\n }\n const annotations = annotationsRef.current;\n\n // Written on a trailing debounce rather than per notification: a scene\n // mutates every frame of a drag, and a zustand write per frame re-renders\n // every trial in the lab. The unmount flush is not an optimization — the\n // last mark before a trial closes is otherwise lost.\n const saveCap = annotationsCap?.storage;\n const saveRef = useRef<(doc: unknown) => void>(() => {});\n saveRef.current = (doc) => {\n if (saveCap) saveCap.save(doc as never);\n else updateTrialAnnotations(record.id, doc);\n };\n // Only when the pair flips, which is rare: bumping React state on every\n // scene notification would re-render the trial on every frame of a drag,\n // which is the thing the debounce below exists to avoid.\n const [markMoves, setMarkMoves] = useState({ undo: false, redo: false });\n useEffect(() => {\n if (!annotationsCap) return;\n const read = (): void => {\n const next = { undo: annotations.canUndo(), redo: annotations.canRedo() };\n setMarkMoves((prev) => (prev.undo === next.undo && prev.redo === next.redo ? prev : next));\n };\n read();\n return annotations.subscribe(read);\n }, [annotations, annotationsCap]);\n\n useEffect(() => {\n if (!annotationsCap) return;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let dirty = false;\n const flush = (): void => {\n if (!dirty) return;\n dirty = false;\n saveRef.current(annotations.toJSON());\n };\n const off = annotations.subscribe(() => {\n dirty = true;\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n timer = null;\n flush();\n }, 250);\n });\n return () => {\n off();\n if (timer) clearTimeout(timer);\n flush();\n };\n }, [annotations, annotationsCap]);\n\n // A trial gets its own slot when its instrument declares tools; otherwise it\n // reads the lab's. Which slot a change writes follows from the same thing.\n // Annotation tools always read the lab's: a tool is what the hand holds, so\n // picking one arms it in every trial, the way artboards share a tool. They\n // were once per trial, back when one trial compared several pictures.\n const declaresTools = instrument.tools != null;\n const labTool = resolveLabTool(labToolId, instruments);\n const resolvedToolId = declaresTools\n ? (record.activeToolId ?? instrument.tools?.initial ?? instrument.tools?.tools[0]?.id ?? null)\n : labTool;\n const setActiveTool = (id: string): void => {\n if (declaresTools) setTrialTool(record.id, id);\n else setLabTool(id);\n };\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,\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,\n setState: (next) => {\n snapshotIfNeeded('state.change');\n updateTrialState(record.id, next);\n bus.emit('state.change');\n },\n setConfig: (path, value) => {\n const evt = `config.change:${path}`;\n snapshotIfNeeded('config.change');\n snapshotIfNeeded(evt);\n updateTrialConfig(record.id, path, value);\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, withZoom(view2d, z));\n },\n activeToolId: resolvedToolId,\n visibleLayers,\n pointer,\n },\n emit: (event) => {\n snapshotIfNeeded(event);\n bus.emit(event);\n },\n job: jobCap ? job : undefined,\n };\n\n // Marks are undone through weasel history, not through labkit's snapshot\n // stack — the spec's rule, and the reason a mark scene is the truth. A trial\n // declaring both takes the marks first: the most recent thing the user did\n // is what undo is for, and only a mark change moves the mark history.\n const undoState = () => {\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 const redoState = () => {\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 const undoBindings: UndoBindings | undefined =\n undoCap || annotationsCap\n ? {\n canUndo: markMoves.undo || (undoCap ? record.undoStack.past.length > 0 : false),\n canRedo: markMoves.redo || (undoCap ? record.undoStack.future.length > 0 : false),\n undo: () => {\n if (annotationsCap && annotations.undo()) return;\n if (undoCap) undoState();\n },\n redo: () => {\n if (annotationsCap && annotations.redo()) return;\n if (undoCap) redoState();\n },\n }\n : undefined;\n\n const loupeCap = useMemo(() => {\n const declared = instrument.loupe;\n if (declared == null) return null;\n return resolveLoupe(typeof declared === 'function' ? declared(config) : declared);\n }, [instrument.loupe, config]);\n const loupeBindings: LoupeBindings | undefined = loupeCap\n ? { on: loupeOn, toggle: () => setLoupeOn((v) => !v) }\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, frame) => {\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 applyCamera(ctx, view, frame);\n layer.draw(ctx, { state: record.state, config, zoom: view.zoom });\n },\n }));\n }, [instrument.canvas, record.state, config, layerVisibility, layerOrder]);\n\n const layerDescriptors: LayerDescriptor[] = useMemo(() => {\n if (!instrument.layers) return [];\n return instrument.layers.ids.map((l) => (typeof l === 'string' ? { id: l, label: l } : l));\n }, [instrument.layers]);\n\n // In the order the canvas draws them, with the always-on layers pinned\n // below the rest, where a drag cannot reach past them.\n const layerItems: LayerListItem[] = useMemo(() => {\n const ordered = layerOrder\n ? [...layerDescriptors].sort((a, b) => layerOrder.indexOf(a.id) - layerOrder.indexOf(b.id))\n : layerDescriptors;\n const pinnedLast = [\n ...ordered.filter((l) => !l.alwaysOn),\n ...ordered.filter((l) => l.alwaysOn),\n ];\n return pinnedLast.map((l) => ({\n id: l.id,\n label: l.label,\n locked: l.alwaysOn === true,\n visible: l.alwaysOn === true || layerVisibility[l.id] !== false,\n }));\n }, [layerDescriptors, layerOrder, layerVisibility]);\n\n const dragDropResult = useDragDrop({\n capability: instrument.dragDrop ?? { palette: [], onDrop: (_p, _i, s) => s },\n canvasContainerRef,\n view: view2d ?? DEFAULT_VIEW,\n worldSpec: instrument.canvas?.worldSpec,\n state: record.state,\n 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, config) : p;\n }, [instrument.dragDrop, record.state, 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 // The lens tracks the pointer over whatever box holds the content: the canvas\n // stack's own element, which it takes from context, or the wrapper below.\n const lens = loupeCap ? (\n <TrialLoupe\n capability={loupeCap}\n enabled={loupeOn}\n state={record.state}\n config={config}\n view={view2d ?? DEFAULT_VIEW}\n worldSpec={instrument.canvas?.worldSpec}\n hostRef={loupeHostRef}\n />\n ) : null;\n\n let body: ReactNode;\n if (instrument.canvas) {\n body = (\n <div ref={canvasContainerRef} className=\"lk-trial__canvas-host\">\n <CanvasStack\n layers={layersWithFeedback}\n view={view2d ?? DEFAULT_VIEW}\n onViewChange={setView}\n worldSpec={instrument.canvas.worldSpec}\n onResize={placeView}\n minZoom={instrument.canvas.minZoom}\n maxZoom={instrument.canvas.maxZoom}\n >\n {instrument.render(renderCtx)}\n {lens}\n </CanvasStack>\n <DragOverlay drag={dragDropResult.drag} />\n </div>\n );\n } else if (stage) {\n body = (\n <Stage\n size={stage.size}\n view={view2d ?? DEFAULT_VIEW}\n onViewChange={setView}\n onResize={placeView}\n minZoom={stage.minZoom}\n maxZoom={stage.maxZoom}\n hostRef={loupeHostRef}\n overlay={\n <>\n {stage.overlay?.(renderCtx)}\n {lens}\n </>\n }\n >\n {instrument.render(renderCtx)}\n </Stage>\n );\n } else if (lens) {\n body = (\n <div ref={loupeHostRef} className=\"lk-trial__loupe-host\">\n {instrument.render(renderCtx)}\n {lens}\n </div>\n );\n } else {\n body = instrument.render(renderCtx);\n }\n\n const startDrag = dragDropResult.startDrag;\n const paletteNode = useMemo(\n () =>\n paletteItems.length > 0 ? <Palette items={paletteItems} onDragStart={startDrag} /> : null,\n [paletteItems, startDrag],\n );\n\n const layerListNode = useMemo(\n () =>\n instrument.layers && layerDescriptors.length > 0 ? (\n <LayerList\n items={layerItems}\n onReorder={(move) => {\n setLayerOrder(moveLayers(layerItems, move).map((l) => l.id));\n bus.emit('layers.reorder');\n }}\n onVisibilityChange={(lid, visible) => {\n setLayerVisibility((prev) => ({ ...prev, [lid]: visible }));\n bus.emit('layers.toggle');\n }}\n />\n ) : null,\n [instrument.layers, layerDescriptors, layerItems, bus],\n );\n\n const extraChrome = useMemo<TrialContribution[]>(() => {\n const out: TrialContribution[] = [];\n if (paletteNode) {\n out.push({\n id: 'dragdrop-palette',\n region: 'sidebar',\n item: { title: 'Parts', body: paletteNode },\n });\n }\n if (layerListNode) {\n out.push({\n id: 'layer-list',\n region: 'sidebar',\n item: { title: 'Layers', body: layerListNode },\n });\n }\n return out;\n }, [paletteNode, layerListNode]);\n\n // Rendered beside the body rather than inside it: an overlay portals itself\n // into the surface container, so where it sits in this tree decides only\n // when its effects run — after the instrument's refs have attached.\n const annotationOverlays = annotationsCap ? (\n <AnnotationTargets\n capability={annotationsCap}\n state={record.state}\n config={config}\n trial={{ id: record.id, view: record.view }}\n annotations={annotations}\n activeToolId={labTool}\n />\n ) : null;\n\n // The trial's root registries, isolated from the trial beside it. Each\n // camera inside mounts an input scope under them; chrome here reaches the\n // one last used. The pointer store is the trial's, shared by all of them.\n const scopedBody = (\n <WeaselProvider isolate>\n <PointerContextProvider store={pointer}>\n <CameraPublishContext.Provider value={publishCamera}>{body}</CameraPublishContext.Provider>\n </PointerContextProvider>\n </WeaselProvider>\n );\n\n return (\n <TrialIdProvider trialId={record.id}>\n <AnnotationsContext.Provider value={annotationsCap ? annotations : null}>\n <CameraWheelContext.Provider value={wheelSlot}>\n <TrialChrome\n job={jobCap ? job : undefined}\n loupe={loupeBindings}\n trialId={record.id}\n record={record}\n instrument={instrument}\n isLastTrial={isLast}\n undoBindings={undoBindings}\n trialChrome={extraChrome}\n chrome={chrome}\n suppress={suppress}\n activeToolId={resolvedToolId}\n setActiveTool={setActiveTool}\n >\n {scopedBody}\n {annotationOverlays}\n </TrialChrome>\n </CameraWheelContext.Provider>\n </AnnotationsContext.Provider>\n </TrialIdProvider>\n );\n}\n","import { isAuto } from '../config/auto';\nimport { autoPathsOf } from '../config/autoConfig';\nimport { fillConfigDefaults, isRecord } from '../config/path';\nimport { unruledConfigSchema } from '../instrument/serializers';\nimport type { Instrument, InstrumentList } from '../instrument/types';\nimport { newId } from '../state/helpers';\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 const stage = instrument.canvas ? undefined : instrument.stage;\n const declared = instrument.canvas?.initialView ?? stage?.initialView;\n // A function needs the canvas size, which no trial has at creation. `null`\n // is the unplaced marker; `Trial` resolves it on the first non-empty size.\n // A stage that names no view is fitted, which needs that size too.\n if (typeof declared === 'function' || (stage && declared === undefined)) return null;\n return declared ? structuredClone(declared) : { ...DEFAULT_VIEW, pan: { ...DEFAULT_VIEW.pan } };\n}\n\n/** What a trial opens on beyond its instrument's own defaults. */\nexport interface AddTrialOptions<TC = Record<string, unknown>> {\n /** Overlaid on `defaultConfig()` before `initialState` reads it, so a trial\n * opened on a subject is running that subject from its first frame. Keys\n * whose value is `undefined` are left to the default. */\n config?: Partial<TC>;\n}\n\n/** `defaultConfig()` with `seed` written over it, down the tree: a seed naming\n * one leaf of a group leaves that group's other leaves at their defaults. */\nfunction seedConfig<TC>(defaults: TC, seed: Partial<TC> | undefined): TC {\n return seed ? fillConfigDefaults(seed, defaults) : defaults;\n}\n\n/** Splits a seed config into its ordinary values and the dotted paths it wrote\n * as `auto`, so the sentinel never reaches the record. */\nfunction splitAutoSeed(\n seed: Record<string, unknown> | undefined,\n at = '',\n): { config: Record<string, unknown>; autoPaths: string[] } {\n const config: Record<string, unknown> = {};\n const autoPaths: string[] = [];\n for (const [key, value] of Object.entries(seed ?? {})) {\n const path = at === '' ? key : `${at}.${key}`;\n if (isAuto(value)) {\n autoPaths.push(path);\n } else if (isRecord(value)) {\n const inner = splitAutoSeed(value as Record<string, unknown>, path);\n config[key] = inner.config;\n autoPaths.push(...inner.autoPaths);\n } else {\n config[key] = value;\n }\n }\n return { config, autoPaths };\n}\n\n/** The paths an instrument's own schema declares as starting auto. */\nfunction schemaAutoPaths(instrument: Instrument): string[] {\n const schema = unruledConfigSchema(instrument);\n return schema ? autoPathsOf(schema) : [];\n}\n\n/** Append a new trial running `instrumentName`, at that instrument's default\n * config — with `options.config` written over it — and the initial state\n * that config produces. */\nexport function addTrial(\n trials: TrialRecord[],\n instruments: InstrumentList,\n instrumentName: string,\n options: AddTrialOptions = {},\n): TrialRecord[] {\n const instrument = findInstrument(instruments, instrumentName);\n const seeded = splitAutoSeed(options.config as Record<string, unknown> | undefined);\n const autoPaths = [...new Set([...schemaAutoPaths(instrument), ...seeded.autoPaths])];\n const config = seedConfig(instrument.defaultConfig(), seeded.config);\n const state = instrument.initialState(config);\n const record: TrialRecord = {\n id: newId(),\n instrumentName,\n config,\n state,\n view: initialView(instrument),\n undoStack: { past: [], future: [] },\n };\n if (options.config) record.configSeed = seeded.config;\n if (seeded.autoPaths.length > 0) record.autoSeed = seeded.autoPaths;\n if (autoPaths.length > 0) record.auto = autoPaths;\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: newId(),\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 what it opened on — its instrument's defaults under the\n * seed `addTrial` was given — keeping its id and its 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 = seedConfig(instrument.defaultConfig(), current.configSeed);\n const state = instrument.initialState(config);\n const autoPaths = [...new Set([...schemaAutoPaths(instrument), ...(current.autoSeed ?? [])])];\n const { auto: _unpinnedNow, ...kept } = current;\n const reset: TrialRecord = {\n ...kept,\n config,\n state,\n view: initialView(instrument),\n };\n if (autoPaths.length > 0) reset.auto = autoPaths;\n return [...trials.slice(0, idx), reset, ...trials.slice(idx + 1)];\n}\n\n/** Put a fresh trial running `instrumentName` where trial `id` is. It gets a\n * new id, since the history, snapshots and marks keyed by the old one belong\n * to what that trial was running, but keeps the width its sidebar was\n * dragged to. */\nexport function swapTrial(\n trials: TrialRecord[],\n instruments: InstrumentList,\n id: string,\n instrumentName: string,\n options: AddTrialOptions = {},\n): TrialRecord[] {\n const idx = trials.findIndex((w) => w.id === id);\n const current = trials[idx];\n if (!current) return trials;\n const [record] = addTrial([], instruments, instrumentName, options) as [TrialRecord];\n if (current.sidebarWidth !== undefined) record.sidebarWidth = current.sidebarWidth;\n return [...trials.slice(0, idx), record, ...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 } from 'react';\n\n/** An element's edges, in the same coordinate space as the bound it is tested against. */\nexport interface Edges {\n top: number;\n left: number;\n bottom: number;\n right: number;\n}\n\nexport interface Overshoot<T> {\n item: T;\n /** How far past the bound the item reaches, in px, on whichever axis is worse. */\n by: number;\n axis: 'x' | 'y';\n}\n\n/** The item reaching furthest past the bottom or right of `bound`. On a tie the\n * first item wins, so given document order it names the outermost box. */\nexport function findOvershoot<T>(\n bound: Edges,\n items: Iterable<{ item: T; edges: Edges }>,\n tolerance = 1,\n): Overshoot<T> | null {\n let worst: Overshoot<T> | null = null;\n for (const { item, edges } of items) {\n const y = edges.bottom - bound.bottom;\n const x = edges.right - bound.right;\n const by = Math.max(x, y);\n if (by <= tolerance) continue;\n if (!worst || by > worst.by) worst = { item, by, axis: y >= x ? 'y' : 'x' };\n }\n return worst;\n}\n\nfunction tagAndClasses(el: Element): string {\n return el.tagName.toLowerCase() + [...el.classList].map((c) => `.${c}`).join('');\n}\n\n/** `div.lk-shell-body` — the tag and classes, which is what a reader greps for.\n * A classless element is placed by its nearest classed ancestor. */\nexport function describeElement(el: Element): string {\n if (el.classList.length > 0) return tagAndClasses(el);\n let up = el.parentElement;\n while (up && up.classList.length === 0) up = up.parentElement;\n return up ? `${tagAndClasses(el)} in ${tagAndClasses(up)}` : tagAndClasses(el);\n}\n\nfunction edgesOf(el: Element): Edges {\n const r = el.getBoundingClientRect();\n return { top: r.top, left: r.left, bottom: r.bottom, right: r.right };\n}\n\nfunction* candidates(root: Element): Iterable<{ item: Element; edges: Edges }> {\n yield { item: root, edges: edgesOf(root) };\n for (const el of root.querySelectorAll('*')) yield { item: el, edges: edgesOf(el) };\n}\n\nfunction overflows(el: Element): boolean {\n return el.scrollHeight > el.clientHeight + 1 || el.scrollWidth > el.clientWidth + 1;\n}\n\n/** Why a mounted lab scrolls, or null when it fits. The document only counts\n * when the lab is what reaches past the viewport, so a lab embedded in a long\n * page does not report the page's own scroll. */\nexport function explainLabScroll(lab: Element, shellBody: Element): string | null {\n if (overflows(shellBody)) {\n const r = shellBody.getBoundingClientRect();\n const bound = {\n top: r.top,\n left: r.left,\n bottom: r.top + shellBody.clientHeight,\n right: r.left + shellBody.clientWidth,\n };\n const hit = findOvershoot(bound, candidates(shellBody));\n return hit\n ? `.lk-shell-body scrolls: ${describeElement(hit.item)} reaches ${Math.round(hit.by)}px past it (${hit.axis})`\n : '.lk-shell-body scrolls';\n }\n\n const doc = document.scrollingElement ?? document.documentElement;\n if (!overflows(doc)) return null;\n const r = lab.getBoundingClientRect();\n const bound = {\n top: r.top,\n left: r.left,\n bottom: r.top + Math.min(r.height, doc.clientHeight),\n right: r.left + Math.min(r.width, doc.clientWidth),\n };\n const hit = findOvershoot(bound, candidates(lab));\n return hit\n ? `the page scrolls: ${describeElement(hit.item)} reaches ${Math.round(hit.by)}px past the lab's box (${hit.axis})`\n : null;\n}\n\nconst SETTLE_MS = 300;\n\n/** Dev only: warns once, naming the culprit, when a mounted lab scrolls. */\nexport function useLabFitWarning(labBody: Element | null): void {\n useEffect(() => {\n if (process.env.NODE_ENV === 'production') return;\n if (!labBody || typeof ResizeObserver === 'undefined') return;\n const lab = labBody.closest('.lk-lab');\n const shellBody = labBody.closest('.lk-shell-body');\n if (!lab || !shellBody) return;\n\n // A shrinking window overflows for a frame or two before the workspace\n // re-lays out, so only overflow that outlasts the resize is reported.\n let timer: ReturnType<typeof setTimeout> | undefined;\n const observer = new ResizeObserver(() => {\n clearTimeout(timer);\n timer = setTimeout(() => {\n const why = explainLabScroll(lab, shellBody);\n if (!why) return;\n observer.disconnect();\n console.warn(`[labkit] <Lab> should fit its container without scrolling, but ${why}.`);\n }, SETTLE_MS);\n });\n for (const el of [document.documentElement, lab, shellBody, labBody]) observer.observe(el);\n return () => {\n clearTimeout(timer);\n observer.disconnect();\n };\n }, [labBody]);\n}\n","import { AddIcon } from '@weasel-js/ui';\nimport { MenuButton, ThemeSwitcher } from '../passthrough/weasel-ui';\nimport { useLabContext } from './LabContext';\n\n/** The control `<Lab>` puts at the start of its header: add a trial. It drives\n * `LabContext`, which carried it with no UI at all — so every consumer rebuilt\n * it. Rendered before a consumer's own header content. */\nexport function LabHeader({ addTrial = true }: { addTrial?: boolean }) {\n const lab = useLabContext();\n const only = lab.instruments.length === 1 ? lab.instruments[0] : null;\n\n return (\n <>\n {!addTrial ? null : only ? (\n <button\n type=\"button\"\n className=\"lk-lab-header__add\"\n onClick={() => lab.addTrial(only.name)}\n >\n <AddIcon size={16} />\n <span>Add trial</span>\n </button>\n ) : (\n <MenuButton\n aria-label=\"Add trial\"\n label=\"Add trial…\"\n items={lab.instruments.map((i) => ({ value: i.name, label: i.title ?? i.name }))}\n onAction={(name) => lab.addTrial(name)}\n />\n )}\n </>\n );\n}\n\n/** The lab's color-mode switch, which `<Lab>` puts at the end of its header,\n * after a consumer's own header content. */\nexport function LabThemeSwitcher() {\n const lab = useLabContext();\n return <ThemeSwitcher value={lab.mode} onChange={lab.setMode} />;\n}\n","import { labContributions, useLabChromeContext } from '../chrome/LabChrome';\nimport type { LabContribution } from '../chrome/labTypes';\nimport { PaletteRegion } from '../chrome/regions/PaletteRegion';\nimport type { TrialTool } from '../tools/types';\n\n/** Props for `<LabPalette>`. */\nexport interface LabPaletteProps {\n /** Tools offered lab-wide. Shorthand for one `palette` contribution each. */\n tools?: readonly TrialTool[];\n /** The lab's contributions; the `palette` ones are laid out here. */\n contributions?: readonly LabContribution[];\n}\n\n/** The lab's tool rail. Writes the lab's tool slot, which every trial whose\n * instrument declares no tools of its own resolves to. Renders nothing when\n * the lab contributes no tool rail. */\nexport function LabPalette({ tools, contributions }: LabPaletteProps) {\n const ctx = useLabChromeContext();\n const all = labContributions(tools, contributions);\n return <PaletteRegion contributions={all.filter((c) => c.region === 'palette')} ctx={ctx} />;\n}\n","import { ThemeProvider, useResolvedColorMode, useThemeOptional } from '@weasel-js/theme/react';\nimport type { ReactNode } from 'react';\nimport type { LabMode } from '../state/types';\nimport { interstellarTheme } from '../theme/interstellar';\n\n/** Props for `<LabRoot>`. */\nexport interface LabRootProps {\n children: ReactNode;\n /** Color mode. \"auto\" (default) follows prefers-color-scheme. */\n mode?: LabMode;\n /** Added after `lk-root` on the same element. */\n className?: string;\n}\n\n/** The element every labkit component expects above it: `.lk-root`, which\n * carries the design tokens, the font stack, the box-sizing reset and the\n * element defaults a lab's bare markup is styled by, plus a theme when the\n * app has not already applied one.\n *\n * `<LabShell>` and `<Lab>` render this themselves. Mount it by hand around a\n * labkit piece used on its own — a bare `<Workspace>` or `<ControlPanel>` —\n * or those components inherit whatever the host page happens to define.\n * Pair it with `import '@weasel-js/labkit/styles.css'`, which is what defines\n * the rules this element scopes. */\nexport function LabRoot({ children, mode = 'auto', className }: LabRootProps) {\n const resolved = useResolvedColorMode(mode);\n const outer = useThemeOptional();\n\n // Overlays portal here rather than to the themed wrapper above: `.lk-root`\n // carries the element defaults a lab's bare markup is styled by.\n const root = (\n <div className={className ? `lk-root ${className}` : 'lk-root'} data-wzl-portal-host=\"\">\n {children}\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 root\n ) : (\n <ThemeProvider theme={interstellarTheme} selection={{ mode: resolved }}>\n {root}\n </ThemeProvider>\n );\n}\n","import { useCallback, useEffect, useId, useRef, useState } from 'react';\n\n/** One page in a project's set of labs. */\nexport interface LabPage {\n /** The page's own URL, and how the switcher knows which page is open. A\n * hash route (`#/dev/tools`) names a page on the current document. */\n href: string;\n label: string;\n}\n\n/** Props for `<LabSwitcher>`. */\nexport interface LabSwitcherProps {\n /** The open page's title, shown as the control's own label. */\n title: string;\n pages: readonly LabPage[];\n /** Defaults to the current location. Pass it in tests, or to render a\n * switcher for a page other than the one being viewed. */\n path?: string;\n className?: string;\n}\n\n/** A URL split into the document it names and the hash route on it, each\n * without its query, trailing slash or `.html`. */\nfunction locate(url: string): { doc: string; route: string } {\n const hash = url.indexOf('#');\n const trim = (part: string) => part.replace(/\\?.*$/, '').replace(/\\/$/, '');\n return {\n doc: trim(hash < 0 ? url : url.slice(0, hash)).replace(/\\.html$/, ''),\n route: hash < 0 ? '' : trim(url.slice(hash + 1)),\n };\n}\n\n/** Which of `pages` a path is on, or -1.\n *\n * Matched on the end of the path so a query string, a trailing slash or a\n * leftover `.html` cannot lose it: a project whose dev server maps `/stats`\n * to `stats.html` serves both spellings, and a bookmark from before the URLs\n * lost their extension still resolves to the same page.\n *\n * A page whose `href` carries a hash is a route on a single document and wins\n * when the path's hash is that route or one under it. A page without one\n * ignores the hash, so an in-page anchor does not lose it. */\nexport function currentPage(path: string, pages: readonly LabPage[]): number {\n const here = locate(path);\n const onDoc = (doc: string) => here.doc.endsWith(doc);\n const routed = pages.findIndex((p) => {\n if (!p.href.includes('#')) return false;\n const page = locate(p.href);\n return (\n onDoc(page.doc) && (here.route === page.route || here.route.startsWith(`${page.route}/`))\n );\n });\n if (routed >= 0) return routed;\n return pages.findIndex((p) => !p.href.includes('#') && onDoc(locate(p.href).doc));\n}\n\n/** A project's lab title, doubling as the way to reach its other labs.\n *\n * The menu holds real anchors, not a `<select>` and not buttons. These are\n * separate documents, so an `href` is what gets middle-click, cmd-click and\n * the back button for free; a select fires a change event and can do none of\n * the three. The trigger is a button because it opens something rather than\n * going anywhere.\n *\n * Pages accumulate -- a project grows a wall, a dashboard, an ingest page, a\n * bench -- and a tab strip is the layout that stops working first. */\nexport function LabSwitcher({ title, pages, path, className }: LabSwitcherProps) {\n const [open, setOpen] = useState(false);\n const root = useRef<HTMLDivElement>(null);\n const menuId = useId();\n const here = currentPage(\n path ?? (typeof window === 'undefined' ? '' : window.location.pathname + window.location.hash),\n pages,\n );\n\n const close = useCallback(() => setOpen(false), []);\n\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n close();\n root.current?.querySelector('button')?.focus();\n }\n };\n // Pointer, not click: a press that starts outside should dismiss before\n // whatever it lands on reacts, the way every other menu on the page does.\n const onDown = (e: PointerEvent) => {\n if (!root.current?.contains(e.target as Node)) close();\n };\n document.addEventListener('keydown', onKey);\n document.addEventListener('pointerdown', onDown);\n return () => {\n document.removeEventListener('keydown', onKey);\n document.removeEventListener('pointerdown', onDown);\n };\n }, [open, close]);\n\n // One lab is not a set to choose from, and a disclosure arrow promising a\n // menu of itself is worse than no control.\n if (pages.length < 2) {\n return <h1 className={`lk-switcher-title${className ? ` ${className}` : ''}`}>{title}</h1>;\n }\n\n return (\n <div className={`lk-switcher${className ? ` ${className}` : ''}`} ref={root}>\n <h1 className=\"lk-switcher-title\">\n <button\n type=\"button\"\n className=\"lk-switcher-trigger\"\n aria-expanded={open}\n aria-haspopup=\"menu\"\n aria-controls={open ? menuId : undefined}\n onClick={() => setOpen((was) => !was)}\n >\n {title}\n <span className=\"lk-switcher-caret\" aria-hidden=\"true\" />\n </button>\n </h1>\n {open && (\n <div className=\"lk-switcher-menu\" id={menuId} role=\"menu\">\n {pages.map((page, i) => (\n <a\n key={page.href}\n href={page.href}\n role=\"menuitem\"\n className=\"lk-switcher-item\"\n aria-current={i === here ? 'page' : undefined}\n onClick={close}\n >\n {page.label}\n </a>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { type ReactNode, useEffect } from 'react';\nimport type { LabMode } from '../state/types';\nimport { LabRoot } from './LabRoot';\nimport type { LabPage } from './LabSwitcher';\nimport { LabSwitcher } from './LabSwitcher';\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 /** The project's other labs. Given two or more, the title becomes the way\n * to reach them; given none, it stays a plain heading. */\n pages?: readonly LabPage[];\n /** The path the switcher reads to mark the open page. Defaults to the\n * current location. */\n path?: string;\n /** Set as `document.title` while the shell is mounted, and the previous\n * title restored after. Omitted, the document's title is left alone. */\n documentTitle?: string;\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({\n title,\n children,\n header,\n footer,\n mode = 'auto',\n pages,\n path,\n documentTitle,\n}: LabShellProps) {\n useEffect(() => {\n if (documentTitle === undefined) return;\n const previous = document.title;\n document.title = documentTitle;\n return () => {\n document.title = previous;\n };\n }, [documentTitle]);\n\n return (\n <LabRoot mode={mode} className=\"lk-shell\">\n <header className=\"lk-shell-header\">\n {pages && pages.length > 0 ? (\n <LabSwitcher title={title} pages={pages} path={path} className=\"lk-shell-title\" />\n ) : (\n <h1 className=\"lk-shell-title\">{title}</h1>\n )}\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 </LabRoot>\n );\n}\n","import {\n type Action,\n ActionDisabledReason,\n ActionsProvider,\n type ActionsRegistry,\n ActiveToolContextProvider,\n DepRegistryProvider,\n makeViewportZoomAction,\n type Tool,\n useActionsRegistry,\n useDepSource,\n useGestureDispatcher,\n type ViewApi,\n} from '@weasel-js/core';\nimport { ZoomInIcon, ZoomOutIcon } from '@weasel-js/ui';\nimport { useContext, useEffect, useMemo, useRef, useSyncExternalStore } from 'react';\nimport { useStore } from 'zustand/react';\nimport type { CameraView } from '../canvas/CameraInput';\nimport { CameraRegistryContext } from '../canvas/cameraRegistry';\nimport { atScale, viewMiddle } from '../canvas/cameraZoom';\nimport { formatShortcut } from '../passthrough/weasel-ui';\nimport { Toolbar } from '../primitives/Toolbar';\nimport { LabStoreContext } from '../state/context';\nimport { as2DView } from '../state/view';\nimport { useLabContext } from './LabContext';\n\nconst ZOOM_ID = 'viewport.zoom';\nconst NO_TOOLS: ReadonlyMap<string, Tool> = new Map();\nconst CHANNELS = { contextMenu: false, ingest: false } as const;\nconst NO_ELEMENT = { current: null };\n\ntype ZoomKind = 'in' | 'out' | 'reset';\n\ninterface KeyBinding {\n spec: { kind: string; key?: string; mods?: { mod?: boolean; shift?: boolean | 'optional' } };\n opts?: { params?: { kind?: string } };\n}\n\n// Core's zoom with only its keys: the wheel and pinch belong to each trial's\n// own dispatcher. The clamp is left to the camera, which knows its range.\nconst BASE = makeViewportZoomAction({ min: 1e-9, max: Number.POSITIVE_INFINITY });\nconst KEY_BINDINGS = (BASE.defaultBinding as KeyBinding[]).filter((b) => b.spec.kind === 'key');\n\nfunction shortcutFor(kind: ZoomKind): string | undefined {\n const spec = KEY_BINDINGS.find((b) => b.opts?.params?.kind === kind)?.spec;\n return spec?.key ? formatShortcut({ key: spec.key, mod: spec.mods?.mod }) : undefined;\n}\n\n/** The focused trial's camera, with the zoom's reset meaning actual size about\n * the middle of the view. */\nfunction forZoom(camera: CameraView): ViewApi {\n return {\n get: camera.get,\n set: camera.set,\n hostSize: camera.hostSize,\n recenter: () => atScale(camera.get(), 1, viewMiddle(camera)),\n };\n}\n\nconst percent = new Intl.NumberFormat(undefined, { style: 'percent', maximumFractionDigits: 0 });\n\n/**\n * Zoom out, the zoom as a percentage, and zoom in, for whichever trial has the\n * focus. The percentage resets to actual size. They route through core's\n * `viewport.zoom` action, on a dispatcher of their own that listens for its\n * keys — Mod+=, Mod+- and Mod+0 — so the buttons and the keys are one path.\n * Over a trial with no camera the group stays, disabled, so the header does not\n * reflow as the focus moves.\n */\nexport function LabZoom() {\n return (\n <DepRegistryProvider>\n <ActionsProvider>\n <ActiveToolContextProvider>\n <LabZoomControls />\n </ActiveToolContextProvider>\n </ActionsProvider>\n </DepRegistryProvider>\n );\n}\n\nfunction LabZoomControls() {\n const registry = useActionsRegistry() as ActionsRegistry;\n const { focusedTrialId } = useLabContext();\n const cameras = useContext(CameraRegistryContext);\n const storeCtx = useContext(LabStoreContext);\n if (!storeCtx) throw new Error('[labkit] <LabZoom> requires <LabStoreProvider>');\n\n const camera = useSyncExternalStore(cameras?.subscribe ?? noSubscribe, () =>\n cameras && focusedTrialId ? cameras.get(focusedTrialId) : null,\n );\n const zoom = useStore(storeCtx.store, (s) => {\n const record = s.trials.find((t) => t.id === focusedTrialId);\n return as2DView(record?.view)?.zoom ?? null;\n });\n\n const live = zoom !== null && camera !== null;\n const view = useMemo(() => (camera ? forZoom(camera) : null), [camera]);\n const viewRef = useRef(view);\n viewRef.current = live ? view : null;\n\n useDepSource('view', () => viewRef.current as ViewApi);\n\n useEffect(() => {\n const action: Action = {\n ...BASE,\n defaultBinding: KEY_BINDINGS as Action['defaultBinding'],\n enabled: () => (viewRef.current ? true : ActionDisabledReason.NotApplicable),\n };\n return registry.register(action);\n }, [registry]);\n\n // First, so a story's own zoom keys do not also fire over a trial with a\n // camera; over one without, the action is disabled and the keys pass on.\n useGestureDispatcher({\n canvasRef: NO_ELEMENT,\n actions: registry,\n entriesById: NO_TOOLS,\n channels: CHANNELS,\n keyboard: 'first',\n });\n\n const range = camera?.zoomRange();\n // A step that lands within rounding of a limit has reached it.\n const canIn = zoom !== null && range !== undefined && zoom < range.max * (1 - 1e-9);\n const canOut = zoom !== null && range !== undefined && zoom > range.min * (1 + 1e-9);\n const run = (kind: ZoomKind) => () => {\n registry.trigger(ZOOM_ID, { kind });\n };\n const hint = (label: string, kind: ZoomKind): string => {\n const keys = shortcutFor(kind);\n return keys ? `${label} (${keys})` : label;\n };\n const shown = live && zoom !== null ? percent.format(zoom) : null;\n\n return (\n <Toolbar aria-label=\"Zoom\">\n <Toolbar.Group aria-label=\"Zoom\">\n <Toolbar.Button\n iconOnly\n aria-label=\"Zoom out\"\n title={hint('Zoom out', 'out')}\n disabled={!canOut}\n onClick={run('out')}\n >\n <ZoomOutIcon size={16} />\n </Toolbar.Button>\n <Toolbar.Button\n aria-label={shown ? `Zoom ${shown} — reset to actual size` : 'Zoom unavailable'}\n title={live ? hint('Actual size', 'reset') : 'This trial has no camera'}\n disabled={!live}\n onClick={run('reset')}\n >\n <span className=\"lk-lab-zoom__readout\">{shown ?? '–'}</span>\n </Toolbar.Button>\n <Toolbar.Button\n iconOnly\n aria-label=\"Zoom in\"\n title={hint('Zoom in', 'in')}\n disabled={!canIn}\n onClick={run('in')}\n >\n <ZoomInIcon size={16} />\n </Toolbar.Button>\n </Toolbar.Group>\n </Toolbar>\n );\n}\n\nconst noSubscribe = (): (() => void) => () => {};\n","import {\n Children,\n type ReactNode,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from 'react';\nimport { asNodeId, createNode, floatingStrategy, gridStrategy, type NodeId, Store } from 'windease';\nimport {\n type ChromeMap,\n Container,\n DragProvider,\n Provider,\n StrategyRegistryProvider,\n} from 'windease/react';\n\nimport { useSurfaceOptional } from '../surface/useSurfaceTile';\nimport { TrialDragContext } from '../trial/TrialDragContext';\nimport { usePanelHosts } from './panelHost';\n\nconst ZONE_ID = asNodeId('lk-workspace');\nconst STRATEGIES = { grid: gridStrategy as never, floating: floatingStrategy as never };\nconst FLOAT_ZONE_ID = asNodeId('lk-workspace-floating');\nconst PANEL_KIND = 'panel';\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 /** Undocked sidebar panels to render alongside the trials. A `'tile'` panel\n * joins the grid as a peer of the trials; a `'floating'` one goes into the\n * floating zone above it. The body is portalled in by the trial that owns\n * it, so all this renders is the frame and the host. */\n panels?: readonly PanelDescriptor[];\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 *\n * `panels` are undocked sidebar sections. A `'tile'` panel is registered as a\n * peer of the trials under `PANEL_KIND`, so the grid places and resizes it like\n * one; a `'floating'` panel goes in the overlay above. Either way this renders\n * only the frame and an empty host: the section's content is portalled in by\n * the trial that owns it, which is what keeps a torn-out section inside its\n * trial's React tree instead of rebuilding it as a sibling.\n */\n\n/** The frame an undocked panel gets: a box, and the host element its trial\n * portals into. The title and the dock control come through the portal with\n * the body — the workspace knows a panel's key, not what is in it. */\nfunction PanelFrame({ panel, floating = false }: { panel: PanelDescriptor; floating?: boolean }) {\n const hosts = usePanelHosts();\n return (\n <div className={floating ? 'lk-panel-tile lk-panel-tile--floating' : 'lk-panel-tile'}>\n <div className=\"lk-panel-tile__body\" ref={(el) => hosts?.set(panel.key, el)} />\n </div>\n );\n}\n\n/** One undocked panel, as the workspace needs to know it. */\nexport interface PanelDescriptor {\n /** Stable key; also the portal host key the owning trial writes into. */\n key: string;\n title: string;\n as: 'tile' | 'floating';\n}\n\nexport function Workspace({\n children,\n ids,\n panels,\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 tilePanels = useMemo(() => (panels ?? []).filter((p) => p.as === 'tile'), [panels]);\n const floatPanels = useMemo(() => (panels ?? []).filter((p) => p.as === 'floating'), [panels]);\n // Identity has to be stable while the id *contents* are unchanged: the sync\n // effect below keys off it, and a fresh array every render would re-register\n // every tile forever. A ref keyed on the joined ids says that directly, where\n // a `useMemo` on the same key can only say it by suppressing both linters.\n const wantedIds = [\n ...items.map((_, i) => ids?.[i] ?? `lk-ws-${i}`),\n ...tilePanels.map((p) => `lk-panel-${p.key}`),\n ];\n const idKey = wantedIds.join(',');\n const idKeyRef = useRef<string | null>(null);\n const nodeIdsRef = useRef<NodeId[]>([]);\n if (idKeyRef.current !== idKey) {\n idKeyRef.current = idKey;\n nodeIdsRef.current = wantedIds.map(asNodeId);\n }\n const nodeIds = nodeIdsRef.current;\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 store.registerNode(\n createNode({\n kind: 'zone',\n id: FLOAT_ZONE_ID,\n container: { strategyId: 'floating', config: {} },\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 const kind = String(id).startsWith('lk-panel-') ? PANEL_KIND : KIND;\n store.registerNode(createNode({ 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]);\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 const panelByNode = new Map<string, PanelDescriptor>(\n tilePanels.map((p) => [`lk-panel-${p.key}`, p]),\n );\n return {\n [PANEL_KIND]: ({ node }) => {\n const panel = panelByNode.get(String(node.id));\n if (!panel) return null;\n return <PanelFrame panel={panel} />;\n },\n [KIND]: ({ node }) => {\n const content = byId.get(node.id) ?? null;\n if (!reorderable) return content;\n return (\n // No grip strip: the trial's own title bar is the drag surface.\n <TrialDragContext.Provider value={{ nodeId: node.id }}>\n <div className=\"lk-trial-tile\">{content}</div>\n </TrialDragContext.Provider>\n );\n },\n };\n }, [nodeIds, items, reorderable, tilePanels]);\n\n const floatingLayer =\n floatPanels.length === 0 ? null : (\n <div className=\"lk-workspace__floating\">\n {floatPanels.map((p) => (\n <PanelFrame key={p.key} panel={p} floating />\n ))}\n </div>\n );\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 {floatingLayer ? (\n // The floating layer insets against the workspace, so it needs a\n // positioned box around both. Without one it insets against the page\n // and lands over the lab header.\n <div className=\"lk-workspace-host\">\n {reorderable ? <DragProvider>{grid}</DragProvider> : grid}\n {floatingLayer}\n </div>\n ) : reorderable ? (\n <DragProvider>{grid}</DragProvider>\n ) : (\n grid\n )}\n </StrategyRegistryProvider>\n </Provider>\n );\n}\n","import { type ColorList, colorAt, colorCount, resolveTheme, type Theme } from '@weasel-js/theme';\nimport { ThemeProvider, useResolvedColorMode } from '@weasel-js/theme/react';\nimport {\n type CSSProperties,\n type ReactNode,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useStore } from 'zustand/react';\nimport { AnnotationPreloadContext } from '../annotations/preload';\nimport { labAnnotationTools } from '../annotations/toolMap';\nimport { CameraRegistryContext, createCameraRegistry } from '../canvas/cameraRegistry';\nimport {\n LabAsideRegion,\n LabFooterRegion,\n LabHeaderRegion,\n LabSidebarRegion,\n labContributions,\n} from '../chrome/LabChrome';\nimport type { LabContribution } from '../chrome/labTypes';\nimport type { TrialContribution } from '../chrome/types';\nimport type { ConfigRule, ControlRenderer } from '../config/types';\nimport type { InstrumentList } from '../instrument/types';\nimport { Split } from '../primitives/Split';\nimport { defaultStorage, noneAdapter } from '../state/adapters';\nimport { LabStoreContext } from '../state/context';\nimport { type OpenedLabStore, openLabStore } from '../state/openLabStore';\nimport { PersistenceContext } from '../state/Persistence';\nimport { createRecordCache } from '../state/records';\nimport { createLabStore, type LabStore } from '../state/store';\nimport type { LabDensity, LabMode, StorageAdapter, TrialRecord } from '../state/types';\nimport { useOpenOnce, useWarnIgnoredChange } from '../state/useOpenOnce';\nimport { usePersistedState } from '../state/usePersistedState';\nimport { SurfaceCanvasContext, SurfaceContext } from '../surface/SurfaceContext';\nimport { useSurfaceCanvas, useSurfaceOptional } from '../surface/useSurfaceTile';\nimport { type SurfaceFrame, useTiledSurface } from '../surface/useTiledSurface';\nimport { interstellarTheme } from '../theme/interstellar';\nimport type { TrialTool } from '../tools/types';\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 swapTrial as swapTrialOp,\n} from '../trial/trialOps';\nimport { useLabFitWarning } from './fitCheck';\nimport { LabContext, type LabContextValue } from './LabContext';\nimport { LabHeader, LabThemeSwitcher } from './LabHeader';\nimport { LabPalette } from './LabPalette';\nimport { LabShell } from './LabShell';\nimport type { LabPage } from './LabSwitcher';\nimport { LabZoom } from './LabZoom';\nimport { createPanelHostRegistry, PanelHostContext } from './panelHost';\nimport { type PanelDescriptor, type TrialLayout, Workspace } from './Workspace';\n\ninterface LabBaseProps {\n /** May change while mounted. An instrument that is a different object from\n * the last render counts as replaced and its open trials' configs are\n * refilled, so hoist or memoize the list. */\n instruments: InstrumentList;\n defaultInstrument: string;\n mode?: LabMode;\n /** How much room the lab's chrome takes. Default `'comfortable'`; a lab whose\n * window is the whole app, rather than a panel beside one, reads better at\n * `'roomy'`. The trials' own contents are unaffected. */\n density?: LabDensity;\n /** The theme the lab's chrome resolves against, applied at `mode` and\n * `density`. Default `interstellarTheme`; extend it rather than replace it to\n * keep the lab's look while changing a few tokens. */\n theme?: Theme;\n /** Rendered while a stored lab loads. Default: the lab's empty shell. */\n fallback?: ReactNode;\n /**\n * Colors composing the interstellar theme's cosmic backdrop. Each becomes\n * one radial-gradient blob on the dark void base, in a fixed spread of\n * positions; extras wrap around. A theme ramp resolves against the lab's\n * theme; a function list gives as many blobs as there are positions.\n * Ignored unless the resolved mode is dark.\n */\n nebula?: ColorList;\n title?: string;\n /** The project's other labs. Given two or more, the title becomes the way to\n * reach them — the same switcher `<LabShell>` renders, so a lab reached from\n * one is not a dead end. */\n pages?: readonly LabPage[];\n /** The path the switcher marks as open. Defaults to the current location. */\n path?: string;\n /** Rendered in the shell's footer, below the workspace. */\n footer?: ReactNode;\n /** Contributions added to every trial's chrome, after the instrument's own. */\n chrome?: readonly TrialContribution[];\n /** Contributions to the lab's own chrome — its header bar, its sidebar, its\n * tool rail and its footer — rather than to every trial's. Rendered after\n * `children` and `footer`, which stay the way a lab drops arbitrary content\n * into those same two boxes. Going from no sidebar contributions to some\n * remounts the workspace and every trial, dropping unpersisted trial state. */\n labChrome?: readonly LabContribution[];\n /** Built-in contribution ids to drop. Throws on an id that is not there. */\n suppress?: readonly string[];\n /** Offer the header's add-trial control. Default `true`; a lab that opens\n * trials some other way passes `false`. */\n addTrial?: boolean;\n /** Offer the header's zoom controls, which act on the focused trial's camera\n * and answer Mod+=, Mod+- and Mod+0. Default `true`. */\n zoom?: boolean;\n /** Tools offered lab-wide. A trial whose instrument declares none of its own\n * reflects and writes this slot. */\n tools?: readonly TrialTool[];\n /** Rules run over every instrument's config leaves, before labkit's own\n * inference — where a lab states a convention once instead of annotating\n * each field. Memoize or hoist. */\n configRules?: readonly ConfigRule[];\n /** Control overrides and app-defined kinds for every trial's settings panel.\n * Keys are config paths (checked first) or leaf kinds. Memoize or hoist. */\n controls?: Record<string, ControlRenderer>;\n children?: ReactNode;\n}\n\n/** Props for `<Lab>`. With a `storageKey` the lab persists — to IndexedDB\n * unless `storage` names another substrate — and both are read once, at\n * mount. Without one, nothing persists. */\nexport type LabProps = LabBaseProps &\n (\n | { storageKey?: undefined; storage?: undefined }\n | { storageKey: string; storage?: StorageAdapter }\n );\n\ninterface OpenedLab extends OpenedLabStore {\n marks: ReadonlyMap<string, unknown>;\n}\n\nfunction seedDefaultTrial(\n store: LabStore,\n instruments: InstrumentList,\n defaultInstrument: string,\n): void {\n if (store.getState().trials.length > 0) return;\n const record = addTrialOp([], instruments, defaultInstrument)[0];\n if (!record) return;\n const { undoStack: _undoStack, ...rest } = record;\n store.getState().addTrial(rest);\n}\n\n/** A lab with nothing to load renders at once. Its records hold\n * `usePersistedState` values for the session and write nothing. */\nfunction openUnstoredLab({ instruments, defaultInstrument, mode }: LabProps): OpenedLab {\n const store = createLabStore({ initialMode: mode ?? 'auto', instruments });\n seedDefaultTrial(store, instruments, defaultInstrument);\n const records = createRecordCache({ storage: noneAdapter, prefix: '', writable: false });\n return { store, records, close: () => records.close(), marks: new Map() };\n}\n\nasync function openStoredLab(\n { instruments, defaultInstrument, mode }: LabProps,\n storageKey: string,\n storage: StorageAdapter | undefined,\n): Promise<OpenedLab> {\n // The store reads the instruments' serializers and defaults while it is being\n // built, so they go in with it rather than being pushed onto it afterwards.\n const opened = await openLabStore({\n storageKey,\n storage: storage ?? (await defaultStorage()),\n initialMode: mode ?? 'auto',\n instruments,\n });\n seedDefaultTrial(opened.store, instruments, defaultInstrument);\n const marks = new Map<string, unknown>();\n await Promise.all(\n opened.store.getState().trials.map(async (trial) => {\n const kept = instruments.find((i) => i.name === trial.instrumentName)?.annotations?.storage;\n if (!kept) return;\n try {\n marks.set(trial.id, await kept.load());\n } catch (error) {\n console.warn(`[labkit] could not load the marks of trial \"${trial.id}\"`, error);\n marks.set(trial.id, null);\n }\n }),\n );\n return { ...opened, marks };\n}\n\nfunction LabFallback({\n title,\n mode,\n density,\n theme = interstellarTheme,\n pages,\n path,\n}: Pick<LabBaseProps, 'title' | 'mode' | 'density' | 'theme' | 'pages' | 'path'>) {\n const resolvedMode = useResolvedColorMode(mode ?? 'auto');\n return (\n <ThemeProvider\n theme={theme}\n selection={{ mode: resolvedMode, density: density ?? 'comfortable' }}\n className=\"lk-lab\"\n >\n <LabShell\n title={title ?? 'Labkit'}\n mode={mode}\n {...(pages ? { pages } : {})}\n {...(path !== undefined ? { path } : {})}\n >\n {null}\n </LabShell>\n </ThemeProvider>\n );\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(\n list: ColorList,\n theme: Theme,\n mode: 'light' | 'dark',\n density: string,\n): string {\n const ctx = { theme, resolved: resolveTheme(theme, { mode, density }) };\n const n = colorCount(list, ctx) ?? NEBULA_SLOTS.length;\n const colors = Array.from({ length: n }, (_, i) => colorAt(list, i, ctx));\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 strip holding the sidebar beside the tool rail and workspace. Its own component\n * because the width is a persisted value, and `LabRuntime` renders the\n * persistence provider it reads from. */\nfunction LabPanes({\n contributions,\n children,\n}: {\n contributions: readonly LabContribution[];\n children: ReactNode;\n}) {\n const surface = useSurfaceOptional();\n const [sidebarWidth, setSidebarWidth] = usePersistedState<number | undefined>(\n 'lk-lab-sidebar-width',\n undefined,\n { scope: 'lab' },\n );\n const [asideWidth, setAsideWidth] = usePersistedState<number | undefined>(\n 'lk-lab-aside-width',\n undefined,\n { scope: 'lab' },\n );\n const main = contributions.some((c) => c.region === 'aside') ? (\n <Split\n className=\"lk-lab__panes\"\n side=\"end\"\n sidebarClassName=\"lk-lab__aside\"\n contentClassName=\"lk-lab__main\"\n label=\"Lab aside\"\n defaultWidth={320}\n width={asideWidth}\n onWidthChange={(w) => {\n setAsideWidth(w);\n surface?.invalidateRects();\n }}\n sidebar={<LabAsideRegion contributions={contributions} />}\n >\n {children}\n </Split>\n ) : (\n children\n );\n if (!contributions.some((c) => c.region === 'sidebar')) return main;\n return (\n <Split\n className=\"lk-lab__panes\"\n sidebarClassName=\"lk-lab__sidebar\"\n contentClassName=\"lk-lab__main\"\n label=\"Lab sidebar\"\n defaultWidth={260}\n width={sidebarWidth}\n onWidthChange={(w) => {\n setSidebarWidth(w);\n surface?.invalidateRects();\n }}\n sidebar={<LabSidebarRegion contributions={contributions} />}\n >\n {main}\n </Split>\n );\n}\n\n/** The lab runtime: opens the store, provides it, and renders one trial\n * per record in a grid. Each trial runs one of `instruments`. */\nexport function Lab(props: LabProps) {\n if (process.env.NODE_ENV !== 'production' && props.instruments.length === 0) {\n throw new Error('[labkit] <Lab> requires a non-empty `instruments` array');\n }\n const { storageKey, storage } = props;\n useWarnIgnoredChange('<Lab>', { storageKey, storage });\n const opened = useOpenOnce<OpenedLab>(() =>\n storageKey === undefined ? openUnstoredLab(props) : openStoredLab(props, storageKey, storage),\n );\n if (!opened) {\n if (props.fallback !== undefined) return props.fallback;\n return (\n <LabFallback\n title={props.title}\n mode={props.mode}\n density={props.density}\n {...(props.theme ? { theme: props.theme } : {})}\n pages={props.pages}\n path={props.path}\n />\n );\n }\n return <LabRuntime {...props} opened={opened} />;\n}\n\nfunction LabRuntime({\n instruments,\n mode,\n density,\n theme = interstellarTheme,\n nebula,\n title,\n pages,\n path,\n footer,\n chrome,\n labChrome,\n suppress,\n addTrial,\n zoom = true,\n tools,\n configRules,\n controls,\n children,\n opened,\n}: LabProps & { opened: OpenedLab }) {\n const { store } = opened;\n\n // The store opened against the list <Lab> mounted with; a later list reaches\n // it here, before paint.\n useLayoutEffect(() => {\n store.getState().setInstruments(instruments);\n }, [instruments, store]);\n\n const trials = useStore(store, (s) => s.trials);\n const [cameras] = useState(createCameraRegistry);\n const [focusPick, setFocusPick] = useState<string | null>(null);\n const focusedTrialId = trials.some((t) => t.id === focusPick)\n ? focusPick\n : (trials[0]?.id ?? null);\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 undockedPanels = useStore(store, (s) => s.undockedPanels);\n\n // One registry for the lab's lifetime: a panel host is a DOM node the\n // workspace owns and the trial portals into, so it must outlive both ends of\n // a dock/undock without being rebuilt.\n const panelHostsRef = useRef<ReturnType<typeof createPanelHostRegistry> | null>(null);\n if (panelHostsRef.current === null) panelHostsRef.current = createPanelHostRegistry();\n\n // One shared drawing surface for the whole lab, anchored to the body — tile\n // rects compose against it, and both buffers compose against the same rects.\n // `Workspace` invalidates rects when the grid moves something a\n // ResizeObserver cannot see. A host that already owns a surface keeps it: a\n // lab embedded in a larger shared-surface app must not open a second GL\n // tenancy, and mounts no buffer of its own.\n const outerSurface = useSurfaceOptional();\n const outerOver = useSurfaceCanvas('over');\n const outerUnder = useSurfaceCanvas('under');\n const [ownOver, setOwnOver] = useState<HTMLCanvasElement | null>(null);\n const [ownUnder, setOwnUnder] = useState<HTMLCanvasElement | null>(null);\n const ownOverRef = useRef<HTMLCanvasElement | null>(null);\n const ownUnderRef = useRef<HTMLCanvasElement | null>(null);\n const bufferRef = useRef({ w: 0, h: 0 });\n const surfaceRef = useRef<ReturnType<typeof useTiledSurface> | null>(null);\n\n // Sizing the buffer clears all of it, so every tile has to repaint — not\n // only the one whose move triggered the measurement. Both buffers are sized\n // together off one comparison: they are the same box, so a tenant of either\n // is looking at the same rects, and one invalidateAll covers both.\n const onFrame = useCallback((frame: SurfaceFrame) => {\n const canvases = [ownUnderRef.current, ownOverRef.current].filter((c) => c !== null);\n if (canvases.length === 0) return;\n const w = Math.round(frame.size.width * frame.dpr);\n const h = Math.round(frame.size.height * frame.dpr);\n if (bufferRef.current.w !== w || bufferRef.current.h !== h) {\n bufferRef.current = { w, h };\n for (const c of canvases) {\n c.width = w;\n c.height = h;\n c.style.width = `${frame.size.width}px`;\n c.style.height = `${frame.size.height}px`;\n }\n surfaceRef.current?.invalidateAll();\n return;\n }\n // A same-size re-tile does not go through here: assigning `width` its own\n // value resizes nothing, so it clears nothing. The tenants clear, through\n // `registerClear`.\n }, []);\n\n const ownSurface = useTiledSurface({ onFrame });\n surfaceRef.current = ownSurface;\n const [labBody, setLabBody] = useState<HTMLDivElement | null>(null);\n const attachOwnSurface = ownSurface.containerRef;\n const labBodyRef = useCallback(\n (el: HTMLDivElement | null) => {\n setLabBody(el);\n if (!outerSurface) attachOwnSurface(el);\n },\n [outerSurface, attachOwnSurface],\n );\n useLabFitWarning(labBody);\n\n useEffect(() => {\n if (!labBody) return;\n const pick = (node: unknown): void => {\n const owned = new Set(store.getState().trials.map((t) => t.id));\n const nearest = (from: Element | null | undefined) =>\n from?.closest<HTMLElement>('.lk-trial[data-trial-id]') ?? null;\n let trial =\n typeof (node as Element | null)?.closest === 'function' ? nearest(node as Element) : null;\n // A trial can hold a lab of its own, whose trials this lab does not own.\n while (trial && !owned.has(trial.dataset.trialId ?? '')) trial = nearest(trial.parentElement);\n if (trial?.dataset.trialId) setFocusPick(trial.dataset.trialId);\n };\n const onInput = (event: Event): void => pick(event.target);\n // Focus moving into a frame fires nothing in this document: the window\n // blurs, and the frame is the active element once it has.\n let pending: ReturnType<typeof setTimeout> | undefined;\n const doc = labBody.ownerDocument;\n const win = doc.defaultView;\n const onBlur = (): void => {\n clearTimeout(pending);\n pending = setTimeout(() => pick(doc.activeElement), 0);\n };\n labBody.addEventListener('pointerdown', onInput, true);\n labBody.addEventListener('focusin', onInput, true);\n win?.addEventListener('blur', onBlur);\n return () => {\n clearTimeout(pending);\n labBody.removeEventListener('pointerdown', onInput, true);\n labBody.removeEventListener('focusin', onInput, true);\n win?.removeEventListener('blur', onBlur);\n };\n }, [labBody, store]);\n const surface = outerSurface ?? ownSurface;\n const surfaceCanvases = useMemo(\n () =>\n outerSurface ? { over: outerOver, under: outerUnder } : { over: ownOver, under: ownUnder },\n [outerSurface, outerOver, outerUnder, ownOver, ownUnder],\n );\n\n const workspacePanels = useMemo<PanelDescriptor[]>(\n () =>\n Object.entries(undockedPanels).map(([key, panel]) => ({\n key,\n title: panel.sectionId,\n as: panel.as,\n })),\n [undockedPanels],\n );\n const resolvedMode = useResolvedColorMode(modeValue);\n\n // Tools and lab contributions share one id namespace, so they merge once\n // here — before any region renders — and a collision throws rather than one\n // of them silently losing.\n // Declaring `annotations` on any instrument puts the drawing tools here, in\n // the lab's rail: one tool is armed across every trial.\n const annotationTools = useMemo(() => labAnnotationTools(instruments), [instruments]);\n const labChromeAll = useMemo(\n () => labContributions([...annotationTools, ...(tools ?? [])], labChrome),\n [annotationTools, tools, labChrome],\n );\n const hasFooterChrome = labChromeAll.some((c) => c.region === 'footer');\n const hasPaneChrome = labChromeAll.some((c) => c.region === 'sidebar' || c.region === 'aside');\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 };\n const replaceAndFocusAdded = (next: TrialRecord[]): void => {\n const before = new Set(store.getState().trials.map((w) => w.id));\n replaceTrials(next);\n const added = next.find((w) => !before.has(w.id));\n if (added) setFocusPick(added.id);\n };\n\n return {\n instruments,\n trials,\n addTrial: (instrumentName, options) => {\n replaceAndFocusAdded(\n addTrialOp(store.getState().trials, instruments, instrumentName, options),\n );\n },\n cloneTrial: (id) => {\n replaceAndFocusAdded(cloneTrialOp(store.getState().trials, id));\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 swapTrial: (id, instrumentName, options) => {\n const current = store.getState();\n const next = swapTrialOp(current.trials, instruments, id, instrumentName, options);\n if (next === current.trials) return;\n const record = next[current.trials.findIndex((w) => w.id === id)] as TrialRecord;\n // Written before the tile registers, which is when the grid reads it.\n const { [id]: extent, ...layoutRest } = current.layout as TrialLayout;\n if (extent) current.setLayout({ ...layoutRest, [record.id]: extent });\n replaceTrials(next);\n if (focusedTrialId === id) setFocusPick(record.id);\n },\n focusedTrialId,\n focusTrial: (id) => setFocusPick(id),\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 },\n savedSnapshots,\n saveSnapshot: (trialId, name) => {\n const taken = store.getState().savedSnapshots.filter((s) => s.trialId === trialId).length;\n store.getState().saveSnapshot(trialId, name ?? `Snapshot ${taken + 1}`);\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 configRules,\n controls,\n };\n }, [\n instruments,\n trials,\n focusedTrialId,\n savedSnapshots,\n modeValue,\n store,\n configRules,\n controls,\n ]);\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 && colorCount(nebula) !== 0\n ? ({\n ['--wzl-backdrop' as string]: buildNebula(\n nebula,\n theme,\n resolvedMode,\n density ?? 'comfortable',\n ),\n } as CSSProperties)\n : undefined;\n\n const workspace = (\n <Workspace\n panels={workspacePanels}\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} chrome={chrome} suppress={suppress} />\n ))}\n </Workspace>\n );\n\n return (\n <LabStoreContext.Provider value={{ store }}>\n <PersistenceContext.Provider value={opened.records}>\n <AnnotationPreloadContext.Provider value={opened.marks}>\n <LabContext.Provider value={contextValue}>\n <CameraRegistryContext.Provider value={cameras}>\n <ThemeProvider\n theme={theme}\n selection={{ mode: resolvedMode, density: density ?? 'comfortable' }}\n className=\"lk-lab\"\n style={backdropStyle}\n >\n <LabShell\n title={title ?? 'Labkit'}\n mode={modeValue}\n {...(pages ? { pages } : {})}\n {...(path !== undefined ? { path } : {})}\n footer={\n hasFooterChrome ? (\n <>\n {footer}\n <LabFooterRegion contributions={labChromeAll} />\n </>\n ) : (\n footer\n )\n }\n header={\n <>\n <LabHeader {...(addTrial !== undefined ? { addTrial } : {})} />\n {zoom ? <LabZoom /> : null}\n {children}\n <LabHeaderRegion contributions={labChromeAll} />\n <LabThemeSwitcher />\n </>\n }\n >\n <PanelHostContext.Provider value={panelHostsRef.current}>\n <SurfaceContext.Provider value={surface}>\n <SurfaceCanvasContext.Provider value={surfaceCanvases}>\n <div className=\"lk-lab__body\" ref={labBodyRef}>\n {outerSurface ? null : (\n // Two buffers stacked around the trials, both inert —\n // each tile takes input from its own box. A tile's marks\n // annotate the instrument's DOM from over it; an opaque\n // renderer sits under it, so the pane can still hold a\n // label. The under one is first so it paints first.\n <>\n <canvas\n className=\"lk-lab__surface lk-lab__surface--under\"\n ref={(el) => {\n ownUnderRef.current = el;\n setOwnUnder(el);\n }}\n />\n <canvas\n className=\"lk-lab__surface lk-lab__surface--over\"\n ref={(el) => {\n ownOverRef.current = el;\n setOwnOver(el);\n }}\n />\n </>\n )}\n {hasPaneChrome ? (\n <LabPanes contributions={labChromeAll}>\n <LabPalette contributions={labChromeAll} />\n {workspace}\n </LabPanes>\n ) : (\n <>\n <LabPalette contributions={labChromeAll} />\n {workspace}\n </>\n )}\n </div>\n </SurfaceCanvasContext.Provider>\n </SurfaceContext.Provider>\n </PanelHostContext.Provider>\n </LabShell>\n </ThemeProvider>\n </CameraRegistryContext.Provider>\n </LabContext.Provider>\n </AnnotationPreloadContext.Provider>\n </PersistenceContext.Provider>\n </LabStoreContext.Provider>\n );\n}\n","import { ThemeContext } from '@weasel-js/theme/react';\nimport type { ReactNode } from 'react';\nimport { AnnotationsContext } from '../annotations/AnnotationsContext';\nimport { AnnotationPreloadContext } from '../annotations/preload';\nimport { CameraWheelContext } from '../canvas/CameraWheelContext';\nimport { CanvasStackContext } from '../canvas/CanvasStackContext';\nimport { LabStoreContext, TrialIdContext } from '../state/context';\nimport { PersistenceContext } from '../state/Persistence';\nimport { SurfaceCanvasContext, SurfaceContext } from '../surface/SurfaceContext';\nimport { TrialDragContext } from '../trial/TrialDragContext';\nimport { LabContext } from './LabContext';\nimport { PanelHostContext } from './panelHost';\n\n/** Props for `<LabBoundary>`. */\nexport interface LabBoundaryProps {\n children: ReactNode;\n}\n\n/**\n * Renders its children as though no lab, trial or theme were above them: every context a `<Lab>` or a\n * `<Trial>` publishes reads as absent below it, so a labkit piece mounted inside a trial behaves the way it\n * does on a bare page. A `<LabRoot>` under it applies its own theme instead of deferring to the lab's, and a\n * `usePersistedState` under it keeps local state instead of writing into the enclosing lab's records.\n *\n * For a host that shows arbitrary content inside a trial, such as a component workshop; a lab's own chrome\n * never needs it.\n */\nexport function LabBoundary({ children }: LabBoundaryProps) {\n return (\n <LabStoreContext.Provider value={null}>\n <PersistenceContext.Provider value={null}>\n <AnnotationPreloadContext.Provider value={null}>\n <LabContext.Provider value={null}>\n <PanelHostContext.Provider value={null}>\n <SurfaceContext.Provider value={null}>\n <SurfaceCanvasContext.Provider value={{ over: null, under: null }}>\n <TrialIdContext.Provider value={null}>\n <AnnotationsContext.Provider value={null}>\n <CameraWheelContext.Provider value={null}>\n <CanvasStackContext.Provider value={null}>\n <TrialDragContext.Provider value={null}>\n <ThemeContext.Provider value={null}>{children}</ThemeContext.Provider>\n </TrialDragContext.Provider>\n </CanvasStackContext.Provider>\n </CameraWheelContext.Provider>\n </AnnotationsContext.Provider>\n </TrialIdContext.Provider>\n </SurfaceCanvasContext.Provider>\n </SurfaceContext.Provider>\n </PanelHostContext.Provider>\n </LabContext.Provider>\n </AnnotationPreloadContext.Provider>\n </PersistenceContext.Provider>\n </LabStoreContext.Provider>\n );\n}\n","import type { FillStyle, Track } from '@weasel-js/core';\nimport {\n Badge,\n type Band,\n BandEditor,\n Button,\n ButtonBar,\n Callout,\n Checkbox,\n ColorField,\n ComboBox,\n type ControlPoint,\n CurveEditor,\n createToastQueue,\n DataGrid,\n DetentSlider,\n Dialog,\n Disclosure,\n GradientEditor,\n InlineRange,\n Input,\n ItemList,\n KeyCap,\n KeySequence,\n LayerList,\n type LayerListItem,\n MenuButton,\n moveLayers,\n NumberField,\n OptionsBar,\n PaintInput,\n Plot2D,\n PointPlotter,\n Powerline,\n type PrefGroup,\n PrefsForm,\n PropertyField,\n PropertyGroup,\n PropertyList,\n PropertyPanel,\n Radio,\n RadioGroup,\n RangeSlider,\n ResizeHandle,\n Select,\n Sidebar,\n SidebarPanel,\n Slider,\n StatusBarItem,\n StatusBarSpacer,\n Switch,\n Tab,\n TabList,\n TabPanel,\n Tabs,\n type Thumb,\n Timeline,\n ToastRegion,\n ToggleBar,\n ToolButton,\n ToolGroup,\n ToolOptionsBar,\n Tooltip,\n TooltipTrigger,\n StatusBar as UiStatusBar,\n} from '@weasel-js/ui';\nimport { type CSSProperties, type ReactNode, useId, useMemo, useRef, useState } from 'react';\nimport { Focusable } from 'react-aria-components';\nimport type { JobHandle } from '../job/types';\nimport { FloatingPanel } from '../primitives/FloatingPanel';\nimport { JobProgress } from '../primitives/JobProgress';\nimport { Legend, type LegendEntry } from '../primitives/Legend';\nimport { ScaleIndicator } from '../primitives/ScaleIndicator';\nimport { Split } from '../primitives/Split';\nimport { StatusBar } from '../primitives/StatusBar';\nimport { Toolbar } from '../primitives/Toolbar';\nimport { ZoomControl } from '../primitives/ZoomControl';\n\n/** The specimen's sections, in page order. */\nexport const SPECIMEN_SECTIONS = [\n 'Buttons & toggles',\n 'Fields & pickers',\n 'Panels & property rows',\n 'Overlays & feedback',\n 'Lists & data',\n 'Tool chrome',\n 'Editors & plots',\n 'Lab chrome',\n] as const;\n\ntype SectionTitle = (typeof SPECIMEN_SECTIONS)[number];\n\nfunction Section({ title, children }: { title: SectionTitle; children: ReactNode }) {\n const id = useId();\n return (\n <section className=\"lk-specimen__section\" aria-labelledby={id}>\n <h2 id={id} className=\"lk-specimen__heading\">\n {title}\n </h2>\n <div className=\"lk-specimen__grid\">{children}</div>\n </section>\n );\n}\n\nfunction Cell({ label, wide, children }: { label: string; wide?: boolean; children: ReactNode }) {\n return (\n <div className={wide ? 'lk-specimen__cell lk-specimen__cell--wide' : 'lk-specimen__cell'}>\n <span className=\"lk-specimen__label\">{label}</span>\n {children}\n </div>\n );\n}\n\nfunction Dot() {\n return (\n <svg viewBox=\"0 0 16 16\" width={16} height={16} aria-hidden=\"true\">\n <circle cx={8} cy={8} r={4} fill=\"currentColor\" />\n </svg>\n );\n}\n\nconst LEGEND: LegendEntry[] = [\n { key: 'contour', label: 'contour', color: 'var(--wzl-fg-muted)' },\n { key: 'floor', label: 'floor', color: 'var(--wzl-fg-subtle)', mark: 'dash' },\n { key: 'authored', label: 'authored', color: 'var(--wzl-success)', mark: 'dot' },\n { key: 'replaced', label: 'replaced', color: 'var(--wzl-danger)', mark: 'band' },\n];\n\nconst PREFS: PrefGroup = {\n name: 'Preferences',\n children: {\n canvas: {\n name: 'Canvas',\n children: {\n showGrid: {\n kind: 'boolean',\n name: 'Show grid',\n description: 'Draw a grid behind the scene.',\n default: true,\n },\n zoomStep: {\n kind: 'number',\n name: 'Zoom step',\n description: 'Percent the zoom controls move per click.',\n default: 10,\n min: 1,\n max: 50,\n },\n format: {\n kind: 'enum',\n name: 'Format',\n description: 'File type for exported images.',\n default: 'svg',\n options: [\n { value: 'svg', label: 'SVG' },\n { value: 'png', label: 'PNG' },\n ],\n },\n },\n },\n },\n};\n\nconst JOB: JobHandle = {\n status: 'running',\n done: 34,\n total: 120,\n failures: [],\n error: null,\n start: () => {},\n cancel: () => {},\n};\n\nfunction setAt(\n values: Record<string, unknown>,\n path: string,\n value: unknown,\n): Record<string, unknown> {\n const [head, ...rest] = path.split('.');\n if (head === undefined) return values;\n if (rest.length === 0) return { ...values, [head]: value };\n const inner = (values[head] as Record<string, unknown> | undefined) ?? {};\n return { ...values, [head]: setAt(inner, rest.join('.'), value) };\n}\n\nfunction ButtonsAndToggles() {\n const [snap, setSnap] = useState(true);\n const [wifi, setWifi] = useState(false);\n const [align, setAlign] = useState<string | null>('center');\n const [bold, setBold] = useState(true);\n const [italic, setItalic] = useState(false);\n const [open, setOpen] = useState(true);\n return (\n <Section title=\"Buttons & toggles\">\n <Cell label=\"Button\">\n <div className=\"lk-specimen__row\">\n <Button variant=\"primary\">Save</Button>\n <Button variant=\"secondary\">Cancel</Button>\n <Button variant=\"ghost\">Ghost</Button>\n <Button variant=\"secondary\" disabled>\n Disabled\n </Button>\n <Button variant=\"secondary\" iconOnly ariaLabel=\"Add\">\n <Dot />\n </Button>\n </div>\n </Cell>\n <Cell label=\"Badge\">\n <div className=\"lk-specimen__row\">\n <Badge shape=\"pill\" status=\"accent\" variant=\"outline\" size=\"sm\">\n ACCENT\n </Badge>\n <Badge status=\"info\" variant=\"subtle\">\n INFO\n </Badge>\n <Badge status=\"warn\" variant=\"solid\">\n WARN\n </Badge>\n <Badge status=\"danger\" variant=\"solid\">\n DANGER\n </Badge>\n <Badge status=\"muted\">MUTED</Badge>\n </div>\n </Cell>\n <Cell label=\"Checkbox, Switch\">\n <div className=\"lk-specimen__row\">\n <Checkbox isSelected={snap} onChange={setSnap}>\n Snap to grid\n </Checkbox>\n <Checkbox isIndeterminate>Mixed</Checkbox>\n <Switch isSelected={wifi} onChange={setWifi}>\n Wifi\n </Switch>\n </div>\n </Cell>\n <Cell label=\"RadioGroup\">\n <RadioGroup label=\"Snap mode\" orientation=\"horizontal\" defaultValue=\"grid\">\n <Radio value=\"off\">Off</Radio>\n <Radio value=\"grid\">Grid</Radio>\n <Radio value=\"pixel\">Pixel</Radio>\n </RadioGroup>\n </Cell>\n <Cell label=\"ToggleBar\">\n <ToggleBar\n ariaLabel=\"Align\"\n value={align}\n onChange={setAlign}\n items={[\n { value: 'left', label: 'Left' },\n { value: 'center', label: 'Center' },\n { value: 'right', label: 'Right' },\n ]}\n />\n <ToggleBar\n ariaLabel=\"Align, flat\"\n variant=\"flat\"\n value={align}\n onChange={setAlign}\n items={[\n { value: 'left', label: 'Left' },\n { value: 'center', label: 'Center' },\n { value: 'right', label: 'Right' },\n ]}\n />\n </Cell>\n <Cell label=\"OptionsBar, ButtonBar\">\n <div className=\"lk-specimen__row\">\n <OptionsBar\n ariaLabel=\"Text style\"\n items={[\n { value: 'b', label: 'B', selected: bold, onChange: setBold },\n { value: 'i', label: 'I', selected: italic, onChange: setItalic },\n ]}\n />\n <ButtonBar\n items={[\n { value: 'undo', label: 'Undo', onAction: () => {} },\n { value: 'redo', label: 'Redo', onAction: () => {} },\n ]}\n />\n </div>\n </Cell>\n <Cell label=\"MenuButton, Disclosure\">\n <div className=\"lk-specimen__row\">\n <MenuButton\n label=\"Add trial…\"\n onAction={() => {}}\n items={[\n { value: 'sine', label: 'Sine wave' },\n { value: 'annotate', label: 'Annotate' },\n ]}\n />\n <Disclosure open={open} onToggle={() => setOpen((o) => !o)} label=\"Shapes\" />\n </div>\n </Cell>\n <Cell label=\"Tabs\">\n <Tabs>\n <TabList aria-label=\"Sections\">\n <Tab id=\"props\">Props</Tab>\n <Tab id=\"events\">Events</Tab>\n <Tab id=\"snapshot\">Snapshot</Tab>\n </TabList>\n <TabPanel id=\"props\">Props panel.</TabPanel>\n <TabPanel id=\"events\">Events panel.</TabPanel>\n <TabPanel id=\"snapshot\">Snapshot panel.</TabPanel>\n </Tabs>\n </Cell>\n <Cell label=\"Keycaps\">\n <div className=\"lk-specimen__row\">\n <KeySequence keys={[{ label: '⌘' }, { label: '⇧' }, { label: 'K' }]} separator=\"+\" />\n <KeyCap label=\"K\" />\n <KeyCap label=\"⌥\" variant=\"minimal\" />\n </div>\n </Cell>\n </Section>\n );\n}\n\nfunction FieldsAndPickers() {\n const [thumbs, setThumbs] = useState<Thumb[]>([{ value: 0.25 }, { value: 0.75 }]);\n const [rate, setRate] = useState(1);\n const [width, setWidth] = useState(6);\n const [color, setColor] = useState('#b08adbff');\n const [gradient, setGradient] = useState<FillStyle>({\n fill: 'linear-gradient',\n from: { x: 0.1, y: 0.1 },\n to: { x: 0.9, y: 0.9 },\n stops: [\n { offset: 0, color: '#0fb5a8' },\n { offset: 1, color: '#f4c43c' },\n ],\n });\n const [paint, setPaint] = useState<FillStyle | null>({ fill: 'solid', color: '#b08adb' });\n return (\n <Section title=\"Fields & pickers\">\n <Cell label=\"Input\">\n <Input label=\"Name\" placeholder=\"e.g. Pico\" />\n <Input\n label=\"Size\"\n leadingAdornment={<span>W</span>}\n trailingAdornment={<span>px</span>}\n defaultValue=\"120\"\n />\n <Input label=\"Required\" isInvalid errorMessage=\"Name is required.\" />\n </Cell>\n <Cell label=\"NumberField, Select, ComboBox\">\n <NumberField label=\"Opacity\" minValue={0} maxValue={100} step={5} defaultValue={80} />\n <Select\n label=\"Color\"\n defaultSelectedKey=\"g\"\n options={[\n { value: 'r', label: 'Red' },\n { value: 'g', label: 'Green' },\n { value: 'b', label: 'Blue' },\n ]}\n />\n <ComboBox\n label=\"Filter\"\n placeholder=\"Type to filter…\"\n options={[\n { value: 'r', label: 'Red' },\n { value: 'g', label: 'Green' },\n ]}\n />\n </Cell>\n <Cell label=\"RangeSlider, Slider\">\n <RangeSlider label=\"Range\" defaultValue={[20, 80]} minValue={0} maxValue={100} />\n <RangeSlider\n label=\"Opacity\"\n defaultValue={75}\n minValue={0}\n maxValue={100}\n formatOutput={(v) => `${v}%`}\n />\n <Slider\n ariaLabel=\"Pair\"\n min={0}\n max={1}\n step={0.01}\n constraint=\"ordered\"\n thumbs={thumbs}\n onInput={setThumbs}\n readoutPlacement=\"inline-after\"\n />\n </Cell>\n <Cell label=\"DetentSlider, InlineRange\">\n <DetentSlider\n items={[0.25, 0.5, 1, 2, 4]}\n value={rate}\n onChange={setRate}\n formatLabel={(r) => `${r}×`}\n labels=\"all\"\n ariaLabel=\"Playback rate\"\n />\n <InlineRange\n aria-label=\"Width\"\n min={0}\n max={20}\n value={width}\n onChange={(event) => setWidth(Number((event.target as HTMLInputElement).value))}\n />\n </Cell>\n <Cell label=\"ColorField, GradientEditor\">\n <ColorField value={color} alpha onInput={setColor} onChange={setColor} aria-label=\"Color\" />\n <GradientEditor value={gradient} onInput={setGradient} onChange={setGradient} kindSwitch />\n </Cell>\n <Cell label=\"PaintInput\">\n <PaintInput\n value={paint}\n onInput={setPaint}\n onChange={setPaint}\n allowNone\n aria-label=\"Fill\"\n />\n </Cell>\n </Section>\n );\n}\n\nfunction PanelsAndRows() {\n const [opacity, setOpacity] = useState(0.8);\n const [radius, setRadius] = useState(12);\n const [fill, setFill] = useState('#5841b8');\n const [alpha, setAlpha] = useState(1);\n const [stroke, setStroke] = useState('#2ec27e');\n const [count, setCount] = useState(8);\n const [cap, setCap] = useState('round');\n const [side, setSide] = useState('center');\n const [label, setLabel] = useState('Badge');\n const [visible, setVisible] = useState(true);\n const [prefs, setPrefs] = useState<Record<string, unknown>>({});\n const [layers, setLayers] = useState<LayerListItem[]>([\n { id: 'base', label: 'Base coat' },\n { id: 'wash', label: 'Wash' },\n ]);\n const [panelCollapsed, setPanelCollapsed] = useState(false);\n return (\n <Section title=\"Panels & property rows\">\n <Cell label=\"PropertyPanel\">\n <PropertyPanel title=\"Shape\">\n <PropertyList>\n <PropertyField\n kind=\"number\"\n control=\"slider\"\n label=\"Opacity\"\n value={opacity}\n min={0}\n max={1}\n step={0.01}\n onChange={setOpacity}\n />\n <PropertyField\n kind=\"number\"\n control=\"slider\"\n label=\"Radius\"\n value={radius}\n min={0}\n max={64}\n unit=\"px\"\n onChange={setRadius}\n />\n <PropertyField\n kind=\"color\"\n label=\"Fill\"\n value={fill}\n onChange={setFill}\n alpha={alpha}\n onAlphaChange={setAlpha}\n />\n <PropertyField kind=\"color\" label=\"Stroke\" value={stroke} onChange={setStroke} />\n <PropertyField\n kind=\"number\"\n label=\"Count\"\n value={count}\n min={0}\n max={100}\n step={1}\n onChange={setCount}\n />\n <PropertyField\n kind=\"enum\"\n label=\"Line cap\"\n value={cap}\n onChange={setCap}\n options={[\n { value: 'butt', label: 'Butt' },\n { value: 'round', label: 'Round' },\n ]}\n />\n <PropertyField\n kind=\"enum\"\n control=\"toggle\"\n label=\"Align\"\n value={side}\n onChange={setSide}\n options={[\n { value: 'left', label: 'L' },\n { value: 'center', label: 'C' },\n { value: 'right', label: 'R' },\n ]}\n />\n <PropertyField kind=\"string\" label=\"Label\" value={label} onChange={setLabel} />\n <PropertyField kind=\"boolean\" label=\"Visible\" value={visible} onChange={setVisible} />\n <PropertyGroup title=\"Bevel\" defaultCollapsed>\n <PropertyField\n kind=\"number\"\n control=\"slider\"\n label=\"Rings\"\n value={32}\n min={4}\n max={96}\n step={1}\n onChange={() => {}}\n />\n </PropertyGroup>\n </PropertyList>\n </PropertyPanel>\n </Cell>\n <Cell label=\"PrefsForm\">\n <PrefsForm\n schema={PREFS}\n values={prefs}\n onChange={(path, value) => setPrefs((prev) => setAt(prev, path, value))}\n />\n </Cell>\n <Cell label=\"LayerList\">\n <LayerList\n items={layers}\n onReorder={(move) => setLayers(moveLayers(layers, move))}\n renderBody={(item) => <div>settings for {item.label}</div>}\n />\n </Cell>\n <Cell label=\"Sidebar, SidebarPanel\">\n <div className=\"lk-specimen__box\">\n <Sidebar side=\"right\" ariaLabel=\"Specimen sidebar\">\n <SidebarPanel\n title=\"Selection\"\n collapsed={panelCollapsed}\n onToggleCollapse={() => setPanelCollapsed((v) => !v)}\n onHide={() => {}}\n >\n <div className=\"lk-specimen__pad\">2 items selected</div>\n </SidebarPanel>\n </Sidebar>\n </div>\n </Cell>\n </Section>\n );\n}\n\nfunction OverlaysAndFeedback() {\n const calloutAnchor = useRef<HTMLButtonElement>(null);\n const [calloutOpen, setCalloutOpen] = useState(false);\n const [dialogOpen, setDialogOpen] = useState(false);\n const toasts = useMemo(() => createToastQueue(), []);\n return (\n <Section title=\"Overlays & feedback\">\n <Cell label=\"Tooltip, Callout, Dialog, Toast\">\n <div className=\"lk-specimen__row\">\n <TooltipTrigger>\n <Focusable>\n <button type=\"button\">Hover me</button>\n </Focusable>\n <Tooltip placement=\"bottom\">Duplicates the selected layer</Tooltip>\n </TooltipTrigger>\n <button type=\"button\" ref={calloutAnchor} onClick={() => setCalloutOpen(true)}>\n Callout\n </button>\n <Callout\n triggerRef={calloutAnchor}\n isOpen={calloutOpen}\n onOpenChange={setCalloutOpen}\n stance=\"notice\"\n title=\"Notice\"\n >\n Neutral guidance.\n </Callout>\n <Button onClick={() => setDialogOpen(true)}>Dialog</Button>\n <Dialog\n isOpen={dialogOpen}\n onOpenChange={setDialogOpen}\n title=\"Preferences\"\n footer={\n <Button variant=\"primary\" onClick={() => setDialogOpen(false)}>\n OK\n </Button>\n }\n >\n <p>Dialog body.</p>\n </Dialog>\n <Button\n onClick={() =>\n toasts.add('success', 'Saved', { description: 'All changes stored.', ttlMs: null })\n }\n >\n Toast\n </Button>\n <ToastRegion queue={toasts} placement=\"bottom-right\" />\n </div>\n </Cell>\n <Cell label=\"Powerline\">\n <Powerline\n variant=\"solid\"\n size=\"sm\"\n segments={[\n { text: 'main', status: 'accent', endCap: 'chevron' },\n { text: '✓ 12', status: 'info', endCap: 'slant' },\n { text: '~/proj', status: 'muted' },\n ]}\n />\n </Cell>\n <Cell label=\"StatusBar\">\n <UiStatusBar ariaLabel=\"Editor status\">\n <StatusBarItem>tool: select</StatusBarItem>\n <StatusBarItem>sel: 3</StatusBarItem>\n <StatusBarSpacer />\n <StatusBarItem muted>0.7.0</StatusBarItem>\n </UiStatusBar>\n </Cell>\n </Section>\n );\n}\n\nfunction ListsAndData() {\n return (\n <Section title=\"Lists & data\">\n <Cell label=\"ItemList\">\n <ItemList\n rows={[\n { id: 'a', label: 'Draw rect' },\n { id: 'b', label: 'Fill', selected: true },\n { id: 'c', label: 'Move', muted: true },\n ]}\n empty=\"Nothing\"\n />\n </Cell>\n <Cell label=\"DataGrid\">\n <DataGrid\n rows={[\n { id: '1', name: 'accent', count: 3 },\n { id: '2', name: 'info', count: 1 },\n { id: '3', name: 'danger', count: 2 },\n ]}\n columns={[\n { id: 'name', header: 'name', accessor: (r) => r.name, sortable: true },\n { id: 'count', header: 'count', accessor: (r) => r.count, sortable: true },\n ]}\n defaultSort={{ columnId: 'name', direction: 'asc' }}\n />\n </Cell>\n </Section>\n );\n}\n\nfunction ToolChrome() {\n const [tool, setTool] = useState('select');\n const [paneWidth, setPaneWidth] = useState(160);\n return (\n <Section title=\"Tool chrome\">\n <Cell label=\"ToolGroup, ToolButton\">\n <ToolGroup orientation=\"horizontal\" ariaLabel=\"Tools\">\n {['select', 'rect', 'ellipse'].map((id) => (\n <ToolButton\n key={id}\n icon={<Dot />}\n label={id}\n shortcut={id.slice(0, 1).toUpperCase()}\n active={tool === id}\n tabbable={tool === id}\n onClick={() => setTool(id)}\n />\n ))}\n </ToolGroup>\n </Cell>\n <Cell label=\"ToolOptionsBar\">\n <ToolOptionsBar label=\"Text\">\n <Button size=\"sm\" variant=\"ghost\" iconOnly ariaLabel=\"Bold\">\n B\n </Button>\n <Button size=\"sm\" variant=\"ghost\" iconOnly ariaLabel=\"Italic\">\n I\n </Button>\n </ToolOptionsBar>\n </Cell>\n <Cell label=\"ResizeHandle\">\n <div className=\"lk-specimen__box\">\n <div className=\"lk-specimen__box-main\">content</div>\n <ResizeHandle\n value={paneWidth}\n min={100}\n max={220}\n invert\n onInput={setPaneWidth}\n ariaLabel=\"Resize\"\n />\n <div\n className=\"lk-specimen__pane\"\n style={{ '--lk-specimen-pane-w': `${paneWidth}px` } as CSSProperties}\n >\n {paneWidth}px\n </div>\n </div>\n </Cell>\n </Section>\n );\n}\n\nfunction EditorsAndPlots() {\n const [curve, setCurve] = useState<ControlPoint[]>([\n { x: 0, y: 0 },\n { x: 0.3, y: 0.1 },\n { x: 0.7, y: 0.9 },\n { x: 1, y: 1 },\n ]);\n const [points, setPoints] = useState<ControlPoint[]>([\n { x: 0.2, y: 0.3 },\n { x: 0.5, y: 0.6 },\n { x: 0.8, y: 0.2 },\n ]);\n const [bands, setBands] = useState<Band<{ name: string }>[]>([\n { from: 1 / 64, data: { name: 'Radial' } },\n { from: 1 / 12, data: { name: 'Name plate' } },\n ]);\n const [band, setBand] = useState<number | null>(null);\n const [tracks, setTracks] = useState<Track[]>(\n () =>\n [\n {\n kind: 'sampled',\n label: 'x',\n keys: [\n { t: 0, value: 0 },\n { t: 800, value: 120, easing: 'easeOutCubic' },\n { t: 1600, value: 40 },\n ],\n onTick: () => {},\n },\n {\n kind: 'event',\n label: 'footstep',\n events: [\n { t: 300, fire: () => {} },\n { t: 900, fire: () => {} },\n ],\n },\n ] as Track[],\n );\n const [playhead, setPlayhead] = useState(0);\n return (\n <Section title=\"Editors & plots\">\n <Cell label=\"Plot2D\">\n <Plot2D\n width={260}\n height={130}\n grid={{ divisions: 3 }}\n axes={{}}\n xRange={[0, 2000]}\n yRange={[-0.35, 1.2]}\n />\n </Cell>\n <Cell label=\"CurveEditor\">\n <CurveEditor\n value={curve}\n onInput={setCurve}\n domain=\"1d\"\n interpolation=\"catmull-rom\"\n endpoints=\"pinned-both\"\n addPointMode=\"click-curve\"\n axes={{}}\n fill={{ side: 'below' }}\n width={260}\n height={130}\n />\n </Cell>\n <Cell label=\"PointPlotter\">\n <PointPlotter\n value={points}\n onInput={setPoints}\n xRange={[0, 1]}\n yRange={[0, 1]}\n grid={{ divisions: 3 }}\n axes={{}}\n addPointMode=\"click-empty\"\n width={260}\n height={130}\n />\n </Cell>\n <Cell label=\"BandEditor\" wide>\n <BandEditor<{ name: string }>\n min={1 / 64}\n max={1 / 2}\n scale=\"log\"\n snap\n value={bands}\n onChange={setBands}\n selectedIndex={band}\n onSelect={setBand}\n renderBand={(b) => b.data.name}\n ticks={[1 / 24, 1 / 12, 1 / 6].map((at) => ({ at, label: `1/${Math.round(1 / at)}` }))}\n />\n </Cell>\n <Cell label=\"Timeline\" wide>\n <div className=\"lk-specimen__timeline\">\n <Timeline\n tracks={tracks}\n duration={2000}\n playhead={playhead}\n onChange={setTracks}\n onScrub={setPlayhead}\n />\n </div>\n </Cell>\n </Section>\n );\n}\n\nfunction LabChrome() {\n const [zoom, setZoom] = useState(1);\n return (\n <Section title=\"Lab chrome\">\n <Cell label=\"Toolbar\" wide>\n <Toolbar aria-label=\"Trial actions\">\n <Toolbar.Title>My Trial</Toolbar.Title>\n <Toolbar.Group>\n <Toolbar.Button onClick={() => {}}>Undo</Toolbar.Button>\n <Toolbar.Button onClick={() => {}} disabled>\n Redo\n </Toolbar.Button>\n </Toolbar.Group>\n <Toolbar.Group end>\n <Toolbar.Button onClick={() => {}}>Save</Toolbar.Button>\n </Toolbar.Group>\n </Toolbar>\n </Cell>\n <Cell label=\"StatusBar\">\n <StatusBar>\n <StatusBar.Section>Items: 12</StatusBar.Section>\n <StatusBar.Section>Zoom: 100%</StatusBar.Section>\n </StatusBar>\n </Cell>\n <Cell label=\"Legend, JobProgress\">\n <Legend entries={LEGEND} />\n <JobProgress job={JOB} />\n </Cell>\n <Cell label=\"ScaleIndicator, ZoomControl\">\n <ScaleIndicator zoom={zoom} unit=\"ft\" pixelsPerUnit={50} />\n <ZoomControl zoom={zoom} onZoomChange={setZoom} min={0.1} max={8} />\n </Cell>\n <Cell label=\"FloatingPanel\">\n <div className=\"lk-specimen__floating-host\">\n <FloatingPanel anchor=\"top-right\">\n <Legend entries={LEGEND.slice(0, 2)} />\n </FloatingPanel>\n </div>\n </Cell>\n <Cell label=\"Split\" wide>\n <div className=\"lk-specimen__box\">\n <Split\n sidebar={<div className=\"lk-specimen__pad\">sidebar</div>}\n defaultWidth={160}\n minWidth={100}\n maxWidth={260}\n >\n <div className=\"lk-specimen__pad\">content</div>\n </Split>\n </div>\n </Cell>\n </Section>\n );\n}\n\n/**\n * One page of the kit's controls and chrome, each in a small working state: a\n * preview surface for a theme, where every token has something on screen that\n * reads it. Popovers, dialogs and toasts portal into the page itself, so they\n * take whatever theme the page is under.\n */\nexport function Specimen({ className }: { className?: string }) {\n return (\n <div className={className ? `lk-specimen ${className}` : 'lk-specimen'} data-wzl-portal-host=\"\">\n <ButtonsAndToggles />\n <FieldsAndPickers />\n <PanelsAndRows />\n <OverlaysAndFeedback />\n <ListsAndData />\n <ToolChrome />\n <EditorsAndPlots />\n <LabChrome />\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/annotations/staleness.ts","../src/annotations/drawOne.ts","../src/annotations/capture.ts","../src/annotations/history.ts","../src/annotations/store.ts","../src/annotations/view.ts","../src/annotations/AnnotationOverlay.tsx","../src/annotations/AnnotationTargets.tsx","../src/instrument/defineInstrument.ts","../src/instrument/validateConfigSchema.ts","../src/annotations/preload.ts","../src/theme/interstellar.theme.json","../src/theme/interstellar.ts","../src/canvas/cameraZoom.ts","../src/trial/TrialBody.tsx","../src/trial/TrialDragContext.ts","../src/trial/TrialTitleBar.tsx","../src/lab/panelHost.ts","../src/trial/UndockedSections.tsx","../src/trial/TrialChrome.tsx","../src/trial/Trial.tsx","../src/trial/trialOps.ts","../src/lab/fitCheck.ts","../src/lab/LabHeader.tsx","../src/lab/LabPalette.tsx","../src/lab/LabRoot.tsx","../src/lab/LabSwitcher.tsx","../src/lab/LabShell.tsx","../src/lab/LabZoom.tsx","../src/lab/Workspace.tsx","../src/lab/Lab.tsx","../src/lab/LabBoundary.tsx","../src/specimen/Specimen.tsx"],"names":["k","s","w","h","asNodeId","i","n","a","v","b","jsx","Fragment","createContext","useContext","jsxs","createPortal","c","p","auto","useSyncExternalStore","useStore","useState","useEffect","useRef","useMemo","useCallback","l","useLatest","r","D","S","WeaselProvider","DEFAULT_VIEW","y","x","bound","hit","addTrial","o","noSubscribe","_","useLayoutEffect","useResolvedColorMode","ThemeProvider","useInsertionEffect","useId","u","f","O","ae","j","C","d","xe"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Whether a stored mark still describes the picture the current config\n * produces. A target names the config keys its positions depend on; labkit\n * snapshots and compares them without knowing what any of them mean.\n */\n\n/** The values of `keys` in `config`, for storing beside a new mark. Keys the\n * config does not carry are omitted rather than stored as undefined, so the\n * snapshot says what was known rather than what was asked. */\nexport function seenFrom(config: unknown, keys: readonly string[]): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n if (config === null || typeof config !== 'object') return out;\n const src = config as Record<string, unknown>;\n for (const k of keys) {\n if (k in src) out[k] = src[k];\n }\n return out;\n}\n\n/**\n * Whether the picture moved under the mark.\n *\n * Only keys present in `seen` are compared. A mark filed before its target\n * declared a new dependency must not go stale retroactively: nothing can know\n * what that key was at the time, and guessing would grey out every old mark\n * the first time a target grows a key.\n */\nexport function isStale(\n seen: Readonly<Record<string, unknown>> | undefined,\n config: unknown,\n keys: readonly string[],\n): boolean {\n if (!seen || keys.length === 0) return false;\n if (config === null || typeof config !== 'object') return false;\n const src = config as Record<string, unknown>;\n for (const k of keys) {\n if (!(k in seen)) continue;\n if (!Object.is(seen[k], src[k])) return true;\n }\n return false;\n}\n","import type { DrawCommand, SceneNode, View } from '@weasel-js/core';\nimport type { WorldRect } from './frac';\nimport { type MarkStyle, markCommands } from './paint';\nimport { isStale } from './staleness';\nimport type { AnnotationData, AnnotationMeaning } from './types';\n\n/** What resolving a mark's appearance needs beyond the mark itself. */\nexport interface MarkDrawOptions {\n /** The target's content box — the world a mark's geometry is in. */\n content: { w: number; h: number };\n /** The target's `positionDependsOn`, for staleness. */\n positionDependsOn?: readonly string[];\n /** The trial's config at the time of the draw. */\n config: unknown;\n /** The instrument's vocabulary, for a status's color. */\n meaning?: AnnotationMeaning;\n}\n\n/**\n * How one mark is drawn — shared by the pane on screen and by an export.\n *\n * One function rather than two call sites building their own, because an\n * export that resolves a status color or a stale dash differently from the\n * screen produces a picture nobody was looking at.\n */\nexport function createMarkDrawOne(\n opts: MarkDrawOptions,\n): (\n node: SceneNode<AnnotationData, 'marks', WorldRect>,\n pose: WorldRect,\n view: View,\n) => DrawCommand[] {\n return (node, pose, view) =>\n markCommands({ pose, data: node.data }, resolveMarkStyle(node.data, opts), view.scale);\n}\n\n/** How a mark looks, as opposed to where it is. Separate from the callback\n * above because an SVG export resolves the same appearance without ever\n * building a draw command. */\nexport function resolveMarkStyle(data: AnnotationData, opts: MarkDrawOptions): MarkStyle {\n return {\n color: opts.meaning?.statuses?.find((s) => s.id === data.status)?.color,\n // Read off the node rather than through the store's `isStale`, which\n // wants a projected Annotation this path does not have.\n stale: isStale(data.seen, opts.config, opts.positionDependsOn ?? []),\n };\n}\n","import { asNodeId, renderSceneToPixels, warmRender } from '@weasel-js/core';\nimport { serializeSvg } from '@weasel-js/svg';\nimport { createMarkDrawOne, type MarkDrawOptions, resolveMarkStyle } from './drawOne';\nimport type { MarkScene } from './store';\nimport { markSvgNodes } from './svgNodes';\nimport type { AnnotationData, CaptureOptions, CaptureResult, CaptureSource } from './types';\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\n/** Which of the two composition routes an export takes. */\nexport type CapturePlan = 'svg-document' | 'raster-stack';\n\n/**\n * Vector all the way through, or both sides rasterized and stacked.\n *\n * An SVG base is the only one that nests: the marks serialize beside the\n * artifact's own markup and the whole document rasterizes once at the end. A\n * raster base, or none at all, takes the renderer's own path instead — which\n * is also what draws marks onto transparency for a target that declares no\n * base.\n */\nexport function capturePlan(base: CaptureSource | undefined, format: 'png' | 'svg'): CapturePlan {\n if (format === 'svg') return 'svg-document';\n return base?.kind === 'svg' ? 'svg-document' : 'raster-stack';\n}\n\n/** Re-frame a base's own `<svg>` onto the content box, keeping its `viewBox`.\n * Parsed rather than string-spliced: a base whose declared width disagrees\n * with its viewBox would otherwise land at the wrong scale. */\nfunction nestBaseSvg(markup: string, w: number, h: number): string {\n const doc = new DOMParser().parseFromString(markup, 'image/svg+xml');\n const root = doc.documentElement;\n if (doc.getElementsByTagName('parsererror').length > 0 || root.localName !== 'svg') {\n throw new Error(\"[labkit] a target's `base()` returned markup that is not an <svg> document\");\n }\n root.setAttribute('x', '0');\n root.setAttribute('y', '0');\n root.setAttribute('width', String(w));\n root.setAttribute('height', String(h));\n return new XMLSerializer().serializeToString(root);\n}\n\n/** A raster base as an `<image>` filling the content box. An external `src`\n * round-trips as a reference, so the export is only self-contained when it\n * is already a `data:` URI. */\nfunction embedRasterBase(\n base: CaptureSource,\n w: number,\n h: number,\n onWarn?: (m: string) => void,\n): string {\n const href =\n base.kind === 'canvas' ? base.canvas.toDataURL() : base.kind === 'image' ? base.src : '';\n if (base.kind === 'image' && !href.startsWith('data:')) {\n onWarn?.(`base image '${href}' is a reference, so this SVG is not self-contained`);\n }\n return serializeSvg([{ kind: 'image', href, x: 0, y: 0, width: w, height: h }], {\n viewBox: { x: 0, y: 0, width: w, height: h },\n });\n}\n\n/** Every mark on a scene, as SVG nodes, styled the way the pane styles them. */\nfunction markNodesOf(scene: MarkScene, draw: MarkDrawOptions, scale: number) {\n return [...scene.renderOrder()].flatMap((id) => {\n const node = scene.get(asNodeId(String(id)));\n if (!node) return [];\n return markSvgNodes(\n { pose: node.pose, data: node.data as AnnotationData },\n resolveMarkStyle(node.data as AnnotationData, draw),\n { x: scale, y: scale },\n );\n });\n}\n\n/** Inputs to `composeCaptureSvg`. `scale` is output pixels per content-box\n * unit; `onWarn` receives non-fatal export warnings. */\nexport interface ComposeSvgArgs {\n base?: CaptureSource;\n scene: MarkScene;\n draw: MarkDrawOptions;\n scale: number;\n onWarn?: (message: string) => void;\n}\n\n/**\n * The base and the marks in one SVG document.\n *\n * The outer `viewBox` is the content box, so marks — which are already in it —\n * need no transform, and `width`/`height` carry the export scale. Both halves\n * nest as child `<svg>` elements, which each establish their own viewport and\n * so keep their own `viewBox` math out of this function.\n *\n * Synchronous with no `warmSvg`: marks export nothing that loads on demand,\n * which `svgNodes.test.ts` pins.\n */\nexport function composeCaptureSvg(args: ComposeSvgArgs): string {\n const { base, scene, draw, scale, onWarn } = args;\n const { w, h } = draw.content;\n const baseXml =\n base === undefined\n ? ''\n : base.kind === 'svg'\n ? nestBaseSvg(base.markup, w, h)\n : embedRasterBase(base, w, h, onWarn);\n // No width/height on the marks document: a nested <svg> without them fills\n // the outer viewport exactly, which is the alignment this relies on.\n const marksXml = serializeSvg(markNodesOf(scene, draw, scale), {\n viewBox: { x: 0, y: 0, width: w, height: h },\n onWarn,\n });\n const outW = Math.max(1, Math.round(w * scale));\n const outH = Math.max(1, Math.round(h * scale));\n return `<svg xmlns=\"${SVG_NS}\" width=\"${outW}\" height=\"${outH}\" viewBox=\"0 0 ${w} ${h}\">${baseXml}${marksXml}</svg>`;\n}\n\nfunction context2d(width: number, height: number): CanvasRenderingContext2D {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('[labkit] capture needs a 2D canvas context, and this one has none');\n return ctx;\n}\n\nfunction toPngBlob(canvas: HTMLCanvasElement): Promise<Blob> {\n return new Promise((resolve, reject) => {\n let done: (b: Blob | null) => void;\n try {\n done = (blob) =>\n blob ? resolve(blob) : reject(new Error('[labkit] the browser produced no PNG'));\n canvas.toBlob(done, 'image/png');\n } catch (err) {\n // A base referencing an image from another origin taints the canvas and\n // `toBlob` throws SecurityError. Name the cause: the DOM exception on\n // its own sends people looking at labkit.\n reject(\n new Error(\n '[labkit] the capture canvas is tainted, so it cannot be read back — a base referencing a cross-origin image does this. Embed it as a data: URI.',\n { cause: err },\n ),\n );\n }\n });\n}\n\nfunction loadImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = () => reject(new Error(`[labkit] a capture base failed to load: ${src}`));\n img.src = src;\n });\n}\n\n/** Rasterize a composed document by handing it to the browser's own SVG\n * renderer — one pass over base and marks together. */\nasync function rasterizeSvg(svg: string, width: number, height: number): Promise<Blob> {\n const url = URL.createObjectURL(new Blob([svg], { type: 'image/svg+xml;charset=utf-8' }));\n try {\n const img = await loadImage(url);\n const ctx = context2d(width, height);\n ctx.drawImage(img, 0, 0, width, height);\n return await toPngBlob(ctx.canvas);\n } finally {\n URL.revokeObjectURL(url);\n }\n}\n\n/** Base pixels, then mark pixels over them. The marks come from\n * `renderSceneToPixels` rather than a readback of the live surface, so a\n * capture neither depends on nor disturbs what is on screen. */\nasync function stackRaster(\n args: ComposeSvgArgs & { width: number; height: number },\n): Promise<Blob> {\n const { base, scene, draw, scale, width, height } = args;\n const ctx = context2d(width, height);\n if (base?.kind === 'image') ctx.drawImage(await loadImage(base.src), 0, 0, width, height);\n else if (base?.kind === 'canvas') ctx.drawImage(base.canvas, 0, 0, width, height);\n\n const render = {\n scene,\n sourceRect: { x: 0, y: 0, width: draw.content.w, height: draw.content.h },\n scale: { x: scale, y: scale },\n drawOne: createMarkDrawOne(draw),\n };\n await warmRender({ render });\n const raster = renderSceneToPixels(render);\n // Through a second canvas rather than `putImageData` on this one, which\n // replaces pixels instead of compositing and would erase the base.\n const marks = context2d(raster.width, raster.height);\n marks.putImageData(\n new ImageData(Uint8ClampedArray.from(raster.data), raster.width, raster.height),\n 0,\n 0,\n );\n ctx.drawImage(marks.canvas, 0, 0, width, height);\n return toPngBlob(ctx.canvas);\n}\n\n/** What a capture needs about the target it is exporting. */\nexport interface CaptureArgs {\n target: string;\n scene: MarkScene;\n draw: MarkDrawOptions;\n base?: () => CaptureSource | Promise<CaptureSource>;\n onWarn?: (message: string) => void;\n}\n\n/** Export one target's picture with its marks on it. */\nexport async function captureTarget(\n args: CaptureArgs,\n opts: CaptureOptions = {},\n): Promise<CaptureResult> {\n const format = opts.format ?? 'png';\n const scale = opts.scale ?? 2;\n const { content } = args.draw;\n const width = Math.max(1, Math.round(content.w * scale));\n const height = Math.max(1, Math.round(content.h * scale));\n const base = await args.base?.();\n const compose: ComposeSvgArgs = {\n base,\n scene: args.scene,\n draw: args.draw,\n scale,\n onWarn: args.onWarn,\n };\n\n if (capturePlan(base, format) === 'raster-stack') {\n return {\n target: args.target,\n blob: await stackRaster({ ...compose, width, height }),\n format,\n width,\n height,\n };\n }\n\n const svg = composeCaptureSvg(compose);\n const blob =\n format === 'svg'\n ? new Blob([svg], { type: 'image/svg+xml;charset=utf-8' })\n : await rasterizeSvg(svg, width, height);\n return { target: args.target, blob, format, width, height };\n}\n","import type { Scene } from '@weasel-js/core';\n\n/** What the ordering needs of a scene: its history depth, and the two moves. */\nexport interface HistoryScene {\n historyIndex(): number;\n undo(): boolean;\n redo(): boolean;\n canUndo(): boolean;\n canRedo(): boolean;\n}\n\n/**\n * One undo ordering over several scenes.\n *\n * Each target's marks live in their own scene and each scene owns its own undo\n * stack, so \"take back the last thing I did\" is a question no single scene can\n * answer. This keeps the order changes arrived in.\n *\n * The order is maintained from each scene's `historyIndex()`, not from its\n * subscribe callback: a scene notifies on ephemeral changes that are not\n * history at all, and an undo driven from inside a pane's own keymap has to\n * *move* this ordering rather than append to it.\n */\nexport class MarkHistory {\n private readonly depth = new Map<string, number>();\n private undoable: string[] = [];\n private redoable: string[] = [];\n /** Set while this class is driving, so a redo is not read as a new change. */\n private replaying: 'undo' | 'redo' | null = null;\n\n /** Start following `scene` under `target`. Idempotent per target. */\n track(target: string, scene: HistoryScene): void {\n if (this.depth.has(target)) return;\n this.depth.set(target, scene.historyIndex());\n }\n\n /** Call on every notification from `target`'s scene. */\n observe(target: string, scene: HistoryScene): void {\n const now = scene.historyIndex();\n const before = this.depth.get(target) ?? 0;\n this.depth.set(target, now);\n if (now > before) {\n if (this.replaying === 'redo') {\n drop(this.redoable, target);\n } else {\n // A change dropped whatever was redoable — weasel's own scene did the\n // same to its stack.\n this.redoable = [];\n }\n this.undoable.push(target);\n } else if (now < before) {\n drop(this.undoable, target);\n this.redoable.push(target);\n }\n }\n\n /** The target `undo` would act on, skipping any whose scene has nothing\n * left — a scene can drop entries this ordering still lists. */\n private next(\n stack: string[],\n can: (s: HistoryScene) => boolean,\n at: (t: string) => HistoryScene | undefined,\n ): string | null {\n for (let i = stack.length - 1; i >= 0; i--) {\n const target = stack[i];\n if (target === undefined) continue;\n const scene = at(target);\n if (scene && can(scene)) return target;\n }\n return null;\n }\n\n canUndo(at: (t: string) => HistoryScene | undefined): boolean {\n return this.next(this.undoable, (s) => s.canUndo(), at) !== null;\n }\n\n canRedo(at: (t: string) => HistoryScene | undefined): boolean {\n return this.next(this.redoable, (s) => s.canRedo(), at) !== null;\n }\n\n undo(at: (t: string) => HistoryScene | undefined): boolean {\n const target = this.next(this.undoable, (s) => s.canUndo(), at);\n const scene = target === null ? undefined : at(target);\n if (!scene) return false;\n this.replaying = 'undo';\n try {\n return scene.undo();\n } finally {\n this.replaying = null;\n }\n }\n\n redo(at: (t: string) => HistoryScene | undefined): boolean {\n const target = this.next(this.redoable, (s) => s.canRedo(), at);\n const scene = target === null ? undefined : at(target);\n if (!scene) return false;\n this.replaying = 'redo';\n try {\n return scene.redo();\n } finally {\n this.replaying = null;\n }\n }\n}\n\n/** Remove the last occurrence of `value`, in place. */\nfunction drop(stack: string[], value: string): void {\n for (let i = stack.length - 1; i >= 0; i--) {\n if (stack[i] === value) {\n stack.splice(i, 1);\n return;\n }\n }\n}\n\n/** A `Scene` satisfies `HistoryScene`; this names the narrowing once. */\nexport const asHistoryScene = (scene: Scene<never, never, never> | HistoryScene): HistoryScene =>\n scene as HistoryScene;\n","import {\n asNodeId,\n createScene,\n type Scene,\n type SerializedScene,\n sceneFromJSON,\n} from '@weasel-js/core';\nimport { captureTarget } from './capture';\nimport { type MarkDrawOptions, resolveMarkStyle } from './drawOne';\nimport type { WorldRect } from './frac';\nimport {\n boundsOf,\n fracContains,\n fracEncloses,\n fracToWorld,\n fromShape,\n roundFrac,\n roundPoints,\n toShape,\n worldToFrac,\n} from './frac';\nimport { MarkHistory } from './history';\nimport { isStale as isStaleAgainst, seenFrom } from './staleness';\nimport type {\n Annotation,\n AnnotationData,\n AnnotationInit,\n AnnotationMeaning,\n AnnotationPatch,\n AnnotationQuery,\n AnnotationSelectionMode,\n AnnotationsApi,\n AnnotationTargetInfo,\n CaptureOptions,\n CaptureResult,\n FracPoint,\n FracRect,\n SerializedAnnotations,\n} from './types';\n\n/** A mark's box in its target's world. Matches weasel's default `RectPose`. */\ntype MarkPose = WorldRect;\n\n/** The scene one target's marks live in. */\nexport type MarkScene = Scene<AnnotationData, 'marks', MarkPose>;\n\n/** A mark scene: one layer, because marks do not stack in tiers. */\nexport function createAnnotationScene(): MarkScene {\n return createScene<AnnotationData, 'marks', MarkPose>({ systemLayers: [{ id: 'marks' }] });\n}\n\n/** Inputs to `createAnnotationStore`. */\nexport interface AnnotationStoreOptions {\n /** Re-read on every call, so a target resizing or gaining a dependency takes\n * effect without rebuilding the store. */\n targets: () => readonly AnnotationTargetInfo[];\n /** Serialized scenes from a previous `toJSON`, keyed by target. */\n restore?: Readonly<Record<string, unknown>>;\n /** The instrument's vocabulary, so an export draws a mark in the color its\n * status gives it. A thunk is read at each capture, for a vocabulary that\n * changes under a store built once. */\n meaning?: AnnotationMeaning | (() => AnnotationMeaning | undefined);\n /** The trial's live config. A getter for the same reason `targets` is: the\n * store is built once and the config changes under it. */\n config?: () => unknown;\n /** Notified after every finished export. */\n onCapture?: (result: CaptureResult) => void;\n /** Whether a selection can stand in several targets at once. `'exclusive'`\n * (the default) clears every other target when a mark is selected in one.\n * A thunk is read at each selection change. */\n selection?: AnnotationSelectionMode | (() => AnnotationSelectionMode | undefined);\n}\n\n/** Everything a capture needs that is not the store's own state. Split out so\n * `capture.ts` takes data rather than reaching back into the store. */\nexport interface CaptureDeps {\n scene: MarkScene;\n target: AnnotationTargetInfo;\n meaning?: AnnotationMeaning;\n config: unknown;\n}\n\nconst NO_CONTENT = { w: 0, h: 0 };\n\n/** Where a mark's vertices sit in its own bounds, from points in the content\n * box. A point has none to store: its bounds are its position. */\nfunction shapeFor(\n kind: AnnotationData['kind'],\n points: readonly FracPoint[] | undefined,\n frac: FracRect,\n): readonly FracPoint[] | undefined {\n if (!points || kind === 'point') return undefined;\n return roundPoints(toShape(points, frac));\n}\n\ntype SerializedMarks = SerializedScene<AnnotationData, 'marks', MarkPose>;\n\n/** Scenes saved before vertices followed the bounds hold them as `points` in\n * the content box. Restated against each mark's bounds as saved. */\nfunction migrateLegacyPoints(\n raw: SerializedMarks,\n content: { w: number; h: number },\n): SerializedMarks {\n const nodes = raw.nodes.map((n) => {\n const { points, ...data } = n.data as AnnotationData & { points?: readonly FracPoint[] };\n if (!points || data.shape) return n;\n const shape = shapeFor(data.kind, points, worldToFrac(n.pose, content));\n return { ...n, data: { ...data, ...(shape ? { shape } : {}) } };\n });\n return { ...raw, nodes };\n}\n\n/** A mark's id is its target and its node. One scene per target, so a node id\n * is only unique within one — and an annotation is addressed by both. */\nfunction splitId(id: string): { target: string; node: string } | undefined {\n const at = id.lastIndexOf('/');\n return at <= 0 ? undefined : { target: id.slice(0, at), node: id.slice(at + 1) };\n}\n\n/**\n * A facade over one weasel scene per target: the scenes are the truth, this\n * answers questions about them. Everything crossing this boundary is in\n * fractions of a target's content box; the scenes hold world units.\n *\n * A scene per target rather than one scene with a `target` field, because a\n * pane's hit-test, marquee and paint all walk the whole scene it is given and\n * take no filter — one shared scene puts every other pane's marks under the\n * pointer.\n */\nexport function createAnnotationStore(opts: AnnotationStoreOptions): AnnotationsApi {\n const { targets, restore } = opts;\n const scenes = new Map<string, MarkScene>();\n const subs = new Set<() => void>();\n const history = new MarkHistory();\n const notify = (): void => {\n for (const fn of subs) fn();\n };\n\n // Scene changes made while held are told to subscribers as one, once the\n // outermost hold ends — so a click that also clears another target, or a\n // `setSelection` spanning several, is one event with the final answer.\n let holding = 0;\n let heldDirty = false;\n const hold = (fn: () => void): void => {\n holding += 1;\n try {\n fn();\n } finally {\n holding -= 1;\n }\n if (holding === 0 && heldDirty) {\n heldDirty = false;\n notify();\n }\n };\n\n const exclusive = (): boolean =>\n (typeof opts.selection === 'function' ? opts.selection() : opts.selection) !== 'per-target';\n\n /** Each scene's selection as last seen, to tell a selection change from any\n * other change arriving on the same channel. */\n const lastSelection = new Map<string, string>();\n const selectionKey = (scene: MarkScene): string => scene.getSelection().map(String).join(' ');\n\n const clearOthers = (keep: string): void => {\n for (const [target, scene] of scenes) {\n if (target !== keep && scene.getSelection().length > 0) scene.setSelection([]);\n }\n };\n\n const targetOf = (id: string): AnnotationTargetInfo | undefined =>\n targets().find((t) => t.id === id);\n\n const contentOf = (id: string) => targetOf(id)?.content ?? NO_CONTENT;\n\n const sceneFor = (target: string): MarkScene => {\n const known = scenes.get(target);\n if (known) return known;\n const raw = restore?.[target];\n const scene = raw\n ? sceneFromJSON<AnnotationData, 'marks', MarkPose>(\n migrateLegacyPoints(raw as SerializedMarks, contentOf(target)),\n {},\n )\n : createAnnotationScene();\n scenes.set(target, scene);\n history.track(target, scene);\n lastSelection.set(target, selectionKey(scene));\n scene.subscribe(() => {\n history.observe(target, scene);\n const selected = selectionKey(scene);\n const newlySelected = selected !== '' && selected !== lastSelection.get(target);\n lastSelection.set(target, selected);\n if (holding > 0) {\n heldDirty = true;\n return;\n }\n if (newlySelected && exclusive()) {\n hold(() => {\n heldDirty = true;\n clearOthers(target);\n });\n } else {\n notify();\n }\n });\n return scene;\n };\n\n /** Only for scenes that exist: asking for one would create it, and the\n * ordering never names a target it has not seen. */\n const historySceneAt = (target: string) => scenes.get(target);\n\n // Restored scenes are materialized up front: everything below reads\n // `scenes`, and a mark that only appears once its pane asks for its scene is\n // a mark a sidebar cannot list.\n for (const target of Object.keys(restore ?? {})) sceneFor(target);\n\n /** How a target's marks are drawn right now — one answer for the pane, an\n * export and an overview, so none can disagree on a color or a dash. */\n const drawOptionsFor = (info: AnnotationTargetInfo): MarkDrawOptions => ({\n content: info.content,\n positionDependsOn: info.positionDependsOn,\n config: opts.config?.(),\n meaning: typeof opts.meaning === 'function' ? opts.meaning() : opts.meaning,\n });\n\n const project = (target: string, node: string): Annotation | undefined => {\n const found = scenes.get(target)?.get(asNodeId(node));\n if (!found) return undefined;\n const { shape, ...data } = found.data;\n const frac = roundFrac(worldToFrac(found.pose as MarkPose, contentOf(target)));\n const points =\n data.kind === 'point'\n ? [{ x: frac.x, y: frac.y }]\n : shape && roundPoints(fromShape(shape, frac));\n return { ...data, target, id: `${target}/${node}`, frac, ...(points ? { points } : {}) };\n };\n\n /** Every target with a scene, in declaration order — then any whose target\n * the instrument has since stopped declaring, so its marks are not lost. */\n const liveTargets = (): string[] => {\n const declared = targets().map((t) => t.id);\n const rest = [...scenes.keys()].filter((id) => !declared.includes(id));\n return [...declared, ...rest];\n };\n\n const marksOn = (target: string): Annotation[] => {\n const scene = scenes.get(target);\n if (!scene) return [];\n const out: Annotation[] = [];\n for (const id of scene.renderOrder()) {\n const a = project(target, String(id));\n if (a) out.push(a);\n }\n return out;\n };\n\n const all = (): Annotation[] => liveTargets().flatMap(marksOn);\n\n const matches = (a: Annotation, q: AnnotationQuery): boolean => {\n if (q.target !== undefined && a.target !== q.target) return false;\n if (q.kind !== undefined && a.kind !== q.kind) return false;\n if (q.status !== undefined && a.status !== q.status) return false;\n if (q.tags !== undefined) {\n const have = a.tags ?? [];\n for (const t of q.tags) if (!have.includes(t)) return false;\n }\n if (q.where && !q.where(a)) return false;\n return true;\n };\n\n /** The node behind a public id, or undefined. */\n const nodeOf = (id: string) => {\n const parts = splitId(id);\n if (!parts) return undefined;\n const scene = scenes.get(parts.target);\n const node = scene?.get(asNodeId(parts.node));\n return node && scene ? { ...parts, scene, node } : undefined;\n };\n\n return {\n sceneFor,\n\n targets,\n\n get(id) {\n const parts = splitId(id);\n return parts ? project(parts.target, parts.node) : undefined;\n },\n\n query(q) {\n return q ? all().filter((a) => matches(a, q)) : all();\n },\n\n hitTest(target, pt: FracPoint, tol = 0) {\n return marksOn(target)\n .filter((a) => fracContains(a.frac, pt, tol))\n .reverse();\n },\n\n within(target, box: FracRect) {\n return marksOn(target).filter((a) => fracEncloses(box, a.frac));\n },\n\n isStale(a, config) {\n const keys = targetOf(a.target)?.positionDependsOn ?? [];\n return isStaleAgainst(a.seen, config, keys);\n },\n\n canUndo() {\n return history.canUndo(historySceneAt);\n },\n\n canRedo() {\n return history.canRedo(historySceneAt);\n },\n\n undo() {\n return history.undo(historySceneAt);\n },\n\n redo() {\n return history.redo(historySceneAt);\n },\n\n selection() {\n const out: string[] = [];\n for (const target of liveTargets()) {\n const scene = scenes.get(target);\n if (!scene) continue;\n for (const node of scene.getSelection()) {\n if (scene.get(node)) out.push(`${target}/${String(node)}`);\n }\n }\n return out;\n },\n\n setSelection(ids) {\n const wanted = new Map<string, string[]>();\n const only = exclusive();\n for (const id of ids) {\n const found = nodeOf(id);\n if (!found) continue;\n if (only && wanted.size > 0 && !wanted.has(found.target)) continue;\n const node = String(found.node.id);\n const on = wanted.get(found.target);\n if (!on) wanted.set(found.target, [node]);\n else if (!on.includes(node)) on.push(node);\n }\n hold(() => {\n for (const [target, scene] of scenes) {\n const next = wanted.get(target) ?? [];\n const now = scene.getSelection();\n if (now.length === next.length && next.every((n, i) => String(now[i]) === n)) continue;\n scene.setSelection(next.map(asNodeId));\n }\n });\n },\n\n subscribe(fn) {\n subs.add(fn);\n return () => {\n subs.delete(fn);\n };\n },\n\n add(init: AnnotationInit, config?: unknown) {\n const target = targetOf(init.target);\n const frac = roundFrac(init.frac);\n const shape = shapeFor(init.kind, init.points, frac);\n const data: AnnotationData = {\n target: init.target,\n kind: init.kind,\n ...(shape ? { shape } : {}),\n ...(init.title !== undefined ? { title: init.title } : {}),\n ...(init.status !== undefined ? { status: init.status } : {}),\n ...(init.tags !== undefined ? { tags: init.tags } : {}),\n ...(init.meta !== undefined ? { meta: init.meta } : {}),\n seen: seenFrom(config, target?.positionDependsOn ?? []),\n };\n const node = sceneFor(init.target).add({\n kind: 'leaf',\n layer: 'marks',\n pose: fracToWorld(frac, target?.content ?? NO_CONTENT),\n data,\n });\n return `${init.target}/${String(node)}`;\n },\n\n update(id, patch: AnnotationPatch) {\n const found = nodeOf(id);\n if (!found) return;\n const { frac: fracPatch, points, ...meaning } = patch;\n const nid = asNodeId(found.node.id);\n const content = contentOf(found.target);\n const frac = fracPatch ?? (points ? boundsOf(points) : null);\n const bounds = roundFrac(frac ?? worldToFrac(found.node.pose as MarkPose, content));\n const shape = points ? shapeFor(found.node.data.kind, points, bounds) : undefined;\n if (Object.keys(meaning).length > 0 || shape) {\n found.scene.update(nid, {\n data: { ...found.node.data, ...meaning, ...(shape ? { shape } : {}) },\n });\n }\n if (frac) found.scene.setPose(nid, fracToWorld(bounds, content));\n },\n\n setMeta(id, meta) {\n const found = nodeOf(id);\n if (!found) return;\n found.scene.update(asNodeId(found.node.id), { data: { ...found.node.data, meta } });\n },\n\n remove(id) {\n const found = nodeOf(id);\n if (found) found.scene.remove(asNodeId(found.node.id));\n },\n\n paintedMarks(target) {\n const info = targetOf(target);\n const scene = scenes.get(target);\n if (!info || !scene) return [];\n const draw = drawOptionsFor(info);\n return [...scene.renderOrder()].flatMap((id) => {\n const node = scene.get(asNodeId(String(id)));\n if (!node) return [];\n const data = node.data as AnnotationData;\n return [\n { mark: { pose: node.pose as MarkPose, data }, style: resolveMarkStyle(data, draw) },\n ];\n });\n },\n\n async capture(target: string, captureOpts?: CaptureOptions) {\n const info = targetOf(target);\n if (!info) throw new Error(`[labkit] no annotation target called '${target}'`);\n const result = await captureTarget(\n {\n target,\n scene: sceneFor(target),\n draw: drawOptionsFor(info),\n base: info.base,\n onWarn: (message) => console.warn(`[labkit] capture: ${message}`),\n },\n captureOpts,\n );\n opts.onCapture?.(result);\n return result;\n },\n\n toJSON(): SerializedAnnotations {\n const out: Record<string, unknown> = {};\n for (const [target, scene] of scenes) out[target] = scene.toJSON();\n return { version: 1, scenes: out };\n },\n };\n}\n\n/** Rebuild a store from what `toJSON` wrote. Unknown or future versions give\n * an empty store rather than throwing: a lab that cannot read its marks\n * should still open. */\nexport function annotationsFromJSON(\n raw: unknown,\n targets: () => readonly AnnotationTargetInfo[],\n rest: Omit<AnnotationStoreOptions, 'targets' | 'restore'> = {},\n): AnnotationsApi {\n const doc = raw as Partial<SerializedAnnotations> | null;\n if (doc?.version !== 1 || !doc.scenes) return createAnnotationStore({ targets, ...rest });\n return createAnnotationStore({ targets, restore: doc.scenes, ...rest });\n}\n","import type { View } from '@weasel-js/core';\nimport type { ViewTransform } from '../instrument/types';\n\n/** A target's world in CSS pixels: the box its fractions are fractions of. */\nexport interface ContentSize {\n w: number;\n h: number;\n}\n\n/** A target's drawn box on the surface, in CSS pixels. */\nexport interface PaneSize {\n w: number;\n h: number;\n}\n\n/** labkit's camera in weasel's shape. Zoom is uniform, so it lands on both\n * scale axes; pan is weasel's translation unchanged. */\nexport function toWeaselView(v: ViewTransform): View {\n return { x: v.pan.x, y: v.pan.y, scale: { x: v.zoom, y: v.zoom } };\n}\n\n/** The inverse. A weasel view with unequal axis scales collapses to its x —\n * labkit's camera has one zoom and cannot hold the other. */\nexport function fromWeaselView(v: View): ViewTransform {\n return { zoom: v.scale.x, pan: { x: v.x, y: v.y } };\n}\n\n/**\n * The camera a target with none of its own draws through: its content box\n * scaled to fit the box it is drawn in, anchored at the origin.\n *\n * The spec calls the camera \"a plain scale\" at zoom 1; zoom 1 is only right\n * when the pane happens to be the content's size, and a mark drawn on a\n * scaled-down pane otherwise lands outside it.\n */\nexport function fitView(content: ContentSize, pane: PaneSize): ViewTransform {\n const zoom =\n content.w > 0 && content.h > 0 ? Math.min(pane.w / content.w, pane.h / content.h) : 1;\n return { zoom: Number.isFinite(zoom) && zoom > 0 ? zoom : 1, pan: { x: 0, y: 0 } };\n}\n","import {\n type InsertNodeFactory,\n registerNodeShape,\n SceneCanvas,\n type SceneCanvasApi,\n useActiveToolContext,\n useLatest,\n type View,\n WeaselProvider,\n} from '@weasel-js/core';\nimport {\n type CSSProperties,\n useCallback,\n useContext,\n useEffect,\n useInsertionEffect,\n useRef,\n useState,\n} from 'react';\nimport { createPortal, flushSync } from 'react-dom';\nimport { CameraWheelContext } from '../canvas/CameraWheelContext';\nimport type { Rect } from '../surface/rect';\nimport { useSurfaceCanvas, useSurfaceOptional, useTileId } from '../surface/useSurfaceTile';\nimport { createMarkDrawOne } from './drawOne';\nimport { boundsOf, roundPoints, toShape, type WorldRect } from './frac';\nimport { POINT_MARK_SHAPE } from './paint';\nimport { seenFrom } from './staleness';\nimport type { MarkScene } from './store';\nimport { ANNOTATION_WEASEL_TOOLS, annotationToolInfo } from './toolMap';\nimport type {\n AnnotationData,\n AnnotationKind,\n AnnotationMeaning,\n AnnotationTarget,\n FracPoint,\n} from './types';\nimport { fitView, toWeaselView } from './view';\n\n/** Props for `<AnnotationOverlay>`. */\nexport interface AnnotationOverlayProps {\n target: AnnotationTarget;\n /** The trial's mark scene — shared by every target; a mark's own `target`\n * field is what separates them. */\n scene: MarkScene;\n /** Snapshotted onto each new mark, so staleness can be answered later. */\n config: unknown;\n /** The trial's resolved tool slot. */\n activeToolId: string | null;\n /** The instrument's vocabulary, for a status's color. */\n meaning?: AnnotationMeaning;\n}\n\nconst sameRect = (a: Rect | null, b: Rect): boolean =>\n a !== null && a.x === b.x && a.y === b.y && a.w === b.w && a.h === b.h;\n\n/** Pushes the trial's tool into the weasel scope this pane owns. Its own\n * component because the context only exists below `<WeaselProvider>`. */\nfunction ToolBridge({ toolId }: { toolId: string }) {\n const tools = useActiveToolContext();\n const setActive = tools.setActive;\n useEffect(() => {\n setActive(toolId);\n }, [toolId, setActive]);\n return null;\n}\n\n/** Every vertex the insert carried, in world units. */\nfunction verticesOf(extras: Record<string, unknown>): readonly FracPoint[] | undefined {\n if (extras.kind === 'line') return [extras.a as FracPoint, extras.b as FracPoint];\n if (extras.kind === 'pencil') {\n const samples = extras.samples as FracPoint[];\n return samples.length > 0 ? samples : undefined;\n }\n return undefined;\n}\n\n/** The pose and shape an insert's vertices make: the box that holds them, and\n * the vertices stored against that very box. Undefined for an insert that\n * carries no vertices, whose drag bounds are the whole geometry. */\nexport function insertedGeometry(\n extras: Record<string, unknown>,\n): { pose: WorldRect; shape: readonly FracPoint[] } | undefined {\n const vertices = verticesOf(extras);\n if (!vertices) return undefined;\n const box = boundsOf(vertices);\n if (!box) return undefined;\n return {\n pose: { x: box.x, y: box.y, width: box.w, height: box.h },\n shape: roundPoints(toShape(vertices, box)),\n };\n}\n\n/**\n * One target's drawing surface: a transparent box over the target's element\n * taking the input, and a `<SceneCanvas>` painting into the lab's shared\n * buffer at that box's rect.\n *\n * The box is portalled into the surface container because that is what tile\n * rects are measured against; positioning it among the instrument's own DOM\n * would put it in whatever positioning context happened to be there.\n */\nexport function AnnotationOverlay({\n target,\n scene,\n config,\n activeToolId,\n meaning,\n}: AnnotationOverlayProps) {\n const surface = useSurfaceOptional();\n const canvas = useSurfaceCanvas();\n const [rect, setRect] = useState<Rect | null>(null);\n const [input, setInput] = useState<HTMLDivElement | null>(null);\n const sceneCanvas = useRef<SceneCanvasApi | null>(null);\n useEffect(() => registerNodeShape(POINT_MARK_SHAPE, { priority: 'high' }), []);\n\n // Read in the insert factory, which is built once and must see the tool the\n // pane is holding now — `arrow` and `stroke` are indistinguishable from\n // `line` and `pencil` at the weasel end.\n const toolRef = useLatest(activeToolId);\n const configRef = useLatest(config);\n\n const id = target.id;\n // The surface's tile namespace is the whole lab's, and every trial of an\n // instrument declares the same target ids — so the tile is registered under\n // the trial-scoped key, not under `id`.\n const tileId = useTileId(id);\n const lastTile = useRef<HTMLElement | null>(null);\n useEffect(() => {\n const el = target.ref.current ?? null;\n if (el === lastTile.current) return;\n lastTile.current = el;\n surface?.registerTile(tileId, el);\n });\n useEffect(\n () => () => {\n // Clearing this is what lets the effect above re-register on the next\n // commit. StrictMode's mount / unmount / mount would otherwise take the\n // tile out and never put it back, and the surface would measure nothing.\n lastTile.current = null;\n surface?.registerTile(tileId, null);\n },\n [surface, tileId],\n );\n\n // Erases the whole shared buffer when the tiles move: a tile that moved took\n // its scissor with it, and what it painted last frame stays where it was.\n // Each renderer on the context re-applies its viewport and scissor per frame,\n // so resetting them here is safe.\n // Only once this pane has painted: a bare `getContext` on a buffer no\n // renderer has opened creates the context without the stencil buffer marks\n // need, and every later request gets that context back.\n const painted = useRef(false);\n const canvasRef = useLatest(canvas);\n // A new buffer has not been painted into, whatever the old one had. Reset\n // with the commit that brings it, ahead of any paint that commit triggers.\n // biome-ignore lint/correctness/useExhaustiveDependencies: `canvas` is the signal, not a value this reads\n useInsertionEffect(() => {\n painted.current = false;\n }, [canvas]);\n const unsubscribeFrame = useRef<(() => void) | null>(null);\n const attachSceneCanvas = useCallback((api: SceneCanvasApi | null) => {\n sceneCanvas.current = api;\n unsubscribeFrame.current?.();\n unsubscribeFrame.current = api\n ? api.subscribeFrame(() => {\n painted.current = true;\n })\n : null;\n }, []);\n useEffect(() => {\n if (!surface) return;\n return surface.registerClear(tileId, (size, dpr) => {\n if (!painted.current) return;\n const gl = canvasRef.current?.getContext('webgl2');\n if (!gl) return;\n gl.disable(gl.SCISSOR_TEST);\n gl.viewport(0, 0, Math.round(size.width * dpr), Math.round(size.height * dpr));\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);\n });\n }, [canvasRef, surface, tileId]);\n\n // The box is portalled out of whatever the picture sits in, so a wheel over\n // a mark would never reach the trial's camera without being handed to it.\n const wheelSlot = useContext(CameraWheelContext);\n useEffect(() => {\n if (!input || !wheelSlot) return;\n const wheel = (e: WheelEvent): void => wheelSlot.current?.(e);\n input.addEventListener('wheel', wheel, { passive: false });\n return () => input.removeEventListener('wheel', wheel);\n }, [input, wheelSlot]);\n\n useEffect(\n () =>\n surface?.registerPainter(tileId, (next) => {\n // Committed before the redraw is asked for: the renderer reads its\n // position from the last render, so a redraw landing first repaints the\n // tile where it was — after this frame's clear, which leaves a ghost.\n flushSync(() => setRect((prev) => (sameRect(prev, next) ? prev : next)));\n // The shared buffer was cleared if it resized this frame; this pane's\n // own loop has no way to know that.\n sceneCanvas.current?.requestRedraw();\n }),\n [surface, tileId],\n );\n\n const container = surface?.getContainer() ?? null;\n if (!container || !rect) return null;\n\n const view: View = toWeaselView(target.view ?? fitView(target.content, { w: rect.w, h: rect.h }));\n\n const drawOne = createMarkDrawOne({\n content: target.content,\n positionDependsOn: target.positionDependsOn,\n config,\n meaning,\n });\n\n const factories: Record<string, InsertNodeFactory> = {};\n for (const weaselTool of ANNOTATION_WEASEL_TOOLS) {\n factories[weaselTool] = (_bounds, extras) => {\n const info = annotationToolInfo(toolRef.current);\n const kind: AnnotationKind | undefined = info?.kind;\n if (!kind) return null;\n const seen = seenFrom(configRef.current, target.positionDependsOn ?? []);\n const geometry = insertedGeometry(extras as unknown as Record<string, unknown>);\n if (!geometry) return { data: { target: id, kind, seen } satisfies AnnotationData };\n const data: AnnotationData = { target: id, kind, shape: geometry.shape, seen };\n return { data, pose: geometry.pose };\n };\n }\n\n // A measured rect has nowhere to live but the element's own style. Set as\n // custom properties, which the stylesheet reads — the sanctioned use.\n const box = {\n ['--lk-anno-x' as string]: `${rect.x}px`,\n ['--lk-anno-y' as string]: `${rect.y}px`,\n ['--lk-anno-w' as string]: `${rect.w}px`,\n ['--lk-anno-h' as string]: `${rect.h}px`,\n } as CSSProperties;\n\n return createPortal(\n <>\n <div\n ref={setInput}\n className=\"lk-annotate__input\"\n data-annotation-target={id}\n // Pass-through while the rail holds a tool that makes no marks, so the\n // instrument under the overlay stays clickable.\n data-idle={annotationToolInfo(activeToolId) ? undefined : ''}\n role=\"application\"\n aria-label={`Annotations on ${id}`}\n // biome-ignore lint/a11y/noNoninteractiveTabindex: role=\"application\" IS the interactive case — a region with its own keymap. The rule's allowed-role list stops at the native widget roles and does not include it, and the gesture dispatcher listens on this element, so without focus no tool's keyboard binding ever fires.\n tabIndex={0}\n style={box}\n />\n {canvas && input ? (\n // Isolated so each pane keeps its own selection and tool.\n <WeaselProvider isolate>\n <ToolBridge toolId={annotationToolInfo(activeToolId)?.weaselTool ?? 'select'} />\n <SceneCanvas<AnnotationData, 'marks', WorldRect>\n features={['pick', 'move', 'transform', 'edit']}\n ref={attachSceneCanvas}\n scene={scene}\n width={rect.w}\n height={rect.h}\n view={view}\n paintInto={{ canvas, x: rect.x, y: rect.y }}\n inputElement={input}\n defaultTools={ANNOTATION_WEASEL_TOOLS}\n insertNodeFactories={factories}\n layers={{ scene: { drawOne } }}\n />\n </WeaselProvider>\n ) : null}\n </>,\n container,\n );\n}\n","import type { TrialInfo } from '../state/types';\nimport { AnnotationOverlay } from './AnnotationOverlay';\nimport type { AnnotationsApi, AnnotationsCapability } from './types';\n\n/** Props for `<AnnotationTargets>`. */\nexport interface AnnotationTargetsProps {\n capability: AnnotationsCapability;\n state: unknown;\n config: unknown;\n /** The trial these targets belong to. `capability.targets` is told it, so a\n * consumer holding per-trial refs can hand back this trial's. */\n trial: TrialInfo;\n annotations: AnnotationsApi;\n activeToolId: string | null;\n}\n\n/** One overlay per region the instrument said accepts marks. */\nexport function AnnotationTargets({\n capability,\n state,\n config,\n trial,\n annotations,\n activeToolId,\n}: AnnotationTargetsProps) {\n const targets = capability.targets(state, config, trial);\n\n return (\n <>\n {targets.map((t) => (\n <AnnotationOverlay\n key={t.id}\n target={t}\n scene={annotations.sceneFor(t.id)}\n meaning={capability.meaning}\n config={config}\n activeToolId={activeToolId}\n />\n ))}\n </>\n );\n}\n","import type { ConfigSchema } from '../config/types';\nimport type { Instrument } from './types';\n\n/** An instrument as it is written: either the legacy `defaultConfig` (plus an\n * optional `configSchema`), or a `config` schema that supplies both. */\nexport type InstrumentSpec<TS, TC, TItem = unknown> =\n | Instrument<TS, TC, TItem>\n | (Omit<Instrument<TS, TC, TItem>, 'defaultConfig'> & { config: ConfigSchema<TC> });\n\n/**\n * Normalizes an instrument spec, and infers its state and config types from\n * the literal rather than making them be written out.\n *\n * A spec declaring `config` gets its `defaultConfig` synthesized from the\n * schema, so nothing downstream branches on which way the config was\n * declared. A spec written the legacy way is returned unchanged, by\n * reference.\n *\n * Resolving the schema into controls does not happen here: rules are\n * lab-scoped and this runs at module load. `useConfigSchema` does that.\n *\n * TypeScript infers all three type arguments or none, so a call that names\n * `TS` and `TC` leaves `TItem` at `unknown` and a job's `onItem` needs a cast.\n * Name the item type too, or pass no type arguments at all.\n */\nexport function defineInstrument<TS, TC, TItem = unknown>(\n spec: InstrumentSpec<TS, TC, TItem>,\n): Instrument<TS, TC, TItem> {\n if (spec.config && !('defaultConfig' in spec && spec.defaultConfig)) {\n const schema = spec.config;\n return { ...spec, defaultConfig: () => schema.defaults() } as Instrument<TS, TC, TItem>;\n }\n return spec as Instrument<TS, TC, TItem>;\n}\n","import type { ConfigField } 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\n/** Check a config schema for the mistakes that would otherwise surface as a\n * silently broken control: empty or duplicate keys, and fields whose own\n * constraints do not hold.\n *\n * An unrecognized type is not an error — a lab supplies controls for its own\n * kinds through `ControlPanel`'s `renderers`, and this cannot see them. Such\n * a field simply has no constraints to check here. */\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 (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","import { createContext } from 'react';\n\n/** Marks an instrument keeps in its own `AnnotationStorage`, already loaded by\n * `<Lab>` for the trials present when it opened, keyed by trial id. A trial\n * missing from it loads its own. */\nexport const AnnotationPreloadContext = createContext<ReadonlyMap<string, unknown> | null>(null);\n","{\n \"name\": \"interstellar\",\n \"extends\": \"weasel\",\n \"pins\": {\n \"radius-md\": {\n \"value\": \"6px\",\n \"type\": \"dimension\"\n },\n \"glass-blur\": {\n \"value\": \"12px\",\n \"type\": \"dimension\"\n },\n \"font-weight-light\": {\n \"value\": 300,\n \"type\": \"fontWeight\"\n },\n \"font-weight-medium\": {\n \"value\": 500,\n \"type\": \"fontWeight\"\n },\n \"font-weight-bold\": {\n \"value\": 700,\n \"type\": \"fontWeight\"\n },\n \"surface\": {\n \"by\": \"mode\",\n \"dark\": {\n \"value\": \"#0a0a14\",\n \"type\": \"color\"\n }\n },\n \"surface-raised\": {\n \"by\": \"mode\",\n \"dark\": {\n \"value\": \"rgba(20, 20, 36, 0.55)\",\n \"type\": \"color\"\n }\n },\n \"surface-sunken\": {\n \"by\": \"mode\",\n \"dark\": {\n \"value\": \"#02020a\",\n \"type\": \"color\"\n }\n },\n \"border\": {\n \"by\": \"mode\",\n \"dark\": {\n \"value\": \"rgba(255, 255, 255, 0.14)\",\n \"type\": \"color\"\n }\n },\n \"line-subtle\": {\n \"by\": \"mode\",\n \"dark\": {\n \"value\": \"rgba(255, 255, 255, 0.08)\",\n \"type\": \"color\"\n }\n },\n \"fg\": {\n \"by\": \"mode\",\n \"dark\": {\n \"value\": \"#e8e8f0\",\n \"type\": \"color\"\n }\n },\n \"fg-muted\": {\n \"by\": \"mode\",\n \"dark\": {\n \"value\": \"#a8a8c0\",\n \"type\": \"color\"\n }\n },\n \"fg-subtle\": {\n \"by\": \"mode\",\n \"dark\": {\n \"value\": \"#5a5a78\",\n \"type\": \"color\"\n }\n },\n \"accent\": {\n \"by\": \"mode\",\n \"dark\": {\n \"value\": \"#4f46e5\",\n \"type\": \"color\"\n }\n },\n \"accent-hover\": {\n \"by\": \"mode\",\n \"dark\": {\n \"value\": \"#6d5dfc\",\n \"type\": \"color\"\n }\n },\n \"accent-strong\": {\n \"by\": \"mode\",\n \"dark\": {\n \"value\": \"#7474fe\",\n \"type\": \"color\"\n }\n },\n \"focus-ring\": {\n \"by\": \"mode\",\n \"dark\": {\n \"value\": \"rgba(116, 116, 254, 0.5)\",\n \"type\": \"color\"\n }\n },\n \"shadow\": {\n \"by\": \"mode\",\n \"dark\": {\n \"value\": \"rgba(0, 0, 0, 0.7)\",\n \"type\": \"color\"\n }\n },\n \"border-strong\": {\n \"by\": \"mode\",\n \"dark\": {\n \"value\": \"rgba(255, 255, 255, 0.36)\",\n \"type\": \"color\"\n }\n },\n \"backdrop\": {\n \"by\": \"mode\",\n \"dark\": {\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 \"type\": \"gradient\"\n }\n }\n }\n}\n","import { defineTheme, type Theme, type ThemeInput, weaselTheme } from '@weasel-js/theme';\nimport definition from './interstellar.theme.json' with { type: 'json' };\n\n/**\n * labkit's theme: a cosmic dark over the built-in weasel theme, whose light\n * mode it keeps as is. A pins-only theme definition: nothing in it is\n * derived, so it loads without the engine.\n */\nexport const interstellarTheme: Theme = defineTheme({\n ...definition,\n extends: weaselTheme,\n} as ThemeInput);\n","import type { View } from '@weasel-js/core';\nimport type { CameraView } from './CameraInput';\n\n/** `view` at `scale`, about the screen point `at`. */\nexport function atScale(view: View, scale: number, at: { x: number; y: number }): View {\n return {\n x: view.x + at.x / view.scale.x - at.x / scale,\n y: view.y + at.y / view.scale.y - at.y / scale,\n scale: { x: scale, y: scale },\n };\n}\n\n/** The middle of the camera's host, in its own screen space; the origin when it cannot measure. */\nexport function viewMiddle(camera: CameraView): { x: number; y: number } {\n const size = camera.hostSize?.();\n return size ? { x: size.width / 2, y: size.height / 2 } : { x: 0, y: 0 };\n}\n\n/** Zoom `camera` to `zoom` about the middle of its view, within its range. */\nexport function zoomCameraTo(camera: CameraView, zoom: number): void {\n const { min, max } = camera.zoomRange();\n const scale = Math.min(max, Math.max(min, zoom));\n camera.set(atScale(camera.get(), scale, viewMiddle(camera)));\n}\n","import type { ReactNode } from 'react';\nimport { Split, type SplitProps } from '../primitives/Split';\n\n/** Props for `<TrialBody>`. */\nexport interface TrialBodyProps\n extends Omit<SplitProps, 'sidebar' | 'children' | 'className' | 'sidebarClassName' | 'label'> {\n /** The sidebar region's sections. */\n sidebar: ReactNode;\n /** The instrument's own output. */\n children: ReactNode;\n /** Extra class on the content pane — `Trial` marks a canvas instrument's\n * well flush. */\n contentClassName?: string;\n}\n\n/** A trial's sidebar and content as a `Split`, wearing the trial's classes. */\nexport function TrialBody({ sidebar, children, contentClassName, ...rest }: TrialBodyProps) {\n return (\n <Split\n {...rest}\n sidebar={sidebar}\n className=\"lk-trial__panes\"\n sidebarClassName=\"lk-trial__sidebar\"\n contentClassName={\n contentClassName ? `lk-trial__content ${contentClassName}` : 'lk-trial__content'\n }\n >\n {children}\n </Split>\n );\n}\n","import { createContext, useContext } from 'react';\nimport type { NodeId } from 'windease';\n\n/** Supplied by `<Workspace>` when trials are reorderable, so a trial's title\n * bar can be the drag surface. Null when reordering is off. */\nexport const TrialDragContext = createContext<{ nodeId: NodeId } | null>(null);\n\nexport function useTrialDrag(): { nodeId: NodeId } | null {\n return useContext(TrialDragContext);\n}\n","import type { ReactNode } from 'react';\nimport type { NodeId } from 'windease';\nimport { useDragHandle } from 'windease/react';\nimport { useTrialDrag } from './TrialDragContext';\n\n/** Props for `<TrialTitleBar>`. */\nexport interface TrialTitleBarProps {\n title: string;\n /** Rendered at the leading edge, before the title. */\n lead?: ReactNode;\n children?: ReactNode;\n}\n\n// `useDragHandle` needs a node id and windease's DragProvider, so the draggable\n// form is a separate component rather than a conditional hook.\nfunction Draggable({ nodeId, title, lead, children }: TrialTitleBarProps & { nodeId: NodeId }) {\n const handlers = useDragHandle(nodeId);\n return (\n <div className=\"lk-trial__titlebar lk-trial__titlebar--draggable\" {...handlers}>\n {lead}\n <span className=\"lk-trial__title\">{title}</span>\n {children}\n </div>\n );\n}\n\n/** A trial's title bar. When the workspace allows reordering the whole bar is\n * the drag surface — there is no separate grip, because a window's title bar\n * is already the thing you expect to drag. */\nexport function TrialTitleBar({ title, lead, children }: TrialTitleBarProps) {\n const drag = useTrialDrag();\n if (drag)\n return (\n <Draggable nodeId={drag.nodeId} title={title} lead={lead}>\n {children}\n </Draggable>\n );\n return (\n <div className=\"lk-trial__titlebar\">\n {lead}\n <span className=\"lk-trial__title\">{title}</span>\n {children}\n </div>\n );\n}\n","import { createContext, useContext } from 'react';\n\n/** Where an undocked panel's DOM lives. The panel's *content* stays owned by\n * its trial — it is React-portalled into the host — so a torn-out section\n * keeps the trial's context, state and subscriptions instead of being rebuilt\n * as a sibling of the trial it came from. */\nexport interface PanelHostRegistry {\n set: (key: string, el: HTMLElement | null) => void;\n get: (key: string) => HTMLElement | null;\n subscribe: (fn: () => void) => () => void;\n}\n\nexport function createPanelHostRegistry(): PanelHostRegistry {\n const hosts = new Map<string, HTMLElement>();\n const listeners = new Set<() => void>();\n const notify = () => {\n for (const fn of listeners) fn();\n };\n return {\n set: (key, el) => {\n if (el) hosts.set(key, el);\n else hosts.delete(key);\n notify();\n },\n get: (key) => hosts.get(key) ?? null,\n subscribe: (fn) => {\n listeners.add(fn);\n return () => listeners.delete(fn);\n },\n };\n}\n\nexport const PanelHostContext = createContext<PanelHostRegistry | null>(null);\n\nexport function usePanelHosts(): PanelHostRegistry | null {\n return useContext(PanelHostContext);\n}\n","import { useSyncExternalStore } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { SidebarSection, TrialContribution } from '../chrome/types';\nimport { usePanelHosts } from '../lab/panelHost';\nimport { panelKey } from '../state/undock';\n\n/** Props for `<UndockedSections>`. */\nexport interface UndockedSectionsProps {\n trialId: string;\n /** The trial's sidebar contributions that are currently torn out. */\n sections: readonly TrialContribution[];\n onDock: (sectionId: string) => void;\n}\n\nfunction Portalled({\n trialId,\n contribution,\n onDock,\n}: {\n trialId: string;\n contribution: TrialContribution;\n onDock: (sectionId: string) => void;\n}) {\n const hosts = usePanelHosts();\n const key = panelKey(trialId, contribution.id);\n const host = useSyncExternalStore(\n (fn) => hosts?.subscribe(fn) ?? (() => {}),\n () => hosts?.get(key) ?? null,\n () => null,\n );\n if (!host || !contribution.item) return null;\n const item = contribution.item as SidebarSection;\n return createPortal(\n <>\n <div className=\"lk-panel-tile__titlebar\">\n <span className=\"lk-panel-tile__title\">{item.title}</span>\n <button\n type=\"button\"\n className=\"lk-panel-tile__dock\"\n aria-label={`Dock ${item.title}`}\n title={`Dock ${item.title}`}\n onClick={() => onDock(contribution.id)}\n >\n ⇤\n </button>\n </div>\n {item.body}\n </>,\n host,\n );\n}\n\n/** Renders a torn-out section's body into the workspace panel holding it. The\n * body stays mounted in the trial's React tree — only its DOM moves — so it\n * keeps the trial's context and its own state across an undock. */\nexport function UndockedSections({ trialId, sections, onDock }: UndockedSectionsProps) {\n if (sections.length === 0) return null;\n return (\n <>\n {sections.map((c) => (\n <Portalled key={c.id} trialId={trialId} contribution={c} onDock={onDock} />\n ))}\n </>\n );\n}\n","import {\n type KeyboardEvent,\n type ReactNode,\n useContext,\n useMemo,\n useSyncExternalStore,\n} from 'react';\nimport { useStore } from 'zustand/react';\nimport { CameraRegistryContext } from '../canvas/cameraRegistry';\nimport { zoomCameraTo } from '../canvas/cameraZoom';\nimport { builtinContributions, TRANSIENT_BUILTINS } from '../chrome/builtins';\nimport { mergeContributions, suppressContributions } from '../chrome/merge';\nimport { PaletteRegion } from '../chrome/regions/PaletteRegion';\nimport { SidebarRegion } from '../chrome/regions/SidebarRegion';\nimport { StatusRegion } from '../chrome/regions/StatusRegion';\nimport { TitleBarRegion } from '../chrome/regions/TitleBarRegion';\nimport { ToolbarRegion } from '../chrome/regions/ToolbarRegion';\nimport { ViewportRegion } from '../chrome/regions/ViewportRegion';\nimport type { TrialChromeContext, TrialContribution, TrialRegion } from '../chrome/types';\nimport { applyConfigWrite, resolveAutoConfig } from '../config/autoConfig';\nimport { hasConfigPath, schemaNodeAtPath } from '../config/path';\nimport { useConfigSchema } from '../config/useConfigSchema';\nimport { useResolvedConfig } from '../config/useResolvedConfig';\nimport type { Instrument } from '../instrument/types';\nimport type { JobHandle } from '../job/types';\nimport { useLabContext } from '../lab/LabContext';\nimport { JobProgress } from '../primitives/JobProgress';\nimport { LabStoreContext } from '../state/context';\nimport type { TrialRecord } from '../state/types';\nimport { as2DView, withZoom } from '../state/view';\nimport { TrialBody } from './TrialBody';\nimport { TrialTitleBar } from './TrialTitleBar';\nimport { UndockedSections } from './UndockedSections';\n\n/** The trial's loupe as its chrome sees it: a switch and its position. */\nexport interface LoupeBindings {\n on: boolean;\n toggle: () => void;\n}\n\n/** The trial's undo history as its chrome sees it. */\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 undoBindings?: UndoBindings;\n /** Supplied when the instrument declares a `job`. */\n job?: JobHandle;\n /** Supplied while a lens is mounted in the trial. The lens itself is the\n * instrument's to mount; the chrome only offers the switch. */\n loupe?: LoupeBindings;\n /** Contributions the trial runtime itself adds — the drag palette and the\n * layer list, which depend on runtime state the instrument cannot reach. */\n trialChrome?: readonly TrialContribution[];\n /** Contributions from the lab, merged last. */\n chrome?: readonly TrialContribution[];\n /** Built-in contribution ids to drop. Throws on an id that is not there. */\n suppress?: readonly string[];\n /** The trial's resolved tool slot, and the setter that writes whichever\n * slot it resolved to. `Trial` owns the resolution. */\n activeToolId?: string | null;\n setActiveTool?: (id: string) => void;\n children: ReactNode;\n}\n\nconst NO_OP = (): void => {};\n\n/** One frozen empty map, so a trial that has folded nothing keeps a stable\n * context identity across renders. */\nconst NO_SECTIONS: Readonly<Record<string, boolean>> = Object.freeze({});\nconst noSubscribe = (): (() => void) => NO_OP;\n\n/** The frame around a running instrument. Builds one chrome context, assembles\n * the contributions the instrument, the runtime and the lab declare, and hands\n * each region its slice. */\nexport function TrialChrome({\n trialId,\n record,\n instrument,\n isLastTrial,\n undoBindings,\n job,\n loupe,\n trialChrome,\n chrome,\n suppress,\n activeToolId = null,\n setActiveTool = NO_OP,\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 updateTrialSidebarWidth = useStore(storeCtx.store, (s) => s.updateTrialSidebarWidth);\n const setTrialTitle = useStore(storeCtx.store, (s) => s.setTrialTitle);\n const setTrialSectionCollapsed = useStore(storeCtx.store, (s) => s.setTrialSectionCollapsed);\n const updateTrialConfig = useStore(storeCtx.store, (s) => s.updateTrialConfig);\n const updateTrialState = useStore(storeCtx.store, (s) => s.updateTrialState);\n const undockPanelAction = useStore(storeCtx.store, (s) => s.undockPanel);\n const dockPanelAction = useStore(storeCtx.store, (s) => s.dockPanel);\n const undockedPanels = useStore(storeCtx.store, (s) => s.undockedPanels);\n const undockedIds = useMemo(\n () =>\n Object.values(undockedPanels)\n .filter((p) => p.trialId === trialId)\n .map((p) => p.sectionId),\n [undockedPanels, trialId],\n );\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 configSchema = useConfigSchema(instrument);\n // What the instrument is looking at right now. The panel reads `record.config`\n // — the pinned values — but anything instrument-facing gets the resolved one.\n const { config: resolvedConfig, auto } = useResolvedConfig(\n configSchema,\n record.config,\n record.auto,\n );\n\n const title = record.title ?? instrument.title ?? instrument.name;\n const collapsedSections = record.collapsedSections ?? NO_SECTIONS;\n\n // The trial's own camera, where it has one: zoom goes through it, about the\n // middle of the view and inside the instrument's range, as the lab's does.\n const cameras = useContext(CameraRegistryContext);\n const camera = useSyncExternalStore(\n cameras?.subscribe ?? noSubscribe,\n () => cameras?.get(trialId) ?? null,\n );\n\n const ctx = useMemo<TrialChromeContext>(() => {\n const setZoom = (z: number): void => {\n if (camera) zoomCameraTo(camera, z);\n else if (view2d) updateTrialView(trialId, withZoom(view2d, z));\n };\n return {\n trialId,\n instrumentName: record.instrumentName,\n title,\n setTitle: (next) => setTrialTitle(trialId, next),\n isLastTrial,\n zoom: view2d ? view2d.zoom : null,\n setZoom,\n canUndo: undoBindings?.canUndo ?? false,\n canRedo: undoBindings?.canRedo ?? false,\n undo: undoBindings?.undo ?? NO_OP,\n redo: undoBindings?.redo ?? NO_OP,\n hasLoupe: loupe != null,\n loupeOn: loupe?.on ?? false,\n toggleLoupe: loupe?.toggle ?? NO_OP,\n configSchema,\n configFields: instrument.config ? [] : (instrument.configSchema?.() ?? []),\n config: record.config,\n auto,\n setConfig: (path, value) => {\n const prevConfig = record.config as Record<string, unknown>;\n if (\n process.env.NODE_ENV !== 'production' &&\n !hasConfigPath(prevConfig, path) &&\n schemaNodeAtPath(configSchema.group, path) === undefined\n ) {\n console.warn(\n `[labkit] setConfig: unknown path \"${path}\" for instrument \"${record.instrumentName}\"`,\n );\n }\n updateTrialConfig(trialId, path, value);\n if (instrument.onConfigChange) {\n const next = applyConfigWrite(prevConfig, record.auto ?? [], path, value);\n const nextConfig = resolveAutoConfig(configSchema, next.config, new Set(next.autoPaths));\n const nextState = instrument.onConfigChange(nextConfig, resolvedConfig, record.state);\n updateTrialState(trialId, nextState as never);\n }\n },\n collapsedSections,\n setSectionCollapsed: (key, collapsed) => setTrialSectionCollapsed(trialId, key, collapsed),\n undockedPanels: undockedIds,\n undockPanel: (sectionId, as) => undockPanelAction(trialId, sectionId, as),\n dockPanel: (sectionId) => dockPanelAction(trialId, sectionId),\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 activeToolId,\n setActiveTool,\n };\n }, [\n trialId,\n record,\n instrument,\n lab,\n title,\n isLastTrial,\n updateTrialView,\n updateTrialConfig,\n updateTrialState,\n undoBindings,\n loupe,\n view2d,\n activeToolId,\n setActiveTool,\n configSchema,\n resolvedConfig,\n auto,\n undockedIds,\n undockPanelAction,\n dockPanelAction,\n setTrialTitle,\n setTrialSectionCollapsed,\n collapsedSections,\n camera,\n ]);\n\n const contributions = useMemo(\n () =>\n suppressContributions(\n mergeContributions(\n builtinContributions(instrument, ctx, lab.controls),\n [...(instrument.chrome ?? [])],\n [...(trialChrome ?? [])],\n [...(chrome ?? [])],\n ),\n suppress ?? [],\n TRANSIENT_BUILTINS,\n ),\n [instrument, ctx, trialChrome, chrome, suppress, lab.controls],\n );\n\n const inRegion = (region: TrialRegion): TrialContribution[] =>\n contributions.filter((c) => c.region === region);\n\n const handleKeyDown = (e: KeyboardEvent<HTMLElement>): 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) ctx.redo();\n else ctx.undo();\n } else if (e.key === 's' || e.key === 'S') {\n e.preventDefault();\n ctx.saveSnapshot();\n }\n };\n\n return (\n <section\n className=\"lk-trial\"\n data-trial-id={trialId}\n data-focused={lab.trials.length > 1 && lab.focusedTrialId === trialId ? 'true' : undefined}\n aria-label={`Trial ${title}`}\n tabIndex={-1}\n onKeyDown={handleKeyDown}\n >\n <TrialTitleBar\n title={title}\n lead={<TitleBarRegion placement=\"lead\" contributions={inRegion('titlebar')} ctx={ctx} />}\n >\n <TitleBarRegion contributions={inRegion('titlebar')} ctx={ctx} />\n </TrialTitleBar>\n <div className=\"lk-trial__toolbar\">\n <ToolbarRegion contributions={inRegion('toolbar')} ctx={ctx} />\n </div>\n <div className=\"lk-trial__body\">\n <PaletteRegion contributions={inRegion('palette')} ctx={ctx} />\n <TrialBody\n width={record.sidebarWidth}\n onWidthChange={(w) => updateTrialSidebarWidth(trialId, w)}\n contentClassName={\n instrument.canvas || instrument.stage ? 'lk-trial__content--flush' : undefined\n }\n sidebar={\n <>\n <SidebarRegion contributions={inRegion('sidebar')} ctx={ctx} />\n <UndockedSections\n trialId={trialId}\n sections={inRegion('sidebar').filter((c) => undockedIds.includes(c.id))}\n onDock={ctx.dockPanel}\n />\n </>\n }\n >\n {children}\n <ViewportRegion contributions={inRegion('viewport')} ctx={ctx} />\n </TrialBody>\n </div>\n <div className=\"lk-trial__status\">\n {job ? <JobProgress job={job} /> : null}\n <StatusRegion contributions={inRegion('status')} ctx={ctx} />\n </div>\n </section>\n );\n}\n","import {\n createPointerStore,\n PointerContextProvider,\n useLatest,\n WeaselProvider,\n} from '@weasel-js/core';\nimport {\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useStore } from 'zustand/react';\nimport { AnnotationsContext } from '../annotations/AnnotationsContext';\nimport { AnnotationTargets } from '../annotations/AnnotationTargets';\nimport { AnnotationPreloadContext } from '../annotations/preload';\nimport { annotationsFromJSON } from '../annotations/store';\nimport type { AnnotationStorage, AnnotationsApi, AnnotationTargetInfo } from '../annotations/types';\nimport type { CameraView } from '../canvas/CameraInput';\nimport { CameraWheelContext, type CameraWheelSlot } from '../canvas/CameraWheelContext';\nimport { CanvasStack } from '../canvas/CanvasStack';\nimport { CameraPublishContext, CameraRegistryContext } from '../canvas/cameraRegistry';\nimport { fitStage, Stage } from '../canvas/Stage';\nimport type { CanvasLayerDescriptor } from '../canvas/useLayerScheduler';\nimport { applyCamera, type ViewportSize } from '../canvas/worldSpec';\nimport type { TrialContribution } from '../chrome/types';\nimport { useConfigSchema } from '../config/useConfigSchema';\nimport { useResolvedConfig } from '../config/useResolvedConfig';\nimport { DragOverlay, useDragDrop } from '../dragdrop/DragDropRuntime';\nimport { Palette } from '../dragdrop/Palette';\nimport type {\n Instrument,\n InstrumentList,\n LayerDescriptor,\n PaletteItem,\n RenderContext,\n} from '../instrument/types';\nimport { useJob } from '../job/useJob';\nimport { useLabContext } from '../lab/LabContext';\nimport { LayerList, type LayerListItem, moveLayers } from '../passthrough/weasel-ui';\nimport { LabStoreContext, TrialIdProvider } from '../state/context';\nimport type { LabStore } from '../state/store';\nimport type { TrialRecord } from '../state/types';\nimport { as2DView, DEFAULT_VIEW, withZoom } from '../state/view';\nimport { resolveLabTool } from '../tools/labTool';\nimport { createEventBus, type EventBus } from '../undo/eventBus';\nimport { pushSnapshot, redo as undoRedo, undo as undoUndo } from '../undo/undoStack';\nimport { LoupeSwitchContext } from './loupeSwitch';\nimport type { LoupeBindings, UndoBindings } from './TrialChrome';\nimport { TrialChrome } from './TrialChrome';\n\n/** Props for `<Trial>`. */\nexport interface TrialProps {\n id: string;\n /** Contributions the lab adds to this trial's chrome, merged after the\n * instrument's own. */\n chrome?: readonly TrialContribution[];\n /** Built-in contribution ids to drop. Throws on an id that is not there. */\n suppress?: readonly 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, chrome, suppress }: TrialProps) {\n const lab = useLabContext();\n const storeCtx = useContext(LabStoreContext);\n if (!storeCtx) throw new Error('[labkit] <Trial> requires <LabStoreProvider>');\n const instruments = useStore(storeCtx.store, (s) => s.instruments) ?? lab.instruments;\n const record = useStore(storeCtx.store, (s) => s.trials.find((w) => w.id === id));\n const instrument = record ? instruments.find((i) => i.name === record.instrumentName) : undefined;\n const kept = useKeptMarks(instrument?.annotations?.storage, id);\n if (!record) {\n return <div className=\"lk-trial lk-trial--unknown\">Trial not found: {id}</div>;\n }\n if (!instrument) {\n return (\n <div className=\"lk-trial lk-trial--unknown\">Unknown instrument: {record.instrumentName}</div>\n );\n }\n if (!kept.ready) return <div className=\"lk-trial lk-trial--loading\" />;\n return (\n <TrialRuntime\n keptMarks={kept.value}\n record={record}\n instrument={instrument}\n instruments={instruments}\n store={storeCtx.store}\n isLast={lab.trials.length <= 1}\n chrome={chrome}\n suppress={suppress}\n />\n );\n}\n\n/** The marks an instrument keeps in its own storage: preloaded by the lab for\n * the trials it opened with, loaded here for any added since. */\nfunction useKeptMarks(\n storage: AnnotationStorage | undefined,\n trialId: string,\n): { ready: boolean; value: unknown } {\n const preload = useContext(AnnotationPreloadContext);\n const [loaded, setLoaded] = useState<{ value: unknown } | null>(() =>\n storage && preload?.has(trialId) ? { value: preload.get(trialId) } : null,\n );\n useEffect(() => {\n if (!storage || loaded) return;\n let live = true;\n storage.load().then(\n (value) => {\n if (live) setLoaded({ value });\n },\n (error) => {\n console.warn(`[labkit] could not load the marks of trial \"${trialId}\"`, error);\n if (live) setLoaded({ value: null });\n },\n );\n return () => {\n live = false;\n };\n }, [storage, loaded, trialId]);\n if (!storage) return { ready: true, value: undefined };\n return loaded ? { ready: true, value: loaded.value } : { ready: false, value: undefined };\n}\n\ninterface TrialRuntimeProps {\n /** The marks an instrument's own `AnnotationStorage` loaded. */\n keptMarks: unknown;\n record: TrialRecord;\n instrument: Instrument;\n /** The lab's instruments as the store holds them now. */\n instruments: InstrumentList;\n store: LabStore;\n isLast: boolean;\n chrome?: readonly TrialContribution[];\n suppress?: readonly string[];\n}\n\nfunction TrialRuntime({\n keptMarks,\n record,\n instrument,\n instruments,\n store,\n isLast,\n chrome,\n suppress,\n}: TrialRuntimeProps) {\n const wheelSlot = useRef<CameraWheelSlot['current']>(null);\n const cameras = useContext(CameraRegistryContext);\n const trialId = record.id;\n const publishCamera = useMemo(\n () => (cameras ? (camera: CameraView) => cameras.register(trialId, camera) : null),\n [cameras, trialId],\n );\n const [pointer] = useState(createPointerStore);\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 const updateTrialAnnotations = useStore(store, (s) => s.updateTrialAnnotations);\n const labToolId = useStore(store, (s) => s.activeToolId);\n const setLabTool = useStore(store, (s) => s.setLabTool);\n const setTrialTool = useStore(store, (s) => s.setTrialTool);\n\n // Everything below reads `config`; `record.config` is the panel's view, and\n // reaches it through `record` on `TrialChrome`.\n const schema = useConfigSchema(instrument);\n const { config } = useResolvedConfig(schema, record.config, record.auto);\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 const [loupeOn, setLoupeOn] = useState(false);\n const [lenses, setLenses] = useState(0);\n const mountLens = useCallback(() => {\n setLenses((n) => n + 1);\n return () => setLenses((n) => n - 1);\n }, []);\n const loupeSwitch = useMemo(() => ({ on: loupeOn, mount: mountLens }), [loupeOn, mountLens]);\n\n const visibleLayers = useMemo(\n () =>\n (instrument.canvas?.layers ?? [])\n .filter((l) => layerVisibility[l.id] !== false)\n .map((l) => l.id),\n [instrument.canvas, layerVisibility],\n );\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 // A function `initialView` needs the canvas size, so `trialOps` leaves the\n // view null and the first measurement resolves it. Reset nulls it again,\n // which re-frames — so the guard is the null itself, not a \"have I run\" flag.\n const stage = instrument.canvas ? undefined : instrument.stage;\n const placeView = (size: ViewportSize): void => {\n const declared =\n instrument.canvas?.initialView ??\n (stage ? (stage.initialView ?? ((vp: ViewportSize) => fitStage(stage.size, vp))) : undefined);\n if (typeof declared !== 'function') return;\n if (record.view != null) return;\n setView(declared(size));\n };\n\n // The capability's own `targets` thunk, re-read on every call: a target\n // resizing or gaining a dependency must not need the store rebuilt. Held in\n // a ref because the store is built once and closes over it.\n const annotationsCap = instrument.annotations;\n const targetsRef = useLatest((): readonly AnnotationTargetInfo[] =>\n annotationsCap\n ? annotationsCap.targets(record.state, config, { id: record.id, view: record.view })\n : [],\n );\n\n // One store for the trial's lifetime.\n const annotationsRef = useRef<ReturnType<typeof annotationsFromJSON> | null>(null);\n // Read through refs for the same reason `targets` is: the store is built\n // once, and an export must draw against the config the trial holds now.\n const configRef = useLatest(config);\n // The instrument can be swapped under a live trial, so the capability is read at use too.\n const capRef = useLatest(annotationsCap);\n if (annotationsRef.current === null) {\n // Seeded from wherever the marks were kept: the instrument's own store if\n // it declared one, else this trial's slot.\n annotationsRef.current = annotationsFromJSON(\n annotationsCap?.storage ? keptMarks : record.annotations,\n () => targetsRef.current(),\n {\n meaning: () => capRef.current?.meaning,\n config: () => configRef.current,\n onCapture: (result) => capRef.current?.onCapture?.(result),\n selection: () => capRef.current?.selection,\n },\n );\n }\n const annotations = annotationsRef.current;\n\n // Chrome reads the store while it renders — a mark list, the export menu,\n // the overview — and the store reads the refs above, which hold the last\n // commit. So once a change to them commits, those readers are told to read\n // again. Through the context's `subscribe` alone: the store's own would have\n // the debounce below save marks that did not change.\n const inputsCommitted = useRef(new Set<() => void>());\n // biome-ignore lint/correctness/useExhaustiveDependencies: these are what `targets` and `config` answer from — the signal, not values this reads\n useLayoutEffect(() => {\n for (const fn of inputsCommitted.current) fn();\n }, [record.state, record.view, config, annotationsCap]);\n const provided = useMemo<AnnotationsApi>(\n () => ({\n ...annotations,\n subscribe: (fn) => {\n const off = annotations.subscribe(fn);\n inputsCommitted.current.add(fn);\n return () => {\n off();\n inputsCommitted.current.delete(fn);\n };\n },\n }),\n [annotations],\n );\n\n // Written on a trailing debounce rather than per notification: a scene\n // mutates every frame of a drag, and a zustand write per frame re-renders\n // every trial in the lab. The unmount flush is not an optimization — the\n // last mark before a trial closes is otherwise lost.\n const saveCap = annotationsCap?.storage;\n const saveRef = useLatest((doc: unknown): void => {\n if (saveCap) saveCap.save(doc as never);\n else updateTrialAnnotations(record.id, doc);\n });\n // Only when the pair flips, which is rare: bumping React state on every\n // scene notification would re-render the trial on every frame of a drag,\n // which is the thing the debounce below exists to avoid.\n const [markMoves, setMarkMoves] = useState({ undo: false, redo: false });\n useEffect(() => {\n if (!annotationsCap) return;\n const read = (): void => {\n const next = { undo: annotations.canUndo(), redo: annotations.canRedo() };\n setMarkMoves((prev) => (prev.undo === next.undo && prev.redo === next.redo ? prev : next));\n };\n read();\n return annotations.subscribe(read);\n }, [annotations, annotationsCap]);\n\n useEffect(() => {\n if (!annotationsCap) return;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let dirty = false;\n const flush = (): void => {\n if (!dirty) return;\n dirty = false;\n saveRef.current(annotations.toJSON());\n };\n const off = annotations.subscribe(() => {\n dirty = true;\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n timer = null;\n flush();\n }, 250);\n });\n return () => {\n off();\n if (timer) clearTimeout(timer);\n flush();\n };\n }, [annotations, annotationsCap, saveRef]);\n\n // A trial gets its own slot when its instrument declares tools; otherwise it\n // reads the lab's. Which slot a change writes follows from the same thing.\n // Annotation tools always read the lab's: a tool is what the hand holds, so\n // picking one arms it in every trial, the way artboards share a tool. They\n // were once per trial, back when one trial compared several pictures.\n const declaresTools = instrument.tools != null;\n const labTool = resolveLabTool(labToolId, instruments);\n const resolvedToolId = declaresTools\n ? (record.activeToolId ?? instrument.tools?.initial ?? instrument.tools?.tools[0]?.id ?? null)\n : labTool;\n const setActiveTool = (id: string): void => {\n if (declaresTools) setTrialTool(record.id, id);\n else setLabTool(id);\n };\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,\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,\n setState: (next) => {\n snapshotIfNeeded('state.change');\n updateTrialState(record.id, next);\n bus.emit('state.change');\n },\n setConfig: (path, value) => {\n const evt = `config.change:${path}`;\n snapshotIfNeeded('config.change');\n snapshotIfNeeded(evt);\n updateTrialConfig(record.id, path, value);\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, withZoom(view2d, z));\n },\n activeToolId: resolvedToolId,\n visibleLayers,\n pointer,\n },\n emit: (event) => {\n snapshotIfNeeded(event);\n bus.emit(event);\n },\n job: jobCap ? job : undefined,\n };\n\n // Marks are undone through weasel history, not through labkit's snapshot\n // stack — the spec's rule, and the reason a mark scene is the truth. A trial\n // declaring both takes the marks first: the most recent thing the user did\n // is what undo is for, and only a mark change moves the mark history.\n const undoState = () => {\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 const redoState = () => {\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 const undoBindings: UndoBindings | undefined =\n undoCap || annotationsCap\n ? {\n canUndo: markMoves.undo || (undoCap ? record.undoStack.past.length > 0 : false),\n canRedo: markMoves.redo || (undoCap ? record.undoStack.future.length > 0 : false),\n undo: () => {\n if (annotationsCap && annotations.undo()) return;\n if (undoCap) undoState();\n },\n redo: () => {\n if (annotationsCap && annotations.redo()) return;\n if (undoCap) redoState();\n },\n }\n : undefined;\n\n const loupeBindings: LoupeBindings | undefined =\n lenses > 0 ? { on: loupeOn, toggle: () => setLoupeOn((v) => !v) } : 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, frame) => {\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 applyCamera(ctx, view, frame);\n layer.draw(ctx, { state: record.state, config, zoom: view.zoom });\n },\n }));\n }, [instrument.canvas, record.state, config, layerVisibility, layerOrder]);\n\n const layerDescriptors: LayerDescriptor[] = useMemo(() => {\n if (!instrument.layers) return [];\n return instrument.layers.ids.map((l) => (typeof l === 'string' ? { id: l, label: l } : l));\n }, [instrument.layers]);\n\n // In the order the canvas draws them, with the always-on layers pinned\n // below the rest, where a drag cannot reach past them.\n const layerItems: LayerListItem[] = useMemo(() => {\n const ordered = layerOrder\n ? [...layerDescriptors].sort((a, b) => layerOrder.indexOf(a.id) - layerOrder.indexOf(b.id))\n : layerDescriptors;\n const pinnedLast = [\n ...ordered.filter((l) => !l.alwaysOn),\n ...ordered.filter((l) => l.alwaysOn),\n ];\n return pinnedLast.map((l) => ({\n id: l.id,\n label: l.label,\n locked: l.alwaysOn === true,\n visible: l.alwaysOn === true || layerVisibility[l.id] !== false,\n }));\n }, [layerDescriptors, layerOrder, layerVisibility]);\n\n const dragDropResult = useDragDrop({\n capability: instrument.dragDrop ?? { palette: [], onDrop: (_p, _i, s) => s },\n canvasContainerRef,\n view: view2d ?? DEFAULT_VIEW,\n worldSpec: instrument.canvas?.worldSpec,\n state: record.state,\n 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, config) : p;\n }, [instrument.dragDrop, record.state, 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 ref={canvasContainerRef} className=\"lk-trial__canvas-host\">\n <CanvasStack\n layers={layersWithFeedback}\n view={view2d ?? DEFAULT_VIEW}\n onViewChange={setView}\n worldSpec={instrument.canvas.worldSpec}\n onResize={placeView}\n minZoom={instrument.canvas.minZoom}\n maxZoom={instrument.canvas.maxZoom}\n >\n {instrument.render(renderCtx)}\n </CanvasStack>\n <DragOverlay drag={dragDropResult.drag} />\n </div>\n );\n } else if (stage) {\n body = (\n <Stage\n size={stage.size}\n view={view2d ?? DEFAULT_VIEW}\n onViewChange={setView}\n onResize={placeView}\n minZoom={stage.minZoom}\n maxZoom={stage.maxZoom}\n overlay={stage.overlay?.(renderCtx)}\n >\n {instrument.render(renderCtx)}\n </Stage>\n );\n } else {\n body = instrument.render(renderCtx);\n }\n\n const startDrag = dragDropResult.startDrag;\n const paletteNode = useMemo(\n () =>\n paletteItems.length > 0 ? <Palette items={paletteItems} onDragStart={startDrag} /> : null,\n [paletteItems, startDrag],\n );\n\n const layerListNode = useMemo(\n () =>\n instrument.layers && layerDescriptors.length > 0 ? (\n <LayerList\n items={layerItems}\n onReorder={(move) => {\n setLayerOrder(moveLayers(layerItems, move).map((l) => l.id));\n bus.emit('layers.reorder');\n }}\n onVisibilityChange={(lid, visible) => {\n setLayerVisibility((prev) => ({ ...prev, [lid]: visible }));\n bus.emit('layers.toggle');\n }}\n />\n ) : null,\n [instrument.layers, layerDescriptors, layerItems, bus],\n );\n\n const extraChrome = useMemo<TrialContribution[]>(() => {\n const out: TrialContribution[] = [];\n if (paletteNode) {\n out.push({\n id: 'dragdrop-palette',\n region: 'sidebar',\n item: { title: 'Parts', body: paletteNode },\n });\n }\n if (layerListNode) {\n out.push({\n id: 'layer-list',\n region: 'sidebar',\n item: { title: 'Layers', body: layerListNode },\n });\n }\n return out;\n }, [paletteNode, layerListNode]);\n\n // Rendered beside the body rather than inside it: an overlay portals itself\n // into the surface container, so where it sits in this tree decides only\n // when its effects run — after the instrument's refs have attached.\n const annotationOverlays = annotationsCap ? (\n <AnnotationTargets\n capability={annotationsCap}\n state={record.state}\n config={config}\n trial={{ id: record.id, view: record.view }}\n annotations={annotations}\n activeToolId={labTool}\n />\n ) : null;\n\n // The trial's root registries, isolated from the trial beside it. Each\n // camera inside mounts an input scope under them; chrome here reaches the\n // one last used. The pointer store is the trial's, shared by all of them.\n const scopedBody = (\n <WeaselProvider isolate>\n <PointerContextProvider store={pointer}>\n <CameraPublishContext.Provider value={publishCamera}>\n <LoupeSwitchContext.Provider value={loupeSwitch}>{body}</LoupeSwitchContext.Provider>\n </CameraPublishContext.Provider>\n </PointerContextProvider>\n </WeaselProvider>\n );\n\n return (\n <TrialIdProvider trialId={record.id}>\n <AnnotationsContext.Provider value={annotationsCap ? provided : null}>\n <CameraWheelContext.Provider value={wheelSlot}>\n <TrialChrome\n job={jobCap ? job : undefined}\n loupe={loupeBindings}\n trialId={record.id}\n record={record}\n instrument={instrument}\n isLastTrial={isLast}\n undoBindings={undoBindings}\n trialChrome={extraChrome}\n chrome={chrome}\n suppress={suppress}\n activeToolId={resolvedToolId}\n setActiveTool={setActiveTool}\n >\n {scopedBody}\n {annotationOverlays}\n </TrialChrome>\n </CameraWheelContext.Provider>\n </AnnotationsContext.Provider>\n </TrialIdProvider>\n );\n}\n","import { isAuto } from '../config/auto';\nimport { autoPathsOf } from '../config/autoConfig';\nimport { fillConfigDefaults, isRecord } from '../config/path';\nimport { unruledConfigSchema } from '../instrument/serializers';\nimport type { Instrument, InstrumentList } from '../instrument/types';\nimport { newId } from '../state/helpers';\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 const stage = instrument.canvas ? undefined : instrument.stage;\n const declared = instrument.canvas?.initialView ?? stage?.initialView;\n // A function needs the canvas size, which no trial has at creation. `null`\n // is the unplaced marker; `Trial` resolves it on the first non-empty size.\n // A stage that names no view is fitted, which needs that size too.\n if (typeof declared === 'function' || (stage && declared === undefined)) return null;\n return declared ? structuredClone(declared) : { ...DEFAULT_VIEW, pan: { ...DEFAULT_VIEW.pan } };\n}\n\n/** What a trial opens on beyond its instrument's own defaults. */\nexport interface AddTrialOptions<TC = Record<string, unknown>> {\n /** Overlaid on `defaultConfig()` before `initialState` reads it, so a trial\n * opened on a subject is running that subject from its first frame. Keys\n * whose value is `undefined` are left to the default. */\n config?: Partial<TC>;\n}\n\n/** `defaultConfig()` with `seed` written over it, down the tree: a seed naming\n * one leaf of a group leaves that group's other leaves at their defaults. */\nfunction seedConfig<TC>(defaults: TC, seed: Partial<TC> | undefined): TC {\n return seed ? fillConfigDefaults(seed, defaults) : defaults;\n}\n\n/** Splits a seed config into its ordinary values and the dotted paths it wrote\n * as `auto`, so the sentinel never reaches the record. */\nfunction splitAutoSeed(\n seed: Record<string, unknown> | undefined,\n at = '',\n): { config: Record<string, unknown>; autoPaths: string[] } {\n const config: Record<string, unknown> = {};\n const autoPaths: string[] = [];\n for (const [key, value] of Object.entries(seed ?? {})) {\n const path = at === '' ? key : `${at}.${key}`;\n if (isAuto(value)) {\n autoPaths.push(path);\n } else if (isRecord(value)) {\n const inner = splitAutoSeed(value as Record<string, unknown>, path);\n config[key] = inner.config;\n autoPaths.push(...inner.autoPaths);\n } else {\n config[key] = value;\n }\n }\n return { config, autoPaths };\n}\n\n/** The paths an instrument's own schema declares as starting auto. */\nfunction schemaAutoPaths(instrument: Instrument): string[] {\n const schema = unruledConfigSchema(instrument);\n return schema ? autoPathsOf(schema) : [];\n}\n\n/** Append a new trial running `instrumentName`, at that instrument's default\n * config — with `options.config` written over it — and the initial state\n * that config produces. */\nexport function addTrial(\n trials: TrialRecord[],\n instruments: InstrumentList,\n instrumentName: string,\n options: AddTrialOptions = {},\n): TrialRecord[] {\n const instrument = findInstrument(instruments, instrumentName);\n const seeded = splitAutoSeed(options.config as Record<string, unknown> | undefined);\n const autoPaths = [...new Set([...schemaAutoPaths(instrument), ...seeded.autoPaths])];\n const config = seedConfig(instrument.defaultConfig(), seeded.config);\n const state = instrument.initialState(config);\n const record: TrialRecord = {\n id: newId(),\n instrumentName,\n config,\n state,\n view: initialView(instrument),\n undoStack: { past: [], future: [] },\n };\n if (options.config) record.configSeed = seeded.config;\n if (seeded.autoPaths.length > 0) record.autoSeed = seeded.autoPaths;\n if (autoPaths.length > 0) record.auto = autoPaths;\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: newId(),\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 what it opened on — its instrument's defaults under the\n * seed `addTrial` was given — keeping its id and its 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 = seedConfig(instrument.defaultConfig(), current.configSeed);\n const state = instrument.initialState(config);\n const autoPaths = [...new Set([...schemaAutoPaths(instrument), ...(current.autoSeed ?? [])])];\n const { auto: _unpinnedNow, ...kept } = current;\n const reset: TrialRecord = {\n ...kept,\n config,\n state,\n view: initialView(instrument),\n };\n if (autoPaths.length > 0) reset.auto = autoPaths;\n return [...trials.slice(0, idx), reset, ...trials.slice(idx + 1)];\n}\n\n/** Put a fresh trial running `instrumentName` where trial `id` is. It gets a\n * new id, since the history, snapshots and marks keyed by the old one belong\n * to what that trial was running, but keeps the width its sidebar was\n * dragged to. */\nexport function swapTrial(\n trials: TrialRecord[],\n instruments: InstrumentList,\n id: string,\n instrumentName: string,\n options: AddTrialOptions = {},\n): TrialRecord[] {\n const idx = trials.findIndex((w) => w.id === id);\n const current = trials[idx];\n if (!current) return trials;\n const [record] = addTrial([], instruments, instrumentName, options) as [TrialRecord];\n if (current.sidebarWidth !== undefined) record.sidebarWidth = current.sidebarWidth;\n return [...trials.slice(0, idx), record, ...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 } from 'react';\n\n/** An element's edges, in the same coordinate space as the bound it is tested against. */\nexport interface Edges {\n top: number;\n left: number;\n bottom: number;\n right: number;\n}\n\nexport interface Overshoot<T> {\n item: T;\n /** How far past the bound the item reaches, in px, on whichever axis is worse. */\n by: number;\n axis: 'x' | 'y';\n}\n\n/** The item reaching furthest past the bottom or right of `bound`. On a tie the\n * first item wins, so given document order it names the outermost box. */\nexport function findOvershoot<T>(\n bound: Edges,\n items: Iterable<{ item: T; edges: Edges }>,\n tolerance = 1,\n): Overshoot<T> | null {\n let worst: Overshoot<T> | null = null;\n for (const { item, edges } of items) {\n const y = edges.bottom - bound.bottom;\n const x = edges.right - bound.right;\n const by = Math.max(x, y);\n if (by <= tolerance) continue;\n if (!worst || by > worst.by) worst = { item, by, axis: y >= x ? 'y' : 'x' };\n }\n return worst;\n}\n\nfunction tagAndClasses(el: Element): string {\n return el.tagName.toLowerCase() + [...el.classList].map((c) => `.${c}`).join('');\n}\n\n/** `div.lk-shell-body` — the tag and classes, which is what a reader greps for.\n * A classless element is placed by its nearest classed ancestor. */\nexport function describeElement(el: Element): string {\n if (el.classList.length > 0) return tagAndClasses(el);\n let up = el.parentElement;\n while (up && up.classList.length === 0) up = up.parentElement;\n return up ? `${tagAndClasses(el)} in ${tagAndClasses(up)}` : tagAndClasses(el);\n}\n\nfunction edgesOf(el: Element): Edges {\n const r = el.getBoundingClientRect();\n return { top: r.top, left: r.left, bottom: r.bottom, right: r.right };\n}\n\nfunction* candidates(root: Element): Iterable<{ item: Element; edges: Edges }> {\n yield { item: root, edges: edgesOf(root) };\n for (const el of root.querySelectorAll('*')) yield { item: el, edges: edgesOf(el) };\n}\n\nfunction overflows(el: Element): boolean {\n return el.scrollHeight > el.clientHeight + 1 || el.scrollWidth > el.clientWidth + 1;\n}\n\n/** Why a mounted lab scrolls, or null when it fits. The document only counts\n * when the lab is what reaches past the viewport, so a lab embedded in a long\n * page does not report the page's own scroll. */\nexport function explainLabScroll(lab: Element, shellBody: Element): string | null {\n if (overflows(shellBody)) {\n const r = shellBody.getBoundingClientRect();\n const bound = {\n top: r.top,\n left: r.left,\n bottom: r.top + shellBody.clientHeight,\n right: r.left + shellBody.clientWidth,\n };\n const hit = findOvershoot(bound, candidates(shellBody));\n return hit\n ? `.lk-shell-body scrolls: ${describeElement(hit.item)} reaches ${Math.round(hit.by)}px past it (${hit.axis})`\n : '.lk-shell-body scrolls';\n }\n\n const doc = document.scrollingElement ?? document.documentElement;\n if (!overflows(doc)) return null;\n const r = lab.getBoundingClientRect();\n const bound = {\n top: r.top,\n left: r.left,\n bottom: r.top + Math.min(r.height, doc.clientHeight),\n right: r.left + Math.min(r.width, doc.clientWidth),\n };\n const hit = findOvershoot(bound, candidates(lab));\n return hit\n ? `the page scrolls: ${describeElement(hit.item)} reaches ${Math.round(hit.by)}px past the lab's box (${hit.axis})`\n : null;\n}\n\nconst SETTLE_MS = 300;\n\n/** Dev only: warns once, naming the culprit, when a mounted lab scrolls. */\nexport function useLabFitWarning(labBody: Element | null): void {\n useEffect(() => {\n if (process.env.NODE_ENV === 'production') return;\n if (!labBody || typeof ResizeObserver === 'undefined') return;\n const lab = labBody.closest('.lk-lab');\n const shellBody = labBody.closest('.lk-shell-body');\n if (!lab || !shellBody) return;\n\n // A shrinking window overflows for a frame or two before the workspace\n // re-lays out, so only overflow that outlasts the resize is reported.\n let timer: ReturnType<typeof setTimeout> | undefined;\n const observer = new ResizeObserver(() => {\n clearTimeout(timer);\n timer = setTimeout(() => {\n const why = explainLabScroll(lab, shellBody);\n if (!why) return;\n observer.disconnect();\n console.warn(`[labkit] <Lab> should fit its container without scrolling, but ${why}.`);\n }, SETTLE_MS);\n });\n for (const el of [document.documentElement, lab, shellBody, labBody]) observer.observe(el);\n return () => {\n clearTimeout(timer);\n observer.disconnect();\n };\n }, [labBody]);\n}\n","import { AddIcon } from '@weasel-js/ui';\nimport { MenuButton, ThemeSwitcher } from '../passthrough/weasel-ui';\nimport { useLabContext } from './LabContext';\n\n/** The control `<Lab>` puts at the start of its header: add a trial. It drives\n * `LabContext`, which carried it with no UI at all — so every consumer rebuilt\n * it. Rendered before a consumer's own header content. */\nexport function LabHeader({ addTrial = true }: { addTrial?: boolean }) {\n const lab = useLabContext();\n const only = lab.instruments.length === 1 ? lab.instruments[0] : null;\n\n return (\n <>\n {!addTrial ? null : only ? (\n <button\n type=\"button\"\n className=\"lk-lab-header__add\"\n onClick={() => lab.addTrial(only.name)}\n >\n <AddIcon size={16} />\n <span>Add trial</span>\n </button>\n ) : (\n <MenuButton\n aria-label=\"Add trial\"\n label=\"Add trial…\"\n items={lab.instruments.map((i) => ({ value: i.name, label: i.title ?? i.name }))}\n onAction={(name) => lab.addTrial(name)}\n />\n )}\n </>\n );\n}\n\n/** The lab's color-mode switch, which `<Lab>` puts at the end of its header,\n * after a consumer's own header content. */\nexport function LabThemeSwitcher() {\n const lab = useLabContext();\n return <ThemeSwitcher value={lab.mode} onChange={lab.setMode} />;\n}\n","import { labContributions, useLabChromeContext } from '../chrome/LabChrome';\nimport type { LabContribution } from '../chrome/labTypes';\nimport { PaletteRegion } from '../chrome/regions/PaletteRegion';\nimport type { TrialTool } from '../tools/types';\n\n/** Props for `<LabPalette>`. */\nexport interface LabPaletteProps {\n /** Tools offered lab-wide. Shorthand for one `palette` contribution each. */\n tools?: readonly TrialTool[];\n /** The lab's contributions; the `palette` ones are laid out here. */\n contributions?: readonly LabContribution[];\n}\n\n/** The lab's tool rail. Writes the lab's tool slot, which every trial whose\n * instrument declares no tools of its own resolves to. Renders nothing when\n * the lab contributes no tool rail. */\nexport function LabPalette({ tools, contributions }: LabPaletteProps) {\n const ctx = useLabChromeContext();\n const all = labContributions(tools, contributions);\n return <PaletteRegion contributions={all.filter((c) => c.region === 'palette')} ctx={ctx} />;\n}\n","import { ThemeProvider, useResolvedColorMode, useThemeOptional } from '@weasel-js/theme/react';\nimport type { ReactNode } from 'react';\nimport type { LabMode } from '../state/types';\nimport { interstellarTheme } from '../theme/interstellar';\n\n/** Props for `<LabRoot>`. */\nexport interface LabRootProps {\n children: ReactNode;\n /** Color mode. \"auto\" (default) follows prefers-color-scheme. */\n mode?: LabMode;\n /** Added after `lk-root` on the same element. */\n className?: string;\n}\n\n/** The element every labkit component expects above it: `.lk-root`, which\n * carries the design tokens, the font stack, the box-sizing reset and the\n * element defaults a lab's bare markup is styled by, plus a theme when the\n * app has not already applied one.\n *\n * `<LabShell>` and `<Lab>` render this themselves. Mount it by hand around a\n * labkit piece used on its own — a bare `<Workspace>` or `<ControlPanel>` —\n * or those components inherit whatever the host page happens to define.\n * Pair it with `import '@weasel-js/labkit/styles.css'`, which is what defines\n * the rules this element scopes. */\nexport function LabRoot({ children, mode = 'auto', className }: LabRootProps) {\n const resolved = useResolvedColorMode(mode);\n const outer = useThemeOptional();\n\n // Overlays portal here rather than to the themed wrapper above: `.lk-root`\n // carries the element defaults a lab's bare markup is styled by.\n const root = (\n <div className={className ? `lk-root ${className}` : 'lk-root'} data-wzl-portal-host=\"\">\n {children}\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 root\n ) : (\n <ThemeProvider theme={interstellarTheme} selection={{ mode: resolved }}>\n {root}\n </ThemeProvider>\n );\n}\n","import { useCallback, useEffect, useId, useRef, useState } from 'react';\n\n/** One page in a project's set of labs. */\nexport interface LabPage {\n /** The page's own URL, and how the switcher knows which page is open. A\n * hash route (`#/dev/tools`) names a page on the current document. */\n href: string;\n label: string;\n}\n\n/** Props for `<LabSwitcher>`. */\nexport interface LabSwitcherProps {\n /** The open page's title, shown as the control's own label. */\n title: string;\n pages: readonly LabPage[];\n /** Defaults to the current location. Pass it in tests, or to render a\n * switcher for a page other than the one being viewed. */\n path?: string;\n className?: string;\n}\n\n/** A URL split into the document it names and the hash route on it, each\n * without its query, trailing slash or `.html`. */\nfunction locate(url: string): { doc: string; route: string } {\n const hash = url.indexOf('#');\n const trim = (part: string) => part.replace(/\\?.*$/, '').replace(/\\/$/, '');\n return {\n doc: trim(hash < 0 ? url : url.slice(0, hash)).replace(/\\.html$/, ''),\n route: hash < 0 ? '' : trim(url.slice(hash + 1)),\n };\n}\n\n/** Which of `pages` a path is on, or -1.\n *\n * Matched on the end of the path so a query string, a trailing slash or a\n * leftover `.html` cannot lose it: a project whose dev server maps `/stats`\n * to `stats.html` serves both spellings, and a bookmark from before the URLs\n * lost their extension still resolves to the same page.\n *\n * A page whose `href` carries a hash is a route on a single document and wins\n * when the path's hash is that route or one under it. A page without one\n * ignores the hash, so an in-page anchor does not lose it. */\nexport function currentPage(path: string, pages: readonly LabPage[]): number {\n const here = locate(path);\n const onDoc = (doc: string) => here.doc.endsWith(doc);\n const routed = pages.findIndex((p) => {\n if (!p.href.includes('#')) return false;\n const page = locate(p.href);\n return (\n onDoc(page.doc) && (here.route === page.route || here.route.startsWith(`${page.route}/`))\n );\n });\n if (routed >= 0) return routed;\n return pages.findIndex((p) => !p.href.includes('#') && onDoc(locate(p.href).doc));\n}\n\n/** A project's lab title, doubling as the way to reach its other labs.\n *\n * The menu holds real anchors, not a `<select>` and not buttons. These are\n * separate documents, so an `href` is what gets middle-click, cmd-click and\n * the back button for free; a select fires a change event and can do none of\n * the three. The trigger is a button because it opens something rather than\n * going anywhere.\n *\n * Pages accumulate -- a project grows a wall, a dashboard, an ingest page, a\n * bench -- and a tab strip is the layout that stops working first. */\nexport function LabSwitcher({ title, pages, path, className }: LabSwitcherProps) {\n const [open, setOpen] = useState(false);\n const root = useRef<HTMLDivElement>(null);\n const menuId = useId();\n const here = currentPage(\n path ?? (typeof window === 'undefined' ? '' : window.location.pathname + window.location.hash),\n pages,\n );\n\n const close = useCallback(() => setOpen(false), []);\n\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n close();\n root.current?.querySelector('button')?.focus();\n }\n };\n // Pointer, not click: a press that starts outside should dismiss before\n // whatever it lands on reacts, the way every other menu on the page does.\n const onDown = (e: PointerEvent) => {\n if (!root.current?.contains(e.target as Node)) close();\n };\n document.addEventListener('keydown', onKey);\n document.addEventListener('pointerdown', onDown);\n return () => {\n document.removeEventListener('keydown', onKey);\n document.removeEventListener('pointerdown', onDown);\n };\n }, [open, close]);\n\n // One lab is not a set to choose from, and a disclosure arrow promising a\n // menu of itself is worse than no control.\n if (pages.length < 2) {\n return <h1 className={`lk-switcher-title${className ? ` ${className}` : ''}`}>{title}</h1>;\n }\n\n return (\n <div className={`lk-switcher${className ? ` ${className}` : ''}`} ref={root}>\n <h1 className=\"lk-switcher-title\">\n <button\n type=\"button\"\n className=\"lk-switcher-trigger\"\n aria-expanded={open}\n aria-haspopup=\"menu\"\n aria-controls={open ? menuId : undefined}\n onClick={() => setOpen((was) => !was)}\n >\n {title}\n <span className=\"lk-switcher-caret\" aria-hidden=\"true\" />\n </button>\n </h1>\n {open && (\n <div className=\"lk-switcher-menu\" id={menuId} role=\"menu\">\n {pages.map((page, i) => (\n <a\n key={page.href}\n href={page.href}\n role=\"menuitem\"\n className=\"lk-switcher-item\"\n aria-current={i === here ? 'page' : undefined}\n onClick={close}\n >\n {page.label}\n </a>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { type ReactNode, useEffect } from 'react';\nimport type { LabMode } from '../state/types';\nimport { LabRoot } from './LabRoot';\nimport type { LabPage } from './LabSwitcher';\nimport { LabSwitcher } from './LabSwitcher';\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 /** The project's other labs. Given two or more, the title becomes the way\n * to reach them; given none, it stays a plain heading. */\n pages?: readonly LabPage[];\n /** The path the switcher reads to mark the open page. Defaults to the\n * current location. */\n path?: string;\n /** Set as `document.title` while the shell is mounted, and the previous\n * title restored after. Omitted, the document's title is left alone. */\n documentTitle?: string;\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({\n title,\n children,\n header,\n footer,\n mode = 'auto',\n pages,\n path,\n documentTitle,\n}: LabShellProps) {\n useEffect(() => {\n if (documentTitle === undefined) return;\n const previous = document.title;\n document.title = documentTitle;\n return () => {\n document.title = previous;\n };\n }, [documentTitle]);\n\n return (\n <LabRoot mode={mode} className=\"lk-shell\">\n <header className=\"lk-shell-header\">\n {pages && pages.length > 0 ? (\n <LabSwitcher title={title} pages={pages} path={path} className=\"lk-shell-title\" />\n ) : (\n <h1 className=\"lk-shell-title\">{title}</h1>\n )}\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 </LabRoot>\n );\n}\n","import {\n type Action,\n ActionDisabledReason,\n ActionsProvider,\n type ActionsRegistry,\n ActiveToolContextProvider,\n DepRegistryProvider,\n makeViewportZoomAction,\n type Tool,\n useActionsRegistry,\n useDepSource,\n useGestureDispatcher,\n useLatest,\n type ViewApi,\n} from '@weasel-js/core';\nimport { ZoomInIcon, ZoomOutIcon } from '@weasel-js/ui';\nimport { useContext, useEffect, useMemo, useSyncExternalStore } from 'react';\nimport { useStore } from 'zustand/react';\nimport type { CameraView } from '../canvas/CameraInput';\nimport { CameraRegistryContext } from '../canvas/cameraRegistry';\nimport { atScale, viewMiddle } from '../canvas/cameraZoom';\nimport { formatShortcut } from '../passthrough/weasel-ui';\nimport { Toolbar } from '../primitives/Toolbar';\nimport { LabStoreContext } from '../state/context';\nimport { as2DView } from '../state/view';\nimport { useLabContext } from './LabContext';\n\nconst ZOOM_ID = 'viewport.zoom';\nconst NO_TOOLS: ReadonlyMap<string, Tool> = new Map();\nconst CHANNELS = { contextMenu: false, ingest: false } as const;\nconst NO_ELEMENT = { current: null };\n\ntype ZoomKind = 'in' | 'out' | 'reset';\n\ninterface KeyBinding {\n spec: { kind: string; key?: string; mods?: { mod?: boolean; shift?: boolean | 'optional' } };\n opts?: { params?: { kind?: string } };\n}\n\n// Core's zoom with only its keys: the wheel and pinch belong to each trial's\n// own dispatcher. The clamp is left to the camera, which knows its range.\nconst BASE = makeViewportZoomAction({ min: 1e-9, max: Number.POSITIVE_INFINITY });\nconst KEY_BINDINGS = (BASE.defaultBinding as KeyBinding[]).filter((b) => b.spec.kind === 'key');\n\nfunction shortcutFor(kind: ZoomKind): string | undefined {\n const spec = KEY_BINDINGS.find((b) => b.opts?.params?.kind === kind)?.spec;\n return spec?.key ? formatShortcut({ key: spec.key, mod: spec.mods?.mod }) : undefined;\n}\n\n/** The focused trial's camera, with the zoom's reset meaning actual size about\n * the middle of the view. */\nfunction forZoom(camera: CameraView): ViewApi {\n return {\n get: camera.get,\n set: camera.set,\n hostSize: camera.hostSize,\n recenter: () => atScale(camera.get(), 1, viewMiddle(camera)),\n };\n}\n\nconst percent = new Intl.NumberFormat(undefined, { style: 'percent', maximumFractionDigits: 0 });\n\n/**\n * Zoom out, the zoom as a percentage, and zoom in, for whichever trial has the\n * focus. The percentage resets to actual size. They route through core's\n * `viewport.zoom` action, on a dispatcher of their own that listens for its\n * keys — Mod+=, Mod+- and Mod+0 — so the buttons and the keys are one path.\n * Over a trial with no camera the group stays, disabled, so the header does not\n * reflow as the focus moves.\n */\nexport function LabZoom() {\n return (\n <DepRegistryProvider>\n <ActionsProvider>\n <ActiveToolContextProvider>\n <LabZoomControls />\n </ActiveToolContextProvider>\n </ActionsProvider>\n </DepRegistryProvider>\n );\n}\n\nfunction LabZoomControls() {\n const registry = useActionsRegistry() as ActionsRegistry;\n const { focusedTrialId } = useLabContext();\n const cameras = useContext(CameraRegistryContext);\n const storeCtx = useContext(LabStoreContext);\n if (!storeCtx) throw new Error('[labkit] <LabZoom> requires <LabStoreProvider>');\n\n const camera = useSyncExternalStore(cameras?.subscribe ?? noSubscribe, () =>\n cameras && focusedTrialId ? cameras.get(focusedTrialId) : null,\n );\n const zoom = useStore(storeCtx.store, (s) => {\n const record = s.trials.find((t) => t.id === focusedTrialId);\n return as2DView(record?.view)?.zoom ?? null;\n });\n\n const live = zoom !== null && camera !== null;\n const view = useMemo(() => (camera ? forZoom(camera) : null), [camera]);\n const viewRef = useLatest(live ? view : null);\n\n useDepSource('view', () => viewRef.current as ViewApi);\n\n useEffect(() => {\n const action: Action = {\n ...BASE,\n defaultBinding: KEY_BINDINGS as Action['defaultBinding'],\n enabled: () => (viewRef.current ? true : ActionDisabledReason.NotApplicable),\n };\n return registry.register(action);\n }, [registry, viewRef]);\n\n // First, so a story's own zoom keys do not also fire over a trial with a\n // camera; over one without, the action is disabled and the keys pass on.\n useGestureDispatcher({\n canvasRef: NO_ELEMENT,\n actions: registry,\n entriesById: NO_TOOLS,\n channels: CHANNELS,\n keyboard: 'first',\n });\n\n const range = camera?.zoomRange();\n // A step that lands within rounding of a limit has reached it.\n const canIn = zoom !== null && range !== undefined && zoom < range.max * (1 - 1e-9);\n const canOut = zoom !== null && range !== undefined && zoom > range.min * (1 + 1e-9);\n const run = (kind: ZoomKind) => () => {\n registry.trigger(ZOOM_ID, { kind });\n };\n const hint = (label: string, kind: ZoomKind): string => {\n const keys = shortcutFor(kind);\n return keys ? `${label} (${keys})` : label;\n };\n const shown = live && zoom !== null ? percent.format(zoom) : null;\n\n return (\n <Toolbar aria-label=\"Zoom\">\n <Toolbar.Group aria-label=\"Zoom\">\n <Toolbar.Button\n iconOnly\n aria-label=\"Zoom out\"\n title={hint('Zoom out', 'out')}\n disabled={!canOut}\n onClick={run('out')}\n >\n <ZoomOutIcon size={16} />\n </Toolbar.Button>\n <Toolbar.Button\n aria-label={shown ? `Zoom ${shown} — reset to actual size` : 'Zoom unavailable'}\n title={live ? hint('Actual size', 'reset') : 'This trial has no camera'}\n disabled={!live}\n onClick={run('reset')}\n >\n <span className=\"lk-lab-zoom__readout\">{shown ?? '–'}</span>\n </Toolbar.Button>\n <Toolbar.Button\n iconOnly\n aria-label=\"Zoom in\"\n title={hint('Zoom in', 'in')}\n disabled={!canIn}\n onClick={run('in')}\n >\n <ZoomInIcon size={16} />\n </Toolbar.Button>\n </Toolbar.Group>\n </Toolbar>\n );\n}\n\nconst noSubscribe = (): (() => void) => () => {};\n","import { useLatest } from '@weasel-js/core';\nimport {\n Children,\n type ReactNode,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from 'react';\nimport { asNodeId, createNode, floatingStrategy, gridStrategy, type NodeId, Store } from 'windease';\nimport {\n type ChromeMap,\n Container,\n DragProvider,\n Provider,\n StrategyRegistryProvider,\n} from 'windease/react';\n\nimport { useSurfaceOptional } from '../surface/useSurfaceTile';\nimport { TrialDragContext } from '../trial/TrialDragContext';\nimport { usePanelHosts } from './panelHost';\n\nconst ZONE_ID = asNodeId('lk-workspace');\nconst STRATEGIES = { grid: gridStrategy as never, floating: floatingStrategy as never };\nconst FLOAT_ZONE_ID = asNodeId('lk-workspace-floating');\nconst PANEL_KIND = 'panel';\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\n/** Props for `Workspace`. */\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 /** Undocked sidebar panels to render alongside the trials. A `'tile'` panel\n * joins the grid as a peer of the trials; a `'floating'` one goes into the\n * floating zone above it. The body is portaled in by the trial that owns\n * it, so all this renders is the frame and the host. */\n panels?: readonly PanelDescriptor[];\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\n/** The layout store a workspace keeps for its lifetime: the tile grid, and the zone floating panels live in. */\nfunction createWorkspaceStore(grid: { resizable: boolean; gap: number; padding: number }): Store {\n const store = new Store();\n store.registerNode(\n createNode({\n kind: 'zone',\n id: ZONE_ID,\n container: { strategyId: 'grid', config: grid },\n }),\n );\n store.registerNode(\n createNode({\n kind: 'zone',\n id: FLOAT_ZONE_ID,\n container: { strategyId: 'floating', config: {} },\n }),\n );\n return store;\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/** The frame an undocked panel gets: a box, and the host element its trial\n * portals into. The title and the dock control come through the portal with\n * the body — the workspace knows a panel's key, not what is in it. */\nfunction PanelFrame({ panel, floating = false }: { panel: PanelDescriptor; floating?: boolean }) {\n const hosts = usePanelHosts();\n return (\n <div className={floating ? 'lk-panel-tile lk-panel-tile--floating' : 'lk-panel-tile'}>\n <div className=\"lk-panel-tile__body\" ref={(el) => hosts?.set(panel.key, el)} />\n </div>\n );\n}\n\n/** One undocked panel, as the workspace needs to know it. */\nexport interface PanelDescriptor {\n /** Stable key; also the portal host key the owning trial writes into. */\n key: string;\n title: string;\n as: 'tile' | 'floating';\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 *\n * `panels` are undocked sidebar sections. A `'tile'` panel is registered as a\n * peer of the trials under `PANEL_KIND`, so the grid places and resizes it like\n * one; a `'floating'` panel goes in the overlay above. Either way this renders\n * only the frame and an empty host: the section's content is portaled in by\n * the trial that owns it, which is what keeps a torn-out section inside its\n * trial's React tree instead of rebuilding it as a sibling.\n */\nexport function Workspace({\n children,\n ids,\n panels,\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 tilePanels = useMemo(() => (panels ?? []).filter((p) => p.as === 'tile'), [panels]);\n const floatPanels = useMemo(() => (panels ?? []).filter((p) => p.as === 'floating'), [panels]);\n // Identity has to be stable while the id *contents* are unchanged: the sync\n // effect below keys off it, and a fresh array every render would re-register\n // every tile forever. So the ids are memoized on a serialized key, and read\n // back from it.\n const idKey = JSON.stringify([\n ...items.map((_, i) => ids?.[i] ?? `lk-ws-${i}`),\n ...tilePanels.map((p) => `lk-panel-${p.key}`),\n ]);\n const nodeIds = useMemo(() => (JSON.parse(idKey) as string[]).map(asNodeId), [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 = useLatest(layout);\n const onLayoutChangeRef = useLatest(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 storeRef.current = createWorkspaceStore({ resizable, gap, padding });\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 const kind = String(id).startsWith('lk-panel-') ? PANEL_KIND : KIND;\n store.registerNode(createNode({ 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, layoutRef]);\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]);\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, onLayoutChangeRef]);\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 const panelByNode = new Map<string, PanelDescriptor>(\n tilePanels.map((p) => [`lk-panel-${p.key}`, p]),\n );\n return {\n [PANEL_KIND]: ({ node }) => {\n const panel = panelByNode.get(String(node.id));\n if (!panel) return null;\n return <PanelFrame panel={panel} />;\n },\n [KIND]: ({ node }) => {\n const content = byId.get(node.id) ?? null;\n if (!reorderable) return content;\n return (\n // No grip strip: the trial's own title bar is the drag surface.\n <TrialDragContext.Provider value={{ nodeId: node.id }}>\n <div className=\"lk-trial-tile\">{content}</div>\n </TrialDragContext.Provider>\n );\n },\n };\n }, [nodeIds, items, reorderable, tilePanels]);\n\n const floatingLayer =\n floatPanels.length === 0 ? null : (\n <div className=\"lk-workspace__floating\">\n {floatPanels.map((p) => (\n <PanelFrame key={p.key} panel={p} floating />\n ))}\n </div>\n );\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 {floatingLayer ? (\n // The floating layer insets against the workspace, so it needs a\n // positioned box around both. Without one it insets against the page\n // and lands over the lab header.\n <div className=\"lk-workspace-host\">\n {reorderable ? <DragProvider>{grid}</DragProvider> : grid}\n {floatingLayer}\n </div>\n ) : reorderable ? (\n <DragProvider>{grid}</DragProvider>\n ) : (\n grid\n )}\n </StrategyRegistryProvider>\n </Provider>\n );\n}\n","import { type ColorList, colorAt, colorCount, resolveTheme, type Theme } from '@weasel-js/theme';\nimport { ThemeProvider, useResolvedColorMode } from '@weasel-js/theme/react';\nimport {\n type CSSProperties,\n type ReactNode,\n useCallback,\n useEffect,\n useInsertionEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useStore } from 'zustand/react';\nimport { AnnotationPreloadContext } from '../annotations/preload';\nimport { labAnnotationTools } from '../annotations/toolMap';\nimport { CameraRegistryContext, createCameraRegistry } from '../canvas/cameraRegistry';\nimport {\n LabAsideRegion,\n LabFooterRegion,\n LabHeaderRegion,\n LabSidebarRegion,\n labContributions,\n} from '../chrome/LabChrome';\nimport type { LabContribution } from '../chrome/labTypes';\nimport type { TrialContribution } from '../chrome/types';\nimport type { ConfigRule, ControlRenderer } from '../config/types';\nimport type { InstrumentList } from '../instrument/types';\nimport { Split } from '../primitives/Split';\nimport { defaultStorage, noneAdapter } from '../state/adapters';\nimport { LabStoreContext } from '../state/context';\nimport { type OpenedLabStore, openLabStore } from '../state/openLabStore';\nimport { PersistenceContext } from '../state/Persistence';\nimport { createRecordCache } from '../state/records';\nimport { createLabStore, type LabStore } from '../state/store';\nimport type { LabDensity, LabMode, StorageAdapter, TrialRecord } from '../state/types';\nimport { useOpenOnce, useWarnIgnoredChange } from '../state/useOpenOnce';\nimport { usePersistedState } from '../state/usePersistedState';\nimport { SurfaceCanvasContext, SurfaceContext } from '../surface/SurfaceContext';\nimport { useSurfaceCanvas, useSurfaceOptional } from '../surface/useSurfaceTile';\nimport { type SurfaceFrame, useTiledSurface } from '../surface/useTiledSurface';\nimport { interstellarTheme } from '../theme/interstellar';\nimport type { TrialTool } from '../tools/types';\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 swapTrial as swapTrialOp,\n} from '../trial/trialOps';\nimport { useLabFitWarning } from './fitCheck';\nimport { LabContext, type LabContextValue } from './LabContext';\nimport { LabHeader, LabThemeSwitcher } from './LabHeader';\nimport { LabPalette } from './LabPalette';\nimport { LabShell } from './LabShell';\nimport type { LabPage } from './LabSwitcher';\nimport { LabZoom } from './LabZoom';\nimport { createPanelHostRegistry, PanelHostContext } from './panelHost';\nimport { type PanelDescriptor, type TrialLayout, Workspace } from './Workspace';\n\ninterface LabBaseProps {\n /** May change while mounted. An instrument that is a different object from\n * the last render counts as replaced and its open trials' configs are\n * refilled, so hoist or memoize the list. */\n instruments: InstrumentList;\n defaultInstrument: string;\n mode?: LabMode;\n /** How much room the lab's chrome takes. Default `'comfortable'`; a lab whose\n * window is the whole app, rather than a panel beside one, reads better at\n * `'roomy'`. The trials' own contents are unaffected. */\n density?: LabDensity;\n /** The theme the lab's chrome resolves against, applied at `mode` and\n * `density`. Default `interstellarTheme`; extend it rather than replace it to\n * keep the lab's look while changing a few tokens. */\n theme?: Theme;\n /** Rendered while a stored lab loads. Default: the lab's empty shell. */\n fallback?: ReactNode;\n /**\n * Colors composing the interstellar theme's cosmic backdrop. Each becomes\n * one radial-gradient blob on the dark void base, in a fixed spread of\n * positions; extras wrap around. A theme ramp resolves against the lab's\n * theme; a function list gives as many blobs as there are positions.\n * Ignored unless the resolved mode is dark.\n */\n nebula?: ColorList;\n title?: string;\n /** The project's other labs. Given two or more, the title becomes the way to\n * reach them — the same switcher `<LabShell>` renders, so a lab reached from\n * one is not a dead end. */\n pages?: readonly LabPage[];\n /** The path the switcher marks as open. Defaults to the current location. */\n path?: string;\n /** Rendered in the shell's footer, below the workspace. */\n footer?: ReactNode;\n /** Contributions added to every trial's chrome, after the instrument's own. */\n chrome?: readonly TrialContribution[];\n /** Contributions to the lab's own chrome — its header bar, its sidebar, its\n * tool rail and its footer — rather than to every trial's. Rendered after\n * `children` and `footer`, which stay the way a lab drops arbitrary content\n * into those same two boxes. Going from no sidebar contributions to some\n * remounts the workspace and every trial, dropping unpersisted trial state. */\n labChrome?: readonly LabContribution[];\n /** Built-in contribution ids to drop. Throws on an id that is not there. */\n suppress?: readonly string[];\n /** Offer the header's add-trial control. Default `true`; a lab that opens\n * trials some other way passes `false`. */\n addTrial?: boolean;\n /** Offer the header's zoom controls, which act on the focused trial's camera\n * and answer Mod+=, Mod+- and Mod+0. Default `true`. */\n zoom?: boolean;\n /** Tools offered lab-wide. A trial whose instrument declares none of its own\n * reflects and writes this slot. */\n tools?: readonly TrialTool[];\n /** Rules run over every instrument's config leaves, before labkit's own\n * inference — where a lab states a convention once instead of annotating\n * each field. Memoize or hoist. */\n configRules?: readonly ConfigRule[];\n /** Control overrides and app-defined kinds for every trial's settings panel.\n * Keys are config paths (checked first) or leaf kinds. Memoize or hoist. */\n controls?: Record<string, ControlRenderer>;\n children?: ReactNode;\n}\n\n/** Props for `<Lab>`. With a `storageKey` the lab persists — to IndexedDB\n * unless `storage` names another substrate — and both are read once, at\n * mount. Without one, nothing persists. */\nexport type LabProps = LabBaseProps &\n (\n | { storageKey?: undefined; storage?: undefined }\n | { storageKey: string; storage?: StorageAdapter }\n );\n\ninterface OpenedLab extends OpenedLabStore {\n marks: ReadonlyMap<string, unknown>;\n}\n\nfunction seedDefaultTrial(\n store: LabStore,\n instruments: InstrumentList,\n defaultInstrument: string,\n): void {\n if (store.getState().trials.length > 0) return;\n const record = addTrialOp([], instruments, defaultInstrument)[0];\n if (!record) return;\n const { undoStack: _undoStack, ...rest } = record;\n store.getState().addTrial(rest);\n}\n\n/** A lab with nothing to load renders at once. Its records hold\n * `usePersistedState` values for the session and write nothing. */\nfunction openUnstoredLab({ instruments, defaultInstrument, mode }: LabProps): OpenedLab {\n const store = createLabStore({ initialMode: mode ?? 'auto', instruments });\n seedDefaultTrial(store, instruments, defaultInstrument);\n const records = createRecordCache({ storage: noneAdapter, prefix: '', writable: false });\n return { store, records, close: () => records.close(), marks: new Map() };\n}\n\nasync function openStoredLab(\n { instruments, defaultInstrument, mode }: LabProps,\n storageKey: string,\n storage: StorageAdapter | undefined,\n): Promise<OpenedLab> {\n // The store reads the instruments' serializers and defaults while it is being\n // built, so they go in with it rather than being pushed onto it afterwards.\n const opened = await openLabStore({\n storageKey,\n storage: storage ?? (await defaultStorage()),\n initialMode: mode ?? 'auto',\n instruments,\n });\n seedDefaultTrial(opened.store, instruments, defaultInstrument);\n const marks = new Map<string, unknown>();\n await Promise.all(\n opened.store.getState().trials.map(async (trial) => {\n const kept = instruments.find((i) => i.name === trial.instrumentName)?.annotations?.storage;\n if (!kept) return;\n try {\n marks.set(trial.id, await kept.load());\n } catch (error) {\n console.warn(`[labkit] could not load the marks of trial \"${trial.id}\"`, error);\n marks.set(trial.id, null);\n }\n }),\n );\n return { ...opened, marks };\n}\n\nfunction LabFallback({\n title,\n mode,\n density,\n theme = interstellarTheme,\n pages,\n path,\n}: Pick<LabBaseProps, 'title' | 'mode' | 'density' | 'theme' | 'pages' | 'path'>) {\n const resolvedMode = useResolvedColorMode(mode ?? 'auto');\n return (\n <ThemeProvider\n theme={theme}\n selection={{ mode: resolvedMode, density: density ?? 'comfortable' }}\n className=\"lk-lab\"\n >\n <LabShell\n title={title ?? 'Labkit'}\n mode={mode}\n {...(pages ? { pages } : {})}\n {...(path !== undefined ? { path } : {})}\n >\n {null}\n </LabShell>\n </ThemeProvider>\n );\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(\n list: ColorList,\n theme: Theme,\n mode: 'light' | 'dark',\n density: string,\n): string {\n const ctx = { theme, resolved: resolveTheme(theme, { mode, density }) };\n const n = colorCount(list, ctx) ?? NEBULA_SLOTS.length;\n const colors = Array.from({ length: n }, (_, i) => colorAt(list, i, ctx));\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 strip holding the sidebar beside the tool rail and workspace. Its own component\n * because the width is a persisted value, and `LabRuntime` renders the\n * persistence provider it reads from. */\nfunction LabPanes({\n contributions,\n children,\n}: {\n contributions: readonly LabContribution[];\n children: ReactNode;\n}) {\n const surface = useSurfaceOptional();\n const [sidebarWidth, setSidebarWidth] = usePersistedState<number | undefined>(\n 'lk-lab-sidebar-width',\n undefined,\n { scope: 'lab' },\n );\n const [asideWidth, setAsideWidth] = usePersistedState<number | undefined>(\n 'lk-lab-aside-width',\n undefined,\n { scope: 'lab' },\n );\n const main = contributions.some((c) => c.region === 'aside') ? (\n <Split\n className=\"lk-lab__panes\"\n side=\"end\"\n sidebarClassName=\"lk-lab__aside\"\n contentClassName=\"lk-lab__main\"\n label=\"Lab aside\"\n defaultWidth={320}\n width={asideWidth}\n onWidthChange={(w) => {\n setAsideWidth(w);\n surface?.invalidateRects();\n }}\n sidebar={<LabAsideRegion contributions={contributions} />}\n >\n {children}\n </Split>\n ) : (\n children\n );\n if (!contributions.some((c) => c.region === 'sidebar')) return main;\n return (\n <Split\n className=\"lk-lab__panes\"\n sidebarClassName=\"lk-lab__sidebar\"\n contentClassName=\"lk-lab__main\"\n label=\"Lab sidebar\"\n defaultWidth={260}\n width={sidebarWidth}\n onWidthChange={(w) => {\n setSidebarWidth(w);\n surface?.invalidateRects();\n }}\n sidebar={<LabSidebarRegion contributions={contributions} />}\n >\n {main}\n </Split>\n );\n}\n\n/** The lab runtime: opens the store, provides it, and renders one trial\n * per record in a grid. Each trial runs one of `instruments`. */\nexport function Lab(props: LabProps) {\n if (process.env.NODE_ENV !== 'production' && props.instruments.length === 0) {\n throw new Error('[labkit] <Lab> requires a non-empty `instruments` array');\n }\n const { storageKey, storage } = props;\n useWarnIgnoredChange('<Lab>', { storageKey, storage });\n const opened = useOpenOnce<OpenedLab>(() =>\n storageKey === undefined ? openUnstoredLab(props) : openStoredLab(props, storageKey, storage),\n );\n if (!opened) {\n if (props.fallback !== undefined) return props.fallback;\n return (\n <LabFallback\n title={props.title}\n mode={props.mode}\n density={props.density}\n {...(props.theme ? { theme: props.theme } : {})}\n pages={props.pages}\n path={props.path}\n />\n );\n }\n return <LabRuntime {...props} opened={opened} />;\n}\n\nfunction LabRuntime({\n instruments,\n mode,\n density,\n theme = interstellarTheme,\n nebula,\n title,\n pages,\n path,\n footer,\n chrome,\n labChrome,\n suppress,\n addTrial,\n zoom = true,\n tools,\n configRules,\n controls,\n children,\n opened,\n}: LabProps & { opened: OpenedLab }) {\n const { store } = opened;\n\n // The store opened against the list <Lab> mounted with; a later list reaches\n // it here, before paint.\n useLayoutEffect(() => {\n store.getState().setInstruments(instruments);\n }, [instruments, store]);\n\n const trials = useStore(store, (s) => s.trials);\n const [cameras] = useState(createCameraRegistry);\n const [focusPick, setFocusPick] = useState<string | null>(null);\n const focusedTrialId = trials.some((t) => t.id === focusPick)\n ? focusPick\n : (trials[0]?.id ?? null);\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 undockedPanels = useStore(store, (s) => s.undockedPanels);\n\n // One registry for the lab's lifetime: a panel host is a DOM node the\n // workspace owns and the trial portals into, so it must outlive both ends of\n // a dock/undock without being rebuilt.\n const panelHostsRef = useRef<ReturnType<typeof createPanelHostRegistry> | null>(null);\n if (panelHostsRef.current === null) panelHostsRef.current = createPanelHostRegistry();\n\n // One shared drawing surface for the whole lab, anchored to the body — tile\n // rects compose against it, and both buffers compose against the same rects.\n // `Workspace` invalidates rects when the grid moves something a\n // ResizeObserver cannot see. A host that already owns a surface keeps it: a\n // lab embedded in a larger shared-surface app must not open a second GL\n // tenancy, and mounts no buffer of its own.\n const outerSurface = useSurfaceOptional();\n const outerOver = useSurfaceCanvas('over');\n const outerUnder = useSurfaceCanvas('under');\n const [ownOver, setOwnOver] = useState<HTMLCanvasElement | null>(null);\n const [ownUnder, setOwnUnder] = useState<HTMLCanvasElement | null>(null);\n const ownOverRef = useRef<HTMLCanvasElement | null>(null);\n const ownUnderRef = useRef<HTMLCanvasElement | null>(null);\n const bufferRef = useRef({ w: 0, h: 0 });\n const surfaceRef = useRef<ReturnType<typeof useTiledSurface> | null>(null);\n\n // Sizing the buffer clears all of it, so every tile has to repaint — not\n // only the one whose move triggered the measurement. Both buffers are sized\n // together off one comparison: they are the same box, so a tenant of either\n // is looking at the same rects, and one invalidateAll covers both.\n const onFrame = useCallback((frame: SurfaceFrame) => {\n const canvases = [ownUnderRef.current, ownOverRef.current].filter((c) => c !== null);\n if (canvases.length === 0) return;\n const w = Math.round(frame.size.width * frame.dpr);\n const h = Math.round(frame.size.height * frame.dpr);\n if (bufferRef.current.w !== w || bufferRef.current.h !== h) {\n bufferRef.current = { w, h };\n for (const c of canvases) {\n c.width = w;\n c.height = h;\n c.style.width = `${frame.size.width}px`;\n c.style.height = `${frame.size.height}px`;\n }\n surfaceRef.current?.invalidateAll();\n return;\n }\n // A same-size re-tile does not go through here: assigning `width` its own\n // value resizes nothing, so it clears nothing. The tenants clear, through\n // `registerClear`.\n }, []);\n\n const ownSurface = useTiledSurface({ onFrame });\n // Not `useLatest`: `onFrame` reads it, and is needed before the surface exists.\n useInsertionEffect(() => {\n surfaceRef.current = ownSurface;\n }, [ownSurface]);\n const [labBody, setLabBody] = useState<HTMLDivElement | null>(null);\n const attachOwnSurface = ownSurface.containerRef;\n const labBodyRef = useCallback(\n (el: HTMLDivElement | null) => {\n setLabBody(el);\n if (!outerSurface) attachOwnSurface(el);\n },\n [outerSurface, attachOwnSurface],\n );\n useLabFitWarning(labBody);\n\n useEffect(() => {\n if (!labBody) return;\n const pick = (node: unknown): void => {\n const owned = new Set(store.getState().trials.map((t) => t.id));\n const nearest = (from: Element | null | undefined) =>\n from?.closest<HTMLElement>('.lk-trial[data-trial-id]') ?? null;\n let trial =\n typeof (node as Element | null)?.closest === 'function' ? nearest(node as Element) : null;\n // A trial can hold a lab of its own, whose trials this lab does not own.\n while (trial && !owned.has(trial.dataset.trialId ?? '')) trial = nearest(trial.parentElement);\n if (trial?.dataset.trialId) setFocusPick(trial.dataset.trialId);\n };\n const onInput = (event: Event): void => pick(event.target);\n // Focus moving into a frame fires nothing in this document: the window\n // blurs, and the frame is the active element once it has.\n let pending: ReturnType<typeof setTimeout> | undefined;\n const doc = labBody.ownerDocument;\n const win = doc.defaultView;\n const onBlur = (): void => {\n clearTimeout(pending);\n pending = setTimeout(() => pick(doc.activeElement), 0);\n };\n labBody.addEventListener('pointerdown', onInput, true);\n labBody.addEventListener('focusin', onInput, true);\n win?.addEventListener('blur', onBlur);\n return () => {\n clearTimeout(pending);\n labBody.removeEventListener('pointerdown', onInput, true);\n labBody.removeEventListener('focusin', onInput, true);\n win?.removeEventListener('blur', onBlur);\n };\n }, [labBody, store]);\n const surface = outerSurface ?? ownSurface;\n const surfaceCanvases = useMemo(\n () =>\n outerSurface ? { over: outerOver, under: outerUnder } : { over: ownOver, under: ownUnder },\n [outerSurface, outerOver, outerUnder, ownOver, ownUnder],\n );\n\n const workspacePanels = useMemo<PanelDescriptor[]>(\n () =>\n Object.entries(undockedPanels).map(([key, panel]) => ({\n key,\n title: panel.sectionId,\n as: panel.as,\n })),\n [undockedPanels],\n );\n const resolvedMode = useResolvedColorMode(modeValue);\n\n // Tools and lab contributions share one id namespace, so they merge once\n // here — before any region renders — and a collision throws rather than one\n // of them silently losing.\n // Declaring `annotations` on any instrument puts the drawing tools here, in\n // the lab's rail: one tool is armed across every trial.\n const annotationTools = useMemo(() => labAnnotationTools(instruments), [instruments]);\n const labChromeAll = useMemo(\n () => labContributions([...annotationTools, ...(tools ?? [])], labChrome),\n [annotationTools, tools, labChrome],\n );\n const hasFooterChrome = labChromeAll.some((c) => c.region === 'footer');\n const hasPaneChrome = labChromeAll.some((c) => c.region === 'sidebar' || c.region === 'aside');\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 };\n const replaceAndFocusAdded = (next: TrialRecord[]): void => {\n const before = new Set(store.getState().trials.map((w) => w.id));\n replaceTrials(next);\n const added = next.find((w) => !before.has(w.id));\n if (added) setFocusPick(added.id);\n };\n\n return {\n instruments,\n trials,\n addTrial: (instrumentName, options) => {\n replaceAndFocusAdded(\n addTrialOp(store.getState().trials, instruments, instrumentName, options),\n );\n },\n cloneTrial: (id) => {\n replaceAndFocusAdded(cloneTrialOp(store.getState().trials, id));\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 swapTrial: (id, instrumentName, options) => {\n const current = store.getState();\n const next = swapTrialOp(current.trials, instruments, id, instrumentName, options);\n if (next === current.trials) return;\n const record = next[current.trials.findIndex((w) => w.id === id)] as TrialRecord;\n // Written before the tile registers, which is when the grid reads it.\n const { [id]: extent, ...layoutRest } = current.layout as TrialLayout;\n if (extent) current.setLayout({ ...layoutRest, [record.id]: extent });\n replaceTrials(next);\n if (focusedTrialId === id) setFocusPick(record.id);\n },\n focusedTrialId,\n focusTrial: (id) => setFocusPick(id),\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 },\n savedSnapshots,\n saveSnapshot: (trialId, name) => {\n const taken = store.getState().savedSnapshots.filter((s) => s.trialId === trialId).length;\n store.getState().saveSnapshot(trialId, name ?? `Snapshot ${taken + 1}`);\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 configRules,\n controls,\n };\n }, [\n instruments,\n trials,\n focusedTrialId,\n savedSnapshots,\n modeValue,\n store,\n configRules,\n controls,\n ]);\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 && colorCount(nebula) !== 0\n ? ({\n ['--wzl-backdrop' as string]: buildNebula(\n nebula,\n theme,\n resolvedMode,\n density ?? 'comfortable',\n ),\n } as CSSProperties)\n : undefined;\n\n const workspace = (\n <Workspace\n panels={workspacePanels}\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} chrome={chrome} suppress={suppress} />\n ))}\n </Workspace>\n );\n\n return (\n <LabStoreContext.Provider value={{ store }}>\n <PersistenceContext.Provider value={opened.records}>\n <AnnotationPreloadContext.Provider value={opened.marks}>\n <LabContext.Provider value={contextValue}>\n <CameraRegistryContext.Provider value={cameras}>\n <ThemeProvider\n theme={theme}\n selection={{ mode: resolvedMode, density: density ?? 'comfortable' }}\n className=\"lk-lab\"\n style={backdropStyle}\n >\n <LabShell\n title={title ?? 'Labkit'}\n mode={modeValue}\n {...(pages ? { pages } : {})}\n {...(path !== undefined ? { path } : {})}\n footer={\n hasFooterChrome ? (\n <>\n {footer}\n <LabFooterRegion contributions={labChromeAll} />\n </>\n ) : (\n footer\n )\n }\n header={\n <>\n <LabHeader {...(addTrial !== undefined ? { addTrial } : {})} />\n {zoom ? <LabZoom /> : null}\n {children}\n <LabHeaderRegion contributions={labChromeAll} />\n <LabThemeSwitcher />\n </>\n }\n >\n <PanelHostContext.Provider value={panelHostsRef.current}>\n <SurfaceContext.Provider value={surface}>\n <SurfaceCanvasContext.Provider value={surfaceCanvases}>\n <div className=\"lk-lab__body\" ref={labBodyRef}>\n {outerSurface ? null : (\n // Two buffers stacked around the trials, both inert —\n // each tile takes input from its own box. A tile's marks\n // annotate the instrument's DOM from over it; an opaque\n // renderer sits under it, so the pane can still hold a\n // label. The under one is first so it paints first.\n <>\n <canvas\n className=\"lk-lab__surface lk-lab__surface--under\"\n ref={(el) => {\n ownUnderRef.current = el;\n setOwnUnder(el);\n }}\n />\n <canvas\n className=\"lk-lab__surface lk-lab__surface--over\"\n ref={(el) => {\n ownOverRef.current = el;\n setOwnOver(el);\n }}\n />\n </>\n )}\n {hasPaneChrome ? (\n <LabPanes contributions={labChromeAll}>\n <LabPalette contributions={labChromeAll} />\n {workspace}\n </LabPanes>\n ) : (\n <>\n <LabPalette contributions={labChromeAll} />\n {workspace}\n </>\n )}\n </div>\n </SurfaceCanvasContext.Provider>\n </SurfaceContext.Provider>\n </PanelHostContext.Provider>\n </LabShell>\n </ThemeProvider>\n </CameraRegistryContext.Provider>\n </LabContext.Provider>\n </AnnotationPreloadContext.Provider>\n </PersistenceContext.Provider>\n </LabStoreContext.Provider>\n );\n}\n","import { ThemeContext } from '@weasel-js/theme/react';\nimport type { ReactNode } from 'react';\nimport { AnnotationsContext } from '../annotations/AnnotationsContext';\nimport { AnnotationPreloadContext } from '../annotations/preload';\nimport { CameraWheelContext } from '../canvas/CameraWheelContext';\nimport { CanvasStackContext } from '../canvas/CanvasStackContext';\nimport { LabStoreContext, TrialIdContext } from '../state/context';\nimport { PersistenceContext } from '../state/Persistence';\nimport { SurfaceCanvasContext, SurfaceContext } from '../surface/SurfaceContext';\nimport { TrialDragContext } from '../trial/TrialDragContext';\nimport { LabContext } from './LabContext';\nimport { PanelHostContext } from './panelHost';\n\n/** Props for `<LabBoundary>`. */\nexport interface LabBoundaryProps {\n children: ReactNode;\n}\n\n/**\n * Renders its children as though no lab, trial or theme were above them: every context a `<Lab>` or a\n * `<Trial>` publishes reads as absent below it, so a labkit piece mounted inside a trial behaves the way it\n * does on a bare page. A `<LabRoot>` under it applies its own theme instead of deferring to the lab's, and a\n * `usePersistedState` under it keeps local state instead of writing into the enclosing lab's records.\n *\n * For a host that shows arbitrary content inside a trial, such as a component workshop; a lab's own chrome\n * never needs it.\n */\nexport function LabBoundary({ children }: LabBoundaryProps) {\n return (\n <LabStoreContext.Provider value={null}>\n <PersistenceContext.Provider value={null}>\n <AnnotationPreloadContext.Provider value={null}>\n <LabContext.Provider value={null}>\n <PanelHostContext.Provider value={null}>\n <SurfaceContext.Provider value={null}>\n <SurfaceCanvasContext.Provider value={{ over: null, under: null }}>\n <TrialIdContext.Provider value={null}>\n <AnnotationsContext.Provider value={null}>\n <CameraWheelContext.Provider value={null}>\n <CanvasStackContext.Provider value={null}>\n <TrialDragContext.Provider value={null}>\n <ThemeContext.Provider value={null}>{children}</ThemeContext.Provider>\n </TrialDragContext.Provider>\n </CanvasStackContext.Provider>\n </CameraWheelContext.Provider>\n </AnnotationsContext.Provider>\n </TrialIdContext.Provider>\n </SurfaceCanvasContext.Provider>\n </SurfaceContext.Provider>\n </PanelHostContext.Provider>\n </LabContext.Provider>\n </AnnotationPreloadContext.Provider>\n </PersistenceContext.Provider>\n </LabStoreContext.Provider>\n );\n}\n","import type { FillStyle, Track } from '@weasel-js/core';\nimport {\n Badge,\n type Band,\n BandEditor,\n Button,\n ButtonBar,\n Callout,\n Checkbox,\n ColorField,\n ComboBox,\n type ControlPoint,\n CurveEditor,\n createToastQueue,\n DataGrid,\n DetentSlider,\n Dialog,\n Disclosure,\n GradientEditor,\n InlineRange,\n Input,\n ItemList,\n KeyCap,\n KeySequence,\n LayerList,\n type LayerListItem,\n MenuButton,\n moveLayers,\n NumberField,\n OptionsBar,\n PaintInput,\n Plot2D,\n PointPlotter,\n Powerline,\n type PrefGroup,\n PrefsForm,\n PropertyField,\n PropertyGroup,\n PropertyList,\n PropertyPanel,\n Radio,\n RadioGroup,\n RangeSlider,\n ResizeHandle,\n Select,\n Sidebar,\n SidebarPanel,\n Slider,\n StatusBarItem,\n StatusBarSpacer,\n Switch,\n Tab,\n TabList,\n TabPanel,\n Tabs,\n type Thumb,\n Timeline,\n ToastRegion,\n ToggleBar,\n ToolButton,\n ToolGroup,\n ToolOptionsBar,\n Tooltip,\n TooltipTrigger,\n StatusBar as UiStatusBar,\n} from '@weasel-js/ui';\nimport { type CSSProperties, type ReactNode, useId, useMemo, useRef, useState } from 'react';\nimport { Focusable } from 'react-aria-components';\nimport type { JobHandle } from '../job/types';\nimport { FloatingPanel } from '../primitives/FloatingPanel';\nimport { JobProgress } from '../primitives/JobProgress';\nimport { Legend, type LegendEntry } from '../primitives/Legend';\nimport { ScaleIndicator } from '../primitives/ScaleIndicator';\nimport { Split } from '../primitives/Split';\nimport { StatusBar } from '../primitives/StatusBar';\nimport { Toolbar } from '../primitives/Toolbar';\nimport { ZoomControl } from '../primitives/ZoomControl';\n\n/** The specimen's sections, in page order. */\nexport const SPECIMEN_SECTIONS = [\n 'Buttons & toggles',\n 'Fields & pickers',\n 'Panels & property rows',\n 'Overlays & feedback',\n 'Lists & data',\n 'Tool chrome',\n 'Editors & plots',\n 'Lab chrome',\n] as const;\n\ntype SectionTitle = (typeof SPECIMEN_SECTIONS)[number];\n\nfunction Section({ title, children }: { title: SectionTitle; children: ReactNode }) {\n const id = useId();\n return (\n <section className=\"lk-specimen__section\" aria-labelledby={id}>\n <h2 id={id} className=\"lk-specimen__heading\">\n {title}\n </h2>\n <div className=\"lk-specimen__grid\">{children}</div>\n </section>\n );\n}\n\nfunction Cell({ label, wide, children }: { label: string; wide?: boolean; children: ReactNode }) {\n return (\n <div className={wide ? 'lk-specimen__cell lk-specimen__cell--wide' : 'lk-specimen__cell'}>\n <span className=\"lk-specimen__label\">{label}</span>\n {children}\n </div>\n );\n}\n\nfunction Dot() {\n return (\n <svg viewBox=\"0 0 16 16\" width={16} height={16} aria-hidden=\"true\">\n <circle cx={8} cy={8} r={4} fill=\"currentColor\" />\n </svg>\n );\n}\n\nconst LEGEND: LegendEntry[] = [\n { key: 'contour', label: 'contour', color: 'var(--wzl-fg-muted)' },\n { key: 'floor', label: 'floor', color: 'var(--wzl-fg-subtle)', mark: 'dash' },\n { key: 'authored', label: 'authored', color: 'var(--wzl-success)', mark: 'dot' },\n { key: 'replaced', label: 'replaced', color: 'var(--wzl-danger)', mark: 'band' },\n];\n\nconst PREFS: PrefGroup = {\n name: 'Preferences',\n children: {\n canvas: {\n name: 'Canvas',\n children: {\n showGrid: {\n kind: 'boolean',\n name: 'Show grid',\n description: 'Draw a grid behind the scene.',\n default: true,\n },\n zoomStep: {\n kind: 'number',\n name: 'Zoom step',\n description: 'Percent the zoom controls move per click.',\n default: 10,\n min: 1,\n max: 50,\n },\n format: {\n kind: 'enum',\n name: 'Format',\n description: 'File type for exported images.',\n default: 'svg',\n options: [\n { value: 'svg', label: 'SVG' },\n { value: 'png', label: 'PNG' },\n ],\n },\n },\n },\n },\n};\n\nconst JOB: JobHandle = {\n status: 'running',\n done: 34,\n total: 120,\n failures: [],\n error: null,\n start: () => {},\n cancel: () => {},\n};\n\nfunction setAt(\n values: Record<string, unknown>,\n path: string,\n value: unknown,\n): Record<string, unknown> {\n const [head, ...rest] = path.split('.');\n if (head === undefined) return values;\n if (rest.length === 0) return { ...values, [head]: value };\n const inner = (values[head] as Record<string, unknown> | undefined) ?? {};\n return { ...values, [head]: setAt(inner, rest.join('.'), value) };\n}\n\nfunction ButtonsAndToggles() {\n const [snap, setSnap] = useState(true);\n const [wifi, setWifi] = useState(false);\n const [align, setAlign] = useState<string | null>('center');\n const [bold, setBold] = useState(true);\n const [italic, setItalic] = useState(false);\n const [open, setOpen] = useState(true);\n return (\n <Section title=\"Buttons & toggles\">\n <Cell label=\"Button\">\n <div className=\"lk-specimen__row\">\n <Button variant=\"primary\">Save</Button>\n <Button variant=\"secondary\">Cancel</Button>\n <Button variant=\"ghost\">Ghost</Button>\n <Button variant=\"secondary\" disabled>\n Disabled\n </Button>\n <Button variant=\"secondary\" iconOnly ariaLabel=\"Add\">\n <Dot />\n </Button>\n </div>\n </Cell>\n <Cell label=\"Badge\">\n <div className=\"lk-specimen__row\">\n <Badge shape=\"pill\" status=\"accent\" variant=\"outline\" size=\"sm\">\n ACCENT\n </Badge>\n <Badge status=\"info\" variant=\"subtle\">\n INFO\n </Badge>\n <Badge status=\"warn\" variant=\"solid\">\n WARN\n </Badge>\n <Badge status=\"danger\" variant=\"solid\">\n DANGER\n </Badge>\n <Badge status=\"muted\">MUTED</Badge>\n </div>\n </Cell>\n <Cell label=\"Checkbox, Switch\">\n <div className=\"lk-specimen__row\">\n <Checkbox isSelected={snap} onChange={setSnap}>\n Snap to grid\n </Checkbox>\n <Checkbox isIndeterminate>Mixed</Checkbox>\n <Switch isSelected={wifi} onChange={setWifi}>\n Wifi\n </Switch>\n </div>\n </Cell>\n <Cell label=\"RadioGroup\">\n <RadioGroup label=\"Snap mode\" orientation=\"horizontal\" defaultValue=\"grid\">\n <Radio value=\"off\">Off</Radio>\n <Radio value=\"grid\">Grid</Radio>\n <Radio value=\"pixel\">Pixel</Radio>\n </RadioGroup>\n </Cell>\n <Cell label=\"ToggleBar\">\n <ToggleBar\n ariaLabel=\"Align\"\n value={align}\n onChange={setAlign}\n items={[\n { value: 'left', label: 'Left' },\n { value: 'center', label: 'Center' },\n { value: 'right', label: 'Right' },\n ]}\n />\n <ToggleBar\n ariaLabel=\"Align, flat\"\n variant=\"flat\"\n value={align}\n onChange={setAlign}\n items={[\n { value: 'left', label: 'Left' },\n { value: 'center', label: 'Center' },\n { value: 'right', label: 'Right' },\n ]}\n />\n </Cell>\n <Cell label=\"OptionsBar, ButtonBar\">\n <div className=\"lk-specimen__row\">\n <OptionsBar\n ariaLabel=\"Text style\"\n items={[\n { value: 'b', label: 'B', selected: bold, onChange: setBold },\n { value: 'i', label: 'I', selected: italic, onChange: setItalic },\n ]}\n />\n <ButtonBar\n items={[\n { value: 'undo', label: 'Undo', onAction: () => {} },\n { value: 'redo', label: 'Redo', onAction: () => {} },\n ]}\n />\n </div>\n </Cell>\n <Cell label=\"MenuButton, Disclosure\">\n <div className=\"lk-specimen__row\">\n <MenuButton\n label=\"Add trial…\"\n onAction={() => {}}\n items={[\n { value: 'sine', label: 'Sine wave' },\n { value: 'annotate', label: 'Annotate' },\n ]}\n />\n <Disclosure open={open} onToggle={() => setOpen((o) => !o)} label=\"Shapes\" />\n </div>\n </Cell>\n <Cell label=\"Tabs\">\n <Tabs>\n <TabList aria-label=\"Sections\">\n <Tab id=\"props\">Props</Tab>\n <Tab id=\"events\">Events</Tab>\n <Tab id=\"snapshot\">Snapshot</Tab>\n </TabList>\n <TabPanel id=\"props\">Props panel.</TabPanel>\n <TabPanel id=\"events\">Events panel.</TabPanel>\n <TabPanel id=\"snapshot\">Snapshot panel.</TabPanel>\n </Tabs>\n </Cell>\n <Cell label=\"Keycaps\">\n <div className=\"lk-specimen__row\">\n <KeySequence keys={[{ label: '⌘' }, { label: '⇧' }, { label: 'K' }]} separator=\"+\" />\n <KeyCap label=\"K\" />\n <KeyCap label=\"⌥\" variant=\"minimal\" />\n </div>\n </Cell>\n </Section>\n );\n}\n\nfunction FieldsAndPickers() {\n const [thumbs, setThumbs] = useState<Thumb[]>([{ value: 0.25 }, { value: 0.75 }]);\n const [rate, setRate] = useState(1);\n const [width, setWidth] = useState(6);\n const [color, setColor] = useState('#b08adbff');\n const [gradient, setGradient] = useState<FillStyle>({\n fill: 'linear-gradient',\n from: { x: 0.1, y: 0.1 },\n to: { x: 0.9, y: 0.9 },\n stops: [\n { offset: 0, color: '#0fb5a8' },\n { offset: 1, color: '#f4c43c' },\n ],\n });\n const [paint, setPaint] = useState<FillStyle | null>({ fill: 'solid', color: '#b08adb' });\n return (\n <Section title=\"Fields & pickers\">\n <Cell label=\"Input\">\n <Input label=\"Name\" placeholder=\"e.g. Pico\" />\n <Input\n label=\"Size\"\n leadingAdornment={<span>W</span>}\n trailingAdornment={<span>px</span>}\n defaultValue=\"120\"\n />\n <Input label=\"Required\" isInvalid errorMessage=\"Name is required.\" />\n </Cell>\n <Cell label=\"NumberField, Select, ComboBox\">\n <NumberField label=\"Opacity\" minValue={0} maxValue={100} step={5} defaultValue={80} />\n <Select\n label=\"Color\"\n defaultSelectedKey=\"g\"\n options={[\n { value: 'r', label: 'Red' },\n { value: 'g', label: 'Green' },\n { value: 'b', label: 'Blue' },\n ]}\n />\n <ComboBox\n label=\"Filter\"\n placeholder=\"Type to filter…\"\n options={[\n { value: 'r', label: 'Red' },\n { value: 'g', label: 'Green' },\n ]}\n />\n </Cell>\n <Cell label=\"RangeSlider, Slider\">\n <RangeSlider label=\"Range\" defaultValue={[20, 80]} minValue={0} maxValue={100} />\n <RangeSlider\n label=\"Opacity\"\n defaultValue={75}\n minValue={0}\n maxValue={100}\n formatOutput={(v) => `${v}%`}\n />\n <Slider\n ariaLabel=\"Pair\"\n min={0}\n max={1}\n step={0.01}\n constraint=\"ordered\"\n thumbs={thumbs}\n onInput={setThumbs}\n readoutPlacement=\"inline-after\"\n />\n </Cell>\n <Cell label=\"DetentSlider, InlineRange\">\n <DetentSlider\n items={[0.25, 0.5, 1, 2, 4]}\n value={rate}\n onChange={setRate}\n formatLabel={(r) => `${r}×`}\n labels=\"all\"\n ariaLabel=\"Playback rate\"\n />\n <InlineRange\n aria-label=\"Width\"\n min={0}\n max={20}\n value={width}\n onChange={(event) => setWidth(Number((event.target as HTMLInputElement).value))}\n />\n </Cell>\n <Cell label=\"ColorField, GradientEditor\">\n <ColorField value={color} alpha onInput={setColor} onChange={setColor} aria-label=\"Color\" />\n <GradientEditor value={gradient} onInput={setGradient} onChange={setGradient} kindSwitch />\n </Cell>\n <Cell label=\"PaintInput\">\n <PaintInput\n value={paint}\n onInput={setPaint}\n onChange={setPaint}\n allowNone\n aria-label=\"Fill\"\n />\n </Cell>\n </Section>\n );\n}\n\nfunction PanelsAndRows() {\n const [opacity, setOpacity] = useState(0.8);\n const [radius, setRadius] = useState(12);\n const [fill, setFill] = useState('#5841b8');\n const [alpha, setAlpha] = useState(1);\n const [stroke, setStroke] = useState('#2ec27e');\n const [count, setCount] = useState(8);\n const [cap, setCap] = useState('round');\n const [side, setSide] = useState('center');\n const [label, setLabel] = useState('Badge');\n const [visible, setVisible] = useState(true);\n const [prefs, setPrefs] = useState<Record<string, unknown>>({});\n const [layers, setLayers] = useState<LayerListItem[]>([\n { id: 'base', label: 'Base coat' },\n { id: 'wash', label: 'Wash' },\n ]);\n const [panelCollapsed, setPanelCollapsed] = useState(false);\n return (\n <Section title=\"Panels & property rows\">\n <Cell label=\"PropertyPanel\">\n <PropertyPanel title=\"Shape\">\n <PropertyList>\n <PropertyField\n kind=\"number\"\n control=\"slider\"\n label=\"Opacity\"\n value={opacity}\n min={0}\n max={1}\n step={0.01}\n onChange={setOpacity}\n />\n <PropertyField\n kind=\"number\"\n control=\"slider\"\n label=\"Radius\"\n value={radius}\n min={0}\n max={64}\n unit=\"px\"\n onChange={setRadius}\n />\n <PropertyField\n kind=\"color\"\n label=\"Fill\"\n value={fill}\n onChange={setFill}\n alpha={alpha}\n onAlphaChange={setAlpha}\n />\n <PropertyField kind=\"color\" label=\"Stroke\" value={stroke} onChange={setStroke} />\n <PropertyField\n kind=\"number\"\n label=\"Count\"\n value={count}\n min={0}\n max={100}\n step={1}\n onChange={setCount}\n />\n <PropertyField\n kind=\"enum\"\n label=\"Line cap\"\n value={cap}\n onChange={setCap}\n options={[\n { value: 'butt', label: 'Butt' },\n { value: 'round', label: 'Round' },\n ]}\n />\n <PropertyField\n kind=\"enum\"\n control=\"toggle\"\n label=\"Align\"\n value={side}\n onChange={setSide}\n options={[\n { value: 'left', label: 'L' },\n { value: 'center', label: 'C' },\n { value: 'right', label: 'R' },\n ]}\n />\n <PropertyField kind=\"string\" label=\"Label\" value={label} onChange={setLabel} />\n <PropertyField kind=\"boolean\" label=\"Visible\" value={visible} onChange={setVisible} />\n <PropertyGroup title=\"Bevel\" defaultCollapsed>\n <PropertyField\n kind=\"number\"\n control=\"slider\"\n label=\"Rings\"\n value={32}\n min={4}\n max={96}\n step={1}\n onChange={() => {}}\n />\n </PropertyGroup>\n </PropertyList>\n </PropertyPanel>\n </Cell>\n <Cell label=\"PrefsForm\">\n <PrefsForm\n schema={PREFS}\n values={prefs}\n onChange={(path, value) => setPrefs((prev) => setAt(prev, path, value))}\n />\n </Cell>\n <Cell label=\"LayerList\">\n <LayerList\n items={layers}\n onReorder={(move) => setLayers(moveLayers(layers, move))}\n renderBody={(item) => <div>settings for {item.label}</div>}\n />\n </Cell>\n <Cell label=\"Sidebar, SidebarPanel\">\n <div className=\"lk-specimen__box\">\n <Sidebar side=\"right\" ariaLabel=\"Specimen sidebar\">\n <SidebarPanel\n title=\"Selection\"\n collapsed={panelCollapsed}\n onToggleCollapse={() => setPanelCollapsed((v) => !v)}\n onHide={() => {}}\n >\n <div className=\"lk-specimen__pad\">2 items selected</div>\n </SidebarPanel>\n </Sidebar>\n </div>\n </Cell>\n </Section>\n );\n}\n\nfunction OverlaysAndFeedback() {\n const calloutAnchor = useRef<HTMLButtonElement>(null);\n const [calloutOpen, setCalloutOpen] = useState(false);\n const [dialogOpen, setDialogOpen] = useState(false);\n const toasts = useMemo(() => createToastQueue(), []);\n return (\n <Section title=\"Overlays & feedback\">\n <Cell label=\"Tooltip, Callout, Dialog, Toast\">\n <div className=\"lk-specimen__row\">\n <TooltipTrigger>\n <Focusable>\n <button type=\"button\">Hover me</button>\n </Focusable>\n <Tooltip placement=\"bottom\">Duplicates the selected layer</Tooltip>\n </TooltipTrigger>\n <button type=\"button\" ref={calloutAnchor} onClick={() => setCalloutOpen(true)}>\n Callout\n </button>\n <Callout\n triggerRef={calloutAnchor}\n isOpen={calloutOpen}\n onOpenChange={setCalloutOpen}\n stance=\"notice\"\n title=\"Notice\"\n >\n Neutral guidance.\n </Callout>\n <Button onClick={() => setDialogOpen(true)}>Dialog</Button>\n <Dialog\n isOpen={dialogOpen}\n onOpenChange={setDialogOpen}\n title=\"Preferences\"\n footer={\n <Button variant=\"primary\" onClick={() => setDialogOpen(false)}>\n OK\n </Button>\n }\n >\n <p>Dialog body.</p>\n </Dialog>\n <Button\n onClick={() =>\n toasts.add('success', 'Saved', { description: 'All changes stored.', ttlMs: null })\n }\n >\n Toast\n </Button>\n <ToastRegion queue={toasts} placement=\"bottom-right\" />\n </div>\n </Cell>\n <Cell label=\"Powerline\">\n <Powerline\n variant=\"solid\"\n size=\"sm\"\n segments={[\n { text: 'main', status: 'accent', endCap: 'chevron' },\n { text: '✓ 12', status: 'info', endCap: 'slant' },\n { text: '~/proj', status: 'muted' },\n ]}\n />\n </Cell>\n <Cell label=\"StatusBar\">\n <UiStatusBar ariaLabel=\"Editor status\">\n <StatusBarItem>tool: select</StatusBarItem>\n <StatusBarItem>sel: 3</StatusBarItem>\n <StatusBarSpacer />\n <StatusBarItem muted>0.7.0</StatusBarItem>\n </UiStatusBar>\n </Cell>\n </Section>\n );\n}\n\nfunction ListsAndData() {\n return (\n <Section title=\"Lists & data\">\n <Cell label=\"ItemList\">\n <ItemList\n rows={[\n { id: 'a', label: 'Draw rect' },\n { id: 'b', label: 'Fill', selected: true },\n { id: 'c', label: 'Move', muted: true },\n ]}\n empty=\"Nothing\"\n />\n </Cell>\n <Cell label=\"DataGrid\">\n <DataGrid\n rows={[\n { id: '1', name: 'accent', count: 3 },\n { id: '2', name: 'info', count: 1 },\n { id: '3', name: 'danger', count: 2 },\n ]}\n columns={[\n { id: 'name', header: 'name', accessor: (r) => r.name, sortable: true },\n { id: 'count', header: 'count', accessor: (r) => r.count, sortable: true },\n ]}\n defaultSort={{ columnId: 'name', direction: 'asc' }}\n />\n </Cell>\n </Section>\n );\n}\n\nfunction ToolChrome() {\n const [tool, setTool] = useState('select');\n const [paneWidth, setPaneWidth] = useState(160);\n return (\n <Section title=\"Tool chrome\">\n <Cell label=\"ToolGroup, ToolButton\">\n <ToolGroup orientation=\"horizontal\" ariaLabel=\"Tools\">\n {['select', 'rect', 'ellipse'].map((id) => (\n <ToolButton\n key={id}\n icon={<Dot />}\n label={id}\n shortcut={id.slice(0, 1).toUpperCase()}\n active={tool === id}\n onClick={() => setTool(id)}\n />\n ))}\n </ToolGroup>\n </Cell>\n <Cell label=\"ToolOptionsBar\">\n <ToolOptionsBar label=\"Text\">\n <Button size=\"sm\" variant=\"ghost\" iconOnly ariaLabel=\"Bold\">\n B\n </Button>\n <Button size=\"sm\" variant=\"ghost\" iconOnly ariaLabel=\"Italic\">\n I\n </Button>\n </ToolOptionsBar>\n </Cell>\n <Cell label=\"ResizeHandle\">\n <div className=\"lk-specimen__box\">\n <div className=\"lk-specimen__box-main\">content</div>\n <ResizeHandle\n value={paneWidth}\n min={100}\n max={220}\n invert\n onInput={setPaneWidth}\n ariaLabel=\"Resize\"\n />\n <div\n className=\"lk-specimen__pane\"\n style={{ '--lk-specimen-pane-w': `${paneWidth}px` } as CSSProperties}\n >\n {paneWidth}px\n </div>\n </div>\n </Cell>\n </Section>\n );\n}\n\nfunction EditorsAndPlots() {\n const [curve, setCurve] = useState<ControlPoint[]>([\n { x: 0, y: 0 },\n { x: 0.3, y: 0.1 },\n { x: 0.7, y: 0.9 },\n { x: 1, y: 1 },\n ]);\n const [points, setPoints] = useState<ControlPoint[]>([\n { x: 0.2, y: 0.3 },\n { x: 0.5, y: 0.6 },\n { x: 0.8, y: 0.2 },\n ]);\n const [bands, setBands] = useState<Band<{ name: string }>[]>([\n { from: 1 / 64, data: { name: 'Radial' } },\n { from: 1 / 12, data: { name: 'Name plate' } },\n ]);\n const [band, setBand] = useState<number | null>(null);\n const [tracks, setTracks] = useState<Track[]>(\n () =>\n [\n {\n kind: 'sampled',\n label: 'x',\n keys: [\n { t: 0, value: 0 },\n { t: 800, value: 120, easing: 'easeOutCubic' },\n { t: 1600, value: 40 },\n ],\n onTick: () => {},\n },\n {\n kind: 'event',\n label: 'footstep',\n events: [\n { t: 300, fire: () => {} },\n { t: 900, fire: () => {} },\n ],\n },\n ] as Track[],\n );\n const [playhead, setPlayhead] = useState(0);\n return (\n <Section title=\"Editors & plots\">\n <Cell label=\"Plot2D\">\n <Plot2D\n width={260}\n height={130}\n grid={{ divisions: 3 }}\n axes={{}}\n xRange={[0, 2000]}\n yRange={[-0.35, 1.2]}\n />\n </Cell>\n <Cell label=\"CurveEditor\">\n <CurveEditor\n value={curve}\n onInput={setCurve}\n domain=\"1d\"\n interpolation=\"catmull-rom\"\n endpoints=\"pinned-both\"\n addPointMode=\"click-curve\"\n axes={{}}\n fill={{ side: 'below' }}\n width={260}\n height={130}\n />\n </Cell>\n <Cell label=\"PointPlotter\">\n <PointPlotter\n value={points}\n onInput={setPoints}\n xRange={[0, 1]}\n yRange={[0, 1]}\n grid={{ divisions: 3 }}\n axes={{}}\n addPointMode=\"click-empty\"\n width={260}\n height={130}\n />\n </Cell>\n <Cell label=\"BandEditor\" wide>\n <BandEditor<{ name: string }>\n min={1 / 64}\n max={1 / 2}\n scale=\"log\"\n snap\n value={bands}\n onChange={setBands}\n selectedIndex={band}\n onSelect={setBand}\n renderBand={(b) => b.data.name}\n ticks={[1 / 24, 1 / 12, 1 / 6].map((at) => ({ at, label: `1/${Math.round(1 / at)}` }))}\n />\n </Cell>\n <Cell label=\"Timeline\" wide>\n <div className=\"lk-specimen__timeline\">\n <Timeline\n tracks={tracks}\n duration={2000}\n playhead={playhead}\n onChange={setTracks}\n onScrub={setPlayhead}\n />\n </div>\n </Cell>\n </Section>\n );\n}\n\nfunction LabChrome() {\n const [zoom, setZoom] = useState(1);\n return (\n <Section title=\"Lab chrome\">\n <Cell label=\"Toolbar\" wide>\n <Toolbar aria-label=\"Trial actions\">\n <Toolbar.Title>My Trial</Toolbar.Title>\n <Toolbar.Group>\n <Toolbar.Button onClick={() => {}}>Undo</Toolbar.Button>\n <Toolbar.Button onClick={() => {}} disabled>\n Redo\n </Toolbar.Button>\n </Toolbar.Group>\n <Toolbar.Group end>\n <Toolbar.Button onClick={() => {}}>Save</Toolbar.Button>\n </Toolbar.Group>\n </Toolbar>\n </Cell>\n <Cell label=\"StatusBar\">\n <StatusBar>\n <StatusBar.Section>Items: 12</StatusBar.Section>\n <StatusBar.Section>Zoom: 100%</StatusBar.Section>\n </StatusBar>\n </Cell>\n <Cell label=\"Legend, JobProgress\">\n <Legend entries={LEGEND} />\n <JobProgress job={JOB} />\n </Cell>\n <Cell label=\"ScaleIndicator, ZoomControl\">\n <ScaleIndicator zoom={zoom} unit=\"ft\" pixelsPerUnit={50} />\n <ZoomControl zoom={zoom} onZoomChange={setZoom} min={0.1} max={8} />\n </Cell>\n <Cell label=\"FloatingPanel\">\n <div className=\"lk-specimen__floating-host\">\n <FloatingPanel anchor=\"top-right\">\n <Legend entries={LEGEND.slice(0, 2)} />\n </FloatingPanel>\n </div>\n </Cell>\n <Cell label=\"Split\" wide>\n <div className=\"lk-specimen__box\">\n <Split\n sidebar={<div className=\"lk-specimen__pad\">sidebar</div>}\n defaultWidth={160}\n minWidth={100}\n maxWidth={260}\n >\n <div className=\"lk-specimen__pad\">content</div>\n </Split>\n </div>\n </Cell>\n </Section>\n );\n}\n\n/**\n * One page of the kit's controls and chrome, each in a small working state: a\n * preview surface for a theme, where every token has something on screen that\n * reads it. Popovers, dialogs and toasts portal into the page itself, so they\n * take whatever theme the page is under.\n */\nexport function Specimen({ className }: { className?: string }) {\n return (\n <div className={className ? `lk-specimen ${className}` : 'lk-specimen'} data-wzl-portal-host=\"\">\n <ButtonsAndToggles />\n <FieldsAndPickers />\n <PanelsAndRows />\n <OverlaysAndFeedback />\n <ListsAndData />\n <ToolChrome />\n <EditorsAndPlots />\n <LabChrome />\n </div>\n );\n}\n"]}
|