@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,443 @@
1
+ {
2
+ "pattern": "button",
3
+ "source": "react-aria",
4
+ "commit": "99e610236887da619ad9d54a1cd87983166c043d",
5
+ "license": "Apache-2.0",
6
+ "skipped": [
7
+ {
8
+ "reason": "class-name / data-* style-hook rendering (default class, custom class, className functions)"
9
+ },
10
+ {
11
+ "reason": "custom render-function plumbing and wrong-element/ref warnings"
12
+ },
13
+ { "reason": "React refs, context slots and DOM prop passthrough" },
14
+ {
15
+ "reason": "form attributes, form submission, validation and isPending form-side effects"
16
+ },
17
+ {
18
+ "reason": "isPending spinner timing and live-region detail beyond activation suppression"
19
+ },
20
+ {
21
+ "reason": "S1 (react-spectrum) theme/provider wrappers and isEmphasized styling"
22
+ },
23
+ {
24
+ "reason": "useButton hook unit tests (React-API-only, no rendered behaviour)"
25
+ },
26
+ {
27
+ "reason": "ActionButton/ActionGroup and button-group patterns that are not toggle semantics"
28
+ }
29
+ ],
30
+ "scenarios": [
31
+ {
32
+ "id": "button.react-aria.hover-state-and-callbacks",
33
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/Button.test.js#L132",
34
+ "upstreamTest": "Button > should support hover",
35
+ "apg": "extension",
36
+ "config": { "part": "button" },
37
+ "steps": [
38
+ { "event": "prop", "set": {} },
39
+ { "expect": { "attrs": { "button": { "data-hovered": null } } } },
40
+ { "event": "hover", "target": "button" },
41
+ {
42
+ "expect": {
43
+ "attrs": { "button": { "data-hovered": "true" } },
44
+ "events": { "onHoverStart": [1], "onHoverChange": [1] }
45
+ }
46
+ },
47
+ { "event": "unhover", "target": "button" },
48
+ {
49
+ "expect": {
50
+ "attrs": { "button": { "data-hovered": null } },
51
+ "events": { "onHoverEnd": [1], "onHoverChange": [2] }
52
+ }
53
+ }
54
+ ],
55
+ "notes": "Hover is not an APG button behaviour; exported because the upstream asserts it."
56
+ },
57
+ {
58
+ "id": "button.react-aria.focus-visible-on-tab",
59
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/Button.test.js#L163",
60
+ "upstreamTest": "Button > should support focus ring",
61
+ "apg": "extension",
62
+ "config": { "part": "button" },
63
+ "steps": [
64
+ { "event": "prop", "set": {} },
65
+ { "expect": { "attrs": { "button": { "data-focus-visible": null } } } },
66
+ { "event": "key", "key": "Tab" },
67
+ {
68
+ "expect": {
69
+ "focus": "button",
70
+ "attrs": { "button": { "data-focus-visible": "true" } }
71
+ }
72
+ },
73
+ { "event": "key", "key": "Tab" },
74
+ { "expect": { "attrs": { "button": { "data-focus-visible": null } } } }
75
+ ],
76
+ "notes": "Keyboard focus sets data-focus-visible; tabbing away clears it."
77
+ },
78
+ {
79
+ "id": "button.react-aria.press-state-and-callbacks",
80
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/Button.test.js#L182",
81
+ "upstreamTest": "Button > should support press state",
82
+ "apg": "extension",
83
+ "config": { "part": "button" },
84
+ "steps": [
85
+ { "event": "prop", "set": {} },
86
+ { "expect": { "attrs": { "button": { "data-pressed": null } } } },
87
+ { "event": "pointerdown", "target": "button" },
88
+ { "expect": { "attrs": { "button": { "data-pressed": "true" } } } },
89
+ { "event": "pointerup", "target": "button" },
90
+ {
91
+ "expect": {
92
+ "attrs": { "button": { "data-pressed": null } },
93
+ "events": { "onPress": [1], "onClick": [1], "onClickCapture": [1] }
94
+ }
95
+ }
96
+ ],
97
+ "notes": "data-pressed is transient press feedback, distinct from aria-pressed."
98
+ },
99
+ {
100
+ "id": "button.react-aria.disabled-state",
101
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/Button.test.js#L213",
102
+ "upstreamTest": "Button > should support disabled state",
103
+ "apg": "states",
104
+ "config": { "part": "button", "isDisabled": true },
105
+ "steps": [
106
+ { "event": "prop", "set": {} },
107
+ { "expect": { "attrs": { "button": { "disabled": "" } } } },
108
+ { "event": "click", "target": "button" },
109
+ { "expect": { "events": { "onPress": [0] } } }
110
+ ],
111
+ "notes": "Disabled button is natively disabled and not pressable."
112
+ },
113
+ {
114
+ "id": "button.react-aria.pending-suppresses-press",
115
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/Button.test.js#L239",
116
+ "upstreamTest": "Button > displays a spinner when isPending prop is true",
117
+ "apg": "extension",
118
+ "config": { "part": "button", "isPending": false },
119
+ "steps": [
120
+ { "event": "prop", "set": {} },
121
+ { "expect": { "attrs": { "button": { "aria-disabled": null } } } },
122
+ { "event": "click", "target": "button" },
123
+ {
124
+ "expect": {
125
+ "attrs": { "button": { "aria-disabled": "true" } },
126
+ "events": { "onPress": [1] }
127
+ }
128
+ },
129
+ { "event": "click", "target": "button" },
130
+ { "expect": { "events": { "onPress": [1] } } }
131
+ ],
132
+ "notes": "Clicking sets pending; while pending the button is aria-disabled and further clicks do not press."
133
+ },
134
+ {
135
+ "id": "button.react-aria.toggle-button-selected-state",
136
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/ToggleButton.test.js#L155",
137
+ "upstreamTest": "ToggleButton > should support selected state",
138
+ "apg": "aria",
139
+ "config": { "part": "button", "isSelected": false },
140
+ "steps": [
141
+ { "event": "prop", "set": {} },
142
+ { "expect": { "attrs": { "button": { "aria-pressed": "false" } } } },
143
+ { "event": "click", "target": "button" },
144
+ {
145
+ "expect": {
146
+ "attrs": { "button": { "aria-pressed": "true" } },
147
+ "events": { "onChange": [true] }
148
+ }
149
+ },
150
+ { "event": "click", "target": "button" },
151
+ {
152
+ "expect": {
153
+ "attrs": { "button": { "aria-pressed": "false" } },
154
+ "events": { "onChange": [false] }
155
+ }
156
+ }
157
+ ],
158
+ "notes": "Toggle button exposes its state through aria-pressed and onChange."
159
+ },
160
+ {
161
+ "id": "button.react-aria.toggle-button-press-state",
162
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/ToggleButton.test.js#L112",
163
+ "upstreamTest": "ToggleButton > should support press state",
164
+ "apg": "extension",
165
+ "config": { "part": "button", "toggle": true },
166
+ "steps": [
167
+ { "event": "pointerdown", "target": "button" },
168
+ { "expect": { "attrs": { "button": { "data-pressed": "true" } } } },
169
+ { "event": "pointerup", "target": "button" },
170
+ {
171
+ "expect": {
172
+ "attrs": { "button": { "data-pressed": null } },
173
+ "events": { "onPress": [1], "onClick": [1], "onClickCapture": [1] }
174
+ }
175
+ }
176
+ ],
177
+ "notes": "Transient press feedback around a toggle click."
178
+ },
179
+ {
180
+ "id": "button.react-aria.toggle-button-disabled",
181
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/ToggleButton.test.js#L143",
182
+ "upstreamTest": "ToggleButton > should support disabled state",
183
+ "apg": "states",
184
+ "config": { "part": "button", "isDisabled": true, "toggle": true },
185
+ "steps": [
186
+ { "event": "prop", "set": {} },
187
+ { "expect": { "attrs": { "button": { "disabled": "" } } } }
188
+ ],
189
+ "notes": "Disabled toggle button uses the native disabled attribute."
190
+ },
191
+ {
192
+ "id": "button.react-aria.toggle-button-group-uncontrolled-single",
193
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/ToggleButtonGroup.test.js#L87",
194
+ "upstreamTest": "ToggleButtonGroup > should support uncontrolled single selection",
195
+ "apg": "extension",
196
+ "config": {
197
+ "groupRole": "radiogroup",
198
+ "selectionMode": "single",
199
+ "items": 2
200
+ },
201
+ "steps": [
202
+ { "event": "prop", "set": {} },
203
+ {
204
+ "expect": {
205
+ "attrs": {
206
+ "group": { "role": "radiogroup" },
207
+ "button:0": { "aria-checked": "false" },
208
+ "button:1": { "aria-checked": "false" }
209
+ }
210
+ }
211
+ },
212
+ { "event": "click", "target": "button:1" },
213
+ {
214
+ "expect": {
215
+ "attrs": {
216
+ "button:0": { "aria-checked": "false" },
217
+ "button:1": { "aria-checked": "true" }
218
+ },
219
+ "events": { "onSelectionChange": [["bar"]] }
220
+ }
221
+ }
222
+ ],
223
+ "notes": "Single-selection group renders radios, not aria-pressed buttons."
224
+ },
225
+ {
226
+ "id": "button.react-aria.toggle-button-group-controlled-single",
227
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/ToggleButtonGroup.test.js#L114",
228
+ "upstreamTest": "ToggleButtonGroup > should support controlled single selection",
229
+ "apg": "extension",
230
+ "config": {
231
+ "groupRole": "radiogroup",
232
+ "selectionMode": "single",
233
+ "selectedKeys": [],
234
+ "items": 2
235
+ },
236
+ "steps": [
237
+ { "event": "click", "target": "button:1" },
238
+ {
239
+ "expect": {
240
+ "attrs": { "button:1": { "aria-checked": "false" } },
241
+ "events": { "onSelectionChange": [["bar"]] }
242
+ }
243
+ }
244
+ ],
245
+ "notes": "Controlled selectedKeys stays empty, so clicking fires the callback without moving aria-checked."
246
+ },
247
+ {
248
+ "id": "button.react-aria.toggle-button-group-uncontrolled-multiple",
249
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/ToggleButtonGroup.test.js#L137",
250
+ "upstreamTest": "ToggleButtonGroup > should support uncontrolled multiple selection",
251
+ "apg": "extension",
252
+ "config": {
253
+ "groupRole": "toolbar",
254
+ "selectionMode": "multiple",
255
+ "items": 2
256
+ },
257
+ "steps": [
258
+ { "event": "prop", "set": {} },
259
+ {
260
+ "expect": {
261
+ "attrs": {
262
+ "group": { "role": "toolbar" },
263
+ "button:0": { "aria-pressed": "false" },
264
+ "button:1": { "aria-pressed": "false" }
265
+ }
266
+ }
267
+ },
268
+ { "event": "click", "target": "button:1" },
269
+ {
270
+ "expect": {
271
+ "attrs": { "button:1": { "aria-pressed": "true" } },
272
+ "events": { "onSelectionChange": [["bar"]] }
273
+ }
274
+ },
275
+ { "event": "click", "target": "button:0" },
276
+ {
277
+ "expect": {
278
+ "attrs": {
279
+ "button:0": { "aria-pressed": "true" },
280
+ "button:1": { "aria-pressed": "true" }
281
+ },
282
+ "events": { "onSelectionChange": [["bar", "foo"]] }
283
+ }
284
+ }
285
+ ],
286
+ "notes": "Multiple mode renders a toolbar of aria-pressed toggle buttons."
287
+ },
288
+ {
289
+ "id": "button.react-aria.toggle-button-group-controlled-multiple",
290
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/ToggleButtonGroup.test.js#L159",
291
+ "upstreamTest": "ToggleButtonGroup > should support controlled multiple selection",
292
+ "apg": "extension",
293
+ "config": {
294
+ "groupRole": "toolbar",
295
+ "selectionMode": "multiple",
296
+ "selectedKeys": ["foo"],
297
+ "items": 2
298
+ },
299
+ "steps": [
300
+ { "event": "click", "target": "button:1" },
301
+ {
302
+ "expect": {
303
+ "attrs": {
304
+ "button:0": { "aria-pressed": "true" },
305
+ "button:1": { "aria-pressed": "false" }
306
+ },
307
+ "events": { "onSelectionChange": [["foo", "bar"]] }
308
+ }
309
+ }
310
+ ],
311
+ "notes": "Controlled selection ignores the click for state, but the callback reports the merged set."
312
+ },
313
+ {
314
+ "id": "button.react-aria.toggle-button-group-horizontal-keyboard",
315
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/ToggleButtonGroup.test.js#L177",
316
+ "upstreamTest": "ToggleButtonGroup > should support horizontal keyboard navigation",
317
+ "apg": "keyboard",
318
+ "config": {
319
+ "groupRole": "radiogroup",
320
+ "orientation": "horizontal",
321
+ "items": 2
322
+ },
323
+ "steps": [
324
+ { "event": "prop", "set": {} },
325
+ {
326
+ "expect": {
327
+ "attrs": { "group": { "aria-orientation": "horizontal" } }
328
+ }
329
+ },
330
+ { "event": "key", "key": "Tab" },
331
+ { "expect": { "focus": "button:0" } },
332
+ { "event": "key", "key": "ArrowRight", "target": "button:0" },
333
+ { "expect": { "focus": "button:1" } },
334
+ { "event": "key", "key": "ArrowLeft", "target": "button:1" },
335
+ { "expect": { "focus": "button:0" } }
336
+ ],
337
+ "notes": "Horizontal single-select group uses Left/Right arrows."
338
+ },
339
+ {
340
+ "id": "button.react-aria.toggle-button-group-vertical-keyboard",
341
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/ToggleButtonGroup.test.js#L191",
342
+ "upstreamTest": "ToggleButtonGroup > should support vertical keyboard navigation",
343
+ "apg": "keyboard",
344
+ "config": {
345
+ "groupRole": "radiogroup",
346
+ "orientation": "vertical",
347
+ "items": 2
348
+ },
349
+ "steps": [
350
+ { "event": "prop", "set": {} },
351
+ {
352
+ "expect": { "attrs": { "group": { "aria-orientation": "vertical" } } }
353
+ },
354
+ { "event": "key", "key": "Tab" },
355
+ { "expect": { "focus": "button:0" } },
356
+ { "event": "key", "key": "ArrowDown", "target": "button:0" },
357
+ { "expect": { "focus": "button:1" } },
358
+ { "event": "key", "key": "ArrowUp", "target": "button:1" },
359
+ { "expect": { "focus": "button:0" } }
360
+ ],
361
+ "notes": "Vertical single-select group uses Up/Down arrows."
362
+ },
363
+ {
364
+ "id": "button.react-aria.toggle-button-group-aria-label",
365
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/ToggleButtonGroup.test.js#L205",
366
+ "upstreamTest": "ToggleButtonGroup > supports aria labeling",
367
+ "apg": "aria",
368
+ "config": { "aria-label": "Test" },
369
+ "steps": [
370
+ { "event": "prop", "set": {} },
371
+ { "expect": { "attrs": { "group": { "aria-label": "Test" } } } }
372
+ ],
373
+ "notes": "Label applies to both radiogroup and toolbar variants."
374
+ },
375
+ {
376
+ "id": "button.react-aria.s1-toggle-button-onpress-and-onchange",
377
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/@adobe/react-spectrum/test/button/ToggleButton.test.js#L19",
378
+ "upstreamTest": "ToggleButton > handles defaults",
379
+ "apg": "aria",
380
+ "config": { "part": "button", "isSelected": false },
381
+ "steps": [
382
+ { "event": "prop", "set": {} },
383
+ { "expect": { "attrs": { "button": { "aria-pressed": "false" } } } },
384
+ { "event": "click", "target": "button" },
385
+ {
386
+ "expect": {
387
+ "attrs": { "button": { "aria-pressed": "true" } },
388
+ "events": { "onPress": [1], "onChange": [true] }
389
+ }
390
+ }
391
+ ],
392
+ "notes": "S1 ToggleButton: onPress fires alongside onChange."
393
+ },
394
+ {
395
+ "id": "button.react-aria.s1-toggle-button-controlled-selected",
396
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/@adobe/react-spectrum/test/button/ToggleButton.test.js#L57",
397
+ "upstreamTest": "ToggleButton > supports isSelected",
398
+ "apg": "aria",
399
+ "config": { "part": "button", "isSelected": true },
400
+ "steps": [
401
+ { "event": "prop", "set": {} },
402
+ { "expect": { "attrs": { "button": { "aria-pressed": "true" } } } },
403
+ { "event": "click", "target": "button" },
404
+ {
405
+ "expect": {
406
+ "attrs": { "button": { "aria-pressed": "true" } },
407
+ "events": { "onChange": [false] }
408
+ }
409
+ }
410
+ ],
411
+ "notes": "Controlled isSelected keeps aria-pressed true while still firing onChange."
412
+ },
413
+ {
414
+ "id": "button.react-aria.s1-button-keyboard-activates-non-submit",
415
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/@adobe/react-spectrum/test/button/Button.test.js#L255",
416
+ "upstreamTest": "Button > prevents default for non-submit types",
417
+ "apg": "keyboard",
418
+ "config": { "part": "button", "type": "button" },
419
+ "steps": [
420
+ { "event": "focus", "target": "button" },
421
+ { "event": "key", "key": "Enter", "target": "button" },
422
+ {
423
+ "expect": {
424
+ "events": {
425
+ "onKeyDown": [{ "defaultPrevented": true }],
426
+ "onKeyUp": [{ "defaultPrevented": true }]
427
+ }
428
+ }
429
+ },
430
+ { "event": "key", "key": " ", "target": "button" },
431
+ {
432
+ "expect": {
433
+ "events": {
434
+ "onKeyDown": [{ "defaultPrevented": true }],
435
+ "onKeyUp": [{ "defaultPrevented": true }]
436
+ }
437
+ }
438
+ }
439
+ ],
440
+ "notes": "Non-submit buttons prevent the default Enter/Space actions so no implicit form submission occurs."
441
+ }
442
+ ]
443
+ }