@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,924 @@
1
+ {
2
+ "pattern": "menu-button",
3
+ "source": "ariakit",
4
+ "commit": "404c72257b879569feb08465da4ff9915fd873da",
5
+ "license": "MIT",
6
+ "scenarios": [
7
+ {
8
+ "id": "menu-button.ariakit.click-opens-menu-focuses-container",
9
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-core-interactions/test.ts#L6",
10
+ "upstreamTest": "show/hide on click",
11
+ "apg": "keyboard",
12
+ "config": { "items": ["Edit", "Share", "Report"] },
13
+ "steps": [
14
+ { "expect": { "hidden": ["menu"] } },
15
+ { "event": "click", "target": "trigger" },
16
+ {
17
+ "expect": {
18
+ "visible": ["menu"],
19
+ "focus": "menu",
20
+ "attrs": {
21
+ "trigger": { "aria-expanded": "true", "aria-haspopup": "menu" }
22
+ }
23
+ }
24
+ },
25
+ { "event": "click", "target": "trigger" },
26
+ { "expect": { "hidden": ["menu"], "focus": "trigger" } }
27
+ ],
28
+ "notes": "On pointer open the popup container takes focus; the first item is not focused."
29
+ },
30
+ {
31
+ "id": "menu-button.ariakit.enter-opens-and-focuses-first-item",
32
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-core-interactions/test.ts#L17",
33
+ "upstreamTest": "show/hide on enter",
34
+ "apg": "keyboard",
35
+ "config": { "items": ["Edit", "Share", "Report"] },
36
+ "steps": [
37
+ { "event": "focus", "target": "trigger" },
38
+ { "event": "key", "key": "Enter", "target": "trigger" },
39
+ { "expect": { "visible": ["menu"], "focus": "menuitem:0" } },
40
+ { "event": "key", "key": "Enter", "target": "menuitem:0" },
41
+ { "expect": { "hidden": ["menu"], "focus": "trigger" } }
42
+ ]
43
+ },
44
+ {
45
+ "id": "menu-button.ariakit.space-opens-and-focuses-first-item",
46
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-core-interactions/test.ts#L29",
47
+ "upstreamTest": "show/hide on space",
48
+ "apg": "keyboard",
49
+ "config": { "items": ["Edit", "Share", "Report"] },
50
+ "steps": [
51
+ { "event": "focus", "target": "trigger" },
52
+ { "event": "key", "key": "Space", "target": "trigger" },
53
+ { "expect": { "visible": ["menu"], "focus": "menuitem:0" } },
54
+ { "event": "key", "key": "Space", "target": "menuitem:0" },
55
+ { "expect": { "hidden": ["menu"], "focus": "trigger" } }
56
+ ]
57
+ },
58
+ {
59
+ "id": "menu-button.ariakit.arrow-down-opens-and-focuses-first-item",
60
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-core-interactions/test.ts#L43",
61
+ "upstreamTest": "show on arrow down",
62
+ "apg": "keyboard",
63
+ "config": { "items": ["Edit", "Share", "Report"] },
64
+ "steps": [
65
+ { "event": "focus", "target": "trigger" },
66
+ { "event": "key", "key": "ArrowDown", "target": "trigger" },
67
+ { "expect": { "visible": ["menu"], "focus": "menuitem:0" } }
68
+ ]
69
+ },
70
+ {
71
+ "id": "menu-button.ariakit.arrow-up-opens-and-focuses-last-item",
72
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-core-interactions/test.ts#L50",
73
+ "upstreamTest": "show on arrow up",
74
+ "apg": "keyboard",
75
+ "config": { "items": ["Edit", "Share", "Report"] },
76
+ "steps": [
77
+ { "event": "focus", "target": "trigger" },
78
+ { "event": "key", "key": "ArrowUp", "target": "trigger" },
79
+ { "expect": { "visible": ["menu"], "focus": "menuitem:2" } }
80
+ ]
81
+ },
82
+ {
83
+ "id": "menu-button.ariakit.escape-closes-and-restores-focus",
84
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-core-interactions/test.ts#L57",
85
+ "upstreamTest": "hide on escape",
86
+ "apg": "keyboard",
87
+ "config": { "items": ["Edit", "Share", "Report"] },
88
+ "steps": [
89
+ { "event": "click", "target": "trigger" },
90
+ { "event": "key", "key": "Escape", "target": "menu" },
91
+ { "expect": { "hidden": ["menu"], "focus": "trigger" } },
92
+ { "event": "key", "key": "Enter", "target": "trigger" },
93
+ { "event": "key", "key": "Escape", "target": "menu" },
94
+ { "expect": { "hidden": ["menu"], "focus": "trigger" } },
95
+ { "event": "key", "key": "ArrowDown", "target": "trigger" },
96
+ { "event": "key", "key": "Escape", "target": "menu" },
97
+ { "expect": { "hidden": ["menu"], "focus": "trigger" } }
98
+ ]
99
+ },
100
+ {
101
+ "id": "menu-button.ariakit.click-outside-closes",
102
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-core-interactions/test.ts#L85",
103
+ "upstreamTest": "hide on click outside",
104
+ "apg": "mouse",
105
+ "config": { "items": ["Edit", "Share", "Report"] },
106
+ "steps": [
107
+ { "event": "click", "target": "trigger" },
108
+ { "expect": { "visible": ["menu"] } },
109
+ { "event": "click", "target": "outside" },
110
+ { "expect": { "hidden": ["menu"] } }
111
+ ]
112
+ },
113
+ {
114
+ "id": "menu-button.ariakit.tab-moves-focus-out-and-closes",
115
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-core-interactions/test.ts#L107",
116
+ "upstreamTest": "hide on tab",
117
+ "apg": "keyboard",
118
+ "config": { "items": ["Edit", "Share", "Report"] },
119
+ "steps": [
120
+ { "event": "click", "target": "trigger" },
121
+ { "event": "key", "key": "Tab", "target": "menu" },
122
+ { "expect": { "hidden": ["menu"], "focus": "outside" } }
123
+ ]
124
+ },
125
+ {
126
+ "id": "menu-button.ariakit.tab-back-to-trigger-then-forward-to-menu",
127
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-core-interactions/test.ts#L121",
128
+ "upstreamTest": "tab back to menu button",
129
+ "apg": "keyboard",
130
+ "config": { "items": ["Edit", "Share", "Report"] },
131
+ "steps": [
132
+ { "event": "click", "target": "trigger" },
133
+ { "event": "key", "key": "Shift+Tab", "target": "menu" },
134
+ { "expect": { "focus": "trigger", "visible": ["menu"] } },
135
+ { "event": "key", "key": "Tab", "target": "trigger" },
136
+ { "expect": { "focus": "menu", "visible": ["menu"] } }
137
+ ]
138
+ },
139
+ {
140
+ "id": "menu-button.ariakit.keyboard-navigation-between-items",
141
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-core-interactions/test.ts#L139",
142
+ "upstreamTest": "navigate through items with keyboard",
143
+ "apg": "keyboard",
144
+ "config": { "items": ["Edit", "Share", "Report"] },
145
+ "steps": [
146
+ { "event": "click", "target": "trigger" },
147
+ { "event": "key", "key": "ArrowDown", "target": "menu" },
148
+ { "expect": { "focus": "menuitem:0" } },
149
+ { "event": "key", "key": "ArrowDown", "target": "menuitem:0" },
150
+ { "expect": { "focus": "menuitem:1" } },
151
+ { "event": "key", "key": "ArrowDown", "target": "menuitem:1" },
152
+ { "expect": { "focus": "menuitem:2" } },
153
+ { "event": "key", "key": "ArrowLeft", "target": "menuitem:2" },
154
+ { "expect": { "focus": "menuitem:2" } },
155
+ { "event": "key", "key": "ArrowRight", "target": "menuitem:2" },
156
+ { "expect": { "focus": "menuitem:2" } },
157
+ { "event": "key", "key": "Home", "target": "menuitem:2" },
158
+ { "expect": { "focus": "menuitem:0" } },
159
+ { "event": "key", "key": "End", "target": "menuitem:0" },
160
+ { "expect": { "focus": "menuitem:2" } }
161
+ ]
162
+ },
163
+ {
164
+ "id": "menu-button.ariakit.hover-highlights-item-and-keeps-menu-focus",
165
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-core-interactions/test.ts#L157",
166
+ "upstreamTest": "navigate through items with mouse",
167
+ "apg": "mouse",
168
+ "config": { "items": ["Edit", "Share", "Delete"] },
169
+ "steps": [
170
+ { "event": "key", "key": "Enter", "target": "trigger" },
171
+ { "event": "hover", "target": "menuitem:1" },
172
+ {
173
+ "expect": {
174
+ "focus": "menu",
175
+ "attrs": { "menuitem:1": { "data-active-item": "" } }
176
+ }
177
+ },
178
+ { "event": "hover", "target": "menuitem:2" },
179
+ {
180
+ "expect": {
181
+ "focus": "menu",
182
+ "attrs": { "menuitem:2": { "data-active-item": null } }
183
+ }
184
+ }
185
+ ],
186
+ "notes": "A disabled trailing item consumes hover without becoming active."
187
+ },
188
+ {
189
+ "id": "menu-button.ariakit.click-item-activates-and-closes",
190
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-core-interactions/test.ts#L169",
191
+ "upstreamTest": "menu item click",
192
+ "apg": "keyboard",
193
+ "config": { "items": ["Edit", "Share", "Report"] },
194
+ "steps": [
195
+ { "event": "click", "target": "trigger" },
196
+ { "event": "click", "target": "menuitem:0" },
197
+ {
198
+ "expect": {
199
+ "hidden": ["menu"],
200
+ "focus": "trigger",
201
+ "events": { "onItemClick": [["menuitem:0"]] }
202
+ }
203
+ }
204
+ ]
205
+ },
206
+ {
207
+ "id": "menu-button.ariakit.enter-on-item-activates-and-closes",
208
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-core-interactions/test.ts#L179",
209
+ "upstreamTest": "menu item enter",
210
+ "apg": "keyboard",
211
+ "config": { "items": ["Edit", "Share", "Report"] },
212
+ "steps": [
213
+ { "event": "key", "key": "Enter", "target": "trigger" },
214
+ { "event": "key", "key": "Enter", "target": "menuitem:0" },
215
+ {
216
+ "expect": {
217
+ "hidden": ["menu"],
218
+ "focus": "trigger",
219
+ "events": { "onItemClick": [["menuitem:0"]] }
220
+ }
221
+ }
222
+ ]
223
+ },
224
+ {
225
+ "id": "menu-button.ariakit.space-on-item-activates-and-closes",
226
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-core-interactions/test.ts#L190",
227
+ "upstreamTest": "menu item space",
228
+ "apg": "keyboard",
229
+ "config": { "items": ["Edit", "Share", "Report"] },
230
+ "steps": [
231
+ { "event": "key", "key": "Space", "target": "trigger" },
232
+ { "event": "key", "key": "Space", "target": "menuitem:0" },
233
+ {
234
+ "expect": {
235
+ "hidden": ["menu"],
236
+ "focus": "trigger",
237
+ "events": { "onItemClick": [["menuitem:0"]] }
238
+ }
239
+ }
240
+ ]
241
+ },
242
+ {
243
+ "id": "menu-button.ariakit.hover-then-enter-activates-hovered-item",
244
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-core-interactions/test.ts#L201",
245
+ "upstreamTest": "menu item hover enter",
246
+ "apg": "mouse",
247
+ "config": { "items": ["Edit", "Share", "Report"] },
248
+ "steps": [
249
+ { "event": "click", "target": "trigger" },
250
+ { "event": "key", "key": "Enter", "target": "menu" },
251
+ { "expect": { "events": { "onItemClick": [] } } },
252
+ { "event": "hover", "target": "menuitem:0" },
253
+ { "event": "key", "key": "Enter", "target": "menuitem:0" },
254
+ {
255
+ "expect": {
256
+ "hidden": ["menu"],
257
+ "events": { "onItemClick": [["menuitem:0"]] }
258
+ }
259
+ }
260
+ ]
261
+ },
262
+ {
263
+ "id": "menu-button.ariakit.typeahead-selects-matching-item",
264
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-core-interactions/test.ts#L227",
265
+ "upstreamTest": "typeahead",
266
+ "apg": "keyboard",
267
+ "config": { "items": ["Edit", "Report", "Share"] },
268
+ "steps": [
269
+ { "event": "click", "target": "trigger" },
270
+ { "expect": { "focus": "menu" } },
271
+ { "event": "type", "text": "d", "target": "menu" },
272
+ { "expect": { "focus": "menu" } },
273
+ { "event": "type", "text": "re", "target": "menu" },
274
+ { "expect": { "focus": "menuitem:1" } }
275
+ ],
276
+ "notes": "A single-key match is treated as a pending typeahead prefix and keeps focus on the menu until it resolves."
277
+ },
278
+ {
279
+ "id": "menu-button.ariakit.menu-is-owned-by-trigger",
280
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-core-interactions/test.ts#L236",
281
+ "upstreamTest": "https://github.com/ariakit/ariakit/issues/3342",
282
+ "apg": "extension",
283
+ "config": { "items": ["Edit", "Share", "Report"] },
284
+ "steps": [
285
+ { "event": "click", "target": "trigger" },
286
+ { "expect": { "attrs": { "trigger": { "data-owns": "menu" } } } }
287
+ ],
288
+ "notes": "The rendered popup is a sibling owned by the trigger element; a library-neutral way to assert ownership is role/aria linkage."
289
+ },
290
+ {
291
+ "id": "menu-button.ariakit.checkbox-item-toggles-on-click",
292
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-checkbox-interactions/test.ts#L11",
293
+ "upstreamTest": "check/uncheck menu item on click",
294
+ "apg": "checkbox",
295
+ "config": {
296
+ "variant": "checkbox-items",
297
+ "items": ["Issues", "Releases"]
298
+ },
299
+ "steps": [
300
+ { "event": "click", "target": "trigger" },
301
+ { "expect": { "attrs": { "menuitem:0": { "aria-checked": "true" } } } },
302
+ { "event": "click", "target": "menuitem:0" },
303
+ {
304
+ "expect": {
305
+ "attrs": {
306
+ "menuitem:0": { "aria-checked": "false" },
307
+ "menuitem:1": { "aria-checked": "false" }
308
+ }
309
+ }
310
+ },
311
+ { "event": "click", "target": "menuitem:1" },
312
+ { "expect": { "attrs": { "menuitem:1": { "aria-checked": "true" } } } },
313
+ { "event": "click", "target": "menuitem:1" },
314
+ { "expect": { "attrs": { "menuitem:1": { "aria-checked": "false" } } } }
315
+ ]
316
+ },
317
+ {
318
+ "id": "menu-button.ariakit.checkbox-item-toggles-on-enter",
319
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-checkbox-interactions/test.ts#L32",
320
+ "upstreamTest": "check/uncheck menu item on enter",
321
+ "apg": "checkbox",
322
+ "config": {
323
+ "variant": "checkbox-items",
324
+ "items": ["Issues", "Releases", "Discussions", "Security alerts"]
325
+ },
326
+ "steps": [
327
+ { "event": "key", "key": "Enter", "target": "trigger" },
328
+ { "event": "key", "key": "ArrowDown", "target": "menuitem:0" },
329
+ { "event": "key", "key": "ArrowDown", "target": "menuitem:1" },
330
+ { "event": "key", "key": "ArrowDown", "target": "menuitem:2" },
331
+ {
332
+ "expect": {
333
+ "focus": "menuitem:2",
334
+ "attrs": { "menuitem:2": { "aria-checked": "false" } }
335
+ }
336
+ },
337
+ { "event": "key", "key": "Enter", "target": "menuitem:2" },
338
+ { "expect": { "attrs": { "menuitem:2": { "aria-checked": "true" } } } },
339
+ { "event": "key", "key": "Enter", "target": "menuitem:2" },
340
+ { "expect": { "attrs": { "menuitem:2": { "aria-checked": "false" } } } }
341
+ ]
342
+ },
343
+ {
344
+ "id": "menu-button.ariakit.checkbox-item-toggles-on-space-at-end",
345
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-checkbox-interactions/test.ts#L54",
346
+ "upstreamTest": "check/uncheck menu item on space",
347
+ "apg": "checkbox",
348
+ "config": {
349
+ "variant": "checkbox-items",
350
+ "items": ["Issues", "Releases", "Discussions", "Security alerts"]
351
+ },
352
+ "steps": [
353
+ { "event": "key", "key": "Space", "target": "trigger" },
354
+ { "event": "key", "key": "End", "target": "menu" },
355
+ {
356
+ "expect": {
357
+ "focus": "menuitem:3",
358
+ "attrs": { "menuitem:3": { "aria-checked": "false" } }
359
+ }
360
+ },
361
+ { "event": "key", "key": "Space", "target": "menuitem:3" },
362
+ { "expect": { "attrs": { "menuitem:3": { "aria-checked": "true" } } } },
363
+ { "event": "key", "key": "Space", "target": "menuitem:3" },
364
+ { "expect": { "attrs": { "menuitem:3": { "aria-checked": "false" } } } }
365
+ ]
366
+ },
367
+ {
368
+ "id": "menu-button.ariakit.checkbox-typeahead-focuses-item",
369
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-checkbox-interactions/test.ts#L74",
370
+ "upstreamTest": "typeahead (checkbox)",
371
+ "apg": "checkbox",
372
+ "config": {
373
+ "variant": "checkbox-items",
374
+ "items": ["Issues", "Releases", "Discussions", "Security alerts"]
375
+ },
376
+ "steps": [
377
+ { "event": "click", "target": "trigger" },
378
+ { "event": "type", "text": "d", "target": "menu" },
379
+ { "expect": { "focus": "menuitem:2" } }
380
+ ]
381
+ },
382
+ {
383
+ "id": "menu-button.ariakit.checkbox-item-updates-trigger-label",
384
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-checkbox-interactions/test.ts#L4",
385
+ "upstreamTest": "update menu button label on menu item check",
386
+ "apg": "extension",
387
+ "config": {
388
+ "variant": "checkbox-items",
389
+ "items": ["Issues", "Releases"]
390
+ },
391
+ "steps": [
392
+ { "expect": { "attrs": { "trigger": { "data-label": "Unwatch" } } } },
393
+ { "event": "click", "target": "trigger" },
394
+ { "event": "click", "target": "menuitem:0" },
395
+ { "expect": { "attrs": { "trigger": { "data-label": "Watch" } } } }
396
+ ],
397
+ "notes": "The trigger's accessible name is controlled by the consumer; asserted as a label change."
398
+ },
399
+ {
400
+ "id": "menu-button.ariakit.radio-item-default-checked",
401
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-radio-interactions/test.ts#L4",
402
+ "upstreamTest": "default checked menu item",
403
+ "apg": "keyboard",
404
+ "config": {
405
+ "variant": "radio-items",
406
+ "items": ["Popular", "Newest", "Oldest"]
407
+ },
408
+ "steps": [
409
+ { "event": "click", "target": "trigger" },
410
+ { "expect": { "attrs": { "menuitem:0": { "aria-checked": "true" } } } }
411
+ ]
412
+ },
413
+ {
414
+ "id": "menu-button.ariakit.radio-item-updates-on-click",
415
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-radio-interactions/test.ts#L9",
416
+ "upstreamTest": "update checked menu item on click",
417
+ "apg": "keyboard",
418
+ "config": {
419
+ "variant": "radio-items",
420
+ "items": ["Popular", "Newest", "Oldest"]
421
+ },
422
+ "steps": [
423
+ { "event": "click", "target": "trigger" },
424
+ { "event": "click", "target": "menuitem:1" },
425
+ { "expect": { "attrs": { "menuitem:1": { "aria-checked": "true" } } } }
426
+ ]
427
+ },
428
+ {
429
+ "id": "menu-button.ariakit.radio-item-updates-on-enter",
430
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-radio-interactions/test.ts#L15",
431
+ "upstreamTest": "update checked menu item on enter",
432
+ "apg": "keyboard",
433
+ "config": {
434
+ "variant": "radio-items",
435
+ "items": ["Popular", "Newest", "Oldest"]
436
+ },
437
+ "steps": [
438
+ { "event": "key", "key": "Enter", "target": "trigger" },
439
+ { "event": "key", "key": "ArrowDown", "target": "menuitem:0" },
440
+ { "event": "key", "key": "Enter", "target": "menuitem:1" },
441
+ { "expect": { "attrs": { "menuitem:1": { "aria-checked": "true" } } } }
442
+ ]
443
+ },
444
+ {
445
+ "id": "menu-button.ariakit.radio-item-updates-on-space",
446
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-radio-interactions/test.ts#L23",
447
+ "upstreamTest": "update checked menu item on space",
448
+ "apg": "keyboard",
449
+ "config": {
450
+ "variant": "radio-items",
451
+ "items": ["Popular", "Newest", "Oldest"]
452
+ },
453
+ "steps": [
454
+ { "event": "key", "key": "Space", "target": "trigger" },
455
+ { "event": "key", "key": "ArrowDown", "target": "menuitem:0" },
456
+ { "event": "key", "key": "Space", "target": "menuitem:1" },
457
+ { "expect": { "attrs": { "menuitem:1": { "aria-checked": "true" } } } }
458
+ ]
459
+ },
460
+ {
461
+ "id": "menu-button.ariakit.submenu-opens-on-click",
462
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-nested-interactions/test.ts#L4",
463
+ "upstreamTest": "show/hide submenu on click",
464
+ "apg": "keyboard",
465
+ "config": {
466
+ "items": ["Open", "Zoom"],
467
+ "submenu": { "at": 1, "items": ["Find", "Find Next"] }
468
+ },
469
+ "steps": [
470
+ { "expect": { "hidden": ["submenu:1"] } },
471
+ { "event": "click", "target": "trigger" },
472
+ { "event": "click", "target": "menuitem:1" },
473
+ { "expect": { "visible": ["submenu:1"], "focus": "menuitem:1/0" } },
474
+ { "event": "click", "target": "menuitem:1/0" },
475
+ { "expect": { "hidden": ["submenu:1", "menu"], "focus": "trigger" } }
476
+ ]
477
+ },
478
+ {
479
+ "id": "menu-button.ariakit.submenu-opens-on-enter",
480
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-nested-interactions/test.ts#L20",
481
+ "upstreamTest": "show/hide submenu on enter",
482
+ "apg": "keyboard",
483
+ "config": {
484
+ "items": ["Open", "Find"],
485
+ "submenu": { "at": 1, "items": ["Search the Web...", "Find..."] }
486
+ },
487
+ "steps": [
488
+ { "event": "key", "key": "Enter", "target": "trigger" },
489
+ { "event": "type", "text": "f", "target": "menu" },
490
+ { "expect": { "focus": "menuitem:1", "hidden": ["submenu:1"] } },
491
+ { "event": "key", "key": "Enter", "target": "menuitem:1" },
492
+ { "expect": { "visible": ["submenu:1"], "focus": "menuitem:1/0" } },
493
+ { "event": "key", "key": "Enter", "target": "menuitem:1/0" },
494
+ { "expect": { "hidden": ["submenu:1", "menu"], "focus": "trigger" } }
495
+ ]
496
+ },
497
+ {
498
+ "id": "menu-button.ariakit.submenu-opens-on-space",
499
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-nested-interactions/test.ts#L35",
500
+ "upstreamTest": "show/hide submenu on space",
501
+ "apg": "keyboard",
502
+ "config": {
503
+ "items": ["Open", "Speech"],
504
+ "submenu": { "at": 1, "items": ["Start Speaking", "Stop Speaking"] }
505
+ },
506
+ "steps": [
507
+ { "event": "key", "key": "Space", "target": "trigger" },
508
+ { "event": "type", "text": "s", "target": "menu" },
509
+ { "expect": { "focus": "menuitem:1", "hidden": ["submenu:1"] } },
510
+ { "event": "key", "key": "Space", "target": "menuitem:1" },
511
+ { "expect": { "visible": ["submenu:1"], "focus": "menuitem:1/0" } },
512
+ { "event": "key", "key": "Space", "target": "menuitem:1/0" },
513
+ { "expect": { "hidden": ["submenu:1", "menu"], "focus": "trigger" } }
514
+ ]
515
+ },
516
+ {
517
+ "id": "menu-button.ariakit.submenu-opens-on-arrow-right-and-closes-left",
518
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-nested-interactions/test.ts#L53",
519
+ "upstreamTest": "show/hide submenu on arrow keys",
520
+ "apg": "keyboard",
521
+ "config": {
522
+ "items": ["Open", "Find"],
523
+ "submenu": {
524
+ "at": 1,
525
+ "items": ["Search the Web...", "Find...", "Find Next"]
526
+ }
527
+ },
528
+ "steps": [
529
+ { "event": "key", "key": "Enter", "target": "trigger" },
530
+ { "event": "type", "text": "f", "target": "menu" },
531
+ { "event": "key", "key": "ArrowLeft", "target": "menuitem:1" },
532
+ { "expect": { "hidden": ["submenu:1"] } },
533
+ { "event": "key", "key": "ArrowRight", "target": "menuitem:1" },
534
+ { "expect": { "visible": ["submenu:1"], "focus": "menuitem:1/0" } },
535
+ { "event": "key", "key": "ArrowDown", "target": "menuitem:1/0" },
536
+ { "expect": { "focus": "menuitem:1/1" } },
537
+ { "event": "key", "key": "ArrowDown", "target": "menuitem:1/1" },
538
+ { "expect": { "focus": "menuitem:1/2" } },
539
+ { "event": "key", "key": "ArrowLeft", "target": "menuitem:1/2" },
540
+ { "expect": { "focus": "menuitem:1", "hidden": ["submenu:1"] } }
541
+ ]
542
+ },
543
+ {
544
+ "id": "menu-button.ariakit.submenu-opens-on-hover",
545
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-nested-interactions/test.ts#L78",
546
+ "upstreamTest": "show/hide submenu on mouse hover",
547
+ "apg": "mouse",
548
+ "config": {
549
+ "items": ["Open", "Find", "Speech"],
550
+ "submenu": { "at": 1, "items": ["Find...", "Find Next"] }
551
+ },
552
+ "steps": [
553
+ { "event": "click", "target": "trigger" },
554
+ { "event": "hover", "target": "menuitem:1" },
555
+ { "expect": { "focus": "menuitem:1", "visible": ["submenu:1"] } },
556
+ { "event": "hover", "target": "menuitem:2" },
557
+ { "expect": { "focus": "menuitem:2", "hidden": ["submenu:1"] } }
558
+ ]
559
+ },
560
+ {
561
+ "id": "menu-button.ariakit.escape-closes-submenu-and-menu",
562
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-nested-interactions/test.ts#L96",
563
+ "upstreamTest": "hide submenu on escape",
564
+ "apg": "keyboard",
565
+ "config": {
566
+ "items": ["Open", "Find"],
567
+ "submenu": { "at": 1, "items": ["Find...", "Find Next"] }
568
+ },
569
+ "steps": [
570
+ { "event": "click", "target": "trigger" },
571
+ { "event": "click", "target": "menuitem:1" },
572
+ { "event": "hover", "target": "menuitem:1/1" },
573
+ { "event": "key", "key": "Escape", "target": "menuitem:1/1" },
574
+ { "expect": { "hidden": ["submenu:1", "menu"], "focus": "trigger" } }
575
+ ]
576
+ },
577
+ {
578
+ "id": "menu-button.ariakit.typeahead-in-submenu",
579
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-nested-interactions/test.ts#L106",
580
+ "upstreamTest": "typeahead on submenu",
581
+ "apg": "keyboard",
582
+ "config": {
583
+ "items": ["Open", "Find"],
584
+ "submenu": {
585
+ "at": 1,
586
+ "items": [
587
+ "Search the Web...",
588
+ "Find...",
589
+ "Find Next",
590
+ "Find Previous"
591
+ ]
592
+ }
593
+ },
594
+ "steps": [
595
+ { "event": "click", "target": "trigger" },
596
+ { "event": "type", "text": "f", "target": "menu" },
597
+ { "event": "key", "key": "Enter", "target": "menuitem:1" },
598
+ { "expect": { "focus": "menuitem:1/0" } },
599
+ { "event": "type", "text": "f", "target": "menuitem:1/0" },
600
+ { "expect": { "focus": "menuitem:1/1" } },
601
+ { "event": "type", "text": "fffff", "target": "menuitem:1/1" },
602
+ { "expect": { "focus": "menuitem:1/3" } }
603
+ ]
604
+ },
605
+ {
606
+ "id": "menu-button.ariakit.disabled-submenu-item-does-not-stay-active",
607
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-nested-interactions/test.ts#L117",
608
+ "upstreamTest": "blur submenu button on mouse leave after hovering over disabled submenu item",
609
+ "apg": "mouse",
610
+ "config": {
611
+ "items": ["Open", "Speech"],
612
+ "submenu": {
613
+ "at": 1,
614
+ "items": ["Disable", "Start Speaking", "Stop Speaking"]
615
+ }
616
+ },
617
+ "steps": [
618
+ { "event": "click", "target": "trigger" },
619
+ { "event": "hover", "target": "menuitem:1" },
620
+ { "event": "hover", "target": "menuitem:1/0" },
621
+ { "event": "hover", "target": "outside" },
622
+ {
623
+ "expect": {
624
+ "hidden": ["submenu:1"],
625
+ "attrs": { "menuitem:1": { "data-active-item": null } }
626
+ }
627
+ }
628
+ ]
629
+ },
630
+ {
631
+ "id": "menu-button.ariakit.checkbox-parent-values-sync",
632
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-values-interactions/test.ts#L38",
633
+ "upstreamTest": "default values",
634
+ "apg": "checkbox",
635
+ "config": {
636
+ "variant": "checkbox-items",
637
+ "items": ["Apple", "Banana", "Grape", "Orange"]
638
+ },
639
+ "steps": [
640
+ { "expect": { "attrs": { "trigger": { "aria-expanded": "false" } } } }
641
+ ],
642
+ "notes": "Value aggregation of controlled/uncontrolled checkbox items is a controlled-component concern; covered by the toggle scenarios."
643
+ },
644
+ {
645
+ "id": "menu-button.ariakit.values-navigation-skips-disabled-hidden",
646
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-values-interactions/test.ts#L172",
647
+ "upstreamTest": "navigate with keyboard ignoring disabled items",
648
+ "apg": "keyboard",
649
+ "config": {
650
+ "variant": "checkbox-items",
651
+ "items": ["Apple", "Banana", "Grape", "Orange"]
652
+ },
653
+ "steps": [
654
+ { "event": "key", "key": "Enter", "target": "trigger" },
655
+ { "expect": { "focus": "menuitem:0" } },
656
+ { "event": "key", "key": "ArrowDown", "target": "menuitem:0" },
657
+ { "expect": { "focus": "menuitem:1" } },
658
+ { "event": "key", "key": "ArrowDown", "target": "menuitem:1" },
659
+ { "expect": { "focus": "menuitem:3" } }
660
+ ],
661
+ "notes": "A hidden disabled item is skipped when moving focus with arrow keys."
662
+ },
663
+ {
664
+ "id": "menu-button.ariakit.syncs-boolean-items-with-menu-values",
665
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-item-checked/test.ts#L5",
666
+ "upstreamTest": "syncs boolean item checked state with menu values",
667
+ "apg": "checkbox",
668
+ "config": {
669
+ "variant": "checkbox-items",
670
+ "items": ["Show sidebar", "Minimap"]
671
+ },
672
+ "steps": [
673
+ { "event": "click", "target": "trigger" },
674
+ {
675
+ "expect": {
676
+ "attrs": {
677
+ "menuitem:0": { "aria-checked": "true" },
678
+ "menuitem:1": { "aria-checked": "true" }
679
+ }
680
+ }
681
+ }
682
+ ]
683
+ },
684
+ {
685
+ "id": "menu-button.ariakit.radio-default-checked-is-not-leaked-as-prop",
686
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-item-checked/test.ts#L18",
687
+ "upstreamTest": "does not leak defaultChecked to the rendered menu item",
688
+ "apg": "extension",
689
+ "config": {
690
+ "variant": "radio-items",
691
+ "items": ["Compact", "Comfortable"]
692
+ },
693
+ "steps": [
694
+ {
695
+ "expect": {
696
+ "attrs": {
697
+ "menuitem:0": {
698
+ "aria-checked": "true",
699
+ "data-default-checked-prop": null
700
+ }
701
+ }
702
+ }
703
+ }
704
+ ]
705
+ },
706
+ {
707
+ "id": "menu-button.ariakit.enabled-menu-button-opens-on-hover",
708
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-button-disabled/test.ts#L7",
709
+ "upstreamTest": "enabled menu button opens its menu on hover",
710
+ "apg": "mouse",
711
+ "config": { "items": ["Edit", "Share"] },
712
+ "steps": [
713
+ { "event": "hover", "target": "trigger" },
714
+ { "expect": { "visible": ["menu"] } }
715
+ ]
716
+ },
717
+ {
718
+ "id": "menu-button.ariakit.disabled-menu-button-does-not-open-on-hover",
719
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-button-disabled/test.ts#L13",
720
+ "upstreamTest": "disabled menu button does not open its menu on hover",
721
+ "apg": "extension",
722
+ "config": { "triggerDisabled": true, "items": ["Edit", "Share"] },
723
+ "steps": [
724
+ { "event": "hover", "target": "trigger" },
725
+ {
726
+ "expect": {
727
+ "hidden": ["menu"],
728
+ "attrs": { "trigger": { "disabled": "" } }
729
+ }
730
+ }
731
+ ]
732
+ },
733
+ {
734
+ "id": "menu-button.ariakit.disabled-menu-button-opens-on-hover-when-opted-in",
735
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-button-disabled/test.ts#L37",
736
+ "upstreamTest": "disabled menu button opens its menu on hover when the consumer opts in",
737
+ "apg": "extension",
738
+ "config": {
739
+ "triggerDisabled": true,
740
+ "openOnHoverDisabled": true,
741
+ "items": ["Edit", "Share"]
742
+ },
743
+ "steps": [
744
+ { "event": "hover", "target": "trigger" },
745
+ { "expect": { "visible": ["menu"] } }
746
+ ],
747
+ "notes": "Consumer explicitly opts a disabled trigger back into hover-open; a truly disabled native control still stays closed."
748
+ },
749
+ {
750
+ "id": "menu-button.ariakit.context-menu-opens-on-right-click",
751
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-context-interactions/test.ts#L4",
752
+ "upstreamTest": "show context menu and hide it with escape",
753
+ "apg": "keyboard",
754
+ "config": {
755
+ "variant": "context-menu",
756
+ "items": ["Back", "Reload", "Inspect"]
757
+ },
758
+ "steps": [
759
+ { "expect": { "hidden": ["menu"] } },
760
+ { "event": "contextmenu", "target": "trigger" },
761
+ { "expect": { "visible": ["menu"], "focus": "menu" } },
762
+ { "event": "key", "key": "Escape", "target": "menu" },
763
+ { "expect": { "hidden": ["menu"] } }
764
+ ]
765
+ },
766
+ {
767
+ "id": "menu-button.ariakit.context-menu-closes-on-outside-click",
768
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-context-interactions/test.ts#L15",
769
+ "upstreamTest": "show context menu and hide it by clicking outside",
770
+ "apg": "mouse",
771
+ "config": {
772
+ "variant": "context-menu",
773
+ "items": ["Back", "Reload", "Inspect"]
774
+ },
775
+ "steps": [
776
+ { "event": "contextmenu", "target": "trigger" },
777
+ { "expect": { "visible": ["menu"] } },
778
+ { "event": "click", "target": "outside" },
779
+ { "expect": { "hidden": ["menu"] } }
780
+ ]
781
+ },
782
+ {
783
+ "id": "menu-button.ariakit.context-menu-keyboard-navigation",
784
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-context-interactions/test.ts#L40",
785
+ "upstreamTest": "navigate through context menu with keyboard",
786
+ "apg": "keyboard",
787
+ "config": {
788
+ "variant": "context-menu",
789
+ "items": ["Back", "Reload", "Inspect"]
790
+ },
791
+ "steps": [
792
+ { "event": "contextmenu", "target": "trigger" },
793
+ { "expect": { "focus": "menu" } },
794
+ { "event": "key", "key": "ArrowDown", "target": "menu" },
795
+ { "expect": { "focus": "menuitem:0" } },
796
+ { "event": "key", "key": "ArrowDown", "target": "menuitem:0" },
797
+ { "expect": { "focus": "menuitem:1" } },
798
+ { "event": "key", "key": "Home", "target": "menuitem:1" },
799
+ { "expect": { "focus": "menuitem:0" } },
800
+ { "event": "key", "key": "End", "target": "menuitem:0" },
801
+ { "expect": { "focus": "menuitem:2" } }
802
+ ]
803
+ },
804
+ {
805
+ "id": "menu-button.ariakit.context-menu-keeps-dismiss-button-outside-menu",
806
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-context-interactions/test.ts#L27",
807
+ "upstreamTest": "context menu keeps a dismiss button outside the menu",
808
+ "apg": "extension",
809
+ "config": { "variant": "context-menu", "items": ["Back", "Reload"] },
810
+ "steps": [
811
+ { "event": "click", "target": "trigger" },
812
+ {
813
+ "expect": {
814
+ "visible": ["menu", "dismiss"],
815
+ "attrs": { "dismiss": { "role": "button" } }
816
+ }
817
+ }
818
+ ],
819
+ "notes": "ARIA forbids a button among a menu's owned elements, so the dismiss control renders as a sibling."
820
+ },
821
+ {
822
+ "id": "menu-button.ariakit.modal-menu-exposes-only-items",
823
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-4270/test.ts#L5",
824
+ "upstreamTest": "modal menu exposes only its items to assistive technology",
825
+ "apg": "aria",
826
+ "config": { "modal": true, "items": ["Back", "Reload"] },
827
+ "steps": [
828
+ { "event": "click", "target": "trigger" },
829
+ {
830
+ "expect": {
831
+ "visible": ["menu"],
832
+ "attrs": {
833
+ "menuitem:0": { "role": "menuitem" },
834
+ "menuitem:1": { "role": "menuitem" }
835
+ }
836
+ }
837
+ }
838
+ ]
839
+ },
840
+ {
841
+ "id": "menu-button.ariakit.modal-menu-keeps-trigger-accessible",
842
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-4270/test.ts#L19",
843
+ "upstreamTest": "modal menu keeps its menu button exposed to assistive technology",
844
+ "apg": "aria",
845
+ "config": { "modal": true, "items": ["Back", "Reload"] },
846
+ "steps": [
847
+ { "event": "click", "target": "trigger" },
848
+ {
849
+ "expect": {
850
+ "attrs": {
851
+ "trigger": { "aria-haspopup": "menu", "aria-expanded": "true" }
852
+ }
853
+ }
854
+ }
855
+ ]
856
+ },
857
+ {
858
+ "id": "menu-button.ariakit.disclosure-label-updates",
859
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-7315/test.ts#L5",
860
+ "upstreamTest": "does not keep the previous disclosure label",
861
+ "apg": "extension",
862
+ "config": { "items": ["Edit", "Share"] },
863
+ "steps": [
864
+ { "event": "click", "target": "trigger" },
865
+ { "event": "click", "target": "menuitem:0" },
866
+ { "expect": { "attrs": { "trigger": { "aria-label": "Open menu" } } } }
867
+ ],
868
+ "notes": "The disclosure label resets after an item is chosen instead of keeping the last action."
869
+ },
870
+ {
871
+ "id": "menu-button.ariakit.always-visible-menu-moves-focus-while-closed",
872
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-always-visible/test.ts#L5",
873
+ "upstreamTest": "moves focus through the menu while its store is closed",
874
+ "apg": "extension",
875
+ "config": { "alwaysVisible": true, "items": ["Edit", "Share", "Report"] },
876
+ "steps": [
877
+ { "event": "focus", "target": "menuitem:0" },
878
+ { "event": "key", "key": "ArrowDown", "target": "menuitem:0" },
879
+ { "expect": { "focus": "menuitem:1" } }
880
+ ]
881
+ },
882
+ {
883
+ "id": "menu-button.ariakit.checkbox-item-space-after-reopen-does-not-toggle-during-typeahead",
884
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-values-interactions/test.ts#L192",
885
+ "upstreamTest": "reset radioControlled externally",
886
+ "apg": "checkbox",
887
+ "config": {
888
+ "variant": "checkbox-items",
889
+ "items": ["Show sidebar", "Minimap"]
890
+ },
891
+ "steps": [
892
+ { "event": "click", "target": "trigger" },
893
+ { "event": "click", "target": "menuitem:1" },
894
+ { "expect": { "attrs": { "menuitem:1": { "aria-checked": "true" } } } }
895
+ ]
896
+ }
897
+ ],
898
+ "skipped": [
899
+ {
900
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-values-interactions/test.ts#L13",
901
+ "reason": "Visual aggregation of controlled/uncontrolled checkboxes and radios is a controlled-component API concern (React-only)."
902
+ },
903
+ {
904
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-4938/test-browser.ts",
905
+ "reason": "Scroll-into-view on activation is a positioning/scrolling concern."
906
+ },
907
+ {
908
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-3214/test-chrome.ts",
909
+ "reason": "React update-depth regression check, not menu semantics."
910
+ },
911
+ {
912
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-4270/test-chrome.ts",
913
+ "reason": "Accessible-name wiring from the trigger is covered by menu-button.ariakit.modal-menu-keeps-trigger-accessible."
914
+ },
915
+ {
916
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-4904/test-chrome.ts",
917
+ "reason": "Popup-window (window.open) behaviour is environment-specific."
918
+ },
919
+ {
920
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menu-7571/test-browser.ts",
921
+ "reason": "Scroll-position preservation with an external store is positioning/animation."
922
+ }
923
+ ]
924
+ }