@weasel-js/labkit 1.6.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/dist/_dts/{CanvasStackContext-DQgcH1ny.d.ts → CanvasStackContext-D2jnIwfk.d.ts} +1 -1
  2. package/dist/_dts/FloatingPanel-7j0IcXwz.d.ts +30 -0
  3. package/dist/_dts/{LayerList.d-2c9yup5Y.d.ts → LayerList.d-DiuEArKq.d.ts} +4 -4
  4. package/dist/_dts/PrefsRow.d-TOZ7BgD9.d.ts +79 -0
  5. package/dist/_dts/PropertyPanel.d-D-1paCbE.d.ts +141 -0
  6. package/dist/_dts/{Select.d-BchGMC2Y.d.ts → Select.d-Bensr_MT.d.ts} +15 -6
  7. package/dist/_dts/Stage-CCWfQQWM.d.ts +202 -0
  8. package/dist/_dts/index-B2Yj5aA0.d.ts +274 -0
  9. package/dist/_dts/{index-B0--8PEM.d.ts → index-CsYqUHD3.d.ts} +12 -13
  10. package/dist/_dts/{types-B7y8hX1D.d.ts → types-CRPSGFAp.d.ts} +33 -5
  11. package/dist/_dts/{frac-DTRq7Xpb.d.ts → types-CSm9jgol.d.ts} +700 -650
  12. package/dist/_dts/{useTrialState-CP4jfuKl.d.ts → useTrialState-CTZPgeZ7.d.ts} +2 -3
  13. package/dist/canvas/index.d.ts +40 -8
  14. package/dist/canvas/index.js +5 -3
  15. package/dist/chrome/index.d.ts +5 -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-275JRRVD.js +728 -0
  20. package/dist/chunk-275JRRVD.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-4LJSC7MB.js +143 -0
  24. package/dist/chunk-4LJSC7MB.js.map +1 -0
  25. package/dist/{chunk-3FI7Y4R4.js → chunk-7BO7HNGF.js} +5 -5
  26. package/dist/{chunk-3FI7Y4R4.js.map → chunk-7BO7HNGF.js.map} +1 -1
  27. package/dist/chunk-AWQG7FCC.js +19 -0
  28. package/dist/chunk-AWQG7FCC.js.map +1 -0
  29. package/dist/chunk-CZZPXUOU.js +3 -0
  30. package/dist/{chunk-SBXNQW4G.js.map → chunk-CZZPXUOU.js.map} +1 -1
  31. package/dist/{chunk-ZORVNOKX.js → chunk-FMK7UQ6V.js} +24 -145
  32. package/dist/chunk-FMK7UQ6V.js.map +1 -0
  33. package/dist/{chunk-BVL7Y574.js → chunk-FZ7YFQN7.js} +26 -10
  34. package/dist/chunk-FZ7YFQN7.js.map +1 -0
  35. package/dist/{chunk-USO6TERP.js → chunk-GOZLNM4L.js} +11 -9
  36. package/dist/chunk-GOZLNM4L.js.map +1 -0
  37. package/dist/{chunk-H5VIV7MQ.js → chunk-I5DUQ5HM.js} +88 -82
  38. package/dist/chunk-I5DUQ5HM.js.map +1 -0
  39. package/dist/chunk-J7OWWTCW.js +143 -0
  40. package/dist/chunk-J7OWWTCW.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-VQ47KWD5.js → chunk-KMJ7RWD3.js} +18 -7
  44. package/dist/chunk-KMJ7RWD3.js.map +1 -0
  45. package/dist/{chunk-ERFMC6WU.js → chunk-M7HP3FTK.js} +20 -11
  46. package/dist/chunk-M7HP3FTK.js.map +1 -0
  47. package/dist/chunk-MIM5R4ZT.js +14972 -0
  48. package/dist/chunk-MIM5R4ZT.js.map +1 -0
  49. package/dist/{chunk-HFRE4QQV.js → chunk-T5IBSPAM.js} +96 -32
  50. package/dist/chunk-T5IBSPAM.js.map +1 -0
  51. package/dist/chunk-UNAZSLWE.js +294 -0
  52. package/dist/chunk-UNAZSLWE.js.map +1 -0
  53. package/dist/{chunk-RS3HRQWU.js → chunk-WPLAANH4.js} +4 -3
  54. package/dist/chunk-WPLAANH4.js.map +1 -0
  55. package/dist/{chunk-AWH3SRPW.js → chunk-Y23G2VZL.js} +5 -37
  56. package/dist/chunk-Y23G2VZL.js.map +1 -0
  57. package/dist/{chunk-MOLIUNVH.js → chunk-YT75VYRD.js} +4 -4
  58. package/dist/{chunk-MOLIUNVH.js.map → chunk-YT75VYRD.js.map} +1 -1
  59. package/dist/chunk-ZIFPHIWZ.js +302 -0
  60. package/dist/chunk-ZIFPHIWZ.js.map +1 -0
  61. package/dist/config/index.d.ts +48 -40
  62. package/dist/config/index.js +4 -5
  63. package/dist/controls/index.d.ts +91 -7
  64. package/dist/controls/index.js +5 -4
  65. package/dist/dragdrop/index.d.ts +9 -7
  66. package/dist/dragdrop/index.js +3 -2
  67. package/dist/index.d.ts +294 -82
  68. package/dist/index.js +425 -402
  69. package/dist/index.js.map +1 -1
  70. package/dist/layers/index.d.ts +4 -5
  71. package/dist/layers/index.js +2 -1
  72. package/dist/loupe/index.d.ts +20 -17
  73. package/dist/loupe/index.js +5 -3
  74. package/dist/overview/index.d.ts +56 -0
  75. package/dist/overview/index.js +289 -0
  76. package/dist/overview/index.js.map +1 -0
  77. package/dist/passthrough/weasel-ui.d.ts +239 -69
  78. package/dist/passthrough/weasel-ui.js +3 -2
  79. package/dist/primitives/index.d.ts +5 -204
  80. package/dist/primitives/index.js +6 -4
  81. package/dist/state/index.d.ts +8 -8
  82. package/dist/state/index.js +4 -5
  83. package/dist/state/index.js.map +1 -1
  84. package/dist/styles.css +152 -82
  85. package/dist/undo/index.d.ts +4 -4
  86. package/package.json +17 -12
  87. package/src/annotations/AnnotationOverlay.tsx +2 -2
  88. package/src/annotations/Annotations.less +0 -10
  89. package/src/annotations/MarkList.tsx +4 -8
  90. package/src/annotations/index.ts +1 -0
  91. package/src/annotations/paint.test.ts +3 -14
  92. package/src/annotations/paint.ts +3 -19
  93. package/src/annotations/store.test.ts +26 -0
  94. package/src/annotations/store.ts +25 -6
  95. package/src/annotations/svgNodes.test.ts +6 -9
  96. package/src/annotations/svgNodes.ts +3 -3
  97. package/src/annotations/toolMap.test.ts +37 -2
  98. package/src/annotations/toolMap.ts +13 -0
  99. package/src/annotations/types.ts +27 -0
  100. package/src/canvas/AGENTS.md +9 -10
  101. package/src/canvas/CameraInput.test.tsx +136 -0
  102. package/src/canvas/CameraInput.tsx +322 -0
  103. package/src/canvas/CanvasStack.tsx +47 -58
  104. package/src/canvas/LinkedCursor.less +16 -0
  105. package/src/canvas/LinkedCursor.tsx +54 -0
  106. package/src/canvas/Stage.test.tsx +33 -4
  107. package/src/canvas/Stage.tsx +47 -37
  108. package/src/canvas/cameraRegistry.test.ts +55 -0
  109. package/src/canvas/cameraRegistry.ts +86 -0
  110. package/src/canvas/cameraView.test.ts +60 -0
  111. package/src/canvas/cameraView.ts +61 -0
  112. package/src/canvas/cameraZoom.test.ts +46 -0
  113. package/src/canvas/cameraZoom.ts +24 -0
  114. package/src/canvas/index.ts +23 -2
  115. package/src/canvas/sharedScope.test.tsx +94 -0
  116. package/src/chrome/ChromeRegions.stories.tsx +1 -0
  117. package/src/chrome/regions/PaletteRegion.less +0 -7
  118. package/src/chrome/regions/SidebarRegion.less +12 -2
  119. package/src/chrome/regions/SidebarRegion.test.tsx +9 -2
  120. package/src/config/builder.test.ts +2 -1
  121. package/src/config/builder.ts +15 -8
  122. package/src/config/entry.test.ts +3 -1
  123. package/src/config/fromConfigField.test.ts +14 -0
  124. package/src/config/fromConfigField.ts +19 -4
  125. package/src/config/index.ts +4 -1
  126. package/src/config/path.ts +2 -5
  127. package/src/config/resolve.ts +15 -1
  128. package/src/config/sectionTree.test.ts +12 -6
  129. package/src/config/sectionTree.ts +15 -5
  130. package/src/config/types.ts +34 -9
  131. package/src/controls/ControlPanel.less +1 -1
  132. package/src/controls/ControlPanel.stories.tsx +3 -2
  133. package/src/controls/ControlPanel.test.tsx +76 -13
  134. package/src/controls/ControlPanel.tsx +80 -11
  135. package/src/controls/inDialog.test.tsx +18 -0
  136. package/src/controls/inDialog.tsx +2 -10
  137. package/src/index.test.ts +1 -1
  138. package/src/index.ts +23 -5
  139. package/src/instrument/SineWave.smoke.test.tsx +2 -0
  140. package/src/instrument/types.ts +10 -1
  141. package/src/lab/Lab.nebula.test.tsx +11 -2
  142. package/src/lab/Lab.test.tsx +3 -1
  143. package/src/lab/Lab.tsx +87 -76
  144. package/src/lab/{LabFit.stories.less → LabFit.browser.test.less} +1 -1
  145. package/src/lab/{LabFit.stories.tsx → LabFit.browser.test.tsx} +41 -63
  146. package/src/lab/LabFullChrome.stories.tsx +1 -0
  147. package/src/lab/LabHeader.test.tsx +24 -14
  148. package/src/lab/LabHeader.tsx +11 -12
  149. package/src/lab/LabShell.less +8 -17
  150. package/src/lab/LabSwitcher.less +6 -6
  151. package/src/lab/LabZoom.test.tsx +223 -0
  152. package/src/lab/LabZoom.tsx +170 -0
  153. package/src/lab/index.ts +1 -0
  154. package/src/loupe/AGENTS.md +7 -6
  155. package/src/loupe/LoupeGestures.tsx +15 -10
  156. package/src/loupe/TrialLoupe.tsx +5 -5
  157. package/src/loupe/index.ts +1 -0
  158. package/src/loupe/loupeActions.ts +6 -2
  159. package/src/overview/AGENTS.md +38 -0
  160. package/src/overview/OverviewMarks.test.tsx +100 -0
  161. package/src/overview/OverviewMarks.tsx +93 -0
  162. package/src/overview/TrialOverview.less +53 -0
  163. package/src/overview/TrialOverview.stories.tsx +50 -0
  164. package/src/overview/TrialOverview.test.tsx +116 -0
  165. package/src/overview/TrialOverview.tsx +376 -0
  166. package/src/overview/index.ts +2 -0
  167. package/src/passthrough/weasel-ui.test.ts +2 -0
  168. package/src/passthrough/weasel-ui.ts +23 -4
  169. package/src/primitives/FloatingPanel.test.tsx +11 -0
  170. package/src/primitives/FloatingPanel.tsx +2 -5
  171. package/src/primitives/JobProgress.less +1 -1
  172. package/src/primitives/Legend.stories.tsx +1 -0
  173. package/src/primitives/Readout.browser.test.tsx +137 -0
  174. package/src/primitives/Readout.less +12 -0
  175. package/src/primitives/Readout.stories.tsx +58 -0
  176. package/src/primitives/Readout.test.tsx +93 -0
  177. package/src/primitives/Readout.tsx +56 -0
  178. package/src/primitives/index.ts +2 -0
  179. package/src/specimen/Specimen.stories.tsx +1 -0
  180. package/src/specimen/Specimen.tsx +21 -4
  181. package/src/state/Persistence.browser.test.tsx +47 -0
  182. package/src/state/labRecords.test.ts +4 -1
  183. package/src/state/store.test.ts +9 -5
  184. package/src/state/usePersistedState.test.tsx +1 -1
  185. package/src/state/useTrialState.test.tsx +1 -1
  186. package/src/styles.less +3 -0
  187. package/src/theme/Interstellar.stories.tsx +4 -6
  188. package/src/theme/base.less +21 -47
  189. package/src/theme/interstellar.test.ts +1 -1
  190. package/src/theme/interstellar.theme.json +10 -3
  191. package/src/tools/labTool.ts +6 -2
  192. package/src/trial/Trial.annotations.test.tsx +16 -0
  193. package/src/trial/Trial.less +0 -13
  194. package/src/trial/Trial.loupe.test.tsx +73 -1
  195. package/src/trial/Trial.stories.tsx +2 -0
  196. package/src/trial/Trial.tsx +23 -1
  197. package/src/trial/TrialChrome.tsx +21 -3
  198. package/src/trial/trialOps.test.ts +4 -4
  199. package/dist/_dts/PrefsRow.d-DFpPIeIC.d.ts +0 -39
  200. package/dist/_dts/inDialog-D5ZKGjiD.d.ts +0 -23
  201. package/dist/_dts/index-DINmCuLA.d.ts +0 -453
  202. package/dist/_dts/number.d-OeQYQoUO.d.ts +0 -28
  203. package/dist/_dts/usePanZoom-Bq73pwFe.d.ts +0 -117
  204. package/dist/chunk-2AYGEN57.js +0 -32
  205. package/dist/chunk-2AYGEN57.js.map +0 -1
  206. package/dist/chunk-AWH3SRPW.js.map +0 -1
  207. package/dist/chunk-BVL7Y574.js.map +0 -1
  208. package/dist/chunk-ERFMC6WU.js.map +0 -1
  209. package/dist/chunk-H5VIV7MQ.js.map +0 -1
  210. package/dist/chunk-HFRE4QQV.js.map +0 -1
  211. package/dist/chunk-RS3HRQWU.js.map +0 -1
  212. package/dist/chunk-SBXNQW4G.js +0 -3
  213. package/dist/chunk-TT5C5S6R.js +0 -368
  214. package/dist/chunk-TT5C5S6R.js.map +0 -1
  215. package/dist/chunk-USO6TERP.js.map +0 -1
  216. package/dist/chunk-VQ47KWD5.js.map +0 -1
  217. package/dist/chunk-WUJXJC5O.js +0 -14568
  218. package/dist/chunk-WUJXJC5O.js.map +0 -1
  219. package/dist/chunk-ZORVNOKX.js.map +0 -1
  220. package/src/canvas/usePanZoom.test.ts +0 -244
  221. package/src/canvas/usePanZoom.ts +0 -147
  222. package/src/state/Persistence.stories.tsx +0 -75
@@ -1,15 +1,14 @@
1
- import { j as ToggleBarSize, k as ToggleBarVariant, l as SegmentTooltipFields, F as FieldOrientation, O as OverlayPortalProps, W as WithoutPortalTarget } from '../_dts/Select.d-BchGMC2Y.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-BchGMC2Y.js';
1
+ import { S as StanceProps, D as Display, P as PrefRenderer } from '../_dts/PrefsRow.d-TOZ7BgD9.js';
2
+ export { M as MINUS_SIGN, a as PrefRenderContext, f as formatNumber } from '../_dts/PrefsRow.d-TOZ7BgD9.js';
3
+ import { j as ToggleBarSize, k as ToggleBarVariant, b as ButtonSize, c as ButtonVariant, l as SegmentTooltipFields, F as FieldOrientation, O as OverlayPortalProps, W as WithoutPortalTarget } from '../_dts/Select.d-Bensr_MT.js';
4
+ export { B as Button, a as ButtonProps, 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-Bensr_MT.js';
3
5
  import { ToolPrefLeaf, ToolPrefGroup, ToolsApi, oklchDegToHex } from '@weasel-js/core';
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
+ export { ToolPref as BuiltinPref, ToolPrefBoolean as PrefBoolean, ToolPrefBooleanControl as PrefBooleanControl, ToolPrefBooleanEncoding as PrefBooleanEncoding, 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';
6
7
  import * as react from 'react';
7
- import { ReactNode, CSSProperties, HTMLAttributes, ReactElement, PointerEvent, RefCallback, KeyboardEvent, RefObject } from 'react';
8
- import { S as StanceProps, P as PrefRenderer } from '../_dts/PrefsRow.d-DFpPIeIC.js';
9
- export { a as PrefRenderContext } from '../_dts/PrefsRow.d-DFpPIeIC.js';
10
- export { L as LayerList, a as LayerListItem, b as LayerListProps, c as LayerMove, m as moveLayers } from '../_dts/LayerList.d-2c9yup5Y.js';
8
+ import { ReactNode, CSSProperties, HTMLAttributes, ButtonHTMLAttributes, ReactElement, PointerEvent, RefCallback, KeyboardEvent, RefObject } from 'react';
9
+ export { L as LayerList, a as LayerListItem, b as LayerListProps, c as LayerMove, m as moveLayers } from '../_dts/LayerList.d-DiuEArKq.js';
11
10
  import { ColorModePreference } from '@weasel-js/theme';
12
- export { M as MINUS_SIGN, f as formatNumber } from '../_dts/number.d-OeQYQoUO.js';
11
+ export { l as PropertyAlign, m as PropertyDensity, P as PropertyMetricProps } from '../_dts/PropertyPanel.d-D-1paCbE.js';
13
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';
14
13
  export { DialogTrigger as CalloutTrigger } from 'react-aria-components';
15
14
 
@@ -82,7 +81,7 @@ interface ActionBarProps {
82
81
  * (roving tabindex) yet — bar consumers today are short flat strips. Add
83
82
  * if/when a long bar lands.
84
83
  */
85
- declare function ActionBar(props: ActionBarProps): react_jsx_runtime.JSX.Element;
84
+ declare function ActionBar(props: ActionBarProps): react.JSX.Element;
86
85
 
87
86
  /**
88
87
  * Built-in badge silhouettes. `pill`, `plain` and `square` are drawn in CSS;
@@ -467,12 +466,19 @@ interface RibbonParams {
467
466
  * returns the horizontal displacement of that point, positive to the right.
468
467
  */
469
468
  type EdgeProfile = (t: number, depth: number) => number;
470
- /** The named edge profiles in {@link EDGE_PROFILES}. */
471
- type BuiltInEdgeName = 'flat' | 'chevron' | 'slant' | 'slant-up' | 'round' | 'scallop' | 'concave-chevron';
469
+ /** The named edge caps expressible as an {@link EdgeProfile}, in {@link EDGE_PROFILES}. */
470
+ type BuiltInProfileName = 'flat' | 'chevron' | 'slant' | 'slant-up' | 'round' | 'scallop' | 'concave-chevron';
471
+ /**
472
+ * Every named edge cap. `puzzle` is a jigsaw tab: a round knob on a narrower
473
+ * neck, protruding from the edge's owner into a matching socket in its
474
+ * neighbor. Its bulb overhangs its neck, so it is not a function of `t` and
475
+ * has no entry in {@link EDGE_PROFILES}.
476
+ */
477
+ type BuiltInEdgeName = BuiltInProfileName | 'puzzle';
472
478
  /** An edge profile, either by name or as a function. */
473
479
  type EdgeCap = BuiltInEdgeName | EdgeProfile;
474
480
  /** The built-in {@link EdgeProfile} implementations, by name. */
475
- declare const EDGE_PROFILES: Record<BuiltInEdgeName, EdgeProfile>;
481
+ declare const EDGE_PROFILES: Record<BuiltInProfileName, EdgeProfile>;
476
482
 
477
483
  interface PowerlineParams {
478
484
  /** Profile for the left edge (the cap segment N inherits from segment N-1). */
@@ -811,6 +817,26 @@ type BadgeProps = BadgePropsByShape;
811
817
  */
812
818
  declare const Badge: react.ForwardRefExoticComponent<BadgePropsByShape & react.RefAttributes<HTMLElement>>;
813
819
 
820
+ /** Props for {@link CloseButton}. */
821
+ interface CloseButtonProps {
822
+ /** Accessible name — what the press closes or removes: `Close dialog`,
823
+ * `Remove Glow`. Required, since the button shows only a glyph. */
824
+ ariaLabel: string;
825
+ onClick?: ButtonHTMLAttributes<HTMLButtonElement>['onClick'];
826
+ /** Kit tooltip content. None by default. */
827
+ tooltip?: ReactNode;
828
+ disabled?: boolean;
829
+ className?: string;
830
+ }
831
+ /**
832
+ * The kit's close / dismiss / remove button: the `close` glyph at chrome size
833
+ * in a square `--wzl-icon-button-size` target. Kit components that dismiss a
834
+ * surface or remove a row draw their × with this.
835
+ *
836
+ * `ref` forwards to the underlying `<button>`.
837
+ */
838
+ declare const CloseButton: react.ForwardRefExoticComponent<CloseButtonProps & react.RefAttributes<HTMLButtonElement>>;
839
+
814
840
  /**
815
841
  * One column of a {@link DataGrid}. `id` doubles as the default property name
816
842
  * read off each row when no `accessor` is given.
@@ -876,7 +902,7 @@ interface DataGridProps<Row extends {
876
902
  */
877
903
  declare function DataGrid<Row extends {
878
904
  id: string;
879
- }>(props: DataGridProps<Row>): react_jsx_runtime.JSX.Element;
905
+ }>(props: DataGridProps<Row>): react.JSX.Element;
880
906
 
881
907
  /** Props for `<DisclosureMark>`. */
882
908
  interface DisclosureMarkProps {
@@ -893,10 +919,10 @@ interface DisclosureMarkProps {
893
919
  * button. Anywhere the mark has to be the control, use `<Disclosure>`.
894
920
  *
895
921
  * Deliberately not part of the icon register, on the same grounds as
896
- * `DragHandleGlyph`: that register is outline strokes at a fixed weight, and
922
+ * `DragGrip`: that register is outline strokes at a fixed weight, and
897
923
  * this mark is filled.
898
924
  */
899
- declare function DisclosureMark({ open, size, className }: DisclosureMarkProps): react_jsx_runtime.JSX.Element;
925
+ declare function DisclosureMark({ open, size, className }: DisclosureMarkProps): react.JSX.Element;
900
926
  /** Props for `<Disclosure>`. */
901
927
  interface DisclosureProps {
902
928
  /** Whether the section it controls is open. The consumer owns this. */
@@ -932,7 +958,7 @@ interface DisclosureProps {
932
958
  * of the row's label rather than a child, so clicking to expand does not
933
959
  * actuate the label's own control.
934
960
  */
935
- declare function Disclosure({ open, onToggle, label, controls, size, disabled, className }: DisclosureProps): react_jsx_runtime.JSX.Element;
961
+ declare function Disclosure({ open, onToggle, label, controls, size, disabled, className }: DisclosureProps): react.JSX.Element;
936
962
  /** Props for `<DisclosureRow>`. */
937
963
  interface DisclosureRowProps extends Omit<DisclosureProps, 'className'> {
938
964
  /** The row's own content — a label, a checkbox, a count. */
@@ -947,7 +973,7 @@ interface DisclosureRowProps extends Omit<DisclosureProps, 'className'> {
947
973
  * it, so a row whose content is a `<label>` wrapping a checkbox stays
948
974
  * clickable as a label without the twisty actuating it.
949
975
  */
950
- declare function DisclosureRow({ children, className, ...twisty }: DisclosureRowProps): react_jsx_runtime.JSX.Element;
976
+ declare function DisclosureRow({ children, className, ...twisty }: DisclosureRowProps): react.JSX.Element;
951
977
 
952
978
  /** Props for `<DragGhost>`. */
953
979
  interface DragGhostProps {
@@ -969,8 +995,8 @@ interface DragGhostProps {
969
995
  */
970
996
  declare function DragGhost({ at, from, children }: DragGhostProps): react.ReactPortal;
971
997
 
972
- /** Props for `<DragHandleGlyph>`. */
973
- interface DragHandleGlyphProps {
998
+ /** Props for `<DragGrip>`. */
999
+ interface DragGripProps {
974
1000
  /** Height in px; width scales with it. Default 16. */
975
1001
  size?: number;
976
1002
  }
@@ -979,7 +1005,7 @@ interface DragHandleGlyphProps {
979
1005
  * Deliberately not part of the icon register: that register is outline strokes
980
1006
  * at a fixed weight, and a grip is filled dots. Forcing it in would either
981
1007
  * break the register's rule or produce a worse glyph. */
982
- declare function DragHandleGlyph({ size }: DragHandleGlyphProps): react_jsx_runtime.JSX.Element;
1008
+ declare function DragGrip({ size }: DragGripProps): react.JSX.Element;
983
1009
 
984
1010
  /**
985
1011
  * Width class of a keycap: a modifier glyph, a multi-character legend that
@@ -1022,7 +1048,7 @@ interface KeyCapProps {
1022
1048
  }
1023
1049
  /** Single bordered keycap chip for one glyph (modifier or key). Use
1024
1050
  * `KeySequence` to render a full shortcut. */
1025
- declare function KeyCap({ label, inverted, variant, className, style, font }: KeyCapProps): react_jsx_runtime.JSX.Element;
1051
+ declare function KeyCap({ label, inverted, variant, className, style, font }: KeyCapProps): react.JSX.Element;
1026
1052
 
1027
1053
  /** One key in a shortcut. */
1028
1054
  interface KeySpec {
@@ -1032,16 +1058,22 @@ interface KeySpec {
1032
1058
  * trigger the action (e.g. an optional modifier). Defaults to false. */
1033
1059
  optional?: boolean;
1034
1060
  }
1061
+ /** Where {@link KeySequence} draws its separator. */
1062
+ type KeySequenceJoins = 'all' | 'key' | 'none';
1035
1063
  /** Props for {@link KeySequence}. */
1036
1064
  interface KeySequenceProps {
1037
1065
  /** Keys to render. `undefined` or empty renders a muted em-dash.
1038
1066
  * Modifiers are always rendered first regardless of input order; relative
1039
1067
  * order within each group is preserved. */
1040
1068
  keys: readonly KeySpec[] | undefined;
1041
- /** Character inserted between the trailing modifier chip and the first
1042
- * non-modifier chip (e.g. `'+'` renders `⌘ + K`). `null` or `''`
1043
- * suppresses it. Defaults to `'+'`. */
1044
- separator?: string | null;
1069
+ /** Glyph drawn wherever {@link joins} places a separator. Defaults to `'+'`. */
1070
+ separator?: string;
1071
+ /** Where the separator goes. Defaults to `'key'`.
1072
+ * - `'all'`: between every pair of chips — `⌘ + ⇧ + K`, `⌘ + ⇧`, `A + B`.
1073
+ * - `'key'`: before every non-modifier — `⌘ ⇧ + K`, `⌘ + K + L`, `A + B`.
1074
+ * Modifiers stay unjoined, so `⌘ ⇧` gets none.
1075
+ * - `'none'`: never. */
1076
+ joins?: KeySequenceJoins;
1045
1077
  /** Forwarded to every `KeyCap` in the sequence. `'minimal'` renders
1046
1078
  * unfilled chips whose border + legend are `currentColor`. */
1047
1079
  variant?: KeyCapVariant;
@@ -1052,7 +1084,7 @@ interface KeySequenceProps {
1052
1084
  }
1053
1085
  /** Renders a shortcut as a row of `KeyCap` chips, one per key. Optional
1054
1086
  * keys render inverted to distinguish them from required ones. */
1055
- declare function KeySequence({ keys, separator, variant, font, className }: KeySequenceProps): react_jsx_runtime.JSX.Element;
1087
+ declare function KeySequence({ keys, separator, joins, variant, font, className }: KeySequenceProps): react.JSX.Element;
1056
1088
 
1057
1089
  /** Apple-style glyph for a DOM `KeyboardEvent.key` value. Covers escape,
1058
1090
  * delete/backspace, arrows, enter/return, tab, space. Unknown keys are
@@ -1216,12 +1248,17 @@ type BoundsCtx = {
1216
1248
  index: number;
1217
1249
  };
1218
1250
  /**
1219
- * Passed to `renderTrack`: the track's width in CSS px and a mapping from a
1220
- * slider value to its 0..1 position along the track.
1251
+ * Passed to `renderTrack`: the track's width in CSS px, a mapping from a
1252
+ * slider value to its 0..1 position along the value span, and the CSS
1253
+ * position (a `calc()` against the painted box's width) of a 0..1 fraction of
1254
+ * that span. A painter places everything that must line up with the thumbs
1255
+ * through `fractionToPosition`: under `thumbFit: 'inside'` the span stops half
1256
+ * a thumb short of each end of the track.
1221
1257
  */
1222
1258
  type TrackCtx = {
1223
1259
  trackWidth: number;
1224
1260
  valueToFraction: (v: number) => number;
1261
+ fractionToPosition: (f: number) => string;
1225
1262
  };
1226
1263
  /** A {@link Slider} stop that carries a label, drawn under the track at the stop. */
1227
1264
  type SliderStop = {
@@ -1250,7 +1287,8 @@ type SliderStop = {
1250
1287
  * `'even'` falls back to linear.
1251
1288
  *
1252
1289
  * `trackClick: 'move-nearest'` makes a press on bare track send the closest
1253
- * thumb there and continue as a drag. It is off by default because on a
1290
+ * thumb there, focus it, and continue as a drag. It is the default for a
1291
+ * single thumb. With several it defaults to `'none'`, because on a
1254
1292
  * multi-thumb editor a stray click would yank a stop the user was not aiming
1255
1293
  * at; `onAddThumb`, where it is set, keeps the track press.
1256
1294
  *
@@ -1259,6 +1297,12 @@ type SliderStop = {
1259
1297
  * `onRemoveThumb` lets a right-click or a drag off the track remove one —
1260
1298
  * both callbacks can decline by returning `null`/`false`. `allowShiftAll`
1261
1299
  * makes shift-drag translate every thumb together.
1300
+ *
1301
+ * `thumbFit: 'inside'`, the default, runs the value span half a thumb short of
1302
+ * each end of the track, so a thumb at `min` or `max` sits flush with the
1303
+ * track's edge instead of hanging half over it — the layout a native range
1304
+ * input has. `'overhang'` runs the span edge to edge and centers an end thumb
1305
+ * on the edge.
1262
1306
  */
1263
1307
  type SliderProps<T extends Thumb = Thumb> = {
1264
1308
  thumbs: readonly T[];
@@ -1278,11 +1322,16 @@ type SliderProps<T extends Thumb = Thumb> = {
1278
1322
  onRemoveThumb?: (index: number) => boolean;
1279
1323
  allowShiftAll?: boolean;
1280
1324
  renderTrack?: (ctx: TrackCtx) => ReactNode;
1325
+ thumbFit?: 'inside' | 'overhang';
1281
1326
  trackHeight?: number;
1282
1327
  /** `'slim'` drives the track and thumb from the kit's slider tokens, so a
1283
1328
  * Slider matches the property rows. `trackHeight` still wins if given. */
1284
1329
  density?: 'default' | 'slim';
1285
1330
  renderReadout?: (thumb: T, index: number) => ReactNode;
1331
+ /** How a thumb's value shows in the default readout and is spoken as its
1332
+ * `aria-valuetext` when the thumb gives no `valueText` of its own. Default:
1333
+ * three decimals shown, nothing spoken beyond `aria-valuenow`. */
1334
+ display?: Display;
1286
1335
  readoutPlacement?: 'none' | 'inline-after' | 'below-thumb';
1287
1336
  ariaLabel?: string;
1288
1337
  className?: string;
@@ -1320,7 +1369,7 @@ interface UseReorderDragListOptions {
1320
1369
  * also handles `click` sees one press, not two. A press that starts on a
1321
1370
  * control inside the row (a toggle) is left to the control. */
1322
1371
  onPress?(id: string, mods: PressModifiers): void;
1323
- /** Pointer-move distance (px) before pending drag engages. Default 4. */
1372
+ /** Pointer-move distance (px) before pending drag engages. Default `DRAG_THRESHOLD_PX`. */
1324
1373
  threshold?: number;
1325
1374
  /** Selector matching the container's children that are rows, for a list
1326
1375
  * that interleaves other elements (a table's detail rows). Default: every
@@ -1417,7 +1466,7 @@ interface ListEditorProps {
1417
1466
  * each, and an add button under them. Enter in an entry adds one after it;
1418
1467
  * Backspace in an empty one removes it.
1419
1468
  */
1420
- declare function ListEditor({ value, onChange, placeholder, empty, addLabel, 'aria-label': ariaLabel, className, }: ListEditorProps): react_jsx_runtime.JSX.Element;
1469
+ declare function ListEditor({ value, onChange, placeholder, empty, addLabel, 'aria-label': ariaLabel, className, }: ListEditorProps): react.JSX.Element;
1421
1470
 
1422
1471
  /** Props for {@link ColorModeControl}. */
1423
1472
  interface ColorModeControlProps {
@@ -1437,6 +1486,41 @@ interface ColorModeControlProps {
1437
1486
  */
1438
1487
  declare function ColorModeControl({ value, onChange, ariaLabel, size, variant, className, }: ColorModeControlProps): ReactElement;
1439
1488
 
1489
+ /** One stop in a {@link ThemeSwitcher}'s rotation. */
1490
+ interface ThemeSwitcherOption<T extends string = string> {
1491
+ value: T;
1492
+ /** Drawn in the button while this option is current. */
1493
+ icon: ReactNode;
1494
+ /** The option's name, read in the accessible name and tooltip. */
1495
+ label: string;
1496
+ }
1497
+ /** The color modes, in rotation order, as {@link ThemeSwitcher} cycles them by default. */
1498
+ declare const COLOR_MODE_OPTIONS: readonly ThemeSwitcherOption<ColorModePreference>[];
1499
+ /** Props for {@link ThemeSwitcher}. */
1500
+ interface ThemeSwitcherProps<T extends string = ColorModePreference> {
1501
+ value: T;
1502
+ onChange: (next: T) => void;
1503
+ /** The rotation, in order. Defaults to {@link COLOR_MODE_OPTIONS}. */
1504
+ options?: readonly ThemeSwitcherOption<T>[];
1505
+ /** What is being switched, leading the accessible name and tooltip
1506
+ * (`Theme: Auto — click for Light`). Defaults to `'Theme'`. */
1507
+ ariaLabel?: string;
1508
+ /** Defaults to `sm`, the size of a header's icon buttons. */
1509
+ size?: ButtonSize;
1510
+ /** Defaults to `ghost`. */
1511
+ variant?: ButtonVariant;
1512
+ className?: string;
1513
+ }
1514
+ /**
1515
+ * One icon button that steps through a list of options: a click moves to the
1516
+ * next, a shift-click to the previous, both wrapping. It shows the current
1517
+ * option's icon, and its name and tooltip say what is current and what a
1518
+ * click chooses. The compact alternative to `ColorModeControl`'s three
1519
+ * segments. Controlled: pair the default color modes with
1520
+ * `useColorModePreference` from `@weasel-js/theme/react`.
1521
+ */
1522
+ declare function ThemeSwitcher<T extends string = ColorModePreference>({ value, onChange, options, ariaLabel, size, variant, className, }: ThemeSwitcherProps<T>): ReactElement;
1523
+
1440
1524
  /**
1441
1525
  * One segment of an {@link OptionsBar}. Unlike `ToggleBar`, each item carries
1442
1526
  * its own selected state and its own `onChange`.
@@ -1547,7 +1631,25 @@ interface PowerlineProps {
1547
1631
  * Built for showing a path through a sequence of steps — the inspector uses
1548
1632
  * it to display how input routes from tool to gesture to action to target.
1549
1633
  */
1550
- declare function Powerline({ segments, startCap, size, variant, depth, gap, className, ...rest }: PowerlineProps): react_jsx_runtime.JSX.Element;
1634
+ declare function Powerline({ segments, startCap, size, variant, depth, gap, className, ...rest }: PowerlineProps): react.JSX.Element;
1635
+
1636
+ /**
1637
+ * The segments {@link GestureRoute} draws for a route string: phase atoms, then
1638
+ * `gesture(arg)`, then the held modifiers as one chord, then the target.
1639
+ * A descriptor's default arg and a wildcard target stay visible, muted, so
1640
+ * the strip shows the whole binding.
1641
+ */
1642
+ declare function gestureRouteSegments(route: string): PowerlineSegment[];
1643
+ /** Props for {@link GestureRoute}. */
1644
+ interface GestureRouteProps extends Omit<PowerlineProps, 'segments'> {
1645
+ /** A route in the dispatcher's grammar, e.g. `[initial] drag => node +shift`. */
1646
+ route: string;
1647
+ }
1648
+ /**
1649
+ * A dispatcher route drawn as a {@link Powerline}: phase, gesture, modifiers
1650
+ * and target as one chevron-linked chain.
1651
+ */
1652
+ declare function GestureRoute({ route, 'aria-label': ariaLabel, ...rest }: GestureRouteProps): react.JSX.Element;
1551
1653
 
1552
1654
  /** Distinguishes a leaf from a group while walking a schema tree. */
1553
1655
  declare function isPrefLeaf(node: ToolPrefLeaf | ToolPrefGroup): node is ToolPrefLeaf;
@@ -1608,7 +1710,7 @@ interface PrefsFormProps {
1608
1710
  * Storage-agnostic: pair with `PrefsDialog` for the modal composition, and
1609
1711
  * persist however the app likes via `onChange`.
1610
1712
  */
1611
- declare function PrefsForm(props: PrefsFormProps): react_jsx_runtime.JSX.Element;
1713
+ declare function PrefsForm(props: PrefsFormProps): react.JSX.Element;
1612
1714
 
1613
1715
  /**
1614
1716
  * Props for {@link PrefsDialog} — everything {@link PrefsForm} takes, plus
@@ -1639,7 +1741,7 @@ interface PrefsDialogProps extends PrefsFormProps {
1639
1741
  * `layout="rail"` is what a dialog usually wants: the default columns wrap
1640
1742
  * sideways past two groups, and this box is 900px at its widest.
1641
1743
  */
1642
- declare function PrefsDialog(props: PrefsDialogProps): react_jsx_runtime.JSX.Element;
1744
+ declare function PrefsDialog(props: PrefsDialogProps): react.JSX.Element;
1643
1745
 
1644
1746
  /** Props for {@link Sidebar}. */
1645
1747
  interface SidebarProps {
@@ -1670,7 +1772,7 @@ interface SidebarProps {
1670
1772
  *
1671
1773
  * Pair with `<SidebarPanel>` for collapsible sections.
1672
1774
  */
1673
- declare function Sidebar(props: SidebarProps): react_jsx_runtime.JSX.Element;
1775
+ declare function Sidebar(props: SidebarProps): react.JSX.Element;
1674
1776
 
1675
1777
  /** Props for {@link SidebarPanel}. */
1676
1778
  interface SidebarPanelProps {
@@ -1689,7 +1791,7 @@ interface SidebarPanelProps {
1689
1791
  */
1690
1792
  onToggleCollapse?(): void;
1691
1793
  /**
1692
- * Optional close handler — when provided, the header gains a `×`
1794
+ * Optional close handler — when provided, the header gains a close
1693
1795
  * button on the trailing edge. Caller flips its "hidden" state and
1694
1796
  * conditionally unmounts the panel from the parent.
1695
1797
  */
@@ -1705,7 +1807,7 @@ interface SidebarPanelProps {
1705
1807
  *
1706
1808
  * Pair with `<Sidebar>` for the docked column layout.
1707
1809
  */
1708
- declare function SidebarPanel(props: SidebarPanelProps): react_jsx_runtime.JSX.Element;
1810
+ declare function SidebarPanel(props: SidebarPanelProps): react.JSX.Element;
1709
1811
 
1710
1812
  /** Props for {@link ToolButton}. */
1711
1813
  interface ToolButtonProps {
@@ -1749,7 +1851,7 @@ interface ToolButtonProps {
1749
1851
  * and similar surfaces. Headless about layout direction (parent group
1750
1852
  * supplies flex direction via `ToolGroup`). Theme via `--wzl-*` tokens.
1751
1853
  */
1752
- declare function ToolButton(props: ToolButtonProps): react_jsx_runtime.JSX.Element;
1854
+ declare function ToolButton(props: ToolButtonProps): react.JSX.Element;
1753
1855
 
1754
1856
  /** Props for {@link ToolGroup}. */
1755
1857
  interface ToolGroupProps {
@@ -1774,7 +1876,7 @@ interface ToolGroupProps {
1774
1876
  * `<ToolButton>`s (or any children) along a chosen axis. No visual chrome
1775
1877
  * beyond layout; theming lives on the buttons.
1776
1878
  */
1777
- declare function ToolGroup(props: ToolGroupProps): react_jsx_runtime.JSX.Element;
1879
+ declare function ToolGroup(props: ToolGroupProps): react.JSX.Element;
1778
1880
 
1779
1881
  /** The full vocabulary of capability tags shipped in the default preset.
1780
1882
  * Apps and other consumers can add their own tags; this list is what
@@ -1801,6 +1903,10 @@ interface WorkspaceVisual {
1801
1903
  * independently undoable and `exit` is non-destructive. A `strict` mode
1802
1904
  * (free-transform, crop) is a transaction: the whole session collapses to one
1803
1905
  * undoable step and leaving requires an explicit `commit` or `cancel`.
1906
+ *
1907
+ * The four shortcut fields are key chords (`'Escape'`, `'Meta+T'`) that
1908
+ * `modeShortcuts` in `@weasel-js/routing` turns into dispatcher bindings,
1909
+ * each live only while the mode it acts on is (or, for `entry`, is not).
1804
1910
  */
1805
1911
  interface ModeDefinition {
1806
1912
  id: string;
@@ -1828,6 +1934,43 @@ interface ModeDefinition {
1828
1934
  cancel?: {
1829
1935
  shortcut?: string;
1830
1936
  };
1937
+ /** Leave a soft mode and throw its session away, where `exit` keeps it to
1938
+ * resume. */
1939
+ discard?: {
1940
+ shortcut?: string;
1941
+ };
1942
+ }
1943
+
1944
+ /** One registrant of a key: its value and, when the registrant named one, where it came from. */
1945
+ interface Registrant<V> {
1946
+ readonly value: V;
1947
+ readonly source: string | undefined;
1948
+ }
1949
+ /** One key as a reflection reports it. */
1950
+ interface ReflectedEntry<V, K = string> extends Registrant<V> {
1951
+ readonly key: K;
1952
+ /** The registrants this one displaced, oldest first. Non-empty means two
1953
+ * registrants claimed one key — a conflict, resolved newest-wins. */
1954
+ readonly shadowed: readonly Registrant<V>[];
1955
+ }
1956
+ /**
1957
+ * The read-only face of a registry: what is registered, what displaced what,
1958
+ * and a way to hear about changes. Every kit registry that embeds a
1959
+ * {@link Reflectable} hands this out, so a debug overlay or a conflict check
1960
+ * can walk any of them the same way.
1961
+ *
1962
+ * `subscribe` and `getVersion` are shaped for `useSyncExternalStore`; so is
1963
+ * `entries`, which returns the same frozen array until the next change.
1964
+ */
1965
+ interface Reflection<V, K = string> {
1966
+ get(key: K): V | undefined;
1967
+ has(key: K): boolean;
1968
+ /** Every key's live registrant, in the order each key was first registered. */
1969
+ entries(): readonly ReflectedEntry<V, K>[];
1970
+ /** Called after every change. Returns the unsubscribe. */
1971
+ subscribe(listener: () => void): () => void;
1972
+ /** Advances on every change. */
1973
+ getVersion(): number;
1831
1974
  }
1832
1975
 
1833
1976
  /** Holds the set of available modes and which one is active, and notifies
@@ -1836,10 +1979,15 @@ interface ModeDefinition {
1836
1979
  * ignored. */
1837
1980
  interface ModeRegistry {
1838
1981
  current(): ModeDefinition;
1982
+ /** Every registered mode, in registration order. */
1983
+ list(): readonly ModeDefinition[];
1839
1984
  setMode(id: string): void;
1840
1985
  byId(id: string): ModeDefinition;
1841
1986
  getVersion(): number;
1842
1987
  subscribe(listener: () => void): () => void;
1988
+ /** The registered modes keyed by id. Shares this registry's version, so it
1989
+ * also advances on `setMode`. */
1990
+ readonly reflection: Reflection<ModeDefinition>;
1843
1991
  }
1844
1992
 
1845
1993
  /** Props for {@link ToolPalette}. */
@@ -1869,12 +2017,13 @@ interface ToolPaletteProps {
1869
2017
  /**
1870
2018
  * Toolbar of the registered tools, split into separator-divided groups by
1871
2019
  * each tool's presentation group and navigable by arrow keys. Clicking a
1872
- * button makes that tool active.
2020
+ * button makes that tool active. A tool whose presentation sets `hide` is
2021
+ * left out.
1873
2022
  *
1874
2023
  * Given a `modeRegistry`, tools whose capabilities the current mode does not
1875
2024
  * allow render greyed out and inert rather than disappearing.
1876
2025
  */
1877
- declare function ToolPalette(props: ToolPaletteProps): react_jsx_runtime.JSX.Element;
2026
+ declare function ToolPalette(props: ToolPaletteProps): react.JSX.Element;
1878
2027
 
1879
2028
  /**
1880
2029
  * Props for {@link Checkbox}, on top of React Aria's `Checkbox` props. The
@@ -1922,27 +2071,27 @@ type TabsProps = Omit<TabsProps$1, 'className' | 'children'> & {
1922
2071
  * Tab set wrapping React Aria's Tabs, skinned against the `--wzl-*` tokens.
1923
2072
  * Holds a {@link TabList} and one {@link TabPanel} per tab.
1924
2073
  */
1925
- declare function Tabs({ children, className, ...rest }: TabsProps): react_jsx_runtime.JSX.Element;
2074
+ declare function Tabs({ children, className, ...rest }: TabsProps): react.JSX.Element;
1926
2075
  /** Props for {@link TabList}, on top of React Aria's `TabList` props. */
1927
2076
  type TabListProps<T extends object> = Omit<TabListProps$1<T>, 'className'> & {
1928
2077
  className?: string;
1929
2078
  };
1930
2079
  /** The row of tab buttons inside a {@link Tabs}. */
1931
- declare function TabList<T extends object>({ className, ...rest }: TabListProps<T>): react_jsx_runtime.JSX.Element;
2080
+ declare function TabList<T extends object>({ className, ...rest }: TabListProps<T>): react.JSX.Element;
1932
2081
  /** Props for {@link Tab}, on top of React Aria's `Tab` props. */
1933
2082
  type TabProps = Omit<TabProps$1, 'className' | 'children'> & {
1934
2083
  children?: ReactNode;
1935
2084
  className?: string;
1936
2085
  };
1937
2086
  /** One tab button. Its `id` selects the {@link TabPanel} it reveals. */
1938
- declare function Tab({ children, className, ...rest }: TabProps): react_jsx_runtime.JSX.Element;
2087
+ declare function Tab({ children, className, ...rest }: TabProps): react.JSX.Element;
1939
2088
  /** Props for {@link TabPanel}, on top of React Aria's `TabPanel` props. */
1940
2089
  type TabPanelProps = Omit<TabPanelProps$1, 'className' | 'children'> & {
1941
2090
  children?: ReactNode;
1942
2091
  className?: string;
1943
2092
  };
1944
2093
  /** The content shown for the {@link Tab} whose `id` matches this panel's. */
1945
- declare function TabPanel({ children, className, ...rest }: TabPanelProps): react_jsx_runtime.JSX.Element;
2094
+ declare function TabPanel({ children, className, ...rest }: TabPanelProps): react.JSX.Element;
1946
2095
 
1947
2096
  /** Props for {@link RadioGroup}, on top of React Aria's `RadioGroup` props. */
1948
2097
  type RadioGroupProps = Omit<RadioGroupProps$1, 'children' | 'className'> & {
@@ -1957,14 +2106,14 @@ type RadioGroupProps = Omit<RadioGroupProps$1, 'children' | 'className'> & {
1957
2106
  * supplying the same label / description / errorMessage slots as `Input`.
1958
2107
  * Holds {@link Radio} children.
1959
2108
  */
1960
- declare function RadioGroup(props: RadioGroupProps): react_jsx_runtime.JSX.Element;
2109
+ declare function RadioGroup(props: RadioGroupProps): react.JSX.Element;
1961
2110
  /** Props for {@link Radio}, on top of React Aria's `Radio` props. */
1962
2111
  type RadioProps = Omit<RadioProps$1, 'className' | 'children'> & {
1963
2112
  children?: ReactNode;
1964
2113
  className?: string;
1965
2114
  };
1966
2115
  /** One choice in a {@link RadioGroup}. The label is passed as children. */
1967
- declare function Radio({ children, className, ...rest }: RadioProps): react_jsx_runtime.JSX.Element;
2116
+ declare function Radio({ children, className, ...rest }: RadioProps): react.JSX.Element;
1968
2117
 
1969
2118
  /** Props for {@link NumberField}, on top of React Aria's `NumberField` props. */
1970
2119
  type NumberFieldProps = Omit<NumberFieldProps$1, 'children' | 'className'> & {
@@ -2056,7 +2205,7 @@ type MenuButtonProps<T extends string = string> = {
2056
2205
  * `shortcut` adds a kit tooltip reading `Name (⌘N)`, named by `aria-label` or
2057
2206
  * a string `label`, as `Button` does; `tooltip` replaces that text.
2058
2207
  */
2059
- declare function MenuButton<T extends string = string>({ label, items, onAction, isDisabled, className, 'aria-label': ariaLabel, portalContainer, shortcut, tooltip, }: MenuButtonProps<T>): react_jsx_runtime.JSX.Element;
2208
+ declare function MenuButton<T extends string = string>({ label, items, onAction, isDisabled, className, 'aria-label': ariaLabel, portalContainer, shortcut, tooltip, }: MenuButtonProps<T>): react.JSX.Element;
2060
2209
 
2061
2210
  /**
2062
2211
  * One option in a {@link ComboBox}'s `options` list. `textValue` is the
@@ -2136,13 +2285,13 @@ type ComboBoxProps<T extends Key$1 = string> = Omit<ComboBoxProps$1<object>, 'ch
2136
2285
  * type to filter; selection commits to `onSelectionChange`. When no value
2137
2286
  * is in the input, selection clears (key becomes null).
2138
2287
  */
2139
- declare function ComboBox<T extends Key$1 = string>(props: ComboBoxProps<T>): react_jsx_runtime.JSX.Element;
2288
+ declare function ComboBox<T extends Key$1 = string>(props: ComboBoxProps<T>): react.JSX.Element;
2140
2289
  /** Props for {@link ComboBoxItem}, on top of React Aria's `ListBoxItem` props. */
2141
2290
  type ComboBoxItemProps = Omit<ListBoxItemProps, 'className'> & {
2142
2291
  className?: string;
2143
2292
  };
2144
2293
  /** One row in a {@link ComboBox}'s filtered list. */
2145
- declare function ComboBoxItem({ className, ...rest }: ComboBoxItemProps): react_jsx_runtime.JSX.Element;
2294
+ declare function ComboBoxItem({ className, ...rest }: ComboBoxItemProps): react.JSX.Element;
2146
2295
 
2147
2296
  /** Props for {@link RangeSlider}, on top of React Aria's `Slider` props. */
2148
2297
  type RangeSliderProps = Omit<SliderProps$1, 'children' | 'className'> & {
@@ -2164,7 +2313,7 @@ type RangeSliderProps = Omit<SliderProps$1, 'children' | 'className'> & {
2164
2313
  * *horizontal* axis here and collapses the track to its content width. Style
2165
2314
  * the wrapper around one, not the root.
2166
2315
  */
2167
- declare function RangeSlider(props: RangeSliderProps): react_jsx_runtime.JSX.Element;
2316
+ declare function RangeSlider(props: RangeSliderProps): react.JSX.Element;
2168
2317
 
2169
2318
  /** Props for {@link Dialog}, on top of React Aria's `ModalOverlay` props. */
2170
2319
  type DialogProps = Omit<WithoutPortalTarget<ModalOverlayProps>, 'children' | 'className'> & OverlayPortalProps & StanceProps & {
@@ -2197,7 +2346,7 @@ type DialogProps = Omit<WithoutPortalTarget<ModalOverlayProps>, 'children' | 'cl
2197
2346
  * underlying primitives. `stance` and `tone` work as on `<PropertyPanel>` —
2198
2347
  * a destructive confirm is `stance="danger"`.
2199
2348
  */
2200
- declare function Dialog(props: DialogProps): react_jsx_runtime.JSX.Element;
2349
+ declare function Dialog(props: DialogProps): react.JSX.Element;
2201
2350
 
2202
2351
  /** Props for {@link Callout}, on top of React Aria's `Popover` props. */
2203
2352
  type CalloutProps = Omit<WithoutPortalTarget<PopoverProps>, 'children' | 'className' | 'isNonModal' | 'triggerRef'> & OverlayPortalProps & StanceProps & {
@@ -2214,14 +2363,14 @@ type CalloutProps = Omit<WithoutPortalTarget<PopoverProps>, 'children' | 'classN
2214
2363
  */
2215
2364
  modal?: boolean;
2216
2365
  /**
2217
- * Show the × button. Defaults to `!modal`. In programmatic
2366
+ * Show the close button. Defaults to `!modal`. In programmatic
2218
2367
  * `triggerRef`/`anchorRect` modes the close button needs controlled open
2219
2368
  * (`isOpen` + `onOpenChange`); with only `defaultOpen` it has no open-state
2220
2369
  * setter to call and cannot close.
2221
2370
  */
2222
2371
  showCloseButton?: boolean;
2223
2372
  /**
2224
- * The user asked for this callout to go away — the × button or Escape.
2373
+ * The user asked for this callout to go away — the close button or Escape.
2225
2374
  *
2226
2375
  * Distinct from `onOpenChange`, which a non-modal popover *also* fires when
2227
2376
  * interaction or focus merely leaves it. On a canvas that's every click on
@@ -2251,7 +2400,7 @@ type CalloutProps = Omit<WithoutPortalTarget<PopoverProps>, 'children' | 'classN
2251
2400
  * Wraps React Aria Popover + Dialog; positioning, collision flipping,
2252
2401
  * dismissal, and focus behavior come from the underlying primitives.
2253
2402
  */
2254
- declare function Callout(props: CalloutProps): react_jsx_runtime.JSX.Element;
2403
+ declare function Callout(props: CalloutProps): react.JSX.Element;
2255
2404
 
2256
2405
  /**
2257
2406
  * Coordinate transforms (model ↔ plot) for Plot2D. Pure / deterministic —
@@ -2260,7 +2409,7 @@ declare function Callout(props: CalloutProps): react_jsx_runtime.JSX.Element;
2260
2409
  * Model space: caller-defined xRange × yRange. Y axis goes UP.
2261
2410
  * Plot space: 0..width × 0..height in CSS pixels. Y axis goes DOWN (SVG).
2262
2411
  */
2263
- interface Point {
2412
+ interface Point$1 {
2264
2413
  x: number;
2265
2414
  y: number;
2266
2415
  }
@@ -2321,8 +2470,8 @@ interface TickSettings {
2321
2470
  }
2322
2471
  /** A pointer position given in both of the plot's coordinate systems. */
2323
2472
  interface Plot2DCoords {
2324
- plot: Point;
2325
- model: Point;
2473
+ plot: Point$1;
2474
+ model: Point$1;
2326
2475
  }
2327
2476
  /** Props for {@link Plot2D}. */
2328
2477
  interface Plot2DProps {
@@ -2363,19 +2512,19 @@ interface Plot2DProps {
2363
2512
  */
2364
2513
  interface Plot2DHandle {
2365
2514
  readonly svg: SVGSVGElement | null;
2366
- plotToModel(pt: Point): Point;
2367
- modelToPlot(pt: Point): Point;
2515
+ plotToModel(pt: Point$1): Point$1;
2516
+ modelToPlot(pt: Point$1): Point$1;
2368
2517
  /** Convert a DOM event's clientX/clientY (e.g. from a window-attached
2369
2518
  * pointermove during drag) to plot-space. */
2370
2519
  clientToPlot(e: {
2371
2520
  clientX: number;
2372
2521
  clientY: number;
2373
- }): Point;
2522
+ }): Point$1;
2374
2523
  /** Convenience: clientToPlot → plotToModel. */
2375
2524
  clientToModel(e: {
2376
2525
  clientX: number;
2377
2526
  clientY: number;
2378
- }): Point;
2527
+ }): Point$1;
2379
2528
  readonly width: number;
2380
2529
  readonly height: number;
2381
2530
  }
@@ -2386,6 +2535,22 @@ interface Plot2DHandle {
2386
2535
  */
2387
2536
  declare const Plot2D: react.ForwardRefExoticComponent<Plot2DProps & react.RefAttributes<Plot2DHandle>>;
2388
2537
 
2538
+ /**
2539
+ * Catmull-Rom spline sampling, parameterized by α.
2540
+ *
2541
+ * α = 0 → uniform parameterization (original Catmull-Rom). Fast, can
2542
+ * produce cusps and self-intersections at sharp 2D angles.
2543
+ * α = 0.5 → centripetal (Yuksel/Schneider 2011). No cusps, no
2544
+ * self-intersection. The "safe default" for 2D.
2545
+ * α = 1 → chordal. Smoother than uniform, different artifacts.
2546
+ *
2547
+ * `sampleCurve(...)` is the convenience alias for centripetal (α=0.5).
2548
+ */
2549
+ interface Point {
2550
+ x: number;
2551
+ y: number;
2552
+ }
2553
+
2389
2554
  /**
2390
2555
  * Interpolation mode dispatcher for CurveEditor. The vocabulary of
2391
2556
  * supported algorithms and the unified `sample(...)` entry point that
@@ -2398,6 +2563,8 @@ declare const Plot2D: react.ForwardRefExoticComponent<Plot2DProps & react.RefAtt
2398
2563
  * every anchor); the differences are in tangent computation and
2399
2564
  * parameterization. */
2400
2565
  type InterpolationMode = 'linear' | 'catmull-rom' | 'catmull-rom-uniform' | 'catmull-rom-chordal' | 'monotone';
2566
+ /** Sample `anchors` using the chosen interpolation mode. */
2567
+ declare function sampleByInterpolation(anchors: readonly Point[], samplesPerSegment: number, mode: InterpolationMode): Point[];
2401
2568
 
2402
2569
  /**
2403
2570
  * Built-in function/curve layer for LayeredCurveEditor. Bundles the
@@ -2498,7 +2665,7 @@ interface CurveEditorProps {
2498
2665
  * a `LayeredCurveEditor`. Reach for those directly to stack several curves
2499
2666
  * on one plot.
2500
2667
  */
2501
- declare function CurveEditor(props: CurveEditorProps): react_jsx_runtime.JSX.Element;
2668
+ declare function CurveEditor(props: CurveEditorProps): react.JSX.Element;
2502
2669
 
2503
2670
  /** Props for {@link PointPlotter}. */
2504
2671
  interface PointPlotterProps {
@@ -2549,13 +2716,16 @@ interface PointPlotterProps {
2549
2716
  * `'click-empty'` (CurveEditor defaults to `'click-curve'`, which
2550
2717
  * doesn't make sense without a curve to hit-test against).
2551
2718
  */
2552
- declare function PointPlotter(props: PointPlotterProps): react_jsx_runtime.JSX.Element;
2719
+ declare function PointPlotter(props: PointPlotterProps): react.JSX.Element;
2553
2720
 
2554
2721
  /**
2555
2722
  * Options for {@link paintGradientTrack}.
2556
2723
  *
2557
- * `gradient` maps a normalized position along the track (0 to 1) to a CSS
2558
- * color; `samples` is how many stops the resulting linear-gradient uses.
2724
+ * `gradient` maps a normalized position along the slider's value span (0 to
2725
+ * 1) to a CSS color; `samples` is how many stops the resulting
2726
+ * linear-gradient uses. The ramp is laid on the same span as the thumbs, so a
2727
+ * thumb at 0.3 sits over `gradient(0.3)`; any track beyond the span takes the
2728
+ * end colors.
2559
2729
  * `activeRange`, given in the slider's own value units, keeps that span at
2560
2730
  * full strength and dims + hatches the rest.
2561
2731
  */
@@ -2697,5 +2867,5 @@ type RovingTabIndex<T extends HTMLElement = HTMLDivElement> = {
2697
2867
  */
2698
2868
  declare function useRovingTabIndex<T extends HTMLElement = HTMLDivElement>(options: UseRovingTabIndexOptions): RovingTabIndex<T>;
2699
2869
 
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, Plot2D, PointPlotter, Powerline, PrefRenderer, PrefsDialog, PrefsForm, Radio, RadioGroup, RangeSlider, Sidebar, SidebarPanel, Slider, Switch, Tab, TabList, TabPanel, Tabs, ToggleBarSize, ToggleBarVariant, ToolButton, ToolGroup, ToolPalette, 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 };
2870
+ export { ActionBar, Badge, ButtonBar, ButtonSize, ButtonVariant, COLOR_MODE_OPTIONS, Callout, Checkbox, CloseButton, ColorModeControl, ComboBox, ComboBoxItem, CurveEditor, DataGrid, Dialog, Disclosure, DisclosureMark, DisclosureRow, DragGhost, DragGrip, EDGE_PROFILES, FieldOrientation, GestureRoute, 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, ThemeSwitcher, ToggleBarSize, ToggleBarVariant, ToolButton, ToolGroup, ToolPalette, WithoutPortalTarget, chromaAt, detectPlatform, dlog, formatShortcut, formatShortcutParts, gestureRouteSegments, inferKeycapKind, isDebugEnabled, isPrefLeaf, keyGlyph, keySpecFromKey, keySpecsFromMods, keySpecsFromShortcut, oklchToHex, paintGradientTrack, prefValueAtPath, sampleByInterpolation, useAsyncOptions, useReorderDragList, useRovingTabIndex, visiblePrefSubtree };
2871
+ export type { ActionBarProps, AddPointMode, AnchorRenderProps, AsyncOption, AsyncOptionsResult, AxesSettings, BadgeProps, BadgeShape, BadgeSize, BadgeStatus, BadgeVariant, BoundsCtx, BuiltInEdgeName, BuiltInProfileName, ButtonBarItem, ButtonBarProps, ButtonBarSize, ButtonBarVariant, CalloutProps, CheckboxProps, ChromaCurve, ChromaCurvePoint, CloseButtonProps, ColorModeControlProps, ComboBoxCommit, ComboBoxFilter, ComboBoxItemProps, ComboBoxOption, ComboBoxProps, ControlPoint, CurveDomain, CurveEditorProps, DataGridColumn, DataGridProps, DialogProps, DisclosureMarkProps, DisclosureProps, DisclosureRowProps, DragGhostProps, DragGripProps, EdgeCap, EdgeProfile, EndpointMode, FillSettings, GestureRouteProps, GradientTrackOpts, GridSettings, InterpolationMode, KeyCapProps, KeyCapVariant, KeySequenceJoins, 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, ThemeSwitcherOption, ThemeSwitcherProps, Thumb, ThumbRenderCtx, ThumbShape, ToolButtonProps, ToolGroupProps, ToolPaletteProps, TrackCtx, UseAsyncOptionsProps, UseReorderDragListOptions, UseRovingTabIndexOptions };