@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,442 @@
1
+ {
2
+ "pattern": "feed",
3
+ "source": "apg",
4
+ "commit": null,
5
+ "license": "W3C Software and Document License",
6
+ "upstream": "https://www.w3.org/WAI/ARIA/apg/patterns/feed/",
7
+ "notes": "No upstream test implementation of the feed pattern exists in ariakit, base-ui or react-aria (searched *test* files for role=feed / feed; only unrelated uses of the word 'feed' and the 'feedback'/'MessageFeedback' components matched). Scenarios are therefore derived from the APG Feed Pattern itself: the Keyboard Interaction and WAI-ARIA Roles, States, and Properties sections, and the Infinite Scrolling Feed example (pattern page + example page + the example's feed.js, licensed W3C Software and Document License).",
8
+ "skipped": [],
9
+ "scenarios": [
10
+ {
11
+ "id": "feed.apg.about.focus-on-last-loaded-article-loads-more",
12
+ "upstream": "https://www.w3.org/WAI/ARIA/apg/patterns/feed/#aboutthispattern",
13
+ "upstreamTest": "About This Pattern: the page loads feed articles based on which article contains DOM focus",
14
+ "apg": "about",
15
+ "config": { "loaded": 1, "totalArticles": 6 },
16
+ "steps": [
17
+ { "event": "focus", "target": "article:1" },
18
+ {
19
+ "expect": {
20
+ "focus": "article:1",
21
+ "attrs": { "feed": { "aria-busy": "true" } },
22
+ "visible": ["article:1"]
23
+ }
24
+ }
25
+ ],
26
+ "notes": "Focus reaching the last loaded article is the load trigger; aria-busy brackets the DOM update. Scroll-triggered loading is modelled by the same load phase."
27
+ },
28
+ {
29
+ "id": "feed.apg.about.focus-not-on-last-article-does-not-load",
30
+ "upstream": "https://www.w3.org/WAI/ARIA/apg/patterns/feed/#aboutthispattern",
31
+ "upstreamTest": "About This Pattern: loading is driven by the article holding DOM focus, not by every focus change",
32
+ "apg": "about",
33
+ "config": { "loaded": 3, "totalArticles": 6 },
34
+ "steps": [
35
+ { "event": "focus", "target": "article:2" },
36
+ {
37
+ "expect": {
38
+ "focus": "article:2",
39
+ "attrs": { "feed": { "aria-busy": null } }
40
+ }
41
+ }
42
+ ]
43
+ },
44
+ {
45
+ "id": "feed.apg.about.no-load-when-all-articles-loaded",
46
+ "upstream": "https://www.w3.org/WAI/ARIA/apg/patterns/feed/#aboutthispattern",
47
+ "upstreamTest": "About This Pattern: once every article is loaded there is nothing left to fetch",
48
+ "apg": "about",
49
+ "config": { "loaded": 6, "totalArticles": 6 },
50
+ "steps": [
51
+ { "event": "focus", "target": "article:6" },
52
+ {
53
+ "expect": {
54
+ "focus": "article:6",
55
+ "attrs": {
56
+ "feed": { "aria-busy": null },
57
+ "article:1": { "aria-setsize": "6" }
58
+ }
59
+ }
60
+ }
61
+ ]
62
+ },
63
+ {
64
+ "id": "feed.apg.about.tab-enters-on-any-loaded-article",
65
+ "upstream": "https://www.w3.org/WAI/ARIA/apg/patterns/feed/#aboutthispattern",
66
+ "upstreamTest": "About This Pattern: the reading cursor is the focused article; articles are in the Tab sequence",
67
+ "apg": "about",
68
+ "config": { "loaded": 3, "totalArticles": 6 },
69
+ "steps": [
70
+ { "event": "focus", "target": "article:2" },
71
+ { "expect": { "focus": "article:2" } }
72
+ ]
73
+ },
74
+ {
75
+ "id": "feed.apg.about.focus-on-unloaded-article-is-ignored",
76
+ "upstream": "https://www.w3.org/WAI/ARIA/apg/patterns/feed/#aboutthispattern",
77
+ "upstreamTest": "About This Pattern: focus cannot land on an article that has not been loaded",
78
+ "apg": "about",
79
+ "config": { "loaded": 3, "totalArticles": 6 },
80
+ "steps": [
81
+ { "event": "focus", "target": "article:4" },
82
+ {
83
+ "expect": {
84
+ "focus": "before-feed",
85
+ "attrs": { "feed": { "aria-busy": null } },
86
+ "visible": ["article:1", "article:2", "article:3"]
87
+ }
88
+ }
89
+ ],
90
+ "notes": "Sentinel targets \"before-feed\"/\"after-feed\" denote DOM focus outside the feed on the first focusable element before/after it."
91
+ },
92
+
93
+ {
94
+ "id": "feed.apg.keyboard.page-down-moves-to-next-article",
95
+ "upstream": "https://www.w3.org/WAI/ARIA/apg/patterns/feed/#keyboardinteraction",
96
+ "upstreamTest": "Keyboard Interaction: Page Down moves focus to next article",
97
+ "apg": "keyboard",
98
+ "config": { "loaded": 3, "totalArticles": 6 },
99
+ "steps": [
100
+ { "event": "focus", "target": "article:1" },
101
+ { "event": "key", "key": "PageDown", "target": "article:1" },
102
+ { "expect": { "focus": "article:2" } }
103
+ ]
104
+ },
105
+ {
106
+ "id": "feed.apg.keyboard.page-down-on-last-article-stays",
107
+ "upstream": "https://www.w3.org/WAI/ARIA/apg/patterns/feed/#keyboardinteraction",
108
+ "upstreamTest": "Keyboard Interaction: Page Down has no next article at the end of the loaded set",
109
+ "apg": "keyboard",
110
+ "config": { "loaded": 3, "totalArticles": 3 },
111
+ "steps": [
112
+ { "event": "focus", "target": "article:3" },
113
+ { "event": "key", "key": "PageDown", "target": "article:3" },
114
+ {
115
+ "expect": {
116
+ "focus": "article:3",
117
+ "attrs": { "feed": { "aria-busy": null } }
118
+ }
119
+ }
120
+ ]
121
+ },
122
+ {
123
+ "id": "feed.apg.keyboard.page-up-moves-to-previous-article",
124
+ "upstream": "https://www.w3.org/WAI/ARIA/apg/patterns/feed/#keyboardinteraction",
125
+ "upstreamTest": "Keyboard Interaction: Page Up moves focus to previous article",
126
+ "apg": "keyboard",
127
+ "config": { "loaded": 3, "totalArticles": 6 },
128
+ "steps": [
129
+ { "event": "focus", "target": "article:3" },
130
+ { "event": "key", "key": "PageUp", "target": "article:3" },
131
+ { "expect": { "focus": "article:2" } }
132
+ ]
133
+ },
134
+ {
135
+ "id": "feed.apg.keyboard.page-up-on-first-article-stays",
136
+ "upstream": "https://www.w3.org/WAI/ARIA/apg/patterns/feed/#keyboardinteraction",
137
+ "upstreamTest": "Keyboard Interaction: Page Up has no previous article at the start of the feed",
138
+ "apg": "keyboard",
139
+ "config": { "loaded": 3, "totalArticles": 6 },
140
+ "steps": [
141
+ { "event": "focus", "target": "article:1" },
142
+ { "event": "key", "key": "PageUp", "target": "article:1" },
143
+ { "expect": { "focus": "article:1" } }
144
+ ]
145
+ },
146
+ {
147
+ "id": "feed.apg.keyboard.ctrl-end-moves-to-element-after-feed",
148
+ "upstream": "https://www.w3.org/WAI/ARIA/apg/patterns/feed/#keyboardinteraction",
149
+ "upstreamTest": "Keyboard Interaction: Control+End moves focus to the first focusable element after the feed",
150
+ "apg": "keyboard",
151
+ "config": { "loaded": 3, "totalArticles": 6 },
152
+ "steps": [
153
+ { "event": "focus", "target": "article:2" },
154
+ { "event": "key", "key": "Control+End", "target": "article:2" },
155
+ { "expect": { "focus": "after-feed" } }
156
+ ]
157
+ },
158
+ {
159
+ "id": "feed.apg.keyboard.ctrl-home-moves-to-element-before-feed",
160
+ "upstream": "https://www.w3.org/WAI/ARIA/apg/patterns/feed/#keyboardinteraction",
161
+ "upstreamTest": "Keyboard Interaction: Control+Home moves focus to the first focusable element before the feed",
162
+ "apg": "keyboard",
163
+ "config": { "loaded": 3, "totalArticles": 6 },
164
+ "steps": [
165
+ { "event": "focus", "target": "article:2" },
166
+ { "event": "key", "key": "Control+Home", "target": "article:2" },
167
+ { "expect": { "focus": "before-feed" } }
168
+ ]
169
+ },
170
+ {
171
+ "id": "feed.apg.keyboard.page-down-when-focus-outside-feed-is-noop",
172
+ "upstream": "https://www.w3.org/WAI/ARIA/apg/patterns/feed/#keyboardinteraction",
173
+ "upstreamTest": "Keyboard Interaction: the navigation keys operate when focus is inside the feed",
174
+ "apg": "keyboard",
175
+ "config": { "loaded": 3, "totalArticles": 6 },
176
+ "steps": [
177
+ { "event": "key", "key": "PageDown", "target": "before-feed" },
178
+ { "expect": { "focus": "before-feed" } }
179
+ ]
180
+ },
181
+ {
182
+ "id": "feed.apg.keyboard.page-up-when-focus-outside-feed-is-noop",
183
+ "upstream": "https://www.w3.org/WAI/ARIA/apg/patterns/feed/#keyboardinteraction",
184
+ "upstreamTest": "Keyboard Interaction: the navigation keys operate when focus is inside the feed",
185
+ "apg": "keyboard",
186
+ "config": { "loaded": 3, "totalArticles": 6 },
187
+ "steps": [
188
+ { "event": "key", "key": "PageUp", "target": "after-feed" },
189
+ { "expect": { "focus": "after-feed" } }
190
+ ]
191
+ },
192
+
193
+ {
194
+ "id": "feed.apg.roles.feed-container-has-role",
195
+ "upstream": "https://www.w3.org/WAI/ARIA/apg/patterns/feed/#wai-ariaroles,states,andproperties",
196
+ "upstreamTest": "Roles/States: the element that contains the set of feed articles has role feed",
197
+ "apg": "roles",
198
+ "config": { "loaded": 1, "totalArticles": 6 },
199
+ "steps": [{ "expect": { "attrs": { "feed": { "role": "feed" } } } }]
200
+ },
201
+ {
202
+ "id": "feed.apg.roles.feed-container-not-focusable",
203
+ "upstream": "https://www.w3.org/WAI/ARIA/apg/patterns/feed/examples/feed/#rps_label",
204
+ "upstreamTest": "Example attributes table: the feed element is a structural container that is not focusable",
205
+ "apg": "roles",
206
+ "config": { "loaded": 1, "totalArticles": 6 },
207
+ "steps": [{ "expect": { "attrs": { "feed": { "tabindex": null } } } }]
208
+ },
209
+ {
210
+ "id": "feed.apg.roles.feed-has-accessible-name",
211
+ "upstream": "https://www.w3.org/WAI/ARIA/apg/patterns/feed/#wai-ariaroles,states,andproperties",
212
+ "upstreamTest": "Roles/States: the feed is named with aria-labelledby, or aria-label when there is no visible label",
213
+ "apg": "roles",
214
+ "config": { "loaded": 1, "labelledby": "feed-heading" },
215
+ "steps": [
216
+ {
217
+ "expect": {
218
+ "attrs": { "feed": { "aria-labelledby": "feed-heading" } }
219
+ }
220
+ }
221
+ ],
222
+ "notes": "With no visible label the name comes from aria-label instead; this scenario pins the labelledby branch."
223
+ },
224
+ {
225
+ "id": "feed.apg.roles.article-has-role-and-posinset",
226
+ "upstream": "https://www.w3.org/WAI/ARIA/apg/patterns/feed/#wai-ariaroles,states,andproperties",
227
+ "upstreamTest": "Roles/States: each unit of content is an article whose aria-posinset is its position in the feed, numbering from 1",
228
+ "apg": "roles",
229
+ "config": { "loaded": 3, "totalArticles": 6 },
230
+ "steps": [
231
+ {
232
+ "expect": {
233
+ "visible": ["article:1", "article:2", "article:3"],
234
+ "attrs": {
235
+ "article:1": { "role": "article", "aria-posinset": "1" },
236
+ "article:3": { "aria-posinset": "3" }
237
+ }
238
+ }
239
+ }
240
+ ]
241
+ },
242
+ {
243
+ "id": "feed.apg.roles.articles-are-tabbable",
244
+ "upstream": "https://www.w3.org/WAI/ARIA/apg/patterns/feed/examples/feed/#rps_label",
245
+ "upstreamTest": "Example attributes table: tabindex=0 makes an article focusable and includes it in the page Tab sequence",
246
+ "apg": "roles",
247
+ "config": { "loaded": 3, "totalArticles": 6 },
248
+ "steps": [
249
+ {
250
+ "expect": {
251
+ "attrs": {
252
+ "article:1": { "tabindex": "0" },
253
+ "article:3": { "tabindex": "0" }
254
+ }
255
+ }
256
+ }
257
+ ]
258
+ },
259
+ {
260
+ "id": "feed.apg.roles.article-has-labelledby",
261
+ "upstream": "https://www.w3.org/WAI/ARIA/apg/patterns/feed/#wai-ariaroles,states,andproperties",
262
+ "upstreamTest": "Roles/States: each article has aria-labelledby referring to elements inside it that distinguish it",
263
+ "apg": "roles",
264
+ "config": { "loaded": 1, "totalArticles": 6 },
265
+ "steps": [
266
+ {
267
+ "expect": {
268
+ "attrs": { "article:1": { "aria-labelledby": "*" } }
269
+ }
270
+ }
271
+ ],
272
+ "notes": "Attribute value \"*\" means any non-empty implementation-chosen IDREF list."
273
+ },
274
+ {
275
+ "id": "feed.apg.roles.article-has-describedby-for-primary-content",
276
+ "upstream": "https://www.w3.org/WAI/ARIA/apg/patterns/feed/#wai-ariaroles,states,andproperties",
277
+ "upstreamTest": "Roles/States: each article has aria-describedby referring to its primary content, excluding content repeated in every article",
278
+ "apg": "roles",
279
+ "config": { "loaded": 1, "totalArticles": 6 },
280
+ "steps": [
281
+ {
282
+ "expect": {
283
+ "attrs": { "article:1": { "aria-describedby": "*" } }
284
+ }
285
+ }
286
+ ],
287
+ "notes": "Value \"*\" means any non-empty IDREF list. APG: repeated elements such as the example's Bookmark button must not be part of it."
288
+ },
289
+ {
290
+ "id": "feed.apg.roles.setsize-is-loaded-count-per-example",
291
+ "upstream": "https://www.w3.org/WAI/ARIA/apg/patterns/feed/examples/feed/#rps_label",
292
+ "upstreamTest": "Example attributes table: aria-setsize is set to the total number of articles currently contained by the feed",
293
+ "apg": "roles",
294
+ "config": { "loaded": 3, "totalArticles": 30, "sizeMode": "loaded" },
295
+ "steps": [
296
+ {
297
+ "expect": {
298
+ "attrs": {
299
+ "article:1": { "aria-setsize": "3" },
300
+ "article:3": { "aria-setsize": "3" }
301
+ }
302
+ }
303
+ }
304
+ ],
305
+ "notes": "APG permits either the currently loaded count or the total in the feed; the example uses the loaded count."
306
+ },
307
+ {
308
+ "id": "feed.apg.roles.setsize-may-be-total",
309
+ "upstream": "https://www.w3.org/WAI/ARIA/apg/patterns/feed/#wai-ariaroles,states,andproperties",
310
+ "upstreamTest": "Roles/States: aria-setsize may be the total number in the feed",
311
+ "apg": "roles",
312
+ "config": {
313
+ "loaded": 3,
314
+ "totalArticles": 30,
315
+ "sizeMode": "total",
316
+ "totalKnown": true
317
+ },
318
+ "steps": [
319
+ {
320
+ "expect": {
321
+ "attrs": { "article:1": { "aria-setsize": "30" } }
322
+ }
323
+ }
324
+ ]
325
+ },
326
+ {
327
+ "id": "feed.apg.roles.setsize-minus-one-when-total-undetermined",
328
+ "upstream": "https://www.w3.org/WAI/ARIA/apg/patterns/feed/#wai-ariaroles,states,andproperties",
329
+ "upstreamTest": "Roles/States: an undetermined total number in the feed is represented by aria-setsize -1",
330
+ "apg": "roles",
331
+ "config": {
332
+ "loaded": 3,
333
+ "totalArticles": null,
334
+ "sizeMode": "total",
335
+ "totalKnown": false
336
+ },
337
+ "steps": [
338
+ {
339
+ "expect": {
340
+ "attrs": { "article:1": { "aria-setsize": "-1" } }
341
+ }
342
+ }
343
+ ]
344
+ },
345
+ {
346
+ "id": "feed.apg.roles.busy-true-while-adding-articles",
347
+ "upstream": "https://www.w3.org/WAI/ARIA/apg/patterns/feed/#wai-ariaroles,states,andproperties",
348
+ "upstreamTest": "Roles/States: the feed has aria-busy=true during a multi-operation update that adds articles",
349
+ "apg": "roles",
350
+ "config": { "loaded": 1, "totalArticles": 6 },
351
+ "steps": [
352
+ { "event": "prop", "prop": "loadStart" },
353
+ { "expect": { "attrs": { "feed": { "aria-busy": "true" } } } }
354
+ ]
355
+ },
356
+ {
357
+ "id": "feed.apg.roles.busy-cleared-when-load-completes",
358
+ "upstream": "https://www.w3.org/WAI/ARIA/apg/patterns/feed/#wai-ariaroles,states,andproperties",
359
+ "upstreamTest": "Roles/States: aria-busy is set to false when the update operation is complete",
360
+ "apg": "roles",
361
+ "config": { "loaded": 1, "totalArticles": 6 },
362
+ "steps": [
363
+ { "event": "prop", "prop": "loadStart" },
364
+ { "event": "prop", "prop": "loadFinish", "value": 2 },
365
+ {
366
+ "expect": {
367
+ "attrs": {
368
+ "feed": { "aria-busy": null },
369
+ "article:1": { "aria-setsize": "3" }
370
+ },
371
+ "visible": ["article:1", "article:2", "article:3"]
372
+ }
373
+ }
374
+ ]
375
+ },
376
+ {
377
+ "id": "feed.apg.roles.busy-cleared-after-failed-load",
378
+ "upstream": "https://www.w3.org/WAI/ARIA/apg/patterns/feed/#wai-ariaroles,states,andproperties",
379
+ "upstreamTest": "Roles/States: aria-busy must be false once the operation is complete, so the changes become visible to assistive technology",
380
+ "apg": "roles",
381
+ "config": { "loaded": 1, "totalArticles": 6 },
382
+ "steps": [
383
+ { "event": "prop", "prop": "loadStart" },
384
+ { "event": "prop", "prop": "loadFail" },
385
+ {
386
+ "expect": {
387
+ "attrs": { "feed": { "aria-busy": null } },
388
+ "visible": ["article:1"]
389
+ }
390
+ }
391
+ ],
392
+ "notes": "A failed load adds nothing but must still clear aria-busy."
393
+ },
394
+
395
+ {
396
+ "id": "feed.apg.example.ctrl-home-focuses-first-article",
397
+ "upstream": "https://www.w3.org/WAI/ARIA/apg/patterns/feed/examples/feed/",
398
+ "upstreamTest": "Example keyboard table: Control+Home moves focus to the first focusable element in the feed (feed.js focuses feedItems[0])",
399
+ "apg": "example",
400
+ "config": { "loaded": 3, "totalArticles": 6 },
401
+ "steps": [
402
+ { "event": "focus", "target": "article:2" },
403
+ { "event": "key", "key": "Control+Home", "target": "article:2" },
404
+ { "expect": { "focus": "article:1" } }
405
+ ],
406
+ "notes": "Divergence: the APG Keyboard Interaction section says Control+Home moves to the first focusable element before the feed; the example's table and feed.js move to the first article inside the feed."
407
+ },
408
+ {
409
+ "id": "feed.apg.example.ctrl-end-focuses-anchor-after-feed",
410
+ "upstream": "https://www.w3.org/WAI/ARIA/apg/patterns/feed/examples/feed/",
411
+ "upstreamTest": "Example keyboard table and feed.js: Control+End moves focus to the anchor item after the feed",
412
+ "apg": "example",
413
+ "config": { "loaded": 3, "totalArticles": 6 },
414
+ "steps": [
415
+ { "event": "focus", "target": "article:2" },
416
+ { "event": "key", "key": "Control+End", "target": "article:2" },
417
+ { "expect": { "focus": "after-feed" } }
418
+ ]
419
+ },
420
+ {
421
+ "id": "feed.apg.example.setsize-updates-for-all-articles-on-load",
422
+ "upstream": "https://www.w3.org/WAI/ARIA/apg/patterns/feed/examples/feed/",
423
+ "upstreamTest": "Example feedDisplay.js: after appending articles, aria-setsize is re-set on every article to the new loaded count",
424
+ "apg": "example",
425
+ "config": { "loaded": 1, "totalArticles": 30 },
426
+ "steps": [
427
+ { "event": "prop", "prop": "loadStart" },
428
+ { "event": "prop", "prop": "loadFinish", "value": 2 },
429
+ {
430
+ "expect": {
431
+ "attrs": {
432
+ "article:1": { "aria-setsize": "3" },
433
+ "article:2": { "aria-setsize": "3" },
434
+ "article:3": { "aria-setsize": "3" }
435
+ },
436
+ "visible": ["article:1", "article:2", "article:3"]
437
+ }
438
+ }
439
+ ]
440
+ }
441
+ ]
442
+ }
@@ -0,0 +1,197 @@
1
+ {
2
+ "pattern": "grid",
3
+ "source": "ariakit",
4
+ "commit": "404c72257b879569feb08465da4ff9915fd873da",
5
+ "license": "MIT",
6
+ "scenarios": [
7
+ {
8
+ "id": "grid.ariakit.composite-grid-navigation-without-focus-shift",
9
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/composite-navigation/test.ts#L49",
10
+ "upstreamTest": "composite-navigation > navigates a grid without focus shifting",
11
+ "apg": "keyboard",
12
+ "config": {
13
+ "layout": "grid",
14
+ "focusShift": false,
15
+ "rows": 3,
16
+ "cols": [3, 2, 3]
17
+ },
18
+ "steps": [
19
+ { "event": "click", "target": "cell:0,0" },
20
+ { "expect": { "focus": "cell:0,0" } },
21
+ { "event": "key", "key": "ArrowDown", "target": "cell:0,0" },
22
+ { "expect": { "focus": "cell:1,0" } },
23
+ { "event": "key", "key": "ArrowRight", "target": "cell:1,0" },
24
+ { "expect": { "focus": "cell:1,1" } },
25
+ { "event": "key", "key": "ArrowDown", "target": "cell:1,1" },
26
+ { "expect": { "focus": "cell:2,1" } },
27
+ { "event": "key", "key": "ArrowRight", "target": "cell:2,1" },
28
+ { "expect": { "focus": "cell:2,2" } },
29
+ { "event": "key", "key": "ArrowUp", "target": "cell:2,2" },
30
+ { "expect": { "focus": "cell:0,2" } },
31
+ { "event": "key", "key": "ArrowDown", "target": "cell:0,2" },
32
+ { "expect": { "focus": "cell:2,2" } }
33
+ ],
34
+ "notes": "Ragged layout grid (rows hold 3, 2, 3 cells). Up from the bottom-right cell stays in the same column index rather than the geometric neighbour above."
35
+ },
36
+ {
37
+ "id": "grid.ariakit.composite-grid-navigation-with-focus-shift",
38
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/composite-navigation/test.ts#L64",
39
+ "upstreamTest": "composite-navigation > navigates a grid with focus shifting",
40
+ "apg": "keyboard",
41
+ "config": {
42
+ "layout": "grid",
43
+ "focusShift": true,
44
+ "rows": 3,
45
+ "cols": [3, 2, 3]
46
+ },
47
+ "steps": [
48
+ { "event": "click", "target": "cell:0,0" },
49
+ { "expect": { "focus": "cell:0,0" } },
50
+ { "event": "key", "key": "ArrowDown", "target": "cell:0,0" },
51
+ { "expect": { "focus": "cell:1,0" } },
52
+ { "event": "key", "key": "ArrowRight", "target": "cell:1,0" },
53
+ { "expect": { "focus": "cell:1,1" } },
54
+ { "event": "key", "key": "ArrowDown", "target": "cell:1,1" },
55
+ { "expect": { "focus": "cell:2,1" } },
56
+ { "event": "key", "key": "ArrowRight", "target": "cell:2,1" },
57
+ { "expect": { "focus": "cell:2,2" } },
58
+ { "event": "key", "key": "ArrowUp", "target": "cell:2,2" },
59
+ { "expect": { "focus": "cell:1,1" } },
60
+ { "event": "key", "key": "ArrowUp", "target": "cell:1,1" },
61
+ { "expect": { "focus": "cell:0,1" } },
62
+ { "event": "key", "key": "ArrowRight", "target": "cell:0,1" },
63
+ { "expect": { "focus": "cell:0,2" } },
64
+ { "event": "key", "key": "ArrowDown", "target": "cell:0,2" },
65
+ { "expect": { "focus": "cell:1,1" } },
66
+ { "event": "key", "key": "ArrowDown", "target": "cell:1,1" },
67
+ { "expect": { "focus": "cell:2,1" } }
68
+ ],
69
+ "notes": "With focus shifting the ragged row B (2 cells) redirects column-3 vertical movement to column 2."
70
+ },
71
+ {
72
+ "id": "grid.ariakit.composite-grid-ctrl-home-first-cell",
73
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/composite-navigation/test.ts#L114",
74
+ "upstreamTest": "composite-navigation > moves focus-visible with Ctrl+Home on a grid",
75
+ "apg": "keyboard",
76
+ "config": {
77
+ "layout": "grid",
78
+ "rows": 3,
79
+ "cols": [3, 2, 3]
80
+ },
81
+ "steps": [
82
+ { "event": "click", "target": "cell:1,1" },
83
+ {
84
+ "expect": {
85
+ "focus": "cell:1,1",
86
+ "attrs": { "cell:1,1": { "data-focus-visible": null } }
87
+ }
88
+ },
89
+ {
90
+ "event": "key",
91
+ "key": "Home",
92
+ "target": "cell:1,1",
93
+ "modifiers": ["Control"]
94
+ },
95
+ {
96
+ "expect": {
97
+ "focus": "cell:0,0",
98
+ "attrs": { "cell:0,0": { "data-focus-visible": "true" } }
99
+ }
100
+ }
101
+ ],
102
+ "notes": "Ctrl+Home jumps to the first grid cell and marks it focus-visible even though the preceding interaction was a pointer click."
103
+ },
104
+ {
105
+ "id": "grid.ariakit.composite-row-aria-posinset",
106
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/composite-row-6334/test.ts#L5",
107
+ "upstreamTest": "composite-row-6334 > cells compute their position from row-level aria-posinset",
108
+ "apg": "aria",
109
+ "config": {
110
+ "layout": "grid",
111
+ "rows": 2,
112
+ "cols": 2,
113
+ "windowed": true,
114
+ "ariaRowCount": 50,
115
+ "ariaSetSize": 100,
116
+ "firstRowPosInSet": 21
117
+ },
118
+ "steps": [
119
+ {
120
+ "expect": {
121
+ "attrs": {
122
+ "cell:0,0": { "aria-posinset": "21", "aria-setsize": "100" },
123
+ "cell:0,1": { "aria-posinset": "22", "aria-setsize": "100" },
124
+ "cell:1,0": { "aria-posinset": "23", "aria-setsize": "100" },
125
+ "cell:1,1": { "aria-posinset": "24", "aria-setsize": "100" }
126
+ }
127
+ }
128
+ }
129
+ ],
130
+ "notes": "Only rows 11-12 of a 50-row / 100-cell windowed grid are mounted; each cell derives its aria-posinset from its row's aria-posinset."
131
+ },
132
+ {
133
+ "id": "grid.ariakit.combobox-grid-arrow-navigation",
134
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/combobox-grid/test.ts#L23",
135
+ "upstreamTest": "combobox-grid > move through items without moving the cursor",
136
+ "apg": "extension",
137
+ "config": {
138
+ "layout": "grid",
139
+ "popup": true,
140
+ "orientation": "both",
141
+ "rows": 2,
142
+ "cols": 3,
143
+ "comboboxText": "Direction"
144
+ },
145
+ "steps": [
146
+ { "event": "click", "target": "combobox" },
147
+ { "event": "type", "text": "abc", "target": "combobox" },
148
+ { "event": "key", "key": "ArrowDown", "target": "combobox" },
149
+ { "expect": { "focus": "cell:0,0" } },
150
+ { "event": "key", "key": "End", "target": "cell:0,0" },
151
+ { "expect": { "focus": "cell:0,2" } },
152
+ { "event": "key", "key": "ArrowLeft", "target": "cell:0,2" },
153
+ { "expect": { "focus": "cell:0,1" } },
154
+ { "event": "key", "key": "Home", "target": "cell:0,1" },
155
+ { "expect": { "focus": "cell:0,0" } }
156
+ ],
157
+ "notes": "Combobox with a grid popup (extension): arrow/Home/End move focus through gridcells while the text cursor in the input is unchanged."
158
+ },
159
+ {
160
+ "id": "grid.ariakit.combobox-grid-nested-roles",
161
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/combobox-grid/test.ts#L66",
162
+ "upstreamTest": "combobox-grid > uses the nested grid role for groups and rows",
163
+ "apg": "extension",
164
+ "config": {
165
+ "layout": "grid",
166
+ "popup": true,
167
+ "grouped": true,
168
+ "rows": 1,
169
+ "cols": 2,
170
+ "comboboxText": "Grouped direction"
171
+ },
172
+ "steps": [
173
+ { "event": "click", "target": "combobox" },
174
+ {
175
+ "expect": {
176
+ "visible": ["rowgroup:0", "row:0", "cell:0,0", "cell:0,1"]
177
+ }
178
+ }
179
+ ],
180
+ "notes": "Extension: the popup exposes rowgroup/row/gridcell structure rather than a flat listbox."
181
+ }
182
+ ],
183
+ "skipped": [
184
+ {
185
+ "reason": "composite-navigation/test.ts: non-grid composite tests (BasicComposite, toolbar legacy focus order, distant composite) target buttons/toolbars, not the grid pattern"
186
+ },
187
+ {
188
+ "reason": "composite-item-tabbable/test.ts: option/listbox roving tabindex and disabled-item resolution, not a grid"
189
+ },
190
+ {
191
+ "reason": "composite-typeahead-buffer, composite-6299, composite-6335, composite-7360, composite-presentation-cancel*, composite-virtual-focus-events, composite-hover-virtual-focus-events, composite-perf: focus-restoration, virtualisation and perf internals"
192
+ },
193
+ {
194
+ "reason": "combobox-select-grid/test.ts: select-with-grid-popup value/selection behaviour (combobox/select pattern)"
195
+ }
196
+ ]
197
+ }