@weasel-js/labkit 1.5.2 → 1.6.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 (217) hide show
  1. package/README.md +3 -7
  2. package/dist/_dts/{CanvasStackContext-CMMo180l.d.ts → CanvasStackContext-Wo6OwIVM.d.ts} +1 -1
  3. package/dist/_dts/FloatingPanel-7j0IcXwz.d.ts +30 -0
  4. package/dist/_dts/LayerList.d-BoELAMsM.d.ts +83 -0
  5. package/dist/_dts/{PrefsForm.d-DPy9I8It.d.ts → PrefsRow.d-DFpPIeIC.d.ts} +16 -1
  6. package/dist/_dts/PropertyField.d-D0ndfIIt.d.ts +404 -0
  7. package/dist/_dts/{Select.d-ZTiwzYyT.d.ts → Select.d-Cr8-zoup.d.ts} +105 -15
  8. package/dist/_dts/{usePanZoom-SSTZe410.d.ts → Stage-DWBBi8IU.d.ts} +80 -35
  9. package/dist/_dts/{index-DlKolEIZ.d.ts → index-CKyX0ME_.d.ts} +12 -13
  10. package/dist/_dts/{frac-B4hFJMiN.d.ts → types-B7yBTTF9.d.ts} +709 -651
  11. package/dist/_dts/{types-Db-3NNk1.d.ts → types-DTuViBvc.d.ts} +21 -2
  12. package/dist/_dts/{useTrialState-pnAE-UBD.d.ts → useTrialState-CMaV6UD4.d.ts} +2 -3
  13. package/dist/canvas/index.d.ts +41 -8
  14. package/dist/canvas/index.js +5 -3
  15. package/dist/chrome/index.d.ts +6 -6
  16. package/dist/chrome/index.js +9 -7
  17. package/dist/chunk-24W5VEJW.js +18 -0
  18. package/dist/chunk-24W5VEJW.js.map +1 -0
  19. package/dist/chunk-2RVCB2PT.js +3 -0
  20. package/dist/chunk-2RVCB2PT.js.map +1 -0
  21. package/dist/chunk-3RY6WL5T.js +38 -0
  22. package/dist/chunk-3RY6WL5T.js.map +1 -0
  23. package/dist/{chunk-CKUKF72R.js → chunk-4TT3PNPR.js} +68 -55
  24. package/dist/chunk-4TT3PNPR.js.map +1 -0
  25. package/dist/{chunk-KJCUERQF.js → chunk-6FLXL3I7.js} +9 -164
  26. package/dist/chunk-6FLXL3I7.js.map +1 -0
  27. package/dist/chunk-ASOK76ZH.js +431 -0
  28. package/dist/chunk-ASOK76ZH.js.map +1 -0
  29. package/dist/chunk-AWQG7FCC.js +19 -0
  30. package/dist/chunk-AWQG7FCC.js.map +1 -0
  31. package/dist/chunk-CGHF6RZV.js +300 -0
  32. package/dist/chunk-CGHF6RZV.js.map +1 -0
  33. package/dist/chunk-DWMSB4CA.js +228 -0
  34. package/dist/chunk-DWMSB4CA.js.map +1 -0
  35. package/dist/chunk-GHGO52SO.js +92 -0
  36. package/dist/chunk-GHGO52SO.js.map +1 -0
  37. package/dist/{chunk-LRI3MBGR.js → chunk-HKV7LRHY.js} +4 -4
  38. package/dist/{chunk-LRI3MBGR.js.map → chunk-HKV7LRHY.js.map} +1 -1
  39. package/dist/{chunk-EMXAIRUJ.js → chunk-IRTGUQ5O.js} +5 -4
  40. package/dist/chunk-IRTGUQ5O.js.map +1 -0
  41. package/dist/{chunk-H6ZAOWNE.js → chunk-JVBYV6TL.js} +3 -3
  42. package/dist/{chunk-H6ZAOWNE.js.map → chunk-JVBYV6TL.js.map} +1 -1
  43. package/dist/chunk-KHK5FGER.js +145 -0
  44. package/dist/chunk-KHK5FGER.js.map +1 -0
  45. package/dist/chunk-NEXR37YJ.js +144 -0
  46. package/dist/chunk-NEXR37YJ.js.map +1 -0
  47. package/dist/{chunk-A2ACAGW6.js → chunk-O6FFFOHS.js} +32 -7
  48. package/dist/chunk-O6FFFOHS.js.map +1 -0
  49. package/dist/chunk-QGMOA2YE.js +731 -0
  50. package/dist/chunk-QGMOA2YE.js.map +1 -0
  51. package/dist/{chunk-ERFMC6WU.js → chunk-S4NCI32V.js} +19 -10
  52. package/dist/chunk-S4NCI32V.js.map +1 -0
  53. package/dist/{chunk-753Y6HE6.js → chunk-SLAQPUI4.js} +4 -4
  54. package/dist/chunk-SLAQPUI4.js.map +1 -0
  55. package/dist/{chunk-REOBGYMC.js → chunk-TJ77A4A3.js} +3 -5
  56. package/dist/chunk-TJ77A4A3.js.map +1 -0
  57. package/dist/chunk-TYN6MLXX.js +13864 -0
  58. package/dist/chunk-TYN6MLXX.js.map +1 -0
  59. package/dist/{chunk-RS3HRQWU.js → chunk-WPLAANH4.js} +4 -3
  60. package/dist/chunk-WPLAANH4.js.map +1 -0
  61. package/dist/config/index.d.ts +51 -7
  62. package/dist/config/index.js +4 -5
  63. package/dist/controls/index.d.ts +92 -5
  64. package/dist/controls/index.js +5 -4
  65. package/dist/dragdrop/index.d.ts +9 -6
  66. package/dist/dragdrop/index.js +3 -2
  67. package/dist/index.d.ts +108 -154
  68. package/dist/index.js +456 -600
  69. package/dist/index.js.map +1 -1
  70. package/dist/layers/index.d.ts +5 -35
  71. package/dist/layers/index.js +3 -3
  72. package/dist/loupe/index.d.ts +21 -17
  73. package/dist/loupe/index.js +5 -3
  74. package/dist/overview/index.d.ts +56 -0
  75. package/dist/overview/index.js +288 -0
  76. package/dist/overview/index.js.map +1 -0
  77. package/dist/passthrough/weasel-ui.d.ts +434 -231
  78. package/dist/passthrough/weasel-ui.js +2 -1
  79. package/dist/primitives/index.d.ts +19 -54
  80. package/dist/primitives/index.js +6 -4
  81. package/dist/state/index.d.ts +8 -7
  82. package/dist/state/index.js +4 -5
  83. package/dist/state/index.js.map +1 -1
  84. package/dist/styles.css +360 -174
  85. package/dist/undo/index.d.ts +5 -4
  86. package/package.json +13 -13
  87. package/src/annotations/frac.test.ts +7 -0
  88. package/src/annotations/index.ts +1 -0
  89. package/src/annotations/paint.test.ts +21 -0
  90. package/src/annotations/paint.ts +12 -0
  91. package/src/annotations/store.test.ts +57 -0
  92. package/src/annotations/store.ts +25 -6
  93. package/src/annotations/toolMap.test.ts +37 -2
  94. package/src/annotations/toolMap.ts +13 -0
  95. package/src/annotations/types.ts +30 -2
  96. package/src/canvas/AGENTS.md +8 -10
  97. package/src/canvas/CameraInput.test.tsx +136 -0
  98. package/src/canvas/CameraInput.tsx +311 -0
  99. package/src/canvas/CanvasStack.tsx +42 -58
  100. package/src/canvas/LinkedCursor.less +16 -0
  101. package/src/canvas/LinkedCursor.tsx +54 -0
  102. package/src/canvas/Stage.test.tsx +18 -0
  103. package/src/canvas/Stage.tsx +42 -37
  104. package/src/canvas/cameraView.test.ts +60 -0
  105. package/src/canvas/cameraView.ts +61 -0
  106. package/src/canvas/index.ts +11 -2
  107. package/src/chrome/regions/SidebarRegion.less +197 -0
  108. package/src/chrome/regions/SidebarRegion.test.tsx +27 -0
  109. package/src/chrome/regions/SidebarRegion.tsx +7 -2
  110. package/src/chrome/types.ts +5 -2
  111. package/src/config/autoConfig.ts +2 -2
  112. package/src/config/builder.ts +21 -2
  113. package/src/config/entry.test.ts +10 -0
  114. package/src/config/fromConfigField.ts +1 -0
  115. package/src/config/index.ts +5 -0
  116. package/src/config/resolve.ts +11 -1
  117. package/src/config/rules.ts +2 -0
  118. package/src/config/sectionTree.test.ts +152 -0
  119. package/src/config/sectionTree.ts +134 -0
  120. package/src/config/types.ts +21 -0
  121. package/src/controls/ControlPanel.less +4 -0
  122. package/src/controls/ControlPanel.stories.tsx +55 -2
  123. package/src/controls/ControlPanel.test.tsx +40 -3
  124. package/src/controls/ControlPanel.tsx +134 -336
  125. package/src/controls/inDialog.test.tsx +100 -0
  126. package/src/controls/inDialog.tsx +38 -0
  127. package/src/controls/index.ts +1 -0
  128. package/src/index.test.ts +1 -1
  129. package/src/index.ts +18 -29
  130. package/src/instrument/SineWave.smoke.test.tsx +2 -0
  131. package/src/instrument/types.ts +15 -3
  132. package/src/lab/Lab.nebula.test.tsx +40 -0
  133. package/src/lab/Lab.test.tsx +3 -1
  134. package/src/lab/Lab.tsx +42 -19
  135. package/src/lab/LabBoundary.test.tsx +66 -0
  136. package/src/lab/LabBoundary.tsx +56 -0
  137. package/src/lab/LabHeader.tsx +4 -23
  138. package/src/lab/LabRoot.tsx +2 -3
  139. package/src/lab/LabShell.less +0 -1
  140. package/src/lab/LabShell.stories.tsx +15 -0
  141. package/src/lab/LabShell.test.tsx +18 -0
  142. package/src/lab/LabShell.tsx +14 -1
  143. package/src/lab/LabSwitcher.less +1 -1
  144. package/src/lab/LabSwitcher.test.tsx +41 -0
  145. package/src/lab/LabSwitcher.tsx +30 -8
  146. package/src/lab/index.ts +1 -0
  147. package/src/layers/AGENTS.md +18 -74
  148. package/src/layers/index.ts +4 -2
  149. package/src/loupe/AGENTS.md +7 -6
  150. package/src/loupe/LoupeGestures.tsx +14 -9
  151. package/src/loupe/TrialLoupe.tsx +5 -5
  152. package/src/loupe/index.ts +1 -0
  153. package/src/loupe/loupeActions.ts +6 -2
  154. package/src/overview/AGENTS.md +38 -0
  155. package/src/overview/OverviewMarks.test.tsx +100 -0
  156. package/src/overview/OverviewMarks.tsx +93 -0
  157. package/src/overview/TrialOverview.less +53 -0
  158. package/src/overview/TrialOverview.stories.tsx +50 -0
  159. package/src/overview/TrialOverview.test.tsx +116 -0
  160. package/src/overview/TrialOverview.tsx +374 -0
  161. package/src/overview/index.ts +2 -0
  162. package/src/passthrough/weasel-ui.ts +32 -10
  163. package/src/primitives/index.ts +0 -2
  164. package/src/specimen/Specimen.tsx +59 -56
  165. package/src/state/labRecords.test.ts +4 -1
  166. package/src/state/store.test.ts +4 -4
  167. package/src/state/types.ts +2 -1
  168. package/src/state/useTrialState.test.tsx +1 -1
  169. package/src/styles.less +6 -2
  170. package/src/theme/Interstellar.stories.tsx +8 -13
  171. package/src/theme/base.less +3 -20
  172. package/src/theme/interstellar.test.ts +6 -3
  173. package/src/theme/interstellar.theme.json +0 -56
  174. package/src/theme/interstellar.ts +2 -2
  175. package/src/tools/labTool.ts +6 -2
  176. package/src/trial/Trial.annotations.test.tsx +16 -0
  177. package/src/trial/Trial.canvas.test.tsx +1 -1
  178. package/src/trial/Trial.loupe.test.tsx +73 -1
  179. package/src/trial/Trial.stories.tsx +2 -0
  180. package/src/trial/Trial.tsx +47 -9
  181. package/src/trial/trialOps.test.ts +4 -4
  182. package/dist/_dts/index-8LiKe3A-.d.ts +0 -410
  183. package/dist/chunk-2AYGEN57.js +0 -32
  184. package/dist/chunk-2AYGEN57.js.map +0 -1
  185. package/dist/chunk-6BUQ77ZV.js +0 -18
  186. package/dist/chunk-6BUQ77ZV.js.map +0 -1
  187. package/dist/chunk-753Y6HE6.js.map +0 -1
  188. package/dist/chunk-A2ACAGW6.js.map +0 -1
  189. package/dist/chunk-CKUKF72R.js.map +0 -1
  190. package/dist/chunk-D35PFTS7.js +0 -170
  191. package/dist/chunk-D35PFTS7.js.map +0 -1
  192. package/dist/chunk-EMXAIRUJ.js.map +0 -1
  193. package/dist/chunk-ERFMC6WU.js.map +0 -1
  194. package/dist/chunk-FKLT3ITC.js +0 -590
  195. package/dist/chunk-FKLT3ITC.js.map +0 -1
  196. package/dist/chunk-KJCUERQF.js.map +0 -1
  197. package/dist/chunk-LASCBWW7.js +0 -13456
  198. package/dist/chunk-LASCBWW7.js.map +0 -1
  199. package/dist/chunk-REOBGYMC.js.map +0 -1
  200. package/dist/chunk-RS3HRQWU.js.map +0 -1
  201. package/dist/chunk-TT5C5S6R.js +0 -368
  202. package/dist/chunk-TT5C5S6R.js.map +0 -1
  203. package/dist/ui/layers/index.d.ts +0 -66
  204. package/dist/ui/layers/index.js +0 -3
  205. package/dist/ui/layers/index.js.map +0 -1
  206. package/src/canvas/usePanZoom.test.ts +0 -244
  207. package/src/canvas/usePanZoom.ts +0 -147
  208. package/src/lab/useSystemMode.ts +0 -30
  209. package/src/layers/LayerList.less +0 -93
  210. package/src/layers/LayerList.stories.tsx +0 -66
  211. package/src/layers/LayerList.test.tsx +0 -232
  212. package/src/layers/LayerList.tsx +0 -268
  213. package/src/primitives/Sidebar.less +0 -112
  214. package/src/primitives/Sidebar.stories.tsx +0 -38
  215. package/src/primitives/Sidebar.test.tsx +0 -74
  216. package/src/primitives/Sidebar.tsx +0 -35
  217. package/src/ui/layers/index.ts +0 -5
@@ -1,12 +1,14 @@
1
- import { O as OverlayPortalProps, W as WithoutPortalTarget } from '../_dts/Select.d-ZTiwzYyT.js';
2
- export { B as Button, a as ButtonProps, b as ButtonSize, c as ButtonVariant, l as ICON_PATHS, d as Icon, m as IconName, I as IconProps, e as Input, f as InputProps, S as Select, n as SelectItem, o as SelectItemProps, p as SelectOption, g as SelectProps, T as ToggleBar, h as ToggleBarItem, i as ToggleBarProps, j as ToggleBarSize, k as ToggleBarVariant } from '../_dts/Select.d-ZTiwzYyT.js';
1
+ import { j as ToggleBarSize, k as ToggleBarVariant, l as SegmentTooltipFields, F as FieldOrientation, O as OverlayPortalProps, W as WithoutPortalTarget } from '../_dts/Select.d-Cr8-zoup.js';
2
+ export { B as Button, a as ButtonProps, b as ButtonSize, c as ButtonVariant, m as Field, n as FieldProps, o as ICON_PATHS, d as Icon, p as IconName, I as IconProps, e as Input, f as InputProps, S as Select, q as SelectItem, r as SelectItemProps, s as SelectOption, g as SelectProps, T as ToggleBar, h as ToggleBarItem, i as ToggleBarProps, t as fieldClasses } from '../_dts/Select.d-Cr8-zoup.js';
3
3
  import { ToolPrefLeaf, ToolPrefGroup, ToolsApi, oklchDegToHex } from '@weasel-js/core';
4
4
  export { ToolPref as BuiltinPref, ToolPrefBoolean as PrefBoolean, ToolPrefBooleanControl as PrefBooleanControl, ToolPrefColor as PrefColor, ToolPrefCustom as PrefCustom, ToolPrefEnum as PrefEnum, ToolPrefEnumControl as PrefEnumControl, ToolPrefEnumEncoding as PrefEnumEncoding, ToolPrefGroup as PrefGroup, ToolPrefKind as PrefKind, ToolPrefLeaf as PrefLeaf, ToolPrefNumber as PrefNumber, ToolPrefNumberControl as PrefNumberControl, ToolPrefNumberUnit as PrefNumberUnit, ToolPrefObject as PrefObject, ToolPrefPaint as PrefPaint, ToolPrefString as PrefString, ToolPrefStringControl as PrefStringControl } from '@weasel-js/core';
5
- import * as react_jsx_runtime from 'react/jsx-runtime';
6
5
  import * as react from 'react';
7
- import { ReactNode, CSSProperties, ReactElement, KeyboardEvent, RefObject, PointerEvent, RefCallback } from 'react';
8
- export { LayerStack, LayerStackItem, LayerStackProps } from '../ui/layers/index.js';
9
- export { a as PrefRenderContext, P as PrefRenderer } from '../_dts/PrefsForm.d-DPy9I8It.js';
6
+ import { ReactNode, CSSProperties, HTMLAttributes, ReactElement, PointerEvent, RefCallback, KeyboardEvent, RefObject } from 'react';
7
+ import { S as StanceProps, P as PrefRenderer } from '../_dts/PrefsRow.d-DFpPIeIC.js';
8
+ export { a as PrefRenderContext } from '../_dts/PrefsRow.d-DFpPIeIC.js';
9
+ export { L as LayerList, a as LayerListItem, b as LayerListProps, c as LayerMove, m as moveLayers } from '../_dts/LayerList.d-BoELAMsM.js';
10
+ import { ColorModePreference } from '@weasel-js/theme';
11
+ export { M as MINUS_SIGN, q as PropertyAlign, r as PropertyDensity, P as PropertyMetricProps, s as formatNumber } from '../_dts/PropertyField.d-D0ndfIIt.js';
10
12
  import { CheckboxProps as CheckboxProps$1, SwitchProps as SwitchProps$1, TabProps as TabProps$1, TabListProps as TabListProps$1, TabPanelProps as TabPanelProps$1, TabsProps as TabsProps$1, RadioProps as RadioProps$1, RadioGroupProps as RadioGroupProps$1, ValidationResult, NumberFieldProps as NumberFieldProps$1, ComboBoxProps as ComboBoxProps$1, ListBoxItemProps, SliderProps as SliderProps$1, ModalOverlayProps, DialogProps as DialogProps$1, PopoverProps } from 'react-aria-components';
11
13
  export { DialogTrigger as CalloutTrigger } from 'react-aria-components';
12
14
 
@@ -50,15 +52,16 @@ interface ActionBarProps {
50
52
  /** Layout direction. Defaults to `'horizontal'`. */
51
53
  orientation?: 'horizontal' | 'vertical';
52
54
  /**
53
- * Per-id icon overrides — keyed by `action.id`. When an entry is provided
55
+ * Per-entry icon overrides, keyed by `ActionItem.key` — the action id, or
56
+ * `id:variant` for one variant of a parametric action. When an entry is provided
54
57
  * it replaces the action's own `icon` for this bar only. Mirrors
55
58
  * `PathfinderPanelProps.icons` so call sites that ship custom glyph sets
56
59
  * can swap them in without re-registering actions.
57
60
  */
58
61
  icons?: Record<string, ReactNode>;
59
62
  /**
60
- * Per-id label overrides — keyed by `action.id`. Drives both `aria-label`
61
- * and `title`. When omitted, the action's own `label` is used.
63
+ * Per-entry label overrides, keyed like `icons`. Drives both `aria-label`
64
+ * and `title`. When omitted, the entry's own `label` is used.
62
65
  */
63
66
  labels?: Record<string, string>;
64
67
  /** Additional class for the toolbar root. */
@@ -67,7 +70,8 @@ interface ActionBarProps {
67
70
  /**
68
71
  * Generic group-keyed action toolbar. Reads the parent `ActionsRegistry`,
69
72
  * filters to actions whose `group` matches `props.group`, and renders one
70
- * icon button per match. Disabled state is derived from each action's
73
+ * icon button per match — or per variant, for an action that declares
74
+ * `variants`. Disabled state is derived from each action's
71
75
  * `enabled` predicate via `evaluateEnabled` (so the button greys out and
72
76
  * swallows clicks while the keybinding — if any — still fires through the
73
77
  * registry's keydown listener; that's the registry's contract, not ours).
@@ -77,7 +81,7 @@ interface ActionBarProps {
77
81
  * (roving tabindex) yet — bar consumers today are short flat strips. Add
78
82
  * if/when a long bar lands.
79
83
  */
80
- declare function ActionBar(props: ActionBarProps): react_jsx_runtime.JSX.Element;
84
+ declare function ActionBar(props: ActionBarProps): react.JSX.Element;
81
85
 
82
86
  /**
83
87
  * Built-in badge silhouettes. `pill`, `plain` and `square` are drawn in CSS;
@@ -86,14 +90,15 @@ declare function ActionBar(props: ActionBarProps): react_jsx_runtime.JSX.Element
86
90
  */
87
91
  type BadgeShape = 'pill' | 'plain' | 'square' | 'notched' | 'perforated' | 'hexagon' | 'starburst' | 'scalloped' | 'shield' | 'ribbon' | 'beavis' | 'sparkler' | 'postage' | 'cloud' | 'house' | 'plaque' | 'crest' | 'urn' | 'coffin' | 'receipt' | 'wood' | 'quatrefoil';
88
92
  /**
89
- * Semantic color of a badge. `custom` paints from the `--badge-edge` custom
93
+ * Status color of a badge. `custom` paints from the `--badge-edge` custom
90
94
  * property instead of a theme token, so a call site can supply its own color.
91
95
  */
92
- type BadgeTone = 'accent' | 'info' | 'warn' | 'danger' | 'muted' | 'neutral' | 'custom';
93
- /** How a badge's tone is applied: outline only, filled, or a soft tinted fill. */
96
+ type BadgeStatus = 'accent' | 'info' | 'success' | 'warn' | 'danger' | 'muted' | 'neutral' | 'custom';
97
+ /** How a badge's color is applied: outline only, filled, or a soft tinted fill. */
94
98
  type BadgeVariant = 'outline' | 'solid' | 'subtle';
95
- /** Badge type scale and padding step. */
96
- type BadgeSize = 'sm' | 'md';
99
+ /** Badge type scale and padding step. `xs` is for counts and markers set
100
+ * inside a dense row, on the 2xs type step. */
101
+ type BadgeSize = 'xs' | 'sm' | 'md';
97
102
 
98
103
  interface SquareParams {
99
104
  /** 0..1 fraction of the maximum corner rounding (1 = full pill). */
@@ -648,7 +653,7 @@ interface SunbeamsEffectParams {
648
653
  * `backdrop-filter: blur(...)` on the host element via CSS.
649
654
  */
650
655
  interface AquaEffectParams {
651
- /** Body tint. Defaults to `var(--badge-edge)` so the badge's tone drives it. */
656
+ /** Body tint. Defaults to `var(--badge-edge)` so the badge's color drives it. */
652
657
  accent?: string;
653
658
  /** Stop opacities along the body gradient (0..1). */
654
659
  topAlpha?: number;
@@ -734,8 +739,9 @@ interface EffectSpec<E extends BadgeEffect = BadgeEffect> {
734
739
  params?: BadgeEffectParams[E];
735
740
  }
736
741
 
737
- interface BadgeBaseProps {
738
- tone?: BadgeTone;
742
+ interface BadgeBaseProps extends StanceProps {
743
+ /** The status the badge reports. A peer `tone`, or a stance's accent, paints over it. */
744
+ status?: BadgeStatus;
739
745
  variant?: BadgeVariant;
740
746
  size?: BadgeSize;
741
747
  /** "Edge bloat": offset every base perimeter sample outward by N CSS px along the normal
@@ -765,12 +771,22 @@ interface BadgeBaseProps {
765
771
  children: ReactNode;
766
772
  className?: string;
767
773
  /** Optional style overrides merged with the badge's own style. Useful for setting CSS
768
- * custom properties (e.g. `--badge-edge` to inject a custom tone color). */
774
+ * custom properties (e.g. `--badge-edge` to inject a `custom` status color). */
769
775
  style?: CSSProperties;
770
776
  'aria-label'?: string;
777
+ /**
778
+ * Tooltip content. Wraps the badge in a kit tooltip trigger. A tooltip
779
+ * trigger must be focusable and carry a role that announces its
780
+ * description, so a badge that is neither a button nor a link joins the tab
781
+ * order as `role="img"`, named by `aria-label` or else by string content.
782
+ */
783
+ tooltip?: ReactNode;
771
784
  }
785
+ /** DOM attributes a badge passes through to its root element, e.g. the ones
786
+ * `Focusable` supplies when a badge sits under a `TooltipTrigger`. */
787
+ type BadgeDomProps = Omit<HTMLAttributes<HTMLElement>, keyof BadgeBaseProps | 'onClick' | 'children' | 'className' | 'style'>;
772
788
  type BadgePropsByShape = {
773
- [S in BadgeShape]: BadgeBaseProps & {
789
+ [S in BadgeShape]: BadgeBaseProps & BadgeDomProps & {
774
790
  shape?: S;
775
791
  shapeParams?: BadgeShapeParams[S];
776
792
  };
@@ -789,8 +805,10 @@ type BadgeProps = BadgePropsByShape;
789
805
  * over it, which stack additively. `bloat` pushes the whole silhouette outward
790
806
  * along its normals before effects run, and `crawl` animates perimeter
791
807
  * patterns.
808
+ *
809
+ * `ref` and any other DOM attributes forward to the root element.
792
810
  */
793
- declare function Badge(props: BadgeProps): react_jsx_runtime.JSX.Element;
811
+ declare const Badge: react.ForwardRefExoticComponent<BadgePropsByShape & react.RefAttributes<HTMLElement>>;
794
812
 
795
813
  /**
796
814
  * One column of a {@link DataGrid}. `id` doubles as the default property name
@@ -825,6 +843,28 @@ interface DataGridProps<Row extends {
825
843
  /** Empty-state row text. Default `'—'`. */
826
844
  empty?: ReactNode;
827
845
  className?: string;
846
+ /** Extra class on a row's `<tr>`, for row-level state such as a verdict. */
847
+ rowClassName?: (row: Row) => string | undefined;
848
+ /**
849
+ * Activate a row. Makes each row focusable: a click anywhere in it, or
850
+ * Enter/Space while it has focus, calls this. Clicks and keys landing on a
851
+ * control inside a cell (button, link, input, …) are left to that control.
852
+ */
853
+ onRowClick?: (row: Row) => void;
854
+ /**
855
+ * Content for a full-width detail row under `row`, shown while the row is
856
+ * expanded. Setting it adds a leading disclosure column. Return `null` for
857
+ * no detail row.
858
+ */
859
+ renderDetail?: (row: Row) => ReactNode;
860
+ /** Which rows offer the disclosure. Default: every row. */
861
+ rowExpandable?: (row: Row) => boolean;
862
+ /** Expanded row ids, controlled. Pair with `onExpandedChange`. */
863
+ expandedIds?: ReadonlySet<string>;
864
+ /** Initially expanded row ids when uncontrolled. */
865
+ defaultExpandedIds?: Iterable<string>;
866
+ /** Called with the next expanded set when a disclosure toggles. */
867
+ onExpandedChange?: (ids: ReadonlySet<string>) => void;
828
868
  }
829
869
  /**
830
870
  * Sortable table for inspector-style data. Rows are keyed by `id`. Clicking a
@@ -835,10 +875,27 @@ interface DataGridProps<Row extends {
835
875
  */
836
876
  declare function DataGrid<Row extends {
837
877
  id: string;
838
- }>(props: DataGridProps<Row>): react_jsx_runtime.JSX.Element;
878
+ }>(props: DataGridProps<Row>): react.JSX.Element;
839
879
 
840
- /** Which way the mark points when the section is closed. */
841
- type DisclosureDirection = 'right' | 'down';
880
+ /** Props for `<DisclosureMark>`. */
881
+ interface DisclosureMarkProps {
882
+ /** Whether the section it stands for is open: `−` when open, `+` when shut. */
883
+ open: boolean;
884
+ /** Mark size in px, square. Default 13. */
885
+ size?: number;
886
+ className?: string;
887
+ }
888
+ /**
889
+ * The fold mark alone: a dark violet rounded square holding a `+` while its section is
890
+ * shut and a `−` while it is open. Decorative — it carries no role or label —
891
+ * for a row that is itself the control, such as a tree item or a header
892
+ * button. Anywhere the mark has to be the control, use `<Disclosure>`.
893
+ *
894
+ * Deliberately not part of the icon register, on the same grounds as
895
+ * `DragHandleGlyph`: that register is outline strokes at a fixed weight, and
896
+ * this mark is filled.
897
+ */
898
+ declare function DisclosureMark({ open, size, className }: DisclosureMarkProps): react.JSX.Element;
842
899
  /** Props for `<Disclosure>`. */
843
900
  interface DisclosureProps {
844
901
  /** Whether the section it controls is open. The consumer owns this. */
@@ -854,17 +911,14 @@ interface DisclosureProps {
854
911
  * screen reader move to the revealed content.
855
912
  */
856
913
  controls?: string;
857
- /** Which way the closed mark points. `'right'` (default) rotates down when
858
- * open; `'down'` rotates up. */
859
- direction?: DisclosureDirection;
860
914
  /** Mark size in px. The hit target is at least 20px and grows with it.
861
- * Default 12. */
915
+ * Default 13. */
862
916
  size?: number;
863
917
  disabled?: boolean;
864
918
  className?: string;
865
919
  }
866
920
  /**
867
- * The twisty on a collapsible section: a triangle that turns as it opens.
921
+ * The twisty on a collapsible section: a `<DisclosureMark>` in a button.
868
922
  *
869
923
  * Presentational — it holds no open/closed state and renders no children.
870
924
  * The consumer owns the state and the panel; this is the control that toggles
@@ -873,17 +927,11 @@ interface DisclosureProps {
873
927
  * Three things it settles that a hand-rolled twisty keeps getting wrong. The
874
928
  * mark is drawn rather than typed, because `--wzl-font-ui` carries no ▸/▾ and
875
929
  * a text glyph falls back to whatever the system offers at whatever size that
876
- * font renders it — around 6px against 13px body text, which reads as dirt on
877
- * the screen. The hit target is larger than the mark. And it is a sibling of
878
- * the row's label rather than a child, so clicking to expand does not actuate
879
- * the label's own control.
880
- *
881
- * Deliberately not part of the icon register, on the same grounds as
882
- * `DragHandleGlyph`: that register is outline strokes at a fixed weight, and
883
- * `base.mjs` rejects a solid triangle in it by name. A disclosure mark is
884
- * filled.
930
+ * font renders it. The hit target is larger than the mark. And it is a sibling
931
+ * of the row's label rather than a child, so clicking to expand does not
932
+ * actuate the label's own control.
885
933
  */
886
- declare function Disclosure({ open, onToggle, label, controls, direction, size, disabled, className, }: DisclosureProps): react_jsx_runtime.JSX.Element;
934
+ declare function Disclosure({ open, onToggle, label, controls, size, disabled, className }: DisclosureProps): react.JSX.Element;
887
935
  /** Props for `<DisclosureRow>`. */
888
936
  interface DisclosureRowProps extends Omit<DisclosureProps, 'className'> {
889
937
  /** The row's own content — a label, a checkbox, a count. */
@@ -898,7 +946,27 @@ interface DisclosureRowProps extends Omit<DisclosureProps, 'className'> {
898
946
  * it, so a row whose content is a `<label>` wrapping a checkbox stays
899
947
  * clickable as a label without the twisty actuating it.
900
948
  */
901
- declare function DisclosureRow({ children, className, ...twisty }: DisclosureRowProps): react_jsx_runtime.JSX.Element;
949
+ declare function DisclosureRow({ children, className, ...twisty }: DisclosureRowProps): react.JSX.Element;
950
+
951
+ /** Props for `<DragGhost>`. */
952
+ interface DragGhostProps {
953
+ /** The ghost's top-left in client space, and its width — `useReorderDragList`'s `state.ghost` is one. */
954
+ at: {
955
+ left: number;
956
+ top: number;
957
+ width: number;
958
+ };
959
+ /** An element inside the list being dragged from. The ghost portals to its nearest themed ancestor, so it resolves
960
+ * the list's tokens without being clipped by the list's panel. */
961
+ from: Element;
962
+ /** What to draw: copies of the dragged items, or any stand-in for them. */
963
+ children: ReactNode;
964
+ }
965
+ /**
966
+ * What follows the pointer during a drag while the dragged items hold their place: `children` on a raised surface at
967
+ * a client-space point. Hidden from assistive tech and from the pointer, so it never becomes the drop target.
968
+ */
969
+ declare function DragGhost({ at, from, children }: DragGhostProps): react.ReactPortal;
902
970
 
903
971
  /** Props for `<DragHandleGlyph>`. */
904
972
  interface DragHandleGlyphProps {
@@ -910,7 +978,7 @@ interface DragHandleGlyphProps {
910
978
  * Deliberately not part of the icon register: that register is outline strokes
911
979
  * at a fixed weight, and a grip is filled dots. Forcing it in would either
912
980
  * break the register's rule or produce a worse glyph. */
913
- declare function DragHandleGlyph({ size }: DragHandleGlyphProps): react_jsx_runtime.JSX.Element;
981
+ declare function DragHandleGlyph({ size }: DragHandleGlyphProps): react.JSX.Element;
914
982
 
915
983
  /**
916
984
  * Width class of a keycap: a modifier glyph, a multi-character legend that
@@ -953,7 +1021,7 @@ interface KeyCapProps {
953
1021
  }
954
1022
  /** Single bordered keycap chip for one glyph (modifier or key). Use
955
1023
  * `KeySequence` to render a full shortcut. */
956
- declare function KeyCap({ label, inverted, variant, className, style, font }: KeyCapProps): react_jsx_runtime.JSX.Element;
1024
+ declare function KeyCap({ label, inverted, variant, className, style, font }: KeyCapProps): react.JSX.Element;
957
1025
 
958
1026
  /** One key in a shortcut. */
959
1027
  interface KeySpec {
@@ -983,7 +1051,7 @@ interface KeySequenceProps {
983
1051
  }
984
1052
  /** Renders a shortcut as a row of `KeyCap` chips, one per key. Optional
985
1053
  * keys render inverted to distinguish them from required ones. */
986
- declare function KeySequence({ keys, separator, variant, font, className }: KeySequenceProps): react_jsx_runtime.JSX.Element;
1054
+ declare function KeySequence({ keys, separator, variant, font, className }: KeySequenceProps): react.JSX.Element;
987
1055
 
988
1056
  /** Apple-style glyph for a DOM `KeyboardEvent.key` value. Covers escape,
989
1057
  * delete/backspace, arrows, enter/return, tab, space. Unknown keys are
@@ -1074,6 +1142,36 @@ declare function keySpecFromKey(raw: string, opts?: KeySpecsFromModsOptions & {
1074
1142
  optional?: boolean;
1075
1143
  }): KeySpec;
1076
1144
 
1145
+ interface ShortcutInput {
1146
+ key: string | readonly string[];
1147
+ mod?: boolean;
1148
+ alt?: boolean;
1149
+ shift?: boolean | 'optional';
1150
+ }
1151
+ /** Format a shortcut as an array of display chips, one per key — modifier
1152
+ * icons (⌘, ↑, ⌥) followed by the key glyph. UIs that want a boxed
1153
+ * per-key look render each chip in its own element. `shift: 'optional'` is
1154
+ * treated as falsy. */
1155
+ declare function formatShortcutParts(b: ShortcutInput | undefined): readonly string[] | undefined;
1156
+ /** Format a shortcut as a single display string. Order: mod, shift, alt,
1157
+ * key. Returns `undefined` for `undefined` input so callers can `??` a
1158
+ * fallback. When `key` is an array, the first element is used. `shift: 'optional'`
1159
+ * is treated as falsy. */
1160
+ declare function formatShortcut(b: ShortcutInput | undefined): string | undefined;
1161
+
1162
+ /**
1163
+ * A shortcut as `KeySequence` keys, one per key: mod, shift, alt, then the
1164
+ * key, each in the platform's own legend (`⌘` on macOS, `Ctrl` elsewhere).
1165
+ * The `KeySpec` counterpart of `formatShortcutParts`, which always prints
1166
+ * macOS glyphs. `shift: 'optional'` becomes an optional key; a key list
1167
+ * renders its first key. Returns `undefined` for no shortcut.
1168
+ *
1169
+ * ```tsx
1170
+ * <KeySequence keys={keySpecsFromShortcut({ key: 'z', mod: true, shift: true })} />
1171
+ * ```
1172
+ */
1173
+ declare function keySpecsFromShortcut(shortcut: ShortcutInput | undefined, opts?: KeySpecsFromModsOptions): readonly KeySpec[] | undefined;
1174
+
1077
1175
  /**
1078
1176
  * Passed to a custom thumb renderer: the thumb box in CSS px, and whether
1079
1177
  * this thumb is the one being dragged.
@@ -1151,7 +1249,8 @@ type SliderStop = {
1151
1249
  * `'even'` falls back to linear.
1152
1250
  *
1153
1251
  * `trackClick: 'move-nearest'` makes a press on bare track send the closest
1154
- * thumb there and continue as a drag. It is off by default because on a
1252
+ * thumb there, focus it, and continue as a drag. It is the default for a
1253
+ * single thumb. With several it defaults to `'none'`, because on a
1155
1254
  * multi-thumb editor a stray click would yank a stop the user was not aiming
1156
1255
  * at; `onAddThumb`, where it is set, keeps the track press.
1157
1256
  *
@@ -1198,6 +1297,146 @@ type SliderProps<T extends Thumb = Thumb> = {
1198
1297
  */
1199
1298
  declare function Slider<T extends Thumb = Thumb>(props: SliderProps<T>): ReactElement;
1200
1299
 
1300
+ /** One row in a reorderable list. */
1301
+ interface ReorderItem {
1302
+ id: string;
1303
+ label: ReactNode;
1304
+ /** Locked rows cannot be dragged, cannot be crossed by drops, and
1305
+ * never combine with other rows in a multi-selection. */
1306
+ locked?: boolean;
1307
+ }
1308
+ /**
1309
+ * Options for {@link useReorderDragList}. `onReorder` receives the dragged ids
1310
+ * and the index they were dropped at, measured against the pre-drag `items`.
1311
+ */
1312
+ interface UseReorderDragListOptions {
1313
+ items: ReorderItem[];
1314
+ selectedIds: string[];
1315
+ onReorder(ids: string[], targetIndex: number): void;
1316
+ /** A press that was released without ever engaging a drag — the click a
1317
+ * list row means by it. Fires for locked rows too, which can be selected
1318
+ * but not dragged. Modifiers are read at press, not at release. When this
1319
+ * is given, the DOM click that follows the press is dropped, so a row that
1320
+ * also handles `click` sees one press, not two. A press that starts on a
1321
+ * control inside the row (a toggle) is left to the control. */
1322
+ onPress?(id: string, mods: PressModifiers): void;
1323
+ /** Pointer-move distance (px) before pending drag engages. Default 4. */
1324
+ threshold?: number;
1325
+ /** Selector matching the container's children that are rows, for a list
1326
+ * that interleaves other elements (a table's detail rows). Default: every
1327
+ * child is a row. */
1328
+ rowSelector?: string;
1329
+ }
1330
+ /** Modifier keys held when a press began. */
1331
+ interface PressModifiers {
1332
+ shiftKey: boolean;
1333
+ ctrlKey: boolean;
1334
+ metaKey: boolean;
1335
+ altKey: boolean;
1336
+ }
1337
+ /**
1338
+ * Where a drag's ghost goes: the dragged rows, drawn again with their top-left
1339
+ * at a client-space point, so the row that was grabbed stays under the pointer
1340
+ * where it was picked up. `width` is the grabbed row's.
1341
+ */
1342
+ interface ReorderGhost {
1343
+ ids: readonly string[];
1344
+ left: number;
1345
+ top: number;
1346
+ width: number;
1347
+ }
1348
+ /**
1349
+ * Live drag state for rendering feedback: which ids are being dragged, the
1350
+ * insertion index the drop would use, and where their ghost goes. All `null`
1351
+ * when no drag is engaged.
1352
+ */
1353
+ interface ReorderDragState {
1354
+ draggedIds: string[] | null;
1355
+ targetIndex: number | null;
1356
+ ghost: ReorderGhost | null;
1357
+ }
1358
+ /**
1359
+ * A `ref` for the list container, an `onPointerDown` for each row, and the
1360
+ * live {@link ReorderDragState}. The container ref is required, not optional
1361
+ * decoration: it is what the drop index is measured against and what the
1362
+ * pointer session is opened on.
1363
+ */
1364
+ interface ReorderDragHandlers {
1365
+ rowProps(id: string, index: number): {
1366
+ onPointerDown(e: PointerEvent): void;
1367
+ };
1368
+ containerProps: {
1369
+ ref: RefCallback<HTMLElement>;
1370
+ };
1371
+ state: ReorderDragState;
1372
+ /**
1373
+ * Move the row at `index` one place up (`-1`) or down (`1`) — the keyboard
1374
+ * reorder. It moves what a drag of that row would: the whole selection if
1375
+ * the row is in it, else the row alone, never across a locked row. Calls
1376
+ * `onReorder` and returns `true`, or returns `false` when nothing can move.
1377
+ */
1378
+ nudge(id: string, index: number, delta: -1 | 1): boolean;
1379
+ }
1380
+ /**
1381
+ * Drag-to-reorder for a vertical list of rows. Dragging a row that is part of
1382
+ * the current selection drags the whole selection; dragging any other row
1383
+ * drags just that row. Locked rows can neither be dragged nor crossed by a
1384
+ * drop. A drop that would leave a contiguous block where it already is does
1385
+ * not call `onReorder`.
1386
+ *
1387
+ * The rows are the container's children, whatever they are: `ItemList` rows,
1388
+ * or the `PropertyGroup`s of a `PropertyList`. A row's `onPointerDown` can go
1389
+ * on the whole row or on a handle inside it.
1390
+ *
1391
+ * A press opens a `startThresholdDrag` on the *container*, which owns the
1392
+ * rest of the gesture: a drag that leaves the list still tracks, a release
1393
+ * anywhere still drops, and a release the window never delivered still ends
1394
+ * the drag. The container is the origin rather than the row because rows come
1395
+ * and go as the list re-renders, and a drag must outlive the row it grabbed.
1396
+ */
1397
+ declare function useReorderDragList(opts: UseReorderDragListOptions): ReorderDragHandlers;
1398
+
1399
+ /** Props for {@link ListEditor}. */
1400
+ interface ListEditorProps {
1401
+ value: readonly string[];
1402
+ /** Every edit, add and removal, with the whole list. Entries are written as
1403
+ * typed — an empty one stays until it is removed. */
1404
+ onChange: (next: string[]) => void;
1405
+ /** Shown in an empty entry. */
1406
+ placeholder?: string;
1407
+ /** Shown in place of the entries when there are none. */
1408
+ empty?: string;
1409
+ /** Text of the add button. */
1410
+ addLabel?: string;
1411
+ /** Names the list for assistive tech; each entry is named from it. */
1412
+ 'aria-label'?: string;
1413
+ className?: string;
1414
+ }
1415
+ /**
1416
+ * An editable list of strings: one field per entry, a remove button beside
1417
+ * each, and an add button under them. Enter in an entry adds one after it;
1418
+ * Backspace in an empty one removes it.
1419
+ */
1420
+ declare function ListEditor({ value, onChange, placeholder, empty, addLabel, 'aria-label': ariaLabel, className, }: ListEditorProps): react.JSX.Element;
1421
+
1422
+ /** Props for {@link ColorModeControl}. */
1423
+ interface ColorModeControlProps {
1424
+ value: ColorModePreference;
1425
+ onChange: (next: ColorModePreference) => void;
1426
+ /** Accessible name of the group. Defaults to `'Color mode'`. */
1427
+ ariaLabel?: string;
1428
+ size?: ToggleBarSize;
1429
+ variant?: ToggleBarVariant;
1430
+ className?: string;
1431
+ }
1432
+ /**
1433
+ * The Auto / Light / Dark choice, as a three-way radiogroup of mode glyphs.
1434
+ * Controlled: pair it with `useColorModePreference` from
1435
+ * `@weasel-js/theme/react` and put the hook's resolved `mode` in the
1436
+ * `ThemeProvider` selection.
1437
+ */
1438
+ declare function ColorModeControl({ value, onChange, ariaLabel, size, variant, className, }: ColorModeControlProps): ReactElement;
1439
+
1201
1440
  /**
1202
1441
  * One segment of an {@link OptionsBar}. Unlike `ToggleBar`, each item carries
1203
1442
  * its own selected state and its own `onChange`.
@@ -1235,28 +1474,28 @@ type OptionsBarProps<V extends string | number = string> = {
1235
1474
  declare function OptionsBar<V extends string | number = string>(props: OptionsBarProps<V>): ReactElement;
1236
1475
 
1237
1476
  /**
1238
- * One button in an {@link ActionsBar}. `value` is only a React key; the item
1477
+ * One button in an {@link ButtonBar}. `value` is only a React key; the item
1239
1478
  * carries no selected state.
1240
1479
  */
1241
- type ActionsBarItem<V extends string | number = string> = {
1480
+ type ButtonBarItem<V extends string | number = string> = {
1242
1481
  value: V;
1243
1482
  label?: ReactNode;
1244
1483
  ariaLabel?: string;
1245
1484
  disabled?: boolean;
1246
1485
  onAction: () => void;
1247
- };
1248
- /** Segment height and type scale for an {@link ActionsBar}. */
1249
- type ActionsBarSize = 'sm' | 'md';
1250
- /** Visual treatment of an {@link ActionsBar}. */
1251
- type ActionsBarVariant = 'default' | 'minimal';
1252
- /** Props for {@link ActionsBar}. */
1253
- type ActionsBarProps<V extends string | number = string> = {
1254
- items: readonly ActionsBarItem<V>[];
1486
+ } & SegmentTooltipFields;
1487
+ /** Segment height and type scale for an {@link ButtonBar}. */
1488
+ type ButtonBarSize = 'sm' | 'md';
1489
+ /** Visual treatment of an {@link ButtonBar}. */
1490
+ type ButtonBarVariant = 'default' | 'minimal';
1491
+ /** Props for {@link ButtonBar}. */
1492
+ type ButtonBarProps<V extends string | number = string> = {
1493
+ items: readonly ButtonBarItem<V>[];
1255
1494
  ariaLabel?: string;
1256
1495
  className?: string;
1257
1496
  height?: number;
1258
- size?: ActionsBarSize;
1259
- variant?: ActionsBarVariant;
1497
+ size?: ButtonBarSize;
1498
+ variant?: ButtonBarVariant;
1260
1499
  };
1261
1500
  /**
1262
1501
  * Segmented strip of momentary buttons — each press fires and nothing stays
@@ -1266,17 +1505,17 @@ type ActionsBarProps<V extends string | number = string> = {
1266
1505
  * This is a plain callback bar. For buttons driven by the kit's actions
1267
1506
  * registry, use `ActionBar` instead.
1268
1507
  */
1269
- declare function ActionsBar<V extends string | number = string>(props: ActionsBarProps<V>): ReactElement;
1508
+ declare function ButtonBar<V extends string | number = string>(props: ButtonBarProps<V>): ReactElement;
1270
1509
 
1271
1510
  /**
1272
1511
  * One segment of a {@link Powerline}. Giving it `onClick` or `href` makes it
1273
1512
  * interactive, the same way it does on a `Badge`.
1274
1513
  */
1275
- interface PowerlineSegment {
1514
+ interface PowerlineSegment extends StanceProps {
1276
1515
  text: ReactNode;
1277
1516
  /** Cap on this segment's right edge. Next segment's left edge adopts the same profile. */
1278
1517
  endCap?: EdgeCap;
1279
- tone?: BadgeTone;
1518
+ status?: BadgeStatus;
1280
1519
  variant?: BadgeVariant;
1281
1520
  size?: BadgeSize;
1282
1521
  onClick?: () => void;
@@ -1308,24 +1547,7 @@ interface PowerlineProps {
1308
1547
  * Built for showing a path through a sequence of steps — the inspector uses
1309
1548
  * it to display how input routes from tool to gesture to action to target.
1310
1549
  */
1311
- declare function Powerline({ segments, startCap, size, variant, depth, gap, className, ...rest }: PowerlineProps): react_jsx_runtime.JSX.Element;
1312
-
1313
- /**
1314
- * Display-formatter for numbers. Use this anywhere a number is shown to
1315
- * a user. The whole point: negative values get prefixed with the real
1316
- * MINUS SIGN (U+2212) instead of the ASCII HYPHEN-MINUS (U+002D) that
1317
- * `toLocaleString` and template literals produce by default.
1318
- *
1319
- * U+2212 is the same visual width as `+` and reads as a sign rather
1320
- * than a hyphen — columns of signed numbers align cleanly and the
1321
- * glyph doesn't get confused with a bullet or list dash.
1322
- */
1323
- declare const MINUS_SIGN = "\u2212";
1324
- /**
1325
- * Formats a number for display, substituting {@link MINUS_SIGN} for the ASCII
1326
- * hyphen `toLocaleString` emits. Non-finite values stringify as-is.
1327
- */
1328
- declare function formatNumber(value: number, options?: Intl.NumberFormatOptions): string;
1550
+ declare function Powerline({ segments, startCap, size, variant, depth, gap, className, ...rest }: PowerlineProps): react.JSX.Element;
1329
1551
 
1330
1552
  /** Distinguishes a leaf from a group while walking a schema tree. */
1331
1553
  declare function isPrefLeaf(node: ToolPrefLeaf | ToolPrefGroup): node is ToolPrefLeaf;
@@ -1338,6 +1560,87 @@ declare function prefValueAtPath(values: unknown, path: string): unknown;
1338
1560
  */
1339
1561
  declare function visiblePrefSubtree<T extends ToolPrefLeaf | ToolPrefGroup>(node: T, showHidden: boolean): T | null;
1340
1562
 
1563
+ /** How a {@link PrefsForm} lays its groups out. */
1564
+ type PrefsLayout = 'columns' | 'rail';
1565
+ /** Props for {@link PrefsForm}. */
1566
+ interface PrefsFormProps {
1567
+ /** Root of the schema tree. Core `ToolPrefGroup`s assign structurally. */
1568
+ schema: ToolPrefGroup;
1569
+ /** Nested value tree (shape mirrors the schema). Sparse is fine —
1570
+ * missing leaves fall back to their schema `default`. */
1571
+ values?: unknown;
1572
+ /** Change callback with the leaf's dotted path. Values apply live;
1573
+ * there is no dirty/commit state. */
1574
+ onChange: (path: string, value: unknown) => void;
1575
+ /**
1576
+ * Per-kind renderers for app-defined kinds. Entries also override the
1577
+ * built-in kinds when keys collide. A renderer owns the control cell
1578
+ * (the label/tooltip row chrome stays with the form, unless the leaf
1579
+ * sets `block`); returning `null` collapses the row entirely. Unknown
1580
+ * kinds with no renderer show a labeled placeholder instead of
1581
+ * crashing.
1582
+ */
1583
+ renderers?: Record<string, PrefRenderer>;
1584
+ /** Reveal `hidden` leaves (dev tooling). Default false. */
1585
+ showHidden?: boolean;
1586
+ /**
1587
+ * `'columns'` (the default) wraps each top-level group into its own panel
1588
+ * column. `'rail'` puts a two-level navigation rail beside one group's
1589
+ * settings at a time — what a dialog-sized surface wants, since columns
1590
+ * overflow sideways once there are more than two.
1591
+ */
1592
+ layout?: PrefsLayout;
1593
+ /** Show a filter field that narrows the form to matching leaves. */
1594
+ filterable?: boolean;
1595
+ /** Rail layout: path of the open top-level group. Controlled. */
1596
+ section?: string;
1597
+ /** Rail layout: path of the group open before the reader picks one.
1598
+ * Defaults to the first in the schema. */
1599
+ defaultSection?: string;
1600
+ onSectionChange?: (path: string) => void;
1601
+ className?: string;
1602
+ }
1603
+ /**
1604
+ * Schema-driven preferences form. Leaves render as label + control rows;
1605
+ * how the groups around them are arranged is `layout`'s to say — columns of
1606
+ * panels, or a navigation rail beside one group at a time.
1607
+ *
1608
+ * Storage-agnostic: pair with `PrefsDialog` for the modal composition, and
1609
+ * persist however the app likes via `onChange`.
1610
+ */
1611
+ declare function PrefsForm(props: PrefsFormProps): react.JSX.Element;
1612
+
1613
+ /**
1614
+ * Props for {@link PrefsDialog} — everything {@link PrefsForm} takes, plus
1615
+ * the dialog's own open state and chrome.
1616
+ */
1617
+ interface PrefsDialogProps extends PrefsFormProps {
1618
+ isOpen: boolean;
1619
+ onOpenChange: (open: boolean) => void;
1620
+ /** Dialog heading. Defaults to the schema root's `name`. */
1621
+ title?: ReactNode;
1622
+ /** Extra chrome rendered at the end of the title row (e.g. a dev-mode
1623
+ * "Show hidden" switch). An action the reader acts on when they are done
1624
+ * — resetting, importing — belongs in `footer` instead, where a dialog's
1625
+ * actions live. */
1626
+ headerExtra?: ReactNode;
1627
+ /** Footer slot, passed through to `Dialog` — typically a reset or done
1628
+ * action. */
1629
+ footer?: ReactNode;
1630
+ /** Class applied to the dialog's modal box. */
1631
+ dialogClassName?: string;
1632
+ }
1633
+ /**
1634
+ * The kit's preferences dialog: `Dialog` + `PrefsForm`. Changes apply
1635
+ * live through `onChange` — there is no OK/Cancel staging. For custom
1636
+ * placement (sidebar, popover, inline page), compose `PrefsForm`
1637
+ * directly; this wrapper is intentionally thin.
1638
+ *
1639
+ * `layout="rail"` is what a dialog usually wants: the default columns wrap
1640
+ * sideways past two groups, and this box is 900px at its widest.
1641
+ */
1642
+ declare function PrefsDialog(props: PrefsDialogProps): react.JSX.Element;
1643
+
1341
1644
  /** Props for {@link Sidebar}. */
1342
1645
  interface SidebarProps {
1343
1646
  /**
@@ -1367,7 +1670,7 @@ interface SidebarProps {
1367
1670
  *
1368
1671
  * Pair with `<SidebarPanel>` for collapsible sections.
1369
1672
  */
1370
- declare function Sidebar(props: SidebarProps): react_jsx_runtime.JSX.Element;
1673
+ declare function Sidebar(props: SidebarProps): react.JSX.Element;
1371
1674
 
1372
1675
  /** Props for {@link SidebarPanel}. */
1373
1676
  interface SidebarPanelProps {
@@ -1381,7 +1684,7 @@ interface SidebarPanelProps {
1381
1684
  collapsed?: boolean;
1382
1685
  /**
1383
1686
  * Click handler for the title row. When provided, the header renders
1384
- * as a button (chevron + label) and acts as the collapse toggle.
1687
+ * as a button (fold mark + label) and acts as the collapse toggle.
1385
1688
  * When omitted, the title is static text and the panel can't collapse.
1386
1689
  */
1387
1690
  onToggleCollapse?(): void;
@@ -1398,11 +1701,11 @@ interface SidebarPanelProps {
1398
1701
  * Generic collapsible panel section for sidebars. Pure presentation —
1399
1702
  * caller manages `collapsed`/`hidden` state externally (the pattern is
1400
1703
  * to drive it from app prefs so the Preferences modal and inline
1401
- * chevrons toggle the same map).
1704
+ * fold marks toggle the same map).
1402
1705
  *
1403
1706
  * Pair with `<Sidebar>` for the docked column layout.
1404
1707
  */
1405
- declare function SidebarPanel(props: SidebarPanelProps): react_jsx_runtime.JSX.Element;
1708
+ declare function SidebarPanel(props: SidebarPanelProps): react.JSX.Element;
1406
1709
 
1407
1710
  /** Props for {@link ToolButton}. */
1408
1711
  interface ToolButtonProps {
@@ -1446,7 +1749,7 @@ interface ToolButtonProps {
1446
1749
  * and similar surfaces. Headless about layout direction (parent group
1447
1750
  * supplies flex direction via `ToolGroup`). Theme via `--wzl-*` tokens.
1448
1751
  */
1449
- declare function ToolButton(props: ToolButtonProps): react_jsx_runtime.JSX.Element;
1752
+ declare function ToolButton(props: ToolButtonProps): react.JSX.Element;
1450
1753
 
1451
1754
  /** Props for {@link ToolGroup}. */
1452
1755
  interface ToolGroupProps {
@@ -1471,7 +1774,7 @@ interface ToolGroupProps {
1471
1774
  * `<ToolButton>`s (or any children) along a chosen axis. No visual chrome
1472
1775
  * beyond layout; theming lives on the buttons.
1473
1776
  */
1474
- declare function ToolGroup(props: ToolGroupProps): react_jsx_runtime.JSX.Element;
1777
+ declare function ToolGroup(props: ToolGroupProps): react.JSX.Element;
1475
1778
 
1476
1779
  /** The full vocabulary of capability tags shipped in the default preset.
1477
1780
  * Apps and other consumers can add their own tags; this list is what
@@ -1501,6 +1804,11 @@ interface WorkspaceVisual {
1501
1804
  */
1502
1805
  interface ModeDefinition {
1503
1806
  id: string;
1807
+ /** Human-readable name for chrome — a breadcrumb, a status bar. Falls back
1808
+ * to `id`; read it through {@link modeLabel}. */
1809
+ label?: string;
1810
+ /** One sentence on what the mode is for, for a tooltip or a hint line. */
1811
+ description?: string;
1504
1812
  kind: 'soft' | 'strict';
1505
1813
  /** Capability tags this mode allows beyond IMPLICIT_TAGS. */
1506
1814
  allows: CapabilityTag[];
@@ -1534,23 +1842,6 @@ interface ModeRegistry {
1534
1842
  subscribe(listener: () => void): () => void;
1535
1843
  }
1536
1844
 
1537
- interface ShortcutInput {
1538
- key: string | readonly string[];
1539
- mod?: boolean;
1540
- alt?: boolean;
1541
- shift?: boolean | 'optional';
1542
- }
1543
- /** Format a shortcut as an array of display chips, one per key — modifier
1544
- * icons (⌘, ↑, ⌥) followed by the key glyph. UIs that want a boxed
1545
- * per-key look render each chip in its own element. `shift: 'optional'` is
1546
- * treated as falsy. */
1547
- declare function formatShortcutParts(b: ShortcutInput | undefined): readonly string[] | undefined;
1548
- /** Format a shortcut as a single display string. Order: mod, shift, alt,
1549
- * key. Returns `undefined` for `undefined` input so callers can `??` a
1550
- * fallback. When `key` is an array, the first element is used. `shift: 'optional'`
1551
- * is treated as falsy. */
1552
- declare function formatShortcut(b: ShortcutInput | undefined): string | undefined;
1553
-
1554
1845
  /** Props for {@link ToolPalette}. */
1555
1846
  interface ToolPaletteProps {
1556
1847
  tools: ToolsApi;
@@ -1583,40 +1874,7 @@ interface ToolPaletteProps {
1583
1874
  * Given a `modeRegistry`, tools whose capabilities the current mode does not
1584
1875
  * allow render greyed out and inert rather than disappearing.
1585
1876
  */
1586
- declare function ToolPalette(props: ToolPaletteProps): react_jsx_runtime.JSX.Element;
1587
-
1588
- /**
1589
- * Whether a {@link Field} stacks its label above the control or sits them
1590
- * side by side.
1591
- */
1592
- type FieldOrientation = 'stacked' | 'row';
1593
- /** Props for {@link Field}. */
1594
- type FieldProps = {
1595
- orientation?: FieldOrientation;
1596
- className?: string;
1597
- children?: ReactNode;
1598
- };
1599
- /**
1600
- * Layout primitive that arranges a label, control, hint, and error in the
1601
- * canonical weasel-ui form-row shape. The control itself owns its semantics
1602
- * (RAC `TextField`, `Checkbox`, etc.); this just paints the layout.
1603
- *
1604
- * Most users will instead reach for `Input` / `Checkbox` / `Switch`, which
1605
- * compose Field internally. Use Field directly when you need a custom
1606
- * control to sit in the same visual rhythm.
1607
- */
1608
- declare function Field({ orientation, className, children }: FieldProps): react_jsx_runtime.JSX.Element;
1609
- /**
1610
- * The class names {@link Field} paints its slots with, so a control composing
1611
- * its own layout can match the same form-row rhythm.
1612
- */
1613
- declare const fieldClasses: {
1614
- root: string;
1615
- row: string;
1616
- label: string;
1617
- hint: string;
1618
- error: string;
1619
- };
1877
+ declare function ToolPalette(props: ToolPaletteProps): react.JSX.Element;
1620
1878
 
1621
1879
  /**
1622
1880
  * Props for {@link Checkbox}, on top of React Aria's `Checkbox` props. The
@@ -1664,27 +1922,27 @@ type TabsProps = Omit<TabsProps$1, 'className' | 'children'> & {
1664
1922
  * Tab set wrapping React Aria's Tabs, skinned against the `--wzl-*` tokens.
1665
1923
  * Holds a {@link TabList} and one {@link TabPanel} per tab.
1666
1924
  */
1667
- declare function Tabs({ children, className, ...rest }: TabsProps): react_jsx_runtime.JSX.Element;
1925
+ declare function Tabs({ children, className, ...rest }: TabsProps): react.JSX.Element;
1668
1926
  /** Props for {@link TabList}, on top of React Aria's `TabList` props. */
1669
1927
  type TabListProps<T extends object> = Omit<TabListProps$1<T>, 'className'> & {
1670
1928
  className?: string;
1671
1929
  };
1672
1930
  /** The row of tab buttons inside a {@link Tabs}. */
1673
- declare function TabList<T extends object>({ className, ...rest }: TabListProps<T>): react_jsx_runtime.JSX.Element;
1931
+ declare function TabList<T extends object>({ className, ...rest }: TabListProps<T>): react.JSX.Element;
1674
1932
  /** Props for {@link Tab}, on top of React Aria's `Tab` props. */
1675
1933
  type TabProps = Omit<TabProps$1, 'className' | 'children'> & {
1676
1934
  children?: ReactNode;
1677
1935
  className?: string;
1678
1936
  };
1679
1937
  /** One tab button. Its `id` selects the {@link TabPanel} it reveals. */
1680
- declare function Tab({ children, className, ...rest }: TabProps): react_jsx_runtime.JSX.Element;
1938
+ declare function Tab({ children, className, ...rest }: TabProps): react.JSX.Element;
1681
1939
  /** Props for {@link TabPanel}, on top of React Aria's `TabPanel` props. */
1682
1940
  type TabPanelProps = Omit<TabPanelProps$1, 'className' | 'children'> & {
1683
1941
  children?: ReactNode;
1684
1942
  className?: string;
1685
1943
  };
1686
1944
  /** The content shown for the {@link Tab} whose `id` matches this panel's. */
1687
- declare function TabPanel({ children, className, ...rest }: TabPanelProps): react_jsx_runtime.JSX.Element;
1945
+ declare function TabPanel({ children, className, ...rest }: TabPanelProps): react.JSX.Element;
1688
1946
 
1689
1947
  /** Props for {@link RadioGroup}, on top of React Aria's `RadioGroup` props. */
1690
1948
  type RadioGroupProps = Omit<RadioGroupProps$1, 'children' | 'className'> & {
@@ -1699,18 +1957,24 @@ type RadioGroupProps = Omit<RadioGroupProps$1, 'children' | 'className'> & {
1699
1957
  * supplying the same label / description / errorMessage slots as `Input`.
1700
1958
  * Holds {@link Radio} children.
1701
1959
  */
1702
- declare function RadioGroup(props: RadioGroupProps): react_jsx_runtime.JSX.Element;
1960
+ declare function RadioGroup(props: RadioGroupProps): react.JSX.Element;
1703
1961
  /** Props for {@link Radio}, on top of React Aria's `Radio` props. */
1704
1962
  type RadioProps = Omit<RadioProps$1, 'className' | 'children'> & {
1705
1963
  children?: ReactNode;
1706
1964
  className?: string;
1707
1965
  };
1708
1966
  /** One choice in a {@link RadioGroup}. The label is passed as children. */
1709
- declare function Radio({ children, className, ...rest }: RadioProps): react_jsx_runtime.JSX.Element;
1967
+ declare function Radio({ children, className, ...rest }: RadioProps): react.JSX.Element;
1710
1968
 
1711
1969
  /** Props for {@link NumberField}, on top of React Aria's `NumberField` props. */
1712
1970
  type NumberFieldProps = Omit<NumberFieldProps$1, 'children' | 'className'> & {
1713
1971
  label?: ReactNode;
1972
+ /**
1973
+ * `'stacked'` (the default) puts the label above the field; `'row'` sets it
1974
+ * beside the field at its own width, with any description or error on a
1975
+ * line below. Same vocabulary as {@link Field}'s `orientation`.
1976
+ */
1977
+ orientation?: FieldOrientation;
1714
1978
  description?: ReactNode;
1715
1979
  errorMessage?: ReactNode | ((v: ValidationResult) => ReactNode);
1716
1980
  /** Hide the up/down stepper buttons. Defaults to false. */
@@ -1739,6 +2003,12 @@ type NumberFieldProps = Omit<NumberFieldProps$1, 'children' | 'className'> & {
1739
2003
  */
1740
2004
  declare const NumberField: react.ForwardRefExoticComponent<Omit<NumberFieldProps$1, "className" | "children"> & {
1741
2005
  label?: ReactNode;
2006
+ /**
2007
+ * `'stacked'` (the default) puts the label above the field; `'row'` sets it
2008
+ * beside the field at its own width, with any description or error on a
2009
+ * line below. Same vocabulary as {@link Field}'s `orientation`.
2010
+ */
2011
+ orientation?: FieldOrientation;
1742
2012
  description?: ReactNode;
1743
2013
  errorMessage?: ReactNode | ((v: ValidationResult) => ReactNode);
1744
2014
  /** Hide the up/down stepper buttons. Defaults to false. */
@@ -1777,13 +2047,16 @@ type MenuButtonProps<T extends string = string> = {
1777
2047
  isDisabled?: boolean;
1778
2048
  className?: string;
1779
2049
  'aria-label'?: string;
1780
- } & OverlayPortalProps;
2050
+ } & SegmentTooltipFields & OverlayPortalProps;
1781
2051
  /**
1782
2052
  * A button that opens a list and acts on the row chosen — "Add trial…",
1783
2053
  * "Load…". Unlike a {@link Select} it holds no value, so it sizes to its own
1784
2054
  * label rather than to its widest row.
2055
+ *
2056
+ * `shortcut` adds a kit tooltip reading `Name (⌘N)`, named by `aria-label` or
2057
+ * a string `label`, as `Button` does; `tooltip` replaces that text.
1785
2058
  */
1786
- declare function MenuButton<T extends string = string>({ label, items, onAction, isDisabled, className, 'aria-label': ariaLabel, portalContainer, }: MenuButtonProps<T>): react_jsx_runtime.JSX.Element;
2059
+ declare function MenuButton<T extends string = string>({ label, items, onAction, isDisabled, className, 'aria-label': ariaLabel, portalContainer, shortcut, tooltip, }: MenuButtonProps<T>): react.JSX.Element;
1787
2060
 
1788
2061
  /**
1789
2062
  * One option in a {@link ComboBox}'s `options` list. `textValue` is the
@@ -1863,13 +2136,13 @@ type ComboBoxProps<T extends Key$1 = string> = Omit<ComboBoxProps$1<object>, 'ch
1863
2136
  * type to filter; selection commits to `onSelectionChange`. When no value
1864
2137
  * is in the input, selection clears (key becomes null).
1865
2138
  */
1866
- declare function ComboBox<T extends Key$1 = string>(props: ComboBoxProps<T>): react_jsx_runtime.JSX.Element;
2139
+ declare function ComboBox<T extends Key$1 = string>(props: ComboBoxProps<T>): react.JSX.Element;
1867
2140
  /** Props for {@link ComboBoxItem}, on top of React Aria's `ListBoxItem` props. */
1868
2141
  type ComboBoxItemProps = Omit<ListBoxItemProps, 'className'> & {
1869
2142
  className?: string;
1870
2143
  };
1871
2144
  /** One row in a {@link ComboBox}'s filtered list. */
1872
- declare function ComboBoxItem({ className, ...rest }: ComboBoxItemProps): react_jsx_runtime.JSX.Element;
2145
+ declare function ComboBoxItem({ className, ...rest }: ComboBoxItemProps): react.JSX.Element;
1873
2146
 
1874
2147
  /** Props for {@link RangeSlider}, on top of React Aria's `Slider` props. */
1875
2148
  type RangeSliderProps = Omit<SliderProps$1, 'children' | 'className'> & {
@@ -1891,10 +2164,10 @@ type RangeSliderProps = Omit<SliderProps$1, 'children' | 'className'> & {
1891
2164
  * *horizontal* axis here and collapses the track to its content width. Style
1892
2165
  * the wrapper around one, not the root.
1893
2166
  */
1894
- declare function RangeSlider(props: RangeSliderProps): react_jsx_runtime.JSX.Element;
2167
+ declare function RangeSlider(props: RangeSliderProps): react.JSX.Element;
1895
2168
 
1896
2169
  /** Props for {@link Dialog}, on top of React Aria's `ModalOverlay` props. */
1897
- type DialogProps = Omit<WithoutPortalTarget<ModalOverlayProps>, 'children' | 'className'> & OverlayPortalProps & {
2170
+ type DialogProps = Omit<WithoutPortalTarget<ModalOverlayProps>, 'children' | 'className'> & OverlayPortalProps & StanceProps & {
1898
2171
  /** Heading rendered in the dialog's default header. Omit when supplying
1899
2172
  * a custom `header` slot via children. */
1900
2173
  title?: ReactNode;
@@ -1909,6 +2182,10 @@ type DialogProps = Omit<WithoutPortalTarget<ModalOverlayProps>, 'children' | 'cl
1909
2182
  role?: DialogProps$1['role'];
1910
2183
  /** Class applied to the modal box (inside the overlay). */
1911
2184
  className?: string;
2185
+ /** Class applied to the scrolling body. For content that owns its own
2186
+ * scrolling — a form with a fixed navigation rail beside a scrolling
2187
+ * pane — this is where the body's padding and overflow come off. */
2188
+ bodyClassName?: string;
1912
2189
  };
1913
2190
  /**
1914
2191
  * Modal dialog wrapping React Aria. Supplies a default header (title +
@@ -1917,23 +2194,19 @@ type DialogProps = Omit<WithoutPortalTarget<ModalOverlayProps>, 'children' | 'cl
1917
2194
  * `react-aria-components` upstream of this component.
1918
2195
  *
1919
2196
  * Escape, click-outside, focus trap, and scroll lock all come from the
1920
- * underlying primitives.
2197
+ * underlying primitives. `stance` and `tone` work as on `<PropertyPanel>` —
2198
+ * a destructive confirm is `stance="danger"`.
1921
2199
  */
1922
- declare function Dialog(props: DialogProps): react_jsx_runtime.JSX.Element;
1923
-
1924
- /** Accent color of a {@link Callout}'s border and arrow. */
1925
- type CalloutTone = 'info' | 'warning' | 'danger';
2200
+ declare function Dialog(props: DialogProps): react.JSX.Element;
1926
2201
 
1927
2202
  /** Props for {@link Callout}, on top of React Aria's `Popover` props. */
1928
- type CalloutProps = Omit<WithoutPortalTarget<PopoverProps>, 'children' | 'className' | 'isNonModal' | 'triggerRef'> & OverlayPortalProps & {
2203
+ type CalloutProps = Omit<WithoutPortalTarget<PopoverProps>, 'children' | 'className' | 'isNonModal' | 'triggerRef'> & OverlayPortalProps & StanceProps & {
1929
2204
  children?: ReactNode;
1930
2205
  className?: string;
1931
2206
  /** Optional heading rendered above the body. */
1932
2207
  title?: ReactNode;
1933
2208
  /** Footer slot — typically action buttons. */
1934
2209
  footer?: ReactNode;
1935
- /** Accent tone for border + arrow. Default `info`. */
1936
- tone?: CalloutTone;
1937
2210
  /**
1938
2211
  * `true` — blocks interaction with the rest of the app until dismissed;
1939
2212
  * inner dialog is `role="alertdialog"`. `false` (default) — non-blocking:
@@ -1978,7 +2251,7 @@ type CalloutProps = Omit<WithoutPortalTarget<PopoverProps>, 'children' | 'classN
1978
2251
  * Wraps React Aria Popover + Dialog; positioning, collision flipping,
1979
2252
  * dismissal, and focus behavior come from the underlying primitives.
1980
2253
  */
1981
- declare function Callout(props: CalloutProps): react_jsx_runtime.JSX.Element;
2254
+ declare function Callout(props: CalloutProps): react.JSX.Element;
1982
2255
 
1983
2256
  /**
1984
2257
  * Coordinate transforms (model ↔ plot) for Plot2D. Pure / deterministic —
@@ -2225,7 +2498,7 @@ interface CurveEditorProps {
2225
2498
  * a `LayeredCurveEditor`. Reach for those directly to stack several curves
2226
2499
  * on one plot.
2227
2500
  */
2228
- declare function CurveEditor(props: CurveEditorProps): react_jsx_runtime.JSX.Element;
2501
+ declare function CurveEditor(props: CurveEditorProps): react.JSX.Element;
2229
2502
 
2230
2503
  /** Props for {@link PointPlotter}. */
2231
2504
  interface PointPlotterProps {
@@ -2276,7 +2549,7 @@ interface PointPlotterProps {
2276
2549
  * `'click-empty'` (CurveEditor defaults to `'click-curve'`, which
2277
2550
  * doesn't make sense without a curve to hit-test against).
2278
2551
  */
2279
- declare function PointPlotter(props: PointPlotterProps): react_jsx_runtime.JSX.Element;
2552
+ declare function PointPlotter(props: PointPlotterProps): react.JSX.Element;
2280
2553
 
2281
2554
  /**
2282
2555
  * Options for {@link paintGradientTrack}.
@@ -2366,76 +2639,6 @@ type AsyncOptionsResult<T extends Key> = {
2366
2639
  */
2367
2640
  declare function useAsyncOptions<T extends Key = string>({ load, debounceMs, minLength, }: UseAsyncOptionsProps<T>): AsyncOptionsResult<T>;
2368
2641
 
2369
- /** One row in a reorderable list. */
2370
- interface LayerListItem {
2371
- id: string;
2372
- label: ReactNode;
2373
- /** Locked rows cannot be dragged, cannot be crossed by drops, and
2374
- * never combine with other rows in a multi-selection. */
2375
- locked?: boolean;
2376
- /** Optional color swatch rendered before the label. Any CSS color string. */
2377
- swatch?: string;
2378
- }
2379
- /**
2380
- * Options for {@link useReorderDragList}. `onReorder` receives the dragged ids
2381
- * and the index they were dropped at, measured against the pre-drag `items`.
2382
- */
2383
- interface UseReorderDragListOptions {
2384
- items: LayerListItem[];
2385
- selectedIds: string[];
2386
- onReorder(ids: string[], targetIndex: number): void;
2387
- /** A press that was released without ever engaging a drag — the click a
2388
- * list row means by it. Fires for locked rows too, which can be selected
2389
- * but not dragged. Modifiers are read at press, not at release. */
2390
- onPress?(id: string, mods: PressModifiers): void;
2391
- /** Pointer-move distance (px) before pending drag engages. Default 4. */
2392
- threshold?: number;
2393
- }
2394
- /** Modifier keys held when a press began. */
2395
- interface PressModifiers {
2396
- shiftKey: boolean;
2397
- ctrlKey: boolean;
2398
- metaKey: boolean;
2399
- altKey: boolean;
2400
- }
2401
- /**
2402
- * Live drag state for rendering feedback: which ids are being dragged and the
2403
- * insertion index the drop would use. Both `null` when no drag is engaged.
2404
- */
2405
- interface ReorderDragState {
2406
- draggedIds: string[] | null;
2407
- targetIndex: number | null;
2408
- }
2409
- /**
2410
- * A `ref` for the list container, an `onPointerDown` for each row, and the
2411
- * live {@link ReorderDragState}. The container ref is required, not optional
2412
- * decoration: it is what the drop index is measured against and what the
2413
- * pointer session is opened on.
2414
- */
2415
- interface ReorderDragHandlers {
2416
- rowProps(id: string, index: number): {
2417
- onPointerDown(e: PointerEvent): void;
2418
- };
2419
- containerProps: {
2420
- ref: RefCallback<HTMLElement>;
2421
- };
2422
- state: ReorderDragState;
2423
- }
2424
- /**
2425
- * Drag-to-reorder for a vertical list of rows. Dragging a row that is part of
2426
- * the current selection drags the whole selection; dragging any other row
2427
- * drags just that row. Locked rows can neither be dragged nor crossed by a
2428
- * drop. A drop that would leave a contiguous block where it already is does
2429
- * not call `onReorder`.
2430
- *
2431
- * A press opens a `startThresholdDrag` on the *container*, which owns the
2432
- * rest of the gesture: a drag that leaves the list still tracks, a release
2433
- * anywhere still drops, and a release the window never delivered still ends
2434
- * the drag. The container is the origin rather than the row because rows come
2435
- * and go as the list re-renders, and a drag must outlive the row it grabbed.
2436
- */
2437
- declare function useReorderDragList(opts: UseReorderDragListOptions): ReorderDragHandlers;
2438
-
2439
2642
  /** The only thing the hook needs to know about a bar's items: which are
2440
2643
  * skipped by arrow navigation. */
2441
2644
  type RovingItem = {
@@ -2477,7 +2680,7 @@ type RovingTabIndex<T extends HTMLElement = HTMLDivElement> = {
2477
2680
  * at both ends. Home and End go to the first and last enabled item. Both axes
2478
2681
  * navigate, so the same bar works laid out either way.
2479
2682
  *
2480
- * Backs `ActionsBar`, `OptionsBar`, and `ToggleBar`.
2683
+ * Backs `ButtonBar`, `OptionsBar`, and `ToggleBar`.
2481
2684
  *
2482
2685
  * **When a bar should not use this.** What decides it is the items, not who
2483
2686
  * owns them. A container of compound controls — a number field, a select, a
@@ -2494,5 +2697,5 @@ type RovingTabIndex<T extends HTMLElement = HTMLDivElement> = {
2494
2697
  */
2495
2698
  declare function useRovingTabIndex<T extends HTMLElement = HTMLDivElement>(options: UseRovingTabIndexOptions): RovingTabIndex<T>;
2496
2699
 
2497
- export { ActionBar, ActionsBar, Badge, Callout, Checkbox, ComboBox, ComboBoxItem, CurveEditor, DataGrid, Dialog, Disclosure, DisclosureRow, DragHandleGlyph, EDGE_PROFILES, Field, KeyCap, KeySequence, MINUS_SIGN, MenuButton, NumberField, OptionsBar, Plot2D, PointPlotter, Powerline, Radio, RadioGroup, RangeSlider, Sidebar, SidebarPanel, Slider, Switch, Tab, TabList, TabPanel, Tabs, ToolButton, ToolGroup, ToolPalette, chromaAt, detectPlatform, dlog, fieldClasses, formatNumber, formatShortcut, formatShortcutParts, inferKeycapKind, isDebugEnabled, isPrefLeaf, keyGlyph, keySpecFromKey, keySpecsFromMods, oklchToHex, paintGradientTrack, prefValueAtPath, useAsyncOptions, useReorderDragList, useRovingTabIndex, visiblePrefSubtree };
2498
- export type { ActionBarProps, ActionsBarItem, ActionsBarProps, ActionsBarSize, ActionsBarVariant, AddPointMode, AnchorRenderProps, AsyncOption, AsyncOptionsResult, AxesSettings, BadgeProps, BadgeShape, BadgeSize, BadgeTone, BadgeVariant, BoundsCtx, BuiltInEdgeName, CalloutProps, CheckboxProps, ChromaCurve, ChromaCurvePoint, ComboBoxCommit, ComboBoxFilter, ComboBoxItemProps, ComboBoxOption, ComboBoxProps, ControlPoint, CurveDomain, CurveEditorProps, DataGridColumn, DataGridProps, DialogProps, DisclosureDirection, DisclosureProps, DisclosureRowProps, DragHandleGlyphProps, EdgeCap, EdgeProfile, EndpointMode, FieldOrientation, FieldProps, FillSettings, GradientTrackOpts, GridSettings, InterpolationMode, KeyCapProps, KeyCapVariant, KeySequenceProps, KeySpec, KeycapKind, LayerListItem, LogicalMod, LogicalModSpec, MenuButtonItem, MenuButtonProps, NumberFieldProps, OptionsBarItem, OptionsBarProps, OptionsBarSize, OptionsBarVariant, Platform, Plot2DCoords, Plot2DHandle, Plot2DProps, PointPlotterProps, PowerlineProps, PowerlineSegment, RadioGroupProps, RadioProps, RangeSliderProps, ReorderDragHandlers, ReorderDragState, RovingItem, RovingTabIndex, SidebarPanelProps, SidebarProps, SliderProps, SwitchProps, TabListProps, TabPanelProps, TabProps, TabsProps, Thumb, ThumbRenderCtx, ThumbShape, ToolButtonProps, ToolGroupProps, ToolPaletteProps, TrackCtx, UseAsyncOptionsProps, UseReorderDragListOptions, UseRovingTabIndexOptions };
2700
+ export { ActionBar, Badge, ButtonBar, Callout, Checkbox, ColorModeControl, ComboBox, ComboBoxItem, CurveEditor, DataGrid, Dialog, Disclosure, DisclosureMark, DisclosureRow, DragGhost, DragHandleGlyph, EDGE_PROFILES, FieldOrientation, KeyCap, KeySequence, ListEditor, MenuButton, NumberField, OptionsBar, OverlayPortalProps, Plot2D, PointPlotter, Powerline, PrefRenderer, PrefsDialog, PrefsForm, Radio, RadioGroup, RangeSlider, SegmentTooltipFields, Sidebar, SidebarPanel, Slider, StanceProps, Switch, Tab, TabList, TabPanel, Tabs, ToggleBarSize, ToggleBarVariant, ToolButton, ToolGroup, ToolPalette, WithoutPortalTarget, chromaAt, detectPlatform, dlog, formatShortcut, formatShortcutParts, inferKeycapKind, isDebugEnabled, isPrefLeaf, keyGlyph, keySpecFromKey, keySpecsFromMods, keySpecsFromShortcut, oklchToHex, paintGradientTrack, prefValueAtPath, useAsyncOptions, useReorderDragList, useRovingTabIndex, visiblePrefSubtree };
2701
+ export type { ActionBarProps, AddPointMode, AnchorRenderProps, AsyncOption, AsyncOptionsResult, AxesSettings, BadgeProps, BadgeShape, BadgeSize, BadgeStatus, BadgeVariant, BoundsCtx, BuiltInEdgeName, ButtonBarItem, ButtonBarProps, ButtonBarSize, ButtonBarVariant, CalloutProps, CheckboxProps, ChromaCurve, ChromaCurvePoint, ColorModeControlProps, ComboBoxCommit, ComboBoxFilter, ComboBoxItemProps, ComboBoxOption, ComboBoxProps, ControlPoint, CurveDomain, CurveEditorProps, DataGridColumn, DataGridProps, DialogProps, DisclosureMarkProps, DisclosureProps, DisclosureRowProps, DragGhostProps, DragHandleGlyphProps, EdgeCap, EdgeProfile, EndpointMode, FillSettings, GradientTrackOpts, GridSettings, InterpolationMode, KeyCapProps, KeyCapVariant, KeySequenceProps, KeySpec, KeycapKind, ListEditorProps, LogicalMod, LogicalModSpec, MenuButtonItem, MenuButtonProps, NumberFieldProps, OptionsBarItem, OptionsBarProps, OptionsBarSize, OptionsBarVariant, Platform, Plot2DCoords, Plot2DHandle, Plot2DProps, PointPlotterProps, PowerlineProps, PowerlineSegment, PrefsDialogProps, PrefsFormProps, PrefsLayout, RadioGroupProps, RadioProps, RangeSliderProps, ReorderDragHandlers, ReorderDragState, ReorderGhost, RovingItem, RovingTabIndex, SidebarPanelProps, SidebarProps, SliderProps, SwitchProps, TabListProps, TabPanelProps, TabProps, TabsProps, Thumb, ThumbRenderCtx, ThumbShape, ToolButtonProps, ToolGroupProps, ToolPaletteProps, TrackCtx, UseAsyncOptionsProps, UseReorderDragListOptions, UseRovingTabIndexOptions };