@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,945 @@
1
+ {
2
+ "pattern": "combobox",
3
+ "source": "ariakit",
4
+ "commit": "404c72257b879569feb08465da4ff9915fd873da",
5
+ "license": "MIT",
6
+ "scenarios": [
7
+ {
8
+ "id": "combobox.ariakit.show-on-click",
9
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/combobox/test.ts#L8",
10
+ "upstreamTest": "show on click",
11
+ "apg": "pointer",
12
+ "config": {
13
+ "items": ["Apple", "Grape", "Orange", "Strawberry", "Watermelon"]
14
+ },
15
+ "steps": [
16
+ { "expect": { "visible": [] } },
17
+ { "event": "click", "target": "input" },
18
+ { "expect": { "visible": ["popup", "option:0"], "focus": "input" } }
19
+ ],
20
+ "notes": "Clicking the input opens the listbox but does not move focus to any option."
21
+ },
22
+ {
23
+ "id": "combobox.ariakit.label-click-does-not-open",
24
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/combobox/test.ts#L15",
25
+ "upstreamTest": "label click",
26
+ "apg": "extension",
27
+ "config": {
28
+ "items": ["Apple", "Grape", "Orange", "Strawberry", "Watermelon"]
29
+ },
30
+ "steps": [
31
+ { "event": "click", "target": "label" },
32
+ { "expect": { "visible": [] } }
33
+ ],
34
+ "notes": "Pressing the associated label does not open the popup."
35
+ },
36
+ {
37
+ "id": "combobox.ariakit.arrow-down-opens",
38
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/combobox/test.ts#L21",
39
+ "upstreamTest": "show on arrow down key",
40
+ "apg": "keyboard",
41
+ "config": {
42
+ "items": ["Apple", "Grape", "Orange", "Strawberry", "Watermelon"]
43
+ },
44
+ "steps": [
45
+ { "event": "key", "key": "Tab" },
46
+ { "expect": { "visible": [] } },
47
+ { "event": "key", "key": "ArrowDown", "target": "input" },
48
+ { "expect": { "visible": ["popup", "option:0"], "focus": "input" } }
49
+ ],
50
+ "notes": "ArrowDown opens the popup without focusing the first option."
51
+ },
52
+ {
53
+ "id": "combobox.ariakit.arrow-up-opens",
54
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/combobox/test.ts#L29",
55
+ "upstreamTest": "show on arrow up key",
56
+ "apg": "keyboard",
57
+ "config": {
58
+ "items": ["Apple", "Grape", "Orange", "Strawberry", "Watermelon"]
59
+ },
60
+ "steps": [
61
+ { "event": "key", "key": "Tab" },
62
+ { "event": "key", "key": "ArrowUp", "target": "input" },
63
+ { "expect": { "visible": ["popup", "option:4"], "focus": "input" } }
64
+ ],
65
+ "notes": "ArrowUp opens the popup without focusing the last option."
66
+ },
67
+ {
68
+ "id": "combobox.ariakit.typing-opens",
69
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/combobox/test.ts#L37",
70
+ "upstreamTest": "show on change",
71
+ "apg": "keyboard",
72
+ "config": {
73
+ "items": ["Apple", "Grape", "Orange", "Strawberry", "Watermelon"]
74
+ },
75
+ "steps": [
76
+ { "event": "key", "key": "Tab" },
77
+ { "event": "type", "text": "a", "target": "input" },
78
+ { "expect": { "visible": ["popup", "option:0"], "focus": "input" } }
79
+ ],
80
+ "notes": "Typing opens the popup but leaves focus in the input."
81
+ },
82
+ {
83
+ "id": "combobox.ariakit.navigate-with-arrows",
84
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/combobox/test.ts#L45",
85
+ "upstreamTest": "navigate through items with keyboard",
86
+ "apg": "keyboard",
87
+ "config": {
88
+ "items": ["Apple", "Grape", "Orange", "Strawberry", "Watermelon"]
89
+ },
90
+ "steps": [
91
+ { "event": "key", "key": "Tab" },
92
+ { "event": "key", "key": "ArrowDown", "target": "input" },
93
+ { "event": "key", "key": "ArrowDown", "target": "input" },
94
+ { "expect": { "focus": "option:0" } },
95
+ { "event": "key", "key": "ArrowDown", "target": "option:0" },
96
+ { "expect": { "focus": "option:1" } },
97
+ { "event": "key", "key": "ArrowDown", "target": "option:1" },
98
+ { "expect": { "focus": "option:2" } }
99
+ ],
100
+ "notes": "The first ArrowDown only opens the list; the next moves DOM focus to the first option, then down the list. This is ariakit's focus-based active item rather than aria-activedescendant."
101
+ },
102
+ {
103
+ "id": "combobox.ariakit.typing-moves-caret-not-selection",
104
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/combobox/test.ts#L56",
105
+ "upstreamTest": "type",
106
+ "apg": "keyboard",
107
+ "config": {
108
+ "items": ["Apple", "Grape", "Orange", "Strawberry", "Watermelon"]
109
+ },
110
+ "steps": [
111
+ { "event": "key", "key": "Tab" },
112
+ { "event": "type", "text": "a", "target": "input" },
113
+ { "event": "key", "key": "ArrowDown", "target": "input" },
114
+ { "expect": { "focus": "option:0" } },
115
+ { "event": "key", "key": "ArrowLeft", "target": "option:0" },
116
+ { "expect": { "focus": "option:0" } },
117
+ { "event": "type", "text": "b", "target": "input" },
118
+ { "expect": { "value": "ba", "focus": "input" } }
119
+ ],
120
+ "notes": "Horizontal keys move the caret without leaving the highlighted item; typing edits the query. Upstream also checks selectionStart, which is input-internal."
121
+ },
122
+ {
123
+ "id": "combobox.ariakit.mouse-select-commits-and-closes",
124
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/combobox/test.ts#L68",
125
+ "upstreamTest": "set value and hide on item click with mouse",
126
+ "apg": "pointer",
127
+ "config": {
128
+ "items": ["Apple", "Grape", "Orange", "Strawberry", "Watermelon"]
129
+ },
130
+ "steps": [
131
+ { "event": "click", "target": "input" },
132
+ { "event": "click", "target": "option:2" },
133
+ { "expect": { "value": "Orange", "focus": "input", "visible": [] } }
134
+ ]
135
+ },
136
+ {
137
+ "id": "combobox.ariakit.keyboard-select-commits-and-closes",
138
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/combobox/test.ts#L77",
139
+ "upstreamTest": "set value and hide on item click with keyboard",
140
+ "apg": "keyboard",
141
+ "config": {
142
+ "items": ["Apple", "Grape", "Orange", "Strawberry", "Watermelon"]
143
+ },
144
+ "steps": [
145
+ { "event": "key", "key": "Tab" },
146
+ { "event": "key", "key": "ArrowDown", "target": "input" },
147
+ { "event": "key", "key": "ArrowDown", "target": "input" },
148
+ { "event": "key", "key": "ArrowDown", "target": "input" },
149
+ { "expect": { "value": "" } },
150
+ { "event": "key", "key": "Enter", "target": "option:1" },
151
+ { "expect": { "value": "Grape", "focus": "input", "visible": [] } }
152
+ ],
153
+ "notes": "Enter on the focused Grape option commits its value and closes the popup."
154
+ },
155
+ {
156
+ "id": "combobox.ariakit.space-does-not-select",
157
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/combobox/test.ts#L89",
158
+ "upstreamTest": "do not set value and hide by pressing space",
159
+ "apg": "keyboard",
160
+ "config": {
161
+ "items": ["Apple", "Grape", "Orange", "Strawberry", "Watermelon"]
162
+ },
163
+ "steps": [
164
+ { "event": "key", "key": "Tab" },
165
+ { "event": "key", "key": "ArrowDown", "target": "input" },
166
+ { "event": "key", "key": "ArrowDown", "target": "input" },
167
+ { "event": "key", "key": "ArrowDown", "target": "input" },
168
+ { "event": "type", "text": " ", "target": "input" },
169
+ { "expect": { "value": " ", "focus": "input", "visible": ["popup"] } }
170
+ ],
171
+ "notes": "Space is typed into the input, not treated as option activation; the popup stays open and no option keeps focus."
172
+ },
173
+ {
174
+ "id": "combobox.ariakit.escape-closes-keeps-focus",
175
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/combobox/test.ts#L102",
176
+ "upstreamTest": "hide listbox by pressing escape",
177
+ "apg": "keyboard",
178
+ "config": {
179
+ "items": ["Apple", "Grape", "Orange", "Strawberry", "Watermelon"]
180
+ },
181
+ "steps": [
182
+ { "event": "click", "target": "input" },
183
+ { "expect": { "visible": ["popup"] } },
184
+ { "event": "key", "key": "Escape", "target": "input" },
185
+ { "expect": { "visible": [], "focus": "input" } }
186
+ ]
187
+ },
188
+ {
189
+ "id": "combobox.ariakit.click-outside-closes-and-blurs",
190
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/combobox/test.ts#L110",
191
+ "upstreamTest": "hide listbox by clicking outside",
192
+ "apg": "pointer",
193
+ "config": {
194
+ "items": ["Apple", "Grape", "Orange", "Strawberry", "Watermelon"]
195
+ },
196
+ "steps": [
197
+ { "event": "click", "target": "input" },
198
+ { "event": "click", "target": "body" },
199
+ { "expect": { "visible": [], "focus": null } }
200
+ ],
201
+ "notes": "Clicking outside closes the popup and lets focus leave the combobox."
202
+ },
203
+ {
204
+ "id": "combobox.ariakit.backspace-reopens-after-escape",
205
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/combobox/test.ts#L118",
206
+ "upstreamTest": "re-open listbox when deleting content",
207
+ "apg": "keyboard",
208
+ "config": {
209
+ "items": ["Apple", "Grape", "Orange", "Strawberry", "Watermelon"]
210
+ },
211
+ "steps": [
212
+ { "event": "key", "key": "Tab" },
213
+ { "event": "type", "text": "a", "target": "input" },
214
+ { "expect": { "visible": ["popup"] } },
215
+ { "event": "key", "key": "Escape", "target": "input" },
216
+ { "expect": { "visible": [] } },
217
+ { "event": "key", "key": "Backspace", "target": "input" },
218
+ { "expect": { "visible": ["popup"] } }
219
+ ],
220
+ "notes": "Editing after dismissal reopens the popup."
221
+ },
222
+ {
223
+ "id": "combobox.ariakit.click-input-removes-option-focus",
224
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/combobox/test.ts#L128",
225
+ "upstreamTest": "clicking on combobox input removes focus from item",
226
+ "apg": "pointer",
227
+ "config": {
228
+ "items": ["Apple", "Grape", "Orange", "Strawberry", "Watermelon"]
229
+ },
230
+ "steps": [
231
+ { "event": "key", "key": "Tab" },
232
+ { "event": "key", "key": "ArrowDown", "target": "input" },
233
+ { "event": "key", "key": "ArrowDown", "target": "input" },
234
+ { "event": "key", "key": "ArrowDown", "target": "input" },
235
+ { "expect": { "focus": "option:1" } },
236
+ { "event": "click", "target": "input" },
237
+ { "expect": { "focus": "input" } }
238
+ ],
239
+ "notes": "Pressing the input drops the option's DOM focus back to the input."
240
+ },
241
+ {
242
+ "id": "combobox.ariakit.horizontal-keys-then-arrows",
243
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/combobox/test.ts#L138",
244
+ "upstreamTest": "move cursor on combobox with horizontal keys",
245
+ "apg": "keyboard",
246
+ "config": {
247
+ "items": ["Apple", "Grape", "Orange", "Strawberry", "Watermelon"]
248
+ },
249
+ "steps": [
250
+ { "event": "key", "key": "Tab" },
251
+ { "event": "type", "text": "abc", "target": "input" },
252
+ { "event": "key", "key": "ArrowLeft", "target": "input" },
253
+ { "event": "key", "key": "ArrowDown", "target": "input" },
254
+ { "expect": { "focus": "option:0" } },
255
+ { "event": "key", "key": "ArrowRight", "target": "input" },
256
+ { "event": "key", "key": "Home", "target": "input" }
257
+ ],
258
+ "notes": "Caret movement on the input (selectionStart 3->2->3->0 upstream) is input-internal; only the arrow transition to the option is restated."
259
+ },
260
+ {
261
+ "id": "combobox.ariakit.select-only.pointer-and-keyboard-open-close",
262
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/combobox-select/test.ts#L10",
263
+ "upstreamTest": "Provider favorite fruit > opens and closes with the pointer and keyboard",
264
+ "apg": "keyboard",
265
+ "config": {
266
+ "variant": "select-only",
267
+ "items": [
268
+ "Apple",
269
+ "Bacon",
270
+ "Banana",
271
+ "Broccoli",
272
+ "Burger",
273
+ "Cake",
274
+ "Candy",
275
+ "Carrot",
276
+ "Cherry",
277
+ "Chocolate",
278
+ "Cookie",
279
+ "Cucumber",
280
+ "Donut",
281
+ "Fish",
282
+ "Fries",
283
+ "Grape",
284
+ "Green apple",
285
+ "Hot dog",
286
+ "Ice cream",
287
+ "Kiwi",
288
+ "Lemon",
289
+ "Lollipop",
290
+ "Onion",
291
+ "Orange",
292
+ "Pasta",
293
+ "Pineapple",
294
+ "Pizza",
295
+ "Potato",
296
+ "Salad",
297
+ "Sandwich",
298
+ "Steak",
299
+ "Strawberry",
300
+ "Tomato",
301
+ "Watermelon"
302
+ ],
303
+ "defaultSelectedValue": "Apple"
304
+ },
305
+ "steps": [
306
+ { "expect": { "visible": [] } },
307
+ { "event": "click", "target": "trigger" },
308
+ { "expect": { "visible": ["popup", "option:0"], "focus": "input" } },
309
+ { "event": "click", "target": "trigger" },
310
+ { "expect": { "visible": [], "focus": "trigger" } },
311
+ { "event": "key", "key": "Enter", "target": "trigger" },
312
+ { "expect": { "visible": ["popup"], "focus": "input" } },
313
+ { "event": "key", "key": "Shift+Tab", "target": "input" },
314
+ { "expect": { "focus": "trigger" } },
315
+ { "event": "key", "key": "Enter", "target": "trigger" },
316
+ { "expect": { "visible": [] } }
317
+ ],
318
+ "notes": "Select-only: the trigger carries the value, the search input lives in the popup and is focused on open; Shift+Tab returns to the trigger."
319
+ },
320
+ {
321
+ "id": "combobox.ariakit.select-only.filter-commit-restore",
322
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/combobox-select/test.ts#L33",
323
+ "upstreamTest": "Provider favorite fruit > filters, commits, and restores the selected item",
324
+ "apg": "keyboard",
325
+ "config": {
326
+ "variant": "select-only",
327
+ "items": [
328
+ "Apple",
329
+ "Bacon",
330
+ "Banana",
331
+ "Broccoli",
332
+ "Burger",
333
+ "Cake",
334
+ "Candy",
335
+ "Carrot",
336
+ "Cherry",
337
+ "Chocolate",
338
+ "Cookie",
339
+ "Cucumber",
340
+ "Donut",
341
+ "Fish",
342
+ "Fries",
343
+ "Grape",
344
+ "Green apple",
345
+ "Hot dog",
346
+ "Ice cream",
347
+ "Kiwi",
348
+ "Lemon",
349
+ "Lollipop",
350
+ "Onion",
351
+ "Orange",
352
+ "Pasta",
353
+ "Pineapple",
354
+ "Pizza",
355
+ "Potato",
356
+ "Salad",
357
+ "Sandwich",
358
+ "Steak",
359
+ "Strawberry",
360
+ "Tomato",
361
+ "Watermelon"
362
+ ],
363
+ "defaultSelectedValue": "Apple"
364
+ },
365
+ "steps": [
366
+ { "event": "click", "target": "trigger" },
367
+ { "event": "type", "text": "gr", "target": "input" },
368
+ { "expect": { "value": "gr", "focus": "option:0" } },
369
+ { "event": "key", "key": "ArrowDown", "target": "input" },
370
+ { "event": "key", "key": "Enter", "target": "input" },
371
+ { "expect": { "value": "Green apple", "visible": [] } },
372
+ { "event": "key", "key": "Enter", "target": "trigger" },
373
+ { "expect": { "value": "", "focus": "option:0" } },
374
+ { "event": "type", "text": "o", "target": "input" },
375
+ { "expect": { "focus": "option:0" } }
376
+ ],
377
+ "notes": "Typing filters and auto-selects the first match; committing writes the label into the trigger. Reopening clears the query and restores the selected item."
378
+ },
379
+ {
380
+ "id": "combobox.ariakit.select-only.reopen-resets-filter",
381
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/combobox-select/test.ts#L50",
382
+ "upstreamTest": "Provider favorite fruit > resets filtering and focus when reopened",
383
+ "apg": "keyboard",
384
+ "config": {
385
+ "variant": "select-only",
386
+ "items": [
387
+ "Apple",
388
+ "Bacon",
389
+ "Banana",
390
+ "Broccoli",
391
+ "Burger",
392
+ "Cake",
393
+ "Candy",
394
+ "Carrot",
395
+ "Cherry",
396
+ "Chocolate",
397
+ "Cookie",
398
+ "Cucumber",
399
+ "Donut",
400
+ "Fish",
401
+ "Fries",
402
+ "Grape",
403
+ "Green apple",
404
+ "Hot dog",
405
+ "Ice cream",
406
+ "Kiwi",
407
+ "Lemon",
408
+ "Lollipop",
409
+ "Onion",
410
+ "Orange",
411
+ "Pasta",
412
+ "Pineapple",
413
+ "Pizza",
414
+ "Potato",
415
+ "Salad",
416
+ "Sandwich",
417
+ "Steak",
418
+ "Strawberry",
419
+ "Tomato",
420
+ "Watermelon"
421
+ ],
422
+ "defaultSelectedValue": "Apple"
423
+ },
424
+ "steps": [
425
+ { "event": "click", "target": "trigger" },
426
+ { "event": "type", "text": "f", "target": "input" },
427
+ { "expect": { "focus": "option:0" } },
428
+ { "event": "key", "key": "Escape", "target": "input" },
429
+ { "expect": { "focus": "trigger" } },
430
+ { "event": "key", "key": "Enter", "target": "trigger" },
431
+ { "expect": { "value": "", "focus": "option:0" } }
432
+ ],
433
+ "notes": "Escape discards the filter and returns focus to the trigger; reopening shows the full list with the first option active."
434
+ },
435
+ {
436
+ "id": "combobox.ariakit.select-only.autoselect-while-typing",
437
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/combobox-select/test.ts#L64",
438
+ "upstreamTest": "Provider favorite fruit > auto-selects while the search input owns focus",
439
+ "apg": "keyboard",
440
+ "config": {
441
+ "variant": "select-only",
442
+ "items": [
443
+ "Apple",
444
+ "Bacon",
445
+ "Banana",
446
+ "Broccoli",
447
+ "Burger",
448
+ "Cake",
449
+ "Candy",
450
+ "Carrot",
451
+ "Cherry",
452
+ "Chocolate",
453
+ "Cookie",
454
+ "Cucumber",
455
+ "Donut",
456
+ "Fish",
457
+ "Fries",
458
+ "Grape",
459
+ "Green apple",
460
+ "Hot dog",
461
+ "Ice cream",
462
+ "Kiwi",
463
+ "Lemon",
464
+ "Lollipop",
465
+ "Onion",
466
+ "Orange",
467
+ "Pasta",
468
+ "Pineapple",
469
+ "Pizza",
470
+ "Potato",
471
+ "Salad",
472
+ "Sandwich",
473
+ "Steak",
474
+ "Strawberry",
475
+ "Tomato",
476
+ "Watermelon"
477
+ ],
478
+ "defaultSelectedValue": "Apple"
479
+ },
480
+ "steps": [
481
+ { "event": "click", "target": "trigger" },
482
+ { "event": "type", "text": "p", "target": "input" },
483
+ { "expect": { "focus": "option:0" } },
484
+ { "event": "type", "text": "i", "target": "input" },
485
+ { "expect": { "focus": "option:0" } }
486
+ ],
487
+ "notes": "Pasta then Pineapple are the first matches for 'p' and then 'pi'; auto-select keeps the first match focused."
488
+ },
489
+ {
490
+ "id": "combobox.ariakit.select-only.popup-role-dialog",
491
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/combobox-select/test-browser.ts#L11",
492
+ "upstreamTest": "Provider favorite fruit reflects the popup role when opened",
493
+ "apg": "aria",
494
+ "config": {
495
+ "variant": "select-only",
496
+ "items": [
497
+ "Apple",
498
+ "Bacon",
499
+ "Banana",
500
+ "Broccoli",
501
+ "Burger",
502
+ "Cake",
503
+ "Candy",
504
+ "Carrot",
505
+ "Cherry",
506
+ "Chocolate",
507
+ "Cookie",
508
+ "Cucumber",
509
+ "Donut",
510
+ "Fish",
511
+ "Fries",
512
+ "Grape",
513
+ "Green apple",
514
+ "Hot dog",
515
+ "Ice cream",
516
+ "Kiwi",
517
+ "Lemon",
518
+ "Lollipop",
519
+ "Onion",
520
+ "Orange",
521
+ "Pasta",
522
+ "Pineapple",
523
+ "Pizza",
524
+ "Potato",
525
+ "Salad",
526
+ "Sandwich",
527
+ "Steak",
528
+ "Strawberry",
529
+ "Tomato",
530
+ "Watermelon"
531
+ ],
532
+ "defaultSelectedValue": "Apple"
533
+ },
534
+ "steps": [
535
+ { "event": "click", "target": "trigger" },
536
+ {
537
+ "expect": {
538
+ "visible": ["popup", "option:0"],
539
+ "attrs": {
540
+ "popup": { "role": "dialog" },
541
+ "trigger": { "aria-haspopup": "dialog" }
542
+ }
543
+ }
544
+ }
545
+ ],
546
+ "notes": "Select-only exposes a dialog popup that contains the listbox and the search input."
547
+ },
548
+ {
549
+ "id": "combobox.ariakit.select-only.autoselect-restores-filtered-value",
550
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/combobox-select/test-browser.ts#L21",
551
+ "upstreamTest": "Provider favorite fruit auto-selects and restores filtered values",
552
+ "apg": "keyboard",
553
+ "config": {
554
+ "variant": "select-only",
555
+ "items": [
556
+ "Apple",
557
+ "Bacon",
558
+ "Banana",
559
+ "Broccoli",
560
+ "Burger",
561
+ "Cake",
562
+ "Candy",
563
+ "Carrot",
564
+ "Cherry",
565
+ "Chocolate",
566
+ "Cookie",
567
+ "Cucumber",
568
+ "Donut",
569
+ "Fish",
570
+ "Fries",
571
+ "Grape",
572
+ "Green apple",
573
+ "Hot dog",
574
+ "Ice cream",
575
+ "Kiwi",
576
+ "Lemon",
577
+ "Lollipop",
578
+ "Onion",
579
+ "Orange",
580
+ "Pasta",
581
+ "Pineapple",
582
+ "Pizza",
583
+ "Potato",
584
+ "Salad",
585
+ "Sandwich",
586
+ "Steak",
587
+ "Strawberry",
588
+ "Tomato",
589
+ "Watermelon"
590
+ ],
591
+ "defaultSelectedValue": "Apple"
592
+ },
593
+ "steps": [
594
+ { "event": "click", "target": "trigger" },
595
+ { "event": "type", "text": "cho", "target": "input" },
596
+ { "expect": { "focus": "option:0" } },
597
+ { "event": "key", "key": "Enter", "target": "input" },
598
+ { "expect": { "value": "Chocolate", "visible": [] } },
599
+ { "event": "click", "target": "trigger" },
600
+ { "expect": { "value": "", "focus": "option:0" } }
601
+ ],
602
+ "notes": "Reopening clears the query and re-highlights the currently selected Chocolate."
603
+ },
604
+ {
605
+ "id": "combobox.ariakit.filtering.show-entire-list",
606
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/combobox-filtering/test.ts#L5",
607
+ "upstreamTest": "show entire list",
608
+ "apg": "pointer",
609
+ "config": { "filterMode": "local" },
610
+ "steps": [
611
+ { "event": "click", "target": "input" },
612
+ { "expect": { "visible": ["popup", "option:0", "option:1"] } }
613
+ ],
614
+ "notes": "With an empty query every item in the list is visible."
615
+ },
616
+ {
617
+ "id": "combobox.ariakit.filtering.filter-list",
618
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/combobox-filtering/test.ts#L11",
619
+ "upstreamTest": "filter list",
620
+ "apg": "keyboard",
621
+ "config": { "filterMode": "local", "match": "sa", "matchCount": 5 },
622
+ "steps": [
623
+ { "event": "key", "key": "Tab" },
624
+ { "event": "type", "text": "sa", "target": "input" },
625
+ {
626
+ "expect": {
627
+ "visible": [
628
+ "popup",
629
+ "option:0",
630
+ "option:1",
631
+ "option:2",
632
+ "option:3",
633
+ "option:4"
634
+ ]
635
+ }
636
+ },
637
+ { "event": "key", "key": "ArrowDown", "target": "input" },
638
+ { "event": "key", "key": "ArrowDown", "target": "option:0" },
639
+ { "expect": { "focus": "option:1" } }
640
+ ],
641
+ "notes": "'sa' matches five dishes; navigation goes to Salad then Sandwich."
642
+ },
643
+ {
644
+ "id": "combobox.ariakit.filtering.no-result",
645
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/combobox-filtering/test.ts#L21",
646
+ "upstreamTest": "no result",
647
+ "apg": "keyboard",
648
+ "config": { "filterMode": "local", "emptyText": "No results found" },
649
+ "steps": [
650
+ { "event": "key", "key": "Tab" },
651
+ { "event": "type", "text": "zzz", "target": "input" },
652
+ { "expect": { "visible": ["popup", "popup"] } }
653
+ ],
654
+ "notes": "An unmatched query shows the empty-state text."
655
+ },
656
+ {
657
+ "id": "combobox.ariakit.integrated.click-open-and-outside-close",
658
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/combobox-filtering-integrated/test.ts#L4",
659
+ "upstreamTest": "show/hide popover with click",
660
+ "apg": "pointer",
661
+ "config": {
662
+ "filterMode": "integrated",
663
+ "items": ["Apple", "Banana", "Broccoli", "Burger", "Grapes", "Yogurt"]
664
+ },
665
+ "steps": [
666
+ { "event": "click", "target": "input" },
667
+ { "expect": { "visible": ["popup", "option:0"], "focus": "input" } },
668
+ { "event": "click", "target": "body" },
669
+ { "expect": { "visible": [], "focus": null } }
670
+ ]
671
+ },
672
+ {
673
+ "id": "combobox.ariakit.integrated.keyboard-open-page-down-escape",
674
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/combobox-filtering-integrated/test.ts#L13",
675
+ "upstreamTest": "show/hide popover with keyboard",
676
+ "apg": "keyboard",
677
+ "config": {
678
+ "filterMode": "integrated",
679
+ "items": ["Apple", "Banana", "Broccoli", "Burger", "Grapes", "Yogurt"]
680
+ },
681
+ "steps": [
682
+ { "event": "key", "key": "Tab" },
683
+ { "expect": { "visible": [] } },
684
+ { "event": "key", "key": "ArrowDown", "target": "input" },
685
+ { "expect": { "visible": ["popup"], "focus": "input" } },
686
+ { "event": "key", "key": "PageDown", "target": "input" },
687
+ { "expect": { "focus": "option:5" } },
688
+ { "event": "key", "key": "Escape", "target": "option:5" },
689
+ { "expect": { "visible": [], "focus": "input" } }
690
+ ],
691
+ "notes": "PageDown jumps to the last option (Yogurt); Escape closes and returns focus to the input."
692
+ },
693
+ {
694
+ "id": "combobox.ariakit.integrated.hover-moves-active-item",
695
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/combobox-filtering-integrated/test.ts#L26",
696
+ "upstreamTest": "hover over items",
697
+ "apg": "pointer",
698
+ "config": {
699
+ "filterMode": "integrated",
700
+ "items": ["Apple", "Banana", "Broccoli", "Burger", "Grapes", "Yogurt"]
701
+ },
702
+ "steps": [
703
+ { "event": "click", "target": "input" },
704
+ { "event": "hover", "target": "option:1" },
705
+ { "expect": { "focus": "option:1" } },
706
+ { "event": "hover", "target": "option:3" },
707
+ { "expect": { "focus": "option:3" } },
708
+ { "event": "hover", "target": "body" },
709
+ { "expect": { "focus": "option:3" } },
710
+ { "event": "key", "key": "ArrowUp", "target": "option:3" },
711
+ { "expect": { "focus": "option:2" } }
712
+ ],
713
+ "notes": "Hovering an option activates it; unmounting the hover does not clear it. ArrowUp follows the rendered order (Burger -> Broccoli)."
714
+ },
715
+ {
716
+ "id": "combobox.ariakit.integrated.filter-items",
717
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/combobox-filtering-integrated/test.ts#L38",
718
+ "upstreamTest": "filter items",
719
+ "apg": "keyboard",
720
+ "config": {
721
+ "filterMode": "integrated",
722
+ "items": ["Apple", "Banana", "Broccoli", "Burger", "Grapes", "Yogurt"]
723
+ },
724
+ "steps": [
725
+ { "event": "key", "key": "Tab" },
726
+ { "event": "type", "text": "gr", "target": "input" },
727
+ {
728
+ "expect": {
729
+ "visible": ["popup", "option:0", "option:1", "option:2"],
730
+ "focus": "option:0"
731
+ }
732
+ },
733
+ { "event": "type", "text": "q", "target": "input" },
734
+ { "expect": { "visible": ["popup", "popup"] } }
735
+ ],
736
+ "notes": "'gr' keeps three matches (Grapes first); 'grq' matches nothing and shows the empty state."
737
+ },
738
+ {
739
+ "id": "combobox.ariakit.group.inline-autocomplete-on-typing",
740
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/examples/combobox-group/test.ts#L13",
741
+ "upstreamTest": "auto select with inline autocomplete on typing",
742
+ "apg": "keyboard",
743
+ "config": {
744
+ "inlineAutocomplete": true,
745
+ "items": [
746
+ "annual_report.pdf",
747
+ "images_backup.tar.gz",
748
+ "John Smith",
749
+ "Emma Johnson",
750
+ "Sarah Davis"
751
+ ]
752
+ },
753
+ "steps": [
754
+ { "event": "key", "key": "Tab" },
755
+ { "event": "type", "text": "a", "target": "input" },
756
+ { "expect": { "value": "annual_report.pdf", "focus": "input" } },
757
+ { "event": "key", "key": "ArrowDown", "target": "input" },
758
+ { "expect": { "value": "images_backup.tar.gz", "focus": "input" } },
759
+ { "event": "key", "key": "ArrowUp", "target": "input" },
760
+ { "expect": { "value": "annual_report.pdf", "focus": "input" } },
761
+ { "event": "type", "text": "e", "target": "input" },
762
+ { "expect": { "value": "ae", "focus": "input" } }
763
+ ],
764
+ "notes": "Inline autocomplete appends the active option's remainder to the typed prefix; the upstream text-selection range is input-internal."
765
+ },
766
+ {
767
+ "id": "combobox.ariakit.group.inline-autocomplete-on-arrow-down",
768
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/examples/combobox-group/test.ts#L35",
769
+ "upstreamTest": "auto select with inline autocomplete on arrow down",
770
+ "apg": "keyboard",
771
+ "config": {
772
+ "inlineAutocomplete": true,
773
+ "items": [
774
+ "annual_report.pdf",
775
+ "images_backup.tar.gz",
776
+ "John Smith",
777
+ "Emma Johnson",
778
+ "Sarah Davis"
779
+ ]
780
+ },
781
+ "steps": [
782
+ { "event": "key", "key": "Tab" },
783
+ { "event": "key", "key": "ArrowDown", "target": "input" },
784
+ { "event": "key", "key": "ArrowDown", "target": "input" },
785
+ { "expect": { "value": "John Smith", "focus": "input" } },
786
+ { "event": "key", "key": "ArrowDown", "target": "input" },
787
+ { "expect": { "value": "Emma Johnson", "focus": "input" } },
788
+ { "event": "key", "key": "ArrowUp", "target": "input" },
789
+ { "expect": { "value": "John Smith", "focus": "input" } }
790
+ ],
791
+ "notes": "ArrowDown opens and moves through the list; the active option's label is mirrored into the input."
792
+ },
793
+ {
794
+ "id": "combobox.ariakit.group.inline-autocomplete-on-typing-and-clearing",
795
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/examples/combobox-group/test.ts#L48",
796
+ "upstreamTest": "auto select with inline autocomplete on typing + clearing",
797
+ "apg": "keyboard",
798
+ "config": {
799
+ "inlineAutocomplete": true,
800
+ "items": [
801
+ "annual_report.pdf",
802
+ "images_backup.tar.gz",
803
+ "John Smith",
804
+ "Emma Johnson",
805
+ "Sarah Davis"
806
+ ]
807
+ },
808
+ "steps": [
809
+ { "event": "key", "key": "Tab" },
810
+ { "event": "type", "text": "em", "target": "input" },
811
+ { "expect": { "value": "emma Johnson", "focus": "input" } },
812
+ { "event": "key", "key": "Backspace", "target": "input" },
813
+ { "expect": { "value": "em", "focus": "option:0" } },
814
+ { "event": "key", "key": "Backspace", "target": "input" },
815
+ { "expect": { "value": "e" } },
816
+ { "event": "key", "key": "Backspace", "target": "input" },
817
+ { "expect": { "value": "" } },
818
+ { "event": "type", "text": "j", "target": "input" },
819
+ { "expect": { "value": "john Smith", "focus": "option:0" } }
820
+ ],
821
+ "notes": "Backspacing a completed autocomplete reverts to the typed prefix and keeps the matched item active."
822
+ },
823
+ {
824
+ "id": "combobox.ariakit.group.shift-arrow-replaces-selection",
825
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/examples/combobox-group/test.ts#L69",
826
+ "upstreamTest": "text selection with shift+arrow keys and replacement",
827
+ "apg": "keyboard",
828
+ "config": {
829
+ "inlineAutocomplete": true,
830
+ "items": [
831
+ "annual_report.pdf",
832
+ "images_backup.tar.gz",
833
+ "John Smith",
834
+ "Emma Johnson",
835
+ "Sarah Davis"
836
+ ]
837
+ },
838
+ "steps": [
839
+ { "event": "key", "key": "Tab" },
840
+ { "event": "key", "key": "ArrowDown", "target": "input" },
841
+ { "event": "key", "key": "ArrowDown", "target": "input" },
842
+ { "event": "key", "key": "ArrowDown", "target": "input" },
843
+ { "expect": { "value": "Emma Johnson", "focus": "option:0" } },
844
+ { "event": "type", "text": "m", "target": "input" },
845
+ { "expect": { "value": "michael Brown", "focus": "input" } }
846
+ ],
847
+ "notes": "Upstream extends the selection with Shift+ArrowLeft over the autocompleted remainder and replaces it; the replacement result is restated, the selection range is input-internal."
848
+ },
849
+ {
850
+ "id": "combobox.ariakit.group.blur-after-autocomplete-keeps-value",
851
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/examples/combobox-group/test.ts#L89",
852
+ "upstreamTest": "blur input after autocomplete",
853
+ "apg": "extension",
854
+ "config": {
855
+ "inlineAutocomplete": true,
856
+ "items": [
857
+ "annual_report.pdf",
858
+ "images_backup.tar.gz",
859
+ "John Smith",
860
+ "Emma Johnson",
861
+ "Sarah Davis"
862
+ ]
863
+ },
864
+ "steps": [
865
+ { "event": "key", "key": "Tab" },
866
+ { "event": "type", "text": "a", "target": "input" },
867
+ { "event": "key", "key": "ArrowDown", "target": "input" },
868
+ { "expect": { "value": "images_backup.tar.gz" } },
869
+ { "event": "click", "target": "body" },
870
+ { "event": "click", "target": "body" },
871
+ { "expect": { "value": "images_backup.tar.gz" } }
872
+ ],
873
+ "notes": "Blurring after autocomplete keeps the mirrored value."
874
+ },
875
+ {
876
+ "id": "combobox.ariakit.group.hover-does-not-replace-typed-prefix",
877
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/examples/combobox-group/test.ts#L100",
878
+ "upstreamTest": "autocomplete on focus on hover",
879
+ "apg": "pointer",
880
+ "config": {
881
+ "inlineAutocomplete": true,
882
+ "items": [
883
+ "annual_report.pdf",
884
+ "images_backup.tar.gz",
885
+ "John Smith",
886
+ "Emma Johnson",
887
+ "Sarah Davis"
888
+ ]
889
+ },
890
+ "steps": [
891
+ { "event": "click", "target": "input" },
892
+ { "event": "type", "text": "m", "target": "input" },
893
+ { "expect": { "value": "michael Brown" } },
894
+ { "event": "hover", "target": "option:4" },
895
+ { "expect": { "value": "m" } }
896
+ ],
897
+ "notes": "Hovering an unrelated option does not overwrite the typed prefix."
898
+ },
899
+ {
900
+ "id": "combobox.ariakit.group.active-item-survives-pointer-leave",
901
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/examples/combobox-group/test-chrome-firefox.ts#L4",
902
+ "upstreamTest": "keeps the active result highlighted after the pointer leaves",
903
+ "apg": "pointer",
904
+ "config": {
905
+ "inlineAutocomplete": true,
906
+ "items": [
907
+ "annual_report.pdf",
908
+ "images_backup.tar.gz",
909
+ "John Smith",
910
+ "Emma Johnson",
911
+ "Sarah Davis"
912
+ ]
913
+ },
914
+ "steps": [
915
+ { "event": "type", "text": "m", "target": "input" },
916
+ { "event": "hover", "target": "option:2" },
917
+ { "expect": { "focus": "option:2" } },
918
+ { "event": "hover", "target": "input" },
919
+ { "expect": { "focus": "option:2" } },
920
+ { "event": "hover", "target": "option:4" },
921
+ { "expect": { "focus": "option:4" } },
922
+ { "event": "key", "key": "Enter", "target": "input" },
923
+ { "expect": { "value": "Sarah Davis", "visible": [] } }
924
+ ],
925
+ "notes": "The upstream asserts data-active-item and its background colour; the neutral equivalent is the active option surviving the pointer leaving."
926
+ }
927
+ ],
928
+ "skipped": [
929
+ {
930
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/examples/combobox-group/test.ts#L108",
931
+ "upstreamTest": "composition text",
932
+ "reason": "IME composition internals with sleeps and composing key state."
933
+ },
934
+ {
935
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/combobox/test-mobile.ts#L1",
936
+ "upstreamTest": "mobile combobox interactions",
937
+ "reason": "Platform-specific mobile touch behaviour."
938
+ },
939
+ {
940
+ "upstream": "https://github.com/ariakit/ariakit/blob/404c72257b879569feb08465da4ff9915fd873da/app/src/sandbox/combobox-filtering-integrated/test.ts#L1",
941
+ "upstreamTest": "combobox-filtering-integrated visual and layout coverage",
942
+ "reason": "Styling, layout and scroll coverage only."
943
+ }
944
+ ]
945
+ }