@cssints/apg-specs 0.0.0-stage → 0.5.2

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,54 @@
1
+ import { ActionStep, Probe, ScenarioConfig, SpecBridge } from "../scenario.mjs";
2
+ //#region src/apg/slider.bridge.d.ts
3
+ /**
4
+ * Slider vocabulary <-> `specs/apg/slider.qnt`, shared by the spec driver and
5
+ * the DOM driver so both gate scenarios identically.
6
+ *
7
+ * Parts: `thumb` (role=slider, the focus holder) and `track` (the spec's
8
+ * `rail`). The spec fixes the range at 0..10 but now carries a small variant
9
+ * table (`configure`): step 1 / large step 3 / value 5, and step 2 / large
10
+ * step 4 / value 6. A scenario config outside the table is `Unsupported`; only
11
+ * `orientation` and `dir` are state the spec lets us set directly
12
+ * (`setOrientation` / `setDir`).
13
+ *
14
+ * Controlled (map ticket rt1p): `controlled` puts the value in a host; a `value`
15
+ * alongside it pins the host (a rejecting host, react-aria's fixed value), a
16
+ * `controlled` alone accepts every request. `setValue` / `hostToggle` are the
17
+ * host writing the value; they are inert while uncontrolled.
18
+ *
19
+ * Pointer input is modelled as the spec's discrete rail press (`pointer`), but
20
+ * the replay DOM driver has no pointerdown/move/up, so those steps are gated
21
+ * `Unsupported`; a `prop: pointer` step (a position) is the walk's pointer
22
+ * alphabet, mapped to the nearest pool raw value.
23
+ */
24
+ export interface SliderConfig {
25
+ readonly flavor: number;
26
+ readonly value: number;
27
+ readonly min: number;
28
+ readonly max: number;
29
+ readonly step: number;
30
+ readonly largeStep: number;
31
+ readonly orientation: "horizontal" | "vertical";
32
+ readonly dir: "ltr" | "rtl";
33
+ readonly controlled: boolean;
34
+ /** Controlled only: the host writes every request's intent back as the value. */
35
+ readonly accepts: boolean;
36
+ }
37
+ /** Scenario `config` -> what both targets are mounted with. */
38
+ export declare const sliderConfig: (config: ScenarioConfig) => {
39
+ flavor: number;
40
+ value: number;
41
+ min: number;
42
+ max: number;
43
+ step: number;
44
+ largeStep: number;
45
+ orientation: "horizontal" | "vertical";
46
+ dir: "ltr" | "rtl";
47
+ controlled: boolean;
48
+ accepts: boolean;
49
+ };
50
+ export declare const sliderBridge: SpecBridge;
51
+ /** The user-level steps a differential walk draws from. */
52
+ export declare const sliderSteps: ReadonlyArray<ActionStep>;
53
+ export declare const sliderProbe: Probe;
54
+ //#endregion
@@ -0,0 +1,359 @@
1
+ import { Unsupported } from "../scenario.mjs";
2
+ //#region src/apg/slider.bridge.ts
3
+ const specEvent = (tag, params = {}) => ({
4
+ _tag: tag,
5
+ ...params
6
+ });
7
+ /**
8
+ * The spec's `configure` variants: step, large step and starting value.
9
+ * `largeStep` is a multiple of `step`, so a page jump stays on the grid. The
10
+ * range is 0..10 in every variant, so one walk alphabet fits all of them.
11
+ */
12
+ const VARIANTS = [{
13
+ min: 0,
14
+ max: 10,
15
+ step: 1,
16
+ largeStep: 3,
17
+ value: 5
18
+ }, {
19
+ min: 0,
20
+ max: 10,
21
+ step: 2,
22
+ largeStep: 4,
23
+ value: 6
24
+ }];
25
+ const numberIn = (key, value) => {
26
+ if (typeof value !== "number" || !Number.isInteger(value)) throw new Unsupported(`config ${key}=${JSON.stringify(value)}`);
27
+ return value;
28
+ };
29
+ const DEFAULT_SLICE = {
30
+ min: VARIANTS[0].min,
31
+ max: VARIANTS[0].max,
32
+ step: VARIANTS[0].step,
33
+ largeStep: VARIANTS[0].largeStep,
34
+ value: void 0,
35
+ orientation: "horizontal",
36
+ dir: "ltr",
37
+ controlled: false,
38
+ pinned: false
39
+ };
40
+ const parseSlice = (slice, key, raw) => {
41
+ switch (key) {
42
+ case "thumbs":
43
+ if (numberIn(key, raw) !== 1) throw new Unsupported(`config thumbs=${JSON.stringify(raw)}`);
44
+ return slice;
45
+ case "value": return {
46
+ ...slice,
47
+ value: numberIn(key, raw),
48
+ pinned: true
49
+ };
50
+ case "min": return {
51
+ ...slice,
52
+ min: numberIn(key, raw)
53
+ };
54
+ case "max": return {
55
+ ...slice,
56
+ max: numberIn(key, raw)
57
+ };
58
+ case "step": return {
59
+ ...slice,
60
+ step: numberIn(key, raw)
61
+ };
62
+ case "largeStep": return {
63
+ ...slice,
64
+ largeStep: numberIn(key, raw)
65
+ };
66
+ case "orientation": switch (raw) {
67
+ case "horizontal":
68
+ case "vertical": return {
69
+ ...slice,
70
+ orientation: raw
71
+ };
72
+ default: throw new Unsupported(`config orientation=${JSON.stringify(raw)}`);
73
+ }
74
+ case "dir": switch (raw) {
75
+ case "ltr":
76
+ case "rtl": return {
77
+ ...slice,
78
+ dir: raw
79
+ };
80
+ default: throw new Unsupported(`config dir=${JSON.stringify(raw)}`);
81
+ }
82
+ case "controlled":
83
+ if (typeof raw !== "boolean") throw new Unsupported(`config controlled=${JSON.stringify(raw)}`);
84
+ return {
85
+ ...slice,
86
+ controlled: raw
87
+ };
88
+ default: throw new Unsupported(`config ${key}=${JSON.stringify(raw)}`);
89
+ }
90
+ };
91
+ /** Scenario `config` -> what both targets are mounted with. */
92
+ const sliderConfig = (config) => {
93
+ const { min, max, step, largeStep, value, orientation, dir, controlled, pinned } = Object.entries(config).reduce((slice, [key, raw]) => parseSlice(slice, key, raw), DEFAULT_SLICE);
94
+ const flavor = VARIANTS.findIndex((variant) => variant.min === min && variant.max === max && variant.step === step && variant.largeStep === largeStep);
95
+ if (flavor < 0) throw new Unsupported(`config min=${min} max=${max} step=${step} largeStep=${largeStep}`);
96
+ const start = VARIANTS[flavor]?.value ?? VARIANTS[0].value;
97
+ const resolved = value ?? start;
98
+ const onGrid = (resolved - min) % step === 0;
99
+ if (controlled ? !onGrid : resolved !== start) throw new Unsupported(`config value=${JSON.stringify(resolved)}`);
100
+ if (resolved < min || resolved > max) throw new Unsupported(`config value=${JSON.stringify(resolved)}`);
101
+ return {
102
+ flavor,
103
+ value: resolved,
104
+ min,
105
+ max,
106
+ step,
107
+ largeStep,
108
+ orientation,
109
+ dir,
110
+ controlled,
111
+ accepts: controlled && !pinned
112
+ };
113
+ };
114
+ const partOf = (target) => {
115
+ const part = (target ?? "thumb").replace(/:\d+$/, "");
116
+ if (part === "thumb") return "thumb";
117
+ if (part === "track" || part === "rail") return "track";
118
+ throw new Unsupported(`part ${part}`);
119
+ };
120
+ const onThumb = (step) => {
121
+ if (partOf(step.target) !== "thumb") throw new Unsupported(`${step.event} on ${step.target ?? "track"}`);
122
+ };
123
+ /** The keys the spec's `keydown` pool carries. */
124
+ const KEY_POOL = /* @__PURE__ */ new Set([
125
+ "ArrowRight",
126
+ "ArrowLeft",
127
+ "ArrowUp",
128
+ "ArrowDown",
129
+ "Home",
130
+ "End",
131
+ "PageUp",
132
+ "PageDown",
133
+ "Enter"
134
+ ]);
135
+ /** The raw rail-press values the spec's `pointer` action draws from. */
136
+ const POINTER_POOL = /* @__PURE__ */ new Set([
137
+ -3,
138
+ 0,
139
+ 4,
140
+ 7,
141
+ 10,
142
+ 14
143
+ ]);
144
+ const valueTextFor = (value) => value <= 3 ? "low" : value <= 7 ? "medium" : "high";
145
+ const programmatic = (step, config) => {
146
+ switch (step.prop) {
147
+ case "orientation":
148
+ if (step.value !== "horizontal" && step.value !== "vertical") throw new Unsupported(`prop orientation=${JSON.stringify(step.value)}`);
149
+ return [specEvent("setOrientation", { o: step.value })];
150
+ case "dir":
151
+ if (step.value !== "ltr" && step.value !== "rtl") throw new Unsupported(`prop dir=${JSON.stringify(step.value)}`);
152
+ return [specEvent("setDir", { d: step.value })];
153
+ case "pointer": {
154
+ if (typeof step.value !== "number") throw new Unsupported(`prop pointer=${JSON.stringify(step.value)}`);
155
+ const raw = config.min + Math.round(step.value * (config.max - config.min));
156
+ if (!POINTER_POOL.has(raw)) throw new Unsupported(`pointer position ${step.value}`);
157
+ return [specEvent("pointer", { raw: BigInt(raw) })];
158
+ }
159
+ case "setValue": {
160
+ if (typeof step.value !== "number") throw new Unsupported(`prop setValue=${JSON.stringify(step.value)}`);
161
+ const value = Math.round(step.value);
162
+ if (value !== step.value || value < config.min || value > config.max) throw new Unsupported(`setValue ${JSON.stringify(step.value)}`);
163
+ return [specEvent("setValue", { v: BigInt(value) })];
164
+ }
165
+ case "hostToggle": return [specEvent("hostToggle")];
166
+ default: throw new Unsupported(`prop ${step.prop ?? ""}`);
167
+ }
168
+ };
169
+ const sliderBridge = {
170
+ setup: (config) => {
171
+ const mount = sliderConfig(config);
172
+ return [
173
+ specEvent("configure", { pick: BigInt(mount.flavor) }),
174
+ ...mount.controlled ? [
175
+ specEvent("control"),
176
+ ...mount.accepts ? [specEvent("acceptRequests")] : [],
177
+ ...mount.accepts ? [] : [specEvent("setValue", { v: BigInt(mount.value) })]
178
+ ] : [],
179
+ ...mount.orientation === "vertical" ? [specEvent("setOrientation", { o: "vertical" })] : [],
180
+ ...mount.dir === "rtl" ? [specEvent("setDir", { d: "rtl" })] : []
181
+ ];
182
+ },
183
+ event: (step) => {
184
+ switch (step.event) {
185
+ case "focus":
186
+ onThumb(step);
187
+ return [specEvent("focus")];
188
+ case "blur":
189
+ onThumb(step);
190
+ return [specEvent("blur")];
191
+ case "key": {
192
+ onThumb(step);
193
+ const key = step.key ?? "";
194
+ if (!KEY_POOL.has(key) || step.repeat === true) throw new Unsupported(`key ${key}`);
195
+ return [specEvent("focus"), specEvent("keydown", { key })];
196
+ }
197
+ case "hover":
198
+ case "unhover": return [];
199
+ case "prop": {
200
+ const config = sliderConfig({});
201
+ return programmatic(step, config);
202
+ }
203
+ default: throw new Unsupported(`event ${step.event}`);
204
+ }
205
+ },
206
+ value: (state) => Number(state["value"]),
207
+ focus: (state) => state["focused"] === true ? "thumb:0" : null,
208
+ attr: (state, target, name) => {
209
+ if (partOf(target) !== "thumb") throw new Unsupported(`attribute ${name} on ${target}`);
210
+ const value = Number(state["value"]);
211
+ const variant = VARIANTS[Number(state["flavor"])] ?? VARIANTS[0];
212
+ switch (name) {
213
+ case "role": return "slider";
214
+ case "aria-valuenow": return String(value);
215
+ case "aria-valuemin": return String(variant.min);
216
+ case "aria-valuemax": return String(variant.max);
217
+ case "aria-valuetext": return valueTextFor(value);
218
+ case "aria-orientation": return String(state["orientation"]);
219
+ case "tabindex": return "0";
220
+ default: throw new Unsupported(`attribute ${name} on ${target}`);
221
+ }
222
+ },
223
+ visible: () => [],
224
+ events: (before, after) => before["requests"] === after["requests"] ? [] : [["onValueChange", Number(after["requested"])]]
225
+ };
226
+ /** The user-level steps a differential walk draws from. */
227
+ const sliderSteps = [
228
+ {
229
+ event: "focus",
230
+ target: "thumb:0"
231
+ },
232
+ {
233
+ event: "blur",
234
+ target: "thumb:0"
235
+ },
236
+ {
237
+ event: "key",
238
+ target: "thumb:0",
239
+ key: "ArrowRight"
240
+ },
241
+ {
242
+ event: "key",
243
+ target: "thumb:0",
244
+ key: "ArrowLeft"
245
+ },
246
+ {
247
+ event: "key",
248
+ target: "thumb:0",
249
+ key: "ArrowUp"
250
+ },
251
+ {
252
+ event: "key",
253
+ target: "thumb:0",
254
+ key: "ArrowDown"
255
+ },
256
+ {
257
+ event: "key",
258
+ target: "thumb:0",
259
+ key: "Home"
260
+ },
261
+ {
262
+ event: "key",
263
+ target: "thumb:0",
264
+ key: "End"
265
+ },
266
+ {
267
+ event: "key",
268
+ target: "thumb:0",
269
+ key: "PageUp"
270
+ },
271
+ {
272
+ event: "key",
273
+ target: "thumb:0",
274
+ key: "PageDown"
275
+ },
276
+ {
277
+ event: "key",
278
+ target: "thumb:0",
279
+ key: "Enter"
280
+ },
281
+ {
282
+ event: "prop",
283
+ prop: "orientation",
284
+ value: "vertical"
285
+ },
286
+ {
287
+ event: "prop",
288
+ prop: "orientation",
289
+ value: "horizontal"
290
+ },
291
+ {
292
+ event: "prop",
293
+ prop: "dir",
294
+ value: "rtl"
295
+ },
296
+ {
297
+ event: "prop",
298
+ prop: "dir",
299
+ value: "ltr"
300
+ },
301
+ {
302
+ event: "prop",
303
+ prop: "pointer",
304
+ value: 0
305
+ },
306
+ {
307
+ event: "prop",
308
+ prop: "pointer",
309
+ value: .4
310
+ },
311
+ {
312
+ event: "prop",
313
+ prop: "pointer",
314
+ value: .7
315
+ },
316
+ {
317
+ event: "prop",
318
+ prop: "pointer",
319
+ value: 1
320
+ },
321
+ {
322
+ event: "prop",
323
+ prop: "setValue",
324
+ value: 0
325
+ },
326
+ {
327
+ event: "prop",
328
+ prop: "setValue",
329
+ value: 2
330
+ },
331
+ {
332
+ event: "prop",
333
+ prop: "setValue",
334
+ value: 8
335
+ },
336
+ {
337
+ event: "prop",
338
+ prop: "setValue",
339
+ value: 10
340
+ },
341
+ {
342
+ event: "prop",
343
+ prop: "hostToggle"
344
+ }
345
+ ];
346
+ const sliderProbe = {
347
+ attrs: [
348
+ ["thumb:0", "role"],
349
+ ["thumb:0", "aria-valuenow"],
350
+ ["thumb:0", "aria-valuemin"],
351
+ ["thumb:0", "aria-valuemax"],
352
+ ["thumb:0", "aria-valuetext"],
353
+ ["thumb:0", "aria-orientation"],
354
+ ["thumb:0", "tabindex"]
355
+ ],
356
+ events: ["onValueChange"]
357
+ };
358
+ //#endregion
359
+ export { sliderBridge, sliderConfig, sliderProbe, sliderSteps };