@weasel-js/labkit 1.4.0 → 1.4.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 (77) hide show
  1. package/dist/_dts/{CanvasStackContext-D6M0o8cQ.d.ts → CanvasStackContext-BIRUVVGH.d.ts} +1 -1
  2. package/dist/_dts/PrefsForm.d-CgxUequc.d.ts +20 -0
  3. package/dist/_dts/{frac-QS7XzvpG.d.ts → frac-X7mWgd7y.d.ts} +9 -3
  4. package/dist/_dts/{index-B2X21G1c.d.ts → index-FEa1MudK.d.ts} +1 -1
  5. package/dist/_dts/{types-C1Zw7s5P.d.ts → types-lg4TSCb2.d.ts} +2 -1
  6. package/dist/_dts/weasel-canvas-FJTFi3ZZ.d.ts +5041 -0
  7. package/dist/canvas/index.d.ts +15 -15
  8. package/dist/canvas/index.js +2 -2
  9. package/dist/chrome/index.d.ts +5 -5
  10. package/dist/chrome/index.js +5 -5
  11. package/dist/{chunk-W3KSUXXR.js → chunk-53AZ2O2N.js} +4 -4
  12. package/dist/{chunk-W3KSUXXR.js.map → chunk-53AZ2O2N.js.map} +1 -1
  13. package/dist/{chunk-4AMN4MMB.js → chunk-7TRFMIWX.js} +53 -39
  14. package/dist/chunk-7TRFMIWX.js.map +1 -0
  15. package/dist/{chunk-UD7TEHZT.js → chunk-BMQWLKOL.js} +6 -6
  16. package/dist/{chunk-UD7TEHZT.js.map → chunk-BMQWLKOL.js.map} +1 -1
  17. package/dist/{chunk-YQGQUBKA.js → chunk-D7QIPGEB.js} +3 -3
  18. package/dist/{chunk-YQGQUBKA.js.map → chunk-D7QIPGEB.js.map} +1 -1
  19. package/dist/{chunk-7VW3S44V.js → chunk-DG2IFMLA.js} +802 -222
  20. package/dist/chunk-DG2IFMLA.js.map +1 -0
  21. package/dist/{chunk-LN6JDUGB.js → chunk-HXXTULDN.js} +2 -2
  22. package/dist/{chunk-LN6JDUGB.js.map → chunk-HXXTULDN.js.map} +1 -1
  23. package/dist/{chunk-L5WBGUVR.js → chunk-J6SBFZYT.js} +2131 -2174
  24. package/dist/chunk-J6SBFZYT.js.map +1 -0
  25. package/dist/{chunk-XCBCZEBO.js → chunk-MIT3ISW4.js} +37 -31
  26. package/dist/chunk-MIT3ISW4.js.map +1 -0
  27. package/dist/{chunk-QR5V3AFG.js → chunk-MSR7EVS6.js} +5 -5
  28. package/dist/{chunk-QR5V3AFG.js.map → chunk-MSR7EVS6.js.map} +1 -1
  29. package/dist/{chunk-B5VWJBWM.js → chunk-OFCBEZMU.js} +3 -3
  30. package/dist/{chunk-B5VWJBWM.js.map → chunk-OFCBEZMU.js.map} +1 -1
  31. package/dist/{chunk-VHFQKAUL.js → chunk-PP7ZWAMV.js} +83 -75
  32. package/dist/chunk-PP7ZWAMV.js.map +1 -0
  33. package/dist/{chunk-Y2HK44TG.js → chunk-RLOXQZW3.js} +3 -3
  34. package/dist/{chunk-Y2HK44TG.js.map → chunk-RLOXQZW3.js.map} +1 -1
  35. package/dist/controls/index.d.ts +4 -3
  36. package/dist/controls/index.js +3 -3
  37. package/dist/dragdrop/index.d.ts +4 -4
  38. package/dist/dragdrop/index.js +2 -2
  39. package/dist/index.d.ts +8 -71
  40. package/dist/index.js +21 -21
  41. package/dist/index.js.map +1 -1
  42. package/dist/job/index.js +1 -1
  43. package/dist/layers/index.d.ts +5 -5
  44. package/dist/layers/index.js +3 -3
  45. package/dist/loupe/index.d.ts +6 -12
  46. package/dist/loupe/index.js +2 -2
  47. package/dist/passthrough/weasel-canvas.d.ts +3 -343
  48. package/dist/passthrough/weasel-canvas.js +1 -1
  49. package/dist/passthrough/weasel-ui.d.ts +40 -3086
  50. package/dist/passthrough/weasel-ui.js +2 -2
  51. package/dist/primitives/index.js +4 -4
  52. package/dist/styles.css +10 -0
  53. package/dist/surface/index.js +2 -2
  54. package/dist/ui/layers/index.js +2 -2
  55. package/dist/undo/index.d.ts +5 -4
  56. package/package.json +8 -8
  57. package/src/canvas/CanvasStack.tsx +8 -13
  58. package/src/canvas/useOrbit.test.ts +93 -1
  59. package/src/canvas/useOrbit.ts +41 -34
  60. package/src/canvas/usePanZoom.test.ts +102 -1
  61. package/src/canvas/usePanZoom.ts +54 -36
  62. package/src/job/useJob.ts +1 -1
  63. package/src/lab/Workspace.tsx +1 -1
  64. package/src/layers/LayerList.test.tsx +72 -1
  65. package/src/layers/LayerList.tsx +40 -32
  66. package/src/primitives/FloatingPanel.test.tsx +82 -0
  67. package/src/primitives/FloatingPanel.tsx +59 -41
  68. package/dist/_dts/DrawCommand-B3bskUsC.d.ts +0 -564
  69. package/dist/_dts/PrefsForm-BkUJZx0A.d.ts +0 -204
  70. package/dist/_dts/fitViewToBounds-dZ2UDB6e.d.ts +0 -21
  71. package/dist/_dts/shapeKinds-Cx_rxwsa.d.ts +0 -87
  72. package/dist/_dts/types-C-gh9Ap-.d.ts +0 -695
  73. package/dist/chunk-4AMN4MMB.js.map +0 -1
  74. package/dist/chunk-7VW3S44V.js.map +0 -1
  75. package/dist/chunk-L5WBGUVR.js.map +0 -1
  76. package/dist/chunk-VHFQKAUL.js.map +0 -1
  77. package/dist/chunk-XCBCZEBO.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import '../chunk-SBXNQW4G.js';
2
- export { m as ActionBar, r5 as ActionsBar, It as Badge, a3 as Button, h3 as Callout, c5 as CalloutTrigger, o as Checkbox, p3 as ComboBox, m2 as ComboBoxItem, F as CurveEditor, s as DataGrid, c as Dialog, n2 as DragHandleGlyph, Je as EDGE_PROFILES, n as Field, t as ICON_PATHS, r as Icon, u as Input, s2 as KeyCap, c2 as KeySequence, c3 as LayerStack, e2 as MINUS_SIGN, f as NumberField, r4 as OptionsBar, f2 as Plot2D, n5 as PointPlotter, r6 as Powerline, u2 as Radio, l as RadioGroup, l2 as RangeSlider, p as Select, h as SelectItem, n3 as Sidebar, s3 as SidebarPanel, _2 as Slider, a2 as Switch, c4 as Tab, s4 as TabList, l3 as TabPanel, o4 as Tabs, r3 as ToggleBar, o3 as ToolButton, n4 as ToolGroup, _4 as ToolPalette, Hn as chromaAt, u3 as detectPlatform, a as dlog, r2 as fieldClasses, t2 as formatNumber, d2 as formatShortcut, u4 as formatShortcutParts, o2 as inferKeycapKind, i as isDebugEnabled, b2 as isPrefLeaf, e as keyGlyph, p2 as keySpecFromKey, d as keySpecsFromMods, Vn as oklchToHex, v2 as paintGradientTrack, x2 as prefValueAtPath, i2 as useReorderDragList, a4 as useRovingTabIndex, S as visiblePrefSubtree } from '../chunk-L5WBGUVR.js';
3
- import '../chunk-7VW3S44V.js';
2
+ export { m as ActionBar, r5 as ActionsBar, Lt as Badge, a3 as Button, h3 as Callout, c5 as CalloutTrigger, o as Checkbox, p3 as ComboBox, m2 as ComboBoxItem, L as CurveEditor, s2 as DataGrid, c as Dialog, n2 as DragHandleGlyph, Je as EDGE_PROFILES, n as Field, t as ICON_PATHS, r as Icon, u as Input, s3 as KeyCap, c2 as KeySequence, c3 as LayerStack, e2 as MINUS_SIGN, f as NumberField, r4 as OptionsBar, f2 as Plot2D, n5 as PointPlotter, r6 as Powerline, u2 as Radio, l as RadioGroup, l2 as RangeSlider, p as Select, h as SelectItem, n3 as Sidebar, s4 as SidebarPanel, y2 as Slider, a2 as Switch, c4 as Tab, s5 as TabList, l3 as TabPanel, o4 as Tabs, r3 as ToggleBar, o3 as ToolButton, n4 as ToolGroup, _3 as ToolPalette, Hn as chromaAt, u3 as detectPlatform, a as dlog, r2 as fieldClasses, t2 as formatNumber, d2 as formatShortcut, u4 as formatShortcutParts, o2 as inferKeycapKind, i as isDebugEnabled, b2 as isPrefLeaf, e as keyGlyph, p2 as keySpecFromKey, d as keySpecsFromMods, Vn as oklchToHex, v2 as paintGradientTrack, x2 as prefValueAtPath, s as useReorderDragList, a4 as useRovingTabIndex, S as visiblePrefSubtree } from '../chunk-J6SBFZYT.js';
3
+ import '../chunk-DG2IFMLA.js';
4
4
  //# sourceMappingURL=weasel-ui.js.map
5
5
  //# sourceMappingURL=weasel-ui.js.map
@@ -1,8 +1,8 @@
1
- export { FloatingPanel, JobProgress, Legend, Sidebar } from '../chunk-4AMN4MMB.js';
2
- export { FpsMeter, ScaleIndicator, StatusBar, Toolbar, ZoomControl } from '../chunk-QR5V3AFG.js';
1
+ export { FloatingPanel, JobProgress, Legend, Sidebar } from '../chunk-7TRFMIWX.js';
2
+ export { FpsMeter, ScaleIndicator, StatusBar, Toolbar, ZoomControl } from '../chunk-MSR7EVS6.js';
3
3
  import '../chunk-SBXNQW4G.js';
4
- import '../chunk-L5WBGUVR.js';
4
+ import '../chunk-J6SBFZYT.js';
5
5
  import '../chunk-CQLQPQ4P.js';
6
- import '../chunk-7VW3S44V.js';
6
+ import '../chunk-DG2IFMLA.js';
7
7
  //# sourceMappingURL=index.js.map
8
8
  //# sourceMappingURL=index.js.map
package/dist/styles.css CHANGED
@@ -166,6 +166,11 @@
166
166
  --wzl-fg-inverse: var(--wzl-gray-900);
167
167
  --wzl-shadow: rgba(0, 0, 0, 0.6);
168
168
  --wzl-border-raised: var(--wzl-gray-400);
169
+ --wzl-line-subtle: color-mix(in srgb, var(--wzl-fg) 10%, transparent);
170
+ --wzl-line: color-mix(in srgb, var(--wzl-fg) 20%, transparent);
171
+ --wzl-line-strong: color-mix(in srgb, var(--wzl-fg) 40%, transparent);
172
+ --wzl-surface-hover: color-mix(in srgb, var(--wzl-fg) 10%, transparent);
173
+ --wzl-surface-pressed: color-mix(in srgb, var(--wzl-fg) 18%, transparent);
169
174
  }
170
175
 
171
176
  [data-wzl-theme='weasel'][data-wzl-mode='light'],
@@ -183,6 +188,11 @@
183
188
  --wzl-fg-inverse: var(--wzl-gray-50);
184
189
  --wzl-shadow: rgba(0, 0, 0, 0.18);
185
190
  --wzl-border-raised: var(--wzl-gray-400);
191
+ --wzl-line-subtle: color-mix(in srgb, var(--wzl-fg) 10%, transparent);
192
+ --wzl-line: color-mix(in srgb, var(--wzl-fg) 20%, transparent);
193
+ --wzl-line-strong: color-mix(in srgb, var(--wzl-fg) 40%, transparent);
194
+ --wzl-surface-hover: color-mix(in srgb, var(--wzl-fg) 10%, transparent);
195
+ --wzl-surface-pressed: color-mix(in srgb, var(--wzl-fg) 18%, transparent);
186
196
  }
187
197
 
188
198
  ._tooltip_1ev6z_1{z-index:1200;background:var(--wzl-surface);border:1px solid var(--wzl-border);border-radius:var(--wzl-radius-sm);color:var(--wzl-fg);font-family:var(--wzl-font-ui);font-size:var(--wzl-font-size-sm);max-width:260px;transition:opacity var(--wzl-motion-fast);padding:4px 8px;line-height:1.3;box-shadow:0 4px 16px #00000059}._tooltip_1ev6z_1[data-entering],._tooltip_1ev6z_1[data-exiting]{opacity:0}._arrow_1ev6z_22 svg{fill:var(--wzl-surface);stroke:var(--wzl-border);stroke-width:1px;display:block}._arrow_1ev6z_22[data-placement=bottom] svg{transform:rotate(180deg)}._arrow_1ev6z_22[data-placement=left] svg{transform:rotate(-90deg)}._arrow_1ev6z_22[data-placement=right] svg{transform:rotate(90deg)}._bar_1quk7_7{background:var(--wzl-surface);border:1px solid var(--wzl-border);border-radius:var(--wzl-radius-sm);-webkit-user-select:none;user-select:none;flex-direction:row;gap:1px;padding:2px;display:flex}._bar_1quk7_7._vertical_1quk7_18{flex-direction:column}._button_1quk7_22{border-radius:var(--wzl-radius-sm);width:28px;height:28px;color:var(--wzl-fg);cursor:default;background:0 0;border:0;justify-content:center;align-items:center;padding:0;display:inline-flex}._button_1quk7_22:hover:not([disabled]){background:var(--wzl-border)}._button_1quk7_22:active:not([disabled]){background:color-mix(in srgb, var(--wzl-border) 70%, transparent)}._button_1quk7_22[disabled]{opacity:.4;cursor:default}._button_1quk7_22>svg{display:block}._root_gmx9t_10{height:var(--tb-h,var(--wzl-control-h,24px));border-radius:var(--wzl-radius-pill);-webkit-user-select:none;user-select:none;touch-action:none;background:linear-gradient(#0000002e 0%,#0000000d 100%);padding:2px;display:inline-flex;overflow:hidden;box-shadow:inset 0 1px 2px #0006,0 1px #ffffff0f}._segment_gmx9t_32{min-width:0;font-family:var(--wzl-font-ui);font-weight:var(--wzl-font-weight-normal);font-size:var(--btn-fontsize,var(--wzl-font-size));color:var(--wzl-fg-muted);cursor:pointer;isolation:isolate;transition:color var(--wzl-motion-fast);background:0 0;border:none;border-radius:0;flex:1 1 0;justify-content:center;align-items:center;margin:0;padding:0 12px;line-height:1;display:inline-flex;position:relative;overflow:hidden}._segment_gmx9t_32:first-child{border-radius:var(--wzl-radius-pill) 0 0 var(--wzl-radius-pill)}._segment_gmx9t_32:last-child{border-radius:0 var(--wzl-radius-pill) var(--wzl-radius-pill) 0}._segment_gmx9t_32:only-child{border-radius:var(--wzl-radius-pill)}._segment_gmx9t_32:focus-visible{outline:2px solid var(--wzl-accent);outline-offset:-2px}._segment_gmx9t_32:disabled{opacity:.5;cursor:not-allowed}._segment_gmx9t_32:hover:not(:disabled):not(._segmentSelected_gmx9t_79){color:var(--wzl-fg)}._segmentSelected_gmx9t_79{background:linear-gradient(180deg, color-mix(in srgb, var(--wzl-accent) var(--btn-top-alpha,45%), transparent) 0%, color-mix(in srgb, var(--wzl-accent) var(--btn-upper-alpha,70%), transparent) calc(var(--btn-equator,52%) - var(--btn-equator-spread,12%)), color-mix(in srgb, var(--wzl-accent) var(--btn-equator-tint,95%), white) var(--btn-equator,52%), var(--wzl-accent) calc(var(--btn-equator,52%) + var(--btn-equator-spread,12%) * 1.6), color-mix(in srgb, var(--wzl-accent) var(--btn-base-tint,70%), black) 100%);-webkit-backdrop-filter:blur(var(--btn-blur,6px)) saturate(var(--btn-saturate,1.3));color:var(--wzl-fg-on-accent);text-shadow:0 1px 0 rgba(0, 0, 0, var(--btn-text-shadow,.35)), var(--btn-text-inset-x,0px) var(--btn-text-inset-y,1px) 0 rgba(0, 0, 0, var(--btn-text-inset,.55)), 0 0 6px rgba(0, 0, 0, calc(var(--btn-text-shadow,.35) * .5));box-shadow:inset 0 1px 0 rgba(255, 255, 255, var(--btn-inset-hi,.42)), inset 0 -1px 2px rgba(0, 0, 0, var(--btn-inset-lo,.3)), 0 0 0 1px rgba(0, 0, 0, var(--btn-rim,.22)), 0 1px 2px rgba(0, 0, 0, var(--btn-drop-near,.3)), 0 2px 4px rgba(0, 0, 0, calc(var(--btn-drop-far,.18) * .8))}._segmentSelected_gmx9t_79:before{content:"";inset:1px 1px var(--btn-gloss-bottom,50%) 1px;border-radius:inherit;background:linear-gradient(180deg, rgba(255, 255, 255, var(--btn-gloss-top,.42)) 0%, rgba(255, 255, 255, var(--btn-gloss-mid,.12)) 60%, #fff0 100%);pointer-events:none;z-index:1;border-bottom-right-radius:0;border-bottom-left-radius:0;position:absolute}._segmentSelected_gmx9t_79>*{z-index:2;position:relative}._size_sm_gmx9t_137{height:17px;padding:1px}._size_sm_gmx9t_137 ._segment_gmx9t_32{font-size:var(--wzl-font-size-sm);padding:0 8px}._variant_minimal_gmx9t_150{height:auto;box-shadow:none;background:0 0;border-radius:0;gap:2px;padding:0}._variant_minimal_gmx9t_150 ._segment_gmx9t_32{font-size:var(--wzl-font-size-sm);font-weight:var(--wzl-font-weight-medium);border-radius:var(--wzl-radius-sm);color:var(--wzl-fg-muted);padding:0 4px;line-height:1.4;transition:none}._variant_minimal_gmx9t_150 ._segment_gmx9t_32:first-child,._variant_minimal_gmx9t_150 ._segment_gmx9t_32:last-child,._variant_minimal_gmx9t_150 ._segment_gmx9t_32:only-child{border-radius:var(--wzl-radius-sm)}._variant_minimal_gmx9t_150 ._segment_gmx9t_32:hover:not(:disabled):not(._segmentSelected_gmx9t_79){color:var(--wzl-fg);background:var(--wzl-surface-hover)}._variant_minimal_gmx9t_150 ._segmentSelected_gmx9t_79{-webkit-backdrop-filter:none;color:var(--wzl-accent-fg,var(--wzl-accent));text-shadow:none;box-shadow:none;font-weight:var(--wzl-font-weight-medium);background:0 0}._variant_minimal_gmx9t_150 ._segmentSelected_gmx9t_79:before{content:none}._badge_16et2_1{vertical-align:baseline;align-items:baseline;gap:var(--badge-gap,4px);font-size:var(--badge-font-size,var(--wzl-font-size-xs));text-transform:uppercase;letter-spacing:.04em;color:var(--badge-fg,var(--wzl-fg-muted));--badge-edge:var(--wzl-border);--badge-fill:var(--wzl-surface);--badge-fg:var(--badge-edge);font:inherit;background:0 0;border:0;font-family:inherit;text-decoration:none;display:inline-flex;position:relative}._badge_16et2_1 *{text-decoration:none}._badge_16et2_1[data-size=md]{--badge-gap:6px;--badge-pad-x:10px;--badge-pad-y:3px;--badge-font-size:var(--wzl-font-size-sm)}._deco_16et2_33{pointer-events:none;width:100%;height:100%;position:absolute;inset:0;overflow:visible}._deco_16et2_33 .badge-fill{fill:var(--badge-fill);stroke:none}._deco_16et2_33 .badge-stroke{fill:none;stroke:var(--badge-edge);stroke-width:var(--badge-stroke-width,1px);vector-effect:non-scaling-stroke}._deco_16et2_33 .badge-focus{fill:none;stroke:var(--badge-edge);stroke-width:calc(var(--badge-stroke-width,1px) + 1px);vector-effect:non-scaling-stroke;opacity:.6}._deco_16et2_33 .badge-bevel-light{fill:#ffffff38;stroke:none}._deco_16et2_33 .badge-bevel-medium-light{fill:#ffffff1a;stroke:none}._deco_16et2_33 .badge-bevel-medium-dark{fill:#00000029;stroke:none}._deco_16et2_33 .badge-bevel-dark{fill:#00000052;stroke:none}._content_16et2_49{align-items:baseline;gap:inherit;z-index:1;display:inline-flex;position:relative}._badge_16et2_1[data-tone=accent]{--badge-edge:var(--wzl-accent-fg,var(--wzl-accent,#7fb069))}._badge_16et2_1[data-tone=info]{--badge-edge:#7ab8d4}._badge_16et2_1[data-tone=warn]{--badge-edge:#d4a574}._badge_16et2_1[data-tone=danger]{--badge-edge:var(--wzl-danger)}._badge_16et2_1[data-tone=muted]{--badge-edge:var(--wzl-fg-muted)}._badge_16et2_1[data-tone=neutral]{--badge-edge:var(--wzl-border);--badge-fg:var(--wzl-fg-muted)}._badge_16et2_1[data-variant=outline]{--badge-fill:var(--wzl-surface);--badge-fg:var(--badge-edge)}._badge_16et2_1[data-variant=solid]{--badge-fill:var(--badge-edge);--badge-fg:#fff;font-weight:var(--wzl-font-weight-bold)}._badge_16et2_1[data-variant=subtle]{--badge-fill:color-mix(in oklab, var(--badge-edge) 14%, transparent);--badge-fg:var(--badge-edge)}._badge_16et2_1[data-tone=neutral]:not([data-variant=solid]){--badge-fg:var(--wzl-fg-muted)}._badge_16et2_1{padding:calc(var(--badge-pad-y,1px) + var(--badge-inset-top,0px)) calc(var(--badge-pad-x,6px) + var(--badge-inset-right,0px)) calc(var(--badge-pad-y,1px) + var(--badge-inset-bottom,0px)) calc(var(--badge-pad-x,6px) + var(--badge-inset-left,0px))}._badge_16et2_1[data-shape=pill]{border-radius:var(--wzl-radius-pill);box-sizing:border-box;-webkit-box-decoration-break:slice;box-decoration-break:slice;display:inline}._badge_16et2_1[data-shape=pill] ._content_16et2_49,._badge_16et2_1[data-shape=plain] ._content_16et2_49{display:inline}._badge_16et2_1[data-shape=pill][data-variant=solid],._badge_16et2_1[data-shape=pill][data-variant=subtle]{background:var(--badge-fill)}._badge_16et2_1[data-shape=pill]{border:var(--badge-stroke-width,1px) solid transparent}._badge_16et2_1[data-shape=pill][data-variant=outline],._badge_16et2_1[data-shape=pill][data-variant=solid]{border-color:var(--badge-edge)}._badge_16et2_1[data-shape=pill][data-focused=true]{outline:2px solid color-mix(in oklab, var(--badge-edge) 60%, transparent);outline-offset:2px}._badge_16et2_1[data-shape=plain]{letter-spacing:.04em;text-transform:none;color:var(--badge-fg);-webkit-box-decoration-break:slice;box-decoration-break:slice;background:0 0;padding:0;display:inline}._badge_16et2_1[data-shape=plain][data-focused=true]{outline:2px solid color-mix(in oklab, var(--badge-edge) 60%, transparent);outline-offset:3px;border-radius:var(--wzl-radius-sm)}._badge_16et2_1[data-shape=plaque] ._content_16et2_49{text-shadow:0 1px #ffffff24,0 -.5px #00000080}button._badge_16et2_1,a._badge_16et2_1{cursor:pointer;border:0 solid #0000;outline:0}button._badge_16et2_1:hover,a._badge_16et2_1:hover{--badge-edge:color-mix(in oklab, var(--badge-edge) 88%, white)}@media (prefers-reduced-motion:reduce){button._badge_16et2_1:hover,a._badge_16et2_1:hover{--badge-edge:var(--badge-edge)}}._remove_16et2_161{width:14px;height:14px;color:var(--badge-fg);cursor:pointer;font:inherit;font-size:var(--wzl-font-size);vertical-align:middle;background:0 0;border:0;border-radius:50%;justify-content:center;align-items:center;margin-left:2px;padding:0;line-height:1;display:inline-flex}._remove_16et2_161:hover{background:color-mix(in oklab, var(--badge-fg) 20%, transparent)}._remove_16et2_161>svg{display:block}._badge_16et2_1[data-size=md] ._remove_16et2_161{width:16px;height:16px;font-size:var(--wzl-font-size-lg)}._badge_16et2_1[data-size=md] ._remove_16et2_161>svg{width:12px;height:12px}._root_1mpyk_1{-webkit-user-select:none;user-select:none;touch-action:none;flex-direction:column;gap:2px;display:flex;position:relative}._label_1mpyk_11{font:var(--wzl-font-weight-medium) var(--wzl-font-size-sm) / var(--wzl-leading-tight) var(--wzl-font-ui);color:var(--wzl-fg-muted)}._ruler_1mpyk_19{height:var(--be-ruler-height,20px);cursor:crosshair;position:relative}._tick_1mpyk_25{left:var(--be-at);background:var(--wzl-fg-subtle);pointer-events:none;width:1px;height:6px;position:absolute;bottom:0}._tickLabel_1mpyk_35{font:var(--wzl-font-weight-medium) var(--wzl-font-size-xs) / var(--wzl-leading-tight) var(--wzl-font-mono,ui-monospace, SFMono-Regular, Menlo, monospace);color:var(--wzl-fg-muted);white-space:nowrap;position:absolute;bottom:7px;left:0;transform:translate(-50%)}._bands_1mpyk_45{height:var(--be-band-height,34px);position:relative}._band_1mpyk_45{top:0;bottom:0;left:var(--be-from);width:calc(var(--be-to) - var(--be-from));background:var(--wzl-surface-raised);border:1px solid var(--wzl-border);border-radius:var(--wzl-radius-sm);color:var(--wzl-fg);font:var(--wzl-font-weight-medium) var(--wzl-font-size-sm) / var(--wzl-leading-tight) var(--wzl-font-ui,ui-sans-serif, system-ui, sans-serif);cursor:grab;justify-content:center;align-items:center;margin:0;padding:0 4px;display:flex;position:absolute;overflow:hidden}._band_1mpyk_45:hover{background:var(--wzl-surface-hover)}._band_1mpyk_45:active{cursor:grabbing}._band_1mpyk_45:focus-visible{outline:2px solid var(--wzl-accent);outline-offset:-2px}._band_1mpyk_45:first-of-type,._band_1mpyk_45:last-of-type{cursor:default}._selected_1mpyk_92{background:color-mix(in srgb, var(--wzl-accent) 22%, transparent);border-color:var(--wzl-accent);box-shadow:inset 0 0 0 1px var(--wzl-accent);color:var(--wzl-fg)}._bandContent_1mpyk_99{text-overflow:ellipsis;white-space:nowrap;pointer-events:none;overflow:hidden}._seam_1mpyk_107{left:var(--be-at);z-index:1;cursor:ew-resize;background:0 0;border:none;width:11px;margin-left:-5px;position:absolute;top:-3px;bottom:-3px}._seam_1mpyk_107:before{content:"";background:var(--wzl-border-strong);width:1px;position:absolute;top:0;bottom:0;left:5px}._seam_1mpyk_107:hover:before,._seam_1mpyk_107:focus-visible:before{background:var(--wzl-accent);width:2px}._seam_1mpyk_107:focus-visible{outline:2px solid var(--wzl-accent);outline-offset:0;border-radius:var(--wzl-radius-sm)}._button_wj58b_3{--btn-radius:calc(var(--btn-height) * .1);--btn-fontweight:var(--wzl-font-weight-medium);--btn-fontsize:var(--wzl-font-size);--btn-height:24px;--btn-padx:12px;--btn-top-alpha:45%;--btn-upper-alpha:70%;--btn-equator:52%;--btn-equator-spread:12%;--btn-equator-tint:95%;--btn-base-tint:70%;--btn-blur:6px;--btn-saturate:1.3;--btn-gloss-top:.42;--btn-gloss-mid:.12;--btn-gloss-bottom:50%;--btn-rim:.22;--btn-drop-near:.3;--btn-drop-far:.18;--btn-inset-hi:.42;--btn-inset-lo:.3;--btn-text-shadow:.35;--btn-text-inset:.55;--btn-text-inset-x:0px;--btn-text-inset-y:1px;border-radius:var(--btn-radius);font-family:var(--wzl-font-ui);font-weight:var(--btn-fontweight);font-style:normal;font-size:var(--btn-fontsize);height:var(--btn-height);padding:0 var(--btn-padx);cursor:pointer;-webkit-user-select:none;user-select:none;isolation:isolate;transition:filter var(--wzl-motion-fast), box-shadow var(--wzl-motion-fast), transform 80ms;border:none;justify-content:center;align-items:center;gap:6px;line-height:1;display:inline-flex;position:relative;overflow:hidden}._button_wj58b_3:before{content:"";inset:1px 1px var(--btn-gloss-bottom) 1px;border-top-left-radius:var(--btn-radius);border-top-right-radius:var(--btn-radius);background:linear-gradient(180deg, rgba(255, 255, 255, var(--btn-gloss-top)) 0%, rgba(255, 255, 255, var(--btn-gloss-mid)) 60%, #fff0 100%);pointer-events:none;z-index:1;transition:opacity var(--wzl-motion-fast);border-bottom-right-radius:0;border-bottom-left-radius:0;position:absolute}._button_wj58b_3>*{z-index:2;position:relative}._button_wj58b_3:focus-visible{outline:2px solid var(--wzl-focus-ring);outline-offset:1px}._button_wj58b_3:disabled{opacity:.5;cursor:not-allowed}._size_sm_wj58b_110{--btn-height:20px;--btn-padx:8px;--btn-fontsize:var(--wzl-font-size-sm)}._size_md_wj58b_111{--btn-height:24px;--btn-padx:12px;--btn-fontsize:var(--wzl-font-size)}._iconOnly_wj58b_113._size_sm_wj58b_110{--btn-padx:0;width:20px}._iconOnly_wj58b_113._size_md_wj58b_111{--btn-padx:0;width:24px}._variant_primary_wj58b_121{background:linear-gradient(180deg, color-mix(in srgb, var(--wzl-accent) var(--btn-top-alpha), transparent) 0%, color-mix(in srgb, var(--wzl-accent) var(--btn-upper-alpha), transparent) calc(var(--btn-equator) - var(--btn-equator-spread)), color-mix(in srgb, var(--wzl-accent) var(--btn-equator-tint), white) var(--btn-equator), var(--wzl-accent) calc(var(--btn-equator) + var(--btn-equator-spread) * 1.6), color-mix(in srgb, var(--wzl-accent) var(--btn-base-tint), black) 100%);-webkit-backdrop-filter:blur(var(--btn-blur)) saturate(var(--btn-saturate));color:var(--wzl-fg-on-accent);text-shadow:0 1px 0 rgba(0, 0, 0, var(--btn-text-shadow)), var(--btn-text-inset-x) var(--btn-text-inset-y) 0 rgba(0, 0, 0, var(--btn-text-inset)), 0 0 6px rgba(0, 0, 0, calc(var(--btn-text-shadow) * .5));box-shadow:inset 0 1px 0 rgba(255, 255, 255, var(--btn-inset-hi)), inset 0 -1px 2px rgba(0, 0, 0, var(--btn-inset-lo)), 0 0 0 1px rgba(0, 0, 0, var(--btn-rim)), 0 1px 2px rgba(0, 0, 0, var(--btn-drop-near)), 0 3px 6px rgba(0, 0, 0, var(--btn-drop-far))}._variant_primary_wj58b_121:hover:not(:disabled){filter:brightness(1.08)saturate(1.06)}._variant_primary_wj58b_121:active:not(:disabled){background:linear-gradient(180deg, color-mix(in srgb, var(--wzl-accent) 80%, black) 0%, color-mix(in srgb, var(--wzl-accent) 95%, black) 50%, color-mix(in srgb, var(--wzl-accent) 60%, white) 100%);box-shadow:inset 0 2px 4px #00000059, inset 0 -1px 0 #ffffff40, 0 0 0 1px rgba(0, 0, 0, calc(var(--btn-rim) + .06));transform:translateY(.5px)}._variant_primary_wj58b_121:active:before{opacity:.3}._variant_secondary_wj58b_168{background:linear-gradient(180deg, color-mix(in srgb, var(--wzl-fg) 25%, transparent) 0%, color-mix(in srgb, var(--wzl-fg) 10%, transparent) calc(var(--btn-equator) - var(--btn-equator-spread)), color-mix(in srgb, var(--wzl-surface-raised) 90%, white) var(--btn-equator), var(--wzl-surface-raised) calc(var(--btn-equator) + var(--btn-equator-spread) * 1.6), color-mix(in srgb, var(--wzl-surface-sunken) 80%, black) 100%);-webkit-backdrop-filter:blur(var(--btn-blur)) saturate(var(--btn-saturate));color:var(--wzl-fg);text-shadow:0 1px 0 rgba(0, 0, 0, calc(var(--btn-text-shadow) * .7)), var(--btn-text-inset-x) var(--btn-text-inset-y) 0 rgba(0, 0, 0, calc(var(--btn-text-inset) * .7));box-shadow:inset 0 1px 0 rgba(255, 255, 255, calc(var(--btn-inset-hi) * .5)), inset 0 -1px 2px rgba(0, 0, 0, calc(var(--btn-inset-lo) * .83)), 0 0 0 1px rgba(0, 0, 0, calc(var(--btn-rim) + .03)), 0 1px 2px rgba(0, 0, 0, calc(var(--btn-drop-near) * .93)), 0 3px 6px rgba(0, 0, 0, calc(var(--btn-drop-far) * .89))}._variant_secondary_wj58b_168:hover:not(:disabled){filter:brightness(1.1)}._variant_secondary_wj58b_168:active:not(:disabled){background:linear-gradient(180deg, var(--wzl-surface-sunken) 0%, var(--wzl-surface-raised) 100%);transform:translateY(.5px);box-shadow:inset 0 2px 4px #0006,0 0 0 1px #0000004d}._variant_secondary_wj58b_168:active:before{opacity:.2}._variant_ghost_wj58b_203{color:var(--wzl-fg);box-shadow:none;background:0 0}._variant_ghost_wj58b_203:before{display:none}._variant_ghost_wj58b_203:hover:not(:disabled){background:var(--wzl-surface-hover)}._variant_ghost_wj58b_203:active:not(:disabled){background:var(--wzl-surface-pressed)}._fullWidth_wj58b_220{width:100%}._loading_wj58b_221 ._label_wj58b_221{opacity:.7}._iconSlot_wj58b_225{flex:none;justify-content:center;align-items:center;display:inline-flex}._size_sm_wj58b_110 ._iconSlot_wj58b_225>svg{width:12px;height:12px}._size_md_wj58b_111 ._iconSlot_wj58b_225>svg{width:14px;height:14px}._label_wj58b_221{display:inline-block}._spinner_wj58b_239{justify-content:center;align-items:center;animation:.7s linear infinite _wzl-btn-spin_wj58b_1;display:inline-flex}@keyframes _wzl-btn-spin_wj58b_1{to{transform:rotate(360deg)}}._anchor_vtcyj_1{pointer-events:none;position:fixed}._popover_vtcyj_6{z-index:1200;--callout-accent:var(--wzl-accent-strong);background:var(--wzl-surface);border:1px solid var(--callout-accent);border-radius:var(--wzl-radius-md);color:var(--wzl-fg);font-family:var(--wzl-font-ui);max-width:320px;transition:opacity var(--wzl-motion-fast);box-shadow:0 12px 40px #0006}._popover_vtcyj_6[data-entering],._popover_vtcyj_6[data-exiting]{opacity:0}._toneWarning_vtcyj_25{--callout-accent:var(--wzl-warning,#d99a3f)}._toneDanger_vtcyj_29{--callout-accent:var(--wzl-danger)}._arrow_vtcyj_33 svg{fill:var(--wzl-surface);stroke:var(--callout-accent);stroke-width:1px;display:block}._arrow_vtcyj_33[data-placement=bottom] svg{transform:rotate(180deg)}._arrow_vtcyj_33[data-placement=left] svg{transform:rotate(-90deg)}._arrow_vtcyj_33[data-placement=right] svg{transform:rotate(90deg)}._dialog_vtcyj_52{max-height:inherit;outline:none;flex-direction:column;display:flex}._header_vtcyj_59{align-items:center;gap:8px;padding:10px 12px 0;display:flex}._title_vtcyj_66{font-size:var(--wzl-font-size);font-weight:var(--wzl-font-weight-bold);flex:1;margin:0}._close_vtcyj_73{color:var(--wzl-fg-muted);font-size:var(--wzl-font-size-lg);cursor:pointer;border-radius:var(--wzl-radius-sm);background:0 0;border:none;flex:none;padding:2px 4px;line-height:1}._close_vtcyj_73:hover{color:var(--wzl-fg)}._body_vtcyj_89{font-size:var(--wzl-font-size);padding:8px 12px 10px;line-height:1.4;overflow-y:auto}._footer_vtcyj_96{justify-content:flex-end;gap:8px;padding:0 12px 10px;display:flex}._checkbox_w5y2z_1{cursor:pointer;font-family:var(--wzl-font-ui);font-size:var(--wzl-font-size);color:var(--wzl-fg);-webkit-user-select:none;user-select:none;align-items:center;gap:8px;display:inline-flex}._checkbox_w5y2z_1[data-disabled]{opacity:.5;cursor:not-allowed}._box_w5y2z_18{background:var(--wzl-surface-sunken);border:1px solid var(--wzl-border-strong);border-radius:var(--wzl-radius-sm);width:14px;height:14px;transition:background-color var(--wzl-motion-fast), border-color var(--wzl-motion-fast), box-shadow var(--wzl-motion-fast);flex:none;position:relative}._checkbox_w5y2z_1[data-focus-visible] ._box_w5y2z_18{box-shadow:0 0 0 2px var(--wzl-focus-ring)}._checkbox_w5y2z_1[data-hovered]:not([data-disabled]) ._box_w5y2z_18{border-color:var(--wzl-fg-muted)}._checkbox_w5y2z_1[data-selected] ._box_w5y2z_18,._checkbox_w5y2z_1[data-indeterminate] ._box_w5y2z_18{background:var(--wzl-accent-strong);border-color:var(--wzl-accent-strong)}._checkbox_w5y2z_1[data-invalid] ._box_w5y2z_18{border-color:var(--wzl-danger)}._checkmark_w5y2z_47{color:var(--wzl-fg-on-accent);opacity:0;pointer-events:none;position:absolute;inset:0}._checkbox_w5y2z_1[data-selected] ._checkmark_w5y2z_47,._checkbox_w5y2z_1[data-indeterminate] ._checkmark_w5y2z_47{opacity:1}._label_w5y2z_60{line-height:1.2}._range_1uep0_9{appearance:none;width:100%;min-inline-size:48px;height:var(--wzl-range-box-h,12px);background:var(--wzl-range-bg,transparent);cursor:pointer;margin:0;padding:0}._range_1uep0_9::-webkit-slider-runnable-track{height:var(--wzl-slider-track-h);border-radius:var(--wzl-radius-sm);background:var(--wzl-range-track-bg,color-mix(in srgb, var(--wzl-accent) var(--wzl-slider-track-tint), transparent))}._range_1uep0_9::-moz-range-track{height:var(--wzl-slider-track-h);border-radius:var(--wzl-radius-sm);background:var(--wzl-range-track-bg,color-mix(in srgb, var(--wzl-accent) var(--wzl-slider-track-tint), transparent))}._range_1uep0_9::-webkit-slider-thumb{appearance:none;width:var(--wzl-slider-thumb-size);height:var(--wzl-slider-thumb-size);background:color-mix(in srgb, var(--wzl-accent) var(--wzl-slider-thumb-tint), transparent);margin-top:calc((var(--wzl-slider-track-h) - var(--wzl-slider-thumb-size)) / 2);border:none;border-radius:50%}._range_1uep0_9::-moz-range-thumb{width:var(--wzl-slider-thumb-size);height:var(--wzl-slider-thumb-size);background:color-mix(in srgb, var(--wzl-accent) var(--wzl-slider-thumb-tint), transparent);border:none;border-radius:50%}._range_1uep0_9:focus-visible{outline:2px solid var(--wzl-focus-ring);outline-offset:2px}._range_1uep0_9:disabled{cursor:not-allowed;opacity:.55}._alpha_1uep0_74::-webkit-slider-runnable-track{background:color-mix(in srgb, var(--wzl-accent) 10%, transparent)}._alpha_1uep0_74::-moz-range-track{background:color-mix(in srgb, var(--wzl-accent) 10%, transparent)}._alpha_1uep0_74:disabled::-webkit-slider-runnable-track{background:color-mix(in srgb, var(--wzl-fg) 5%, transparent)}._alpha_1uep0_74:disabled::-moz-range-track{background:color-mix(in srgb, var(--wzl-fg) 5%, transparent)}._alpha_1uep0_74:disabled::-webkit-slider-thumb{background:0 0}._alpha_1uep0_74:disabled::-moz-range-thumb{background:0 0}._range_1on6e_4{--wzl-range-bg:linear-gradient(to right, var(--wzl-accent) 0 var(--slider-fill,0%), var(--wzl-border-strong) var(--slider-fill,0%) 100%);--wzl-range-box-h:var(--wzl-slider-track-h);--wzl-range-track-bg:transparent;border-radius:var(--wzl-radius-pill);flex:1}._root_1bujp_1{align-items:center;gap:6px;display:inline-flex}._chip_1bujp_7{border-radius:var(--wzl-radius-sm);display:inline-flex;position:relative;overflow:hidden}._color_1bujp_14{border:1px solid var(--wzl-border,#444);border-radius:var(--wzl-radius-sm);cursor:pointer;background:0 0;block-size:20px;inline-size:28px;padding:0}._color_1bujp_14:focus-visible{border-color:var(--wzl-focus-ring);box-shadow:0 0 0 1px var(--wzl-focus-ring);outline:none}._root_1bujp_1[data-mixed] ._chip_1bujp_7:after{content:"";border-radius:var(--wzl-radius-sm);pointer-events:none;background:repeating-conic-gradient(var(--wzl-border,#666) 0% 25%, var(--wzl-surface,#2e2f36) 0% 50%) 50% / 8px 8px;position:absolute;inset:1px}._alphaRange_1bujp_46{flex:1}._alphaReadout_1bujp_50{text-align:end;min-inline-size:3ch;font-size:var(--wzl-font-size-sm);opacity:.7}._field_do2o0_1{font-family:var(--wzl-font-ui);color:var(--wzl-fg);flex-direction:column;gap:4px;display:flex}._label_do2o0_9{font-size:var(--wzl-font-size-sm);font-weight:var(--wzl-font-weight-medium);color:var(--wzl-fg);cursor:default}._hint_do2o0_16{font-size:var(--wzl-font-size-sm);color:var(--wzl-fg-subtle);line-height:1.4}._error_do2o0_22{font-size:var(--wzl-font-size-sm);color:var(--wzl-danger);line-height:1.4}._row_do2o0_28{flex-direction:row;align-items:center;gap:8px}._row_do2o0_28 ._label_do2o0_9{flex:1;min-width:0}._field_148rf_1{flex-direction:column;gap:4px;width:100%;min-width:0;display:flex}._frame_148rf_9{height:var(--wzl-field-h,var(--wzl-control-h));background:var(--wzl-surface-sunken);border:1px solid var(--wzl-border);border-radius:var(--wzl-radius-sm);color:var(--wzl-fg);font-family:var(--wzl-font-ui);font-size:var(--wzl-font-size);transition:border-color var(--wzl-motion-fast), box-shadow var(--wzl-motion-fast);align-items:stretch;line-height:1;display:flex;overflow:hidden}._frame_148rf_9:focus-within{border-color:var(--wzl-focus-ring);box-shadow:0 0 0 1px var(--wzl-focus-ring)}._field_148rf_1[data-invalid] ._frame_148rf_9{border-color:var(--wzl-danger)}._field_148rf_1[data-disabled] ._frame_148rf_9{opacity:.5;cursor:not-allowed}._frame_148rf_9 input{min-width:0;color:inherit;font:inherit;padding:0 var(--wzl-field-pad-x);background:0 0;border:none;outline:none;flex:1}._frame_148rf_9 input::placeholder{color:var(--wzl-fg-subtle)}._openButton_148rf_53{border:none;border-left:1px solid var(--wzl-border);width:22px;color:var(--wzl-fg-muted);cursor:pointer;background:0 0;justify-content:center;align-items:center;padding:0;display:inline-flex}._openButton_148rf_53[data-hovered]:not([data-disabled]){color:var(--wzl-fg)}._openButton_148rf_53 svg{width:10px;height:10px}._popover_148rf_75{min-width:var(--trigger-width);outline:none}._listbox_148rf_80{background:var(--wzl-surface-raised);border:1px solid var(--wzl-border);border-radius:var(--wzl-radius-md);max-height:280px;font-family:var(--wzl-font-ui);font-size:var(--wzl-font-size);outline:none;padding:4px;overflow:auto;box-shadow:0 8px 24px #0000004d}._option_148rf_93{border-radius:var(--wzl-radius-sm);cursor:pointer;color:var(--wzl-fg);outline:none;align-items:center;padding:4px 8px;display:flex}._option_148rf_93[data-focused]{background:var(--wzl-surface-hover)}._option_148rf_93[data-selected]{font-weight:var(--wzl-font-weight-medium)}._option_148rf_93[data-disabled]{opacity:.4;cursor:not-allowed}._empty_148rf_116{color:var(--wzl-fg-subtle);font-size:var(--wzl-font-size-sm);padding:6px 8px}._root_1djm7_1{--plot-bg:var(--wzl-surface-sunken);--plot-grid:var(--wzl-line);--plot-axis:var(--wzl-fg);background:var(--plot-bg);-webkit-user-select:none;user-select:none;touch-action:none;outline:none;display:block;overflow:visible}._root_1djm7_1:focus-visible{outline:2px solid var(--wzl-focus-ring);outline-offset:2px}._grid_1djm7_28{stroke:var(--plot-grid);stroke-width:1px;fill:none}._axis_1djm7_34{stroke:var(--plot-axis);stroke-width:var(--wzl-line-width);fill:none}._root_ybpym_1{--curve-line:var(--wzl-curve-color);--curve-line-width:var(--wzl-curve-width);--curve-fill:color-mix(in srgb, var(--curve-line) 30%, transparent);--curve-anchor-fill:var(--wzl-surface);--curve-anchor-stroke:var(--curve-line);--curve-anchor-radius:4;--curve-anchor-active-fill:var(--curve-line);--curve-pinned-fill:var(--wzl-fg-subtle)}._fill_ybpym_19{fill:var(--curve-fill);stroke:none;pointer-events:none}._curve_ybpym_25{stroke:var(--curve-line);stroke-width:var(--curve-line-width);fill:none;pointer-events:stroke}._anchor_ybpym_32{fill:var(--curve-anchor-fill);stroke:var(--curve-anchor-stroke);stroke-width:1.5px;cursor:grab}._anchor_ybpym_32:hover{fill:var(--curve-anchor-active-fill)}._anchor_ybpym_32._active_ybpym_43{fill:var(--curve-anchor-active-fill);cursor:grabbing}._anchor_ybpym_32._pinned_ybpym_48{fill:var(--curve-pinned-fill);cursor:default}._anchor_ybpym_32._locked_ybpym_55{cursor:not-allowed}._hidden_ybpym_71{display:none}._grid_1k5rv_1{width:100%;position:relative}._table_1k5rv_6{border-collapse:collapse;width:100%;font-size:var(--wzl-font-size-sm)}._table_1k5rv_6 th,._table_1k5rv_6 td{text-align:left;vertical-align:middle;padding:3px 6px}._table_1k5rv_6 tbody tr{border-bottom:1px solid var(--wzl-line-subtle)}._table_1k5rv_6 th{font-weight:var(--wzl-font-weight-bold);color:var(--wzl-fg-muted);background:var(--wzl-surface,#2a2018);z-index:1;border-bottom:1px solid var(--wzl-border);position:sticky;top:0}._sortButton_1k5rv_32{all:unset;cursor:pointer;-webkit-user-select:none;user-select:none;width:100%;display:block}._sortButton_1k5rv_32:hover{color:var(--wzl-fg,#e6e7e9)}._sortButton_1k5rv_32:focus-visible{outline:2px solid var(--wzl-focus-ring,var(--wzl-accent,#7fb069));outline-offset:-2px}._sortActive_1k5rv_44{color:var(--wzl-fg,#e6e7e9)}._empty_1k5rv_46{color:var(--wzl-fg-muted);text-align:center;padding:8px 0;font-style:italic}._handleCol_1k5rv_54{width:14px}._handleCell_1k5rv_55{cursor:grab;width:14px;color:var(--wzl-fg-muted);-webkit-user-select:none;user-select:none;text-align:center}._handleCell_1k5rv_55:active{cursor:grabbing}._dragging_1k5rv_64{opacity:.4}._dropBefore_1k5rv_66>td{box-shadow:inset 0 2px 0 0 var(--wzl-accent,#7fb069)}._dropAfter_1k5rv_67>td{box-shadow:inset 0 -2px 0 0 var(--wzl-accent,#7fb069)}._root_mv16o_1{-webkit-user-select:none;user-select:none;touch-action:none;position:relative}._row_mv16o_8{align-items:center;gap:8px;display:flex}._track_mv16o_14{min-width:0;height:var(--rp-track-height,24px);background:var(--wzl-surface-sunken);border:1px solid var(--wzl-border);border-radius:var(--wzl-radius-sm);cursor:var(--rp-track-cursor,crosshair);flex:1;position:relative}._trackInner_mv16o_25{border-radius:var(--wzl-radius-sm);position:absolute;inset:0;overflow:hidden}._thumb_mv16o_35{width:var(--rp-thumb-size,14px);margin-left:calc(var(--rp-thumb-size,14px) / -2);background:color-mix(in srgb, var(--wzl-fg-muted) 70%, transparent);border:1px solid var(--wzl-border-strong);border-radius:var(--wzl-radius-sm);cursor:ew-resize;-webkit-backdrop-filter:blur(3px);font:var(--wzl-font-weight-medium) var(--wzl-font-size-xs)/var(--wzl-leading-tight) ui-sans-serif, system-ui, sans-serif;font-variant-numeric:tabular-nums;color:var(--wzl-fg-inverse);text-shadow:0 0 2px #ffffffb3;justify-content:center;align-items:center;display:flex;position:absolute;top:-2px;bottom:-2px;box-shadow:0 1px 2px #0003}._slim_mv16o_68 ._thumb_mv16o_35{height:var(--rp-thumb-size);-webkit-backdrop-filter:none;box-shadow:none;background:color-mix(in srgb, var(--wzl-accent) var(--wzl-slider-thumb-tint), transparent);border:none;border-radius:50%;top:50%;bottom:auto;transform:translateY(-50%)}._thumb_mv16o_35:focus-visible{outline:2px solid var(--wzl-accent);outline-offset:1px}._thumbActive_mv16o_86{z-index:1}._readoutsBelow_mv16o_91{height:14px;margin-top:4px;position:relative}._readoutBelow_mv16o_97{font:var(--wzl-font-weight-medium) var(--wzl-font-size-xs)/var(--wzl-leading-tight) ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;color:var(--wzl-fg-muted);white-space:nowrap;position:absolute;transform:translate(-50%)}._readoutInline_mv16o_105{font:var(--wzl-font-weight-medium) var(--wzl-font-size-sm)/var(--wzl-leading-tight) ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;color:var(--wzl-fg-muted);vertical-align:middle;margin-left:8px;display:inline-block}._notched_mv16o_113{background:var(--thumb-svg,none);-webkit-backdrop-filter:none;box-shadow:none;filter:drop-shadow(0 1px 1px #00000040);--thumb-svg:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 30' preserveAspectRatio='none'%3E%3Cpolygon points='0,0 2.52,0 7,10.3 11.48,0 14,0 14,30 0,30' fill='rgba(255,255,255,0.62)' stroke='rgba(0,0,0,0.55)' stroke-width='0.75' stroke-linejoin='miter'/%3E%3C/svg%3E");background-color:#0000;background-repeat:no-repeat;background-size:100% 100%;border:none}._ticks_mv16o_132{pointer-events:none;position:absolute;inset:0}._tick_mv16o_132{top:var(--rp-tick-inset,20%);bottom:var(--rp-tick-inset,20%);width:var(--rp-tick-width,1px);margin-left:calc(var(--rp-tick-width,1px) / -2);border-radius:var(--wzl-radius-pill);background:var(--rp-tick-color,var(--wzl-border-strong));position:absolute}._root_159q7_1{--rp-tick-inset:0;--rp-tick-width:1px;--rp-tick-color:var(--wzl-border-strong);--rp-track-cursor:pointer;font-family:var(--wzl-font-ui);position:relative}._slider_159q7_12{width:100%}._labels_159q7_16{height:calc(var(--wzl-font-size-xs) * var(--wzl-leading-tight));margin-top:var(--wzl-space-xs);position:relative}._label_159q7_16{white-space:nowrap;font-size:var(--wzl-font-size-xs);line-height:var(--wzl-leading-tight);font-variant-numeric:tabular-nums;color:var(--wzl-fg-subtle);position:absolute;transform:translate(-50%)}._label_159q7_16[data-edge=start]{transform:none}._label_159q7_16[data-edge=end]{transform:translate(-100%)}._label_159q7_16[data-selected]{color:var(--wzl-fg);font-weight:var(--wzl-font-weight-medium)}._overlay_1og89_1{z-index:1000;opacity:0;transition:opacity var(--wzl-motion-fast);background:#0006;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}._overlay_1og89_1[data-entering]{opacity:0}._overlay_1og89_1[data-entering][data-rac]{opacity:1}._overlay_1og89_1[data-exiting]{opacity:0}._overlay_1og89_1[data-rac]:not([data-entering]):not([data-exiting]){opacity:1}._modal_1og89_29{background:var(--wzl-surface);border:1px solid var(--wzl-border);border-radius:var(--wzl-radius-md);color:var(--wzl-fg);font-family:var(--wzl-font-ui);outline:none;flex-direction:column;max-width:min(900px,100vw - 32px);max-height:calc(100vh - 32px);display:flex;box-shadow:0 24px 64px #00000073}._dialog_1og89_43{outline:none;flex-direction:column;flex:1;min-height:0;display:flex}._header_1og89_51{border-bottom:1px solid var(--wzl-border);flex:none;align-items:center;gap:12px;padding:14px 16px;display:flex}._title_1og89_60{font-size:var(--wzl-font-size);font-weight:var(--wzl-font-weight-bold);color:var(--wzl-fg);flex:1;margin:0}._close_1og89_68{border-radius:var(--wzl-radius-sm);width:22px;height:22px;color:var(--wzl-fg-muted);cursor:pointer;font-size:var(--wzl-font-size-lg);background:0 0;border:1px solid #0000;flex:none;justify-content:center;align-items:center;padding:0;line-height:1;display:inline-flex}._close_1og89_68:hover{background:var(--wzl-surface-hover);color:var(--wzl-fg)}._body_1og89_90{flex:1;min-height:0;padding:16px;overflow:auto}._footer_1og89_97{border-top:1px solid var(--wzl-border);flex:none;justify-content:flex-end;align-items:center;gap:8px;padding:12px 16px;display:flex}._field_1dbmd_1{flex-direction:column;gap:4px;width:100%;min-width:0;display:flex}._trigger_1dbmd_9{width:100%;height:var(--wzl-control-h);background:var(--wzl-surface-sunken);border:1px solid var(--wzl-border);border-radius:var(--wzl-radius-sm);color:var(--wzl-fg);font-family:var(--wzl-font-ui);font-size:var(--wzl-font-size);cursor:pointer;transition:border-color var(--wzl-motion-fast), box-shadow var(--wzl-motion-fast);align-items:center;gap:6px;padding:0 6px 0 10px;line-height:1;display:flex}._trigger_1dbmd_9[data-focus-visible]{border-color:var(--wzl-focus-ring);box-shadow:0 0 0 1px var(--wzl-focus-ring)}._field_1dbmd_1[data-invalid] ._trigger_1dbmd_9{border-color:var(--wzl-danger)}._trigger_1dbmd_9[data-disabled]{opacity:.5;cursor:not-allowed}._value_1dbmd_41{text-align:left;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}._value_1dbmd_41[data-placeholder]{color:var(--wzl-fg-subtle)}._chevron_1dbmd_54{width:10px;height:10px;color:var(--wzl-fg-muted);flex:none}._popover_1dbmd_61{min-width:var(--trigger-width);max-height:inherit;outline:none}._listbox_1dbmd_67{background:var(--wzl-surface-raised);border:1px solid var(--wzl-border);border-radius:var(--wzl-radius-md);max-height:280px;font-family:var(--wzl-font-ui);font-size:var(--wzl-font-size);outline:none;padding:4px;overflow:auto;box-shadow:0 8px 24px #0000004d}._option_1dbmd_80{border-radius:var(--wzl-radius-sm);cursor:pointer;color:var(--wzl-fg);outline:none;align-items:center;gap:8px;padding:4px 8px;display:flex}._option_1dbmd_80[data-focused]{background:var(--wzl-surface-hover)}._option_1dbmd_80[data-selected]{color:var(--wzl-fg);font-weight:var(--wzl-font-weight-medium)}._option_1dbmd_80[data-disabled]{opacity:.4;cursor:not-allowed}._check_1dbmd_105{opacity:0;flex:none;width:10px;height:10px}._option_1dbmd_80[data-selected] ._check_1dbmd_105{opacity:1}._root_164gt_6{height:var(--tb-h,var(--wzl-control-h,24px));border-radius:var(--wzl-radius-pill);-webkit-user-select:none;user-select:none;touch-action:none;background:linear-gradient(#0000002e 0%,#0000000d 100%);padding:2px;display:inline-flex;overflow:hidden;box-shadow:inset 0 1px 2px #0006,0 1px #ffffff0f}._segment_164gt_28{min-width:0;font-family:var(--wzl-font-ui);font-weight:var(--wzl-font-weight-normal);font-size:var(--btn-fontsize,var(--wzl-font-size));color:var(--wzl-fg-muted);cursor:pointer;isolation:isolate;transition:color var(--wzl-motion-fast);background:0 0;border:none;border-radius:0;flex:1 1 0;justify-content:center;align-items:center;margin:0;padding:0 12px;line-height:1;display:inline-flex;position:relative;overflow:hidden}._segment_164gt_28>svg{flex:none}._segment_164gt_28:has(>svg){padding:0 5px}._segment_164gt_28:first-child{border-radius:var(--wzl-radius-pill) 0 0 var(--wzl-radius-pill)}._segment_164gt_28:last-child{border-radius:0 var(--wzl-radius-pill) var(--wzl-radius-pill) 0}._segment_164gt_28:only-child{border-radius:var(--wzl-radius-pill)}._segment_164gt_28:focus-visible{outline:2px solid var(--wzl-accent);outline-offset:-2px}._segment_164gt_28:disabled{opacity:.5;cursor:not-allowed}._segment_164gt_28:hover:not(:disabled):not(._segmentSelected_164gt_87){color:var(--wzl-fg)}._segmentSelected_164gt_87{background:linear-gradient(180deg, color-mix(in srgb, var(--wzl-accent) var(--btn-top-alpha,45%), transparent) 0%, color-mix(in srgb, var(--wzl-accent) var(--btn-upper-alpha,70%), transparent) calc(var(--btn-equator,52%) - var(--btn-equator-spread,12%)), color-mix(in srgb, var(--wzl-accent) var(--btn-equator-tint,95%), white) var(--btn-equator,52%), var(--wzl-accent) calc(var(--btn-equator,52%) + var(--btn-equator-spread,12%) * 1.6), color-mix(in srgb, var(--wzl-accent) var(--btn-base-tint,70%), black) 100%);-webkit-backdrop-filter:blur(var(--btn-blur,6px)) saturate(var(--btn-saturate,1.3));color:var(--wzl-fg-on-accent);text-shadow:0 1px 0 rgba(0, 0, 0, var(--btn-text-shadow,.35)), var(--btn-text-inset-x,0px) var(--btn-text-inset-y,1px) 0 rgba(0, 0, 0, var(--btn-text-inset,.55)), 0 0 6px rgba(0, 0, 0, calc(var(--btn-text-shadow,.35) * .5));box-shadow:inset 0 1px 0 rgba(255, 255, 255, var(--btn-inset-hi,.42)), inset 0 -1px 2px rgba(0, 0, 0, var(--btn-inset-lo,.3)), 0 0 0 1px rgba(0, 0, 0, var(--btn-rim,.22)), 0 1px 2px rgba(0, 0, 0, var(--btn-drop-near,.3)), 0 2px 4px rgba(0, 0, 0, calc(var(--btn-drop-far,.18) * .8))}._segmentSelected_164gt_87:before{content:"";inset:1px 1px var(--btn-gloss-bottom,50%) 1px;border-radius:inherit;background:linear-gradient(180deg, rgba(255, 255, 255, var(--btn-gloss-top,.42)) 0%, rgba(255, 255, 255, var(--btn-gloss-mid,.12)) 60%, #fff0 100%);pointer-events:none;z-index:1;border-bottom-right-radius:0;border-bottom-left-radius:0;position:absolute}._segmentSelected_164gt_87>*{z-index:2;position:relative}._segmentMixed_164gt_146{background:color-mix(in srgb, var(--wzl-accent) 22%, transparent);color:var(--wzl-fg);box-shadow:inset 0 0 0 1px color-mix(in srgb, var(--wzl-accent) 45%, transparent)}._segmentMixed_164gt_146:hover:not(:disabled){background:color-mix(in srgb, var(--wzl-accent) 32%, transparent)}._variant_minimal_164gt_156 ._segmentMixed_164gt_146{background:color-mix(in srgb, var(--wzl-accent) 18%, transparent);box-shadow:none;color:var(--wzl-fg)}._size_sm_164gt_165{height:17px;padding:1px}._size_sm_164gt_165 ._segment_164gt_28{font-size:var(--wzl-font-size-sm);padding:0 8px}._size_sm_164gt_165 ._segment_164gt_28:has(>svg){padding:0 3px}._variant_minimal_164gt_156{border:1px solid var(--wzl-border);border-radius:var(--wzl-radius-sm);height:auto;box-shadow:none;background:0 0;gap:0;padding:0}._variant_minimal_164gt_156 ._segment_164gt_28{font-size:var(--wzl-font-size-sm);font-weight:var(--wzl-font-weight-medium);color:var(--wzl-fg-muted);border-radius:0;padding:0 6px;line-height:1.4;transition:none}._variant_minimal_164gt_156 ._segment_164gt_28+._segment_164gt_28{border-left:1px solid var(--wzl-border)}._variant_minimal_164gt_156 ._segment_164gt_28:first-child,._variant_minimal_164gt_156 ._segment_164gt_28:last-child,._variant_minimal_164gt_156 ._segment_164gt_28:only-child{border-radius:0}._variant_minimal_164gt_156 ._segment_164gt_28:hover:not(:disabled):not(._segmentSelected_164gt_87){color:var(--wzl-fg);background:var(--wzl-surface-hover)}._variant_minimal_164gt_156 ._segmentSelected_164gt_87{-webkit-backdrop-filter:none;color:var(--wzl-accent-fg,var(--wzl-accent));text-shadow:none;box-shadow:none;font-weight:var(--wzl-font-weight-medium);background:0 0}._variant_minimal_164gt_156 ._segmentSelected_164gt_87:before{content:none}._variant_flat_164gt_240{border-radius:var(--wzl-radius-sm);box-shadow:none;background:0 0;padding:0;overflow:visible}._variant_flat_164gt_240 ._segment_164gt_28{border:1px solid var(--wzl-border-strong);background:var(--wzl-surface-sunken);color:var(--wzl-fg-muted);border-radius:0}._variant_flat_164gt_240 ._segment_164gt_28+._segment_164gt_28{margin-inline-start:-1px}._variant_flat_164gt_240 ._segment_164gt_28:first-child{border-start-start-radius:var(--wzl-radius-sm);border-end-start-radius:var(--wzl-radius-sm)}._variant_flat_164gt_240 ._segment_164gt_28:last-child{border-start-end-radius:var(--wzl-radius-sm);border-end-end-radius:var(--wzl-radius-sm)}._variant_flat_164gt_240 ._segment_164gt_28:hover:not(:disabled):not(._segmentSelected_164gt_87){background:var(--wzl-surface-hover);color:var(--wzl-fg)}._variant_flat_164gt_240 ._segmentSelected_164gt_87{background:var(--wzl-accent);border-color:var(--wzl-accent);color:var(--wzl-fg-on-accent);-webkit-backdrop-filter:none;text-shadow:none;box-shadow:none;z-index:1}._variant_flat_164gt_240 ._segmentSelected_164gt_87:before{content:none}._root_15yko_1{flex-direction:column;gap:8px;min-inline-size:0;display:flex}._swatches_15yko_8{flex-wrap:wrap;gap:6px;display:flex}._swatch_15yko_8{flex:0 auto;min-inline-size:0}._overlay_6yu3h_3{pointer-events:none;position:absolute;inset:0}._guide_6yu3h_13{fill:none;stroke:#fff;stroke-opacity:.7;stroke-dasharray:4 4;paint-order:stroke}._handle_6yu3h_21{fill:#fff;stroke:#222;stroke-width:2px;cursor:grab;pointer-events:auto}._handle_6yu3h_21:active{cursor:grabbing}._handle_6yu3h_21:focus-visible{outline:2px solid var(--wzl-accent,#4a9eff);outline-offset:2px}._field_1jrsz_1{flex-direction:column;gap:4px;width:100%;min-width:0;display:flex}._frame_1jrsz_9{height:var(--wzl-field-h,var(--wzl-control-h));padding:0 var(--wzl-field-pad-x);background:var(--wzl-surface-sunken);border:1px solid var(--wzl-border);border-radius:var(--wzl-radius-sm);color:var(--wzl-fg);font-family:var(--wzl-font-ui);font-size:var(--wzl-font-size);transition:border-color var(--wzl-motion-fast), box-shadow var(--wzl-motion-fast);align-items:center;gap:6px;line-height:1;display:flex}._frame_1jrsz_9:focus-within{border-color:var(--wzl-focus-ring);box-shadow:0 0 0 1px var(--wzl-focus-ring)}._field_1jrsz_1[data-invalid] ._frame_1jrsz_9{border-color:var(--wzl-danger)}._field_1jrsz_1[data-disabled] ._frame_1jrsz_9{opacity:.5;cursor:not-allowed}._frame_1jrsz_9 input{min-width:0;color:inherit;font:inherit;background:0 0;border:none;outline:none;flex:1;padding:0}._frame_1jrsz_9 input::placeholder{color:var(--wzl-fg-subtle)}._adornment_1jrsz_54{color:var(--wzl-fg-subtle);font-size:var(--wzl-font-size-sm);pointer-events:none;align-items:center;display:inline-flex}._list_cdj63_4{-webkit-user-select:none;user-select:none;flex-direction:column;gap:1px;width:100%;display:flex;position:relative}._row_cdj63_14{height:24px;font-size:var(--wzl-font-size-sm);color:var(--wzl-fg);border-radius:var(--wzl-radius-sm);cursor:default;white-space:nowrap;background:0 0;align-items:center;gap:8px;padding:0 8px;display:flex;overflow:hidden}._row_cdj63_14:hover{background:var(--wzl-surface)}._label_cdj63_33{text-overflow:ellipsis;flex:auto;overflow:hidden}._selected_cdj63_39,._selected_cdj63_39:hover{background:var(--wzl-border);color:var(--wzl-fg)}._muted_cdj63_46{color:var(--wzl-fg-subtle)}._empty_cdj63_50{font-size:var(--wzl-font-size-sm);color:var(--wzl-fg-subtle);padding:12px 8px;font-style:italic}._keys_1cdok_2{vertical-align:bottom;flex-wrap:wrap;align-items:flex-end;gap:3px;display:inline-flex}._keysEmpty_1cdok_16{color:var(--wzl-fg-muted)}._sep_1cdok_20{color:var(--wzl-fg-muted);font-size:var(--wzl-font-size-sm);line-height:1}._key_1cdok_2{box-sizing:border-box;background:var(--wzl-fg,#e6e7e9);border-radius:var(--wzl-radius-sm);height:18px;color:var(--wzl-surface);font-family:ui-sans-serif,system-ui,sans-serif;font-size:var(--wzl-font-size-sm);font-weight:var(--wzl-font-weight-bold);border:1px solid #25272c;border-bottom-width:2px;justify-content:center;align-items:center;padding:0 4px;line-height:1;display:inline-flex}._key_1cdok_2[data-kind=square]{width:18px;padding:0}._key_1cdok_2[data-kind=modifier]{min-width:26px;padding:0 6px}._key_1cdok_2[data-kind=wide]{min-width:32px;padding:0 8px}._key_1cdok_2[data-inverted]{background:var(--wzl-surface);color:color-mix(in srgb, var(--wzl-fg,#e6e7e9) 60%, transparent);border-style:dotted;border-color:color-mix(in srgb, var(--wzl-fg,#e6e7e9) 40%, transparent);border-width:1.5px}._key_1cdok_2[data-variant=minimal]{color:currentColor;background:0 0;border-color:currentColor}._key_1cdok_2[data-variant=minimal][data-inverted]{color:currentColor;border:1.5px dotted}._stack_17awo_4,._stack_17awo_4 *{box-sizing:border-box}._stack_17awo_4{gap:8px;display:grid}._head_17awo_14{justify-content:space-between;align-items:center;gap:8px;display:flex}._title_17awo_21{font-family:var(--wzl-font-display);font-weight:var(--wzl-font-weight-light);font-size:var(--wzl-font-size-lg);color:var(--wzl-fg);margin:0}._palette_17awo_29{gap:4px;display:flex}._add_17awo_34{font:inherit;height:var(--wzl-control-h);border:1px dashed var(--wzl-border);border-radius:var(--wzl-radius-sm);font-size:var(--wzl-font-size-sm);color:var(--wzl-fg-subtle);cursor:pointer;background:0 0;padding:2px 8px}._add_17awo_34:hover{background:var(--wzl-surface-raised);color:var(--wzl-fg)}._list_17awo_51{gap:6px;display:grid}._dropHint_17awo_56{background:var(--wzl-accent);border-radius:var(--wzl-radius-sm);height:2px}._empty_17awo_62{color:var(--wzl-fg-subtle);font-size:var(--wzl-font-size);text-align:center;padding:8px}._card_17awo_69{background:var(--wzl-surface-raised);border:1px solid var(--wzl-border);border-radius:var(--wzl-radius-md);overflow:hidden}._cardAccented_17awo_76{--wzl-accent:var(--wzl-layer-stack-accent);border-left:3px solid var(--wzl-layer-stack-accent)}._cardDragging_17awo_84{opacity:.5}._cardHead_17awo_88{align-items:center;gap:6px;padding:6px 8px;display:flex}._handle_17awo_95{font:inherit;color:var(--wzl-fg-subtle);cursor:grab;border-radius:var(--wzl-radius-sm);min-width:22px;height:22px;font-weight:var(--wzl-font-weight-bold);font-size:var(--wzl-font-size);background:0 0;border:0;justify-content:center;align-items:center;padding:2px 4px;display:inline-flex}._cardAccented_17awo_76 ._handle_17awo_95{background:var(--wzl-layer-stack-accent);color:#fff}._handle_17awo_95:active{cursor:grabbing}._kind_17awo_121,._primary_17awo_122{font-size:var(--wzl-font-size);flex:1}._primary_17awo_122{color:var(--wzl-fg);font:inherit;text-transform:uppercase;letter-spacing:var(--wzl-tracking-wide);background:0 0;border:0}._remove_17awo_136{font:inherit;height:var(--wzl-control-h);color:var(--wzl-fg-subtle);font-size:var(--wzl-font-size-lg);cursor:pointer;background:0 0;border:0;padding:2px 6px}._remove_17awo_136:hover{color:var(--wzl-fg)}._cardBody_17awo_151{border-top:1px solid var(--wzl-border);padding:8px}._field_1ey71_1{flex-direction:column;gap:4px;width:100%;min-width:0;display:flex}._frame_1ey71_9{height:var(--wzl-field-h,var(--wzl-control-h));background:var(--wzl-surface-sunken);border:1px solid var(--wzl-border);border-radius:var(--wzl-radius-sm);color:var(--wzl-fg);font-family:var(--wzl-font-ui);font-size:var(--wzl-font-size);transition:border-color var(--wzl-motion-fast), box-shadow var(--wzl-motion-fast);align-items:stretch;line-height:1;display:flex;overflow:hidden}._frame_1ey71_9:focus-within{border-color:var(--wzl-focus-ring);box-shadow:0 0 0 1px var(--wzl-focus-ring)}._field_1ey71_1[data-invalid] ._frame_1ey71_9{border-color:var(--wzl-danger)}._field_1ey71_1[data-disabled] ._frame_1ey71_9{opacity:.5;cursor:not-allowed}._frame_1ey71_9 input{min-width:0;color:inherit;font:inherit;padding:0 var(--wzl-field-pad-x);text-align:right;-moz-appearance:textfield;background:0 0;border:none;outline:none;flex:1}._frame_1ey71_9 input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}._frame_1ey71_9 input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}._steppers_1ey71_57{border-left:1px solid var(--wzl-border);flex-direction:column;display:flex}._stepper_1ey71_57{width:18px;color:var(--wzl-fg-muted);cursor:pointer;font-size:var(--wzl-font-size-2xs);background:0 0;border:none;flex:1;justify-content:center;align-items:center;padding:0;line-height:1;display:inline-flex}._stepper_1ey71_57:not(:last-child){border-bottom:1px solid var(--wzl-border)}._stepper_1ey71_57[data-hovered]:not([data-disabled]){background:var(--wzl-surface-hover);color:var(--wzl-fg)}._stepper_1ey71_57[data-pressed]:not([data-disabled]){background:var(--wzl-surface-pressed)}._stepper_1ey71_57[data-disabled]{opacity:.4;cursor:not-allowed}._ghost_1ey71_98{height:auto;color:var(--wzl-accent);font-weight:var(--wzl-font-weight-medium);background:0 0;border-color:#0000}._ghost_1ey71_98 input{padding:1px 0}._ghost_1ey71_98:hover{background:color-mix(in srgb, currentColor 8%, transparent)}._ghost_1ey71_98:focus-within{background:var(--wzl-surface-sunken);border-color:var(--wzl-focus-ring);box-shadow:none}._root_uqwvn_2{flex-direction:column;gap:6px;min-inline-size:0;display:flex}._grid_uqwvn_9{grid-template-columns:repeat(auto-fill, minmax(var(--wzl-swatch-size,28px), 1fr));gap:0;display:grid}._swatch_uqwvn_17{aspect-ratio:1;border:.5px solid var(--wzl-border);cursor:pointer;background-color:var(--wzl-surface-sunken);background-image:var(--tile-preview);background-repeat:repeat;background-size:16px 16px;background-clip:padding-box;border-radius:0;width:100%;min-width:0;padding:0}._swatch_uqwvn_17:hover{border-color:var(--wzl-fg-muted)}._swatchActive_uqwvn_36{border-color:var(--wzl-accent);box-shadow:0 0 0 1px var(--wzl-accent)}._root_1c3p1_2{flex-direction:column;gap:6px;min-inline-size:0;display:flex}._unset_1c3p1_10{opacity:.55}._row_q3wun_1{align-items:stretch;gap:var(--powerline-gap,.2em);display:inline-flex}._matrix_q3wun_7{gap:12px;display:grid}._segment_q3wun_15{font-size:inherit;text-transform:none;letter-spacing:normal}._group_1nkc4_1{font-family:var(--wzl-font-ui);color:var(--wzl-fg);flex-direction:column;gap:6px;display:flex}._group_1nkc4_1[data-orientation=horizontal]{flex-direction:row;gap:16px}._legend_1nkc4_14{font-size:var(--wzl-font-size-sm);font-weight:var(--wzl-font-weight-medium);color:var(--wzl-fg)}._radio_1nkc4_20{cursor:pointer;font-size:var(--wzl-font-size);color:var(--wzl-fg);-webkit-user-select:none;user-select:none;align-items:center;gap:8px;display:inline-flex}._radio_1nkc4_20[data-disabled]{opacity:.5;cursor:not-allowed}._dot_1nkc4_36{background:var(--wzl-surface-sunken);border:1px solid var(--wzl-border-strong);width:14px;height:14px;transition:border-color var(--wzl-motion-fast), box-shadow var(--wzl-motion-fast);border-radius:50%;flex:none;position:relative}._radio_1nkc4_20[data-focus-visible] ._dot_1nkc4_36{box-shadow:0 0 0 2px var(--wzl-focus-ring)}._radio_1nkc4_20[data-hovered]:not([data-disabled]) ._dot_1nkc4_36{border-color:var(--wzl-fg-muted)}._radio_1nkc4_20[data-selected] ._dot_1nkc4_36{border-color:var(--wzl-accent-strong)}._dot_1nkc4_36:after{content:"";background:var(--wzl-accent-strong);transition:transform var(--wzl-motion-fast);border-radius:50%;position:absolute;inset:3px;transform:scale(0)}._radio_1nkc4_20[data-selected] ._dot_1nkc4_36:after{transform:scale(1)}._slider_cno0k_1{width:100%;font-family:var(--wzl-font-ui);color:var(--wzl-fg);flex-direction:column;gap:4px;display:flex}._slider_cno0k_1[data-orientation=vertical]{flex-direction:row;align-items:stretch;width:28px;height:160px}._head_cno0k_17{justify-content:space-between;align-items:baseline;gap:8px;display:flex}._label_cno0k_24{font-size:var(--wzl-font-size-sm);font-weight:var(--wzl-font-weight-medium);color:var(--wzl-fg)}._output_cno0k_30{font-size:var(--wzl-font-size-sm);color:var(--wzl-fg-subtle);font-variant-numeric:tabular-nums}._track_cno0k_36{background:var(--wzl-surface-sunken);border:1px solid var(--wzl-border);border-radius:var(--wzl-radius-sm);min-width:80px;height:6px;position:relative}._slider_cno0k_1[data-orientation=vertical] ._track_cno0k_36{width:6px;height:100%}._fill_cno0k_50{background:var(--wzl-accent-strong);border-radius:var(--wzl-radius-sm);position:absolute;top:0;bottom:0;left:0}._thumb_cno0k_59{background:var(--wzl-fg-muted);border:1px solid var(--wzl-border-strong);cursor:ew-resize;width:14px;height:14px;transition:box-shadow var(--wzl-motion-fast);border-radius:50%;outline:none}._slider_cno0k_1[data-orientation=vertical] ._thumb_cno0k_59{cursor:ns-resize}._thumb_cno0k_59[data-focus-visible]{box-shadow:0 0 0 2px var(--wzl-focus-ring)}._thumb_cno0k_59[data-dragging]{background:var(--wzl-accent-strong)}._slider_cno0k_1[data-disabled]{opacity:.5;cursor:not-allowed}._switch_4x0jo_1{cursor:pointer;font-family:var(--wzl-font-ui);font-size:var(--wzl-font-size);color:var(--wzl-fg);-webkit-user-select:none;user-select:none;align-items:center;gap:8px;display:inline-flex}._switch_4x0jo_1[data-disabled]{opacity:.5;cursor:not-allowed}._track_4x0jo_18{background:var(--wzl-surface-sunken);border:1px solid var(--wzl-border-strong);border-radius:var(--wzl-radius-pill);width:28px;height:16px;transition:background-color var(--wzl-motion-fast), border-color var(--wzl-motion-fast), box-shadow var(--wzl-motion-fast);flex:none;position:relative}._switch_4x0jo_1[data-focus-visible] ._track_4x0jo_18{box-shadow:0 0 0 2px var(--wzl-focus-ring)}._switch_4x0jo_1[data-selected] ._track_4x0jo_18{background:var(--wzl-accent-strong);border-color:var(--wzl-accent-strong)}._thumb_4x0jo_38{background:var(--wzl-fg);width:12px;height:12px;transition:transform var(--wzl-motion-fast);border-radius:50%;position:absolute;top:1px;left:1px}._switch_4x0jo_1[data-selected] ._thumb_4x0jo_38{background:var(--wzl-fg-on-accent);transform:translate(12px)}._label_4x0jo_54{line-height:1.2}._columns_i4hcs_5{flex-flow:wrap;align-items:flex-start;gap:12px;padding-right:4px;display:flex;overflow-y:auto}._column_i4hcs_5{flex:0 0 var(--wzl-prefs-column-width,300px);width:var(--wzl-prefs-column-width,300px);flex-direction:column;gap:8px;display:flex}._panel_i4hcs_23{background:var(--wzl-surface-sunken);border:1px solid var(--wzl-border);border-radius:var(--wzl-radius-sm);flex-direction:column;gap:8px;padding:10px;display:flex}._subpanel_i4hcs_33{background:var(--wzl-surface-sunken);border-left:2px solid var(--wzl-border);border-radius:var(--wzl-radius-sm);flex-direction:column;gap:6px;margin-top:6px;padding:8px 8px 8px 10px;display:flex}._groupHeader_i4hcs_44{border-bottom:1px solid var(--wzl-border);flex-direction:column;gap:2px;padding-bottom:4px;display:flex}._subpanel_i4hcs_33 ._groupHeader_i4hcs_44{border-bottom:none;padding-bottom:2px}._groupTitle_i4hcs_57{font-size:var(--wzl-font-size-sm);font-weight:var(--wzl-font-weight-bold);color:var(--wzl-fg);letter-spacing:.04em;text-transform:uppercase;margin:0}._subpanel_i4hcs_33 ._groupTitle_i4hcs_57{font-size:var(--wzl-font-size-sm);text-transform:none;letter-spacing:0}._groupDesc_i4hcs_72{font-size:var(--wzl-font-size-sm);color:var(--wzl-fg-subtle);margin:0;line-height:1.35}._rows_i4hcs_79{flex-direction:column;gap:6px;display:flex}._row_i4hcs_79{font-size:var(--wzl-font-size-sm);color:var(--wzl-fg);cursor:default;justify-content:space-between;align-items:center;gap:8px;display:flex}._rowLabel_i4hcs_95{flex:auto;align-items:center;gap:4px;min-width:0;display:inline-flex}._help_i4hcs_104{color:var(--wzl-fg-subtle);font-size:var(--wzl-font-size-sm);cursor:help;border-radius:var(--wzl-radius-sm);background:0 0;border:none;flex:none;padding:0;line-height:1}._help_i4hcs_104:hover{color:var(--wzl-fg)}._help_i4hcs_104:focus-visible{outline:2px solid var(--wzl-focus-ring);outline-offset:1px;color:var(--wzl-fg)}._rowControl_i4hcs_128{flex:0 0 110px;align-items:center;min-width:0;display:flex}._textarea_i4hcs_135{background:var(--wzl-surface-sunken);width:100%;color:var(--wzl-fg);border:1px solid var(--wzl-border);border-radius:var(--wzl-radius-sm);font:inherit;font-size:var(--wzl-font-size-sm);resize:vertical;padding:4px 8px}._unrenderable_i4hcs_147{font-family:var(--wzl-font-mono);font-size:var(--wzl-font-size-sm);color:var(--wzl-fg-subtle)}._titleRow_i4hcs_154{flex:1;align-items:center;gap:12px;min-width:0;display:flex}._titleRow_i4hcs_154>span:first-child{flex:1;min-width:0}._objectLeaf_i4hcs_168{flex-direction:column;gap:6px;inline-size:100%;display:flex}._objectRow_i4hcs_175{grid-template-columns:96px 1fr;align-items:center;gap:8px;display:grid}._objectLabel_i4hcs_182{font-size:var(--wzl-font-size-sm);opacity:.75}._objectGroup_i4hcs_187{font-size:var(--wzl-font-size-xs);font-weight:var(--wzl-font-weight-bold);text-transform:uppercase;letter-spacing:.06em;opacity:.55;margin:4px 0 0}._field_17u88_1{box-sizing:border-box;grid-column:1/-1;gap:6px;display:grid}._field_17u88_1 *{box-sizing:border-box}._plot_17u88_12{width:100%;position:relative}._marks_17u88_17{pointer-events:none;position:absolute;inset:0}._actions_17u88_23{justify-self:start;gap:6px;display:flex}._action_17u88_23{border:1px solid var(--wzl-border);border-radius:var(--wzl-radius-sm);color:var(--wzl-fg);font-size:var(--wzl-font-size-sm);cursor:pointer;background:0 0;padding:4px 10px}._action_17u88_23:hover{background:var(--wzl-surface-raised)}._panel_vxnqc_9,._list_vxnqc_3,._row_vxnqc_4,._group_vxnqc_4,._subpanel_vxnqc_3,._card_vxnqc_14,._cardList_vxnqc_15,._panel_vxnqc_9 *,._list_vxnqc_3 *,._row_vxnqc_4 *,._group_vxnqc_4 *,._subpanel_vxnqc_3 *,._card_vxnqc_14 *,._cardList_vxnqc_15 *{box-sizing:border-box}._panel_vxnqc_9{background:var(--wzl-surface-raised);border:1px solid var(--wzl-border);border-radius:var(--wzl-radius-lg);-webkit-backdrop-filter:blur(var(--wzl-glass-blur));padding:14px 16px}._panelTitle_vxnqc_35{font-family:var(--wzl-font-display);font-weight:var(--wzl-font-weight-light);font-size:var(--wzl-font-size-lg);line-height:var(--wzl-leading-snug);letter-spacing:.01em;color:var(--wzl-fg);margin:0 0 12px}._list_vxnqc_3{--wzl-field-h:20px;--wzl-field-pad-x:6px;grid-template-columns:1fr 1fr;align-items:stretch;gap:4px 10px;display:grid}._list_vxnqc_3:not(._listPairs_vxnqc_3)>:not(._rowColor_vxnqc_4){grid-column:1/-1}._listPairs_vxnqc_3>*{min-width:0}._listPairs_vxnqc_3>._span_vxnqc_71,._listPairs_vxnqc_3>._subpanel_vxnqc_3,._listPairs_vxnqc_3>h3{grid-column:1/-1}._row_vxnqc_4{flex-direction:column;gap:0;min-width:0;display:flex}._row_vxnqc_4:has(>input[type=range]){justify-content:flex-end}._row_vxnqc_4:has(>input[type=range])>._rowLabel_vxnqc_99{justify-content:space-between;align-items:baseline;gap:4px;margin-bottom:-4px}._rowLabel_vxnqc_99{font-family:var(--wzl-font-display);font-weight:var(--wzl-font-weight-light);font-size:var(--wzl-font-size-sm);line-height:var(--wzl-leading-snug);color:var(--wzl-fg-muted);text-transform:uppercase;letter-spacing:.05em;align-items:center;gap:6px;display:flex}._readout_vxnqc_121{font-style:normal;font-weight:var(--wzl-font-weight-medium);color:var(--wzl-accent);margin-left:auto}._help_vxnqc_133{-webkit-backdrop-filter:none;width:1.15em;height:1.15em;color:var(--wzl-fg-subtle);font-size:var(--wzl-font-size-sm);letter-spacing:normal;cursor:help;border-radius:var(--wzl-radius-sm);background:0 0;border:0;flex:none;justify-content:center;align-items:center;padding:0;line-height:1;display:inline-flex}._help_vxnqc_133:hover{color:var(--wzl-fg);border-color:#0000}._help_vxnqc_133:focus-visible{outline:2px solid var(--wzl-focus-ring);outline-offset:1px;color:var(--wzl-fg)}._readoutInput_vxnqc_165{font:inherit;font-weight:var(--wzl-font-weight-medium);line-height:var(--wzl-leading-tight);color:var(--wzl-accent);border-radius:var(--wzl-radius-sm);text-align:right;cursor:text;-moz-appearance:textfield;background:0 0;border:1px solid #0000;outline:none;width:calc(5em - 24px);margin:0;padding:1px 0;transition:background 80ms,border-color 80ms}._readoutInput_vxnqc_165:hover{background:color-mix(in srgb, currentColor 8%, transparent)}._readoutInput_vxnqc_165:focus{background:var(--wzl-surface-sunken);border-color:var(--wzl-focus-ring)}._readoutInput_vxnqc_165::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}._readoutInput_vxnqc_165::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}._readoutGroup_vxnqc_203{white-space:nowrap;display:inline-block}._readoutUnit_vxnqc_209{color:var(--wzl-fg-muted);font-size:var(--wzl-font-size-2xs);line-height:var(--wzl-leading-tight);pointer-events:none}._fieldUnitGroup_vxnqc_216{white-space:nowrap;min-width:0;display:inline-block}._fieldUnitGroup_vxnqc_216 ._readoutUnit_vxnqc_209{margin-left:4px}._readoutGroup_vxnqc_203 sup,._fieldUnitGroup_vxnqc_216 sup{color:var(--wzl-fg-muted);font-size:var(--wzl-font-size-2xs);pointer-events:none}._rowInline_vxnqc_237{flex-direction:row;justify-content:space-between;align-items:center;gap:6px}._rowInline_vxnqc_237 ._rowLabel_vxnqc_99{flex:none}._rowInline_vxnqc_237>input,._rowInline_vxnqc_237>select,._rowInline_vxnqc_237>._toggle_vxnqc_255{flex:auto;min-width:0}._row_vxnqc_4 input[type=number]:not(._readoutInput_vxnqc_165){width:var(--wzl-prop-number-width,9ch);max-width:100%}._row_vxnqc_4 input[type=text]:not(._readoutInput_vxnqc_165){width:var(--wzl-prop-text-width,16ch);max-width:100%}._rowInline_vxnqc_237>input:not(._readoutInput_vxnqc_165),._rowInline_vxnqc_237>select{flex:0 auto;min-width:4ch}._rowInline_vxnqc_237 input[type=range]{width:auto}._row_vxnqc_4 input[type=text]:not(._readoutInput_vxnqc_165),._row_vxnqc_4 input[type=number]{background:var(--wzl-surface-sunken);color:var(--wzl-fg);border:1px solid var(--wzl-border);border-radius:var(--wzl-radius-sm);height:var(--wzl-field-h,var(--wzl-control-h));padding:0 var(--wzl-field-pad-x);font-family:var(--wzl-font-ui);font-weight:var(--wzl-font-weight-medium);font-size:var(--wzl-font-size);line-height:var(--wzl-leading-tight)}._row_vxnqc_4 input[type=number]{text-align:right}._row_vxnqc_4 input[type=text]:not(._readoutInput_vxnqc_165):focus,._row_vxnqc_4 input[type=number]:focus{border-color:var(--wzl-focus-ring);box-shadow:0 0 0 1px var(--wzl-focus-ring);outline:none}._row_vxnqc_4 select{color:var(--wzl-fg);height:var(--wzl-field-h,var(--wzl-control-h));font-family:var(--wzl-font-ui);font-weight:var(--wzl-font-weight-medium);font-size:var(--wzl-font-size);line-height:var(--wzl-leading-tight);cursor:pointer;background:0 0;border:0;border-radius:0;padding:0}._row_vxnqc_4 select:focus{outline:1px solid var(--wzl-focus-ring);outline-offset:2px}._rowColor_vxnqc_4{grid-template-rows:auto;grid-template-columns:1fr auto;align-content:end;gap:0 8px;min-width:0;display:grid}._rowColor_vxnqc_4 ._rowLabel_vxnqc_99{flex:initial;grid-area:1/1;align-self:center;min-width:0}._rowColor_vxnqc_4 input[type=color]{box-sizing:border-box;border-radius:var(--wzl-radius-sm);cursor:pointer;background:0 0;border:0;flex-shrink:0;grid-area:1/2;align-self:center;width:36px;height:18px;padding:0}._rowColor_vxnqc_4 input[type=range]._alpha_vxnqc_380{grid-area:2/1/auto/-1;width:100%;height:12px;margin:0}._rowCheckbox_vxnqc_389{cursor:pointer;flex-direction:row;align-items:center;gap:8px}._rowCheckbox_vxnqc_389 ._rowLabel_vxnqc_99{text-transform:none;letter-spacing:normal;font-size:var(--wzl-font-size);color:var(--wzl-fg);order:1}._rowCheckbox_vxnqc_389 input[type=checkbox]{accent-color:var(--wzl-accent);cursor:pointer;width:14px;height:14px}._toggle_vxnqc_255{border:1px solid var(--wzl-border);border-radius:var(--wzl-radius-sm);width:100%;display:flex;overflow:hidden}._toggleButton_vxnqc_421{height:26px;color:var(--wzl-fg-muted);font-family:var(--wzl-font-ui);font-weight:var(--wzl-font-weight-medium);font-size:var(--wzl-font-size-sm);line-height:var(--wzl-leading-tight);cursor:pointer;-webkit-backdrop-filter:none;background:#00000040;border:0;border-radius:0;flex:1;padding:0 8px}._toggleButton_vxnqc_421+._toggleButton_vxnqc_421{border-left:1px solid var(--wzl-border)}._toggleButton_vxnqc_421:hover{color:var(--wzl-fg);border-color:var(--wzl-border)}._toggleButtonSelected_vxnqc_447{background:var(--wzl-accent);color:var(--wzl-fg-on-accent);font-weight:var(--wzl-font-weight-medium)}._toggleButtonSelected_vxnqc_447:hover{color:var(--wzl-fg-on-accent)}._group_vxnqc_4{background:var(--wzl-surface-sunken);border-radius:var(--wzl-radius-md);grid-column:1/-1;padding:6px 10px 8px}._groupTitle_vxnqc_466{font-family:var(--wzl-font-display);font-weight:var(--wzl-font-weight-light);font-size:var(--wzl-font-size-sm);letter-spacing:var(--wzl-tracking-wider);text-transform:uppercase;color:var(--wzl-fg-subtle);grid-template-columns:1fr auto 1fr;align-items:center;gap:8px;margin:0 0 4px;display:grid}._groupTitle_vxnqc_466 hr{border:0;border-top:1px solid var(--wzl-border);margin:0}._groupBody_vxnqc_4{grid-template-columns:1fr 1fr;align-items:stretch;gap:4px 10px;display:grid}._group_vxnqc_4:not(._groupPairs_vxnqc_497) ._groupBody_vxnqc_4>:not(._rowColor_vxnqc_4){grid-column:1/-1}._groupPairs_vxnqc_497 ._groupBody_vxnqc_4>*{grid-column:auto}._groupPairs_vxnqc_497 ._groupBody_vxnqc_4>h3,._groupPairs_vxnqc_497 ._groupBody_vxnqc_4>._span_vxnqc_71{grid-column:1/-1}._subpanel_vxnqc_3{background:0 0;border:0;grid-template-columns:1fr 1fr;align-items:stretch;gap:3px 10px;margin:0;padding:0;display:grid}._subpanel_vxnqc_3>*{min-width:0}._subpanel_vxnqc_3>._subpanelTitle_vxnqc_529,._subpanel_vxnqc_3>._span_vxnqc_71{grid-column:1/-1}._subpanelTitle_vxnqc_529{font-family:var(--wzl-font-display);font-weight:var(--wzl-font-weight-medium);font-size:var(--wzl-font-size-sm);line-height:var(--wzl-leading-tight);color:var(--wzl-fg);text-transform:uppercase;letter-spacing:var(--wzl-tracking-wider);align-items:center;gap:8px;margin:0;padding:6px 0 4px;display:flex}._subpanelTitle_vxnqc_529>span{flex:none}._subpanelTitle_vxnqc_529>hr{border:0;border-top:1px solid #ffffff1f;flex:auto;margin:0}._card_vxnqc_14{border:1px solid var(--wzl-border);border-radius:var(--wzl-radius-sm);background:#00000040;flex-direction:column;transition:background .12s,border-color .12s;display:flex;overflow:hidden}._cardDragging_vxnqc_573{opacity:.45}._cardExpanded_vxnqc_577{background:#0000004d}._cardAccented_vxnqc_581{--wzl-accent:var(--wzl-effect-card-accent);background:color-mix(in srgb, var(--wzl-effect-card-accent) 4%, #00000047);border-color:color-mix(in srgb, var(--wzl-effect-card-accent) 28%, var(--wzl-border));border-left-width:4px;border-left-color:var(--wzl-effect-card-accent)}._cardAccented_vxnqc_581._cardExpanded_vxnqc_577{background:color-mix(in srgb, var(--wzl-effect-card-accent) 5%, #00000059)}._cardAccented_vxnqc_581 ._cardHead_vxnqc_596{background:color-mix(in srgb, var(--wzl-effect-card-accent) 38%, #0006)}._cardAccented_vxnqc_581 ._cardHead_vxnqc_596:hover{background:color-mix(in srgb, var(--wzl-effect-card-accent) 48%, #00000059)}._cardHead_vxnqc_596{cursor:pointer;-webkit-user-select:none;user-select:none;align-items:baseline;gap:8px;padding:2px 10px;display:flex}._cardHead_vxnqc_596:hover{background:#ffffff08}._cardHandle_vxnqc_617{color:var(--wzl-fg-muted);cursor:grab;justify-content:center;align-items:center;padding:0 2px;display:inline-flex}._cardHandle_vxnqc_617:active{cursor:grabbing}._cardIndexBadge_vxnqc_630{appearance:none;min-width:14px;color:var(--wzl-effect-card-accent,var(--wzl-fg-muted));font-size:var(--wzl-font-size);font-weight:var(--wzl-font-weight-bold);font-family:var(--wzl-font-mono);background:0 0;border:0;justify-content:center;align-items:baseline;padding:0 2px;line-height:1;display:inline-flex}._cardTitle_vxnqc_648{font-family:var(--wzl-font-display);font-weight:var(--wzl-font-weight-medium);font-size:var(--wzl-font-size);line-height:var(--wzl-leading-tight);color:var(--wzl-fg);text-transform:uppercase;letter-spacing:.04em}._cardPrimary_vxnqc_658{font-family:var(--wzl-font-ui);font-weight:var(--wzl-font-weight-medium);font-size:var(--wzl-font-size-sm);line-height:var(--wzl-leading-tight);color:var(--wzl-fg);border:1px solid var(--wzl-border);border-radius:var(--wzl-radius-sm);background:#0000004d;margin-left:auto;padding:2px 6px}._cardHead_vxnqc_596 ._cardRemove_vxnqc_673,._cardHead_vxnqc_596 ._cardPrimary_vxnqc_658+._cardRemove_vxnqc_673{margin-left:auto}._cardHead_vxnqc_596 ._cardPrimary_vxnqc_658~._cardRemove_vxnqc_673{margin-left:4px}._cardRemove_vxnqc_673{color:var(--wzl-fg-muted);border-radius:var(--wzl-radius-sm);width:22px;height:22px;font-size:var(--wzl-font-size);cursor:pointer;background:0 0;border:1px solid #0000;justify-content:center;align-items:center;display:inline-flex}._cardRemove_vxnqc_673:hover{color:var(--wzl-danger-fg,var(--wzl-danger));border-color:color-mix(in srgb, var(--wzl-danger) 40%, transparent);background:color-mix(in srgb, var(--wzl-danger) 8%, transparent)}._cardBody_vxnqc_702{border-top:1px solid var(--wzl-border);padding:4px 12px 12px}._cardList_vxnqc_15{flex-direction:column;gap:6px;display:flex}._cardListWrap_vxnqc_714{position:relative}._cardDropHint_vxnqc_718{border-top:2px solid var(--wzl-accent);border-radius:var(--wzl-radius-sm);height:0;box-shadow:0 0 6px color-mix(in srgb, var(--wzl-accent) 60%, transparent);margin:2px 0}._cardListEmpty_vxnqc_726{font-family:var(--wzl-font-display);font-weight:var(--wzl-font-weight-light);font-size:var(--wzl-font-size-sm);line-height:var(--wzl-leading);color:var(--wzl-fg-muted);text-align:center;border:1px dashed var(--wzl-border);border-radius:var(--wzl-radius-sm);padding:16px 12px}._handle_c4v7n_1{cursor:ew-resize;border-left:1px solid var(--wzl-border);touch-action:none;background:0 0;flex-shrink:0;align-self:stretch;width:4px}._handle_c4v7n_1._horizontal_c4v7n_14{cursor:ns-resize;border-left:none;border-top:1px solid var(--wzl-border);align-self:auto;width:auto;height:4px}._handle_c4v7n_1:hover{background:var(--wzl-border)}._handle_c4v7n_1:focus-visible{outline:2px solid var(--wzl-focus-ring,var(--wzl-accent));outline-offset:-1px}._root_q9h3j_1{font-size:var(--wzl-font-size-sm);color:var(--wzl-fg);flex-direction:column;display:flex}._header_q9h3j_8{border-block-end:1px solid var(--wzl-border);align-items:baseline;gap:8px;padding:8px 0;display:flex}._kind_q9h3j_16{font-weight:var(--wzl-font-weight-bold);font-size:var(--wzl-font-size)}._breakdown_q9h3j_21{font-size:var(--wzl-font-size-sm);opacity:.6}._section_q9h3j_26{border-block-end:1px solid var(--wzl-border);padding:6px 0 8px}._section_q9h3j_26:last-child{border-block-end:none}._sectionTitle_q9h3j_35{font-size:var(--wzl-font-size-xs);font-weight:var(--wzl-font-weight-bold);text-transform:uppercase;letter-spacing:.06em;opacity:.55;margin:0 0 6px}._row_q9h3j_44{grid-template-columns:64px 1fr;align-items:center;gap:6px;margin-block-end:5px;display:grid}._rowLabel_q9h3j_52{opacity:.75}._rowControls_q9h3j_56{flex-wrap:wrap;align-items:center;gap:6px;min-inline-size:0;display:flex}._namedField_q9h3j_66{align-items:center;gap:4px;min-inline-size:0;display:flex}._namedField_q9h3j_66>svg{opacity:.75;flex:none}._blockRow_q9h3j_78{margin-block-end:5px}._rowControls_q9h3j_56>._namedField_q9h3j_66{flex:1 1 0}._rowControls_q9h3j_56>._namedField_q9h3j_66:has(>._toggle_q9h3j_89){flex:0 auto}._rowControls_q9h3j_56>*{flex:1;min-inline-size:0}._rowControls_q9h3j_56>._toggle_q9h3j_89{flex:auto}._rowControls_q9h3j_56>._toggle_q9h3j_89:only-child{flex:0 auto}._rowControls_q9h3j_56>._flagToggle_q9h3j_111{flex:none}._number_q9h3j_115 input,._select_q9h3j_116{font-size:var(--wzl-font-size-sm)}._unitSuffix_q9h3j_120{font-size:var(--wzl-font-size-sm);opacity:.6;flex:none}._mixedSwitch_q9h3j_126{opacity:.55}._unrenderable_q9h3j_130{font-size:var(--wzl-font-size-sm);opacity:.5;font-style:italic}._objectLeaf_q9h3j_137{margin-block:8px 4px}._objectLeaf_q9h3j_137 ._sectionTitle_q9h3j_35{margin-block:7px 5px}._objectGroup_q9h3j_146{border-inline-start:1px solid var(--wzl-border);margin-block-end:4px;padding-inline-start:8px}._slider_q9h3j_153{flex:1}._sliderReadout_q9h3j_157{text-align:end;min-inline-size:3ch;font-size:var(--wzl-font-size-sm);opacity:.7;flex:none}._sidebar_toyo8_1{background:var(--wzl-surface);color:var(--wzl-fg);flex-direction:column;gap:4px;display:flex}._sidebar_toyo8_1._left_toyo8_9{border-right:1px solid var(--wzl-border)}._sidebar_toyo8_1._right_toyo8_12{border-left:1px solid var(--wzl-border)}._panel_1dobg_1{background:var(--wzl-surface);color:var(--wzl-fg);padding:8px 0}._title_1dobg_9{font-size:var(--wzl-font-size-sm);font-weight:var(--wzl-font-weight-bold);text-transform:uppercase;letter-spacing:.05em;color:var(--wzl-fg-muted)}._titleRow_1dobg_17{justify-content:space-between;align-items:center;margin-bottom:4px;padding:0;display:flex}._titleButton_1dobg_25{cursor:pointer;color:inherit;font:inherit;text-align:left;background:0 0;border:0;flex:auto;align-items:center;gap:4px;padding:4px 8px;display:inline-flex}._titleButton_1dobg_25:hover{color:var(--wzl-fg)}._chevron_1dobg_42{color:var(--wzl-fg-muted);transition:transform var(--wzl-motion-fast) ease;flex:none}._chevronCollapsed_1dobg_47{transform:rotate(-90deg)}._hideButton_1dobg_51{font-size:var(--wzl-font-size);color:var(--wzl-fg-muted);cursor:pointer;background:0 0;border:0;padding:0 8px;line-height:1}._hideButton_1dobg_51:hover{color:var(--wzl-fg)}._panel_1dobg_1._collapsed_1dobg_64{padding-bottom:4px}._body_1dobg_68{padding:0}._bar_49hmb_1{font-family:var(--wzl-font-mono,ui-monospace, SFMono-Regular, Menlo, monospace);font-size:var(--wzl-font-size-sm);color:var(--wzl-fg-muted);background:var(--wzl-surface);border-top:1px solid var(--wzl-border);flex-shrink:0;align-items:center;gap:16px;padding:4px 12px;display:flex}._item_49hmb_14{white-space:nowrap}._muted_49hmb_18{opacity:.6;font-variant-numeric:tabular-nums}._hasTitle_49hmb_23{cursor:help}._spacer_49hmb_27{margin-left:auto}._tabs_1mx31_1{font-family:var(--wzl-font-ui);color:var(--wzl-fg);flex-direction:column;gap:0;display:flex}._tabs_1mx31_1[data-orientation=horizontal]{flex-direction:column}._tabs_1mx31_1[data-orientation=vertical]{flex-direction:row;gap:12px}._list_1mx31_18{border-bottom:1px solid var(--wzl-border);gap:2px;display:flex}._tabs_1mx31_1[data-orientation=vertical] ._list_1mx31_18{border-bottom:none;border-right:1px solid var(--wzl-border);flex-direction:column;padding-right:8px}._tab_1mx31_1{color:var(--wzl-fg-muted);font:inherit;font-size:var(--wzl-font-size-sm);cursor:pointer;transition:color var(--wzl-motion-fast);background:0 0;border:none;outline:none;padding:6px 10px;position:relative}._tab_1mx31_1[data-hovered]:not([data-disabled]),._tab_1mx31_1[data-selected]{color:var(--wzl-fg)}._tab_1mx31_1[data-selected]:after{content:"";background:var(--wzl-accent-strong);height:2px;position:absolute;bottom:-1px;left:0;right:0}._tabs_1mx31_1[data-orientation=vertical] ._tab_1mx31_1[data-selected]:after{width:2px;height:auto;inset:0 -9px 0 auto}._tab_1mx31_1[data-focus-visible]{box-shadow:inset 0 0 0 2px var(--wzl-focus-ring);border-radius:var(--wzl-radius-sm)}._tab_1mx31_1[data-disabled]{opacity:.5;cursor:not-allowed}._panel_1mx31_81{outline:none;padding:12px 0}._panel_1mx31_81[data-focus-visible]{box-shadow:inset 0 0 0 2px var(--wzl-focus-ring);border-radius:var(--wzl-radius-sm)}._ruler_gapxk_1{height:var(--wzl-control-h,24px);border-bottom:1px solid var(--wzl-border);background:var(--wzl-surface-raised);cursor:ew-resize;-webkit-user-select:none;user-select:none;position:relative;overflow:hidden}._tick_gapxk_11{color:var(--wzl-fg-muted);pointer-events:none;white-space:nowrap;position:absolute;top:0;transform:translate(2px)}._tick_gapxk_11:before{content:"";border-left:1px solid var(--wzl-border);position:absolute;top:0;bottom:0;left:-2px}._playhead_gapxk_29{background:var(--wzl-accent-strong);pointer-events:none;width:1px;position:absolute;top:0;bottom:0}._lane_gapxk_38{border-bottom:1px solid var(--wzl-line-subtle);align-items:stretch;min-height:20px;display:flex}._laneLabel_gapxk_45{flex:0 0 var(--wzl-timeline-label-w,120px);padding-inline:6px;font-size:var(--wzl-font-size);color:var(--wzl-fg);text-overflow:ellipsis;white-space:nowrap;align-items:center;gap:4px;padding-inline-start:calc(6px + var(--depth,0) * 12px);display:flex;overflow:hidden}._lane_gapxk_38[data-depth="1"] ._laneLabel_gapxk_45{--depth:1}._lane_gapxk_38[data-depth="2"] ._laneLabel_gapxk_45{--depth:2}._lane_gapxk_38[data-depth="3"] ._laneLabel_gapxk_45{--depth:3}._disclosure_gapxk_63{cursor:pointer;color:var(--wzl-fg-muted);flex:none;display:inline-flex}._disclosureIcon_gapxk_64{transition:transform var(--wzl-motion-fast) ease}._disclosureCollapsed_gapxk_65{transform:rotate(-90deg)}._laneTrack_gapxk_67{background:var(--wzl-surface);flex:auto;min-width:0;position:relative}._key_gapxk_74,._eventMark_gapxk_74{background:var(--wzl-fg-muted);cursor:ew-resize;width:9px;height:9px;margin-left:-4.5px;position:absolute;top:50%}._key_gapxk_74{transform:translateY(-50%)rotate(45deg)}._eventMark_gapxk_74{border-radius:50%;transform:translateY(-50%)}._key_gapxk_74[aria-current=true],._eventMark_gapxk_74[aria-current=true]{background:var(--wzl-accent-strong)}._key_gapxk_74:focus-visible,._eventMark_gapxk_74:focus-visible{outline:2px solid var(--wzl-focus-ring);outline-offset:1px}._key_gapxk_74[data-dragging=true],._eventMark_gapxk_74[data-dragging=true]{opacity:.4}._keyGhost_gapxk_94,._eventGhost_gapxk_94{background:var(--wzl-accent-soft);border:1px dashed var(--wzl-accent-strong);pointer-events:none;width:9px;height:9px;margin-left:-4.5px;position:absolute;top:50%}._keyGhost_gapxk_94{transform:translateY(-50%)rotate(45deg)}._eventGhost_gapxk_94{border-radius:50%;transform:translateY(-50%)}._lane_gapxk_38[data-mode=graph] ._keyGhost_gapxk_94{top:auto;transform:translateY(50%)rotate(45deg)}._curve_gapxk_109{pointer-events:none;fill:none;width:100%;height:100%;stroke:var(--wzl-accent-strong);stroke-width:1px;position:absolute;inset:0}._lane_gapxk_38[data-mode=graph]{min-height:72px}._lane_gapxk_38[data-mode=graph] ._key_gapxk_74{top:auto;transform:translateY(50%)rotate(45deg)}._nestedBar_gapxk_123{background:var(--wzl-surface-sunken);border:1px solid var(--wzl-border);border-radius:var(--wzl-radius-sm);position:absolute;top:4px;bottom:4px}._transport_gapxk_132{border-bottom:1px solid var(--wzl-border);background:var(--wzl-surface-raised);align-items:center;gap:8px;padding:4px 6px;display:flex}._transportButton_gapxk_141{background:var(--wzl-surface);border:1px solid var(--wzl-border);border-radius:var(--wzl-radius-sm);min-width:22px;color:var(--wzl-fg);cursor:pointer;justify-content:center;align-items:center;padding:2px 6px;display:inline-flex}._transportButton_gapxk_141:hover{border-color:var(--wzl-fg-muted)}._transportButton_gapxk_141[aria-checked=true]{background:var(--wzl-accent-soft);border-color:var(--wzl-accent-strong);color:var(--wzl-accent-strong)}._transportRow_gapxk_167{border-bottom:1px solid var(--wzl-border);background:var(--wzl-surface-raised);align-items:center;gap:8px;padding-inline-end:6px;display:flex}._transportRow_gapxk_167>._transport_gapxk_132{background:0 0;border-bottom:0;flex:auto}._time_gapxk_182{font-variant-numeric:tabular-nums;color:var(--wzl-fg-muted)}._rate_gapxk_183{color:var(--wzl-fg-muted);align-items:center;gap:6px;display:inline-flex}._rateSlider_gapxk_184{width:88px}._rateReadout_gapxk_188{font-variant-numeric:tabular-nums;min-width:3ch;color:var(--wzl-fg)}._root_gapxk_194{background:var(--wzl-surface);border:1px solid var(--wzl-border);border-radius:var(--wzl-radius-sm);min-height:0;color:var(--wzl-fg);font-family:var(--wzl-font-ui);font-size:var(--wzl-font-size-sm);line-height:var(--wzl-leading-snug);flex-direction:column;display:flex}._label_gapxk_209{color:var(--wzl-fg-muted);padding:4px 6px}._body_gapxk_211{align-items:stretch;display:flex}._gutter_gapxk_212{flex:0 0 var(--wzl-timeline-label-w,120px);border-right:1px solid var(--wzl-border)}._rulerWrap_gapxk_213{flex:auto;min-width:0}._lanes_gapxk_215{flex:auto;min-height:0;overflow:hidden auto}._inspector_gapxk_222{border-top:1px solid var(--wzl-border);background:var(--wzl-surface-raised);align-items:center;gap:8px;padding:4px 6px;display:flex}._segment_gapxk_231{cursor:pointer;position:absolute;top:0;bottom:0}._segment_gapxk_231[aria-current=true]{background:var(--wzl-accent-soft)}._segment_gapxk_231:focus-visible{outline:2px solid var(--wzl-focus-ring);outline-offset:-2px}._easingPicker_gapxk_241{align-items:center;gap:6px;display:inline-flex}._easingLabel_gapxk_242{font-variant-numeric:tabular-nums;color:var(--wzl-fg-muted)}._easingPreview_gapxk_244{fill:none;width:32px;height:32px;stroke:var(--wzl-accent-strong);stroke-width:1px;border:1px solid var(--wzl-border)}._bezierHandle_gapxk_253{background:var(--wzl-surface);border:1px solid var(--wzl-accent-strong);cursor:grab;border-radius:50%;width:7px;height:7px;margin:-3.5px 0 0 -3.5px;position:absolute}._region_611s6_1{z-index:1100;outline:none;flex-direction:column-reverse;gap:8px;max-width:360px;display:flex;position:fixed}._bottomRight_611s6_17{bottom:16px;right:16px}._bottomLeft_611s6_18{bottom:16px;left:16px}._topRight_611s6_19{flex-direction:column;top:16px;right:16px}._topLeft_611s6_20{flex-direction:column;top:16px;left:16px}._toast_611s6_22{--toast-accent:var(--wzl-accent-strong);view-transition-class:wzl-toast;background:var(--wzl-surface);border:1px solid var(--wzl-border);border-left:3px solid var(--toast-accent);border-radius:var(--wzl-radius-md);color:var(--wzl-fg);font-family:var(--wzl-font-ui);outline:none;align-items:flex-start;gap:8px;padding:10px 12px;display:flex;box-shadow:0 8px 24px #00000059}._region_611s6_1[data-focus-visible],._toast_611s6_22[data-focus-visible]{outline:2px solid var(--wzl-focus-ring);outline-offset:1px}._toneSuccess_611s6_49{--toast-accent:var(--wzl-success,#2ec27e)}._toneWarning_611s6_50{--toast-accent:var(--wzl-warning,#d99a3f)}._toneError_611s6_51{--toast-accent:var(--wzl-danger)}._content_611s6_53{flex:1;min-width:0}._title_611s6_58{font-size:var(--wzl-font-size);font-weight:var(--wzl-font-weight-bold);display:block}._description_611s6_64{font-size:var(--wzl-font-size-sm);color:var(--wzl-fg-muted);margin-top:2px;display:block}._close_611s6_71{color:var(--wzl-fg-muted);font-size:var(--wzl-font-size-lg);cursor:pointer;border-radius:var(--wzl-radius-sm);background:0 0;border:none;flex:none;padding:2px 4px;line-height:1}._close_611s6_71:hover{color:var(--wzl-fg)}:root.wzl-toast-vt{view-transition-name:none}:root.wzl-toast-vt::view-transition{pointer-events:none}:root.wzl-toast-vt::view-transition-new(.wzl-toast):only-child{animation:wzl-toast-enter var(--wzl-motion-medium,.24s) var(--wzl-ease-out-cubic,ease-out) both}:root.wzl-toast-vt::view-transition-old(.wzl-toast):only-child{animation:wzl-toast-exit var(--wzl-motion-fast,.12s) var(--wzl-ease-in-cubic,ease-in) both}@keyframes wzl-toast-enter{0%{opacity:0;translate:0 16px}}@keyframes wzl-toast-exit{to{opacity:0;scale:.92}}._button_1gdyt_1{border-radius:var(--wzl-radius-sm);min-width:44px;color:var(--wzl-fg);cursor:default;font-family:inherit;font-size:var(--wzl-font-size-xs);background:0 0;border:1px solid #0000;flex-direction:column;justify-content:center;align-items:center;gap:2px;padding:6px 4px;line-height:1.1;display:inline-flex}._button_1gdyt_1:hover:not([disabled]){background:var(--wzl-surface-hover);color:var(--wzl-fg)}._button_1gdyt_1:focus-visible{outline:2px solid var(--wzl-accent);outline-offset:-2px}._button_1gdyt_1._active_1gdyt_26{background:var(--wzl-surface-pressed);border-color:var(--wzl-accent);color:var(--wzl-fg)}._button_1gdyt_1[disabled]{opacity:.4}._icon_1gdyt_35,._icon_1gdyt_35>svg{display:block}._label_1gdyt_37{font-size:var(--wzl-font-size-xs)}._shortcut_1gdyt_38{color:var(--wzl-fg-muted);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:var(--wzl-font-size-2xs)}._group_o2pho_1{flex-direction:column;gap:2px;display:flex}._group_o2pho_1._horizontal_o2pho_6{flex-direction:row}._root_cfvzx_13{height:var(--wzl-tb-height,28px);background:var(--wzl-surface);border-bottom:1px solid var(--wzl-border);color:var(--wzl-fg);align-items:center;gap:8px;padding:0 8px;display:flex;overflow:hidden}._label_cfvzx_25{font-size:var(--wzl-font-size-sm);font-weight:var(--wzl-font-weight-bold);text-transform:uppercase;letter-spacing:.05em;color:var(--wzl-fg-muted);white-space:nowrap;flex:none}._controls_cfvzx_6{scrollbar-width:thin;flex:auto;align-items:center;gap:6px;min-width:0;height:100%;display:flex;overflow:auto hidden}._controls_cfvzx_6::-webkit-scrollbar{height:4px}._controls_cfvzx_6::-webkit-scrollbar-track{background:0 0}._controls_cfvzx_6::-webkit-scrollbar-thumb{background:var(--wzl-border);border-radius:var(--wzl-radius-sm)}._palette_tbdk7_1{background:var(--wzl-surface);border:1px solid var(--wzl-border);border-radius:var(--wzl-radius-sm);-webkit-user-select:none;user-select:none;flex-direction:column;gap:4px;padding:4px;display:flex}._palette_tbdk7_1._horizontal_tbdk7_11{flex-direction:row}._ineligibleBtn_tbdk7_20{opacity:.35;cursor:not-allowed}._separator_tbdk7_25{background:var(--wzl-border)}._palette_tbdk7_1:not(._horizontal_tbdk7_11) ._separator_tbdk7_25{height:1px;margin:2px 0}._palette_tbdk7_1._horizontal_tbdk7_11 ._separator_tbdk7_25{width:1px;margin:0 2px}
@@ -1,5 +1,5 @@
1
- export { SurfaceCanvasContext, SurfaceContext, composeRects, rectsEqual, toDeviceRect, useSurface, useSurfaceCanvas, useSurfaceOptional, useSurfaceTile, useTileId, useTiledSurface } from '../chunk-B5VWJBWM.js';
1
+ export { SurfaceCanvasContext, SurfaceContext, composeRects, rectsEqual, toDeviceRect, useSurface, useSurfaceCanvas, useSurfaceOptional, useSurfaceTile, useTileId, useTiledSurface } from '../chunk-OFCBEZMU.js';
2
2
  import '../chunk-2YILQ7Y5.js';
3
- import '../chunk-7VW3S44V.js';
3
+ import '../chunk-DG2IFMLA.js';
4
4
  //# sourceMappingURL=index.js.map
5
5
  //# sourceMappingURL=index.js.map
@@ -1,4 +1,4 @@
1
- export { c3 as LayerStack } from '../../chunk-L5WBGUVR.js';
2
- import '../../chunk-7VW3S44V.js';
1
+ export { c3 as LayerStack } from '../../chunk-J6SBFZYT.js';
2
+ import '../../chunk-DG2IFMLA.js';
3
3
  //# sourceMappingURL=index.js.map
4
4
  //# sourceMappingURL=index.js.map
@@ -1,10 +1,11 @@
1
- export { a0 as UndoCapability } from '../_dts/frac-QS7XzvpG.js';
1
+ export { a0 as UndoCapability } from '../_dts/frac-X7mWgd7y.js';
2
2
  import 'react';
3
- import '../_dts/types-C1Zw7s5P.js';
4
- import '../_dts/PrefsForm-BkUJZx0A.js';
3
+ import '../_dts/types-lg4TSCb2.js';
4
+ import '../_dts/weasel-canvas-FJTFi3ZZ.js';
5
+ import 'react/jsx-runtime';
6
+ import '../_dts/PrefsForm.d-CgxUequc.js';
5
7
  import '../_dts/types-ChVJJHvk.js';
6
8
  import '../_dts/types-DJ79Tg5J.js';
7
- import '../_dts/types-C-gh9Ap-.js';
8
9
 
9
10
  /** A subscriber to a named event. */
10
11
  type EventListener = () => void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@weasel-js/labkit",
3
- "version": "1.4.0",
3
+ "version": "1.4.1",
4
4
  "description": "React widgets for building self-contained interactive lab pages",
5
5
  "license": "MIT",
6
6
  "author": "orochi235",
@@ -93,7 +93,7 @@
93
93
  "dev:drag": "LABKIT_EXAMPLE=drag-lab vite",
94
94
  "dev:weasel": "LABKIT_EXAMPLE=weasel-lab vite",
95
95
  "build": "tsup && npm run build:dts && npm run build:css && npm run build:fonts",
96
- "build:dts": "NODE_OPTIONS=--max-old-space-size=8192 tsx scripts/build-dts.mts",
96
+ "build:dts": "NODE_OPTIONS=--max-old-space-size=3072 tsx scripts/build-dts.mts",
97
97
  "prepublishOnly": "npm run build",
98
98
  "build:css": "node scripts/build-css.mjs",
99
99
  "build:fonts": "mkdir -p dist/fonts && cp ../theme/fonts/*.woff2 dist/fonts/",
@@ -114,11 +114,11 @@
114
114
  "react-dom": "^19.0.0"
115
115
  },
116
116
  "dependencies": {
117
- "@weasel-js/core": "1.4.0",
118
- "@weasel-js/loupe": "1.4.0",
119
- "@weasel-js/svg": "1.4.0",
120
- "@weasel-js/theme": "1.4.0",
121
- "@weasel-js/ui": "1.4.0",
117
+ "@weasel-js/core": "1.4.1",
118
+ "@weasel-js/loupe": "1.4.1",
119
+ "@weasel-js/svg": "1.4.1",
120
+ "@weasel-js/theme": "1.4.1",
121
+ "@weasel-js/ui": "1.4.1",
122
122
  "earcut": "2.2.4",
123
123
  "polygon-clipping": "^0.15.7",
124
124
  "react-aria-components": "^1.5.0",
@@ -129,7 +129,7 @@
129
129
  "@biomejs/biome": "^2.4.12",
130
130
  "@rollup/plugin-alias": "^6.0.0",
131
131
  "@testing-library/jest-dom": "^6.6.0",
132
- "@weasel-js/modes": "1.4.0",
132
+ "@weasel-js/modes": "1.4.1",
133
133
  "less": "^4.2.0",
134
134
  "rollup-plugin-dts": "^6.4.1",
135
135
  "tsx": "^4.19.0",
@@ -81,7 +81,14 @@ export function CanvasStack({
81
81
 
82
82
  const frame = useMemo(() => resolveFrame(worldSpec, size), [worldSpec, size]);
83
83
 
84
- const handlers = usePanZoom({ view, onViewChange, minZoom, maxZoom, frame });
84
+ const onTap = (e: PointerEvent) => {
85
+ const el = containerRef.current;
86
+ if (!onHitTest || !el) return;
87
+ const rect = el.getBoundingClientRect();
88
+ onHitTest(screenToWorld({ x: e.clientX - rect.left, y: e.clientY - rect.top }, view, frame));
89
+ };
90
+
91
+ const handlers = usePanZoom({ view, onViewChange, minZoom, maxZoom, frame, onTap });
85
92
  useLayerScheduler({ layers, view, frame, canvasRefs: canvasMap, size, host: containerRef });
86
93
 
87
94
  const ctxValue = useMemo(
@@ -103,16 +110,6 @@ export function CanvasStack({
103
110
  height: size.height,
104
111
  };
105
112
 
106
- const handlePointerUp = (e: React.PointerEvent<HTMLDivElement>) => {
107
- const wasDragging = handlers.isDragging();
108
- handlers.onPointerUp(e);
109
- if (!wasDragging && onHitTest && containerRef.current) {
110
- const rect = containerRef.current.getBoundingClientRect();
111
- const screen = { x: e.clientX - rect.left, y: e.clientY - rect.top };
112
- onHitTest(screenToWorld(screen, view, frame));
113
- }
114
- };
115
-
116
113
  return (
117
114
  <CanvasStackContext.Provider value={ctxValue}>
118
115
  <div
@@ -121,8 +118,6 @@ export function CanvasStack({
121
118
  style={containerStyle}
122
119
  onWheel={handlers.onWheel}
123
120
  onPointerDown={handlers.onPointerDown}
124
- onPointerMove={handlers.onPointerMove}
125
- onPointerUp={handlePointerUp}
126
121
  >
127
122
  {layers.map((layer) => (
128
123
  <canvas
@@ -1,5 +1,15 @@
1
+ import { act, renderHook } from '@testing-library/react';
2
+ import type { PointerEvent as ReactPointerEvent } from 'react';
1
3
  import { describe, expect, it } from 'vitest';
2
- import { clampPitch, orbitAfterDrag, orbitAfterWheel, PITCH_LIMIT, wrapYaw } from './useOrbit';
4
+ import {
5
+ clampPitch,
6
+ type OrbitView,
7
+ orbitAfterDrag,
8
+ orbitAfterWheel,
9
+ PITCH_LIMIT,
10
+ useOrbit,
11
+ wrapYaw,
12
+ } from './useOrbit';
3
13
 
4
14
  const view = { yaw: 0, pitch: 0, distance: 5, target: { x: 0, y: 0, z: 0 } };
5
15
 
@@ -69,3 +79,85 @@ describe('orbitAfterWheel', () => {
69
79
  expect(orbitAfterWheel(view, -100_000, 0.5, 50).distance).toBe(0.5);
70
80
  });
71
81
  });
82
+
83
+ /** The fields `useOrbit` reads off a React pointerdown, plus the element the
84
+ * session hangs its document listeners off. */
85
+ function press(
86
+ el: HTMLElement,
87
+ x: number,
88
+ y: number,
89
+ init: { pointerId?: number; button?: number; buttons?: number } = {},
90
+ ): ReactPointerEvent<HTMLElement> {
91
+ return {
92
+ pointerId: init.pointerId ?? 1,
93
+ button: init.button ?? 0,
94
+ buttons: init.buttons ?? 1,
95
+ clientX: x,
96
+ clientY: y,
97
+ currentTarget: el,
98
+ } as unknown as ReactPointerEvent<HTMLElement>;
99
+ }
100
+
101
+ function dispatchOn(target: EventTarget, type: string, init: PointerEventInit) {
102
+ act(() => {
103
+ target.dispatchEvent(new PointerEvent(type, { pointerId: 1, bubbles: true, ...init }));
104
+ });
105
+ }
106
+
107
+ function dragSetup() {
108
+ let current: OrbitView = view;
109
+ const onViewChange = (v: OrbitView) => {
110
+ current = v;
111
+ };
112
+ const { result, unmount } = renderHook(() => useOrbit({ view, onViewChange }));
113
+ const el = document.createElement('div');
114
+ document.body.appendChild(el);
115
+ return { result, unmount, el, getView: () => current };
116
+ }
117
+
118
+ describe('useOrbit dragging', () => {
119
+ it('turns from a move the element never sees', () => {
120
+ const { result, el, getView } = dragSetup();
121
+ act(() => result.current.onPointerDown(press(el, 100, 100)));
122
+ dispatchOn(document, 'pointermove', { buttons: 1, clientX: 200, clientY: 150 });
123
+ expect(getView()).toEqual(orbitAfterDrag(view, 100, 50));
124
+ });
125
+
126
+ it('ends the drag on a release dispatched off the element', () => {
127
+ const { result, el, getView } = dragSetup();
128
+ act(() => result.current.onPointerDown(press(el, 100, 100)));
129
+ dispatchOn(document, 'pointermove', { buttons: 1, clientX: 200, clientY: 150 });
130
+ dispatchOn(document, 'pointerup', { clientX: 200, clientY: 150 });
131
+ expect(result.current.isDragging()).toBe(false);
132
+ dispatchOn(document, 'pointermove', { buttons: 1, clientX: 400, clientY: 400 });
133
+ expect(getView()).toEqual(orbitAfterDrag(view, 100, 50));
134
+ });
135
+
136
+ it('ends the drag when capture is lost mid-gesture', () => {
137
+ const { result, el, getView } = dragSetup();
138
+ act(() => result.current.onPointerDown(press(el, 100, 100)));
139
+ dispatchOn(document, 'pointermove', { buttons: 1, clientX: 200, clientY: 150 });
140
+ dispatchOn(el, 'lostpointercapture', {});
141
+ expect(result.current.isDragging()).toBe(false);
142
+ dispatchOn(document, 'pointermove', { buttons: 1, clientX: 400, clientY: 400 });
143
+ expect(getView()).toEqual(orbitAfterDrag(view, 100, 50));
144
+ });
145
+
146
+ it('reads a move with nothing held as the release that never arrived', () => {
147
+ const { result, el, getView } = dragSetup();
148
+ act(() => result.current.onPointerDown(press(el, 100, 100, { buttons: 1 })));
149
+ dispatchOn(document, 'pointermove', { buttons: 1, clientX: 200, clientY: 150 });
150
+ expect(getView()).toEqual(orbitAfterDrag(view, 100, 50));
151
+ dispatchOn(document, 'pointermove', { buttons: 0, clientX: 400, clientY: 400 });
152
+ expect(getView()).toEqual(orbitAfterDrag(view, 100, 50));
153
+ expect(result.current.isDragging()).toBe(false);
154
+ });
155
+
156
+ it('drops its listeners when the hook unmounts mid-drag', () => {
157
+ const { result, el, unmount, getView } = dragSetup();
158
+ act(() => result.current.onPointerDown(press(el, 100, 100)));
159
+ unmount();
160
+ dispatchOn(document, 'pointermove', { buttons: 1, clientX: 400, clientY: 400 });
161
+ expect(getView()).toEqual(view);
162
+ });
163
+ });
@@ -1,4 +1,11 @@
1
- import { type PointerEvent, useCallback, useRef, type WheelEvent } from 'react';
1
+ import { openPointerSession, type PointerSession } from '@weasel-js/core';
2
+ import {
3
+ type PointerEvent as ReactPointerEvent,
4
+ useCallback,
5
+ useEffect,
6
+ useRef,
7
+ type WheelEvent,
8
+ } from 'react';
2
9
 
3
10
  /** A point in the space the instrument works in. */
4
11
  export interface Vec3 {
@@ -70,15 +77,12 @@ export interface UseOrbitOptions {
70
77
 
71
78
  export interface OrbitHandlers {
72
79
  onWheel: (e: WheelEvent<HTMLElement>) => void;
73
- onPointerDown: (e: PointerEvent<HTMLElement>) => void;
74
- onPointerMove: (e: PointerEvent<HTMLElement>) => void;
75
- onPointerUp: (e: PointerEvent<HTMLElement>) => void;
80
+ onPointerDown: (e: ReactPointerEvent<HTMLElement>) => void;
76
81
  onDoubleClick: () => void;
77
82
  isDragging: () => boolean;
78
83
  }
79
84
 
80
85
  interface DragState {
81
- pointerId: number;
82
86
  startX: number;
83
87
  startY: number;
84
88
  startView: OrbitView;
@@ -95,8 +99,11 @@ export function useOrbit({
95
99
  maxDistance = 1000,
96
100
  }: UseOrbitOptions): OrbitHandlers {
97
101
  const dragRef = useRef<DragState | null>(null);
102
+ const sessionRef = useRef<PointerSession | null>(null);
98
103
  const viewRef = useRef(view);
99
104
  viewRef.current = view;
105
+ const onViewChangeRef = useRef(onViewChange);
106
+ onViewChangeRef.current = onViewChange;
100
107
  const homeRef = useRef(home ?? view);
101
108
  if (home) homeRef.current = home;
102
109
 
@@ -108,42 +115,42 @@ export function useOrbit({
108
115
  [onViewChange, minDistance, maxDistance],
109
116
  );
110
117
 
111
- const onPointerDown = useCallback((e: PointerEvent<HTMLElement>) => {
112
- if (e.button !== 0) return;
113
- e.currentTarget.setPointerCapture(e.pointerId);
114
- dragRef.current = {
115
- pointerId: e.pointerId,
116
- startX: e.clientX,
117
- startY: e.clientY,
118
- startView: viewRef.current,
119
- moved: false,
120
- };
118
+ const clearDrag = useCallback(() => {
119
+ dragRef.current = null;
120
+ sessionRef.current = null;
121
121
  }, []);
122
122
 
123
- const onPointerMove = useCallback(
124
- (e: PointerEvent<HTMLElement>) => {
125
- const drag = dragRef.current;
126
- if (!drag || drag.pointerId !== e.pointerId) return;
127
- const dx = e.clientX - drag.startX;
128
- const dy = e.clientY - drag.startY;
129
- if (!drag.moved && Math.hypot(dx, dy) < DRAG_THRESHOLD) return;
130
- drag.moved = true;
131
- onViewChange(orbitAfterDrag(drag.startView, dx, dy));
123
+ const onPointerDown = useCallback(
124
+ (e: ReactPointerEvent<HTMLElement>) => {
125
+ if (e.button !== 0) return;
126
+ const drag: DragState = {
127
+ startX: e.clientX,
128
+ startY: e.clientY,
129
+ startView: viewRef.current,
130
+ moved: false,
131
+ };
132
+ dragRef.current = drag;
133
+ sessionRef.current = openPointerSession(e.currentTarget, e, {
134
+ onMove: (ev) => {
135
+ const dx = ev.clientX - drag.startX;
136
+ const dy = ev.clientY - drag.startY;
137
+ if (!drag.moved && Math.hypot(dx, dy) < DRAG_THRESHOLD) return;
138
+ drag.moved = true;
139
+ onViewChangeRef.current(orbitAfterDrag(drag.startView, dx, dy));
140
+ },
141
+ onEnd: clearDrag,
142
+ // A cancelled turn keeps where it got to: every move was committed as
143
+ // it arrived, so there is nothing left to undo.
144
+ onCancel: clearDrag,
145
+ });
132
146
  },
133
- [onViewChange],
147
+ [clearDrag],
134
148
  );
135
149
 
136
- const onPointerUp = useCallback((e: PointerEvent<HTMLElement>) => {
137
- const drag = dragRef.current;
138
- if (!drag || drag.pointerId !== e.pointerId) return;
139
- if (e.currentTarget.hasPointerCapture(e.pointerId)) {
140
- e.currentTarget.releasePointerCapture(e.pointerId);
141
- }
142
- dragRef.current = null;
143
- }, []);
150
+ useEffect(() => () => sessionRef.current?.cancel(), []);
144
151
 
145
152
  const onDoubleClick = useCallback(() => onViewChange(homeRef.current), [onViewChange]);
146
153
  const isDragging = useCallback(() => dragRef.current?.moved === true, []);
147
154
 
148
- return { onWheel, onPointerDown, onPointerMove, onPointerUp, onDoubleClick, isDragging };
155
+ return { onWheel, onPointerDown, onDoubleClick, isDragging };
149
156
  }