@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,595 @@
1
+ {
2
+ "pattern": "toolbar",
3
+ "source": "ariakit",
4
+ "commit": "404c72257b879569feb08465da4ff9915fd873da",
5
+ "license": "MIT",
6
+ "skipped": [
7
+ {
8
+ "reason": "composite-navigation 'navigates a grid without focus shifting' - 2D grid model, not the toolbar roving model"
9
+ },
10
+ {
11
+ "reason": "composite-navigation 'navigates a grid with focus shifting' - 2D grid model"
12
+ },
13
+ {
14
+ "reason": "composite-navigation 'moves focus-visible with Ctrl+Home on a grid' - grid modifier/home key, not toolbar"
15
+ },
16
+ {
17
+ "reason": "composite-item-tabbable 'keeps a single tab stop per composite once hydrated' - multiple listbox composites with synthetic Tab, no toolbar part"
18
+ },
19
+ {
20
+ "reason": "composite-item-tabbable 'does not redirect focus to a non-focusable virtual focus owner' - console warning + virtual-focus implementation detail"
21
+ },
22
+ {
23
+ "reason": "composite-late-item-focus pending-move scenarios ('does not redirect a pending item move to the composite', 'does not replay ... after the active id cycles', 'before the first composite mount') - async store lifecycle, not observable keyboard model"
24
+ },
25
+ {
26
+ "reason": "toolbar-iframe-6316 / toolbar-pre-hydration / composite-iframe-* - iframe/hydration platform tests"
27
+ },
28
+ {
29
+ "reason": "composite-perf / composite-page-scroll / composite-superseded-move - performance and scroll internals"
30
+ }
31
+ ],
32
+ "scenarios": [
33
+ {
34
+ "id": "toolbar.ariakit.arrow-home-end",
35
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/toolbar-keyboard-navigation/test.ts#L5",
36
+ "upstreamTest": "moves through toolbar items with keyboard commands",
37
+ "apg": "keyboard",
38
+ "config": {
39
+ "orientation": "horizontal",
40
+ "items": ["Undo", "Redo", "separator", "Bold", "Italic", "Underline"],
41
+ "disabled": ["Redo"]
42
+ },
43
+ "steps": [
44
+ { "event": "focus", "target": "item:0" },
45
+ { "event": "key", "key": "ArrowRight", "target": "item:0" },
46
+ { "expect": { "focus": "item:3" } },
47
+ { "event": "key", "key": "End", "target": "item:3" },
48
+ { "expect": { "focus": "item:5" } },
49
+ { "event": "key", "key": "Home", "target": "item:5" },
50
+ { "expect": { "focus": "item:0" } },
51
+ { "event": "key", "key": "ArrowDown", "target": "item:0" },
52
+ { "expect": { "focus": "item:0" } }
53
+ ],
54
+ "notes": "Disabled Redo and the separator are skipped; orthogonal arrow is a no-op."
55
+ },
56
+ {
57
+ "id": "toolbar.ariakit.enters-disabled-active-item",
58
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/toolbar-keyboard-navigation/test.ts#L25",
59
+ "upstreamTest": "enters a toolbar whose active item is disabled",
60
+ "apg": "keyboard",
61
+ "config": {
62
+ "orientation": "horizontal",
63
+ "items": ["Bold", "Italic", "Underline"],
64
+ "activeItem": 0,
65
+ "disabled": ["Bold"],
66
+ "externalBefore": true,
67
+ "externalAfter": true
68
+ },
69
+ "steps": [
70
+ { "event": "key", "key": "Tab", "target": "toolbar" },
71
+ { "expect": { "focus": "item:1" } },
72
+ { "event": "key", "key": "Tab", "target": "item:1" },
73
+ { "expect": { "focus": null } },
74
+ { "event": "key", "key": "Tab", "modifiers": ["Shift"] },
75
+ { "expect": { "focus": "item:1" } }
76
+ ],
77
+ "notes": "The stored active item is disabled, so entry lands on the first enabled item; Shift+Tab re-entry is stable."
78
+ },
79
+ {
80
+ "id": "toolbar.ariakit.recovers-removed-active-item",
81
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/toolbar-keyboard-navigation/test.ts#L40",
82
+ "upstreamTest": "recovers when the active toolbar item is removed",
83
+ "apg": "keyboard",
84
+ "config": {
85
+ "orientation": "horizontal",
86
+ "items": ["Bold", "Italic", "Underline"]
87
+ },
88
+ "steps": [
89
+ { "event": "focus", "target": "item:0" },
90
+ { "event": "key", "key": "ArrowRight", "target": "item:0" },
91
+ { "expect": { "focus": "item:1" } },
92
+ {
93
+ "event": "prop",
94
+ "target": "toolbar",
95
+ "set": { "removeItem": "item:1" }
96
+ },
97
+ { "event": "key", "key": "Tab", "modifiers": ["Shift"] },
98
+ { "expect": { "focus": "item:1" } },
99
+ { "event": "key", "key": "ArrowLeft", "target": "item:1" },
100
+ { "expect": { "focus": "item:0" } }
101
+ ],
102
+ "notes": "After removing Italic the DOM reindexes: Underline becomes item:1 and receives re-entry focus."
103
+ },
104
+ {
105
+ "id": "toolbar.ariakit.combobox-select-consumes-arrows",
106
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/toolbar-keyboard-navigation/test.ts#L58",
107
+ "upstreamTest": "composes a ComboboxSelect with toolbar navigation",
108
+ "apg": "extension",
109
+ "config": {
110
+ "orientation": "horizontal",
111
+ "items": ["Bold", "Italic", "Underline", "separator", "combobox"]
112
+ },
113
+ "steps": [
114
+ { "event": "focus", "target": "item:0" },
115
+ { "event": "key", "key": "End", "target": "item:0" },
116
+ { "expect": { "focus": "item:4" } },
117
+ { "event": "key", "key": "ArrowDown", "target": "item:4" },
118
+ { "expect": { "focus": "option:0", "visible": ["popup"] } },
119
+ { "event": "key", "key": "ArrowDown", "target": "option:0" },
120
+ { "expect": { "focus": "option:1" } },
121
+ { "event": "key", "key": "Enter", "target": "option:1" },
122
+ { "expect": { "value": "Align Center", "focus": "item:4" } },
123
+ { "event": "key", "key": "ArrowLeft", "target": "item:4" },
124
+ { "expect": { "focus": "item:2" } }
125
+ ],
126
+ "notes": "The combobox consumes arrows while open; after selection the toolbar resumes roving focus. Nested control, not APG."
127
+ },
128
+ {
129
+ "id": "toolbar.ariakit.textbox-consumes-composing-enter",
130
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/toolbar-container-focus/test.ts#L16",
131
+ "upstreamTest": "keeps focus in the field on composing Enter",
132
+ "apg": "extension",
133
+ "config": { "orientation": "horizontal", "items": ["textbox", "button"] },
134
+ "steps": [
135
+ { "event": "focus", "target": "item:0" },
136
+ {
137
+ "event": "key",
138
+ "key": "Enter",
139
+ "isComposing": true,
140
+ "target": "item:0"
141
+ },
142
+ { "expect": { "focus": "item:0" } }
143
+ ],
144
+ "notes": "IME composition Enter (also the Safari keyCode 229 variant) must not trigger toolbar navigation. Nested control, not APG."
145
+ },
146
+ {
147
+ "id": "toolbar.ariakit.separator-orientation",
148
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/toolbar-separator-6302/test.ts#L5",
149
+ "upstreamTest": "honors explicit toolbar separator orientation",
150
+ "apg": "aria",
151
+ "config": {
152
+ "orientation": "horizontal",
153
+ "items": ["separator", "separator", "separator"],
154
+ "separatorOrientations": ["vertical", "horizontal", "inherit"]
155
+ },
156
+ "steps": [
157
+ {
158
+ "expect": {
159
+ "attrs": {
160
+ "item:0": { "aria-orientation": "vertical" },
161
+ "item:1": { "aria-orientation": "horizontal" },
162
+ "item:2": { "aria-orientation": "vertical" }
163
+ }
164
+ }
165
+ }
166
+ ],
167
+ "notes": "Explicit separator aria-orientation wins; unspecified falls back to the toolbar's orientation."
168
+ },
169
+ {
170
+ "id": "toolbar.ariakit.composite-menubar-horizontal",
171
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menubar-composite-orientation/test-chrome.ts#L4",
172
+ "upstreamTest": "renders role and orientation attributes for composite menubars > default",
173
+ "apg": "extension",
174
+ "config": { "role": "menubar", "orientation": "horizontal" },
175
+ "steps": [
176
+ {
177
+ "expect": {
178
+ "attrs": {
179
+ "toolbar": { "role": "menubar", "aria-orientation": "horizontal" }
180
+ }
181
+ }
182
+ }
183
+ ],
184
+ "notes": "Same composite model as toolbar; menubar, not toolbar."
185
+ },
186
+ {
187
+ "id": "toolbar.ariakit.composite-menubar-vertical",
188
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menubar-composite-orientation/test-chrome.ts#L13",
189
+ "upstreamTest": "renders role and orientation attributes for composite menubars > vertical",
190
+ "apg": "extension",
191
+ "config": { "role": "menubar", "orientation": "vertical" },
192
+ "steps": [
193
+ {
194
+ "expect": {
195
+ "attrs": {
196
+ "toolbar": { "role": "menubar", "aria-orientation": "vertical" }
197
+ }
198
+ }
199
+ }
200
+ ]
201
+ },
202
+ {
203
+ "id": "toolbar.ariakit.composite-menubar-both-omits-orientation",
204
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menubar-composite-orientation/test-chrome.ts#L19",
205
+ "upstreamTest": "renders role and orientation attributes for composite menubars > both",
206
+ "apg": "extension",
207
+ "config": { "role": "menubar", "orientation": "both" },
208
+ "steps": [
209
+ {
210
+ "expect": {
211
+ "attrs": {
212
+ "toolbar": { "role": "menubar", "aria-orientation": null }
213
+ }
214
+ }
215
+ }
216
+ ],
217
+ "notes": "Orientation 'both' navigates on two axes, so aria-orientation is omitted."
218
+ },
219
+ {
220
+ "id": "toolbar.ariakit.composite-false-omits-role",
221
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/menubar-composite-orientation/test-chrome.ts#L24",
222
+ "upstreamTest": "omits menubar role and orientation when composite is false",
223
+ "apg": "extension",
224
+ "config": { "role": "menubar", "composite": false },
225
+ "steps": [
226
+ {
227
+ "expect": {
228
+ "attrs": { "toolbar": { "role": null, "aria-orientation": null } }
229
+ }
230
+ }
231
+ ]
232
+ },
233
+ {
234
+ "id": "toolbar.ariakit.non-looping-composite",
235
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/composite-navigation/test.ts#L4",
236
+ "upstreamTest": "navigates a non-looping composite",
237
+ "apg": "keyboard",
238
+ "config": {
239
+ "orientation": "both",
240
+ "loopFocus": false,
241
+ "items": ["Apple", "Grape", "Orange"]
242
+ },
243
+ "steps": [
244
+ { "event": "key", "key": "Tab", "target": "toolbar" },
245
+ {
246
+ "expect": {
247
+ "focus": "item:0",
248
+ "attrs": { "item:0": { "data-active-item": "" } }
249
+ }
250
+ },
251
+ { "event": "key", "key": "ArrowDown", "target": "item:0" },
252
+ { "expect": { "focus": "item:1" } },
253
+ { "event": "key", "key": "ArrowDown", "target": "item:1" },
254
+ { "expect": { "focus": "item:2" } },
255
+ { "event": "key", "key": "ArrowUp", "target": "item:2" },
256
+ { "expect": { "focus": "item:1" } },
257
+ { "event": "key", "key": "ArrowRight", "target": "item:1" },
258
+ { "expect": { "focus": "item:2" } },
259
+ { "event": "key", "key": "ArrowLeft", "target": "item:2" },
260
+ { "expect": { "focus": "item:1" } },
261
+ { "event": "key", "key": "ArrowDown", "target": "item:1" },
262
+ { "event": "key", "key": "ArrowDown", "target": "item:2" },
263
+ { "expect": { "focus": "item:2" } }
264
+ ],
265
+ "notes": "Both axes navigate; the composite does not wrap at either end."
266
+ },
267
+ {
268
+ "id": "toolbar.ariakit.focus-visible-follows-roving",
269
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/composite-navigation/test.ts#L35",
270
+ "upstreamTest": "moves focus-visible state to the next item",
271
+ "apg": "extension",
272
+ "config": {
273
+ "orientation": "both",
274
+ "items": ["Apple", "Grape", "Orange"]
275
+ },
276
+ "steps": [
277
+ { "event": "key", "key": "Tab", "target": "toolbar" },
278
+ {
279
+ "expect": {
280
+ "attrs": {
281
+ "item:0": {
282
+ "data-focus-visible": "true",
283
+ "data-active-item": "true"
284
+ }
285
+ }
286
+ }
287
+ },
288
+ { "event": "key", "key": "ArrowDown", "target": "item:0" },
289
+ {
290
+ "expect": {
291
+ "focus": "item:1",
292
+ "attrs": {
293
+ "item:0": {
294
+ "data-focus-visible": null,
295
+ "data-active-item": null
296
+ },
297
+ "item:1": {
298
+ "data-focus-visible": "true",
299
+ "data-active-item": "true"
300
+ }
301
+ }
302
+ }
303
+ }
304
+ ],
305
+ "notes": "data-focus-visible is a styling attribute; recorded as extension to the keyboard model."
306
+ },
307
+ {
308
+ "id": "toolbar.ariakit.alt-modified-arrow-moves-focus",
309
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/composite-navigation/test.ts#L83",
310
+ "upstreamTest": "moves focus-visible with an Alt-modified navigation key",
311
+ "apg": "extension",
312
+ "config": {
313
+ "orientation": "both",
314
+ "items": ["Apple", "Grape", "Orange"]
315
+ },
316
+ "steps": [
317
+ { "event": "click", "target": "item:0" },
318
+ {
319
+ "expect": {
320
+ "focus": "item:0",
321
+ "attrs": { "item:0": { "data-focus-visible": null } }
322
+ }
323
+ },
324
+ {
325
+ "event": "key",
326
+ "key": "ArrowDown",
327
+ "target": "item:0",
328
+ "modifiers": ["Alt"]
329
+ },
330
+ {
331
+ "expect": {
332
+ "focus": "item:1",
333
+ "attrs": { "item:1": { "data-focus-visible": "true" } }
334
+ }
335
+ }
336
+ ]
337
+ },
338
+ {
339
+ "id": "toolbar.ariakit.plain-shortcut-keeps-pointer-modality",
340
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/composite-navigation/test.ts#L130",
341
+ "upstreamTest": "keeps pointer modality on a modified non-navigation key",
342
+ "apg": "extension",
343
+ "config": {
344
+ "orientation": "both",
345
+ "items": ["Apple", "Grape", "Orange"]
346
+ },
347
+ "steps": [
348
+ { "event": "click", "target": "item:2" },
349
+ {
350
+ "event": "key",
351
+ "key": "c",
352
+ "target": "item:2",
353
+ "modifiers": ["Control"]
354
+ },
355
+ {
356
+ "expect": {
357
+ "focus": "item:2",
358
+ "attrs": { "item:2": { "data-focus-visible": null } }
359
+ }
360
+ },
361
+ { "event": "focus", "target": "item:1" },
362
+ {
363
+ "expect": {
364
+ "focus": "item:1",
365
+ "attrs": { "item:1": { "data-focus-visible": null } }
366
+ }
367
+ }
368
+ ],
369
+ "notes": "A modified non-navigation key must not switch to keyboard modality."
370
+ },
371
+ {
372
+ "id": "toolbar.ariakit.includes-composite-element-in-focus-order",
373
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/composite-navigation/test.ts#L151",
374
+ "upstreamTest": "updates focus order through the deprecated prop",
375
+ "apg": "extension",
376
+ "config": {
377
+ "orientation": "horizontal",
378
+ "items": ["Legacy one", "Legacy two"],
379
+ "includesBaseElement": true
380
+ },
381
+ "steps": [
382
+ { "event": "focus", "target": "item:1" },
383
+ { "event": "key", "key": "ArrowRight", "target": "item:1" },
384
+ { "expect": { "focus": "toolbar" } }
385
+ ],
386
+ "notes": "With includesBaseElement the container itself joins the focus order."
387
+ },
388
+ {
389
+ "id": "toolbar.ariakit.accessible-disabled-inherited-focusable",
390
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/composite-item-tabbable/test.ts#L51",
391
+ "upstreamTest": "moves to an accessible disabled item inherited through composition",
392
+ "apg": "keyboard",
393
+ "config": {
394
+ "orientation": "horizontal",
395
+ "items": ["Inherited one", "Inherited two"],
396
+ "disabledFocusable": ["Inherited two"]
397
+ },
398
+ "steps": [
399
+ { "event": "click", "target": "item:0" },
400
+ {
401
+ "expect": {
402
+ "focus": "item:0",
403
+ "attrs": {
404
+ "item:1": {
405
+ "aria-disabled": "true",
406
+ "disabled": null,
407
+ "data-truly-disabled": "false"
408
+ }
409
+ }
410
+ }
411
+ },
412
+ { "event": "key", "key": "ArrowRight", "target": "item:0" },
413
+ { "expect": { "focus": "item:1" } }
414
+ ],
415
+ "notes": "aria-disabled but not natively disabled => still focusable."
416
+ },
417
+ {
418
+ "id": "toolbar.ariakit.accessible-disabled-resolved-below",
419
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/composite-item-tabbable/test.ts#L69",
420
+ "upstreamTest": "moves to an accessible disabled item resolved below it",
421
+ "apg": "keyboard",
422
+ "config": {
423
+ "orientation": "horizontal",
424
+ "items": ["Rendered one", "Rendered two"],
425
+ "disabledFocusable": ["Rendered two"]
426
+ },
427
+ "steps": [
428
+ { "event": "click", "target": "item:0" },
429
+ {
430
+ "expect": {
431
+ "attrs": {
432
+ "item:1": {
433
+ "aria-disabled": "true",
434
+ "disabled": null,
435
+ "data-truly-disabled": "false"
436
+ }
437
+ }
438
+ }
439
+ },
440
+ { "event": "key", "key": "ArrowRight", "target": "item:0" },
441
+ { "expect": { "focus": "item:1" } }
442
+ ]
443
+ },
444
+ {
445
+ "id": "toolbar.ariakit.skips-disabled-resolved-below",
446
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/composite-item-tabbable/test.ts#L83",
447
+ "upstreamTest": "skips a disabled item resolved below it",
448
+ "apg": "keyboard",
449
+ "config": {
450
+ "orientation": "horizontal",
451
+ "items": ["Nested one", "Nested two", "Nested three"],
452
+ "disabled": ["Nested two"]
453
+ },
454
+ "steps": [
455
+ { "event": "click", "target": "item:0" },
456
+ { "expect": { "attrs": { "item:1": { "disabled": "" } } } },
457
+ { "event": "key", "key": "ArrowRight", "target": "item:0" },
458
+ { "expect": { "focus": "item:2" } }
459
+ ]
460
+ },
461
+ {
462
+ "id": "toolbar.ariakit.skips-disabled-inactive-focusable",
463
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/composite-item-tabbable/test.ts#L91",
464
+ "upstreamTest": "skips a disabled item with an inactive Focusable",
465
+ "apg": "keyboard",
466
+ "config": {
467
+ "orientation": "horizontal",
468
+ "items": ["Inactive one", "Inactive two", "Inactive three"]
469
+ },
470
+ "steps": [
471
+ { "event": "click", "target": "item:0" },
472
+ { "event": "key", "key": "ArrowRight", "target": "item:0" },
473
+ { "expect": { "focus": "item:2" } }
474
+ ]
475
+ },
476
+ {
477
+ "id": "toolbar.ariakit.skips-disabled-inactive-focusable-below",
478
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/composite-item-tabbable/test.ts#L98",
479
+ "upstreamTest": "skips a disabled item with an inactive Focusable below it",
480
+ "apg": "keyboard",
481
+ "config": {
482
+ "orientation": "horizontal",
483
+ "items": [
484
+ "Rendered inactive one",
485
+ "Rendered inactive two",
486
+ "Rendered inactive three"
487
+ ]
488
+ },
489
+ "steps": [
490
+ { "event": "click", "target": "item:0" },
491
+ { "event": "key", "key": "ArrowRight", "target": "item:0" },
492
+ { "expect": { "focus": "item:2" } }
493
+ ]
494
+ },
495
+ {
496
+ "id": "toolbar.ariakit.moves-to-accessible-disabled-active-focusable",
497
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/composite-item-tabbable/test.ts#L105",
498
+ "upstreamTest": "moves to an accessible disabled item with an active Focusable below it",
499
+ "apg": "keyboard",
500
+ "config": {
501
+ "orientation": "horizontal",
502
+ "items": ["Rendered active one", "Rendered active two"],
503
+ "accessibleDisabled": ["Rendered active two"]
504
+ },
505
+ "steps": [
506
+ { "event": "click", "target": "item:0" },
507
+ {
508
+ "expect": {
509
+ "attrs": { "item:1": { "data-truly-disabled": "false" } }
510
+ }
511
+ },
512
+ { "event": "key", "key": "ArrowRight", "target": "item:0" },
513
+ { "expect": { "focus": "item:1" } }
514
+ ]
515
+ },
516
+ {
517
+ "id": "toolbar.ariakit.skips-direct-disabled-inactive-accessible",
518
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/composite-item-tabbable/test.ts#L117",
519
+ "upstreamTest": "skips a directly disabled item with an inactive accessible Focusable",
520
+ "apg": "keyboard",
521
+ "config": {
522
+ "orientation": "horizontal",
523
+ "items": [
524
+ "Direct accessible inactive one",
525
+ "Direct accessible inactive two",
526
+ "Direct accessible inactive three"
527
+ ]
528
+ },
529
+ "steps": [
530
+ { "event": "click", "target": "item:0" },
531
+ { "event": "key", "key": "ArrowRight", "target": "item:0" },
532
+ { "expect": { "focus": "item:2" } }
533
+ ]
534
+ },
535
+ {
536
+ "id": "toolbar.ariakit.skips-inherited-disabled-inactive-accessible",
537
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/composite-item-tabbable/test.ts#L124",
538
+ "upstreamTest": "skips an inherited disabled item with an inactive accessible Focusable",
539
+ "apg": "keyboard",
540
+ "config": {
541
+ "orientation": "horizontal",
542
+ "items": [
543
+ "Inherited accessible inactive one",
544
+ "Inherited accessible inactive two",
545
+ "Inherited accessible inactive three"
546
+ ]
547
+ },
548
+ "steps": [
549
+ { "event": "click", "target": "item:0" },
550
+ { "event": "key", "key": "ArrowRight", "target": "item:0" },
551
+ { "expect": { "focus": "item:2" } }
552
+ ]
553
+ },
554
+ {
555
+ "id": "toolbar.ariakit.late-item-not-refocused-after-focus-leaves",
556
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/composite-late-item-focus/test.ts#L5",
557
+ "upstreamTest": "does not refocus a late item after focus leaves the composite",
558
+ "apg": "keyboard",
559
+ "config": { "orientation": "horizontal", "items": ["First", "Second"] },
560
+ "steps": [
561
+ { "event": "focus", "target": "item:0" },
562
+ { "event": "key", "key": "ArrowDown", "target": "item:0" },
563
+ { "expect": { "focus": "item:1" } },
564
+ { "event": "key", "key": "Tab", "target": "item:1" },
565
+ { "expect": { "focus": null } },
566
+ {
567
+ "event": "prop",
568
+ "target": "toolbar",
569
+ "set": { "appendItem": "Late" }
570
+ },
571
+ { "expect": { "focus": null } }
572
+ ],
573
+ "notes": "Mounting a new item while focus is outside must not steal focus back into the composite."
574
+ },
575
+ {
576
+ "id": "toolbar.ariakit.only-latest-item-after-rapid-moves",
577
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/composite-late-item-focus/test.ts#L30",
578
+ "upstreamTest": "only focuses the latest item after rapid unresolved moves",
579
+ "apg": "keyboard",
580
+ "config": { "orientation": "horizontal", "items": ["First", "Second"] },
581
+ "steps": [
582
+ { "event": "focus", "target": "item:0" },
583
+ { "event": "key", "key": "ArrowDown", "target": "item:0" },
584
+ { "event": "key", "key": "ArrowDown", "target": "item:1" },
585
+ {
586
+ "event": "prop",
587
+ "target": "toolbar",
588
+ "set": { "appendItems": ["Late", "Later"] }
589
+ },
590
+ { "expect": { "focus": "item:3" } }
591
+ ],
592
+ "notes": "After rapid moves and a late mount, only the latest requested item (item:3 'Later') holds focus, not 'Late'."
593
+ }
594
+ ]
595
+ }