@weasel-js/labkit 1.8.0 → 1.8.1
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 +24 -0
- package/dist/_dts/{CanvasStackContext-C0fzFsQg.d.ts → CanvasStackContext-B05ZM04l.d.ts} +3 -1
- package/dist/_dts/{Stage-Cvwxdnfp.d.ts → Stage-CIJlbjrE.d.ts} +5 -3
- package/dist/_dts/{index-DRaswz91.d.ts → index-8geQNQet.d.ts} +83 -11
- package/dist/_dts/{index-DEHRoTXK.d.ts → index-DRi3V5sN.d.ts} +5 -3
- package/dist/_dts/{useTrialState-CS4TdWPW.d.ts → useTrialState-Ar0AFpCe.d.ts} +94 -87
- package/dist/canvas/index.d.ts +4 -4
- package/dist/canvas/index.js +2 -2
- package/dist/chrome/index.d.ts +2 -2
- package/dist/chrome/index.js +7 -7
- package/dist/{chunk-YX75W6EK.js → chunk-4RCVWX4M.js} +8 -8
- package/dist/chunk-4RCVWX4M.js.map +1 -0
- package/dist/{chunk-WIG6XHJ7.js → chunk-6IIKLXBZ.js} +13 -4
- package/dist/chunk-6IIKLXBZ.js.map +1 -0
- package/dist/{chunk-F4ACIK7Z.js → chunk-6Q6ACJ3H.js} +3 -3
- package/dist/{chunk-F4ACIK7Z.js.map → chunk-6Q6ACJ3H.js.map} +1 -1
- package/dist/{chunk-PMLZP7RT.js → chunk-7ALJOVGP.js} +5 -9
- package/dist/chunk-7ALJOVGP.js.map +1 -0
- package/dist/{chunk-XE5HJOPL.js → chunk-7FMZT2WL.js} +3 -3
- package/dist/{chunk-XE5HJOPL.js.map → chunk-7FMZT2WL.js.map} +1 -1
- package/dist/{chunk-XVUKDSYV.js → chunk-AVOILDN2.js} +2 -2
- package/dist/{chunk-XVUKDSYV.js.map → chunk-AVOILDN2.js.map} +1 -1
- package/dist/{chunk-2N7UBSS2.js → chunk-J5MDJEOZ.js} +3 -3
- package/dist/{chunk-2N7UBSS2.js.map → chunk-J5MDJEOZ.js.map} +1 -1
- package/dist/{chunk-NVKBL7ZE.js → chunk-KHB3KRRQ.js} +7 -7
- package/dist/chunk-KHB3KRRQ.js.map +1 -0
- package/dist/{chunk-XXACAPVU.js → chunk-NHIO2O3O.js} +31 -30
- package/dist/chunk-NHIO2O3O.js.map +1 -0
- package/dist/{chunk-EESJUSYR.js → chunk-QMAY74TP.js} +56 -5
- package/dist/chunk-QMAY74TP.js.map +1 -0
- package/dist/{chunk-YDE6XATS.js → chunk-RN7T7OBO.js} +44 -22
- package/dist/chunk-RN7T7OBO.js.map +1 -0
- package/dist/{chunk-3L4MLLQB.js → chunk-RXO5UEGT.js} +4 -11
- package/dist/chunk-RXO5UEGT.js.map +1 -0
- package/dist/{chunk-MOTDMMMN.js → chunk-SQX35X5V.js} +3 -3
- package/dist/{chunk-MOTDMMMN.js.map → chunk-SQX35X5V.js.map} +1 -1
- package/dist/{chunk-J5HJJDLF.js → chunk-T5OEUNCB.js} +7 -2
- package/dist/chunk-T5OEUNCB.js.map +1 -0
- package/dist/{chunk-RL2LOLNI.js → chunk-UX66USTN.js} +2 -2
- package/dist/chunk-UX66USTN.js.map +1 -0
- package/dist/{chunk-WURZTJGQ.js → chunk-V4SMGEYY.js} +4858 -4806
- package/dist/chunk-V4SMGEYY.js.map +1 -0
- package/dist/{chunk-E23Q6A3Y.js → chunk-VCK5T6EP.js} +3 -3
- package/dist/{chunk-E23Q6A3Y.js.map → chunk-VCK5T6EP.js.map} +1 -1
- package/dist/{chunk-T6DLGEJB.js → chunk-XWR2P6MR.js} +23 -6
- package/dist/chunk-XWR2P6MR.js.map +1 -0
- package/dist/{chunk-7KAETQSS.js → chunk-YZA73U4A.js} +7 -7
- package/dist/chunk-YZA73U4A.js.map +1 -0
- package/dist/config/index.d.ts +2 -2
- package/dist/config/index.js +2 -2
- package/dist/controls/index.js +5 -5
- package/dist/dragdrop/index.d.ts +1 -1
- package/dist/dragdrop/index.js +2 -2
- package/dist/index.d.ts +157 -15
- package/dist/index.js +893 -258
- package/dist/index.js.map +1 -1
- package/dist/layers/index.d.ts +1 -1
- package/dist/layers/index.js +3 -3
- package/dist/loupe/index.d.ts +175 -27
- package/dist/loupe/index.js +547 -141
- package/dist/loupe/index.js.map +1 -1
- package/dist/overview/index.js +5 -5
- package/dist/passthrough/weasel-ui.js +3 -3
- package/dist/primitives/index.d.ts +4 -19
- package/dist/primitives/index.js +7 -7
- package/dist/state/index.d.ts +5 -7
- package/dist/state/index.js +5 -5
- package/dist/styles.css +173 -38
- package/dist/surface/index.d.ts +20 -1
- package/dist/surface/index.js +2 -2
- package/dist/undo/index.d.ts +18 -7
- package/dist/undo/index.js +1 -1
- package/package.json +11 -11
- package/src/annotations/AnnotationOverlay.abandon.test.tsx +4 -0
- package/src/annotations/AnnotationOverlay.tsx +10 -1
- package/src/annotations/Annotations.less +2 -0
- package/src/annotations/Annotations.overlay.test.tsx +29 -0
- package/src/canvas/CanvasStack.test.tsx +35 -0
- package/src/canvas/CanvasStack.tsx +12 -1
- package/src/canvas/useLayerScheduler.ts +14 -0
- package/src/chrome/builtins.test.ts +14 -0
- package/src/chrome/builtins.tsx +17 -2
- package/src/chrome/regions/StatusRegion.tsx +20 -14
- package/src/chrome/regions/regions.test.tsx +28 -0
- package/src/chrome/types.ts +8 -0
- package/src/clock/clock.browser.test.less +5 -0
- package/src/clock/clock.browser.test.tsx +77 -0
- package/src/clock/clock.integration.test.tsx +95 -0
- package/src/clock/clockRegistry.test.ts +33 -0
- package/src/clock/clockRegistry.ts +46 -0
- package/src/clock/hooks.ts +44 -0
- package/src/clock/index.ts +2 -0
- package/src/clock/trialClock.test.ts +265 -0
- package/src/clock/trialClock.ts +245 -0
- package/src/clock/useClockLoop.ts +45 -0
- package/src/config/resolve.test.ts +12 -0
- package/src/config/resolve.ts +5 -0
- package/src/controls/ControlMatrix.tsx +56 -54
- package/src/index.ts +3 -2
- package/src/instrument/types.ts +21 -1
- package/src/lab/Lab.chrome.test.tsx +8 -1
- package/src/lab/Lab.presentation.test.tsx +113 -0
- package/src/lab/Lab.surface.test.tsx +20 -9
- package/src/lab/Lab.tsx +132 -257
- package/src/lab/LabLightbox.browser.test.less +17 -0
- package/src/lab/LabLightbox.browser.test.tsx +216 -0
- package/src/lab/LabShell.less +10 -3
- package/src/lab/LabSurface.tsx +129 -0
- package/src/lab/Workspace.stories.tsx +18 -0
- package/src/lab/Workspace.surface.test.tsx +4 -0
- package/src/lab/Workspace.test.tsx +37 -1
- package/src/lab/Workspace.tsx +34 -6
- package/src/lab/index.ts +2 -0
- package/src/lab/nebula.ts +30 -0
- package/src/lab/openLab.test.ts +81 -0
- package/src/lab/openLab.ts +119 -0
- package/src/lab/presentation.browser.test.less +5 -0
- package/src/lab/presentation.browser.test.tsx +119 -0
- package/src/lab/presentation.less +64 -0
- package/src/lab/presentation.tsx +47 -0
- package/src/lab/useFocusPick.ts +43 -0
- package/src/lightbox/Lightbox.browser.test.less +14 -0
- package/src/lightbox/Lightbox.browser.test.tsx +113 -0
- package/src/lightbox/Lightbox.less +128 -0
- package/src/lightbox/Lightbox.test.tsx +195 -0
- package/src/lightbox/Lightbox.tsx +205 -0
- package/src/lightbox/LightboxContext.ts +38 -0
- package/src/lightbox/LightboxLayers.tsx +40 -0
- package/src/lightbox/index.ts +8 -0
- package/src/lightbox/modal.ts +94 -0
- package/src/loupe/AGENTS.md +40 -2
- package/src/loupe/CanvasLoupe.tsx +5 -4
- package/src/loupe/DomLoupe.tsx +7 -5
- package/src/loupe/Loupe.less +15 -0
- package/src/loupe/LoupeBubble.tsx +35 -13
- package/src/loupe/SourceLoupe.browser.test.tsx +204 -0
- package/src/loupe/SourceLoupe.tsx +60 -0
- package/src/loupe/TrialLoupe.browser.test.tsx +342 -0
- package/src/loupe/TrialLoupe.tsx +126 -28
- package/src/loupe/canvasLens.ts +20 -17
- package/src/loupe/index.ts +26 -2
- package/src/loupe/sourceLens.test.ts +65 -0
- package/src/loupe/sourceLens.ts +97 -0
- package/src/loupe/types.test.ts +6 -0
- package/src/loupe/types.ts +109 -7
- package/src/loupe/useLoupe.test.tsx +188 -3
- package/src/loupe/useLoupe.ts +106 -11
- package/src/primitives/index.ts +2 -2
- package/src/specimen/Specimen.tsx +0 -7
- package/src/state/helpers.test.ts +4 -11
- package/src/state/helpers.ts +2 -8
- package/src/state/index.ts +0 -2
- package/src/state/openLabStore.test.ts +10 -8
- package/src/state/openLabStore.ts +1 -1
- package/src/state/store.test.ts +2 -2
- package/src/state/store.ts +15 -16
- package/src/state/types.ts +9 -9
- package/src/styles.less +2 -1
- package/src/surface/AGENTS.md +13 -0
- package/src/surface/index.ts +1 -0
- package/src/surface/useSurfaceTile.test.tsx +4 -0
- package/src/surface/useSurfaceTile.ts +17 -1
- package/src/surface/useTiledSurface.test.tsx +65 -0
- package/src/surface/useTiledSurface.ts +68 -1
- package/src/trial/Trial.stories.tsx +0 -1
- package/src/trial/Trial.test.tsx +40 -3
- package/src/trial/Trial.tsx +87 -43
- package/src/trial/TrialChrome.tsx +20 -2
- package/src/trial/trialOps.test.ts +1 -2
- package/src/trial/trialOps.ts +2 -3
- package/src/undo/stateOp.ts +21 -0
- package/src/undo/undoStack.ts +18 -6
- package/dist/chunk-3L4MLLQB.js.map +0 -1
- package/dist/chunk-7KAETQSS.js.map +0 -1
- package/dist/chunk-EESJUSYR.js.map +0 -1
- package/dist/chunk-J5HJJDLF.js.map +0 -1
- package/dist/chunk-NVKBL7ZE.js.map +0 -1
- package/dist/chunk-PMLZP7RT.js.map +0 -1
- package/dist/chunk-RL2LOLNI.js.map +0 -1
- package/dist/chunk-T6DLGEJB.js.map +0 -1
- package/dist/chunk-WIG6XHJ7.js.map +0 -1
- package/dist/chunk-WURZTJGQ.js.map +0 -1
- package/dist/chunk-XXACAPVU.js.map +0 -1
- package/dist/chunk-YDE6XATS.js.map +0 -1
- package/dist/chunk-YX75W6EK.js.map +0 -1
- package/src/primitives/StatusBar.less +0 -34
- package/src/primitives/StatusBar.stories.tsx +0 -24
- package/src/primitives/StatusBar.test.tsx +0 -25
- package/src/primitives/StatusBar.tsx +0 -28
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/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","WeaselProvider","DEFAULT_VIEW","y","x","bound","hit","addTrial","o","noSubscribe","_","useLayoutEffect","useResolvedColorMode","ThemeProvider","useInsertionEffect","useId","u","f","O","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 \"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"]}
|
|
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/clock/clockRegistry.ts","../src/clock/hooks.ts","../src/instrument/defineInstrument.ts","../src/instrument/validateConfigSchema.ts","../src/annotations/preload.ts","../src/clock/useClockLoop.ts","../src/theme/interstellar.theme.json","../src/theme/interstellar.ts","../src/clock/trialClock.ts","../src/undo/stateOp.ts","../src/canvas/cameraZoom.ts","../src/lab/presentation.tsx","../src/lightbox/LightboxContext.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/lightbox/LightboxLayers.tsx","../src/lab/LabSurface.tsx","../src/lab/LabZoom.tsx","../src/lab/nebula.ts","../src/lab/openLab.ts","../src/lab/useFocusPick.ts","../src/lightbox/modal.ts","../src/lightbox/Lightbox.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","l","useContext","useEffect","useLatest","createContext","off","area","useState","useLayoutEffect","jsxs","useSyncExternalStore","createPortal","c","p","auto","useStore","useRef","useMemo","useCallback","r","A","WeaselProvider","NO_SUBSCRIBE","DEFAULT_VIEW","y","x","bound","hit","addTrial","o","canvases","useInsertionEffect","noSubscribe","_","useResolvedColorMode","ThemeProvider","colorCount","useId","u","f","O","ce","j","C","d"],"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 {\n useSurfaceCanvas,\n useSurfaceOptional,\n useTileId,\n useTileInScope,\n} 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 // Out of scope while another trial is expanded: nothing paints this tile\n // then, and its box would sit over the expanded one.\n const inScope = useTileInScope(tileId);\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 hidden={!inScope}\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 { createContext } from 'react';\nimport type { TrialClockHandle } from './trialClock';\n\n/** A lab's trial clocks, by trial id. A trial has at most one. */\nexport interface ClockRegistry {\n /** Publish `handle` under `trialId` and return its release. */\n register(trialId: string, handle: TrialClockHandle): () => void;\n get(trialId: string): TrialClockHandle | null;\n all(): Iterable<TrialClockHandle>;\n /** Fires after any register or release. Shaped for `useSyncExternalStore`. */\n subscribe(listener: () => void): () => void;\n}\n\n/** An empty in-memory `ClockRegistry`. */\nexport function createClockRegistry(): ClockRegistry {\n const handles = new Map<string, TrialClockHandle>();\n const listeners = new Set<() => void>();\n const notify = (): void => {\n for (const l of [...listeners]) l();\n };\n return {\n register(trialId, handle) {\n handles.set(trialId, handle);\n notify();\n return () => {\n if (handles.get(trialId) !== handle) return;\n handles.delete(trialId);\n notify();\n };\n },\n get: (trialId) => handles.get(trialId) ?? null,\n all: () => handles.values(),\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n };\n}\n\n/** The registry a lab keeps its trials' clocks in. */\nexport const ClockRegistryContext = createContext<ClockRegistry | null>(null);\n\n/** The clock of the trial a component renders inside, when it declares one. */\nexport const TrialClockContext = createContext<TrialClockHandle | null>(null);\n","import { useLatest } from '@weasel-js/core';\nimport { useContext, useEffect, useReducer, useSyncExternalStore } from 'react';\nimport { LabContext } from '../lab/LabContext';\nimport { ClockRegistryContext, TrialClockContext } from './clockRegistry';\nimport type { TrialClock } from './trialClock';\n\nconst NO_SUBSCRIBE = () => () => {};\n\n/**\n * A trial's clock: `trialId`'s, else the one of the trial this renders inside,\n * else the lab's focused trial's. `null` when that trial declares no clock.\n * Re-renders on rate, seek and loop changes, never per frame — read `elapsed`\n * per frame through {@link useClockFrame}.\n */\nexport function useTrialClock(trialId?: string): TrialClock | null {\n const registry = useContext(ClockRegistryContext);\n const own = useContext(TrialClockContext);\n const lab = useContext(LabContext);\n useSyncExternalStore(registry?.subscribe ?? NO_SUBSCRIBE, () => (registry ? resolve() : own));\n function resolve() {\n if (trialId !== undefined) return registry?.get(trialId) ?? null;\n if (own) return own;\n const focused = lab?.focusedTrialId;\n return focused ? (registry?.get(focused) ?? null) : null;\n }\n const clock = resolve()?.clock ?? null;\n const [, bump] = useReducer((n: number) => n + 1, 0);\n useEffect(() => clock?.subscribe(bump), [clock]);\n return clock;\n}\n\n/**\n * Run `fn` after each frame the clock of the trial this renders inside moves,\n * with its `elapsed` and `pass`, outside React's render — for a renderer that\n * draws imperatively, or text that changes every frame written into a ref.\n */\nexport function useClockFrame(fn: (elapsed: number, pass: number) => void): void {\n const handle = useContext(TrialClockContext);\n const latest = useLatest(fn);\n useEffect(\n () => handle?.onFrame((elapsed, pass) => latest.current(elapsed, pass)),\n [handle, latest],\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","import { useVisibleRaf } from '@weasel-js/core';\nimport { useEffect } from 'react';\nimport type { ClockRegistry } from './clockRegistry';\n\n/**\n * The lab's one frame loop for every trial clock: syncs each clock that is not\n * inert, and sleeps once every clock is, until one wakes. Shaped like a blits\n * `ticker`, so one could take its place.\n */\nexport function useClockLoop(registry: ClockRegistry): void {\n const loop = useVisibleRaf(\n (timestamp) => {\n let live = false;\n for (const { clock } of registry.all()) {\n if (clock.inert) continue;\n clock.sync(timestamp);\n if (!clock.inert) live = true;\n }\n if (live) loop.request();\n },\n {\n onResume: () => {\n for (const { clock } of registry.all()) clock.rebase();\n },\n },\n );\n\n useEffect(() => {\n let unwakes: (() => void)[] = [];\n const attach = (): void => {\n for (const off of unwakes) off();\n unwakes = [];\n for (const { clock } of registry.all()) {\n unwakes.push(clock.onWake(() => loop.request()));\n if (!clock.inert) loop.request();\n }\n };\n attach();\n const off = registry.subscribe(attach);\n return () => {\n off();\n for (const unwake of unwakes) unwake();\n };\n }, [registry, loop]);\n}\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 \"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","/**\n * What an instrument declares to get a clock: how long a pass runs, how many\n * passes, and how it opens. Shaped like a blits voice spec.\n */\nexport interface ClockCapability {\n /** ms per pass. Omitted, the run never ends. */\n duration?: number;\n /** Passes: `true` endless, `false` one, `n` that many. Default `false`. */\n loop?: boolean | number;\n /** The rate it opens at; `0`, the default, opens paused. */\n rate?: number;\n /** `false` for an instrument whose state is built up by running, so time can\n * only move by running: no seek and no negative rate. Default `true`. */\n seekable?: boolean;\n}\n\n/**\n * A trial's time. A position (`elapsed`) moved by a signed `rate`, synced by\n * the lab's frame loop once a frame. Named after blits' owner handle and\n * `Ticked`, so a blits ticker can drive one and blits voices can play under it.\n */\nexport interface TrialClock {\n /** ms the trial has played, rate applied, counted across passes. */\n readonly elapsed: number;\n /** Which pass `elapsed` falls in, 0 first; the last once the run is over. */\n readonly pass: number;\n /** How far through its pass, 0 to 1; 1 once the run is over. 0 with no duration. */\n readonly phase: number;\n /** Signed: 0 pauses and a negative rate plays backward. A write changes speed\n * at once and replaces any ramp. */\n rate: number;\n /** Passes, as `ClockCapability.loop`. */\n loop: boolean | number;\n /** Move `rate` to `to` linearly over `over` real ms; position stays continuous. */\n ramp(to: number, over: number): void;\n /** Move to `elapsed` ms from the start, clamped to the run. Never runs state\n * forward to meet it. Throws on a clock that is not seekable. */\n seek(elapsed: number): void;\n /** The frame loop reports the time, once a frame. */\n sync(timestamp: number): void;\n /** The time between now and the next sync does not count. */\n rebase(): void;\n /** Another frame would change nothing: paused, no ramp, nothing changed since\n * the last sync. */\n readonly inert: boolean;\n /** Called when a change needs frames again, once until the next sync. */\n onWake(fn: () => void): () => void;\n /** Called on a rate, seek or loop change, and when the run ends; never per frame. */\n subscribe(fn: () => void): () => void;\n}\n\n/** A clock, and what labkit alone does with it. */\nexport interface TrialClockHandle {\n clock: TrialClock;\n /** Back to 0 at the declared rate — the trial's Reset, allowed on a clock\n * that is not seekable. */\n reset(): void;\n /** Called after each sync that moved the clock or followed a change. */\n onFrame(fn: (elapsed: number, pass: number) => void): () => void;\n}\n\nconst passesOf = (loop: boolean | number): number =>\n loop === true ? Number.POSITIVE_INFINITY : loop === false ? 1 : Math.max(1, loop);\n\nconst checkRate = (rate: number, seekable: boolean): void => {\n if (!Number.isFinite(rate)) throw new RangeError(`labkit: a clock's rate is finite, not ${rate}`);\n if (rate < 0 && !seekable)\n throw new RangeError('labkit: a clock that is not seekable cannot run backward');\n};\n\n/** A trial's clock, opened from its declaration and, for a trial reopened,\n * where it stood. */\nexport function createTrialClock(\n spec: ClockCapability,\n start?: { elapsed: number; rate: number },\n): TrialClockHandle {\n const duration = spec.duration ?? Number.POSITIVE_INFINITY;\n const seekable = spec.seekable ?? true;\n const openRate = spec.rate ?? 0;\n checkRate(openRate, seekable);\n\n let loop = spec.loop ?? false;\n let span = duration * passesOf(loop);\n let rate = start ? start.rate : openRate;\n let elapsed = start ? Math.min(Math.max(0, start.elapsed), span) : 0;\n let ramp: { to: number; left: number } | null = null;\n let last = Number.NaN;\n /** Changed since the last sync, so the next one is due even when paused. */\n let changed = false;\n /** Inert as of the last sync: the next one only records the time. */\n let slept = false;\n let wakeFired = false;\n const wakes = new Set<() => void>();\n const subs = new Set<() => void>();\n const frames = new Set<(elapsed: number, pass: number) => void>();\n\n const isInert = (): boolean => rate === 0 && ramp === null && !changed;\n const notify = (): void => {\n for (const fn of [...subs]) fn();\n };\n const change = (): void => {\n changed = true;\n if (wakeFired) return;\n wakeFired = true;\n for (const fn of [...wakes]) fn();\n };\n const passAt = (): number =>\n duration > 0 && Number.isFinite(duration)\n ? elapsed >= span\n ? passesOf(loop) - 1\n : Math.floor(elapsed / duration)\n : 0;\n const phaseAt = (): number =>\n duration > 0 && Number.isFinite(duration)\n ? elapsed >= span\n ? 1\n : (elapsed % duration) / duration\n : 0;\n\n /** ms of trial time over `dt` real ms, ramp included; settles the ramp. */\n const advance = (dt: number): number => {\n if (!ramp) return rate * dt;\n if (dt >= ramp.left) {\n const area = ((rate + ramp.to) / 2) * ramp.left + ramp.to * (dt - ramp.left);\n rate = ramp.to;\n ramp = null;\n notify();\n return area;\n }\n const next = rate + ((ramp.to - rate) * dt) / ramp.left;\n const area = ((rate + next) / 2) * dt;\n rate = next;\n ramp.left -= dt;\n return area;\n };\n\n const clock: TrialClock = {\n get elapsed() {\n return elapsed;\n },\n get pass() {\n return passAt();\n },\n get phase() {\n return phaseAt();\n },\n get rate() {\n return rate;\n },\n set rate(next: number) {\n checkRate(next, seekable);\n rate = next;\n ramp = null;\n change();\n notify();\n },\n get loop() {\n return loop;\n },\n set loop(next: boolean | number) {\n loop = next;\n span = duration * passesOf(loop);\n elapsed = Math.min(elapsed, span);\n change();\n notify();\n },\n ramp(to, over) {\n checkRate(to, seekable);\n if (!(over > 0)) {\n clock.rate = to;\n return;\n }\n ramp = { to, left: over };\n change();\n notify();\n },\n seek(target) {\n if (!seekable) throw new Error('labkit: this clock is not seekable');\n elapsed = Math.min(Math.max(0, target), span);\n change();\n notify();\n },\n sync(timestamp) {\n const wasChanged = changed;\n const before = elapsed;\n if (!Number.isNaN(last) && !slept) {\n elapsed += advance(Math.max(0, timestamp - last));\n if (elapsed >= span && rate > 0) {\n elapsed = span;\n rate = 0;\n ramp = null;\n notify();\n } else if (elapsed <= 0 && rate < 0) {\n elapsed = 0;\n rate = 0;\n ramp = null;\n notify();\n }\n }\n last = timestamp;\n changed = false;\n wakeFired = false;\n slept = isInert();\n if (elapsed !== before || wasChanged) {\n const pass = passAt();\n for (const fn of [...frames]) fn(elapsed, pass);\n }\n },\n rebase() {\n last = Number.NaN;\n },\n get inert() {\n return isInert();\n },\n onWake(fn) {\n wakes.add(fn);\n return () => {\n wakes.delete(fn);\n };\n },\n subscribe(fn) {\n subs.add(fn);\n return () => {\n subs.delete(fn);\n };\n },\n };\n\n return {\n clock,\n reset() {\n elapsed = 0;\n rate = openRate;\n ramp = null;\n change();\n notify();\n },\n onFrame(fn) {\n frames.add(fn);\n return () => {\n frames.delete(fn);\n };\n },\n };\n}\n","import type { Op } from '@weasel-js/core';\n\n/**\n * An undo entry over a trial's whole `state`: it holds the state as it stood\n * `before`, and catches the state to redo to each time it is undone, since a\n * snapshot is taken when an undoable event fires, before the change it\n * announces has necessarily landed. Never serialized: trial undo is\n * session-only.\n */\nexport function stateOp(before: unknown, read: () => unknown, write: (state: unknown) => void): Op {\n let after: unknown;\n const forward: Op = {\n label: 'state',\n apply: () => write(structuredClone(after)),\n invert: () => {\n after = structuredClone(read());\n return { label: 'state', apply: () => write(structuredClone(before)), invert: () => forward };\n },\n };\n return forward;\n}\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 { createContext, useContext, useLayoutEffect, useState } from 'react';\nimport { useSurfaceOptional } from '../surface/useSurfaceTile';\n\n/** A lab's presentation mode: one trial, without the lab's chrome or its own. */\nexport interface Presentation {\n active: boolean;\n /** Present the focused trial. Escape returns to the workspace. */\n enter(): void;\n exit(): void;\n}\n\ninterface PresentationContextValue extends Presentation {\n /** The trial being presented, while one is. */\n trialId: string | null;\n}\n\nexport const PresentationContext = createContext<PresentationContextValue | null>(null);\n\n/** The presentation mode of the `<Lab>` around the caller. */\nexport function usePresentation(): Presentation {\n const value = useContext(PresentationContext);\n if (!value) throw new Error('[labkit] usePresentation() must be called inside <Lab>');\n return value;\n}\n\n/** Whether the trial `trialId` is the one its lab is presenting, and a ref for\n * its root: while presented, the lab's shared surface is scoped to it, so the\n * tiles hidden behind it stop painting. */\nexport function usePresentedTrial(trialId: string): {\n presented: boolean;\n ref: (el: HTMLElement | null) => void;\n} {\n const presented = useContext(PresentationContext)?.trialId === trialId;\n const surface = useSurfaceOptional();\n const [el, ref] = useState<HTMLElement | null>(null);\n useLayoutEffect(() => {\n if (!presented || !el || !surface) return;\n surface.scope(el);\n return () => surface.scope(null);\n }, [presented, el, surface]);\n return { presented, ref };\n}\n\n/** Whether the page's URL asks for presentation with `?present`. */\nexport function hasPresentParam(): boolean {\n return typeof location !== 'undefined' && new URLSearchParams(location.search).has('present');\n}\n","import { createContext, useContext, useLayoutEffect } from 'react';\n\n/** What a `<Lightbox>` offers the content inside it. */\nexport interface LightboxApi {\n /** Whether the content is showing in the lightbox right now. */\n expanded: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n}\n\n/** The context value: the public API plus the registration the\n * default affordance steps aside for. */\nexport interface LightboxContextValue extends LightboxApi {\n claimControl: () => () => void;\n}\n\nexport const LightboxContext = createContext<LightboxContextValue | null>(null);\n\n/** The nearest `<Lightbox>`, or `null` outside one. Reading it changes\n * nothing; see `useLightboxControl` to replace the default expand button. */\nexport function useLightbox(): LightboxApi | null {\n return useContext(LightboxContext);\n}\n\n/**\n * The nearest `<Lightbox>`, for a component that draws its own expand\n * control: while a caller is mounted, the lightbox hides its default corner\n * button so the tile does not offer two. `<Trial>` uses this to put the\n * control in its title bar.\n */\nexport function useLightboxControl(): LightboxApi | null {\n const ctx = useContext(LightboxContext);\n const claim = ctx?.claimControl;\n // Layout effect, so the corner button is gone before the first paint.\n useLayoutEffect(() => claim?.(), [claim]);\n return ctx;\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 { usePresentedTrial } from '../lab/presentation';\nimport { useLightboxControl } from '../lightbox/LightboxContext';\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 { presented, ref: presentedRef } = usePresentedTrial(trialId);\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 // The title bar carries the expand toggle, so the lightbox drops its own.\n const lightbox = useLightboxControl();\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 canExpand: lightbox != null,\n expanded: lightbox?.expanded ?? false,\n toggleExpanded: lightbox?.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 lightbox,\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 // A presented trial has no chrome, so nothing the chrome's keys act on.\n if (!mod || presented) 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 ref={presentedRef}\n className=\"lk-trial\"\n data-trial-id={trialId}\n data-focused={lab.trials.length > 1 && lab.focusedTrialId === trialId ? 'true' : undefined}\n data-lk-presented={presented ? '' : 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 [\n instrument.canvas || instrument.stage ? 'lk-trial__content--flush' : '',\n presented ? 'lk-trial__stage' : '',\n ]\n .filter(Boolean)\n .join(' ') || 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 createHistory,\n createPointerStore,\n type History,\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 useSyncExternalStore,\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 { ClockRegistryContext, TrialClockContext } from '../clock/clockRegistry';\nimport { createTrialClock } from '../clock/trialClock';\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 { stateOp } from '../undo/stateOp';\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 setTrialHistory = useStore(store, (s) => s.setTrialHistory);\n const updateTrialClock = useStore(store, (s) => s.updateTrialClock);\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 // Read once: `record.clock` is where a reopened trial's clock stood, and the\n // clock is the truth from then on. A swap mounts a new trial under a new id.\n const [clockHandle] = useState(() =>\n instrument.clock ? createTrialClock(instrument.clock, record.clock) : null,\n );\n const clocks = useContext(ClockRegistryContext);\n useEffect(() => {\n if (!clockHandle || !clocks) return;\n return clocks.register(record.id, clockHandle);\n }, [clocks, clockHandle, record.id]);\n useEffect(() => {\n if (!clockHandle) return;\n const { clock } = clockHandle;\n return clock.subscribe(() =>\n updateTrialClock(record.id, { elapsed: clock.elapsed, rate: clock.rate }),\n );\n }, [clockHandle, record.id, updateTrialClock]);\n const ticks = useMemo(\n () => (clockHandle ? (fn: () => void) => clockHandle.onFrame(() => fn()) : undefined),\n [clockHandle],\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 let history = current.history;\n if (!history) {\n history = createHistory(null, { historyLimit: maxDepth });\n setTrialHistory(record.id, history);\n }\n const read = () => store.getState().trials.find((w) => w.id === record.id)?.state;\n const write = (state: unknown) => updateTrialState(record.id, state as never);\n history.recordEntry([stateOp(structuredClone(current.state), read, write)], event);\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 ...(clockHandle ? { clock: clockHandle.clock } : {}),\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 stateHistory = useHistoryVersion(record.history);\n\n const undoBindings: UndoBindings | undefined =\n undoCap || annotationsCap\n ? {\n canUndo: markMoves.undo || (undoCap ? (stateHistory?.canUndo() ?? false) : false),\n canRedo: markMoves.redo || (undoCap ? (stateHistory?.canRedo() ?? false) : false),\n undo: () => {\n if (annotationsCap && annotations.undo()) return;\n if (undoCap) stateHistory?.undo();\n },\n redo: () => {\n if (annotationsCap && annotations.redo()) return;\n if (undoCap) stateHistory?.redo();\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 const clock = clockHandle?.clock;\n return ordered.map((layer) => ({\n id: layer.id,\n visible: layerVisibility[layer.id] !== false,\n timed: layer.timed === true,\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, {\n state: record.state,\n config,\n zoom: view.zoom,\n elapsed: clock?.elapsed ?? 0,\n pass: clock?.pass ?? 0,\n phase: clock?.phase ?? 0,\n });\n },\n }));\n }, [instrument.canvas, record.state, config, layerVisibility, layerOrder, clockHandle]);\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 ticks={ticks}\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 <TrialClockContext.Provider value={clockHandle}>\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 </TrialClockContext.Provider>\n </TrialIdProvider>\n );\n}\n\nconst NO_SUBSCRIBE = () => () => {};\n\n/** `history`, re-rendering the caller whenever it changes. */\nfunction useHistoryVersion(history: History | undefined): History | undefined {\n useSyncExternalStore(history?.subscribe ?? NO_SUBSCRIBE, () => history?.getVersion() ?? 0);\n return history;\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 };\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 { history: _history, ...rest } = source;\n const clone: TrialRecord = {\n ...rest,\n id: newId(),\n config: structuredClone(source.config),\n state: structuredClone(source.state),\n view: structuredClone(source.view),\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 { createContext, type ReactNode, useContext, useMemo } from 'react';\n\n/** Elements a lightbox lifts with it, in top-layer order around itself. A\n * null entry is skipped, so a ref that has not landed yet can be passed as\n * it is. */\nexport interface LightboxLayerSet {\n below: readonly (HTMLElement | null)[];\n above: readonly (HTMLElement | null)[];\n}\n\nconst NONE: LightboxLayerSet = { below: [], above: [] };\n\nconst LightboxLayersContext = createContext<LightboxLayerSet>(NONE);\n\n/** Props for `<LightboxLayers>`. Keep the arrays stable across renders. */\nexport interface LightboxLayersProps extends Partial<LightboxLayerSet> {\n children: ReactNode;\n}\n\n/**\n * Declares layers that belong to every lightbox below it: something drawn\n * for the content from outside it, such as a shared buffer the tiles paint\n * into. An open lightbox lifts each `below` layer, then itself, then each\n * `above` layer into the top layer, each covering the window, so they keep\n * stacking as they did. A layer is measured against the window while lifted,\n * so whatever positions things inside it must re-measure — a labkit surface\n * whose container is one of the layers does.\n */\nexport function LightboxLayers({ below, above, children }: LightboxLayersProps) {\n const value = useMemo(\n () => ({ below: below ?? NONE.below, above: above ?? NONE.above }),\n [below, above],\n );\n return <LightboxLayersContext.Provider value={value}>{children}</LightboxLayersContext.Provider>;\n}\n\n/** The layers declared above, or none. */\nexport function useLightboxLayers(): LightboxLayerSet {\n return useContext(LightboxLayersContext);\n}\n","import { type ReactNode, useCallback, useInsertionEffect, useMemo, useRef, useState } from 'react';\nimport { LightboxLayers } from '../lightbox/LightboxLayers';\nimport { SurfaceCanvasContext, SurfaceContext } from '../surface/SurfaceContext';\nimport { useSurfaceCanvas, useSurfaceOptional } from '../surface/useSurfaceTile';\nimport { type SurfaceFrame, useTiledSurface } from '../surface/useTiledSurface';\n\n/** Props for `LabSurface`. */\nexport interface LabSurfaceProps {\n /** Receives the lab body, which the surface's layers cover. */\n bodyRef: (el: HTMLDivElement | null) => void;\n children: ReactNode;\n}\n\n/**\n * The lab body and the one shared drawing surface its trials paint into.\n *\n * The two buffers sit in layers stacked around the trials, both taking no\n * input — each tile takes it from its own box. A tile's marks annotate the\n * instrument's DOM from over it; an opaque renderer sits under it, so the\n * pane can still hold a label. Tile rects are measured against the over\n * layer, which is also where a tile's own chrome on the surface (an\n * annotation input box) mounts. The layers are declared to any lightbox\n * inside, which lifts them around an expanded trial; while lifted they cover\n * the window, the surface re-measures against that, and the buffers resize.\n *\n * A host that already owns a surface keeps it: a lab embedded in a larger\n * shared-surface app must not open a second GL tenancy, and mounts no buffer\n * or layer of its own.\n */\nexport function LabSurface({ bodyRef, children }: LabSurfaceProps) {\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 [underLayer, setUnderLayer] = useState<HTMLDivElement | null>(null);\n const [overLayer, setOverLayer] = useState<HTMLDivElement | 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\n const attachOwnSurface = ownSurface.containerRef;\n const overLayerRef = useCallback(\n (el: HTMLDivElement | null) => {\n setOverLayer(el);\n attachOwnSurface(el);\n },\n [attachOwnSurface],\n );\n\n const surface = outerSurface ?? ownSurface;\n const canvases = useMemo(\n () =>\n outerSurface ? { over: outerOver, under: outerUnder } : { over: ownOver, under: ownUnder },\n [outerSurface, outerOver, outerUnder, ownOver, ownUnder],\n );\n const below = useMemo(() => [underLayer], [underLayer]);\n const above = useMemo(() => [overLayer], [overLayer]);\n\n const body = (\n <div className=\"lk-lab__body\" ref={bodyRef}>\n {outerSurface ? null : (\n <div className=\"lk-lab__layer lk-lab__layer--under\" ref={setUnderLayer}>\n <canvas\n className=\"lk-lab__surface\"\n ref={(el) => {\n ownUnderRef.current = el;\n setOwnUnder(el);\n }}\n />\n </div>\n )}\n {children}\n {outerSurface ? null : (\n <div className=\"lk-lab__layer lk-lab__layer--over\" ref={overLayerRef}>\n <canvas\n className=\"lk-lab__surface\"\n ref={(el) => {\n ownOverRef.current = el;\n setOwnOver(el);\n }}\n />\n </div>\n )}\n </div>\n );\n\n return (\n <SurfaceContext.Provider value={surface}>\n <SurfaceCanvasContext.Provider value={canvases}>\n <LightboxLayers below={below} above={above}>\n {body}\n </LightboxLayers>\n </SurfaceCanvasContext.Provider>\n </SurfaceContext.Provider>\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 { type ColorList, colorAt, colorCount, resolveTheme, type Theme } from '@weasel-js/theme';\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\nexport function 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","import { stableStringify } from '@weasel-js/core';\nimport type { InstrumentList } from '../instrument/types';\nimport { defaultStorage, noneAdapter } from '../state/adapters';\nimport { valueRecord } from '../state/labRecords';\nimport { type OpenedLabStore, openLabStore } from '../state/openLabStore';\nimport { createRecordCache, type RecordCache } from '../state/records';\nimport { createLabStore, type LabStore } from '../state/store';\nimport type { LabMode, StorageAdapter } from '../state/types';\nimport { addTrial as addTrialOp } from '../trial/trialOps';\n\nexport interface OpenedLab extends OpenedLabStore {\n marks: ReadonlyMap<string, unknown>;\n}\n\n/** What opening a lab reads from `<Lab>`'s props. */\nexport interface OpenLabOptions {\n instruments: InstrumentList;\n defaultInstrument: string;\n mode?: LabMode | undefined;\n}\n\n/** The trial a presented lab opens on. `config` is overlaid on the\n * instrument's defaults the way `addTrial`'s is, so Reset returns to it;\n * `state` and `view` replace what that config would give. */\nexport interface PresentationSeed<TC = Record<string, unknown>, TS = unknown, TV = unknown> {\n /** Default: the lab's `defaultInstrument`. */\n instrument?: string;\n config?: Partial<TC>;\n state?: TS;\n view?: TV;\n}\n\n/** Where a lab stored under `storageKey` keeps its presentation, apart from\n * the full lab: an embed shares its origin's storage with the lab it shows. */\nexport function presentStorageKey(storageKey: string): string {\n return `${storageKey}:present`;\n}\n\nconst SEED_RECORD = valueRecord(null, 'lk-present-seed');\n\n/** Open a presented lab's one trial on `seed`, unless the store already holds\n * a trial opened on this same seed — a returning visitor keeps theirs until\n * the seed itself changes. */\nfunction seedPresentedTrial(\n store: LabStore,\n records: RecordCache,\n { instruments, defaultInstrument }: OpenLabOptions,\n seed: PresentationSeed,\n): void {\n const instrument = seed.instrument ?? defaultInstrument;\n const fingerprint = stableStringify({ ...seed, instrument });\n const trials = store.getState().trials;\n if (trials.length > 0 && records.get(SEED_RECORD) === fingerprint) return;\n const record = addTrialOp([], instruments, instrument, { config: seed.config })[0];\n if (!record) return;\n store.setState({ trials: [] });\n store.getState().addTrial({\n ...record,\n ...('state' in seed ? { state: seed.state } : {}),\n ...('view' in seed ? { view: seed.view } : {}),\n });\n records.set(SEED_RECORD, fingerprint);\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 store.getState().addTrial(record);\n}\n\n/** A lab with nothing to load renders at once. Its records hold\n * `usePersistedState` values for the session and write nothing. With a\n * `seed`, the lab is presented and opens on it. */\nexport function openUnstoredLab(options: OpenLabOptions, seed?: PresentationSeed): OpenedLab {\n const { instruments, defaultInstrument, mode } = options;\n const store = createLabStore({ initialMode: mode ?? 'auto', instruments });\n const records = createRecordCache({ storage: noneAdapter, prefix: '', writable: false });\n if (seed) seedPresentedTrial(store, records, options, seed);\n else seedDefaultTrial(store, instruments, defaultInstrument);\n return { store, records, close: () => records.close(), marks: new Map() };\n}\n\nexport async function openStoredLab(\n options: OpenLabOptions,\n storageKey: string,\n storage: StorageAdapter | undefined,\n seed?: PresentationSeed,\n): Promise<OpenedLab> {\n const { instruments, defaultInstrument, mode } = options;\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 if (seed) seedPresentedTrial(opened.store, opened.records, options, seed);\n else 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","import { useEffect } from 'react';\nimport type { LabStore } from '../state/store';\n\n/** Calls `pick` with the id of the trial input lands in — a press, focus\n * moving in, or focus moving into a frame — among the trials `store` owns. */\nexport function useFocusPick(\n labBody: HTMLElement | null,\n store: LabStore,\n pick: (trialId: string) => void,\n): void {\n useEffect(() => {\n if (!labBody) return;\n const pickFrom = (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) pick(trial.dataset.trialId);\n };\n const onInput = (event: Event): void => pickFrom(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(() => pickFrom(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, pick]);\n}\n","/**\n * Elements whose double-click already means something: a press there edits,\n * selects text, or works a control. `data-lk-lightbox-ignore` is the opt-out\n * for anything else.\n */\nconst OWN_DOUBLE_CLICK = [\n 'button',\n 'a[href]',\n 'input',\n 'select',\n 'textarea',\n 'label',\n 'summary',\n '[contenteditable]:not([contenteditable=\"false\"])',\n '[role=\"button\"]',\n '[role=\"checkbox\"]',\n '[role=\"combobox\"]',\n '[role=\"link\"]',\n '[role=\"menuitem\"]',\n '[role=\"option\"]',\n '[role=\"radio\"]',\n '[role=\"separator\"]',\n '[role=\"slider\"]',\n '[role=\"spinbutton\"]',\n '[role=\"switch\"]',\n '[role=\"tab\"]',\n '[role=\"textbox\"]',\n '[data-lk-lightbox-ignore]',\n].join(',');\n\n/** Whether a double-click that reached `root` should open its lightbox:\n * nothing handled it first, and it did not land on a control. */\nexport function opensLightbox(\n event: { target: EventTarget | null; defaultPrevented: boolean },\n root: Element,\n): boolean {\n if (event.defaultPrevented) return false;\n const target = event.target;\n if (!(target instanceof Element)) return true;\n const owner = target.closest(OWN_DOUBLE_CLICK);\n return owner === null || !root.contains(owner);\n}\n\n/**\n * Marks everything outside `keep` inert — every sibling of each kept element\n * and of each of their ancestors, up to the body — and returns the undo.\n * Leaves alone what was already inert, so the undo cannot clear someone\n * else's.\n */\nexport function inertOutside(keep: readonly Element[]): () => void {\n const path = new Set<Element>();\n for (const el of keep) {\n for (let node: Element | null = el; node && node !== document.body; node = node.parentElement) {\n path.add(node);\n }\n }\n const marked: Element[] = [];\n for (const node of path) {\n const parent: Element | null = node.parentElement;\n if (!parent) continue;\n for (const sibling of Array.from(parent.children)) {\n if (path.has(sibling) || sibling.hasAttribute('inert')) continue;\n sibling.setAttribute('inert', '');\n marked.push(sibling);\n }\n }\n return () => {\n for (const sibling of marked) sibling.removeAttribute('inert');\n };\n}\n\n/**\n * Lifts `stack` into the top layer in order, so the first ends up lowest, and\n * returns the undo. The first carries the dimming. Every member but `self` is\n * marked a layer, which the stylesheet stretches over the window. Does nothing\n * where the browser has no popover support.\n */\nexport function liftStack(stack: readonly HTMLElement[], self: HTMLElement): () => void {\n if (typeof self.showPopover !== 'function') return () => {};\n stack.forEach((el, i) => {\n el.setAttribute('popover', 'manual');\n if (el !== self) el.setAttribute('data-lk-lightbox-layer', '');\n if (i === 0) el.setAttribute('data-lk-lightbox-scrim', '');\n el.showPopover();\n });\n return () => {\n for (const el of [...stack].reverse()) {\n if (el.matches(':popover-open')) el.hidePopover();\n el.removeAttribute('popover');\n el.removeAttribute('data-lk-lightbox-layer');\n el.removeAttribute('data-lk-lightbox-scrim');\n }\n };\n}\n","import { useLatest } from '@weasel-js/core';\nimport { CloseIcon, FullscreenIcon } from '@weasel-js/ui';\nimport {\n type MouseEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useSurfaceOptional } from '../surface/useSurfaceTile';\nimport { LightboxContext, type LightboxContextValue } from './LightboxContext';\nimport { useLightboxLayers } from './LightboxLayers';\nimport { inertOutside, liftStack, opensLightbox } from './modal';\n\n/** Props for `<Lightbox>`. */\nexport interface LightboxProps {\n children: ReactNode;\n /** Names the expanded view for assistive tech. */\n label?: string;\n /** Turns the lightbox off: no expand button, no double-click, and an open\n * one closes. The content stays mounted either way. */\n disabled?: boolean;\n /** Let a double-click on the content open it, and another close it. Off by\n * default — the expand button is always there; a double-click is for\n * content that has no other use for one, such as an image. */\n expandOnDoubleClick?: boolean;\n /** Controlled open state. Omit to let the lightbox keep its own. */\n expanded?: boolean;\n onExpandedChange?: (expanded: boolean) => void;\n /** Extra class on the outer element. */\n className?: string;\n}\n\n/** What the root becomes while open: a modal dialog, and the host overlays\n * opened inside it portal into, so they stack above it. */\nfunction dialogProps(label: string) {\n return {\n role: 'dialog',\n 'aria-modal': true,\n 'aria-label': label,\n 'data-wzl-portal-host': '',\n } as const;\n}\n\n/**\n * Shows its content large, over a dimmed page, from the expand button in its\n * corner — or a double-click, where `expandOnDoubleClick` asks for one —\n * without remounting it. The same element is lifted into the browser's top\n * layer (`popover=\"manual\"`), so a WebGL context or a scene inside keeps\n * running and sees only a bigger box: anything sizing itself from a\n * `ResizeObserver` follows on its own. The top layer also escapes an\n * ancestor's transform, clipping, and stacking.\n *\n * Layers declared by a `<LightboxLayers>` above are lifted around it, and a\n * labkit surface above is scoped to it while it is open, so pixels drawn for\n * the content from outside it come along.\n *\n * Escape, a click on the dimmed margin, the close button, or another\n * double-click where those open it closes it, and focus returns to wherever it\n * was. A double-click on a control, inside `[data-lk-lightbox-ignore]`, or one\n * a handler further in called `preventDefault()` on does not open it.\n */\nexport function Lightbox({\n children,\n label = 'Expanded view',\n disabled = false,\n expandOnDoubleClick = false,\n expanded: expandedProp,\n onExpandedChange,\n className,\n}: LightboxProps) {\n const [own, setOwn] = useState(false);\n const expanded = !disabled && (expandedProp ?? own);\n const onChangeRef = useLatest(onExpandedChange);\n const expandedRef = useLatest(expanded);\n const rootRef = useRef<HTMLDivElement | null>(null);\n const closeRef = useRef<HTMLButtonElement | null>(null);\n const [claims, setClaims] = useState(0);\n const layers = useLightboxLayers();\n const surface = useSurfaceOptional();\n\n const set = useCallback(\n (next: boolean) => {\n if (next === expandedRef.current) return;\n setOwn(next);\n onChangeRef.current?.(next);\n },\n [expandedRef, onChangeRef],\n );\n\n const ctx = useMemo<LightboxContextValue | null>(\n () =>\n disabled\n ? null\n : {\n expanded,\n open: () => set(true),\n close: () => set(false),\n toggle: () => set(!expandedRef.current),\n claimControl: () => {\n setClaims((n) => n + 1);\n return () => setClaims((n) => n - 1);\n },\n },\n [disabled, expanded, set, expandedRef],\n );\n\n // Lift, trap and focus before paint, so the first frame is already the\n // expanded one. The popover attribute is set here rather than rendered: a\n // closed popover is `display: none`, which would hide the tile.\n useLayoutEffect(() => {\n const el = rootRef.current;\n if (!expanded || !el) return;\n const returnTo = document.activeElement as HTMLElement | null;\n const stack = [...layers.below, el, ...layers.above].filter(\n (layer): layer is HTMLElement => layer !== null,\n );\n const unlift = liftStack(stack, el);\n const release = inertOutside(stack);\n // A shared buffer lifted with this one must stop painting every other tile\n // over it.\n surface?.scope(el);\n closeRef.current?.focus({ preventScroll: true });\n return () => {\n surface?.scope(null);\n release();\n unlift();\n if (returnTo?.isConnected) returnTo.focus({ preventScroll: true });\n };\n }, [expanded, layers, surface]);\n\n useEffect(() => {\n if (!expanded) return;\n const onKey = (e: KeyboardEvent): void => {\n if (e.key !== 'Escape' || e.defaultPrevented) return;\n e.preventDefault();\n set(false);\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [expanded, set]);\n\n const onDoubleClick = (e: MouseEvent<HTMLDivElement>): void => {\n if (disabled || !expandOnDoubleClick || !opensLightbox(e, e.currentTarget)) return;\n e.preventDefault();\n set(!expanded);\n };\n\n // Only the margin around the frame is the root's own surface.\n const onClick = (e: MouseEvent<HTMLDivElement>): void => {\n if (expanded && e.target === e.currentTarget) set(false);\n };\n\n const classes = ['lk-lightbox'];\n if (expanded) classes.push('lk-lightbox--expanded');\n if (className) classes.push(className);\n\n let control: ReactNode = null;\n if (expanded) {\n control = (\n <button\n ref={closeRef}\n type=\"button\"\n className=\"lk-lightbox__button lk-lightbox__close\"\n aria-label=\"Close expanded view\"\n title=\"Close (Esc)\"\n onClick={() => set(false)}\n >\n <CloseIcon size={16} />\n </button>\n );\n } else if (!disabled && claims === 0) {\n control = (\n <button\n type=\"button\"\n className=\"lk-lightbox__button lk-lightbox__open\"\n aria-label=\"Expand\"\n title=\"Expand\"\n onClick={() => set(true)}\n >\n <FullscreenIcon size={16} />\n </button>\n );\n }\n\n return (\n <LightboxContext.Provider value={ctx}>\n {/* biome-ignore lint/a11y/noStaticElementInteractions: the double-click is an opt-in shortcut; the expand and close buttons are the keyboard path */}\n {/* biome-ignore lint/a11y/useKeyWithClickEvents: the margin click mirrors Escape, which is handled on the document */}\n <div\n ref={rootRef}\n className={classes.join(' ')}\n {...(expanded ? dialogProps(label) : null)}\n onDoubleClick={onDoubleClick}\n onClick={onClick}\n >\n <div className=\"lk-lightbox__frame\">{children}</div>\n {control}\n </div>\n </LightboxContext.Provider>\n );\n}\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 { Lightbox } from '../lightbox/Lightbox';\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 * Whether a tile can open in a `<Lightbox>` — shown large over the page from\n * the expand button in its corner — without being remounted. On by default;\n * `false` turns it off for every tile, and a function decides per tile id.\n */\n lightbox?: boolean | ((id: string) => boolean);\n /**\n * Whether a double-click on a tile's content also opens its lightbox. Off by\n * default, since most content has its own use for a double-click; give it\n * to a tile whose content has none, such as an image, with a function of\n * the tile id.\n */\n expandOnDoubleClick?: boolean | ((id: string) => boolean);\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 lightbox = true,\n expandOnDoubleClick = false,\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 lightboxFor = typeof lightbox === 'function' ? lightbox : () => lightbox;\n const doubleClickFor =\n typeof expandOnDoubleClick === 'function' ? expandOnDoubleClick : () => expandOnDoubleClick;\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 id = String(node.id);\n const tile = (\n // `disabled` rather than leaving the wrapper out, so turning the\n // lightbox off cannot remount the tile.\n <Lightbox\n className=\"lk-trial-tile\"\n disabled={!lightboxFor(id)}\n expandOnDoubleClick={doubleClickFor(id)}\n >\n {byId.get(node.id) ?? null}\n </Lightbox>\n );\n if (!reorderable) return tile;\n return (\n // No grip strip: the trial's own title bar is the drag surface.\n <TrialDragContext.Provider value={{ nodeId: node.id }}>{tile}</TrialDragContext.Provider>\n );\n },\n };\n }, [nodeIds, items, reorderable, tilePanels, lightbox, expandOnDoubleClick]);\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, colorCount, type Theme } from '@weasel-js/theme';\nimport { ThemeProvider, useResolvedColorMode } from '@weasel-js/theme/react';\nimport {\n type CSSProperties,\n type ReactNode,\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 { ClockRegistryContext, createClockRegistry } from '../clock/clockRegistry';\nimport { useClockLoop } from '../clock/useClockLoop';\nimport type { ConfigRule, ControlRenderer } from '../config/types';\nimport type { InstrumentList } from '../instrument/types';\nimport { Split } from '../primitives/Split';\nimport { LabStoreContext } from '../state/context';\nimport { PersistenceContext } from '../state/Persistence';\nimport type { LabDensity, LabMode, StorageAdapter, TrialRecord } from '../state/types';\nimport { useOpenOnce, useWarnIgnoredChange } from '../state/useOpenOnce';\nimport { usePersistedState } from '../state/usePersistedState';\nimport { useSurfaceOptional } from '../surface/useSurfaceTile';\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 { LabSurface } from './LabSurface';\nimport type { LabPage } from './LabSwitcher';\nimport { LabZoom } from './LabZoom';\nimport { buildNebula } from './nebula';\nimport {\n type OpenedLab,\n openStoredLab,\n openUnstoredLab,\n type PresentationSeed,\n presentStorageKey,\n} from './openLab';\nimport { createPanelHostRegistry, PanelHostContext } from './panelHost';\nimport { hasPresentParam, PresentationContext } from './presentation';\nimport { useFocusPick } from './useFocusPick';\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 /** Whether a double-click on a trial also opens it in its lightbox, beside\n * the title bar's expand toggle every trial has. Off by default; a\n * function decides per trial, by its record. */\n expandOnDoubleClick?: boolean | ((trial: TrialRecord) => boolean);\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 /** Start presenting: one trial, opened on `seed`, without the lab's chrome or\n * its own. `?present` in the page's URL does the same. Read once, at mount.\n * A stored lab presents from its own records, under `storageKey` +\n * `':present'`, so an embed never shows or changes the full lab's trials. */\n present?: boolean;\n /** The trial a lab that starts presenting opens on. A store that already\n * holds a trial opened on this same seed keeps it; a changed seed replaces\n * it. Ignored unless the lab starts presenting. */\n seed?: PresentationSeed;\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\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/** 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, present } = props;\n useWarnIgnoredChange('<Lab>', { storageKey, storage, present });\n const [startsPresenting] = useState(() => present === true || hasPresentParam());\n if (process.env.NODE_ENV !== 'production' && props.seed && !startsPresenting) {\n warnSeedIgnored();\n }\n const opened = useOpenOnce<OpenedLab>(() => {\n const seed = startsPresenting ? (props.seed ?? {}) : undefined;\n if (storageKey === undefined) return openUnstoredLab(props, seed);\n const key = startsPresenting ? presentStorageKey(storageKey) : storageKey;\n return openStoredLab(props, key, storage, seed);\n });\n if (!opened) {\n if (props.fallback !== undefined) return props.fallback;\n // An embed shows nothing until its trial is ready, never the lab's shell.\n if (startsPresenting) return null;\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} startsPresenting={startsPresenting} />;\n}\n\nlet seedWarned = false;\nfunction warnSeedIgnored(): void {\n if (seedWarned) return;\n seedWarned = true;\n console.warn('[labkit] <Lab> reads `seed` only when it starts presenting; it is ignored here');\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 expandOnDoubleClick = false,\n addTrial,\n zoom = true,\n tools,\n configRules,\n controls,\n children,\n opened,\n startsPresenting,\n}: LabProps & { opened: OpenedLab; startsPresenting: boolean }) {\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 [clocks] = useState(createClockRegistry);\n useClockLoop(clocks);\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 // `mount` when the lab started presenting, `enter` when asked to since.\n const [presentedBy, setPresentedBy] = useState<'mount' | 'enter' | null>(\n startsPresenting ? 'mount' : null,\n );\n const presenting = presentedBy !== null;\n const presentation = useMemo(\n () => ({\n active: presenting,\n enter: () => setPresentedBy((by) => by ?? 'enter'),\n exit: () => setPresentedBy(null),\n trialId: presenting ? focusedTrialId : null,\n }),\n [presenting, focusedTrialId],\n );\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 const [labBody, setLabBody] = useState<HTMLDivElement | null>(null);\n useLabFitWarning(labBody);\n\n useFocusPick(labBody, store, setFocusPick);\n\n // Only a lab asked to present has a workspace to go back to.\n useEffect(() => {\n if (presentedBy !== 'enter' || !labBody) return;\n const doc = labBody.ownerDocument;\n const onKeyDown = (event: KeyboardEvent): void => {\n if (event.key !== 'Escape' || event.defaultPrevented) return;\n setPresentedBy(null);\n };\n doc.addEventListener('keydown', onKeyDown);\n return () => doc.removeEventListener('keydown', onKeyDown);\n }, [presentedBy, labBody]);\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 clocks.get(id)?.reset();\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 clocks,\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 expandOnDoubleClick={\n typeof expandOnDoubleClick === 'function'\n ? (id) => {\n const trial = trials.find((t) => t.id === id);\n return trial ? expandOnDoubleClick(trial) : false;\n }\n : expandOnDoubleClick\n }\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 <PresentationContext.Provider value={presentation}>\n <CameraRegistryContext.Provider value={cameras}>\n <ClockRegistryContext.Provider value={clocks}>\n <ThemeProvider\n theme={theme}\n selection={{ mode: resolvedMode, density: density ?? 'comfortable' }}\n className={presenting ? 'lk-lab lk-lab--present' : '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 && !presenting ? <LabZoom /> : null}\n {children}\n <LabHeaderRegion contributions={labChromeAll} />\n <LabThemeSwitcher />\n </>\n }\n >\n <PanelHostContext.Provider value={panelHostsRef.current}>\n <LabSurface bodyRef={setLabBody}>\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 </LabSurface>\n </PanelHostContext.Provider>\n </LabShell>\n </ThemeProvider>\n </ClockRegistryContext.Provider>\n </CameraRegistryContext.Provider>\n </PresentationContext.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 { 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=\"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"]}
|