@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,25 @@
1
+ import { ActionStep, Probe, ScenarioConfig, SpecBridge } from "../scenario.mjs";
2
+ //#region src/apg/disclosure.bridge.d.ts
3
+ export interface DisclosureConfig {
4
+ /** `defaultValue` when uncontrolled, the initial `value` prop when controlled. */
5
+ readonly expanded: boolean;
6
+ readonly disabled: boolean;
7
+ readonly controlled: boolean;
8
+ /** Controlled only: the host writes every request's intent back as the value. */
9
+ readonly accepts: boolean;
10
+ }
11
+ /**
12
+ * Scenario `config` -> what both targets are mounted with. `controlled` puts the
13
+ * value in a host; the host accepts every request (a page that keeps the state
14
+ * in a signal) unless the scenario pins the value with `expanded` (react-aria's
15
+ * `isExpanded`: a fixed prop, so every request is rejected). `expanded` alone
16
+ * also means controlled.
17
+ */
18
+ export declare const disclosureConfig: (config: ScenarioConfig) => DisclosureConfig;
19
+ /** Callback names differ per library; scenarios call the primitive's `onValueChange` `onExpandedChange`. */
20
+ export declare const canonicalEvent: (name: string) => string;
21
+ export declare const disclosureBridge: SpecBridge;
22
+ /** The user-level steps a differential walk draws from. */
23
+ export declare const disclosureSteps: ReadonlyArray<ActionStep>;
24
+ export declare const disclosureProbe: Probe;
25
+ //#endregion
@@ -0,0 +1,202 @@
1
+ import { Unsupported } from "../scenario.mjs";
2
+ //#region src/apg/disclosure.bridge.ts
3
+ const specEvent = (tag, params = {}) => ({
4
+ _tag: tag,
5
+ ...params
6
+ });
7
+ /**
8
+ * Disclosure vocabulary <-> `specs/apg/disclosure.qnt`, shared by the spec
9
+ * driver and the DOM driver so both gate scenarios identically.
10
+ *
11
+ * Parts: `trigger` (role=button) and `panel`; `button` / `content` fold onto
12
+ * them. `trigger:1` is the host's own outside button: it writes the controlled
13
+ * value (`hostToggle`), it is not a trigger. Anything else (groups, nesting,
14
+ * `beforematch`, ...) throws `Unsupported`, which skips the scenario on every
15
+ * target.
16
+ */
17
+ const partOf = (target) => {
18
+ const part = (target ?? "trigger").replace(/:0$/, "");
19
+ if (part === "trigger" || part === "button") return "trigger";
20
+ if (part === "panel" || part === "content" || part === "region") return "panel";
21
+ throw new Unsupported(`part ${part}`);
22
+ };
23
+ const OPEN_KEYS = /* @__PURE__ */ new Set([
24
+ "initialOpen",
25
+ "defaultOpen",
26
+ "defaultExpanded"
27
+ ]);
28
+ const NEUTRAL_KEYS = /* @__PURE__ */ new Set([
29
+ "component",
30
+ "pointerType",
31
+ "keepMounted"
32
+ ]);
33
+ const HOOKS = /* @__PURE__ */ new Set(["useDisclosure", "useDisclosureState"]);
34
+ /**
35
+ * Scenario `config` -> what both targets are mounted with. `controlled` puts the
36
+ * value in a host; the host accepts every request (a page that keeps the state
37
+ * in a signal) unless the scenario pins the value with `expanded` (react-aria's
38
+ * `isExpanded`: a fixed prop, so every request is rejected). `expanded` alone
39
+ * also means controlled.
40
+ */
41
+ const disclosureConfig = (config) => {
42
+ let expanded = false;
43
+ let disabled = false;
44
+ let controlled = false;
45
+ let pinned = false;
46
+ for (const [key, value] of Object.entries(config)) if (OPEN_KEYS.has(key) && typeof value === "boolean") expanded ||= value;
47
+ else if (key === "expanded" && typeof value === "boolean") {
48
+ expanded = value;
49
+ controlled = true;
50
+ pinned = true;
51
+ } else if (key === "controlled" && typeof value === "boolean") controlled ||= value;
52
+ else if (key === "disabled" && typeof value === "boolean") disabled = value;
53
+ else if (NEUTRAL_KEYS.has(key) && (key !== "component" || typeof value === "string" && HOOKS.has(value))) continue;
54
+ else if (key === "nativeButton" && value === true) continue;
55
+ else throw new Unsupported(`config ${key}=${JSON.stringify(value)}`);
56
+ return {
57
+ expanded,
58
+ disabled,
59
+ controlled,
60
+ accepts: controlled && !pinned
61
+ };
62
+ };
63
+ /** Callback names differ per library; scenarios call the primitive's `onValueChange` `onExpandedChange`. */
64
+ const canonicalEvent = (name) => name === "onOpenChange" ? "onExpandedChange" : name;
65
+ const ACTIVATION_KEYS = /* @__PURE__ */ new Set([
66
+ "Enter",
67
+ " ",
68
+ "Space"
69
+ ]);
70
+ const onTrigger = (step) => {
71
+ if (partOf(step.target) !== "trigger") throw new Unsupported(`${step.event} on ${step.target ?? "panel"}`);
72
+ };
73
+ const programmatic = (prop, value) => {
74
+ switch (prop) {
75
+ case "disabled":
76
+ case "isDisabled": return [specEvent(value === true ? "disable" : "enable")];
77
+ case "expand":
78
+ case "collapse":
79
+ case "toggle":
80
+ case "hostToggle": return [specEvent(prop)];
81
+ case "isExpanded": return [specEvent("setValue", { v: value === true })];
82
+ default: throw new Unsupported(`prop ${prop ?? ""}`);
83
+ }
84
+ };
85
+ const disclosureBridge = {
86
+ setup: (config) => {
87
+ const { expanded, disabled, controlled, accepts } = disclosureConfig(config);
88
+ return [...controlled ? [
89
+ specEvent("control"),
90
+ ...accepts ? [specEvent("acceptRequests")] : [],
91
+ ...expanded ? [specEvent("setValue", { v: true })] : []
92
+ ] : expanded ? [specEvent("expand")] : [], ...disabled ? [specEvent("disable")] : []];
93
+ },
94
+ event: (step) => {
95
+ switch (step.event) {
96
+ case "focus":
97
+ onTrigger(step);
98
+ return [specEvent("focusTrigger")];
99
+ case "blur":
100
+ onTrigger(step);
101
+ return [specEvent("blurTrigger")];
102
+ case "click":
103
+ if (step.target === "trigger:1") return [specEvent("hostToggle")];
104
+ onTrigger(step);
105
+ return [specEvent("click")];
106
+ case "key":
107
+ onTrigger(step);
108
+ if (step.repeat !== true && step.key !== void 0 && ACTIVATION_KEYS.has(step.key)) return [specEvent("focusTrigger"), specEvent("press")];
109
+ throw new Unsupported(`key ${step.key ?? ""}${step.repeat === true ? " (repeat)" : ""}`);
110
+ case "hover":
111
+ case "unhover": return [];
112
+ case "prop": return programmatic(step.prop, step.value);
113
+ default: throw new Unsupported(`event ${step.event}`);
114
+ }
115
+ },
116
+ eventName: canonicalEvent,
117
+ value: (state) => ({ isExpanded: state["expanded"] === true }),
118
+ focus: (state) => {
119
+ if (state["focus"] === "unknown") throw new Unsupported("focus after disabling a focused trigger is browser-defined");
120
+ return state["focus"] === "trigger" ? "trigger" : null;
121
+ },
122
+ attr: (state, target, name) => {
123
+ if (partOf(target) === "trigger") {
124
+ if (name === "aria-expanded") return String(state["ariaExpanded"]);
125
+ if (name === "disabled") return state["disabled"] === true ? "true" : null;
126
+ } else if (name === "hidden") return state["panelHidden"] === true ? "true" : null;
127
+ throw new Unsupported(`attribute ${name} on ${target}`);
128
+ },
129
+ visible: (state) => state["panelHidden"] === true ? [] : ["panel"],
130
+ events: (before, after) => before["requests"] === after["requests"] ? [] : [["onExpandedChange", after["requested"] === true]]
131
+ };
132
+ /** The user-level steps a differential walk draws from. */
133
+ const disclosureSteps = [
134
+ {
135
+ event: "focus",
136
+ target: "trigger"
137
+ },
138
+ {
139
+ event: "blur",
140
+ target: "trigger"
141
+ },
142
+ {
143
+ event: "click",
144
+ target: "trigger"
145
+ },
146
+ {
147
+ event: "key",
148
+ key: "Enter",
149
+ target: "trigger"
150
+ },
151
+ {
152
+ event: "key",
153
+ key: " ",
154
+ target: "trigger"
155
+ },
156
+ {
157
+ event: "prop",
158
+ prop: "disabled",
159
+ value: true
160
+ },
161
+ {
162
+ event: "prop",
163
+ prop: "disabled",
164
+ value: false
165
+ },
166
+ {
167
+ event: "prop",
168
+ prop: "expand"
169
+ },
170
+ {
171
+ event: "prop",
172
+ prop: "collapse"
173
+ },
174
+ {
175
+ event: "prop",
176
+ prop: "toggle"
177
+ },
178
+ {
179
+ event: "prop",
180
+ prop: "isExpanded",
181
+ value: true
182
+ },
183
+ {
184
+ event: "prop",
185
+ prop: "isExpanded",
186
+ value: false
187
+ },
188
+ {
189
+ event: "prop",
190
+ prop: "hostToggle"
191
+ }
192
+ ];
193
+ const disclosureProbe = {
194
+ attrs: [
195
+ ["trigger", "aria-expanded"],
196
+ ["trigger", "disabled"],
197
+ ["panel", "hidden"]
198
+ ],
199
+ events: ["onExpandedChange"]
200
+ };
201
+ //#endregion
202
+ export { canonicalEvent, disclosureBridge, disclosureConfig, disclosureProbe, disclosureSteps };