@weasel-js/labkit 0.8.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/README.md +11 -3
  2. package/dist/_dts/{DrawCommand-DACv9lhe.d.ts → DrawCommand-BwRCZYuo.d.ts} +72 -6
  3. package/dist/_dts/{useExperimentState-eSvpwV_P.d.ts → useExperimentState-CJn2hHzd.d.ts} +6 -4
  4. package/dist/{chunk-SSMHPMDV.js → chunk-53XSBIUK.js} +12 -11
  5. package/dist/chunk-53XSBIUK.js.map +1 -0
  6. package/dist/{chunk-FBZCQXI2.js → chunk-FP5LYDVX.js} +1229 -1227
  7. package/dist/chunk-FP5LYDVX.js.map +1 -0
  8. package/dist/{chunk-OHGEOTCV.js → chunk-HNXVLKBG.js} +3 -3
  9. package/dist/{chunk-OHGEOTCV.js.map → chunk-HNXVLKBG.js.map} +1 -1
  10. package/dist/{chunk-6V7ROR7G.js → chunk-XVBXYKFJ.js} +1168 -557
  11. package/dist/chunk-XVBXYKFJ.js.map +1 -0
  12. package/dist/index.d.ts +37 -13
  13. package/dist/index.js +776 -27
  14. package/dist/index.js.map +1 -1
  15. package/dist/passthrough/weasel-canvas.d.ts +1 -1
  16. package/dist/passthrough/weasel-canvas.js +1 -1
  17. package/dist/passthrough/weasel-ui.d.ts +97 -69
  18. package/dist/passthrough/weasel-ui.js +2 -2
  19. package/dist/state/index.d.ts +2 -2
  20. package/dist/state/index.js +2 -2
  21. package/dist/styles.css +228 -287
  22. package/dist/ui/layers/index.js +3 -3
  23. package/package.json +4 -6
  24. package/src/canvas/CanvasStack.less +1 -1
  25. package/src/controls/ControlPanel.less +12 -12
  26. package/src/dragdrop/DragGhost.less +2 -2
  27. package/src/dragdrop/Palette.less +6 -6
  28. package/src/index.ts +2 -0
  29. package/src/lab/Lab.test.tsx +20 -15
  30. package/src/lab/Lab.tsx +33 -32
  31. package/src/lab/LabContext.ts +3 -3
  32. package/src/lab/LabShell.less +14 -14
  33. package/src/lab/LabShell.test.tsx +7 -20
  34. package/src/lab/LabShell.tsx +22 -13
  35. package/src/lab/WorkspaceGrid.less +1 -1
  36. package/src/lab/WorkspaceGrid.stories.tsx +4 -4
  37. package/src/lab/index.ts +1 -1
  38. package/src/lab/useSystemMode.ts +30 -0
  39. package/src/layers/LayerList.less +9 -9
  40. package/src/primitives/FpsMeter.less +5 -5
  41. package/src/primitives/ScaleIndicator.less +7 -7
  42. package/src/primitives/Sidebar.less +12 -12
  43. package/src/primitives/StatusBar.less +10 -10
  44. package/src/primitives/Toolbar.less +16 -16
  45. package/src/state/store.test.ts +17 -9
  46. package/src/state/store.ts +13 -10
  47. package/src/state/types.ts +5 -2
  48. package/src/theme/Interstellar.stories.less +20 -20
  49. package/src/theme/Interstellar.stories.tsx +44 -59
  50. package/src/theme/base.less +26 -26
  51. package/src/theme/interstellar.test.ts +30 -0
  52. package/src/theme/interstellar.tokens.json +57 -0
  53. package/src/theme/interstellar.ts +9 -0
  54. package/src/ui/layers/LayerStack.less +21 -21
  55. package/src/ui/properties/CurveField.less +5 -5
  56. package/src/ui/properties/EffectCard.tsx +2 -2
  57. package/src/ui/properties/PropertyGroup.less +6 -6
  58. package/src/ui/properties/PropertyPanel.less +70 -70
  59. package/src/ui/properties/SpeechBalloonPanels.stories.tsx +1 -1
  60. package/src/ui/properties/storyLayouts.tsx +1 -1
  61. package/src/workspace/Workspace.less +14 -14
  62. package/src/workspace/Workspace.stories.tsx +2 -2
  63. package/src/workspace/Workspace.test.tsx +2 -2
  64. package/dist/chunk-6V7ROR7G.js.map +0 -1
  65. package/dist/chunk-FBZCQXI2.js.map +0 -1
  66. package/dist/chunk-SSMHPMDV.js.map +0 -1
  67. package/dist/theme-interstellar.css +0 -25
  68. package/dist/theme-light.css +0 -13
  69. package/src/theme/interstellar.less +0 -34
  70. package/src/theme/light.less +0 -14
  71. package/src/theme/tokens.less +0 -85
@@ -1,6 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { Ref } from 'react';
3
- import { N as Node, V as View, D as DrawCommand, S as Scene, B as Bounds, a as ViewportDims, P as PathDrawCommand } from '../_dts/DrawCommand-DACv9lhe.js';
3
+ import { N as Node, V as View, D as DrawCommand, S as Scene, B as Bounds, a as ViewportDims, P as PathDrawCommand } from '../_dts/DrawCommand-BwRCZYuo.js';
4
4
 
5
5
  /**
6
6
  * `renderSceneToCanvas` — substrate for detached, read-only scene views
@@ -1,3 +1,3 @@
1
- export { FALLBACK_FIT_VIEW, MinimapCanvas, SceneViewCanvas, buildSceneViewCommands, computeFitView2 as computeFitView, computeIndicatorCommand, renderSceneToCanvas } from '../chunk-6V7ROR7G.js';
1
+ export { FALLBACK_FIT_VIEW, MinimapCanvas, SceneViewCanvas, buildSceneViewCommands, computeFitView2 as computeFitView, computeIndicatorCommand, renderSceneToCanvas } from '../chunk-XVBXYKFJ.js';
2
2
  //# sourceMappingURL=weasel-canvas.js.map
3
3
  //# sourceMappingURL=weasel-canvas.js.map
@@ -1,7 +1,7 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as react from 'react';
3
3
  import { ReactNode, CSSProperties, ButtonHTMLAttributes, ReactElement, MutableRefObject, PointerEvent as PointerEvent$1, KeyboardEvent, RefCallback } from 'react';
4
- import { V as View, D as DrawCommand, O as Op, b as NodeId, c as Path, S as Scene, H as History, B as Bounds } from '../_dts/DrawCommand-DACv9lhe.js';
4
+ import { V as View, D as DrawCommand, O as Op, b as NodeId, c as Path, S as Scene, H as History, B as Bounds } from '../_dts/DrawCommand-BwRCZYuo.js';
5
5
  import { TextFieldProps, ValidationResult, CheckboxProps as CheckboxProps$1, SwitchProps as SwitchProps$1, TabProps as TabProps$1, TabListProps as TabListProps$1, TabPanelProps as TabPanelProps$1, TabsProps as TabsProps$1, RadioProps as RadioProps$1, RadioGroupProps as RadioGroupProps$1, NumberFieldProps as NumberFieldProps$1, SelectProps as SelectProps$1, ListBoxItemProps, ComboBoxProps as ComboBoxProps$1, SliderProps as SliderProps$1, ModalOverlayProps, DialogProps as DialogProps$1 } from 'react-aria-components';
6
6
 
7
7
  /**
@@ -1157,6 +1157,31 @@ interface ModifierState {
1157
1157
  interface AffordanceBinding<TScratch = unknown> {
1158
1158
  initialScratch?: TScratch;
1159
1159
  }
1160
+ /**
1161
+ * What a **registered layer's** `hitTest` returns. Extends `AffordanceBinding`
1162
+ * so existing implementations keep typechecking; the added fields are how a
1163
+ * consumer's own chrome says the things kit chrome says through
1164
+ * `AffordanceRegion` — which cursor to show, and whether it owns the point
1165
+ * outright.
1166
+ */
1167
+ interface LayerHit<TScratch = unknown> extends AffordanceBinding<TScratch> {
1168
+ /** CSS cursor while the pointer is over this hit. Reaches the hover-cursor
1169
+ * pump as `AffordanceHit.cursor`, the same path kit chrome uses. */
1170
+ cursor?: string;
1171
+ /** `'exclusive'` bars every binding whose target doesn't consult the
1172
+ * affordance. Omitted means `'shared'` — today's behavior. Same name and
1173
+ * meaning as `AffordanceHit.strength`, which it becomes. */
1174
+ strength?: 'exclusive' | 'shared';
1175
+ /** Which gestures an exclusive claim bars. Omitted bars all of them. */
1176
+ claimedKinds?: readonly ClaimableGesture[];
1177
+ }
1178
+ /**
1179
+ * Gesture kinds an affordance claim can bar, in the spec vocabulary bindings
1180
+ * are written in. `'pointer'` is one token because `pointerDown` / `click` /
1181
+ * `drag` are a single press protocol — at the event level the first two are
1182
+ * the same `kind: 'pointerdown'`, told apart only by `stage`.
1183
+ */
1184
+ type ClaimableGesture = 'pointer' | 'doubleClick' | 'contextMenu' | 'longPress' | 'wheel';
1160
1185
 
1161
1186
  /**
1162
1187
  * Canvas size in CSS pixels — passed to `draw` for layers that anchor to
@@ -1235,7 +1260,7 @@ interface RenderLayer<TData> {
1235
1260
  /** Chrome-caps visibility predicate. When supplied, the layer must
1236
1261
  * not return a hit from any chrome element whose id reports
1237
1262
  * `false`. Absent → every element is hittable. */
1238
- isVisible?: (id: string) => boolean) => AffordanceBinding | null;
1263
+ isVisible?: (id: string) => boolean) => LayerHit | null;
1239
1264
  /**
1240
1265
  * Called on every pointermove when no gesture is currently captured.
1241
1266
  * Lets layers (e.g. HUD widgets) track hover state without participating
@@ -1880,6 +1905,7 @@ interface KeyHeldSpec {
1880
1905
  interface WheelSpec {
1881
1906
  kind: 'wheel';
1882
1907
  direction?: 'up' | 'down' | '*';
1908
+ target?: TargetSpec;
1883
1909
  mods?: ModSpec;
1884
1910
  phase?: PhaseSpec;
1885
1911
  }
@@ -2022,6 +2048,15 @@ interface Point2 {
2022
2048
  interface AffordanceHit {
2023
2049
  /** Discriminator string, e.g. `'handle:bottom-right'`. */
2024
2050
  kind: string;
2051
+ /** Id of whatever produced this hit — a kit affordance's `id`, or the
2052
+ * registered layer's id. Read only by the dispatcher's dead-claim warning today. */
2053
+ owner?: string;
2054
+ /** `'exclusive'` means no binding may act on this point unless its target
2055
+ * consults the affordance. `'shared'` (the default) competes on scope and
2056
+ * specificity as bindings always have. */
2057
+ strength?: 'exclusive' | 'shared';
2058
+ /** Which gestures an exclusive claim bars. Omitted bars all of them. */
2059
+ claimedKinds?: readonly ClaimableGesture[];
2025
2060
  /** World-space fixed/pivot point. For resize: opposite corner. For rotate: pivot. */
2026
2061
  fixedPoint?: {
2027
2062
  x: number;
@@ -2349,6 +2384,20 @@ interface OngoingInvoker {
2349
2384
  * the `Action` type. */
2350
2385
  type Invoker = ImmediateInvoker | OngoingInvoker;
2351
2386
 
2387
+ /**
2388
+ * GestureBinding — connects a GestureSpec to an Action id (with per-binding
2389
+ * options). Tools own arrays of these on their `bindings` field; ambient
2390
+ * gesture-bindings are registered globally.
2391
+ *
2392
+ * See `docs/superpowers/specs/2026-05-16-registry-unification-design.md`.
2393
+ */
2394
+
2395
+ interface GestureBinding {
2396
+ spec: GestureSpec;
2397
+ actionId: string;
2398
+ opts?: BindingOpts;
2399
+ }
2400
+
2352
2401
  /**
2353
2402
  * Pose composition for hierarchical scene graphs.
2354
2403
  *
@@ -3311,20 +3360,6 @@ interface DepSchema {
3311
3360
  */
3312
3361
  type DepName = keyof DepSchema;
3313
3362
 
3314
- /**
3315
- * GestureBinding — connects a GestureSpec to an Action id (with per-binding
3316
- * options). Tools own arrays of these on their `bindings` field; ambient
3317
- * gesture-bindings are registered globally.
3318
- *
3319
- * See `docs/superpowers/specs/2026-05-16-registry-unification-design.md`.
3320
- */
3321
-
3322
- interface GestureBinding {
3323
- spec: GestureSpec;
3324
- actionId: string;
3325
- opts?: BindingOpts;
3326
- }
3327
-
3328
3363
  type HandleKind = 'corner' | 'rotation' | 'anchor';
3329
3364
  type HitShape = {
3330
3365
  kind: 'rect';
@@ -3369,6 +3404,38 @@ interface DebugSink {
3369
3404
  clearSnap(): void;
3370
3405
  }
3371
3406
 
3407
+ /**
3408
+ * When an entry's bindings are live. A set, not one value: the hand tool is
3409
+ * palette-selectable AND engaged by holding space, and both hold at once.
3410
+ */
3411
+ interface Eligibility {
3412
+ /** Selectable as the focused entry — exclusive, one at a time. */
3413
+ focus?: boolean;
3414
+ /** Also live while this key is held. */
3415
+ offhand?: HotkeyTrigger;
3416
+ /** Live regardless of what is focused. */
3417
+ always?: boolean;
3418
+ /** Live only for input this entry's own affordances produced. */
3419
+ claimed?: boolean;
3420
+ /** Modality filter, applied wherever it would otherwise be live. */
3421
+ capabilities?: CapabilityTag[];
3422
+ }
3423
+ /**
3424
+ * A registry entry: what it contributes, and when it is eligible. Every role
3425
+ * is optional and independent — an entry that only routes input declares only
3426
+ * `bindings` and `actions`.
3427
+ */
3428
+ interface Contribution {
3429
+ id: string;
3430
+ eligibility: Eligibility;
3431
+ bindings?: GestureBinding[];
3432
+ actions?: Action[];
3433
+ overlay?: RenderLayer<unknown>;
3434
+ presentation?: ToolPresentation;
3435
+ /** Reflection escape hatch — the authored form, when there was one. */
3436
+ def?: unknown;
3437
+ }
3438
+
3372
3439
  /** Modifier-key snapshot at event dispatch time. `space` is included
3373
3440
  * because tools commonly use space as a hotkey-slot trigger and may
3374
3441
  * also want to read it as a flag mid-gesture. */
@@ -3418,6 +3485,10 @@ interface ToolCtx<TScratch = unknown> {
3418
3485
  debug?: DebugSink;
3419
3486
  scratch: TScratch;
3420
3487
  }
3488
+ /** Hotkey-slot trigger key. The slot is engaged while this key is held —
3489
+ * hence "hotkey": active as long as the key is hot. `null` (or omitted)
3490
+ * means the tool is not eligible for the hotkey slot. */
3491
+ type HotkeyTrigger = 'space' | 'alt' | 'ctrl' | 'meta' | 'shift';
3421
3492
  /** World-space AABB shape used by `previewBounds`. Alias of the kit-wide
3422
3493
  * `Bounds` type — the optional `rotation` field carries through so a tool
3423
3494
  * can report an oriented preview rect (e.g. mid-rotate). */
@@ -3426,8 +3497,8 @@ type ToolBounds = Bounds;
3426
3497
  * tool — consumers that render a palette (`<ToolPalette>`) read these
3427
3498
  * fields to display the tool; consumers that don't can ignore them.
3428
3499
  *
3429
- * Note: cursor is NOT here. The top-level `Tool.cursor` field below is
3430
- * already plumbed through `<Canvas>` to `style.cursor` on the host. */
3500
+ * Note: cursor is NOT here. `Tool.cursor` (inherited from `Contribution`)
3501
+ * is already plumbed through `<Canvas>` to `style.cursor` on the host. */
3431
3502
  interface ToolPresentation<TScratch = unknown> {
3432
3503
  /** Human-readable label, distinct from the `id`. Falls back to `id`. */
3433
3504
  label?: string;
@@ -3442,34 +3513,13 @@ interface ToolPresentation<TScratch = unknown> {
3442
3513
  * derives one from `Tool.keybinding` via its own formatter. */
3443
3514
  shortcut?: string;
3444
3515
  }
3445
- /** Full Tool record. */
3446
- interface Tool<TScratch = unknown> {
3447
- id: string;
3448
- /**
3449
- * App-level capability tags for modality. The `weasel-modes` package's
3450
- * `eligibleForMode(mode, capabilities)` predicate consumes these to decide
3451
- * whether the tool is usable in the active mode. Tags are extensible
3452
- * strings — apps can define their own. Untagged tools are treated as
3453
- * ineligible by all modes except those whose `allows` list includes
3454
- * every implicit-or-declared tag (i.e. `normal` in the default preset).
3455
- */
3456
- capabilities?: CapabilityTag[];
3457
- /**
3458
- * Actions this tool owns and needs registered while it is in the tools
3459
- * registry — e.g. polygon's `polygon.adjustSides`, which its own bindings
3460
- * reference by id.
3461
- *
3462
- * Declared here rather than registered by the hook with `useAction`,
3463
- * because tool hooks run wherever the consumer calls them — for
3464
- * `<SceneCanvas>` that is ABOVE `<ActionsProviderIfRoot>`, where
3465
- * `useActionsRegistry()` returns null and `useAction` silently no-ops. The
3466
- * result was a binding pointing at an action id nothing had registered, so
3467
- * the gesture fell through to whatever matched next (polygon's
3468
- * wheel/arrow-key side adjustment did nothing and `nudge.*` moved the
3469
- * selection instead). `<ToolActionsMounter>` registers these from inside
3470
- * the provider.
3471
- */
3472
- actions?: Action[];
3516
+ /**
3517
+ * The focus-declaring case of a `Contribution`: a mode the user switches
3518
+ * into, plus the hooks that only make sense for one (`initScratch`,
3519
+ * activate/deactivate, live preview, `cursor`). Everything else — bindings,
3520
+ * actions, overlay, presentation is inherited.
3521
+ */
3522
+ interface Tool<TScratch = unknown> extends Contribution {
3473
3523
  /** Optional caller-supplied key. Most built-in tools have their activation
3474
3524
  * key declared in `BUILTIN_SELECT_KEYS` in `useKeybindings.ts`; this field
3475
3525
  * is for tools that want their activation key to be configurable by the
@@ -3479,11 +3529,9 @@ interface Tool<TScratch = unknown> {
3479
3529
  * the invoker knows which tool to switch to). */
3480
3530
  keybinding?: ToolKeybinding;
3481
3531
  initScratch?: () => TScratch;
3532
+ cursor?: string | ((ctx: ToolCtx<TScratch>) => string);
3482
3533
  onActivate?: (ctx: ToolCtx<TScratch>) => void;
3483
3534
  onDeactivate?: (ctx: ToolCtx<TScratch>) => void;
3484
- cursor?: string | ((ctx: ToolCtx<TScratch>) => string);
3485
- /** Presentation metadata for tool palettes. See `ToolPresentation`. */
3486
- presentation?: ToolPresentation<TScratch>;
3487
3535
  /** Returns the in-flight preview pose for `id` if this tool is mid-gesture
3488
3536
  * on it; otherwise `null`. Lets `Canvas.helpersRef.getEffectivePose`
3489
3537
  * reflect live gesture state without reaching into hook internals. The
@@ -3501,26 +3549,6 @@ interface Tool<TScratch = unknown> {
3501
3549
  * consults this alongside `previewPose` to avoid double-rendering. Returns
3502
3550
  * `null` when no gesture is in flight. */
3503
3551
  previewIds?: () => Iterable<string> | null;
3504
- /** Optional overlay layer rendered on top of the scene/chrome whenever
3505
- * this tool is in any active slot (active, hotkey, or ambient).
3506
- * The layer's `draw` function reads from this tool's scratch via React
3507
- * closure (re-evaluated each render). Return early from `draw` to render
3508
- * nothing — typically gated on a scratch field like
3509
- * `if (!scratch.overlay) return`. */
3510
- overlay?: RenderLayer<unknown>;
3511
- /** Declarative gesture bindings — the tool's entire input surface. The
3512
- * gesture dispatcher consults these at active scope while this tool is
3513
- * active, and at hotkey scope while it is held. See
3514
- * `docs/superpowers/specs/2026-05-16-registry-unification-design.md`. */
3515
- bindings?: GestureBinding[];
3516
- /** Reflection escape hatch: when this `Tool` was produced by `defineTool`,
3517
- * the source `ToolDef` is attached here so introspection consumers
3518
- * (`buildRouteRegistry`, `findConflicts`, the toolkit-builder UI, the
3519
- * reflection demo) can read the authored form — `hookName` in particular,
3520
- * which the runtime `Tool` doesn't carry. Tools constructed without
3521
- * `defineTool` may leave this undefined. Typed as `unknown` to keep this
3522
- * file from importing the routing types — consumers cast at the use site. */
3523
- def?: unknown;
3524
3552
  }
3525
3553
  /** Internal alias for "a Tool of any scratch type" — used in registries and
3526
3554
  * dispatchers that hold tools of heterogeneous scratch shapes. `any` is
@@ -1,4 +1,4 @@
1
- export { m as ActionBar, s5 as ActionsBar, Ft as Badge, a as Button, o3 as Checkbox, p4 as ComboBox, m2 as ComboBoxItem, F as CurveEditor, l as DataGrid, c2 as Dialog, qe as EDGE_PROFILES, n as Field, u2 as Input, s2 as KeyCap, c as KeySequence, a2 as MINUS_SIGN, f3 as NumberField, s4 as OptionsBar, _ as Plot2D, n4 as PointPlotter, r as Powerline, u3 as Radio, l2 as RadioGroup, l3 as RangeSlider, p3 as Select, h as SelectItem, n2 as Sidebar, o4 as SidebarPanel, f2 as Slider, a3 as Switch, c3 as Tab, s6 as TabList, l4 as TabPanel, o6 as Tabs, s3 as ToggleBar, o5 as ToolButton, n3 as ToolGroup, _2 as ToolPalette, Re as chromaAt, u as detectPlatform, p as dlog, r2 as fieldClasses, o2 as formatNumber, d2 as formatShortcut, u4 as formatShortcutParts, o as inferKeycapKind, f as isDebugEnabled, e as keyGlyph, p2 as keySpecFromKey, d as keySpecsFromMods, Le as oklchToHex, Ie as paintGradientTrack, s as useReorderDragList } from '../chunk-FBZCQXI2.js';
2
- import '../chunk-6V7ROR7G.js';
1
+ export { m as ActionBar, s5 as ActionsBar, Ft as Badge, a as Button, o3 as Checkbox, p4 as ComboBox, m2 as ComboBoxItem, F as CurveEditor, l as DataGrid, c2 as Dialog, qe as EDGE_PROFILES, n as Field, u2 as Input, s2 as KeyCap, c as KeySequence, a2 as MINUS_SIGN, f3 as NumberField, s4 as OptionsBar, _ as Plot2D, n4 as PointPlotter, r as Powerline, u3 as Radio, l2 as RadioGroup, l3 as RangeSlider, p3 as Select, h as SelectItem, n2 as Sidebar, o4 as SidebarPanel, f2 as Slider, a3 as Switch, c3 as Tab, s6 as TabList, l4 as TabPanel, o6 as Tabs, s3 as ToggleBar, o5 as ToolButton, n3 as ToolGroup, _2 as ToolPalette, Re as chromaAt, u as detectPlatform, p as dlog, r2 as fieldClasses, o2 as formatNumber, d2 as formatShortcut, u4 as formatShortcutParts, o as inferKeycapKind, f as isDebugEnabled, e as keyGlyph, p2 as keySpecFromKey, d as keySpecsFromMods, Le as oklchToHex, p5 as paintGradientTrack, s as useReorderDragList } from '../chunk-FP5LYDVX.js';
2
+ import '../chunk-XVBXYKFJ.js';
3
3
  //# sourceMappingURL=weasel-ui.js.map
4
4
  //# sourceMappingURL=weasel-ui.js.map
@@ -1,5 +1,5 @@
1
- import { I as InstrumentSerializers, W as WorkspaceRecord, U as UndoStack, S as StorageAdapter } from '../_dts/useExperimentState-eSvpwV_P.js';
2
- export { C as CreateLabStoreOptions, E as ExperimentStateHandle, L as LabStore, a as LabStoreActions, b as LabStoreContext, c as LabStoreProvider, d as LabStoreState, e as SavedSnapshot, f as WorkspaceIdContext, g as WorkspaceIdProvider, h as createLabStore, i as createMemoryAdapter, l as localStorageAdapter, n as noneAdapter, s as sessionStorageAdapter, u as urlHashAdapter, j as useExperimentState, k as useLabStore, m as useWorkspaceId } from '../_dts/useExperimentState-eSvpwV_P.js';
1
+ import { I as InstrumentSerializers, W as WorkspaceRecord, U as UndoStack, S as StorageAdapter } from '../_dts/useExperimentState-CJn2hHzd.js';
2
+ export { C as CreateLabStoreOptions, E as ExperimentStateHandle, L as LabStore, a as LabStoreActions, b as LabStoreContext, c as LabStoreProvider, d as LabStoreState, e as SavedSnapshot, f as WorkspaceIdContext, g as WorkspaceIdProvider, h as createLabStore, i as createMemoryAdapter, l as localStorageAdapter, n as noneAdapter, s as sessionStorageAdapter, u as urlHashAdapter, j as useExperimentState, k as useLabStore, m as useWorkspaceId } from '../_dts/useExperimentState-CJn2hHzd.js';
3
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
  import { ReactNode } from 'react';
5
5
  import 'zustand/vanilla';
@@ -1,5 +1,5 @@
1
- import { createLabStore, LabStoreProvider, WorkspaceIdProvider } from '../chunk-SSMHPMDV.js';
2
- export { LabStoreContext, LabStoreProvider, WorkspaceIdContext, WorkspaceIdProvider, createLabStore, createMemoryAdapter, decodeUrlHash, deserializeWorkspaces, emptyUndoStack, encodeUrlHash, labStorageKey, localStorageAdapter, noneAdapter, serializeWorkspaces, sessionStorageAdapter, urlHashAdapter, useExperimentState, useLabStore, useWorkspaceId } from '../chunk-SSMHPMDV.js';
1
+ import { createLabStore, LabStoreProvider, WorkspaceIdProvider } from '../chunk-53XSBIUK.js';
2
+ export { LabStoreContext, LabStoreProvider, WorkspaceIdContext, WorkspaceIdProvider, createLabStore, createMemoryAdapter, decodeUrlHash, deserializeWorkspaces, emptyUndoStack, encodeUrlHash, labStorageKey, localStorageAdapter, noneAdapter, serializeWorkspaces, sessionStorageAdapter, urlHashAdapter, useExperimentState, useLabStore, useWorkspaceId } from '../chunk-53XSBIUK.js';
3
3
  import { useRef } from 'react';
4
4
  import { jsx } from 'react/jsx-runtime';
5
5