@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,1080 @@
1
+ {
2
+ "pattern": "menu-button",
3
+ "source": "react-aria",
4
+ "commit": "99e610236887da619ad9d54a1cd87983166c043d",
5
+ "license": "Apache-2.0",
6
+ "scenarios": [
7
+ {
8
+ "id": "menu-button.react-aria.menu-trigger-opens-and-activates",
9
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/Menu.test.tsx#L624",
10
+ "upstreamTest": "should support menu trigger",
11
+ "apg": "keyboard",
12
+ "config": {
13
+ "items": ["Open", "Rename…", "Duplicate", "Share…", "Delete…"]
14
+ },
15
+ "steps": [
16
+ { "expect": { "attrs": { "trigger": { "data-pressed": null } } } },
17
+ { "event": "click", "target": "trigger" },
18
+ {
19
+ "expect": {
20
+ "visible": ["menu"],
21
+ "attrs": { "trigger": { "data-pressed": "true" } }
22
+ }
23
+ },
24
+ { "event": "click", "target": "menuitem:1" },
25
+ {
26
+ "expect": {
27
+ "hidden": ["menu"],
28
+ "events": { "onAction": ["menuitem:1"] }
29
+ }
30
+ }
31
+ ]
32
+ },
33
+ {
34
+ "id": "menu-button.react-aria.trigger-aria-haspopup-and-expanded",
35
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria/test/menu/useMenuTrigger.test.js#L46",
36
+ "upstreamTest": "should return default props for menu and menu trigger / proper aria props if menu is open",
37
+ "apg": "aria",
38
+ "config": { "items": ["One", "Two"] },
39
+ "steps": [
40
+ {
41
+ "expect": {
42
+ "attrs": {
43
+ "trigger": { "aria-haspopup": "true", "aria-expanded": null }
44
+ }
45
+ }
46
+ },
47
+ { "event": "click", "target": "trigger" },
48
+ {
49
+ "expect": {
50
+ "attrs": {
51
+ "trigger": { "aria-haspopup": "true", "aria-expanded": "true" }
52
+ }
53
+ }
54
+ }
55
+ ]
56
+ },
57
+ {
58
+ "id": "menu-button.react-aria.trigger-disabled-does-not-toggle",
59
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria/test/menu/useMenuTrigger.test.js#L89",
60
+ "upstreamTest": "doesn't toggle the menu if isDisabled",
61
+ "apg": "extension",
62
+ "config": { "items": ["One", "Two"], "triggerDisabled": true },
63
+ "steps": [
64
+ { "event": "click", "target": "trigger" },
65
+ { "expect": { "hidden": ["menu"] } }
66
+ ]
67
+ },
68
+ {
69
+ "id": "menu-button.react-aria.arrow-down-opens-and-focuses-first",
70
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/@adobe/react-spectrum/test/menu/MenuTrigger.test.js#L604",
71
+ "upstreamTest": "should focus the first item on Alt+ArrowDown if no selectedKeys specified",
72
+ "apg": "keyboard",
73
+ "config": { "items": ["One", "Two", "Three"] },
74
+ "steps": [
75
+ { "event": "focus", "target": "trigger" },
76
+ { "event": "key", "key": "Alt+ArrowDown", "target": "trigger" },
77
+ { "expect": { "visible": ["menu"], "focus": "menuitem:0" } }
78
+ ]
79
+ },
80
+ {
81
+ "id": "menu-button.react-aria.arrow-up-opens-and-focuses-last",
82
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/@adobe/react-spectrum/test/menu/MenuTrigger.test.js#L597",
83
+ "upstreamTest": "should focus the last item on Alt+ArrowUp if no selectedKeys specified",
84
+ "apg": "keyboard",
85
+ "config": { "items": ["One", "Two", "Three"] },
86
+ "steps": [
87
+ { "event": "focus", "target": "trigger" },
88
+ { "event": "key", "key": "Alt+ArrowUp", "target": "trigger" },
89
+ { "expect": { "visible": ["menu"], "focus": "menuitem:2" } }
90
+ ]
91
+ },
92
+ {
93
+ "id": "menu-button.react-aria.opens-on-long-press-not-short-press",
94
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/@adobe/react-spectrum/test/menu/MenuTrigger.test.js#L471",
95
+ "upstreamTest": "should open the menu on longPress / short press does not open",
96
+ "apg": "extension",
97
+ "config": { "items": ["One", "Two"], "longPress": true },
98
+ "steps": [
99
+ { "event": "pointerdown", "pointerType": "touch", "target": "trigger" },
100
+ { "event": "wait", "ms": 500 },
101
+ { "event": "pointerup", "pointerType": "touch", "target": "trigger" },
102
+ { "expect": { "visible": ["menu"] } }
103
+ ],
104
+ "notes": "Short-press and plain click paths are asserted by the click scenarios; longPress is an extension."
105
+ },
106
+ {
107
+ "id": "menu-button.react-aria.long-press-alt-arrow-opens-and-focuses-selected",
108
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/@adobe/react-spectrum/test/menu/MenuTrigger.test.js#L563",
109
+ "upstreamTest": "should focus the selected item on menu open",
110
+ "apg": "extension",
111
+ "config": {
112
+ "variant": "radio-items",
113
+ "items": ["Foo", "Bar"],
114
+ "selected": 1
115
+ },
116
+ "steps": [
117
+ { "event": "focus", "target": "trigger" },
118
+ { "event": "key", "key": "Alt+ArrowDown", "target": "trigger" },
119
+ {
120
+ "expect": {
121
+ "focus": "menuitem:1",
122
+ "attrs": { "menuitem:1": { "aria-checked": "true" } }
123
+ }
124
+ }
125
+ ]
126
+ },
127
+ {
128
+ "id": "menu-button.react-aria.disabled-items-skipped-in-keyboard-navigation",
129
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/Menu.test.tsx#L570",
130
+ "upstreamTest": "should support isDisabled prop on items",
131
+ "apg": "keyboard",
132
+ "config": { "items": ["Cat", "Dog", "Kangaroo"], "disabled": [1] },
133
+ "steps": [
134
+ { "event": "focus", "target": "menuitem:0" },
135
+ { "event": "key", "key": "ArrowDown", "target": "menuitem:0" },
136
+ {
137
+ "expect": {
138
+ "focus": "menuitem:2",
139
+ "attrs": { "menuitem:1": { "aria-disabled": "true" } }
140
+ }
141
+ }
142
+ ]
143
+ },
144
+ {
145
+ "id": "menu-button.react-aria.selection-toggle-multiple-on-click",
146
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/Menu.test.tsx#L450",
147
+ "upstreamTest": "should support selection state",
148
+ "apg": "keyboard",
149
+ "config": {
150
+ "variant": "checkbox-items",
151
+ "selectionMode": "multiple",
152
+ "items": ["Cat", "Dog", "Kangaroo"]
153
+ },
154
+ "steps": [
155
+ {
156
+ "expect": {
157
+ "attrs": {
158
+ "menuitem:0": {
159
+ "role": "menuitemcheckbox",
160
+ "aria-checked": "false"
161
+ }
162
+ }
163
+ }
164
+ },
165
+ { "event": "click", "target": "menuitem:0" },
166
+ { "expect": { "attrs": { "menuitem:0": { "aria-checked": "true" } } } },
167
+ { "event": "click", "target": "menuitem:0" },
168
+ { "expect": { "attrs": { "menuitem:0": { "aria-checked": "false" } } } }
169
+ ]
170
+ },
171
+ {
172
+ "id": "menu-button.react-aria.section-level-selection-modes",
173
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/Menu.test.tsx#L469",
174
+ "upstreamTest": "should support section-level selection",
175
+ "apg": "keyboard",
176
+ "config": {
177
+ "groups": [
178
+ {
179
+ "selectionMode": "multiple",
180
+ "items": ["Lettuce", "Tomato", "Onion"],
181
+ "selected": [0]
182
+ },
183
+ {
184
+ "selectionMode": "single",
185
+ "items": ["Ham", "Tuna", "Tofu"],
186
+ "selected": [0]
187
+ }
188
+ ]
189
+ },
190
+ "steps": [
191
+ {
192
+ "expect": {
193
+ "attrs": {
194
+ "menuitem:0": {
195
+ "role": "menuitemcheckbox",
196
+ "aria-checked": "true"
197
+ },
198
+ "menuitem:1": {
199
+ "role": "menuitemcheckbox",
200
+ "aria-checked": "false"
201
+ }
202
+ }
203
+ }
204
+ },
205
+ { "event": "click", "target": "menuitem:1" },
206
+ {
207
+ "expect": {
208
+ "attrs": {
209
+ "menuitem:0": { "aria-checked": "true" },
210
+ "menuitem:1": { "aria-checked": "true" }
211
+ }
212
+ }
213
+ },
214
+ {
215
+ "expect": {
216
+ "attrs": {
217
+ "menuitem:3": { "role": "menuitemradio", "aria-checked": "true" }
218
+ }
219
+ }
220
+ },
221
+ { "event": "click", "target": "menuitem:4" },
222
+ {
223
+ "expect": {
224
+ "attrs": {
225
+ "menuitem:3": { "aria-checked": "false" },
226
+ "menuitem:4": { "aria-checked": "true" }
227
+ }
228
+ }
229
+ },
230
+ { "event": "key", "key": "ArrowUp", "target": "menuitem:4" },
231
+ { "event": "key", "key": "ArrowUp", "target": "menuitem:3" },
232
+ { "event": "key", "key": "ArrowUp", "target": "menuitem:2" },
233
+ { "event": "key", "key": "ArrowUp", "target": "menuitem:1" },
234
+ { "expect": { "focus": "menuitem:0" } }
235
+ ]
236
+ },
237
+ {
238
+ "id": "menu-button.react-aria.escape-key-behavior-none-keeps-selection",
239
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/Menu.test.tsx#L546",
240
+ "upstreamTest": "should prevent Esc from clearing selection if escapeKeyBehavior is none",
241
+ "apg": "extension",
242
+ "config": {
243
+ "variant": "checkbox-items",
244
+ "selectionMode": "multiple",
245
+ "items": ["Cat", "Dog"],
246
+ "escapeKeyBehavior": "none"
247
+ },
248
+ "steps": [
249
+ { "event": "click", "target": "menuitem:0" },
250
+ { "expect": { "attrs": { "menuitem:0": { "aria-checked": "true" } } } },
251
+ { "event": "key", "key": "Escape", "target": "menuitem:0" },
252
+ { "expect": { "attrs": { "menuitem:0": { "aria-checked": "true" } } } }
253
+ ]
254
+ },
255
+ {
256
+ "id": "menu-button.react-aria.on-action-fires-for-menu-and-item",
257
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/Menu.test.tsx#L605",
258
+ "upstreamTest": "should support onAction on menu and menu items",
259
+ "apg": "keyboard",
260
+ "config": { "items": ["Cat", "Dog", "Kangaroo"] },
261
+ "steps": [
262
+ { "event": "click", "target": "menuitem:0" },
263
+ {
264
+ "expect": {
265
+ "events": {
266
+ "onAction": ["menuitem:0"],
267
+ "onItemAction": ["menuitem:0"]
268
+ }
269
+ }
270
+ }
271
+ ]
272
+ },
273
+ {
274
+ "id": "menu-button.react-aria.press-events-on-items",
275
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/Menu.test.tsx#L1880",
276
+ "upstreamTest": "should support press events on menu items",
277
+ "apg": "extension",
278
+ "config": { "items": ["Cat", "Dog"] },
279
+ "steps": [
280
+ { "event": "click", "target": "trigger" },
281
+ { "event": "click", "target": "menuitem:0" },
282
+ {
283
+ "expect": {
284
+ "events": {
285
+ "onAction": ["menuitem:0"],
286
+ "onPressStart": ["menuitem:0"],
287
+ "onPress": ["menuitem:0"],
288
+ "onClick": ["menuitem:0"]
289
+ }
290
+ }
291
+ }
292
+ ]
293
+ },
294
+ {
295
+ "id": "menu-button.react-aria.press-events-keyboard",
296
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/Menu.test.tsx#L1964",
297
+ "upstreamTest": "should support press events on menu items when using keyboard",
298
+ "apg": "extension",
299
+ "config": { "items": ["Cat", "Dog"] },
300
+ "steps": [
301
+ { "event": "focus", "target": "trigger" },
302
+ { "event": "key", "key": "Enter", "target": "trigger" },
303
+ { "event": "key", "key": "Enter", "target": "menuitem:0" },
304
+ {
305
+ "expect": {
306
+ "events": {
307
+ "onAction": ["menuitem:0"],
308
+ "onPressStart": ["menuitem:0"],
309
+ "onClick": ["menuitem:0"]
310
+ }
311
+ }
312
+ }
313
+ ]
314
+ },
315
+ {
316
+ "id": "menu-button.react-aria.press-events-drag-release",
317
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/Menu.test.tsx#L1938",
318
+ "upstreamTest": "should support press events on menu items when dragging and releasing",
319
+ "apg": "mouse",
320
+ "config": { "items": ["Cat", "Dog"] },
321
+ "steps": [
322
+ { "event": "pointerdown", "target": "trigger" },
323
+ { "event": "pointerup", "target": "menuitem:0" },
324
+ {
325
+ "expect": {
326
+ "events": { "onAction": ["menuitem:0"], "onClick": ["menuitem:0"] }
327
+ }
328
+ }
329
+ ]
330
+ },
331
+ {
332
+ "id": "menu-button.react-aria.should-close-on-select-false-on-menu",
333
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/Menu.test.tsx#L768",
334
+ "upstreamTest": "should not close the menu when shouldCloseOnSelect is false",
335
+ "apg": "extension",
336
+ "config": {
337
+ "items": ["Open", "Rename…", "Delete…"],
338
+ "shouldCloseOnSelect": false
339
+ },
340
+ "steps": [
341
+ { "event": "click", "target": "trigger" },
342
+ { "event": "click", "target": "menuitem:0" },
343
+ { "expect": { "visible": ["menu"] } }
344
+ ]
345
+ },
346
+ {
347
+ "id": "menu-button.react-aria.should-close-on-select-false-on-item",
348
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/Menu.test.tsx#L801",
349
+ "upstreamTest": "should not close individual menu item when shouldCloseOnSelect=false",
350
+ "apg": "extension",
351
+ "config": {
352
+ "items": ["Open", "Rename…", "Delete…"],
353
+ "itemShouldCloseOnSelect": [0]
354
+ },
355
+ "steps": [
356
+ { "event": "click", "target": "trigger" },
357
+ { "event": "click", "target": "menuitem:0" },
358
+ { "expect": { "visible": ["menu"] } },
359
+ { "event": "click", "target": "menuitem:1" },
360
+ { "expect": { "hidden": ["menu"] } }
361
+ ]
362
+ },
363
+ {
364
+ "id": "menu-button.react-aria.context-menu-right-click-opens",
365
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/Menu.test.tsx#L658",
366
+ "upstreamTest": "should support a context menu trigger",
367
+ "apg": "extension",
368
+ "config": {
369
+ "variant": "context-menu",
370
+ "items": ["Open", "Rename…", "Duplicate", "Share…", "Delete…"]
371
+ },
372
+ "steps": [
373
+ {
374
+ "expect": {
375
+ "hidden": ["menu"],
376
+ "attrs": {
377
+ "trigger": { "aria-haspopup": null, "aria-expanded": null }
378
+ }
379
+ }
380
+ },
381
+ { "event": "click", "target": "trigger" },
382
+ { "expect": { "hidden": ["menu"] } },
383
+ { "event": "contextmenu", "target": "trigger" },
384
+ { "expect": { "visible": ["menu"] } },
385
+ { "event": "click", "target": "menuitem:1" },
386
+ {
387
+ "expect": {
388
+ "hidden": ["menu"],
389
+ "events": { "onAction": ["menuitem:1"] }
390
+ }
391
+ }
392
+ ]
393
+ },
394
+ {
395
+ "id": "menu-button.react-aria.context-menu-right-click-outside-closes",
396
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/Menu.test.tsx#L708",
397
+ "upstreamTest": "should close a context menu when right clicking outside",
398
+ "apg": "extension",
399
+ "config": {
400
+ "variant": "context-menu",
401
+ "items": ["Open", "Rename…", "Duplicate"]
402
+ },
403
+ "steps": [
404
+ { "event": "contextmenu", "target": "trigger" },
405
+ { "expect": { "visible": ["menu"] } },
406
+ { "event": "contextmenu", "target": "menu" },
407
+ { "expect": { "visible": ["menu"] } },
408
+ { "event": "contextmenu", "target": "outside" },
409
+ { "expect": { "hidden": ["menu"] } }
410
+ ]
411
+ },
412
+ {
413
+ "id": "menu-button.react-aria.use-context-menu-right-click-callback",
414
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria/test/interactions/useContextMenu.test.tsx#L35",
415
+ "upstreamTest": "calls onContextMenu on right click",
416
+ "apg": "extension",
417
+ "config": { "variant": "context-menu", "items": ["Action"] },
418
+ "steps": [
419
+ { "event": "contextmenu", "target": "trigger" },
420
+ {
421
+ "expect": { "events": { "onContextMenu": [[{ "x": 20, "y": 20 }]] } }
422
+ }
423
+ ],
424
+ "notes": "Coordinates are relative to the trigger rect; asserted as a pointer event was delivered."
425
+ },
426
+ {
427
+ "id": "menu-button.react-aria.use-context-menu-prevents-default",
428
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria/test/interactions/useContextMenu.test.tsx#L59",
429
+ "upstreamTest": "prevents default and stops propagation on contextmenu event",
430
+ "apg": "extension",
431
+ "config": { "variant": "context-menu", "items": ["Action"] },
432
+ "steps": [
433
+ { "event": "contextmenu", "target": "trigger" },
434
+ {
435
+ "expect": {
436
+ "events": {
437
+ "onContextMenuDefaultPrevented": [true],
438
+ "onContextMenuPropagationStopped": [true]
439
+ }
440
+ }
441
+ }
442
+ ]
443
+ },
444
+ {
445
+ "id": "menu-button.react-aria.use-context-menu-ctrl-enter-macos",
446
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria/test/interactions/useContextMenu.test.tsx#L103",
447
+ "upstreamTest": "triggers onContextMenu via Ctrl+Enter on macOS when no contextmenu event fires",
448
+ "apg": "extension",
449
+ "config": {
450
+ "variant": "context-menu",
451
+ "platform": "macOS",
452
+ "items": ["Action"]
453
+ },
454
+ "steps": [
455
+ { "event": "key", "key": "Ctrl+Enter", "target": "trigger" },
456
+ { "event": "wait", "ms": 10 },
457
+ { "expect": { "events": { "onContextMenu": [[]] } } }
458
+ ]
459
+ },
460
+ {
461
+ "id": "menu-button.react-aria.use-context-menu-long-press-ios",
462
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria/test/interactions/useContextMenu.test.tsx#L185",
463
+ "upstreamTest": "triggers onContextMenu via long press on iOS",
464
+ "apg": "extension",
465
+ "config": {
466
+ "variant": "context-menu",
467
+ "platform": "iOS",
468
+ "items": ["Action"]
469
+ },
470
+ "steps": [
471
+ { "event": "pointerdown", "pointerType": "touch", "target": "trigger" },
472
+ { "event": "wait", "ms": 500 },
473
+ { "event": "pointerup", "pointerType": "touch", "target": "trigger" },
474
+ { "expect": { "events": { "onContextMenu": [[]] } } }
475
+ ]
476
+ },
477
+ {
478
+ "id": "menu-button.react-aria.submenu-trigger-aria-and-open-on-hover",
479
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/Menu.test.tsx#L931",
480
+ "upstreamTest": "should support a submenu trigger",
481
+ "apg": "keyboard",
482
+ "config": {
483
+ "items": ["Open", "Rename…", "Duplicate", "Share…", "Delete…"],
484
+ "submenu": { "at": 3, "items": ["Email", "SMS", "X"] }
485
+ },
486
+ "steps": [
487
+ {
488
+ "expect": {
489
+ "attrs": {
490
+ "menuitem:3": {
491
+ "aria-haspopup": "menu",
492
+ "aria-expanded": "false",
493
+ "data-has-submenu": "true"
494
+ }
495
+ }
496
+ }
497
+ },
498
+ { "event": "hover", "target": "menuitem:3" },
499
+ {
500
+ "expect": {
501
+ "attrs": {
502
+ "menuitem:3": { "aria-expanded": "true", "data-open": "true" }
503
+ },
504
+ "visible": ["submenu:1"]
505
+ }
506
+ },
507
+ { "event": "click", "target": "menuitem:3/0" },
508
+ {
509
+ "expect": {
510
+ "hidden": ["menu", "submenu:1"],
511
+ "events": { "onAction": ["menuitem:3/0"] }
512
+ }
513
+ }
514
+ ]
515
+ },
516
+ {
517
+ "id": "menu-button.react-aria.nested-submenu-triggers",
518
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/Menu.test.tsx#L998",
519
+ "upstreamTest": "should support nested submenu triggers",
520
+ "apg": "keyboard",
521
+ "config": {
522
+ "items": ["Open", "Rename…", "Duplicate", "Share…", "Delete…"],
523
+ "submenu": {
524
+ "at": 3,
525
+ "items": ["Email…", "SMS", "X"],
526
+ "nestedSubmenu": { "at": 0, "items": ["Work", "Personal"] }
527
+ }
528
+ },
529
+ "steps": [
530
+ { "event": "hover", "target": "menuitem:3" },
531
+ { "expect": { "visible": ["submenu:1"] } },
532
+ { "event": "hover", "target": "menuitem:3/0" },
533
+ { "expect": { "visible": ["submenu:1/1"] } },
534
+ { "event": "click", "target": "menuitem:3/0/0" },
535
+ {
536
+ "expect": {
537
+ "hidden": ["submenu:1/1", "submenu:1"],
538
+ "events": { "onAction": ["menuitem:3/0/0"] }
539
+ }
540
+ }
541
+ ]
542
+ },
543
+ {
544
+ "id": "menu-button.react-aria.outside-click-closes-all-menus",
545
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/Menu.test.tsx#L1095",
546
+ "upstreamTest": "should close all submenus if interacting outside root submenu",
547
+ "apg": "mouse",
548
+ "config": {
549
+ "items": ["Open", "Rename…", "Duplicate", "Share…", "Delete…"],
550
+ "submenu": {
551
+ "at": 3,
552
+ "items": ["Email…", "SMS", "X"],
553
+ "nestedSubmenu": { "at": 0, "items": ["Work", "Personal"] }
554
+ }
555
+ },
556
+ "steps": [
557
+ { "event": "hover", "target": "menuitem:3" },
558
+ { "event": "hover", "target": "menuitem:3/0" },
559
+ { "expect": { "visible": ["menu", "submenu:1", "submenu:1/1"] } },
560
+ { "event": "click", "target": "outside" },
561
+ { "expect": { "hidden": ["menu", "submenu:1", "submenu:1/1"] } }
562
+ ]
563
+ },
564
+ {
565
+ "id": "menu-button.react-aria.escape-restores-focus-to-submenu-trigger",
566
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/Menu.test.tsx#L1195",
567
+ "upstreamTest": "should restore focus to menu trigger if submenu is closed with Escape key",
568
+ "apg": "keyboard",
569
+ "config": {
570
+ "items": ["Open", "Rename…", "Duplicate", "Share…", "Delete…"],
571
+ "submenu": { "at": 3, "items": ["Email", "SMS", "X"] }
572
+ },
573
+ "steps": [
574
+ { "event": "hover", "target": "menuitem:3" },
575
+ { "expect": { "visible": ["submenu:1"] } },
576
+ { "event": "hover", "target": "menuitem:3/0" },
577
+ { "expect": { "focus": "menuitem:3/0" } },
578
+ { "event": "key", "key": "Escape", "target": "menuitem:3/0" },
579
+ {
580
+ "expect": {
581
+ "hidden": ["submenu:1"],
582
+ "visible": ["menu"],
583
+ "focus": "menuitem:3"
584
+ }
585
+ }
586
+ ]
587
+ },
588
+ {
589
+ "id": "menu-button.react-aria.escape-restores-focus-to-nested-submenu-trigger",
590
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/Menu.test.tsx#L1269",
591
+ "upstreamTest": "should restore focus to nested submenu trigger if nested submenu is closed with Escape key",
592
+ "apg": "keyboard",
593
+ "config": {
594
+ "items": ["Open", "Rename…", "Duplicate", "Share…", "Delete…"],
595
+ "submenu": {
596
+ "at": 3,
597
+ "items": ["Email…", "SMS"],
598
+ "nestedSubmenu": { "at": 0, "items": ["Work", "Personal"] }
599
+ }
600
+ },
601
+ "steps": [
602
+ { "event": "hover", "target": "menuitem:3" },
603
+ { "event": "hover", "target": "menuitem:3/0" },
604
+ { "expect": { "focus": "menuitem:3/0/0" } },
605
+ { "event": "key", "key": "Escape", "target": "menuitem:3/0/0" },
606
+ {
607
+ "expect": {
608
+ "hidden": ["submenu:1/1"],
609
+ "visible": ["submenu:1", "menu"],
610
+ "focus": "menuitem:3/0"
611
+ }
612
+ }
613
+ ]
614
+ },
615
+ {
616
+ "id": "menu-button.react-aria.submenu-close-when-hover-leaves-trigger",
617
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/@adobe/react-spectrum/test/menu/SubMenuTrigger.test.tsx#L142",
618
+ "upstreamTest": "submenu closes when hover leaves the submenu trigger",
619
+ "apg": "mouse",
620
+ "config": {
621
+ "items": ["Lvl 1 Item 1", "Lvl 1 Item 2", "Lvl 1 Item 3"],
622
+ "submenu": { "at": 1, "items": ["Lvl 2 Item 1"] }
623
+ },
624
+ "steps": [
625
+ { "event": "hover", "target": "menuitem:1" },
626
+ {
627
+ "expect": {
628
+ "visible": ["submenu:1"],
629
+ "attrs": { "menuitem:1": { "aria-expanded": "true" } },
630
+ "events": { "onOpenChange": [] }
631
+ }
632
+ },
633
+ { "event": "hover", "target": "menuitem:0" },
634
+ {
635
+ "expect": {
636
+ "hidden": ["submenu:1"],
637
+ "attrs": { "menuitem:1": { "aria-expanded": "false" } }
638
+ }
639
+ }
640
+ ]
641
+ },
642
+ {
643
+ "id": "menu-button.react-aria.only-one-submenu-open-at-a-time",
644
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/@adobe/react-spectrum/test/menu/SubMenuTrigger.test.tsx#L179",
645
+ "upstreamTest": "only allows one submenu open at a time",
646
+ "apg": "mouse",
647
+ "config": {
648
+ "items": ["Lvl 1 Item 1", "Lvl 1 Item 2"],
649
+ "submenu": { "at": 0, "items": ["A"] },
650
+ "submenu2": { "at": 1, "items": ["B"] }
651
+ },
652
+ "steps": [
653
+ { "event": "hover", "target": "menuitem:0" },
654
+ {
655
+ "expect": {
656
+ "visible": ["submenu:1"],
657
+ "attrs": {
658
+ "menuitem:0": { "aria-expanded": "true" },
659
+ "menuitem:1": { "aria-expanded": "false" }
660
+ }
661
+ }
662
+ },
663
+ { "event": "hover", "target": "menuitem:1" },
664
+ {
665
+ "expect": {
666
+ "attrs": {
667
+ "menuitem:0": { "aria-expanded": "false" },
668
+ "menuitem:1": { "aria-expanded": "true" }
669
+ }
670
+ }
671
+ }
672
+ ]
673
+ },
674
+ {
675
+ "id": "menu-button.react-aria.hover-onto-trigger-from-submenu-keeps-open",
676
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/@adobe/react-spectrum/test/menu/SubMenuTrigger.test.tsx#L219",
677
+ "upstreamTest": "should not close the sub menu if user hovers onto the sub menu trigger from the sub menu",
678
+ "apg": "mouse",
679
+ "config": {
680
+ "items": ["Lvl 1 Item 1", "Lvl 1 Item 2"],
681
+ "submenu": { "at": 1, "items": ["A", "B"] }
682
+ },
683
+ "steps": [
684
+ { "event": "focus", "target": "trigger" },
685
+ { "event": "hover", "target": "menuitem:1" },
686
+ { "expect": { "visible": ["submenu:1"] } },
687
+ { "event": "hover", "target": "menuitem:1/0" },
688
+ { "event": "hover", "target": "menuitem:1" },
689
+ { "expect": { "visible": ["submenu:1"], "hidden": ["menu"] } }
690
+ ]
691
+ },
692
+ {
693
+ "id": "menu-button.react-aria.hover-neighbor-closes-submenu-and-moves-focus",
694
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/@adobe/react-spectrum/test/menu/SubMenuTrigger.test.tsx#L254",
695
+ "upstreamTest": "should close the sub menu if the user hovers a neighboring menu item from the submenu trigger",
696
+ "apg": "mouse",
697
+ "config": {
698
+ "items": ["Lvl 1 Item 1", "Lvl 1 Item 2"],
699
+ "submenu": { "at": 1, "items": ["A"] }
700
+ },
701
+ "steps": [
702
+ { "event": "hover", "target": "menuitem:1" },
703
+ { "event": "hover", "target": "menuitem:1/0" },
704
+ { "event": "hover", "target": "menuitem:0" },
705
+ { "expect": { "hidden": ["submenu:1"], "focus": "menuitem:0" } }
706
+ ]
707
+ },
708
+ {
709
+ "id": "menu-button.react-aria.disabled-submenu-trigger-from-disabled-keys",
710
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/@adobe/react-spectrum/test/menu/SubMenuTrigger.test.tsx#L370",
711
+ "upstreamTest": "disables a submenu trigger if the wrapped item is in the disabledKeys array",
712
+ "apg": "extension",
713
+ "config": {
714
+ "items": ["Lvl 1 Item 1", "Lvl 1 Item 2"],
715
+ "submenu": { "at": 1, "items": ["A"], "disabled": true }
716
+ },
717
+ "steps": [
718
+ { "expect": { "attrs": { "menuitem:1": { "aria-disabled": "true" } } } }
719
+ ]
720
+ },
721
+ {
722
+ "id": "menu-button.react-aria.keyboard-arrow-closes-submenu-and-moves-focus",
723
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/@adobe/react-spectrum/test/menu/SubMenuTrigger.test.tsx#L450",
724
+ "upstreamTest": "should close the submenu if focus moves from the submenu trigger to a neighboring element via keyboard",
725
+ "apg": "keyboard",
726
+ "config": {
727
+ "items": ["Lvl 1 Item 1", "Lvl 1 Item 2"],
728
+ "submenu": { "at": 1, "items": ["A"] }
729
+ },
730
+ "steps": [
731
+ { "event": "key", "key": "ArrowDown", "target": "trigger" },
732
+ { "event": "hover", "target": "menuitem:1" },
733
+ { "expect": { "visible": ["submenu:1"], "focus": "menuitem:1" } },
734
+ { "event": "key", "key": "ArrowUp", "target": "menuitem:1" },
735
+ { "expect": { "hidden": ["submenu:1"] } }
736
+ ]
737
+ },
738
+ {
739
+ "id": "menu-button.react-aria.tab-contains-focus-in-submenus",
740
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/@adobe/react-spectrum/test/menu/SubMenuTrigger.test.tsx#L527",
741
+ "upstreamTest": "should contain focus when pressing Tab",
742
+ "apg": "keyboard",
743
+ "config": {
744
+ "items": ["Lvl 1 Item 1", "Lvl 1 Item 2"],
745
+ "submenu": {
746
+ "at": 1,
747
+ "items": ["Lvl 2 Item 1", "Lvl 2 Item 2"],
748
+ "nestedSubmenu": { "at": 1, "items": ["Lvl 3 Item 1"] }
749
+ }
750
+ },
751
+ "steps": [
752
+ { "event": "hover", "target": "menuitem:1" },
753
+ { "event": "hover", "target": "menuitem:1/1" },
754
+ { "expect": { "focus": "menuitem:1/1/0" } },
755
+ { "event": "key", "key": "Tab", "target": "menuitem:1/1/0" },
756
+ {
757
+ "expect": {
758
+ "focus": "menuitem:1/1/0",
759
+ "visible": ["menu", "submenu:1", "submenu:1/1"]
760
+ }
761
+ }
762
+ ]
763
+ },
764
+ {
765
+ "id": "menu-button.react-aria.submenu-on-close-called-when-option-pressed",
766
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/@adobe/react-spectrum/test/menu/SubMenuTrigger.test.tsx#L575",
767
+ "upstreamTest": "calls user provided submenu onAction and onClose when submenu option is pressed",
768
+ "apg": "keyboard",
769
+ "config": {
770
+ "items": ["Lvl 1 Item 1", "Lvl 1 Item 2"],
771
+ "submenu": { "at": 1, "items": ["Lvl 2 Item 1", "Lvl 2 Item 2"] }
772
+ },
773
+ "steps": [
774
+ { "event": "hover", "target": "menuitem:1" },
775
+ { "event": "click", "target": "menuitem:1/1" },
776
+ {
777
+ "expect": {
778
+ "events": {
779
+ "onSubmenuAction": ["menuitem:1/1"],
780
+ "onSubmenuClose": [],
781
+ "onRootAction": []
782
+ }
783
+ }
784
+ }
785
+ ]
786
+ },
787
+ {
788
+ "id": "menu-button.react-aria.escape-does-not-trigger-submenu-close-callback",
789
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/@adobe/react-spectrum/test/menu/SubMenuTrigger.test.tsx#L665",
790
+ "upstreamTest": "should not trigger onClose when closing the submenu with Esc",
791
+ "apg": "extension",
792
+ "config": {
793
+ "items": ["Lvl 1 Item 1", "Lvl 1 Item 2"],
794
+ "submenu": { "at": 1, "items": ["Lvl 2 Item 1"] }
795
+ },
796
+ "steps": [
797
+ { "event": "hover", "target": "menuitem:1" },
798
+ { "event": "key", "key": "Escape", "target": "menuitem:1" },
799
+ {
800
+ "expect": {
801
+ "hidden": ["submenu:1"],
802
+ "events": { "onClose": [], "onSubmenuClose": [] }
803
+ }
804
+ }
805
+ ]
806
+ },
807
+ {
808
+ "id": "menu-button.react-aria.submenu-trigger-does-not-fire-root-action",
809
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/@adobe/react-spectrum/test/menu/SubMenuTrigger.test.tsx#L696",
810
+ "upstreamTest": "should not trigger root menu onAction when pressing on a submenu trigger item",
811
+ "apg": "extension",
812
+ "config": {
813
+ "items": ["Lvl 1 Item 1", "Lvl 1 Item 2"],
814
+ "submenu": { "at": 1, "items": ["Lvl 2 Item 1"] }
815
+ },
816
+ "steps": [
817
+ { "event": "click", "target": "menuitem:1" },
818
+ {
819
+ "expect": { "visible": ["submenu:1"], "events": { "onAction": [] } }
820
+ },
821
+ { "event": "click", "target": "menuitem:0" },
822
+ {
823
+ "expect": {
824
+ "hidden": ["submenu:1", "menu"],
825
+ "events": { "onAction": ["menuitem:0"] }
826
+ }
827
+ }
828
+ ]
829
+ },
830
+ {
831
+ "id": "menu-button.react-aria.submenu-selection-mode-sync",
832
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/@adobe/react-spectrum/test/menu/SubMenuTrigger.test.tsx#L849",
833
+ "upstreamTest": "doesnt select a submenu trigger even if its key is specified in selectedKeys",
834
+ "apg": "checkbox",
835
+ "config": {
836
+ "variant": "checkbox-items",
837
+ "selectionMode": "multiple",
838
+ "items": ["Lvl 1 Item 1", "Lvl 1 Item 2"],
839
+ "selected": [0, 1],
840
+ "submenu": { "at": 1, "items": ["A"] }
841
+ },
842
+ "steps": [
843
+ {
844
+ "expect": {
845
+ "attrs": {
846
+ "menuitem:0": {
847
+ "role": "menuitemcheckbox",
848
+ "aria-checked": "true"
849
+ },
850
+ "menuitem:2": { "role": "menuitem", "aria-expanded": "false" }
851
+ }
852
+ }
853
+ }
854
+ ],
855
+ "notes": "The submenu trigger is not selectable and must not carry aria-checked."
856
+ },
857
+ {
858
+ "id": "menu-button.react-aria.submenu-keyboard-open-close-arrow-keys",
859
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/@adobe/react-spectrum/test/menu/SubMenuTrigger.test.tsx#L1059",
860
+ "upstreamTest": "should allow the user to open and close menus with the arrow keys",
861
+ "apg": "keyboard",
862
+ "config": {
863
+ "items": ["Lvl 1 Item 1", "Lvl 1 Item 2"],
864
+ "submenu": { "at": 1, "items": ["Lvl 2 Item 1"] }
865
+ },
866
+ "steps": [
867
+ { "event": "key", "key": "ArrowDown", "target": "trigger" },
868
+ { "event": "key", "key": "ArrowDown", "target": "menuitem:0" },
869
+ { "expect": { "focus": "menuitem:1" } },
870
+ { "event": "key", "key": "ArrowRight", "target": "menuitem:1" },
871
+ { "expect": { "visible": ["submenu:1"], "focus": "menuitem:1/0" } },
872
+ { "event": "key", "key": "ArrowLeft", "target": "menuitem:1/0" },
873
+ { "expect": { "hidden": ["submenu:1"], "focus": "menuitem:1" } }
874
+ ]
875
+ },
876
+ {
877
+ "id": "menu-button.react-aria.submenu-does-not-open-on-hover-in-tray",
878
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/@adobe/react-spectrum/test/menu/SubMenuTrigger.test.tsx#L1022",
879
+ "upstreamTest": "should not open/close submenus on hover",
880
+ "apg": "extension",
881
+ "config": {
882
+ "variant": "touch-tray",
883
+ "items": ["Lvl 1 Item 1", "Lvl 1 Item 2"],
884
+ "submenu": { "at": 1, "items": ["Lvl 2 Item 1"] }
885
+ },
886
+ "steps": [
887
+ { "event": "hover", "target": "menuitem:1" },
888
+ { "expect": { "hidden": ["submenu:1"] } },
889
+ {
890
+ "event": "pointerdown",
891
+ "pointerType": "touch",
892
+ "target": "menuitem:1"
893
+ },
894
+ { "expect": { "visible": ["submenu:1"] } }
895
+ ]
896
+ },
897
+ {
898
+ "id": "menu-button.react-aria.menu-containing-focus-on-tab",
899
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/Menu.test.tsx#L1842",
900
+ "upstreamTest": "contains focus within the menu",
901
+ "apg": "keyboard",
902
+ "config": { "items": ["Foo", "Bar", "Baz"] },
903
+ "steps": [
904
+ { "event": "click", "target": "trigger" },
905
+ { "expect": { "visible": ["menu"] } },
906
+ { "event": "key", "key": "Tab", "target": "menu" },
907
+ { "expect": { "visible": ["menu"], "focus": "menu" } }
908
+ ],
909
+ "notes": "Focus is trapped inside the open menu; Tab keeps focus on the currently active element."
910
+ },
911
+ {
912
+ "id": "menu-button.react-aria.tab-away-keeps-menu-open",
913
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/@adobe/react-spectrum/test/menu/MenuTrigger.test.js#L996",
914
+ "upstreamTest": "does not close if menu is tabbed away from",
915
+ "apg": "keyboard",
916
+ "config": { "items": ["One", "Two", "Three"] },
917
+ "steps": [
918
+ { "event": "click", "target": "trigger" },
919
+ { "event": "key", "key": "Tab", "target": "menu" },
920
+ { "expect": { "visible": ["menu"], "focus": "menuitem:0" } }
921
+ ]
922
+ },
923
+ {
924
+ "id": "menu-button.react-aria.virtualized-aria-posinset-setsize",
925
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria/test/menu/useMenu.test.tsx#L153",
926
+ "upstreamTest": "sets correct aria-posinset (1-based) for virtualized menu items",
927
+ "apg": "aria",
928
+ "config": { "virtualized": true, "items": ["One", "Two", "Three"] },
929
+ "steps": [
930
+ {
931
+ "expect": {
932
+ "attrs": {
933
+ "menuitem:0": { "aria-posinset": "1", "aria-setsize": "3" },
934
+ "menuitem:1": { "aria-posinset": "2", "aria-setsize": "3" },
935
+ "menuitem:2": { "aria-posinset": "3", "aria-setsize": "3" }
936
+ }
937
+ }
938
+ }
939
+ ]
940
+ },
941
+ {
942
+ "id": "menu-button.react-aria.global-aria-posinset-across-sections",
943
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria/test/menu/useMenu.test.tsx#L185",
944
+ "upstreamTest": "sets global aria-posinset across sections",
945
+ "apg": "aria",
946
+ "config": {
947
+ "virtualized": true,
948
+ "sections": [
949
+ ["One", "Two"],
950
+ ["Three", "Four"]
951
+ ]
952
+ },
953
+ "steps": [
954
+ {
955
+ "expect": {
956
+ "attrs": {
957
+ "menuitem:0": { "aria-posinset": "1", "aria-setsize": "4" },
958
+ "menuitem:1": { "aria-posinset": "2" },
959
+ "menuitem:2": { "aria-posinset": "3" },
960
+ "menuitem:3": { "aria-posinset": "4", "aria-setsize": "4" }
961
+ }
962
+ }
963
+ }
964
+ ]
965
+ },
966
+ {
967
+ "id": "menu-button.react-aria.section-group-labelled-by-heading",
968
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria/test/menu/useMenu.test.tsx#L223",
969
+ "upstreamTest": "labels a section group via aria-label when the section has no heading",
970
+ "apg": "aria",
971
+ "config": {
972
+ "sections": [{ "ariaLabel": "Actions", "items": ["One", "Two"] }]
973
+ },
974
+ "steps": [
975
+ {
976
+ "expect": {
977
+ "attrs": {
978
+ "group:0": { "aria-label": "Actions", "aria-labelledby": null }
979
+ }
980
+ }
981
+ }
982
+ ]
983
+ },
984
+ {
985
+ "id": "menu-button.react-aria.item-action-from-use-menu-item",
986
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria/test/menu/useMenu.test.tsx#L137",
987
+ "upstreamTest": "calls an onAction passed directly to useMenuItem",
988
+ "apg": "keyboard",
989
+ "config": { "items": ["One", "Two", "Three"] },
990
+ "steps": [
991
+ { "event": "click", "target": "menuitem:0" },
992
+ { "expect": { "events": { "onAction": ["menuitem:0"] } } }
993
+ ]
994
+ },
995
+ {
996
+ "id": "menu-button.react-aria.links-keep-menu-semantics-across-selection-modes",
997
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/Menu.test.tsx#L883",
998
+ "upstreamTest": "supports links with selectionMode none/single/multiple",
999
+ "apg": "aria",
1000
+ "config": {
1001
+ "variant": "links",
1002
+ "selectionMode": "single",
1003
+ "items": ["One", "Two"]
1004
+ },
1005
+ "steps": [
1006
+ {
1007
+ "expect": {
1008
+ "attrs": {
1009
+ "menuitem:0": {
1010
+ "role": "menuitemradio",
1011
+ "href": "https://example.com/one"
1012
+ }
1013
+ }
1014
+ }
1015
+ },
1016
+ { "event": "click", "target": "menuitem:1" },
1017
+ {
1018
+ "expect": {
1019
+ "events": { "onAction": ["menuitem:1"], "onSelectionChange": [] }
1020
+ }
1021
+ }
1022
+ ],
1023
+ "notes": "Following a link is an action, not a selection change, even when a selectionMode is set."
1024
+ },
1025
+ {
1026
+ "id": "menu-button.react-aria.auto-focuses-popover-for-keyboard-subdialog",
1027
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/Menu.test.tsx#L2062",
1028
+ "upstreamTest": "should auto focus the Popover if in keyboard modality",
1029
+ "apg": "extension",
1030
+ "config": {
1031
+ "items": ["Delete"],
1032
+ "submenu": { "at": 0, "content": "dialog" }
1033
+ },
1034
+ "steps": [
1035
+ { "event": "focus", "target": "trigger" },
1036
+ { "event": "key", "key": "Enter", "target": "trigger" },
1037
+ { "event": "key", "key": "Enter", "target": "menuitem:0" },
1038
+ {
1039
+ "expect": {
1040
+ "visible": ["dialog:1"],
1041
+ "focus": "dialog:1",
1042
+ "events": { "onAction": [] }
1043
+ }
1044
+ },
1045
+ { "event": "key", "key": "Escape", "target": "dialog:1" },
1046
+ { "expect": { "focus": "menuitem:0" } }
1047
+ ]
1048
+ }
1049
+ ],
1050
+ "skipped": [
1051
+ {
1052
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/Menu.test.tsx#L158",
1053
+ "reason": "Default/custom CSS classes, data-rac and DOM prop pass-through are styling/React-API concerns."
1054
+ },
1055
+ {
1056
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/Menu.test.tsx#L256",
1057
+ "reason": "Hover/press/focus-ring style-hook callbacks and class toggles are styling."
1058
+ },
1059
+ {
1060
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/Menu.test.tsx#L1806",
1061
+ "reason": "Portal container configuration is a rendering/React-API concern."
1062
+ },
1063
+ {
1064
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/Menu.test.tsx#L2102",
1065
+ "reason": "Async loading, onLoadMore and intersection-observer behaviour are data-loading concerns."
1066
+ },
1067
+ {
1068
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/@adobe/react-spectrum/test/menu/SubMenuTrigger.test.tsx#L877",
1069
+ "reason": "Touch tray positioning, rounded-corner dialogs and back-button chrome are styling/tray chrome."
1070
+ },
1071
+ {
1072
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria-components/test/VirtualizedMenu.test.tsx",
1073
+ "reason": "Virtualized scrolling/rendering is out of scope; only its ARIA numbering is ported."
1074
+ },
1075
+ {
1076
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/@adobe/react-spectrum/test/menu/MenuTrigger.test.js#L446",
1077
+ "reason": "Spectrum checkmark rendering when selectionMode is undefined is styling."
1078
+ }
1079
+ ]
1080
+ }