@cssints/apg-specs 0.0.0-stage → 0.5.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 (260) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +65 -2
  3. package/dist/apg/accordion.bridge.d.mts +35 -0
  4. package/dist/apg/accordion.bridge.mjs +326 -0
  5. package/dist/apg/accordion.model.json +8397 -0
  6. package/dist/apg/alert.bridge.d.mts +22 -0
  7. package/dist/apg/alert.bridge.mjs +86 -0
  8. package/dist/apg/alert.model.json +871 -0
  9. package/dist/apg/alertdialog.bridge.d.mts +21 -0
  10. package/dist/apg/alertdialog.bridge.mjs +221 -0
  11. package/dist/apg/alertdialog.model.json +5232 -0
  12. package/dist/apg/breadcrumb.bridge.d.mts +26 -0
  13. package/dist/apg/breadcrumb.bridge.mjs +120 -0
  14. package/dist/apg/breadcrumb.model.json +574 -0
  15. package/dist/apg/button.bridge.d.mts +35 -0
  16. package/dist/apg/button.bridge.mjs +208 -0
  17. package/dist/apg/button.model.json +5814 -0
  18. package/dist/apg/carousel.bridge.d.mts +44 -0
  19. package/dist/apg/carousel.bridge.mjs +262 -0
  20. package/dist/apg/carousel.model.json +8963 -0
  21. package/dist/apg/checkbox-group.bridge.d.mts +25 -0
  22. package/dist/apg/checkbox-group.bridge.mjs +276 -0
  23. package/dist/apg/checkbox-group.model.json +3863 -0
  24. package/dist/apg/checkbox.bridge.d.mts +34 -0
  25. package/dist/apg/checkbox.bridge.mjs +253 -0
  26. package/dist/apg/checkbox.model.json +3158 -0
  27. package/dist/apg/combobox-autocomplete.bridge.d.mts +14 -0
  28. package/dist/apg/combobox-autocomplete.bridge.mjs +326 -0
  29. package/dist/apg/combobox-autocomplete.model.json +11586 -0
  30. package/dist/apg/combobox-dialog.bridge.d.mts +17 -0
  31. package/dist/apg/combobox-dialog.bridge.mjs +250 -0
  32. package/dist/apg/combobox-dialog.model.json +8981 -0
  33. package/dist/apg/combobox-grid.bridge.d.mts +17 -0
  34. package/dist/apg/combobox-grid.bridge.mjs +227 -0
  35. package/dist/apg/combobox-grid.model.json +8554 -0
  36. package/dist/apg/combobox-select-only.bridge.d.mts +24 -0
  37. package/dist/apg/combobox-select-only.bridge.mjs +304 -0
  38. package/dist/apg/combobox-select-only.model.json +7846 -0
  39. package/dist/apg/combobox-tree.bridge.d.mts +17 -0
  40. package/dist/apg/combobox-tree.bridge.mjs +211 -0
  41. package/dist/apg/combobox-tree.model.json +9345 -0
  42. package/dist/apg/dialog-modal.bridge.d.mts +35 -0
  43. package/dist/apg/dialog-modal.bridge.mjs +186 -0
  44. package/dist/apg/dialog-modal.model.json +7580 -0
  45. package/dist/apg/disclosure.bridge.d.mts +25 -0
  46. package/dist/apg/disclosure.bridge.mjs +202 -0
  47. package/dist/apg/disclosure.model.json +4703 -0
  48. package/dist/apg/feed.bridge.d.mts +31 -0
  49. package/dist/apg/feed.bridge.mjs +246 -0
  50. package/dist/apg/feed.model.json +4523 -0
  51. package/dist/apg/grid-selection.bridge.d.mts +13 -0
  52. package/dist/apg/grid-selection.bridge.mjs +160 -0
  53. package/dist/apg/grid-selection.model.json +6974 -0
  54. package/dist/apg/grid-sort.bridge.d.mts +12 -0
  55. package/dist/apg/grid-sort.bridge.mjs +138 -0
  56. package/dist/apg/grid-sort.model.json +3799 -0
  57. package/dist/apg/grid.bridge.d.mts +54 -0
  58. package/dist/apg/grid.bridge.mjs +441 -0
  59. package/dist/apg/grid.model.json +3802 -0
  60. package/dist/apg/link.bridge.d.mts +24 -0
  61. package/dist/apg/link.bridge.mjs +126 -0
  62. package/dist/apg/link.model.json +694 -0
  63. package/dist/apg/listbox-multi.bridge.d.mts +10 -0
  64. package/dist/apg/listbox-multi.bridge.mjs +261 -0
  65. package/dist/apg/listbox-multi.model.json +10893 -0
  66. package/dist/apg/listbox-rearrangeable.bridge.d.mts +20 -0
  67. package/dist/apg/listbox-rearrangeable.bridge.mjs +237 -0
  68. package/dist/apg/listbox-rearrangeable.model.json +17592 -0
  69. package/dist/apg/listbox-shared.d.mts +58 -0
  70. package/dist/apg/listbox-shared.mjs +171 -0
  71. package/dist/apg/listbox-single.bridge.d.mts +10 -0
  72. package/dist/apg/listbox-single.bridge.mjs +196 -0
  73. package/dist/apg/listbox-single.model.json +8024 -0
  74. package/dist/apg/listbox-typeahead.bridge.d.mts +10 -0
  75. package/dist/apg/listbox-typeahead.bridge.mjs +153 -0
  76. package/dist/apg/listbox-typeahead.model.json +5615 -0
  77. package/dist/apg/menu-button.bridge.d.mts +29 -0
  78. package/dist/apg/menu-button.bridge.mjs +259 -0
  79. package/dist/apg/menu-button.model.json +5706 -0
  80. package/dist/apg/menu-checkable.bridge.d.mts +25 -0
  81. package/dist/apg/menu-checkable.bridge.mjs +226 -0
  82. package/dist/apg/menu-checkable.model.json +4277 -0
  83. package/dist/apg/menu-menubar.bridge.d.mts +27 -0
  84. package/dist/apg/menu-menubar.bridge.mjs +273 -0
  85. package/dist/apg/menu-menubar.model.json +9540 -0
  86. package/dist/apg/meter.bridge.d.mts +28 -0
  87. package/dist/apg/meter.bridge.mjs +159 -0
  88. package/dist/apg/meter.model.json +1185 -0
  89. package/dist/apg/player.bridge.d.mts +24 -0
  90. package/dist/apg/player.bridge.mjs +342 -0
  91. package/dist/apg/player.model.json +11013 -0
  92. package/dist/apg/radio.bridge.d.mts +35 -0
  93. package/dist/apg/radio.bridge.mjs +371 -0
  94. package/dist/apg/radio.model.json +5011 -0
  95. package/dist/apg/slider-multithumb.bridge.d.mts +34 -0
  96. package/dist/apg/slider-multithumb.bridge.mjs +365 -0
  97. package/dist/apg/slider-multithumb.model.json +5774 -0
  98. package/dist/apg/slider.bridge.d.mts +54 -0
  99. package/dist/apg/slider.bridge.mjs +359 -0
  100. package/dist/apg/slider.model.json +4881 -0
  101. package/dist/apg/spinbutton.bridge.d.mts +41 -0
  102. package/dist/apg/spinbutton.bridge.mjs +327 -0
  103. package/dist/apg/spinbutton.model.json +7571 -0
  104. package/dist/apg/switch.bridge.d.mts +30 -0
  105. package/dist/apg/switch.bridge.mjs +243 -0
  106. package/dist/apg/switch.model.json +3159 -0
  107. package/dist/apg/tabs.bridge.d.mts +41 -0
  108. package/dist/apg/tabs.bridge.mjs +294 -0
  109. package/dist/apg/tabs.model.json +7659 -0
  110. package/dist/apg/timeline.bridge.d.mts +36 -0
  111. package/dist/apg/timeline.bridge.mjs +265 -0
  112. package/dist/apg/timeline.model.json +6189 -0
  113. package/dist/apg/toolbar.bridge.d.mts +25 -0
  114. package/dist/apg/toolbar.bridge.mjs +307 -0
  115. package/dist/apg/toolbar.model.json +6616 -0
  116. package/dist/apg/tooltip.bridge.d.mts +36 -0
  117. package/dist/apg/tooltip.bridge.mjs +208 -0
  118. package/dist/apg/tooltip.model.json +8295 -0
  119. package/dist/apg/treegrid.bridge.d.mts +28 -0
  120. package/dist/apg/treegrid.bridge.mjs +311 -0
  121. package/dist/apg/treegrid.model.json +17358 -0
  122. package/dist/apg/treeview.bridge.d.mts +26 -0
  123. package/dist/apg/treeview.bridge.mjs +396 -0
  124. package/dist/apg/treeview.model.json +13745 -0
  125. package/dist/apg/windowsplitter.bridge.d.mts +36 -0
  126. package/dist/apg/windowsplitter.bridge.mjs +242 -0
  127. package/dist/apg/windowsplitter.model.json +6253 -0
  128. package/dist/canvas/camera.model.json +6568 -0
  129. package/dist/canvas/canvas.bridge.d.mts +190 -0
  130. package/dist/canvas/canvas.bridge.mjs +729 -0
  131. package/dist/canvas/pointer.model.json +17095 -0
  132. package/dist/scenario.d.mts +233 -0
  133. package/dist/scenario.mjs +313 -0
  134. package/package.json +57 -4
  135. package/scenarios/apg/README.md +221 -0
  136. package/scenarios/apg/accordion.base-ui.json +1005 -0
  137. package/scenarios/apg/accordion.react-aria.json +929 -0
  138. package/scenarios/apg/alert.base-ui.json +81 -0
  139. package/scenarios/apg/alert.react-aria.json +98 -0
  140. package/scenarios/apg/alertdialog.base-ui.json +331 -0
  141. package/scenarios/apg/alertdialog.react-aria.json +225 -0
  142. package/scenarios/apg/breadcrumb.react-aria.json +312 -0
  143. package/scenarios/apg/button.ariakit.json +136 -0
  144. package/scenarios/apg/button.base-ui.json +747 -0
  145. package/scenarios/apg/button.react-aria.json +443 -0
  146. package/scenarios/apg/carousel.apg.json +909 -0
  147. package/scenarios/apg/checkbox.ariakit.json +299 -0
  148. package/scenarios/apg/checkbox.base-ui.json +1126 -0
  149. package/scenarios/apg/checkbox.react-aria.json +518 -0
  150. package/scenarios/apg/combobox.ariakit.json +945 -0
  151. package/scenarios/apg/combobox.base-ui.json +2444 -0
  152. package/scenarios/apg/combobox.react-aria.json +845 -0
  153. package/scenarios/apg/dialog-modal.ariakit.json +1102 -0
  154. package/scenarios/apg/dialog-modal.base-ui.json +775 -0
  155. package/scenarios/apg/dialog-modal.react-aria.json +638 -0
  156. package/scenarios/apg/disclosure.apg.json +349 -0
  157. package/scenarios/apg/disclosure.ariakit.json +163 -0
  158. package/scenarios/apg/disclosure.base-ui.json +451 -0
  159. package/scenarios/apg/disclosure.react-aria.json +643 -0
  160. package/scenarios/apg/feed.apg.json +442 -0
  161. package/scenarios/apg/grid.ariakit.json +197 -0
  162. package/scenarios/apg/grid.base-ui.json +720 -0
  163. package/scenarios/apg/grid.react-aria.json +969 -0
  164. package/scenarios/apg/landmarks.ariakit.json +93 -0
  165. package/scenarios/apg/landmarks.react-aria.json +330 -0
  166. package/scenarios/apg/link.ariakit.json +83 -0
  167. package/scenarios/apg/link.base-ui.json +88 -0
  168. package/scenarios/apg/link.react-aria.json +186 -0
  169. package/scenarios/apg/listbox.ariakit.json +78 -0
  170. package/scenarios/apg/listbox.base-ui.json +163 -0
  171. package/scenarios/apg/listbox.react-aria.json +1118 -0
  172. package/scenarios/apg/menu-button.ariakit.json +924 -0
  173. package/scenarios/apg/menu-button.base-ui.json +1155 -0
  174. package/scenarios/apg/menu-button.react-aria.json +1080 -0
  175. package/scenarios/apg/menubar.ariakit.json +758 -0
  176. package/scenarios/apg/menubar.base-ui.json +673 -0
  177. package/scenarios/apg/meter.base-ui.json +243 -0
  178. package/scenarios/apg/meter.react-aria.json +201 -0
  179. package/scenarios/apg/radio.ariakit.json +459 -0
  180. package/scenarios/apg/radio.base-ui.json +581 -0
  181. package/scenarios/apg/radio.react-aria.json +576 -0
  182. package/scenarios/apg/slider-multithumb.base-ui.json +316 -0
  183. package/scenarios/apg/slider-multithumb.react-aria.json +363 -0
  184. package/scenarios/apg/slider.base-ui.json +544 -0
  185. package/scenarios/apg/slider.react-aria.json +456 -0
  186. package/scenarios/apg/spinbutton.base-ui.json +1688 -0
  187. package/scenarios/apg/spinbutton.react-aria.json +426 -0
  188. package/scenarios/apg/switch.base-ui.json +456 -0
  189. package/scenarios/apg/switch.react-aria.json +303 -0
  190. package/scenarios/apg/table.ariakit.json +65 -0
  191. package/scenarios/apg/table.react-aria.json +221 -0
  192. package/scenarios/apg/tabs.ariakit.json +329 -0
  193. package/scenarios/apg/tabs.base-ui.json +875 -0
  194. package/scenarios/apg/tabs.react-aria.json +644 -0
  195. package/scenarios/apg/toolbar.ariakit.json +595 -0
  196. package/scenarios/apg/toolbar.base-ui.json +1189 -0
  197. package/scenarios/apg/toolbar.react-aria.json +383 -0
  198. package/scenarios/apg/tooltip.ariakit.json +441 -0
  199. package/scenarios/apg/tooltip.base-ui.json +411 -0
  200. package/scenarios/apg/tooltip.react-aria.json +454 -0
  201. package/scenarios/apg/treegrid.apg.json +2558 -0
  202. package/scenarios/apg/treegrid.react-aria.json +5094 -0
  203. package/scenarios/apg/treeview.apg.json +928 -0
  204. package/scenarios/apg/windowsplitter.apg.json +557 -0
  205. package/scenarios/canvas/README.md +69 -0
  206. package/scenarios/canvas/camera.contract.json +237 -0
  207. package/scenarios/canvas/camera.excalidraw.json +57 -0
  208. package/scenarios/canvas/marquee.excalidraw.json +122 -0
  209. package/scenarios/canvas/pan.excalidraw.json +46 -0
  210. package/scenarios/canvas/pointer.contract.json +528 -0
  211. package/scenarios/parts.json +291 -0
  212. package/shared/aria.qnt +186 -0
  213. package/shared/details-group.qnt +50 -0
  214. package/shared/focusgroup.qnt +152 -0
  215. package/shared/invokers.qnt +81 -0
  216. package/shared/popover.qnt +71 -0
  217. package/specs/apg/STATIC.md +103 -0
  218. package/specs/apg/accordion.qnt +578 -0
  219. package/specs/apg/alert.qnt +131 -0
  220. package/specs/apg/alertdialog.qnt +455 -0
  221. package/specs/apg/breadcrumb.qnt +88 -0
  222. package/specs/apg/button.qnt +445 -0
  223. package/specs/apg/carousel.qnt +732 -0
  224. package/specs/apg/checkbox-group.qnt +388 -0
  225. package/specs/apg/checkbox.qnt +394 -0
  226. package/specs/apg/combobox-autocomplete.qnt +764 -0
  227. package/specs/apg/combobox-dialog.qnt +627 -0
  228. package/specs/apg/combobox-grid.qnt +632 -0
  229. package/specs/apg/combobox-select-only.qnt +626 -0
  230. package/specs/apg/combobox-tree.qnt +633 -0
  231. package/specs/apg/dialog-modal.qnt +499 -0
  232. package/specs/apg/disclosure.qnt +309 -0
  233. package/specs/apg/feed.qnt +485 -0
  234. package/specs/apg/grid-selection.qnt +512 -0
  235. package/specs/apg/grid-sort.qnt +330 -0
  236. package/specs/apg/grid.qnt +360 -0
  237. package/specs/apg/link.qnt +119 -0
  238. package/specs/apg/listbox-multi.qnt +799 -0
  239. package/specs/apg/listbox-rearrangeable.qnt +801 -0
  240. package/specs/apg/listbox-single.qnt +511 -0
  241. package/specs/apg/listbox-typeahead.qnt +396 -0
  242. package/specs/apg/menu-button.qnt +363 -0
  243. package/specs/apg/menu-checkable.qnt +304 -0
  244. package/specs/apg/menu-menubar.qnt +531 -0
  245. package/specs/apg/meter.qnt +129 -0
  246. package/specs/apg/player.qnt +1081 -0
  247. package/specs/apg/radio.qnt +394 -0
  248. package/specs/apg/slider-multithumb.qnt +441 -0
  249. package/specs/apg/slider.qnt +396 -0
  250. package/specs/apg/spinbutton.qnt +494 -0
  251. package/specs/apg/switch.qnt +389 -0
  252. package/specs/apg/tabs.qnt +412 -0
  253. package/specs/apg/timeline.qnt +612 -0
  254. package/specs/apg/toolbar.qnt +364 -0
  255. package/specs/apg/tooltip.qnt +553 -0
  256. package/specs/apg/treegrid.qnt +983 -0
  257. package/specs/apg/treeview.qnt +1004 -0
  258. package/specs/apg/windowsplitter.qnt +487 -0
  259. package/specs/canvas/camera.qnt +407 -0
  260. package/specs/canvas/pointer.qnt +841 -0
@@ -0,0 +1,34 @@
1
+ import { ActionStep, Probe, ScenarioConfig, SpecBridge } from "../scenario.mjs";
2
+ //#region src/apg/slider-multithumb.bridge.d.ts
3
+ /**
4
+ * Multi-thumb slider vocabulary <-> `specs/apg/slider-multithumb.qnt`, shared by
5
+ * the spec driver and the DOM driver.
6
+ *
7
+ * Parts: `thumb:0` (lo) and `thumb:1` (hi), plus `track` (the spec's `rail`).
8
+ * The spec fixes two thumbs over range 0..10, step 1, large step 3, initial
9
+ * values [3, 7], and each thumb is bounded by its neighbour. Any config that
10
+ * changes the range, step or values is `Unsupported`; `orientation` and `dir`
11
+ * map to `setOrientation` / `setDir`.
12
+ *
13
+ * Its `tab` / `shiftTab` actions are reachable only through native focus
14
+ * movement (or Shift+Tab, which the replay driver does not model), so `Tab`
15
+ * steps are gated `Unsupported`; the walk moves focus with explicit focus steps.
16
+ */
17
+ export interface SliderMultithumbConfig {
18
+ readonly values: readonly [number, number];
19
+ readonly min: number;
20
+ readonly max: number;
21
+ readonly step: number;
22
+ readonly largeStep: number;
23
+ readonly orientation: "horizontal" | "vertical";
24
+ readonly dir: "ltr" | "rtl";
25
+ readonly controlled: boolean;
26
+ readonly accepts: boolean;
27
+ }
28
+ /** Scenario `config` -> what both targets are mounted with. */
29
+ export declare const sliderMultithumbConfig: (config: ScenarioConfig) => SliderMultithumbConfig;
30
+ export declare const sliderMultithumbBridge: SpecBridge;
31
+ /** The user-level steps a differential walk draws from. */
32
+ export declare const sliderMultithumbSteps: ReadonlyArray<ActionStep>;
33
+ export declare const sliderMultithumbProbe: Probe;
34
+ //#endregion
@@ -0,0 +1,365 @@
1
+ import { Unsupported } from "../scenario.mjs";
2
+ //#region src/apg/slider-multithumb.bridge.ts
3
+ const specEvent = (tag, params = {}) => ({
4
+ _tag: tag,
5
+ ...params
6
+ });
7
+ const DEFAULT_MIN = 0;
8
+ const DEFAULT_MAX = 10;
9
+ const DEFAULT_STEP = 1;
10
+ const DEFAULT_LARGE_STEP = 3;
11
+ const INITIAL_VALUES = [3, 7];
12
+ /** The packed pair values the spec's `setValue` pool carries. */
13
+ const VALUE_POOL = /* @__PURE__ */ new Set([
14
+ 0,
15
+ 10,
16
+ 27,
17
+ 40,
18
+ 60,
19
+ 120
20
+ ]);
21
+ const packedPair = (lo, hi) => lo * 11 + hi;
22
+ const numberEquals = (key, value, expected) => {
23
+ if (typeof value !== "number" || value !== expected) throw new Unsupported(`config ${key}=${JSON.stringify(value)}`);
24
+ };
25
+ /** Scenario `config` -> what both targets are mounted with. */
26
+ const sliderMultithumbConfig = (config) => {
27
+ let values = INITIAL_VALUES;
28
+ let min = DEFAULT_MIN;
29
+ let max = DEFAULT_MAX;
30
+ let step = DEFAULT_STEP;
31
+ let largeStep = DEFAULT_LARGE_STEP;
32
+ let orientation = "horizontal";
33
+ let dir = "ltr";
34
+ let controlled = false;
35
+ let accepts = true;
36
+ for (const [key, raw] of Object.entries(config)) switch (key) {
37
+ case "thumbs":
38
+ numberEquals(key, raw, 2);
39
+ break;
40
+ case "controlled":
41
+ if (typeof raw !== "boolean") throw new Unsupported(`config controlled=${JSON.stringify(raw)}`);
42
+ controlled = raw;
43
+ break;
44
+ case "accepts":
45
+ if (typeof raw !== "boolean") throw new Unsupported(`config accepts=${JSON.stringify(raw)}`);
46
+ controlled = true;
47
+ accepts = raw;
48
+ break;
49
+ case "values": {
50
+ const parsed = Array.isArray(raw) ? raw : null;
51
+ if (parsed === null || parsed.length !== 2 || parsed[0] !== INITIAL_VALUES[0] || parsed[1] !== INITIAL_VALUES[1]) throw new Unsupported(`config values=${JSON.stringify(raw)}`);
52
+ values = INITIAL_VALUES;
53
+ break;
54
+ }
55
+ case "min":
56
+ numberEquals(key, raw, DEFAULT_MIN);
57
+ min = DEFAULT_MIN;
58
+ break;
59
+ case "max":
60
+ numberEquals(key, raw, DEFAULT_MAX);
61
+ max = DEFAULT_MAX;
62
+ break;
63
+ case "step":
64
+ numberEquals(key, raw, DEFAULT_STEP);
65
+ step = DEFAULT_STEP;
66
+ break;
67
+ case "largeStep":
68
+ numberEquals(key, raw, DEFAULT_LARGE_STEP);
69
+ largeStep = DEFAULT_LARGE_STEP;
70
+ break;
71
+ case "orientation":
72
+ if (raw !== "horizontal" && raw !== "vertical") throw new Unsupported(`config orientation=${JSON.stringify(raw)}`);
73
+ orientation = raw;
74
+ break;
75
+ case "dir":
76
+ if (raw !== "ltr" && raw !== "rtl") throw new Unsupported(`config dir=${JSON.stringify(raw)}`);
77
+ dir = raw;
78
+ break;
79
+ default: throw new Unsupported(`config ${key}=${JSON.stringify(raw)}`);
80
+ }
81
+ return {
82
+ values,
83
+ min,
84
+ max,
85
+ step,
86
+ largeStep,
87
+ orientation,
88
+ dir,
89
+ controlled,
90
+ accepts
91
+ };
92
+ };
93
+ /** `thumb:0` / `thumb:1` (both spellings of `thumb` default to lo). */
94
+ const thumbOf = (target) => {
95
+ const clean = target ?? "thumb";
96
+ const base = clean.replace(/:\d+$/, "");
97
+ if (base !== "thumb") throw new Unsupported(`part ${base}`);
98
+ switch (clean.includes(":") ? clean.slice(clean.lastIndexOf(":") + 1) : "0") {
99
+ case "0": return "lo";
100
+ case "1": return "hi";
101
+ default: throw new Unsupported(`part ${clean}`);
102
+ }
103
+ };
104
+ const KEY_POOL = /* @__PURE__ */ new Set([
105
+ "ArrowRight",
106
+ "ArrowLeft",
107
+ "ArrowUp",
108
+ "ArrowDown",
109
+ "Home",
110
+ "End",
111
+ "PageUp",
112
+ "PageDown",
113
+ "Enter"
114
+ ]);
115
+ /** The raw rail-press values the spec's pointer actions draw from. */
116
+ const POINTER_POOL = /* @__PURE__ */ new Set([
117
+ -3,
118
+ 0,
119
+ 4,
120
+ 7,
121
+ 10,
122
+ 14
123
+ ]);
124
+ const valueTextFor = (value) => value <= 3 ? "low" : value <= 7 ? "medium" : "high";
125
+ const pointerRaw = (value) => {
126
+ if (typeof value !== "number") throw new Unsupported(`prop pointer=${JSON.stringify(value)}`);
127
+ const raw = Math.round(value * 10) + DEFAULT_MIN;
128
+ if (!POINTER_POOL.has(raw)) throw new Unsupported(`pointer position ${value}`);
129
+ return BigInt(raw);
130
+ };
131
+ const programmatic = (step) => {
132
+ switch (step.prop) {
133
+ case "orientation":
134
+ if (step.value !== "horizontal" && step.value !== "vertical") throw new Unsupported(`prop orientation=${JSON.stringify(step.value)}`);
135
+ return [specEvent("setOrientation", { o: step.value })];
136
+ case "dir":
137
+ if (step.value !== "ltr" && step.value !== "rtl") throw new Unsupported(`prop dir=${JSON.stringify(step.value)}`);
138
+ return [specEvent("setDir", { d: step.value })];
139
+ case "pointerLo": return [specEvent("pointerLo", { raw: pointerRaw(step.value) })];
140
+ case "pointerHi": return [specEvent("pointerHi", { raw: pointerRaw(step.value) })];
141
+ case "values":
142
+ case "setValue": {
143
+ let packed;
144
+ if (typeof step.value === "number") packed = step.value;
145
+ else if (Array.isArray(step.value) && step.value.length === 2 && typeof step.value[0] === "number" && typeof step.value[1] === "number") packed = packedPair(step.value[0], step.value[1]);
146
+ else throw new Unsupported(`prop ${step.prop}=${JSON.stringify(step.value)}`);
147
+ if (!VALUE_POOL.has(packed)) throw new Unsupported(`prop ${step.prop} value ${packed}`);
148
+ return [specEvent("setValue", { v: BigInt(packed) })];
149
+ }
150
+ default: throw new Unsupported(`prop ${step.prop ?? ""}`);
151
+ }
152
+ };
153
+ const sliderMultithumbBridge = {
154
+ setup: (config) => {
155
+ const mount = sliderMultithumbConfig(config);
156
+ return [
157
+ ...mount.orientation === "vertical" ? [specEvent("setOrientation", { o: "vertical" })] : [],
158
+ ...mount.dir === "rtl" ? [specEvent("setDir", { d: "rtl" })] : [],
159
+ ...mount.controlled ? [specEvent("control")] : [],
160
+ ...mount.controlled && mount.accepts ? [specEvent("acceptRequests")] : [],
161
+ ...mount.controlled ? [specEvent("setValue", { v: BigInt(packedPair(mount.values[0], mount.values[1])) })] : []
162
+ ];
163
+ },
164
+ event: (step) => {
165
+ switch (step.event) {
166
+ case "focus": return [specEvent("focusThumb", { t: thumbOf(step.target) })];
167
+ case "blur": return [specEvent("blur")];
168
+ case "click": return [specEvent("focusThumb", { t: thumbOf(step.target) })];
169
+ case "key": {
170
+ const thumb = thumbOf(step.target);
171
+ const key = step.key ?? "";
172
+ if (!KEY_POOL.has(key) || step.repeat === true) throw new Unsupported(`key ${key}`);
173
+ return [specEvent("focusThumb", { t: thumb }), specEvent("keydown", { key })];
174
+ }
175
+ case "hover":
176
+ case "unhover": return [];
177
+ case "prop": return programmatic(step);
178
+ default: throw new Unsupported(`event ${step.event}`);
179
+ }
180
+ },
181
+ value: (state) => [Number(state["lo"]), Number(state["hi"])],
182
+ focus: (state) => {
183
+ const focused = state["focused"];
184
+ if (focused === "lo") return "thumb:0";
185
+ if (focused === "hi") return "thumb:1";
186
+ return null;
187
+ },
188
+ attr: (state, target, name) => {
189
+ const thumb = thumbOf(target);
190
+ const lo = Number(state["lo"]);
191
+ const hi = Number(state["hi"]);
192
+ const value = thumb === "lo" ? lo : hi;
193
+ switch (name) {
194
+ case "role": return "slider";
195
+ case "aria-valuenow": return String(value);
196
+ case "aria-valuemin": return String(thumb === "lo" ? DEFAULT_MIN : lo);
197
+ case "aria-valuemax": return String(thumb === "lo" ? hi : DEFAULT_MAX);
198
+ case "aria-valuetext": return valueTextFor(value);
199
+ case "aria-orientation": return String(state["orientation"]);
200
+ case "tabindex": return "0";
201
+ default: throw new Unsupported(`attribute ${name} on ${target}`);
202
+ }
203
+ },
204
+ visible: () => [],
205
+ events: (before, after) => before["requests"] === after["requests"] ? [] : [["onValueChange", [Math.floor(Number(after["requested"]) / 11), Number(after["requested"]) % 11]]]
206
+ };
207
+ /** The user-level steps a differential walk draws from. */
208
+ const sliderMultithumbSteps = [
209
+ {
210
+ event: "focus",
211
+ target: "thumb:0"
212
+ },
213
+ {
214
+ event: "focus",
215
+ target: "thumb:1"
216
+ },
217
+ {
218
+ event: "key",
219
+ target: "thumb:0",
220
+ key: "ArrowRight"
221
+ },
222
+ {
223
+ event: "key",
224
+ target: "thumb:0",
225
+ key: "ArrowLeft"
226
+ },
227
+ {
228
+ event: "key",
229
+ target: "thumb:0",
230
+ key: "Home"
231
+ },
232
+ {
233
+ event: "key",
234
+ target: "thumb:0",
235
+ key: "End"
236
+ },
237
+ {
238
+ event: "key",
239
+ target: "thumb:1",
240
+ key: "ArrowRight"
241
+ },
242
+ {
243
+ event: "key",
244
+ target: "thumb:1",
245
+ key: "ArrowLeft"
246
+ },
247
+ {
248
+ event: "key",
249
+ target: "thumb:1",
250
+ key: "Home"
251
+ },
252
+ {
253
+ event: "key",
254
+ target: "thumb:1",
255
+ key: "End"
256
+ },
257
+ {
258
+ event: "key",
259
+ target: "thumb:0",
260
+ key: "PageUp"
261
+ },
262
+ {
263
+ event: "key",
264
+ target: "thumb:1",
265
+ key: "PageDown"
266
+ },
267
+ {
268
+ event: "prop",
269
+ prop: "pointerLo",
270
+ value: 0
271
+ },
272
+ {
273
+ event: "prop",
274
+ prop: "pointerLo",
275
+ value: .4
276
+ },
277
+ {
278
+ event: "prop",
279
+ prop: "pointerLo",
280
+ value: .7
281
+ },
282
+ {
283
+ event: "prop",
284
+ prop: "pointerLo",
285
+ value: 1
286
+ },
287
+ {
288
+ event: "prop",
289
+ prop: "pointerHi",
290
+ value: 0
291
+ },
292
+ {
293
+ event: "prop",
294
+ prop: "pointerHi",
295
+ value: .4
296
+ },
297
+ {
298
+ event: "prop",
299
+ prop: "pointerHi",
300
+ value: .7
301
+ },
302
+ {
303
+ event: "prop",
304
+ prop: "pointerHi",
305
+ value: 1
306
+ },
307
+ {
308
+ event: "prop",
309
+ prop: "orientation",
310
+ value: "vertical"
311
+ },
312
+ {
313
+ event: "prop",
314
+ prop: "orientation",
315
+ value: "horizontal"
316
+ },
317
+ {
318
+ event: "prop",
319
+ prop: "dir",
320
+ value: "rtl"
321
+ },
322
+ {
323
+ event: "prop",
324
+ prop: "dir",
325
+ value: "ltr"
326
+ },
327
+ {
328
+ event: "prop",
329
+ prop: "values",
330
+ value: [5, 5]
331
+ },
332
+ {
333
+ event: "prop",
334
+ prop: "values",
335
+ value: [0, 10]
336
+ },
337
+ {
338
+ event: "prop",
339
+ prop: "values",
340
+ value: [3, 7]
341
+ },
342
+ {
343
+ event: "prop",
344
+ prop: "values",
345
+ value: [3, 7]
346
+ }
347
+ ];
348
+ const sliderMultithumbProbe = {
349
+ attrs: [
350
+ ["thumb:0", "role"],
351
+ ["thumb:0", "aria-valuenow"],
352
+ ["thumb:0", "aria-valuemin"],
353
+ ["thumb:0", "aria-valuemax"],
354
+ ["thumb:0", "aria-valuetext"],
355
+ ["thumb:0", "aria-orientation"],
356
+ ["thumb:0", "tabindex"],
357
+ ["thumb:1", "aria-valuenow"],
358
+ ["thumb:1", "aria-valuemin"],
359
+ ["thumb:1", "aria-valuemax"],
360
+ ["thumb:1", "aria-valuetext"]
361
+ ],
362
+ events: ["onValueChange"]
363
+ };
364
+ //#endregion
365
+ export { sliderMultithumbBridge, sliderMultithumbConfig, sliderMultithumbProbe, sliderMultithumbSteps };