@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,93 @@
1
+ {
2
+ "pattern": "landmarks",
3
+ "source": "ariakit",
4
+ "commit": "404c72257b879569feb08465da4ff9915fd873da",
5
+ "license": "MIT",
6
+ "skipped": [
7
+ {
8
+ "reason": "renders every nav row without repeated or important gap classes"
9
+ },
10
+ { "reason": "lets a nav disclosure override the defaults of its row" },
11
+ {
12
+ "reason": "keeps a disclosure badge beside the label without a description"
13
+ },
14
+ {
15
+ "reason": "keeps a disclosure badge beside a consumer label component with a description"
16
+ },
17
+ {
18
+ "reason": "keeps a bare fragment label separate from its description and badge"
19
+ }
20
+ ],
21
+ "scenarios": [
22
+ {
23
+ "id": "landmarks.ariakit.navigation-named-landmark",
24
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/ariakit-ui-nav/test.ts#L88",
25
+ "upstreamTest": "names a link by its label and describes it by its description",
26
+ "apg": "aria",
27
+ "config": { "label": "Link descriptions" },
28
+ "steps": [
29
+ {
30
+ "expect": {
31
+ "attrs": {
32
+ "navigation": {
33
+ "role": "navigation",
34
+ "aria-label": "Link descriptions"
35
+ }
36
+ }
37
+ }
38
+ }
39
+ ]
40
+ },
41
+ {
42
+ "id": "landmarks.ariakit.navigation-lists-its-rows",
43
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/ariakit-ui-nav/test.ts#L95",
44
+ "upstreamTest": "keeps anchor props, events, and refs on a wrapped link",
45
+ "apg": "aria",
46
+ "config": { "label": "Link wrappers", "items": 3 },
47
+ "steps": [
48
+ {
49
+ "expect": {
50
+ "visible": ["navigation", "listitem:0", "listitem:1", "listitem:2"]
51
+ }
52
+ }
53
+ ],
54
+ "notes": "Navigation rows are listitems; the wrapped link keeps its <li> parent."
55
+ },
56
+ {
57
+ "id": "landmarks.ariakit.single-link-nav-has-no-listitems",
58
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/ariakit-ui-nav/test.ts#L109",
59
+ "upstreamTest": "keeps anchor props, events, and refs on a wrapped link (single link nav)",
60
+ "apg": "aria",
61
+ "config": { "label": "Single link" },
62
+ "steps": [
63
+ {
64
+ "expect": { "visible": ["navigation", "link:0"] }
65
+ }
66
+ ],
67
+ "notes": "A navigation landmark that holds a lone link renders no list/listitem wrapper."
68
+ },
69
+ {
70
+ "id": "landmarks.ariakit.disclosure-button-labelled-and-described",
71
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/ariakit-ui-nav/test.ts#L60",
72
+ "upstreamTest": "keeps a disclosure badge beside a consumer label component with a description",
73
+ "apg": "extension",
74
+ "config": {
75
+ "labelId": "nav-pages-label",
76
+ "descriptionId": "nav-pages-description"
77
+ },
78
+ "steps": [
79
+ {
80
+ "expect": {
81
+ "attrs": {
82
+ "button": {
83
+ "aria-labelledby": "nav-pages-label",
84
+ "aria-describedby": "nav-pages-description"
85
+ }
86
+ }
87
+ }
88
+ }
89
+ ],
90
+ "notes": "The consumer label component supplies the accessible name; the description is exposed through aria-describedby."
91
+ }
92
+ ]
93
+ }
@@ -0,0 +1,330 @@
1
+ {
2
+ "pattern": "landmarks",
3
+ "source": "react-aria",
4
+ "commit": "99e610236887da619ad9d54a1cd87983166c043d",
5
+ "license": "Apache-2.0",
6
+ "skipped": [
7
+ {
8
+ "reason": "LandmarkManager > focuses the landmark again after toggling browser tabs"
9
+ },
10
+ {
11
+ "reason": "LandmarkManager > focuses the landmark again after toggling browser windows"
12
+ },
13
+ {
14
+ "reason": "LandmarkManager > cleans up event listeners if all landmarks are unmounted"
15
+ },
16
+ {
17
+ "reason": "LandmarkManager > landmark navigation fires custom event when wrapping forward/backward"
18
+ },
19
+ {
20
+ "reason": "LandmarkController > should ensure keyboard listeners are active"
21
+ },
22
+ {
23
+ "reason": "LandmarkController > should navigate forward/backward, should focus main"
24
+ },
25
+ {
26
+ "reason": "singleton > should store the landmark manager on the document"
27
+ },
28
+ { "reason": "singleton > should replace the singleton with a new version" },
29
+ {
30
+ "reason": "LandmarkManager > components that already handle focus management should handle focus themselves"
31
+ }
32
+ ],
33
+ "scenarios": [
34
+ {
35
+ "id": "landmarks.react-aria.roles-are-exposed",
36
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria/test/landmark/useLandmark.test.tsx#L140",
37
+ "upstreamTest": "LandmarkManager > can tab into a landmark region",
38
+ "apg": "aria",
39
+ "config": { "landmarks": ["navigation", "main"] },
40
+ "steps": [
41
+ {
42
+ "expect": {
43
+ "attrs": {
44
+ "navigation": { "role": "navigation" },
45
+ "main": { "role": "main" }
46
+ }
47
+ }
48
+ }
49
+ ]
50
+ },
51
+ {
52
+ "id": "landmarks.react-aria.tab-enters-first-link",
53
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria/test/landmark/useLandmark.test.tsx#L119",
54
+ "upstreamTest": "LandmarkManager > can tab into a landmark region",
55
+ "apg": "keyboard",
56
+ "config": { "landmarks": ["navigation", "main"] },
57
+ "steps": [
58
+ { "event": "key", "key": "Tab" },
59
+ { "expect": { "focus": "link:0" } }
60
+ ]
61
+ },
62
+ {
63
+ "id": "landmarks.react-aria.f6-cycles-landmarks",
64
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria/test/landmark/useLandmark.test.tsx#L149",
65
+ "upstreamTest": "LandmarkManager > can F6 to a landmark region",
66
+ "apg": "extension",
67
+ "config": { "landmarks": ["navigation", "main"] },
68
+ "steps": [
69
+ { "event": "key", "key": "F6" },
70
+ { "expect": { "focus": "navigation" } },
71
+ { "event": "key", "key": "F6" },
72
+ { "expect": { "focus": "main" } },
73
+ { "event": "key", "key": "F6" },
74
+ { "expect": { "focus": "navigation" } }
75
+ ],
76
+ "notes": "F6 landmark cycling is a react-aria extension, not part of the APG landmarks pattern."
77
+ },
78
+ {
79
+ "id": "landmarks.react-aria.f6-single-landmark",
80
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria/test/landmark/useLandmark.test.tsx#L180",
81
+ "upstreamTest": "LandmarkManager > can F6 to a landmark region when there is only one landmark",
82
+ "apg": "extension",
83
+ "config": { "landmarks": ["main"] },
84
+ "steps": [
85
+ { "event": "key", "key": "F6" },
86
+ { "expect": { "focus": "main" } }
87
+ ]
88
+ },
89
+ {
90
+ "id": "landmarks.react-aria.f6-visits-nested-region",
91
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria/test/landmark/useLandmark.test.tsx#L194",
92
+ "upstreamTest": "LandmarkManager > can F6 to a nested landmark region that is first",
93
+ "apg": "extension",
94
+ "config": { "landmarks": ["main", "region"] },
95
+ "steps": [
96
+ { "event": "key", "key": "F6" },
97
+ { "expect": { "focus": "main" } },
98
+ { "event": "key", "key": "F6" },
99
+ { "expect": { "focus": "region:0" } },
100
+ { "event": "key", "key": "F6" },
101
+ { "expect": { "focus": "main" } }
102
+ ]
103
+ },
104
+ {
105
+ "id": "landmarks.react-aria.shift-f6-moves-backward",
106
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria/test/landmark/useLandmark.test.tsx#L398",
107
+ "upstreamTest": "LandmarkManager > can shift+F6 to a landmark region",
108
+ "apg": "extension",
109
+ "config": { "landmarks": ["navigation", "main"] },
110
+ "steps": [
111
+ { "event": "key", "key": "Shift+F6" },
112
+ { "expect": { "focus": "main" } },
113
+ { "event": "key", "key": "Shift+F6" },
114
+ { "expect": { "focus": "navigation" } }
115
+ ]
116
+ },
117
+ {
118
+ "id": "landmarks.react-aria.forward-navigation-wraps",
119
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria/test/landmark/useLandmark.test.tsx#L336",
120
+ "upstreamTest": "LandmarkManager > landmark navigation forward wraps",
121
+ "apg": "extension",
122
+ "config": { "landmarks": ["navigation", "main"] },
123
+ "steps": [
124
+ { "event": "key", "key": "Tab" },
125
+ { "expect": { "focus": "link:0" } },
126
+ { "event": "key", "key": "F6" },
127
+ { "expect": { "focus": "main" } },
128
+ { "event": "key", "key": "F6" },
129
+ { "expect": { "focus": "link:0" } }
130
+ ]
131
+ },
132
+ {
133
+ "id": "landmarks.react-aria.alt-f6-jumps-to-main",
134
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria/test/landmark/useLandmark.test.tsx#L912",
135
+ "upstreamTest": "LandmarkManager > can alt+F6 to main landmark",
136
+ "apg": "extension",
137
+ "config": { "landmarks": ["navigation", "region", "main"] },
138
+ "steps": [
139
+ { "event": "key", "key": "F6" },
140
+ { "expect": { "focus": "navigation" } },
141
+ { "event": "key", "key": "Alt+F6" },
142
+ { "expect": { "focus": "main" } },
143
+ { "event": "key", "key": "Alt+F6" },
144
+ { "expect": { "focus": "main" } }
145
+ ]
146
+ },
147
+ {
148
+ "id": "landmarks.react-aria.alt-f6-noop-without-main",
149
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria/test/landmark/useLandmark.test.tsx#L952",
150
+ "upstreamTest": "LandmarkManager > alt+F6 does nothing if no main landmark",
151
+ "apg": "extension",
152
+ "config": { "landmarks": ["navigation", "region"] },
153
+ "steps": [
154
+ { "event": "key", "key": "F6" },
155
+ { "expect": { "focus": "navigation" } },
156
+ { "event": "key", "key": "Alt+F6" },
157
+ { "expect": { "focus": "navigation" } }
158
+ ]
159
+ },
160
+ {
161
+ "id": "landmarks.react-aria.tabindex-only-on-focused",
162
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria/test/landmark/useLandmark.test.tsx#L1002",
163
+ "upstreamTest": "LandmarkManager > landmark has tabIndex=\"-1\" when focused",
164
+ "apg": "aria",
165
+ "config": { "landmarks": ["navigation", "main"] },
166
+ "steps": [
167
+ {
168
+ "expect": {
169
+ "attrs": {
170
+ "navigation": { "tabindex": null },
171
+ "main": { "tabindex": null }
172
+ }
173
+ }
174
+ },
175
+ { "event": "key", "key": "F6" },
176
+ {
177
+ "expect": {
178
+ "attrs": {
179
+ "navigation": { "tabindex": "-1" },
180
+ "main": { "tabindex": null }
181
+ }
182
+ }
183
+ },
184
+ { "event": "key", "key": "F6" },
185
+ {
186
+ "expect": {
187
+ "attrs": {
188
+ "navigation": { "tabindex": null },
189
+ "main": { "tabindex": "-1" }
190
+ }
191
+ }
192
+ }
193
+ ],
194
+ "notes": "Only the currently focused landmark is made programmatically focusable."
195
+ },
196
+ {
197
+ "id": "landmarks.react-aria.tabindex-cleared-on-blur",
198
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria/test/landmark/useLandmark.test.tsx#L1133",
199
+ "upstreamTest": "LandmarkManager > loses the tabIndex=-1 if something else is focused",
200
+ "apg": "aria",
201
+ "config": { "landmarks": ["navigation", "main"] },
202
+ "steps": [
203
+ { "event": "key", "key": "F6" },
204
+ { "expect": { "attrs": { "navigation": { "tabindex": "-1" } } } },
205
+ { "event": "key", "key": "Tab" },
206
+ {
207
+ "expect": {
208
+ "focus": "link:0",
209
+ "attrs": { "navigation": { "tabindex": null } }
210
+ }
211
+ }
212
+ ]
213
+ },
214
+ {
215
+ "id": "landmarks.react-aria.skips-aria-hidden-landmarks",
216
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria/test/landmark/useLandmark.test.tsx#L1412",
217
+ "upstreamTest": "LandmarkManager > skips over aria-hidden landmarks",
218
+ "apg": "extension",
219
+ "config": { "landmarks": ["main", "region", "region"] },
220
+ "steps": [
221
+ { "event": "key", "key": "F6" },
222
+ { "expect": { "focus": "main" } },
223
+ { "event": "key", "key": "F6" },
224
+ { "expect": { "focus": "region:1" } },
225
+ { "event": "key", "key": "Shift+F6" },
226
+ { "expect": { "focus": "main" } }
227
+ ],
228
+ "notes": "The first region sits inside an aria-hidden subtree and is skipped."
229
+ },
230
+ {
231
+ "id": "landmarks.react-aria.reclick-landmark-keeps-focus",
232
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria/test/landmark/useLandmark.test.tsx#L1291",
233
+ "upstreamTest": "LandmarkManager > focus restores to previously focused landmark after blur and F6",
234
+ "apg": "extension",
235
+ "config": { "landmarks": ["navigation", "main"] },
236
+ "steps": [
237
+ { "event": "key", "key": "F6" },
238
+ { "expect": { "focus": "navigation" } },
239
+ { "event": "blur", "target": "navigation" },
240
+ { "expect": { "focus": null } },
241
+ { "event": "key", "key": "F6" },
242
+ { "expect": { "focus": "navigation" } }
243
+ ]
244
+ },
245
+ {
246
+ "id": "landmarks.react-aria.duplicate-roles-must-be-labelled",
247
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria/test/landmark/useLandmark.test.tsx#L593",
248
+ "upstreamTest": "LandmarkManager > Should allow 2+ landmarks with same role if they are labelled",
249
+ "apg": "aria",
250
+ "config": {
251
+ "landmarks": ["navigation", "navigation"],
252
+ "labels": ["First nav", "Second nav"]
253
+ },
254
+ "steps": [
255
+ {
256
+ "expect": {
257
+ "attrs": {
258
+ "navigation:0": { "aria-label": "First nav" },
259
+ "navigation:1": { "aria-label": "Second nav" }
260
+ }
261
+ }
262
+ }
263
+ ],
264
+ "notes": "Warn-free when repeated landmark roles have unique labels."
265
+ },
266
+ {
267
+ "id": "landmarks.react-aria.unlabelled-duplicate-warns",
268
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria/test/landmark/useLandmark.test.tsx#L634",
269
+ "upstreamTest": "LandmarkManager > Should warn if 2+ landmarks with same role are used but not labelled",
270
+ "apg": "aria",
271
+ "config": { "landmarks": ["navigation", "navigation"] },
272
+ "steps": [
273
+ {
274
+ "expect": {
275
+ "attrs": {
276
+ "navigation:0": { "aria-label": null },
277
+ "navigation:1": { "aria-label": null }
278
+ }
279
+ }
280
+ }
281
+ ],
282
+ "notes": "React-aria emits a console warning here; the accessible-name gap is the modelled contract."
283
+ },
284
+ {
285
+ "id": "landmarks.react-aria.added-landmark-is-reachable",
286
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria/test/landmark/useLandmark.test.tsx#L777",
287
+ "upstreamTest": "LandmarkManager > Should navigate to a landmark that has been added to the DOM",
288
+ "apg": "extension",
289
+ "config": { "landmarks": ["navigation", "main"] },
290
+ "steps": [
291
+ { "event": "key", "key": "F6" },
292
+ { "expect": { "focus": "navigation" } },
293
+ { "event": "key", "key": "F6" },
294
+ { "expect": { "focus": "main" } },
295
+ {
296
+ "event": "prop",
297
+ "target": "region:0",
298
+ "prop": "mounted",
299
+ "value": true
300
+ },
301
+ { "event": "key", "key": "F6" },
302
+ { "expect": { "focus": "region:0" } }
303
+ ],
304
+ "notes": "A region mounted later joins the F6 cycle in DOM order."
305
+ },
306
+ {
307
+ "id": "landmarks.react-aria.removed-landmark-is-skipped",
308
+ "upstream": "https://github.com/adobe/react-spectrum/blob/99e610236887da619ad9d54a1cd87983166c043d/packages/react-aria/test/landmark/useLandmark.test.tsx#L725",
309
+ "upstreamTest": "LandmarkManager > Should not navigate to a landmark that has been removed from the DOM",
310
+ "apg": "extension",
311
+ "config": { "landmarks": ["navigation", "region", "main"] },
312
+ "steps": [
313
+ { "event": "key", "key": "F6" },
314
+ { "expect": { "focus": "navigation" } },
315
+ { "event": "key", "key": "F6" },
316
+ { "expect": { "focus": "region:0" } },
317
+ { "event": "key", "key": "F6" },
318
+ { "expect": { "focus": "main" } },
319
+ {
320
+ "event": "prop",
321
+ "target": "region:0",
322
+ "prop": "mounted",
323
+ "value": false
324
+ },
325
+ { "event": "key", "key": "Shift+F6" },
326
+ { "expect": { "focus": "navigation" } }
327
+ ]
328
+ }
329
+ ]
330
+ }
@@ -0,0 +1,83 @@
1
+ {
2
+ "pattern": "link",
3
+ "source": "ariakit",
4
+ "commit": "404c72257b879569feb08465da4ff9915fd873da",
5
+ "license": "MIT",
6
+ "skipped": [
7
+ {
8
+ "reason": "ariakit-ui-link > keeps the focus ring against an inline link (visual)"
9
+ },
10
+ {
11
+ "reason": "ariakit-ui-link > offsets the focus ring of a standalone link (visual)"
12
+ },
13
+ {
14
+ "reason": "keeps anchor props, events, and refs on a wrapped link (class/parent styling assertions)"
15
+ }
16
+ ],
17
+ "scenarios": [
18
+ {
19
+ "id": "link.ariakit.named-by-label-described-by-description",
20
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/ariakit-ui-nav/test.ts#L88",
21
+ "upstreamTest": "names a link by its label and describes it by its description",
22
+ "apg": "aria",
23
+ "config": {
24
+ "labelId": "settings-link",
25
+ "descriptionId": "settings-description"
26
+ },
27
+ "steps": [
28
+ {
29
+ "expect": {
30
+ "attrs": {
31
+ "link": {
32
+ "href": "#settings",
33
+ "aria-labelledby": "settings-link",
34
+ "aria-describedby": "settings-description"
35
+ }
36
+ }
37
+ }
38
+ }
39
+ ],
40
+ "notes": "The label gives the accessible name; the description is exposed via aria-describedby."
41
+ },
42
+ {
43
+ "id": "link.ariakit.anchor-props-retained",
44
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/ariakit-ui-nav/test.ts#L95",
45
+ "upstreamTest": "keeps anchor props, events, and refs on a wrapped link",
46
+ "apg": "aria",
47
+ "config": { "title": "Overview destination" },
48
+ "steps": [
49
+ {
50
+ "expect": {
51
+ "attrs": {
52
+ "link": { "href": "#overview", "title": "Overview destination" }
53
+ }
54
+ }
55
+ }
56
+ ]
57
+ },
58
+ {
59
+ "id": "link.ariakit.link-is-focusable",
60
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/ariakit-ui-nav/test.ts#L105",
61
+ "upstreamTest": "keeps anchor props, events, and refs on a wrapped link (focus)",
62
+ "apg": "aria",
63
+ "config": {},
64
+ "steps": [
65
+ { "event": "click", "target": "button" },
66
+ { "expect": { "focus": "link" } }
67
+ ],
68
+ "notes": "The wrapped anchor keeps its DOM node, so moving focus to it works."
69
+ },
70
+ {
71
+ "id": "link.ariakit.click-activates-link",
72
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/ariakit-ui-nav/test.ts#L107",
73
+ "upstreamTest": "keeps anchor props, events, and refs on a wrapped link (activation)",
74
+ "apg": "keyboard",
75
+ "config": {},
76
+ "steps": [
77
+ { "event": "click", "target": "link" },
78
+ { "expect": { "events": { "onClick": ["A"] } } }
79
+ ],
80
+ "notes": "Clicking the anchor runs the consumer handler; the sandbox records the activated element tag."
81
+ }
82
+ ]
83
+ }
@@ -0,0 +1,88 @@
1
+ {
2
+ "pattern": "link",
3
+ "source": "base-ui",
4
+ "commit": "19511bb171f3b360b006c94cf6d07e53cb446505",
5
+ "license": "MIT",
6
+ "skipped": [
7
+ {
8
+ "reason": "NavigationMenu.Link > prop: closeOnClick (menu open state suite)"
9
+ },
10
+ {
11
+ "reason": "NavigationMenu.Link > keeps the menu open when a link loses focus without a related target"
12
+ },
13
+ {
14
+ "reason": "Menu.LinkItem > does not navigate when Space is pressed during an active typeahead session"
15
+ }
16
+ ],
17
+ "scenarios": [
18
+ {
19
+ "id": "link.base-ui.active-navigation-link-current",
20
+ "upstream": "https://github.com/mui/base-ui/blob/19511bb171f3b360b006c94cf6d07e53cb446505/packages/react/src/navigation-menu/link/NavigationMenuLink.test.tsx#L102",
21
+ "upstreamTest": "NavigationMenu.Link > prop: active > when true, renders with aria-current=\"page\"",
22
+ "apg": "aria",
23
+ "config": { "active": true },
24
+ "steps": [
25
+ {
26
+ "expect": {
27
+ "attrs": { "link": { "role": "link", "aria-current": "page" } }
28
+ }
29
+ }
30
+ ]
31
+ },
32
+ {
33
+ "id": "link.base-ui.inactive-navigation-link-no-current",
34
+ "upstream": "https://github.com/mui/base-ui/blob/19511bb171f3b360b006c94cf6d07e53cb446505/packages/react/src/navigation-menu/link/NavigationMenuLink.test.tsx#L118",
35
+ "upstreamTest": "NavigationMenu.Link > prop: active > when false, does not render with aria-current=\"page\"",
36
+ "apg": "aria",
37
+ "config": { "active": false },
38
+ "steps": [
39
+ {
40
+ "expect": {
41
+ "attrs": { "link": { "role": "link", "aria-current": null } }
42
+ }
43
+ }
44
+ ]
45
+ },
46
+ {
47
+ "id": "link.base-ui.toolbar-link-renders-anchor",
48
+ "upstream": "https://github.com/mui/base-ui/blob/19511bb171f3b360b006c94cf6d07e53cb446505/packages/react/src/toolbar/link/ToolbarLink.test.tsx#L38",
49
+ "upstreamTest": "Toolbar.Link > ARIA attributes > renders an anchor",
50
+ "apg": "aria",
51
+ "config": { "href": "https://base-ui.com" },
52
+ "steps": [
53
+ {
54
+ "expect": {
55
+ "attrs": { "link": { "role": null } }
56
+ }
57
+ }
58
+ ],
59
+ "notes": "With href the part is a native anchor and reports the link role natively."
60
+ },
61
+ {
62
+ "id": "link.base-ui.menu-link-item-enter-activates",
63
+ "upstream": "https://github.com/mui/base-ui/blob/19511bb171f3b360b006c94cf6d07e53cb446505/packages/react/src/menu/link-item/MenuLinkItem.test.tsx#L30",
64
+ "upstreamTest": "Menu.LinkItem > react-router <Link> activates with Enter and Space",
65
+ "apg": "extension",
66
+ "config": { "items": 2 },
67
+ "steps": [
68
+ { "event": "focus", "target": "link:1" },
69
+ { "event": "key", "key": "Enter", "target": "link:1" },
70
+ { "expect": { "events": { "onActivate": ["/two"] } } }
71
+ ],
72
+ "notes": "Menu items are role=menuitem; Enter activation follows the menu pattern, not the link pattern."
73
+ },
74
+ {
75
+ "id": "link.base-ui.menu-link-item-space-activates",
76
+ "upstream": "https://github.com/mui/base-ui/blob/19511bb171f3b360b006c94cf6d07e53cb446505/packages/react/src/menu/link-item/MenuLinkItem.test.tsx#L97",
77
+ "upstreamTest": "Menu.LinkItem > react-router <Link> activates with Enter and Space",
78
+ "apg": "extension",
79
+ "config": { "items": 2 },
80
+ "steps": [
81
+ { "event": "focus", "target": "link:1" },
82
+ { "event": "key", "key": " ", "target": "link:1" },
83
+ { "expect": { "events": { "onActivate": ["/two"] } } }
84
+ ],
85
+ "notes": "Unlike a plain link, a menu item activates on Space as well as Enter."
86
+ }
87
+ ]
88
+ }