@weasel-js/labkit 1.7.0 → 1.7.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.
Files changed (208) hide show
  1. package/README.md +3 -3
  2. package/dist/_dts/{CanvasStackContext-D2jnIwfk.d.ts → CanvasStackContext-Cjy6I-Iv.d.ts} +4 -1
  3. package/dist/_dts/{Stage-CCWfQQWM.d.ts → Stage-D6t7o0pF.d.ts} +3 -2
  4. package/dist/_dts/{index-CsYqUHD3.d.ts → index-BTmaRy6a.d.ts} +10 -6
  5. package/dist/_dts/{types-CSm9jgol.d.ts → index-DCMA4Fy1.d.ts} +59 -113
  6. package/dist/_dts/{types-CRPSGFAp.d.ts → types-BUBSIZuV.d.ts} +8 -7
  7. package/dist/_dts/{useTrialState-CTZPgeZ7.d.ts → useTrialState-Bh8bzFgE.d.ts} +1 -1
  8. package/dist/canvas/index.d.ts +8 -6
  9. package/dist/canvas/index.js +6 -6
  10. package/dist/chrome/index.d.ts +7 -5
  11. package/dist/chrome/index.js +10 -9
  12. package/dist/chunk-2ES4W47N.js +8 -0
  13. package/dist/chunk-2ES4W47N.js.map +1 -0
  14. package/dist/{chunk-WPLAANH4.js → chunk-2N7UBSS2.js} +12 -12
  15. package/dist/chunk-2N7UBSS2.js.map +1 -0
  16. package/dist/chunk-4KSC7NXL.js +15491 -0
  17. package/dist/chunk-4KSC7NXL.js.map +1 -0
  18. package/dist/{chunk-7BO7HNGF.js → chunk-CEGFXTBD.js} +8 -61
  19. package/dist/chunk-CEGFXTBD.js.map +1 -0
  20. package/dist/{chunk-275JRRVD.js → chunk-E23Q6A3Y.js} +232 -37
  21. package/dist/chunk-E23Q6A3Y.js.map +1 -0
  22. package/dist/{chunk-GOZLNM4L.js → chunk-E6NARGU7.js} +5 -5
  23. package/dist/{chunk-GOZLNM4L.js.map → chunk-E6NARGU7.js.map} +1 -1
  24. package/dist/{chunk-IJJUK4FU.js → chunk-EESJUSYR.js} +5 -6
  25. package/dist/chunk-EESJUSYR.js.map +1 -0
  26. package/dist/{chunk-HXXTULDN.js → chunk-EFXRM6XQ.js} +8 -11
  27. package/dist/chunk-EFXRM6XQ.js.map +1 -0
  28. package/dist/chunk-F4ACIK7Z.js +210 -0
  29. package/dist/chunk-F4ACIK7Z.js.map +1 -0
  30. package/dist/{chunk-FMK7UQ6V.js → chunk-FB4MIZOO.js} +61 -44
  31. package/dist/chunk-FB4MIZOO.js.map +1 -0
  32. package/dist/{chunk-AWQG7FCC.js → chunk-FG3EXZDV.js} +3 -3
  33. package/dist/{chunk-AWQG7FCC.js.map → chunk-FG3EXZDV.js.map} +1 -1
  34. package/dist/{chunk-I5DUQ5HM.js → chunk-GAHELLJT.js} +75 -72
  35. package/dist/chunk-GAHELLJT.js.map +1 -0
  36. package/dist/{chunk-YT75VYRD.js → chunk-IBVRMHW5.js} +5 -5
  37. package/dist/{chunk-YT75VYRD.js.map → chunk-IBVRMHW5.js.map} +1 -1
  38. package/dist/{chunk-T5IBSPAM.js → chunk-JFOJESJF.js} +33 -23
  39. package/dist/chunk-JFOJESJF.js.map +1 -0
  40. package/dist/{chunk-RWNDDKOH.js → chunk-PMLZP7RT.js} +18 -15
  41. package/dist/chunk-PMLZP7RT.js.map +1 -0
  42. package/dist/{chunk-Y23G2VZL.js → chunk-READTDQX.js} +2 -2
  43. package/dist/chunk-READTDQX.js.map +1 -0
  44. package/dist/{chunk-JVBYV6TL.js → chunk-ROGJWDQA.js} +3 -3
  45. package/dist/{chunk-JVBYV6TL.js.map → chunk-ROGJWDQA.js.map} +1 -1
  46. package/dist/{chunk-ZIFPHIWZ.js → chunk-T6DLGEJB.js} +12 -14
  47. package/dist/chunk-T6DLGEJB.js.map +1 -0
  48. package/dist/{chunk-24W5VEJW.js → chunk-ULYYNWGP.js} +2 -2
  49. package/dist/{chunk-24W5VEJW.js.map → chunk-ULYYNWGP.js.map} +1 -1
  50. package/dist/{chunk-UNAZSLWE.js → chunk-VYVGVBGY.js} +17 -20
  51. package/dist/chunk-VYVGVBGY.js.map +1 -0
  52. package/dist/{chunk-KMJ7RWD3.js → chunk-WLMDTI2Q.js} +3 -3
  53. package/dist/{chunk-KMJ7RWD3.js.map → chunk-WLMDTI2Q.js.map} +1 -1
  54. package/dist/{chunk-J7OWWTCW.js → chunk-XE5HJOPL.js} +5 -6
  55. package/dist/chunk-XE5HJOPL.js.map +1 -0
  56. package/dist/chunk-XVUKDSYV.js +38 -0
  57. package/dist/chunk-XVUKDSYV.js.map +1 -0
  58. package/dist/{chunk-FZ7YFQN7.js → chunk-YCFKW5RX.js} +3 -3
  59. package/dist/chunk-YCFKW5RX.js.map +1 -0
  60. package/dist/{chunk-CQLQPQ4P.js → chunk-ZQIHJXP4.js} +2 -2
  61. package/dist/chunk-ZQIHJXP4.js.map +1 -0
  62. package/dist/config/index.d.ts +18 -10
  63. package/dist/config/index.js +4 -4
  64. package/dist/controls/index.d.ts +4 -7
  65. package/dist/controls/index.js +6 -5
  66. package/dist/dragdrop/index.d.ts +23 -3
  67. package/dist/dragdrop/index.js +4 -3
  68. package/dist/fonts/oswald-tabular-digits.woff2 +0 -0
  69. package/dist/index.d.ts +60 -714
  70. package/dist/index.js +357 -334
  71. package/dist/index.js.map +1 -1
  72. package/dist/job/index.d.ts +8 -0
  73. package/dist/job/index.js +1 -1
  74. package/dist/layers/index.d.ts +6 -5
  75. package/dist/layers/index.js +3 -2
  76. package/dist/loupe/index.d.ts +100 -30
  77. package/dist/loupe/index.js +585 -6
  78. package/dist/loupe/index.js.map +1 -1
  79. package/dist/overview/index.d.ts +4 -2
  80. package/dist/overview/index.js +15 -14
  81. package/dist/overview/index.js.map +1 -1
  82. package/dist/passthrough/weasel-canvas.d.ts +2 -0
  83. package/dist/passthrough/weasel-ui.d.ts +2 -2871
  84. package/dist/passthrough/weasel-ui.js +3 -2
  85. package/dist/primitives/index.d.ts +213 -3
  86. package/dist/primitives/index.js +8 -7
  87. package/dist/state/index.d.ts +7 -5
  88. package/dist/state/index.js +6 -6
  89. package/dist/styles.css +60 -44
  90. package/dist/surface/index.d.ts +10 -2
  91. package/dist/surface/index.js +1 -1
  92. package/dist/undo/index.d.ts +5 -3
  93. package/package.json +11 -11
  94. package/src/annotations/AnnotationOverlay.abandon.test.tsx +143 -0
  95. package/src/annotations/AnnotationOverlay.tsx +50 -31
  96. package/src/annotations/Annotations.overlay.test.tsx +31 -0
  97. package/src/annotations/capture.browser.test.ts +41 -0
  98. package/src/annotations/capture.ts +14 -7
  99. package/src/annotations/drawOne.ts +2 -2
  100. package/src/annotations/frac.test.ts +44 -1
  101. package/src/annotations/frac.ts +46 -18
  102. package/src/annotations/index.ts +1 -0
  103. package/src/annotations/paint.test.ts +74 -33
  104. package/src/annotations/paint.ts +70 -32
  105. package/src/annotations/store.test.ts +212 -2
  106. package/src/annotations/store.ts +130 -27
  107. package/src/annotations/svgNodes.test.ts +22 -10
  108. package/src/annotations/svgNodes.ts +3 -3
  109. package/src/annotations/types.ts +29 -10
  110. package/src/canvas/CameraInput.test.tsx +30 -0
  111. package/src/canvas/CameraInput.tsx +16 -15
  112. package/src/canvas/CanvasStack.tsx +5 -5
  113. package/src/canvas/CanvasStackContext.ts +4 -1
  114. package/src/canvas/Stage.tsx +3 -3
  115. package/src/canvas/cameraRegistry.ts +1 -0
  116. package/src/canvas/worldSpec.ts +3 -1
  117. package/src/chrome/builtins.test.ts +7 -6
  118. package/src/chrome/builtins.tsx +5 -1
  119. package/src/chrome/index.ts +1 -1
  120. package/src/chrome/merge.test.ts +5 -0
  121. package/src/chrome/merge.ts +4 -2
  122. package/src/chrome/regions/PaletteRegion.test.tsx +2 -3
  123. package/src/chrome/regions/PaletteRegion.tsx +3 -4
  124. package/src/chrome/regions/ViewportRegion.browser.test.less +6 -0
  125. package/src/chrome/regions/ViewportRegion.browser.test.tsx +38 -0
  126. package/src/chrome/regions/ViewportRegion.less +6 -0
  127. package/src/chrome/regions/ViewportRegion.tsx +10 -4
  128. package/src/chrome/types.ts +4 -2
  129. package/src/config/auto.ts +1 -0
  130. package/src/config/builder.ts +6 -0
  131. package/src/config/types.ts +2 -1
  132. package/src/controls/ControlPanel.test.tsx +37 -3
  133. package/src/controls/ControlPanel.tsx +12 -3
  134. package/src/dragdrop/DragDropRuntime.tsx +22 -13
  135. package/src/dragdrop/DragGhost.tsx +3 -0
  136. package/src/dragdrop/Palette.tsx +2 -0
  137. package/src/index.test.ts +5 -0
  138. package/src/index.ts +1 -1
  139. package/src/instrument/types.ts +0 -6
  140. package/src/job/useJob.ts +14 -9
  141. package/src/lab/Lab.tsx +5 -1
  142. package/src/lab/LabShell.less +1 -0
  143. package/src/lab/LabSwitcher.browser.test.tsx +27 -0
  144. package/src/lab/LabSwitcher.less +2 -0
  145. package/src/lab/LabZoom.tsx +4 -4
  146. package/src/lab/Workspace.tsx +48 -52
  147. package/src/loupe/AGENTS.md +28 -15
  148. package/src/loupe/CanvasLoupe.tsx +2 -3
  149. package/src/loupe/DomLoupe.tsx +1 -7
  150. package/src/loupe/Loupe.less +16 -0
  151. package/src/loupe/TrialLoupe.tsx +120 -57
  152. package/src/loupe/index.ts +1 -6
  153. package/src/loupe/types.test.ts +3 -3
  154. package/src/loupe/types.ts +24 -27
  155. package/src/loupe/useLoupe.test.tsx +29 -4
  156. package/src/loupe/useLoupe.ts +20 -17
  157. package/src/overview/OverviewMarks.tsx +12 -4
  158. package/src/overview/TrialOverview.tsx +3 -3
  159. package/src/passthrough/weasel-ui.test.ts +1 -1
  160. package/src/passthrough/weasel-ui.ts +1 -1
  161. package/src/primitives/FloatingPanel.tsx +7 -3
  162. package/src/primitives/JobProgress.less +1 -0
  163. package/src/primitives/Readout.test.tsx +2 -2
  164. package/src/primitives/Split.tsx +69 -41
  165. package/src/primitives/Toolbar.tsx +3 -3
  166. package/src/primitives/ZoomControl.less +1 -2
  167. package/src/specimen/Specimen.tsx +0 -1
  168. package/src/state/undock.ts +3 -0
  169. package/src/state/useOpenOnce.ts +20 -16
  170. package/src/state/view.ts +1 -0
  171. package/src/surface/index.ts +1 -1
  172. package/src/surface/useTiledSurface.test.tsx +14 -0
  173. package/src/surface/useTiledSurface.ts +11 -3
  174. package/src/trial/Trial.annotations.test.tsx +73 -0
  175. package/src/trial/Trial.less +0 -16
  176. package/src/trial/Trial.loupe.test.tsx +28 -11
  177. package/src/trial/Trial.tsx +74 -62
  178. package/src/trial/TrialChrome.tsx +6 -3
  179. package/src/trial/index.ts +2 -0
  180. package/src/trial/loupeSwitch.ts +15 -0
  181. package/dist/_dts/LayerList.d-DiuEArKq.d.ts +0 -83
  182. package/dist/_dts/PrefsRow.d-TOZ7BgD9.d.ts +0 -79
  183. package/dist/_dts/PropertyPanel.d-D-1paCbE.d.ts +0 -141
  184. package/dist/_dts/Select.d-Bensr_MT.d.ts +0 -579
  185. package/dist/_dts/index-B2Yj5aA0.d.ts +0 -274
  186. package/dist/chunk-275JRRVD.js.map +0 -1
  187. package/dist/chunk-4LJSC7MB.js +0 -143
  188. package/dist/chunk-4LJSC7MB.js.map +0 -1
  189. package/dist/chunk-7BO7HNGF.js.map +0 -1
  190. package/dist/chunk-CQLQPQ4P.js.map +0 -1
  191. package/dist/chunk-FMK7UQ6V.js.map +0 -1
  192. package/dist/chunk-FZ7YFQN7.js.map +0 -1
  193. package/dist/chunk-HXXTULDN.js.map +0 -1
  194. package/dist/chunk-I5DUQ5HM.js.map +0 -1
  195. package/dist/chunk-IJJUK4FU.js.map +0 -1
  196. package/dist/chunk-J7OWWTCW.js.map +0 -1
  197. package/dist/chunk-M7HP3FTK.js +0 -549
  198. package/dist/chunk-M7HP3FTK.js.map +0 -1
  199. package/dist/chunk-MIM5R4ZT.js +0 -14972
  200. package/dist/chunk-MIM5R4ZT.js.map +0 -1
  201. package/dist/chunk-RWNDDKOH.js.map +0 -1
  202. package/dist/chunk-T5IBSPAM.js.map +0 -1
  203. package/dist/chunk-UNAZSLWE.js.map +0 -1
  204. package/dist/chunk-WPLAANH4.js.map +0 -1
  205. package/dist/chunk-Y23G2VZL.js.map +0 -1
  206. package/dist/chunk-ZIFPHIWZ.js.map +0 -1
  207. package/src/primitives/useRovingTabIndex.test.ts +0 -48
  208. package/src/primitives/useRovingTabIndex.ts +0 -88
package/dist/index.d.ts CHANGED
@@ -1,475 +1,33 @@
1
+ export { Button, ButtonProps, ButtonSize, ButtonVariant, CloseIcon, CollapseIcon, CurveField, CurveFieldProps, CurveMark, DetailList, DetailListLayout, DetailListProps, DetailListValues, DetailRow, DetailRowProps, DetailRowStatus, ExpandIcon, Icon, IconProps, Input, InputProps, Jog, JogProps, LayerList, LayerListItem, LayerListProps, LayerMove, PauseIcon, PlayIcon, PropertyControl, PropertyControlProps, PropertyField, PropertyFieldProps, PropertyGroup, PropertyGroupProps, PropertyList, PropertyListPack, PropertyListProps, PropertyOption, PropertyPanel, PropertyPanelProps, PropertyRow, PropertyRowLayout, PropertyRowProps, PropertyRowVariant, PropertySpan, PropertySpanProps, ResetIcon, Select, SelectProps, StepBackIcon, StepForwardIcon, StopIcon, Subpanel, SubpanelProps, ToggleBar, ToggleBarItem, ToggleBarProps, ToggleBarSize, ToggleBarVariant, TokenCategory, TokenEntry, TokenPanel, TokenPanelProps, TokenScale, TokenScaleRule, inferTokenType, moveLayers, refitScale } from '@weasel-js/ui';
2
+ import { SceneNode, View, DrawCommand, BuiltinToolId } from '@weasel-js/core';
3
+ import { A as AnnotationMeaning, t as AnnotationData, v as WorldRect, w as MarkStyle, x as MarkScene, y as CaptureSource, z as CaptureOptions, B as CaptureResult, E as PaintableMark, F as AnnotationTarget, G as AnnotationsApi, H as AnnotationsCapability, J as TrialInfo, K as TrialTool, N as AnnotationKind, a as ViewTransform, O as Instrument, q as InstrumentList, o as LabMode, Q as LabDensity, R as TrialContribution, c as StorageAdapter, T as TrialRecord } from './_dts/index-DCMA4Fy1.js';
4
+ export { X as Annotation, Y as AnnotationInit, Z as AnnotationPatch, _ as AnnotationQuery, $ as AnnotationSelectionMode, a0 as AnnotationStatus, a1 as AnnotationStoreOptions, a2 as AnnotationTargetInfo, a3 as AnnotationToolId, a4 as Auto, a5 as CanvasCapability, a6 as CanvasLayer, a7 as CaptureDeps, a8 as ContributionBase, C as CreateLabStoreOptions, D as DEFAULT_FRAME, n as DragDropCapability, m as DragFeedback, a9 as FracPoint, aa as FracRect, ab as HitResult, ac as IconComponent, L as LabDocument, d as LabStoreState, ad as LayerCapability, ae as LayerDescriptor, l as PaletteItem, P as Point, af as RegionContribution, ag as RenderContext, e as SavedSnapshot, ah as SerializedAnnotations, S as SerializedTrial, ai as SidebarSection, aj as SidebarSlotContext, ak as StageCapability, al as StatusReadout, f as StorageChange, am as SystemEvent, an as ToolCapability, ao as ToolItem, ap as ToolSlotContext, aq as ToolbarItem, ar as TrialChromeContext, as as TrialRegion, g as TrialStateHandle, at as UndoCapability, U as UndoStack, h as UndockedPanel, i as UndockedPanels, au as ViewportControl, V as ViewportSize, W as WorldFrame, b as WorldSpec, av as annotationsFromJSON, k as applyCamera, aw as auto, ax as createAnnotationScene, ay as createAnnotationStore, j as dockPanel, az as fracContains, aA as fracEncloses, aB as fracToWorld, aC as isAuto, aD as markCommands, p as panelKey, r as resolveFrame, aE as roundFrac, u as undockPanel, aF as worldToFrac } from './_dts/index-DCMA4Fy1.js';
1
5
  import * as react from 'react';
2
6
  import { ReactNode } from 'react';
3
- import { I as IconProps } from './_dts/Select.d-Bensr_MT.js';
4
- export { B as Button, a as ButtonProps, b as ButtonSize, c as ButtonVariant, d as Icon, e as Input, f as InputProps, S as Select, g as SelectProps, T as ToggleBar, h as ToggleBarItem, i as ToggleBarProps, j as ToggleBarSize, k as ToggleBarVariant } from './_dts/Select.d-Bensr_MT.js';
5
- import { S as SplitProps } from './_dts/index-B2Yj5aA0.js';
6
- export { D as DetailList, a as DetailListLayout, b as DetailListProps, c as DetailListValues, d as DetailRow, e as DetailRowProps, f as DetailRowStatus, F as FpsMeter, J as JobProgress, g as JobProgressProps, L as Legend, h as LegendEntry, i as LegendMark, j as LegendProps, R as Readout, k as ReadoutProps, l as ReadoutRow, m as ScaleIndicator, n as ScaleIndicatorProps, o as Split, p as StatusBar, q as StatusBarProps, r as StatusBarSectionProps, T as Toolbar, s as ToolbarButtonProps, t as ToolbarGroupProps, u as ToolbarProps, Z as ZoomControl, v as ZoomControlProps } from './_dts/index-B2Yj5aA0.js';
7
- export { L as LayerList, a as LayerListItem, b as LayerListProps, c as LayerMove, m as moveLayers } from './_dts/LayerList.d-DiuEArKq.js';
8
- import { FillStyle, PaintKind, SceneNode, View, DrawCommand, Path, ScreenLength, StrokeAlign, MarkerRef, StyledRun, TextStyle, TextVerticalAlign, Stroke, BuiltinToolId } from '@weasel-js/core';
9
- import { U as UnitTable, D as Display } from './_dts/PrefsRow.d-TOZ7BgD9.js';
10
- import { StanceProps } from './passthrough/weasel-ui.js';
11
- import { a as PropertyRowLayout, b as PropertyListPack } from './_dts/PropertyPanel.d-D-1paCbE.js';
12
- import { PropertyMetricProps } from './passthrough/weasel-ui.js';
13
- export { c as PropertyList, d as PropertyListProps, e as PropertyPanel, f as PropertyPanelProps, g as PropertyRow, h as PropertyRowProps, i as PropertyRowVariant, j as PropertySpan, k as PropertySpanProps } from './_dts/PropertyPanel.d-D-1paCbE.js';
14
- import { A as AnnotationMeaning, w as AnnotationData, x as WorldRect, y as MarkStyle, z as MarkScene, B as CaptureSource, E as CaptureOptions, F as CaptureResult, G as PaintableMark, H as AnnotationTarget, J as AnnotationsApi, K as AnnotationsCapability, N as TrialInfo, O as TrialTool, Q as AnnotationKind, b as ViewTransform, R as Instrument, t as InstrumentList, s as LabMode, X as LabDensity, Y as TrialContribution, c as StorageAdapter, T as TrialRecord } from './_dts/types-CSm9jgol.js';
15
- export { Z as Annotation, _ as AnnotationInit, $ as AnnotationPatch, a0 as AnnotationQuery, a1 as AnnotationStatus, a2 as AnnotationStoreOptions, a3 as AnnotationTargetInfo, a4 as AnnotationToolId, a5 as Auto, a6 as CanvasCapability, a7 as CanvasLayer, a8 as CaptureDeps, a9 as ContributionBase, C as CreateLabStoreOptions, D as DEFAULT_FRAME, q as DragDropCapability, o as DragFeedback, aa as FracPoint, ab as FracRect, ac as HitResult, ad as IconComponent, ae as LOUPE_DEFAULTS, d as LabDocument, e as LabStoreState, L as LayerCapability, a as LayerDescriptor, af as LoupeCapability, ag as LoupeDeclaration, ah as LoupeMode, ai as LoupePoint, aj as LoupeRenderArgs, n as PaletteItem, P as Point, ak as RegionContribution, al as RenderContext, am as ResolvedLoupe, f as SavedSnapshot, an as SerializedAnnotations, S as SerializedTrial, ao as SidebarSection, ap as SidebarSlotContext, aq as StageCapability, ar as StatusReadout, g as StorageChange, as as SystemEvent, at as ToolCapability, au as ToolItem, av as ToolSlotContext, aw as ToolbarItem, ax as TrialChromeContext, ay as TrialRegion, h as TrialStateHandle, az as UndoCapability, U as UndoStack, i as UndockedPanel, j as UndockedPanels, aA as ViewportControl, V as ViewportSize, W as WorldFrame, l as WorldSpec, aB as annotationsFromJSON, m as applyCamera, aC as auto, aD as createAnnotationScene, aE as createAnnotationStore, k as dockPanel, aF as fracContains, aG as fracEncloses, aH as fracToWorld, aI as isAuto, aJ as markCommands, p as panelKey, r as resolveFrame, aK as resolveLoupe, aL as roundFrac, u as undockPanel, aM as worldToFrac } from './_dts/types-CSm9jgol.js';
16
- export { C as CameraContext, a as CameraContextValue, b as CameraInput, d as CameraPublishContext, e as CameraRegistry, f as CameraRegistryContext, g as CameraScope, h as CameraView, j as CanvasStack, k as CanvasStackProps, l as Stage, m as StageProps, Z as ZoomAtOptions, n as ZoomRange, o as centerOn, p as createCameraRegistry, q as fitStage, s as screenToWorld, r as usePublishCamera, w as worldToScreen, z as zoomAt } from './_dts/Stage-CCWfQQWM.js';
17
- export { C as CanvasLayerDescriptor, a as CanvasStackContext, b as CanvasStackContextValue, c as CanvasStackSurface } from './_dts/CanvasStackContext-D2jnIwfk.js';
18
- import { L as LabContribution } from './_dts/index-CsYqUHD3.js';
19
- export { A as AddTrialOptions, a as LabAsideRegion, b as LabChromeContext, c as LabContext, d as LabContextValue, e as LabFooterRegion, f as LabHeaderRegion, g as LabRegion, h as LabRegionProps, i as LabSidebarRegion, P as PaletteRegion, j as PaletteRegionProps, S as SidebarRegion, k as SidebarRegionProps, l as StatusRegion, m as StatusRegionProps, T as TitleBarPlacement, n as TitleBarRegion, o as TitleBarRegionProps, p as ToolbarRegion, q as ToolbarRegionProps, V as ViewportRegion, r as ViewportRegionProps, s as addTrial, t as builtinContributions, u as cloneTrial, v as closeTrial, w as contributionsIn, x as labContributions, y as mergeContributions, z as reorderTrials, B as resetTrial, C as suppressContributions, D as toolContributions, E as useLabChromeContext, F as useLabContext } from './_dts/index-CsYqUHD3.js';
7
+ import { SvgNode } from '@weasel-js/svg';
8
+ export { C as CameraContext, a as CameraContextValue, b as CameraInput, d as CameraPublishContext, e as CameraRegistry, f as CameraRegistryContext, g as CameraScope, h as CameraView, j as CanvasStack, k as CanvasStackProps, l as Stage, m as StageProps, Z as ZoomAtOptions, n as ZoomRange, o as centerOn, p as createCameraRegistry, q as fitStage, s as screenToWorld, r as usePublishCamera, w as worldToScreen, z as zoomAt } from './_dts/Stage-D6t7o0pF.js';
9
+ export { C as CanvasLayerDescriptor, a as CanvasStackContext, b as CanvasStackContextValue, c as CanvasStackSurface } from './_dts/CanvasStackContext-Cjy6I-Iv.js';
10
+ import { L as LabContribution } from './_dts/index-BTmaRy6a.js';
11
+ export { A as AddTrialOptions, a as LabAsideRegion, b as LabChromeContext, c as LabContext, d as LabContextValue, e as LabFooterRegion, f as LabHeaderRegion, g as LabRegion, h as LabRegionProps, i as LabSidebarRegion, P as PaletteRegion, j as PaletteRegionProps, S as SidebarRegion, k as SidebarRegionProps, l as StatusRegion, m as StatusRegionProps, T as TRANSIENT_BUILTINS, n as TitleBarPlacement, o as TitleBarRegion, p as TitleBarRegionProps, q as ToolbarRegion, r as ToolbarRegionProps, V as ViewportRegion, s as ViewportRegionProps, t as addTrial, u as builtinContributions, v as cloneTrial, w as closeTrial, x as contributionsIn, y as labContributions, z as mergeContributions, B as reorderTrials, C as resetTrial, D as suppressContributions, E as toolContributions, F as useLabChromeContext, G as useLabContext } from './_dts/index-BTmaRy6a.js';
20
12
  export { BaseNode, BooleanNode, ColorNode, CustomNode, EnumNode, GroupNode, ListNode, NumberNode, SectionTree, StringNode, ValueNode, applyRules, autoPathsOf, builtinRules, f, fillConfigDefaults, fromConfigFields, hasConfigPath, isConfigBranch, isLeafVisible, resolveAutoConfig, resolveConfigSchema, schemaNodeAtPath, sectionTree, titleCase, useConfigSchema, useResolvedConfig, valueAtPath, withValueAtPath } from './config/index.js';
21
- import { b as ConfigSchema, a as ConfigField, c as ConfigRule, d as ControlRenderer } from './_dts/types-CRPSGFAp.js';
22
- export { A as Annotations, B as BranchAnnotations, e as BranchOptions, f as CheckboxField, g as ColorField, h as ConfigBranch, i as ConfigEntry, j as ConfigFieldBase, k as ConfigFieldType, l as ConfigNode, m as ConfigOf, n as ConfigOption, C as ConfigPath, o as ConfigRuleContext, p as ConfigShape, D as DialogSpec, E as EntryValue, I as InDialogOptions, q as InferConfig, L as LeafPatch, N as NodeOptions, r as NodeValue, s as NumberField, R as ResolvedConfig, S as SectionOption, t as SectionSpec, u as SelectField, v as SelectOption, w as SliderField, T as TextField, V as ValueAtPath } from './_dts/types-CRPSGFAp.js';
13
+ import { C as ConfigSchema, a as ConfigField, b as ConfigRule, c as ControlRenderer } from './_dts/types-BUBSIZuV.js';
14
+ export { A as Annotations, B as BranchAnnotations, d as BranchOptions, e as CheckboxField, f as ColorField, g as ConfigBranch, h as ConfigEntry, i as ConfigFieldBase, j as ConfigFieldType, k as ConfigNode, l as ConfigOf, m as ConfigOption, n as ConfigPath, o as ConfigRuleContext, p as ConfigShape, D as DialogSpec, E as EntryValue, I as InDialogOptions, q as InferConfig, L as LeafPatch, N as NodeOptions, r as NodeValue, s as NumberField, R as ResolvedConfig, S as SectionOption, t as SectionSpec, u as SelectField, v as SelectOption, w as SliderField, T as TextField, V as ValueAtPath } from './_dts/types-BUBSIZuV.js';
23
15
  export { ControlPanel, inDialog, summarizeValue } from './controls/index.js';
24
16
  import { J as JobHandle } from './_dts/types-DJ79Tg5J.js';
25
17
  export { a as JobCapability, b as JobEvent, c as JobFailure, d as JobStatus } from './_dts/types-DJ79Tg5J.js';
26
18
  export { UseJobOptions, useJob } from './job/index.js';
27
19
  import { Theme, ColorList } from '@weasel-js/theme';
28
- export { CanvasLoupe, CanvasLoupeProps, DomLoupe, DomLoupeProps, LOUPE_MAGNIFY_ID, LOUPE_PEEK_ID, LensCamera, LoupeBubble, LoupeBubbleProps, LoupeGestures, LoupeGesturesProps, LoupeInputApi, LoupeState, SourceRect, TrialLoupe, TrialLoupeProps, UseLoupeOptions, createLoupeActions, drawCanvasLens, lensCamera, lensSourceRect, sampleStack, useLoupe } from './loupe/index.js';
29
20
  export { a as FloatingPanel, F as FloatingPanelProps } from './_dts/FloatingPanel-7j0IcXwz.js';
30
- export { C as CURRENT_DOCUMENT_VERSION, I as IndexedDbAdapterOptions, b as LabStoreContext, c as LabStoreProvider, O as OpenLabStoreOptions, d as OpenedLabStore, P as PersistedStateOptions, e as Persistence, f as PersistenceProps, R as RecordCache, g as RecordChange, T as TrialIdContext, h as TrialIdProvider, i as createIndexedDbAdapter, k as createMemoryAdapter, l as indexedDbAdapter, m as labDocumentKey, n as localStorageAdapter, o as noneAdapter, p as openLabStore, q as quarantineKey, s as sessionStorageAdapter, u as urlHashAdapter, r as useLabStore, t as usePersistedState, v as useTrialId, w as useTrialState } from './_dts/useTrialState-CTZPgeZ7.js';
31
- export { Box, Rect, SurfaceCanvasContext, SurfaceCanvases, SurfaceClear, SurfaceContext, SurfaceFrame, SurfaceHandle, SurfaceLayer, TilePainter, UseTiledSurfaceOptions, composeRects, rectsEqual, toDeviceRect, useSurface, useSurfaceCanvas, useSurfaceOptional, useSurfaceTile, useTileId, useTiledSurface } from './surface/index.js';
21
+ import { SplitProps } from './primitives/index.js';
22
+ export { FpsMeter, JobProgress, JobProgressProps, Legend, LegendEntry, LegendMark, LegendProps, Readout, ReadoutProps, ReadoutRow, ScaleIndicator, ScaleIndicatorProps, Split, StatusBar, StatusBarProps, StatusBarSectionProps, Toolbar, ToolbarButtonProps, ToolbarGroupProps, ToolbarProps, ZoomControl, ZoomControlProps } from './primitives/index.js';
23
+ export { C as CURRENT_DOCUMENT_VERSION, I as IndexedDbAdapterOptions, b as LabStoreContext, c as LabStoreProvider, O as OpenLabStoreOptions, d as OpenedLabStore, P as PersistedStateOptions, e as Persistence, f as PersistenceProps, R as RecordCache, g as RecordChange, T as TrialIdContext, h as TrialIdProvider, i as createIndexedDbAdapter, k as createMemoryAdapter, l as indexedDbAdapter, m as labDocumentKey, n as localStorageAdapter, o as noneAdapter, p as openLabStore, q as quarantineKey, s as sessionStorageAdapter, u as urlHashAdapter, r as useLabStore, t as usePersistedState, v as useTrialId, w as useTrialState } from './_dts/useTrialState-Bh8bzFgE.js';
24
+ export { Box, Rect, SurfaceCanvasContext, SurfaceCanvases, SurfaceClear, SurfaceContext, SurfaceFrame, SurfaceHandle, SurfaceLayer, TilePainter, UseTiledSurfaceOptions, composeRects, toDeviceRect, useSurface, useSurfaceCanvas, useSurfaceOptional, useSurfaceTile, useTileId, useTiledSurface } from './surface/index.js';
32
25
  export { EventBus, EventListener, clearUndo, createEventBus, emptyStack, pushSnapshot, redo, undo } from './undo/index.js';
33
- import 'react-aria-components';
26
+ import '@weasel-js/geom';
27
+ import '@weasel-js/quantity';
34
28
  import 'windease';
35
29
  import 'zustand/vanilla';
36
30
 
37
- declare const ResetIcon: (p: IconProps) => react.JSX.Element;
38
- declare const CloseIcon: (p: IconProps) => react.JSX.Element;
39
- declare const PlayIcon: (p: IconProps) => react.JSX.Element;
40
- declare const PauseIcon: (p: IconProps) => react.JSX.Element;
41
- declare const StopIcon: (p: IconProps) => react.JSX.Element;
42
- declare const StepBackIcon: (p: IconProps) => react.JSX.Element;
43
- declare const StepForwardIcon: (p: IconProps) => react.JSX.Element;
44
- declare const CollapseIcon: (p: IconProps) => react.JSX.Element;
45
- declare const ExpandIcon: (p: IconProps) => react.JSX.Element;
46
-
47
- /** One choice of an enum field. */
48
- interface PropertyOption<T extends string> {
49
- value: T;
50
- /** The option's name. A string also names its segment for a screen reader. */
51
- label: ReactNode;
52
- /** What a segment shows in place of `label` when the full one would not fit
53
- * — a glyph or a letter. `label` stays the accessible name. */
54
- glyph?: ReactNode;
55
- /** Shown but not choosable: a value the control reports and cannot author. */
56
- disabled?: boolean;
57
- }
58
- /** Props every kind of field shares. */
59
- interface FieldBase {
60
- /** The control's accessible name. A `<PropertyField>` takes it from a string
61
- * `label` when this is omitted. */
62
- name?: string;
63
- /** The sources the field reads disagree — a multi-selection whose nodes
64
- * differ. The control shows no value, in whatever form it has for that. */
65
- mixed?: boolean;
66
- /**
67
- * The sources agree on holding nothing: whatever is in effect comes from a
68
- * fallback further down. The control shows no chosen value rather than
69
- * inventing one, since the next edit would write the invention back.
70
- */
71
- unset?: boolean;
72
- /** Class on the control element itself. */
73
- className?: string;
74
- /** Id for the control element, for a `<label htmlFor>` outside it. */
75
- id?: string;
76
- }
77
- /** A boolean field. */
78
- interface PropertyBooleanFieldProps extends FieldBase {
79
- kind: 'boolean';
80
- /** `checkbox` (default), `switch`, or `toggle` — a one-segment pressable bar. */
81
- control?: 'checkbox' | 'switch' | 'toggle';
82
- /** Absent reads as off. */
83
- value: boolean | undefined;
84
- onChange: (next: boolean) => void;
85
- /** A `toggle`'s segment content. Defaults to the first letter of `name`. */
86
- glyph?: ReactNode;
87
- }
88
- /** A number field. */
89
- interface PropertyNumberFieldProps extends FieldBase {
90
- kind: 'number';
91
- /** `input` (default) for a typed number; `slider` for a track with an
92
- * editable readout, where the range matters more than the exact value. */
93
- control?: 'input' | 'slider';
94
- /** Absent reads as an empty field. */
95
- value: number | null | undefined;
96
- /**
97
- * The committed value. Given `onInput` as well, it fires once a drag ends,
98
- * or on blur, Enter or a step in a typed field; on its own it fires on every
99
- * move, keystroke and step. A caller wanting settled values only passes a
100
- * no-op `onInput`.
101
- */
102
- onChange: (next: number) => void;
103
- /** The live value, fired continuously. Pass it alongside `onChange` when the
104
- * write is expensive — cheap state here, the costly work there. */
105
- onInput?: (next: number) => void;
106
- /** A slider's track runs 0..100 where these are omitted. */
107
- min?: number;
108
- max?: number;
109
- step?: number;
110
- /**
111
- * Suffix after the value. A string becomes a dim word unit (`px`); pass JSX
112
- * like `<sup>°</sup>` for a symbol. Display only — the value stays a number.
113
- */
114
- unit?: ReactNode;
115
- /** Units a person may type into a typed field, each mapped to the factor
116
- * that turns it into the unit shown: `{ mm: 0.1, cm: 1 }`. */
117
- accepts?: Readonly<UnitTable>;
118
- /** How the value shows, is spoken, and reads back when typed —
119
- * `compact()` reads `2.00M`. A slider readout defaults to the value at
120
- * `step`'s precision. */
121
- display?: Display;
122
- /** A slider readout's text, for what no display expresses — a derived
123
- * value, a word at one end. Wins over `display`, and is spoken as shown. */
124
- format?: (value: number) => ReactNode;
125
- placeholder?: string;
126
- /** A typed field's up and down buttons. Default `false`: a dense panel
127
- * drives its numbers by typing, the arrow keys and the wheel. */
128
- steppers?: boolean;
129
- }
130
- /** A text field. */
131
- interface PropertyStringFieldProps extends FieldBase {
132
- kind: 'string';
133
- control?: 'input' | 'textarea';
134
- /** Absent reads as an empty field. */
135
- value: string | null | undefined;
136
- /**
137
- * The committed text. On its own it fires on every keystroke. Given
138
- * `onInput` as well, the field drafts: `onInput` gets each keystroke and
139
- * this fires once, on blur or Enter, and only if the text changed.
140
- */
141
- onChange: (next: string) => void;
142
- onInput?: (next: string) => void;
143
- placeholder?: string;
144
- maxLength?: number;
145
- }
146
- /** A choice among fixed options. */
147
- interface PropertyEnumFieldProps<T extends string = string> extends FieldBase {
148
- kind: 'enum';
149
- /**
150
- * `select` (default) is a dropdown. `radio` and `toggle` show every option
151
- * at once — a radio group lists them, and a toggle is a row of segments.
152
- */
153
- control?: 'select' | 'radio' | 'toggle';
154
- /** Absent, or not one of `options`, chooses nothing. */
155
- value: T | undefined;
156
- options: ReadonlyArray<PropertyOption<T>>;
157
- onChange: (next: T) => void;
158
- /**
159
- * Given, choosing nothing is a value of its own: a `toggle` lets the chosen
160
- * segment be clicked off, and calls this. Absent, a toggle always holds one.
161
- */
162
- onClear?: () => void;
163
- /** Shown while no option is chosen. Defaults to "Choose option…". */
164
- placeholder?: string;
165
- }
166
- /** A single color. */
167
- interface PropertyColorFieldProps extends FieldBase {
168
- kind: 'color';
169
- /** `#rrggbb`, or `#rrggbbaa` when `alpha` is `true`. */
170
- value: string | undefined;
171
- /**
172
- * The committed color. Given `onInput` as well, it fires once per gesture —
173
- * the picker closing, or the opacity track let go; on its own it fires on
174
- * every move. A caller wanting settled values only passes a no-op `onInput`.
175
- */
176
- onChange: (next: string) => void;
177
- onInput?: (next: string) => void;
178
- /**
179
- * Offer an opacity track. `true` keeps the alpha in `value` as `#rrggbbaa`;
180
- * a number is the 0..1 alpha held apart from it, reported through
181
- * `onAlphaChange` / `onAlphaInput`.
182
- */
183
- alpha?: boolean | number;
184
- onAlphaChange?: (next: number) => void;
185
- onAlphaInput?: (next: number) => void;
186
- /** Draw the opacity track inert, for a consumer that drops alpha. */
187
- alphaDisabled?: boolean;
188
- }
189
- /** A whole paint: a solid, a gradient, a pattern, or none. */
190
- interface PropertyPaintFieldProps extends FieldBase {
191
- kind: 'paint';
192
- /** `swatch` (default) opens the editor in a popover, for a narrow slot;
193
- * `inline` draws the kind bar and its editor in place. */
194
- control?: 'swatch' | 'inline';
195
- /** `null` is an explicit "no paint"; `undefined` is nothing to show. */
196
- value: FillStyle | null | undefined;
197
- onChange: (next: FillStyle | null) => void;
198
- onInput?: (next: FillStyle | null) => void;
199
- /** Offer "None". Default `true`. */
200
- allowNone?: boolean;
201
- /** Restrict the kinds offered. Default: every registered kind. */
202
- kinds?: readonly PaintKind[];
203
- }
204
- /** A font family, picked from the live font registry. */
205
- interface PropertyFontFamilyFieldProps extends FieldBase {
206
- kind: 'font-family';
207
- value: string | undefined;
208
- onChange: (next: string) => void;
209
- /** The weight and slant the family is drawn at, so the picker names the
210
- * variant that will actually paint. */
211
- weight?: number;
212
- fontStyle?: 'normal' | 'italic';
213
- }
214
- /**
215
- * One field for {@link PropertyControl} and {@link PropertyField}, keyed by
216
- * `kind`.
217
- */
218
- type PropertyControlProps<T extends string = string> = PropertyBooleanFieldProps | PropertyNumberFieldProps | PropertyStringFieldProps | PropertyEnumFieldProps<T> | PropertyColorFieldProps | PropertyPaintFieldProps | PropertyFontFamilyFieldProps;
219
- /** Row props {@link PropertyField} adds to the field it draws. */
220
- interface PropertyFieldRowProps extends PropertyMetricProps {
221
- label: ReactNode;
222
- /**
223
- * Text beside the label. On a slider it replaces the editable readout —
224
- * use it when the row is not showing a number a caller could type back,
225
- * such as an auto row's `auto`.
226
- */
227
- readout?: ReactNode;
228
- description?: string;
229
- layout?: PropertyRowLayout;
230
- /** Take the full width of the enclosing grid — see `<PropertyRow span>`. */
231
- span?: boolean;
232
- /** The row is auto — see `<PropertyRow auto>`. */
233
- auto?: boolean;
234
- /** Toggles `auto` from the row's label — see `<PropertyRow onAutoChange>`. */
235
- onAutoChange?: (next: boolean) => void;
236
- /** Class on the row. `controlClassName` reaches the control. */
237
- rowClassName?: string;
238
- controlClassName?: string;
239
- }
240
- /** Props for {@link PropertyField}: one field, and the row around it. */
241
- type PropertyFieldProps<T extends string = string> = PropertyFieldRowProps & DistributiveOmit<PropertyControlProps<T>, 'className' | 'id'>;
242
- type DistributiveOmit<U, K extends PropertyKey> = U extends unknown ? Omit<U, K> : never;
243
- /**
244
- * A labeled settings row for one field, its control chosen by `kind` (and
245
- * `control`): `<PropertyField kind="number" control="slider" label="Blur" …>`.
246
- *
247
- * The row is a {@link PropertyRow}; the control is the one
248
- * {@link PropertyControl} draws for the same props. Every schema-driven
249
- * settings surface in the kit — `ControlPanel`, `PrefsForm`, `SelectionPanel`
250
- * — draws its built-in kinds through that one mapping, so a kind's control
251
- * is decided once.
252
- *
253
- * Callbacks follow the field's shape: a discrete control (a box, a choice)
254
- * reports each pick; a continuous or typed one reports every change through
255
- * `onChange` alone, or splits them into live `onInput` and settled
256
- * `onChange` when given both. `mixed` and `unset` show a field whose sources
257
- * disagree, or agree on holding nothing.
258
- */
259
- declare function PropertyField<T extends string = string>(props: PropertyFieldProps<T>): react.JSX.Element;
260
- /**
261
- * The control for one field, with no row around it — for a cell that shares
262
- * a row with others, or a surface that draws its own row. Keyed by `kind`
263
- * (and `control`), the same mapping {@link PropertyField} draws.
264
- *
265
- * A slider brings its readout beside the track. Several elements come back
266
- * as siblings rather than wrapped, so the surrounding row lays them out.
267
- */
268
- declare function PropertyControl<T extends string = string>(typed: PropertyControlProps<T>): react.JSX.Element;
269
-
270
- /** An annotation drawn over a curve plot: a shaded band across a range of x,
271
- * or a vertical line at one x. */
272
- type CurveMark = {
273
- kind: 'band';
274
- x: [number, number];
275
- color?: string;
276
- } | {
277
- kind: 'line';
278
- x: number;
279
- color?: string;
280
- };
281
- /** Props for `<CurveField>`. */
282
- interface CurveFieldProps {
283
- /** Flat [x0, y0, x1, y1, …] — matches how curve-as-array configs
284
- * serialize in JSON snapshots. */
285
- values: number[];
286
- min: number;
287
- max: number;
288
- step: number;
289
- /** Plot width in CSS px. Caller sizes (typically uses a ResizeObserver). */
290
- width: number;
291
- /** Plot height in CSS px. Default 110. */
292
- height?: number;
293
- /** Flat default curve. When provided, a Reset button restores it. */
294
- defaults?: readonly number[];
295
- onChange: (next: number[]) => void;
296
- /** Optional vertical marks overlaid on the plot (e.g. landmarks). */
297
- marks?: readonly CurveMark[];
298
- }
299
- /**
300
- * A function-domain (y = f(x), x ∈ [0,1]) curve editor with per-stop
301
- * numeric readouts and flip buttons. Wraps weasel-ui's
302
- * `CurveEditor`; consumers wanting the raw editor (2D paths,
303
- * custom anchors) should import that instead.
304
- */
305
- declare function CurveField({ values, min, max, step, width, height, defaults, onChange, marks, }: CurveFieldProps): react.JSX.Element;
306
-
307
- /** Props for `<PropertyGroup>`. */
308
- interface PropertyGroupProps extends PropertyMetricProps, StanceProps {
309
- /** Title rendered between two rules at the top of the group. */
310
- title: ReactNode;
311
- /** Before the title: a drag handle, an ordinal. Clicks here do not fold the group. */
312
- leading?: ReactNode;
313
- /** After the title: a summary of the group's value, a remove button. Clicks here do not fold the group. */
314
- actions?: ReactNode;
315
- /** Help text for the whole group, drawn under the title and above the
316
- * rows. `<PropertyRow description>` covers the per-row case. */
317
- description?: ReactNode;
318
- /** When true the group renders nothing — useful for conditional sections. */
319
- hidden?: boolean;
320
- /**
321
- * Give the title a twisty that folds the rows away. Implied by any of the
322
- * three props below, so it is only needed for a group that starts open and
323
- * keeps its own state.
324
- */
325
- collapsible?: boolean;
326
- /** Start folded. Read once; the group owns the state from then on. */
327
- defaultCollapsed?: boolean;
328
- /**
329
- * Folded or not, as the consumer holds it. Given, the group keeps no state
330
- * of its own and every toggle arrives at `onCollapsedChange` instead — which
331
- * is what a panel that remembers its sections past a reload needs.
332
- */
333
- collapsed?: boolean;
334
- onCollapsedChange?: (next: boolean) => void;
335
- children: ReactNode;
336
- className?: string;
337
- /** Take the whole width of a packed grid, like `<PropertyRow span>`: a group
338
- * lays its own rows out, so half a column leaves them overlapping. */
339
- span?: boolean;
340
- /** How rows pack into the 2-column grid — see `<PropertyList pack>`. */
341
- pack?: PropertyListPack;
342
- }
343
- /**
344
- * Visually-bordered group inside a PropertyList. Use to scope a set of
345
- * related rows under a heading (e.g. "Aqua", "Bevel", "Dome" sections
346
- * inside a fill effect's controls).
347
- *
348
- * A collapsible group keeps its rows mounted and hides them, so a control's
349
- * local state survives being folded away. `stance` and `tone` work as on
350
- * `<PropertyPanel>`; a tone also draws the group's leading edge in it, which
351
- * is how a list of like groups — effects, tails — tells its members apart.
352
- * `leading` and `actions` put a handle and controls in the title row, and the
353
- * groups of a `<PropertyList>` reorder with `useReorderDragList`.
354
- */
355
- declare function PropertyGroup({ title, leading, actions, description, hidden, collapsible, defaultCollapsed, collapsed, onCollapsedChange, children, className, span, pack, density, align, stance, tone, }: PropertyGroupProps): react.JSX.Element | null;
356
-
357
- /** Props for `<Subpanel>`. */
358
- interface SubpanelProps extends PropertyMetricProps, StanceProps {
359
- title: ReactNode;
360
- children: ReactNode;
361
- className?: string;
362
- }
363
- /** A typographic divider inside a property list: a small title flanked by a
364
- * rule. Purely a heading — use `<PropertyGroup>` for a bordered section. A
365
- * stance or tone colors the title and rule. */
366
- declare function Subpanel({ title, children, className, density, align, stance, tone }: SubpanelProps): react.JSX.Element;
367
-
368
- /** A design token as `TokenPanel` edits it. */
369
- interface TokenEntry {
370
- /** The custom property, e.g. `--wzl-gray-50`. */
371
- name: string;
372
- /** A DTCG type name. A type the panel has no control for edits as text. */
373
- type: string;
374
- /** Tokens sharing a group sit together; a color group large enough draws as one row of swatches. */
375
- group: string;
376
- value: string;
377
- /** Whether `value` overrides the token's own, which offers Reset. */
378
- overridden?: boolean;
379
- description?: string;
380
- }
381
- /** How a scale's steps follow from its base: one multiplier per step, a constant ratio, or a constant step. */
382
- type TokenScaleRule = {
383
- kind: 'factors';
384
- factors: readonly number[];
385
- } | {
386
- kind: 'ratio';
387
- ratio: number;
388
- } | {
389
- kind: 'step';
390
- step: number;
391
- };
392
- /** A group whose steps are generated from a base, so the panel edits the base and the rule rather than each step. */
393
- interface TokenScale {
394
- /** The generated tokens, smallest first. Anything else in the group draws as an ordinary step. */
395
- tokens: readonly string[];
396
- base: number;
397
- rule: TokenScaleRule;
398
- }
399
- /**
400
- * The same scale under another rule, fitted to the amounts its steps have now.
401
- * A ratio or step counts from the first step, so switching to one moves the
402
- * base there.
403
- */
404
- declare function refitScale(scale: TokenScale, kind: TokenScaleRule['kind'], amounts: readonly number[]): TokenScale;
405
- type TokenCategory = 'color' | 'type' | 'size' | 'motion' | 'depth' | 'other';
406
- /** A DTCG type read off the shape of a value, for a token that arrives without one. `'string'` when nothing fits. */
407
- declare function inferTokenType(value: string): string;
408
-
409
- type OnChange = (name: string, value: string | null) => void;
410
- /** Props for `<TokenPanel>`. */
411
- interface TokenPanelProps {
412
- tokens: readonly TokenEntry[];
413
- /** A token's new value, or null to drop its override. Keep it stable: rows re-render only when it or their token changes. */
414
- onChange: OnChange;
415
- /** Sections held closed, by category. Omit to let the panel keep that state itself. */
416
- collapsed?: Readonly<Partial<Record<TokenCategory, boolean>>>;
417
- onCollapsedChange?: (category: TokenCategory, collapsed: boolean) => void;
418
- /** Groups generated from a base, by group name. Such a group edits its base and rule above its steps. */
419
- scales?: Readonly<Record<string, TokenScale>>;
420
- /** A scale's new base or rule. The panel does not regenerate the steps; the consumer does, through `onChange`. */
421
- onScaleChange?: (group: string, scale: TokenScale) => void;
422
- /** Files a token under a section. Defaults to `tokenCategory`. */
423
- categorize?: (token: TokenEntry) => TokenCategory;
424
- /** The fewest colors, or sizes, sharing a group that draw as one row of swatches or one grid of steps. Default 3. */
425
- familySize?: number;
426
- /**
427
- * Row layout. `tight` puts a token on one line — name, control, Reset — with the
428
- * names on a fixed rail so the values read down the panel as a column, and caps
429
- * the field rather than letting it span the panel. Default `normal` stacks the
430
- * control under its name.
431
- */
432
- density?: 'tight' | 'normal';
433
- className?: string;
434
- }
435
- /**
436
- * Edits a set of design tokens by type: collapsible sections by category, a
437
- * color group drawn as one row of swatches sized to fit, a group of sizes drawn
438
- * as one grid of numbers labeled by step — with its base and rule above it when
439
- * `scales` says how it is generated — and a control for each
440
- * type — a number with its unit for dimensions and durations, the nine weights
441
- * for a font weight, a curve beside a `cubic-bezier()`, a swatch beside a color,
442
- * and text for everything else.
443
- */
444
- declare function TokenPanel({ tokens, onChange, collapsed, onCollapsedChange, scales, onScaleChange, categorize, familySize, density, className, }: TokenPanelProps): react.JSX.Element;
445
-
446
- /** Props for {@link Jog}. */
447
- interface JogProps {
448
- /** Which step is showing, 0-based. */
449
- index: number;
450
- /** How many steps there are. */
451
- count: number;
452
- playing: boolean;
453
- onPlay: (playing: boolean) => void;
454
- /** Move one step, back or forward. */
455
- onStep: (by: -1 | 1) => void;
456
- /** Jump to a step. Left out, no scrubber is drawn. */
457
- onScrub?: (index: number) => void;
458
- /** What one step is called, for the spoken labels. Defaults to `Step`. */
459
- unit?: string;
460
- /** Drawn after the readout — a beat's caption, a snapshot's date. */
461
- caption?: ReactNode;
462
- className?: string;
463
- }
464
- /**
465
- * Transport for something counted rather than timed: beat 3 of 24, not 4.20s of 12.00s.
466
- * `<Transport>` is the continuous-time one, and wants a playhead in milliseconds, a rate and
467
- * a loop, none of which a list of steps has.
468
- *
469
- * Named for the jog of jog/shuttle — moving one frame at a time, as against running at speed.
470
- */
471
- declare function Jog(props: JogProps): react.JSX.Element;
472
-
473
31
  /** What resolving a mark's appearance needs beyond the mark itself. */
474
32
  interface MarkDrawOptions {
475
33
  /** The target's content box — the world a mark's geometry is in. */
@@ -509,6 +67,8 @@ type CapturePlan = 'svg-document' | 'raster-stack';
509
67
  * base.
510
68
  */
511
69
  declare function capturePlan(base: CaptureSource | undefined, format: 'png' | 'svg'): CapturePlan;
70
+ /** Inputs to `composeCaptureSvg`. `scale` is output pixels per content-box
71
+ * unit; `onWarn` receives non-fatal export warnings. */
512
72
  interface ComposeSvgArgs {
513
73
  base?: CaptureSource;
514
74
  scene: MarkScene;
@@ -522,7 +82,10 @@ interface ComposeSvgArgs {
522
82
  * The outer `viewBox` is the content box, so marks — which are already in it —
523
83
  * need no transform, and `width`/`height` carry the export scale. Both halves
524
84
  * nest as child `<svg>` elements, which each establish their own viewport and
525
- * so keep their own `viewBox` maths out of this function.
85
+ * so keep their own `viewBox` math out of this function.
86
+ *
87
+ * Synchronous with no `warmSvg`: marks export nothing that loads on demand,
88
+ * which `svgNodes.test.ts` pins.
526
89
  */
527
90
  declare function composeCaptureSvg(args: ComposeSvgArgs): string;
528
91
  /** What a capture needs about the target it is exporting. */
@@ -581,250 +144,6 @@ declare function seenFrom(config: unknown, keys: readonly string[]): Record<stri
581
144
  */
582
145
  declare function isStale(seen: Readonly<Record<string, unknown>> | undefined, config: unknown, keys: readonly string[]): boolean;
583
146
 
584
- type Mat3 = readonly [number, number, number, number, number, number];
585
-
586
- /**
587
- * Public types for `@weasel-js/svg`. The package exposes a flat,
588
- * discriminated-union node model (`SvgNode`) that mirrors the SVG element
589
- * tree but uses weasel-native leaf data (`Path`, `FillStyle`) for geometry and
590
- * paint.
591
- *
592
- * Parsing collapses every `transform="..."` onto its descendants' geometry,
593
- * so the `SvgNode` tree returned from `parseSvg` never has a non-identity
594
- * group transform. Consumers may still construct groups with explicit
595
- * transforms before serializing, in which case the serializer emits a
596
- * single `matrix(a b c d e f)` on the `<g>`.
597
- */
598
-
599
- /**
600
- * Opaque pass-through bag for namespaced XML content.
601
- *
602
- * weasel-svg does not interpret the contents — it only ensures that any
603
- * attributes or child elements in a *declared* XML namespace round-trip
604
- * losslessly through parse → serialize. Consumers (e.g. an app-specific
605
- * bridge layer) hang their domain semantics off this structure.
606
- *
607
- * Keyed by namespace prefix (the prefix is a write-time choice; the URI
608
- * is the canonical identifier and is supplied via `ParseOptions.namespaces`
609
- * / `SerializeOptions.namespaces`).
610
- */
611
- interface NamespaceMeta {
612
- [prefix: string]: {
613
- /** Local-name → string-value map for attributes in this namespace. */
614
- attrs?: Record<string, string>;
615
- /**
616
- * Child elements in this namespace, keyed by local name. Each entry
617
- * is an array because a namespace can host multiple sibling elements
618
- * with the same tag (e.g. `<wd:layer/><wd:layer/>`).
619
- */
620
- elements?: Record<string, NamespacedElement[]>;
621
- };
622
- }
623
- /** Opaque structured representation of a namespaced element. */
624
- interface NamespacedElement {
625
- /** Attribute local-name → string-value. */
626
- attrs: Record<string, string>;
627
- /** Text content, when the element contains only text (no child elements). */
628
- text?: string;
629
- /** Nested namespaced children, keyed by local name (recursive). */
630
- children?: Record<string, NamespacedElement[]>;
631
- }
632
- /**
633
- * 2x3 affine matrix in SVG's `matrix(a b c d e f)` order, mapping
634
- * `[x', y'] = [a*x + c*y + e, b*x + d*y + f]`.
635
- *
636
- * The same order the kernel's affine tier uses, so this is that type under
637
- * the name the SVG spec gives it — not a parallel one. An `SvgGroupNode`'s
638
- * transform and a geom `Mat3` are interchangeable without a conversion.
639
- */
640
- type Matrix = Mat3;
641
- /**
642
- * FillStyle description in the SVG sense — either explicit `none`, a solid
643
- * color, or a reference to a weasel-native gradient `FillStyle`. Solid colors
644
- * are normalized to `#rrggbb` strings; opacity is carried separately so
645
- * `fill-opacity` and `stroke-opacity` round-trip cleanly.
646
- */
647
- type SvgPaint = {
648
- kind: 'none';
649
- } | {
650
- kind: 'solid';
651
- color: string;
652
- opacity?: number;
653
- } | {
654
- kind: 'gradient';
655
- paint: FillStyle;
656
- };
657
- /** Stroke description: a paint plus structural line parameters. */
658
- interface SvgStroke {
659
- paint: SvgPaint;
660
- /** World units, or `{ px }` for a width that holds its rendered thickness
661
- * however the document is scaled — SVG's `vector-effect="non-scaling-stroke"`.
662
- * Literally the kit's own unit, not a second spelling of it. */
663
- width: ScreenLength;
664
- opacity?: number;
665
- /** `stroke-linecap`. Default per SVG spec is `'butt'`. */
666
- cap?: 'butt' | 'round' | 'square';
667
- /** `stroke-linejoin`. Default per SVG spec is `'miter'`. SVG's `arcs` / `miter-clip` map to `'miter'` with a warning. */
668
- join?: 'miter' | 'round' | 'bevel';
669
- /** `stroke-dasharray` as a flat number array. Odd-length inputs are doubled per SVG spec. */
670
- dash?: number[];
671
- /**
672
- * `stroke-miterlimit`. SVG's default is 4. Weasel's renderer defaults to
673
- * 10 (Canvas2D) when unset, so parsed strokes without an explicit
674
- * attribute may render with longer miters than the source SVG intended.
675
- */
676
- miterLimit?: number;
677
- /** The kit stroke's `align`. SVG has no stroke alignment, so the serializer
678
- * writes the stroke centered and says so through `onWarn`; the parser
679
- * never sets it. */
680
- align?: StrokeAlign;
681
- /** `marker-start` / `marker-mid` / `marker-end` as the kit's `MarkerRef`: the
682
- * bare `url(#id)` key, or a key with the `size` the serializer writes into a
683
- * def of its own. */
684
- markerStart?: MarkerRef;
685
- markerMid?: MarkerRef;
686
- markerEnd?: MarkerRef;
687
- }
688
- /**
689
- * Leaf node: a path geometry plus fill/stroke. All other v1 shapes
690
- * (`<rect>`, `<ellipse>`, etc.) are lowered to this representation on
691
- * parse — `<rect>` uses weasel's `RectPath` fast-path subtype when
692
- * possible, everything else becomes a `PolygonPath`.
693
- */
694
- interface SvgPathNode {
695
- kind: 'path';
696
- path: Path;
697
- fill: SvgPaint;
698
- stroke?: SvgStroke;
699
- /** Element-level opacity (`opacity="..."`), 0..1. */
700
- opacity?: number;
701
- /** Element-level rotation in **radians**, pivoting around the AABB
702
- * center of the underlying `path` geometry. Emitted as SVG
703
- * `transform="rotate(angleDegrees cx cy)"`. */
704
- rotation?: number;
705
- /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */
706
- meta?: NamespaceMeta;
707
- }
708
- /**
709
- * Group node: an SVG `<g>`. On parse, `transform` is always omitted (any
710
- * `transform` attribute is collapsed onto descendants' geometry). On
711
- * serialize, a non-identity `transform` is emitted as
712
- * `matrix(a b c d e f)`.
713
- */
714
- interface SvgGroupNode {
715
- kind: 'group';
716
- children: SvgNode[];
717
- transform?: Matrix;
718
- /** Clips the group's contents. Serializes to a `<clipPath>` def plus
719
- * `clip-path="url(#id)"`, and lives in the same space as `children` —
720
- * SVG applies the group's own `transform` to the clip as well.
721
- * A `<clipPath>` of more than one shape parses back as no clip: SVG
722
- * unions them and a `Path` holds one outline. */
723
- clip?: Path;
724
- opacity?: number;
725
- /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */
726
- meta?: NamespaceMeta;
727
- }
728
- /**
729
- * Text leaf node. Mirrors the kit's `TextPose` shape — a bounding box plus
730
- * text content, optional rich-text `runs` (per-range styling), and an
731
- * optional `TextStyle` for the node-wide defaults.
732
- *
733
- * Note on SVG text geometry: native `<text>` flows from a baseline; it
734
- * doesn't have width/height attributes. The serializer emits
735
- * `dominant-baseline="text-before-edge"` so `y` is the top of the text
736
- * box, plus `data-weasel-width` / `data-weasel-height` so weasel's
737
- * explicit box dimensions round-trip losslessly. External SVG text
738
- * (lacking the data-* attrs) imports with the width the kit's text layout
739
- * measures — an em-based estimate when no registered font can — and
740
- * `height = fontSize * lineHeight * (lineCount || 1)`.
741
- *
742
- * `x` here is always the box's left edge. In the SVG it is the
743
- * `text-anchor` point, and the parser and serializer convert between them.
744
- */
745
- interface SvgTextNode {
746
- kind: 'text';
747
- x: number;
748
- y: number;
749
- width: number;
750
- height: number;
751
- /** Plain text. When `runs` is set, `runsToPlainText(runs)` must equal `text`. */
752
- text: string;
753
- /** Optional per-range styling — same shape as `TextPose.runs`. */
754
- runs?: StyledRun[];
755
- /** Node-wide typography. Defaults applied at render time via `resolveTextStyle`. */
756
- style?: TextStyle;
757
- /** Where the laid-out text sits inside the box — `kit:text`'s
758
- * `data.verticalAlign`. SVG text has no box to align in, so this rides in
759
- * `data-weasel-vertical-align` and other readers draw the text top-aligned. */
760
- verticalAlign?: TextVerticalAlign;
761
- /**
762
- * Node-wide glyph paint, the `FillStyle` / `Stroke` a kit text node holds
763
- * in `data.fill` / `data.stroke`. Not `SvgPaint`, which is the path
764
- * nodes' shape — a text paint reaches the renderer through the runs, and
765
- * `StyledRun.fill` / `.stroke` override these per range.
766
- *
767
- * `null` is SVG's `fill="none"`: outline-only text, painted by its stroke
768
- * alone. Absent takes the default black.
769
- */
770
- fill?: FillStyle | null;
771
- stroke?: Stroke;
772
- /** Element-level opacity (`opacity="..."`), 0..1. */
773
- opacity?: number;
774
- /** Element-level rotation in **radians**, pivoting around the unrotated
775
- * AABB center `(x + width/2, y + height/2)`. Emitted as SVG
776
- * `transform="rotate(angleDegrees cx cy)"`. */
777
- rotation?: number;
778
- /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */
779
- meta?: NamespaceMeta;
780
- }
781
- /**
782
- * Raster-image leaf — an SVG `<image>`. `href` is the element's `href` (or
783
- * legacy `xlink:href`) verbatim: an external URL or a `data:` URI. The
784
- * package neither fetches nor decodes it, so an external URL round-trips as
785
- * a reference and only resolves when something downstream loads it.
786
- *
787
- * SVG's `preserveAspectRatio` is not modeled; the box is taken literally.
788
- *
789
- * With a `source` rect or a flip, the element is written as a `<g
790
- * data-weasel-image>` holding a nested `<svg>` viewport at the box, whose
791
- * `viewBox` is the source window over a unit-square `<image>` — plain SVG 1.1,
792
- * which any reader crops and mirrors the same way, and which `parseSvg` reads
793
- * back as one image node.
794
- */
795
- interface SvgImageNode {
796
- kind: 'image';
797
- href: string;
798
- x: number;
799
- y: number;
800
- width: number;
801
- height: number;
802
- /** The part of the bitmap drawn into the box, as fractions of the bitmap's
803
- * width and height from its top-left. Omitted draws the whole bitmap.
804
- * Fractions rather than bitmap pixels because this package never decodes
805
- * the image, so it cannot know its size. */
806
- source?: {
807
- x: number;
808
- y: number;
809
- width: number;
810
- height: number;
811
- };
812
- /** Mirror the drawn region within the box, as `ImageDrawCommand` does. The
813
- * box does not move. */
814
- flipX?: boolean;
815
- flipY?: boolean;
816
- /** Element-level opacity (`opacity="..."`), 0..1. */
817
- opacity?: number;
818
- /** Element-level rotation in **radians**, pivoting around the unrotated
819
- * AABB center `(x + width/2, y + height/2)`. Emitted as SVG
820
- * `transform="rotate(angleDegrees cx cy)"`. */
821
- rotation?: number;
822
- /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */
823
- meta?: NamespaceMeta;
824
- }
825
- /** Discriminated-union node — the leaf of the public tree. */
826
- type SvgNode = SvgPathNode | SvgGroupNode | SvgTextNode | SvgImageNode;
827
-
828
147
  /**
829
148
  * One mark as SVG nodes, converted from the very commands the pane paints.
830
149
  *
@@ -832,10 +151,7 @@ type SvgNode = SvgPathNode | SvgGroupNode | SvgTextNode | SvgImageNode;
832
151
  * and this is a translation of it. `serializeSvg` turns the result into a
833
152
  * document.
834
153
  */
835
- declare function markSvgNodes(m: PaintableMark, content: {
836
- w: number;
837
- h: number;
838
- }, style?: MarkStyle): SvgNode[];
154
+ declare function markSvgNodes(m: PaintableMark, style?: MarkStyle, scale?: View['scale']): SvgNode[];
839
155
 
840
156
  /** Props for `<AnnotationOverlay>`. */
841
157
  interface AnnotationOverlayProps {
@@ -1079,7 +395,7 @@ type LabProps = LabBaseProps & ({
1079
395
  });
1080
396
  /** The lab runtime: opens the store, provides it, and renders one trial
1081
397
  * per record in a grid. Each trial runs one of `instruments`. */
1082
- declare function Lab(props: LabProps): string | number | bigint | boolean | Iterable<ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | react.JSX.Element | null;
398
+ declare function Lab(props: LabProps): string | number | bigint | boolean | react.JSX.Element | Iterable<ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | null;
1083
399
 
1084
400
  /** Props for `<LabBoundary>`. */
1085
401
  interface LabBoundaryProps {
@@ -1175,6 +491,7 @@ type TrialLayout = Record<string, {
1175
491
  rows?: number;
1176
492
  };
1177
493
  }>;
494
+ /** Props for `Workspace`. */
1178
495
  interface WorkspaceProps {
1179
496
  children: ReactNode;
1180
497
  /**
@@ -1203,7 +520,7 @@ interface WorkspaceProps {
1203
520
  padding?: number;
1204
521
  /** Undocked sidebar panels to render alongside the trials. A `'tile'` panel
1205
522
  * joins the grid as a peer of the trials; a `'floating'` one goes into the
1206
- * floating zone above it. The body is portalled in by the trial that owns
523
+ * floating zone above it. The body is portaled in by the trial that owns
1207
524
  * it, so all this renders is the frame and the host. */
1208
525
  panels?: readonly PanelDescriptor[];
1209
526
  /**
@@ -1223,6 +540,20 @@ interface PanelDescriptor {
1223
540
  title: string;
1224
541
  as: 'tile' | 'floating';
1225
542
  }
543
+ /**
544
+ * Auto-balanced tiling of trials, `ceil(sqrt(n))` columns wide.
545
+ *
546
+ * Tiles are absolutely positioned at the rects `gridStrategy` computes, not
547
+ * laid out by CSS — `windease/styles.css` (folded into
548
+ * `@weasel-js/labkit/styles.css`) carries the rules that positioning depends on.
549
+ *
550
+ * `panels` are undocked sidebar sections. A `'tile'` panel is registered as a
551
+ * peer of the trials under `PANEL_KIND`, so the grid places and resizes it like
552
+ * one; a `'floating'` panel goes in the overlay above. Either way this renders
553
+ * only the frame and an empty host: the section's content is portaled in by
554
+ * the trial that owns it, which is what keeps a torn-out section inside its
555
+ * trial's React tree instead of rebuilding it as a sibling.
556
+ */
1226
557
  declare function Workspace({ children, ids, panels, resizable, reorderable, onReorder, layout, onLayoutChange, gap, padding, viewport, }: WorkspaceProps): react.JSX.Element;
1227
558
 
1228
559
  /** The specimen's sections, in page order. */
@@ -1240,6 +571,7 @@ declare function Specimen({ className }: {
1240
571
  /** The 2D view labkit has always shipped, and what a trial gets when it names no
1241
572
  * other. Re-exported under its own name so a consumer can say which it means. */
1242
573
  type ViewTransform2D = ViewTransform;
574
+ /** Zoom 1, no pan. */
1243
575
  declare const DEFAULT_VIEW: ViewTransform2D;
1244
576
  /** A trial's view is opaque to labkit, so anything that needs the 2D shape — the
1245
577
  * zoom chrome, `CanvasStack` — asks for it and handles not getting it. */
@@ -1252,6 +584,19 @@ declare function as2DView(view: unknown): ViewTransform2D | null;
1252
584
  */
1253
585
  declare const interstellarTheme: Theme;
1254
586
 
587
+ /**
588
+ * A trial's loupe switch, as a lens mounted inside the trial finds it. The
589
+ * trial offers its toolbar toggle while at least one lens has called `mount`,
590
+ * and every lens reads `on` as whether it is turned on.
591
+ */
592
+ interface LoupeSwitch {
593
+ on: boolean;
594
+ /** Reports a lens mounted; the returned function reports it gone. */
595
+ mount: () => () => void;
596
+ }
597
+ /** The loupe switch of the trial around the caller, or `null` outside one. */
598
+ declare const LoupeSwitchContext: react.Context<LoupeSwitch | null>;
599
+
1255
600
  /** Props for `<Trial>`. */
1256
601
  interface TrialProps {
1257
602
  id: string;
@@ -1283,6 +628,7 @@ interface LoupeBindings {
1283
628
  on: boolean;
1284
629
  toggle: () => void;
1285
630
  }
631
+ /** The trial's undo history as its chrome sees it. */
1286
632
  interface UndoBindings {
1287
633
  canUndo: boolean;
1288
634
  canRedo: boolean;
@@ -1298,8 +644,8 @@ interface TrialChromeProps {
1298
644
  undoBindings?: UndoBindings;
1299
645
  /** Supplied when the instrument declares a `job`. */
1300
646
  job?: JobHandle;
1301
- /** Supplied when the instrument declares a `loupe`. The lens itself is the
1302
- * trial's to mount; the chrome only offers the switch. */
647
+ /** Supplied while a lens is mounted in the trial. The lens itself is the
648
+ * instrument's to mount; the chrome only offers the switch. */
1303
649
  loupe?: LoupeBindings;
1304
650
  /** Contributions the trial runtime itself adds — the drag palette and the
1305
651
  * layer list, which depend on runtime state the instrument cannot reach. */
@@ -1319,5 +665,5 @@ interface TrialChromeProps {
1319
665
  * each region its slice. */
1320
666
  declare function TrialChrome({ trialId, record, instrument, isLastTrial, undoBindings, job, loupe, trialChrome, chrome, suppress, activeToolId, setActiveTool, children, }: TrialChromeProps): react.JSX.Element;
1321
667
 
1322
- export { ANNOTATION_TOOLS, ANNOTATION_WEASEL_TOOLS, AnnotationData, AnnotationKind, AnnotationMeaning, AnnotationOverlay, AnnotationTarget, AnnotationTargets, AnnotationsApi, AnnotationsCapability, AnnotationsContext, CaptureOptions, CaptureResult, CaptureSource, CloseIcon, CollapseIcon, ConfigField, ConfigRule, ConfigSchema, ControlRenderer, CurveField, DEFAULT_VIEW, ExpandIcon, ExportMenu, IconProps, Instrument, InstrumentList, JobHandle, Jog, Lab, LabBoundary, LabContribution, LabDensity, LabMode, LabPalette, LabRoot, LabShell, LabSwitcher, LabZoom, MarkList, MarkScene, MarkStyle, PaintableMark, PauseIcon, PlayIcon, PropertyControl, PropertyField, PropertyGroup, PropertyListPack, PropertyRowLayout, ResetIcon, SPECIMEN_SECTIONS, Specimen, SplitProps, StepBackIcon, StepForwardIcon, StopIcon, StorageAdapter, Subpanel, TokenPanel, Trial, TrialBody, TrialChrome, TrialContribution, TrialInfo, TrialRecord, TrialTool, ViewTransform, Workspace, WorldRect, annotationToolInfo, as2DView, capturePlan, captureTarget, composeCaptureSvg, createMarkDrawOne, currentPage, defineInstrument, fitView, fromWeaselView, inferTokenType, interstellarTheme, isStale, markSvgNodes, refitScale, resolveMarkStyle, seenFrom, toWeaselView, useAnnotations, useAnnotationsOptional, validateConfigSchema };
1323
- export type { AnnotationOverlayProps, AnnotationTargetsProps, AnnotationToolInfo, CaptureArgs, CapturePlan, ComposeSvgArgs, ContentSize, CurveFieldProps, CurveMark, InstrumentSpec, JogProps, LabBoundaryProps, LabPage, LabPaletteProps, LabProps, LabRootProps, LabShellProps, LabSwitcherProps, MarkDrawOptions, MarkListProps, PaneSize, PanelDescriptor, PropertyControlProps, PropertyFieldProps, PropertyGroupProps, PropertyOption, SubpanelProps, TokenCategory, TokenEntry, TokenPanelProps, TokenScale, TokenScaleRule, TrialBodyProps, TrialChromeProps, TrialLayout, TrialProps, UndoBindings, ValidationResult, ViewTransform2D, WorkspaceProps };
668
+ export { ANNOTATION_TOOLS, ANNOTATION_WEASEL_TOOLS, AnnotationData, AnnotationKind, AnnotationMeaning, AnnotationOverlay, AnnotationTarget, AnnotationTargets, AnnotationsApi, AnnotationsCapability, AnnotationsContext, CaptureOptions, CaptureResult, CaptureSource, ConfigField, ConfigRule, ConfigSchema, ControlRenderer, DEFAULT_VIEW, ExportMenu, Instrument, InstrumentList, JobHandle, Lab, LabBoundary, LabContribution, LabDensity, LabMode, LabPalette, LabRoot, LabShell, LabSwitcher, LabZoom, LoupeSwitchContext, MarkList, MarkScene, MarkStyle, PaintableMark, SPECIMEN_SECTIONS, Specimen, SplitProps, StorageAdapter, Trial, TrialBody, TrialChrome, TrialContribution, TrialInfo, TrialRecord, TrialTool, ViewTransform, Workspace, WorldRect, annotationToolInfo, as2DView, capturePlan, captureTarget, composeCaptureSvg, createMarkDrawOne, currentPage, defineInstrument, fitView, fromWeaselView, interstellarTheme, isStale, markSvgNodes, resolveMarkStyle, seenFrom, toWeaselView, useAnnotations, useAnnotationsOptional, validateConfigSchema };
669
+ export type { AnnotationOverlayProps, AnnotationTargetsProps, AnnotationToolInfo, CaptureArgs, CapturePlan, ComposeSvgArgs, ContentSize, InstrumentSpec, LabBoundaryProps, LabPage, LabPaletteProps, LabProps, LabRootProps, LabShellProps, LabSwitcherProps, LoupeSwitch, MarkDrawOptions, MarkListProps, PaneSize, PanelDescriptor, TrialBodyProps, TrialChromeProps, TrialLayout, TrialProps, UndoBindings, ValidationResult, ViewTransform2D, WorkspaceProps };