@ui-sdk/web 0.0.0-stage → 0.1.0-beta.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 (467) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +10 -2
  3. package/browser/web/accordion.js +1 -0
  4. package/browser/web/alert-dialog.js +1 -0
  5. package/browser/web/autocomplete.js +1 -0
  6. package/browser/web/avatar.js +1 -0
  7. package/browser/web/button.js +1 -0
  8. package/browser/web/calendar.js +1 -0
  9. package/browser/web/carousel.js +1 -0
  10. package/browser/web/checkbox.js +1 -0
  11. package/browser/web/chunks/0eRGibL6.js +1 -0
  12. package/browser/web/chunks/2bIEUO6_.js +1 -0
  13. package/browser/web/chunks/5A9w2ULz.js +1 -0
  14. package/browser/web/chunks/5RSyydjV.js +1 -0
  15. package/browser/web/chunks/9pWTy2wl.js +1 -0
  16. package/browser/web/chunks/B0f2j6zz.js +1 -0
  17. package/browser/web/chunks/B1rux6br.js +1 -0
  18. package/browser/web/chunks/B3-APaNf.js +1 -0
  19. package/browser/web/chunks/B7EgSgjQ.js +1 -0
  20. package/browser/web/chunks/B8QcOzJU.js +1 -0
  21. package/browser/web/chunks/BFueEkwm.js +3 -0
  22. package/browser/web/chunks/BJj3oS29.js +1 -0
  23. package/browser/web/chunks/BNSvTCpr.js +1 -0
  24. package/browser/web/chunks/BPD0kAZB.js +1 -0
  25. package/browser/web/chunks/BQeduZqT.js +1 -0
  26. package/browser/web/chunks/B_CVFyiz.js +1 -0
  27. package/browser/web/chunks/B_ns1YHO.js +1 -0
  28. package/browser/web/chunks/BcwkVTsR.js +1 -0
  29. package/browser/web/chunks/BeaQ6TYM.js +1 -0
  30. package/browser/web/chunks/BgBB013u.js +1 -0
  31. package/browser/web/chunks/BgsKhHDm.js +1 -0
  32. package/browser/web/chunks/BjMcbuhi.js +9 -0
  33. package/browser/web/chunks/Bjiy_F2N.js +1 -0
  34. package/browser/web/chunks/BqScCLwv.js +1 -0
  35. package/browser/web/chunks/BqX3Utqx.js +1 -0
  36. package/browser/web/chunks/BtVkQf3z.js +1 -0
  37. package/browser/web/chunks/By30h-7B.js +1 -0
  38. package/browser/web/chunks/C1zqYpy2.js +1 -0
  39. package/browser/web/chunks/C436juFf.js +1 -0
  40. package/browser/web/chunks/C4_bULs1.js +1 -0
  41. package/browser/web/chunks/C4omqJEz.js +1 -0
  42. package/browser/web/chunks/C7tt0T3n.js +1 -0
  43. package/browser/web/chunks/C8w7s5dg.js +1 -0
  44. package/browser/web/chunks/CElY4erO.js +1 -0
  45. package/browser/web/chunks/CFODo-m2.js +1 -0
  46. package/browser/web/chunks/CL4wjam9.js +1 -0
  47. package/browser/web/chunks/CMg-8UVf.js +1 -0
  48. package/browser/web/chunks/COWKfakj.js +1 -0
  49. package/browser/web/chunks/CQBU0qZ4.js +1 -0
  50. package/browser/web/chunks/CV6uABgc.js +1 -0
  51. package/browser/web/chunks/C_SWFpWQ.js +1 -0
  52. package/browser/web/chunks/C_Uanbrl.js +1 -0
  53. package/browser/web/chunks/Ce_CSanC.js +1 -0
  54. package/browser/web/chunks/Cg-ZmRhS.js +1 -0
  55. package/browser/web/chunks/Cgf2wPI_.js +1 -0
  56. package/browser/web/chunks/Cuep_3Vf.js +1 -0
  57. package/browser/web/chunks/D02PaHn6.js +1 -0
  58. package/browser/web/chunks/D5LiaI5R.js +1 -0
  59. package/browser/web/chunks/D9UgVYvF.js +1 -0
  60. package/browser/web/chunks/DC08tnkE.js +2 -0
  61. package/browser/web/chunks/DG8YGSvu.js +1 -0
  62. package/browser/web/chunks/DIQd0FYD.js +1 -0
  63. package/browser/web/chunks/DMLqacE8.js +1 -0
  64. package/browser/web/chunks/DSUI3yI-.js +1 -0
  65. package/browser/web/chunks/DT3Hb76X.js +1 -0
  66. package/browser/web/chunks/DY75g3-W.js +1 -0
  67. package/browser/web/chunks/DZpNQKZ9.js +1 -0
  68. package/browser/web/chunks/Db-W1wrC.js +1 -0
  69. package/browser/web/chunks/Dc1xK3Ii.js +1 -0
  70. package/browser/web/chunks/DdF6awFs.js +1 -0
  71. package/browser/web/chunks/DdaCLml8.js +1 -0
  72. package/browser/web/chunks/Dh8MLjQO.js +1 -0
  73. package/browser/web/chunks/DiuslJRy.js +1 -0
  74. package/browser/web/chunks/DjRcw3Y0.js +1 -0
  75. package/browser/web/chunks/Djdv-16J.js +1 -0
  76. package/browser/web/chunks/DnFXe_lF.js +1 -0
  77. package/browser/web/chunks/DneGv1oC.js +1 -0
  78. package/browser/web/chunks/DsVxP-p-.js +1 -0
  79. package/browser/web/chunks/DwDilCo2.js +1 -0
  80. package/browser/web/chunks/DwV48AXv.js +1 -0
  81. package/browser/web/chunks/F37aF4-L.js +1 -0
  82. package/browser/web/chunks/LyB6XIbN.js +1 -0
  83. package/browser/web/chunks/NKnbYGjC.js +1 -0
  84. package/browser/web/chunks/Vk-rVi16.js +1 -0
  85. package/browser/web/chunks/XsM0J1Ex.js +1 -0
  86. package/browser/web/chunks/asSN9iEp.js +1 -0
  87. package/browser/web/chunks/c-AjHfdF.js +1 -0
  88. package/browser/web/chunks/dR-12TPY.js +1 -0
  89. package/browser/web/chunks/hR4xM0EC.js +1 -0
  90. package/browser/web/chunks/hqOaBxAg.js +1 -0
  91. package/browser/web/chunks/kMKqqeG4.js +1 -0
  92. package/browser/web/chunks/kXboBcfi.js +1 -0
  93. package/browser/web/chunks/l4aQIg22.js +1 -0
  94. package/browser/web/chunks/tJC0JSU4.js +1 -0
  95. package/browser/web/chunks/wHdS_QYM.js +1 -0
  96. package/browser/web/chunks/yv8dTvNI.js +1 -0
  97. package/browser/web/chunks/yw9M3nfi.js +1 -0
  98. package/browser/web/collapsible.js +1 -0
  99. package/browser/web/color-picker.js +1 -0
  100. package/browser/web/combobox.js +2 -0
  101. package/browser/web/command.js +1 -0
  102. package/browser/web/core.js +5 -0
  103. package/browser/web/date-input.js +1 -0
  104. package/browser/web/date-picker.js +1 -0
  105. package/browser/web/dialog.js +1 -0
  106. package/browser/web/drawer.js +1 -0
  107. package/browser/web/field.js +1 -0
  108. package/browser/web/file-input.js +1 -0
  109. package/browser/web/hover-card.js +1 -0
  110. package/browser/web/image-cropper.js +1 -0
  111. package/browser/web/input.js +1 -0
  112. package/browser/web/label.js +1 -0
  113. package/browser/web/listbox.js +1 -0
  114. package/browser/web/menu.js +1 -0
  115. package/browser/web/menubar.js +1 -0
  116. package/browser/web/meter.js +1 -0
  117. package/browser/web/navigation-menu.js +1 -0
  118. package/browser/web/number-input.js +1 -0
  119. package/browser/web/otp-input.js +2 -0
  120. package/browser/web/overlays.js +1 -0
  121. package/browser/web/pagination.js +1 -0
  122. package/browser/web/password-input.js +1 -0
  123. package/browser/web/popover.js +1 -0
  124. package/browser/web/preferences.js +1 -0
  125. package/browser/web/progress.js +1 -0
  126. package/browser/web/radio.js +1 -0
  127. package/browser/web/rating.js +1 -0
  128. package/browser/web/resizable.js +1 -0
  129. package/browser/web/scroll-area.js +1 -0
  130. package/browser/web/segmented-control.js +1 -0
  131. package/browser/web/select.js +1 -0
  132. package/browser/web/separator.js +1 -0
  133. package/browser/web/slider.js +1 -0
  134. package/browser/web/switch.js +1 -0
  135. package/browser/web/tabs.js +1 -0
  136. package/browser/web/textarea.js +1 -0
  137. package/browser/web/time-input.js +1 -0
  138. package/browser/web/timeline.js +1 -0
  139. package/browser/web/toast.js +1 -0
  140. package/browser/web/toggle.js +1 -0
  141. package/browser/web/token-input.js +8 -0
  142. package/browser/web/toolbar.js +1 -0
  143. package/browser/web/tooltip.js +1 -0
  144. package/browser/web/tree.js +1 -0
  145. package/browser/web/trigger-menu.js +4 -0
  146. package/browser/web/waterfall.js +1 -0
  147. package/browser/web.css +3378 -0
  148. package/browser/web.js +3 -0
  149. package/custom-elements.json +32315 -0
  150. package/dist/accordion.d.ts +2 -0
  151. package/dist/accordion.js +57 -0
  152. package/dist/action.d.ts +16 -0
  153. package/dist/action.js +39 -0
  154. package/dist/agent.d.ts +2 -0
  155. package/dist/agent.js +7 -0
  156. package/dist/autocomplete.d.ts +2 -0
  157. package/dist/autocomplete.js +120 -0
  158. package/dist/autoload.d.ts +18 -0
  159. package/dist/autoload.js +63 -0
  160. package/dist/avatar.d.ts +2 -0
  161. package/dist/avatar.js +27 -0
  162. package/dist/browser-core.d.ts +2 -0
  163. package/dist/browser-core.js +8 -0
  164. package/dist/button.d.ts +2 -0
  165. package/dist/button.js +35 -0
  166. package/dist/calendar.d.ts +23 -0
  167. package/dist/calendar.js +429 -0
  168. package/dist/carousel.d.ts +2 -0
  169. package/dist/carousel.js +54 -0
  170. package/dist/checkbox.d.ts +4 -0
  171. package/dist/checkbox.js +75 -0
  172. package/dist/collapsible.d.ts +2 -0
  173. package/dist/collapsible.js +28 -0
  174. package/dist/color-picker.d.ts +2 -0
  175. package/dist/color-picker.js +64 -0
  176. package/dist/combobox.d.ts +2 -0
  177. package/dist/combobox.js +334 -0
  178. package/dist/command.d.ts +2 -0
  179. package/dist/command.js +122 -0
  180. package/dist/date-input.d.ts +3 -0
  181. package/dist/date-input.js +87 -0
  182. package/dist/date-picker.d.ts +2 -0
  183. package/dist/date-picker.js +174 -0
  184. package/dist/default-text.d.ts +3 -0
  185. package/dist/default-text.js +24 -0
  186. package/dist/define-element.d.ts +404 -0
  187. package/dist/define-element.js +1489 -0
  188. package/dist/dialog.d.ts +3 -0
  189. package/dist/dialog.js +94 -0
  190. package/dist/drawer.d.ts +2 -0
  191. package/dist/drawer.js +96 -0
  192. package/dist/entries/accordion.d.ts +3 -0
  193. package/dist/entries/accordion.js +7 -0
  194. package/dist/entries/alert-dialog.d.ts +3 -0
  195. package/dist/entries/alert-dialog.js +13 -0
  196. package/dist/entries/autocomplete.d.ts +3 -0
  197. package/dist/entries/autocomplete.js +7 -0
  198. package/dist/entries/avatar.d.ts +2 -0
  199. package/dist/entries/avatar.js +3 -0
  200. package/dist/entries/button.d.ts +2 -0
  201. package/dist/entries/button.js +3 -0
  202. package/dist/entries/calendar.d.ts +3 -0
  203. package/dist/entries/calendar.js +7 -0
  204. package/dist/entries/carousel.d.ts +3 -0
  205. package/dist/entries/carousel.js +7 -0
  206. package/dist/entries/checkbox.d.ts +3 -0
  207. package/dist/entries/checkbox.js +15 -0
  208. package/dist/entries/collapsible.d.ts +3 -0
  209. package/dist/entries/collapsible.js +7 -0
  210. package/dist/entries/color-picker.d.ts +3 -0
  211. package/dist/entries/color-picker.js +7 -0
  212. package/dist/entries/combobox.d.ts +3 -0
  213. package/dist/entries/combobox.js +7 -0
  214. package/dist/entries/command.d.ts +3 -0
  215. package/dist/entries/command.js +7 -0
  216. package/dist/entries/date-input.d.ts +3 -0
  217. package/dist/entries/date-input.js +7 -0
  218. package/dist/entries/date-picker.d.ts +3 -0
  219. package/dist/entries/date-picker.js +7 -0
  220. package/dist/entries/dialog.d.ts +3 -0
  221. package/dist/entries/dialog.js +7 -0
  222. package/dist/entries/drawer.d.ts +3 -0
  223. package/dist/entries/drawer.js +8 -0
  224. package/dist/entries/field.d.ts +2 -0
  225. package/dist/entries/field.js +3 -0
  226. package/dist/entries/file-input.d.ts +3 -0
  227. package/dist/entries/file-input.js +13 -0
  228. package/dist/entries/hover-card.d.ts +3 -0
  229. package/dist/entries/hover-card.js +7 -0
  230. package/dist/entries/image-cropper.d.ts +3 -0
  231. package/dist/entries/image-cropper.js +7 -0
  232. package/dist/entries/input.d.ts +3 -0
  233. package/dist/entries/input.js +8 -0
  234. package/dist/entries/label.d.ts +2 -0
  235. package/dist/entries/label.js +3 -0
  236. package/dist/entries/listbox.d.ts +3 -0
  237. package/dist/entries/listbox.js +7 -0
  238. package/dist/entries/menu.d.ts +3 -0
  239. package/dist/entries/menu.js +7 -0
  240. package/dist/entries/menubar.d.ts +3 -0
  241. package/dist/entries/menubar.js +7 -0
  242. package/dist/entries/meter.d.ts +2 -0
  243. package/dist/entries/meter.js +3 -0
  244. package/dist/entries/navigation-menu.d.ts +3 -0
  245. package/dist/entries/navigation-menu.js +7 -0
  246. package/dist/entries/number-input.d.ts +3 -0
  247. package/dist/entries/number-input.js +7 -0
  248. package/dist/entries/otp-input.d.ts +3 -0
  249. package/dist/entries/otp-input.js +7 -0
  250. package/dist/entries/overlays.d.ts +2 -0
  251. package/dist/entries/overlays.js +3 -0
  252. package/dist/entries/pagination.d.ts +3 -0
  253. package/dist/entries/pagination.js +11 -0
  254. package/dist/entries/password-input.d.ts +3 -0
  255. package/dist/entries/password-input.js +7 -0
  256. package/dist/entries/popover.d.ts +3 -0
  257. package/dist/entries/popover.js +7 -0
  258. package/dist/entries/preferences.d.ts +3 -0
  259. package/dist/entries/preferences.js +13 -0
  260. package/dist/entries/progress.d.ts +2 -0
  261. package/dist/entries/progress.js +3 -0
  262. package/dist/entries/radio.d.ts +3 -0
  263. package/dist/entries/radio.js +7 -0
  264. package/dist/entries/rating.d.ts +3 -0
  265. package/dist/entries/rating.js +8 -0
  266. package/dist/entries/resizable.d.ts +3 -0
  267. package/dist/entries/resizable.js +11 -0
  268. package/dist/entries/scroll-area.d.ts +3 -0
  269. package/dist/entries/scroll-area.js +7 -0
  270. package/dist/entries/segmented-control.d.ts +3 -0
  271. package/dist/entries/segmented-control.js +7 -0
  272. package/dist/entries/select.d.ts +3 -0
  273. package/dist/entries/select.js +7 -0
  274. package/dist/entries/separator.d.ts +2 -0
  275. package/dist/entries/separator.js +3 -0
  276. package/dist/entries/slider.d.ts +3 -0
  277. package/dist/entries/slider.js +7 -0
  278. package/dist/entries/switch.d.ts +3 -0
  279. package/dist/entries/switch.js +7 -0
  280. package/dist/entries/tabs.d.ts +3 -0
  281. package/dist/entries/tabs.js +7 -0
  282. package/dist/entries/textarea.d.ts +3 -0
  283. package/dist/entries/textarea.js +7 -0
  284. package/dist/entries/time-input.d.ts +3 -0
  285. package/dist/entries/time-input.js +7 -0
  286. package/dist/entries/timeline.d.ts +3 -0
  287. package/dist/entries/timeline.js +7 -0
  288. package/dist/entries/toast.d.ts +2 -0
  289. package/dist/entries/toast.js +3 -0
  290. package/dist/entries/toggle.d.ts +3 -0
  291. package/dist/entries/toggle.js +12 -0
  292. package/dist/entries/token-input.d.ts +3 -0
  293. package/dist/entries/token-input.js +17 -0
  294. package/dist/entries/toolbar.d.ts +3 -0
  295. package/dist/entries/toolbar.js +7 -0
  296. package/dist/entries/tooltip.d.ts +3 -0
  297. package/dist/entries/tooltip.js +7 -0
  298. package/dist/entries/tree.d.ts +3 -0
  299. package/dist/entries/tree.js +17 -0
  300. package/dist/entries/trigger-menu.d.ts +3 -0
  301. package/dist/entries/trigger-menu.js +11 -0
  302. package/dist/entries/waterfall.d.ts +3 -0
  303. package/dist/entries/waterfall.js +11 -0
  304. package/dist/events.d.ts +1658 -0
  305. package/dist/events.js +0 -0
  306. package/dist/field.d.ts +2 -0
  307. package/dist/field.js +101 -0
  308. package/dist/file-input.d.ts +2 -0
  309. package/dist/file-input.js +140 -0
  310. package/dist/forward-attributes.d.ts +2 -0
  311. package/dist/forward-attributes.js +22 -0
  312. package/dist/history.d.ts +2 -0
  313. package/dist/history.js +11 -0
  314. package/dist/hover-card.d.ts +2 -0
  315. package/dist/hover-card.js +31 -0
  316. package/dist/image-cropper.d.ts +2 -0
  317. package/dist/image-cropper.js +66 -0
  318. package/dist/index.d.ts +66 -0
  319. package/dist/index.js +269 -0
  320. package/dist/input.d.ts +3 -0
  321. package/dist/input.js +69 -0
  322. package/dist/label.d.ts +2 -0
  323. package/dist/label.js +11 -0
  324. package/dist/list.d.ts +40 -0
  325. package/dist/list.js +192 -0
  326. package/dist/listbox.d.ts +2 -0
  327. package/dist/listbox.js +84 -0
  328. package/dist/menu.d.ts +4 -0
  329. package/dist/menu.js +295 -0
  330. package/dist/menubar.d.ts +4 -0
  331. package/dist/menubar.js +30 -0
  332. package/dist/meter.d.ts +2 -0
  333. package/dist/meter.js +22 -0
  334. package/dist/navigation-menu.d.ts +2 -0
  335. package/dist/navigation-menu.js +114 -0
  336. package/dist/number-input.d.ts +2 -0
  337. package/dist/number-input.js +73 -0
  338. package/dist/observe.d.ts +2 -0
  339. package/dist/observe.js +7 -0
  340. package/dist/otp-input.d.ts +2 -0
  341. package/dist/otp-input.js +72 -0
  342. package/dist/overlays.d.ts +13 -0
  343. package/dist/overlays.js +156 -0
  344. package/dist/pagination.d.ts +2 -0
  345. package/dist/pagination.js +127 -0
  346. package/dist/password-input.d.ts +2 -0
  347. package/dist/password-input.js +57 -0
  348. package/dist/popover.d.ts +2 -0
  349. package/dist/popover.js +64 -0
  350. package/dist/popup.d.ts +40 -0
  351. package/dist/popup.js +112 -0
  352. package/dist/preferences.d.ts +2 -0
  353. package/dist/preferences.js +56 -0
  354. package/dist/progress.d.ts +2 -0
  355. package/dist/progress.js +22 -0
  356. package/dist/radio.d.ts +2 -0
  357. package/dist/radio.js +33 -0
  358. package/dist/rating.d.ts +2 -0
  359. package/dist/rating.js +64 -0
  360. package/dist/resizable.d.ts +2 -0
  361. package/dist/resizable.js +42 -0
  362. package/dist/scroll-area.d.ts +2 -0
  363. package/dist/scroll-area.js +45 -0
  364. package/dist/segmented-control.d.ts +2 -0
  365. package/dist/segmented-control.js +28 -0
  366. package/dist/select.d.ts +2 -0
  367. package/dist/select.js +239 -0
  368. package/dist/separator.d.ts +2 -0
  369. package/dist/separator.js +11 -0
  370. package/dist/slider.d.ts +2 -0
  371. package/dist/slider.js +77 -0
  372. package/dist/tabs.d.ts +2 -0
  373. package/dist/tabs.js +37 -0
  374. package/dist/timeline.d.ts +2 -0
  375. package/dist/timeline.js +27 -0
  376. package/dist/toast.d.ts +20 -0
  377. package/dist/toast.js +177 -0
  378. package/dist/toggle.d.ts +3 -0
  379. package/dist/toggle.js +64 -0
  380. package/dist/token-input.d.ts +2 -0
  381. package/dist/token-input.js +103 -0
  382. package/dist/toolbar.d.ts +2 -0
  383. package/dist/toolbar.js +36 -0
  384. package/dist/tooltip.d.ts +2 -0
  385. package/dist/tooltip.js +35 -0
  386. package/dist/tree.d.ts +2 -0
  387. package/dist/tree.js +147 -0
  388. package/dist/trigger-menu.d.ts +2 -0
  389. package/dist/trigger-menu.js +133 -0
  390. package/dist/waterfall.d.ts +2 -0
  391. package/dist/waterfall.js +140 -0
  392. package/docs/README.md +89 -0
  393. package/docs/agents.md +1523 -0
  394. package/docs/components/accordion.md +1401 -0
  395. package/docs/components/alert-dialog.md +788 -0
  396. package/docs/components/autocomplete.md +1692 -0
  397. package/docs/components/avatar.md +261 -0
  398. package/docs/components/button.md +441 -0
  399. package/docs/components/calendar.md +1536 -0
  400. package/docs/components/carousel.md +1055 -0
  401. package/docs/components/checkbox.md +1045 -0
  402. package/docs/components/collapsible.md +535 -0
  403. package/docs/components/color-picker.md +651 -0
  404. package/docs/components/combobox.md +3274 -0
  405. package/docs/components/command.md +1431 -0
  406. package/docs/components/date-input.md +563 -0
  407. package/docs/components/date-picker.md +1136 -0
  408. package/docs/components/dialog.md +1360 -0
  409. package/docs/components/drawer.md +1201 -0
  410. package/docs/components/field.md +519 -0
  411. package/docs/components/file-input.md +617 -0
  412. package/docs/components/hover-card.md +486 -0
  413. package/docs/components/image-cropper.md +489 -0
  414. package/docs/components/input.md +327 -0
  415. package/docs/components/label.md +208 -0
  416. package/docs/components/listbox.md +1015 -0
  417. package/docs/components/menu.md +1212 -0
  418. package/docs/components/menubar.md +460 -0
  419. package/docs/components/meter.md +298 -0
  420. package/docs/components/navigation-menu.md +1573 -0
  421. package/docs/components/number-input.md +1087 -0
  422. package/docs/components/otp-input.md +558 -0
  423. package/docs/components/pagination.md +639 -0
  424. package/docs/components/password-input.md +649 -0
  425. package/docs/components/popover.md +1433 -0
  426. package/docs/components/preferences.md +243 -0
  427. package/docs/components/progress.md +406 -0
  428. package/docs/components/radio.md +855 -0
  429. package/docs/components/rating.md +431 -0
  430. package/docs/components/resizable.md +866 -0
  431. package/docs/components/scroll-area.md +898 -0
  432. package/docs/components/segmented-control.md +421 -0
  433. package/docs/components/select.md +1957 -0
  434. package/docs/components/separator.md +238 -0
  435. package/docs/components/slider.md +1018 -0
  436. package/docs/components/switch.md +583 -0
  437. package/docs/components/tabs.md +948 -0
  438. package/docs/components/textarea.md +331 -0
  439. package/docs/components/time-input.md +235 -0
  440. package/docs/components/timeline.md +622 -0
  441. package/docs/components/toast.md +1223 -0
  442. package/docs/components/toggle.md +522 -0
  443. package/docs/components/token-input.md +854 -0
  444. package/docs/components/toolbar.md +815 -0
  445. package/docs/components/tooltip.md +860 -0
  446. package/docs/components/tree.md +1243 -0
  447. package/docs/components/trigger-menu.md +1110 -0
  448. package/docs/components/waterfall.md +709 -0
  449. package/docs/controllers.md +66 -0
  450. package/docs/core.md +8027 -0
  451. package/docs/custom-parts.md +91 -0
  452. package/docs/first-component.md +88 -0
  453. package/docs/forms.md +125 -0
  454. package/docs/installation.md +141 -0
  455. package/docs/introduction.md +32 -0
  456. package/docs/lists-and-menus.md +166 -0
  457. package/docs/llms.txt +1566 -0
  458. package/docs/parts-and-composition.md +57 -0
  459. package/docs/popups.md +92 -0
  460. package/docs/rendering.md +71 -0
  461. package/docs/server-rendering.md +118 -0
  462. package/docs/state-and-events.md +134 -0
  463. package/docs/styling-and-animation.md +104 -0
  464. package/docs/utilities/async-options.md +332 -0
  465. package/docs/utilities/shortcuts.md +184 -0
  466. package/html-custom-data.json +14792 -0
  467. package/package.json +302 -3
@@ -0,0 +1,622 @@
1
+ # Timeline
2
+
3
+ Show dated events in order, like an activity feed, a changelog or an order's progress, with arrow keys between them.
4
+
5
+ Use a Timeline for a list of things that happened, or will: a project's activity, an order's status history, a release's milestones. It's a list for screen readers, with one tab stop for keyboards, and the arrow keys move between events.
6
+
7
+ ```ts title="demo.ts"
8
+ import "@ui-sdk/web/timeline"
9
+
10
+ const events = [
11
+ {
12
+ title: "Deployed to production",
13
+ dateTime: "2026-11-10T14:32",
14
+ time: "Today, 2:32 PM",
15
+ description: "Version 2.4.1 is live in every region.",
16
+ },
17
+ {
18
+ title: "Checks passed",
19
+ dateTime: "2026-11-10T14:20",
20
+ time: "Today, 2:20 PM",
21
+ description: "312 tests and the bundle size budget.",
22
+ },
23
+ {
24
+ title: "Pull request merged",
25
+ dateTime: "2026-11-10T13:58",
26
+ time: "Today, 1:58 PM",
27
+ description: "Ada merged Cache search results into main.",
28
+ },
29
+ {
30
+ title: "Review requested",
31
+ dateTime: "2026-11-09T17:05",
32
+ time: "Yesterday, 5:05 PM",
33
+ description: "Grace and Linus were asked to review.",
34
+ },
35
+ ]
36
+
37
+ function mount(root: HTMLElement) {
38
+ root.innerHTML = `
39
+ <ui-timeline aria-label="Activity">
40
+ ${events
41
+ .map(
42
+ (event) => `
43
+ <ui-timeline-item>
44
+ <ui-timeline-marker></ui-timeline-marker>
45
+ <ui-timeline-connector></ui-timeline-connector>
46
+ <ui-timeline-title>${event.title}</ui-timeline-title>
47
+ <ui-timeline-time><time datetime="${event.dateTime}">${event.time}</time></ui-timeline-time>
48
+ <ui-timeline-description>${event.description}</ui-timeline-description>
49
+ </ui-timeline-item>`
50
+ )
51
+ .join("")}
52
+ </ui-timeline>
53
+ `
54
+ }
55
+
56
+ export { mount }
57
+ ```
58
+
59
+ Tab into the activity, then use Up and Down to move between events. Home and End jump to the first and last.
60
+
61
+ ## Installation
62
+
63
+ ```bash
64
+ npm install @ui-sdk/web @ui-sdk/core
65
+ ```
66
+
67
+ Importing the component defines its elements. On the server the import does nothing.
68
+
69
+ ```ts
70
+ import "@ui-sdk/web/timeline"
71
+ ```
72
+
73
+ ## Composition
74
+
75
+ Use the following composition to build a `ui-timeline`:
76
+
77
+ ```text
78
+ ui-timeline
79
+ ├── ui-timeline-item
80
+ │ ├── ui-timeline-marker
81
+ │ ├── ui-timeline-connector
82
+ │ ├── ui-timeline-title
83
+ │ ├── ui-timeline-time
84
+ │ │ └── time
85
+ │ └── ui-timeline-description
86
+ └── ui-timeline-item
87
+ ```
88
+
89
+ Every part inside an item is optional. `ui-timeline-marker` is the dot or icon on the line, and `ui-timeline-connector` the line to the next event. Both are hidden from screen readers, so they're only for looks.
90
+
91
+ ## Usage
92
+
93
+ Import the parts and put them together:
94
+
95
+ ```html
96
+ <script type="module">
97
+ import "@ui-sdk/web/timeline"
98
+ </script>
99
+
100
+ <ui-timeline aria-label="Activity">
101
+ <ui-timeline-item>
102
+ <ui-timeline-marker></ui-timeline-marker>
103
+ <ui-timeline-connector></ui-timeline-connector>
104
+ <ui-timeline-title>Deployed to production</ui-timeline-title>
105
+ <ui-timeline-time>
106
+ <time datetime="2026-11-10T14:32">2:32 PM</time>
107
+ </ui-timeline-time>
108
+ <ui-timeline-description>Version 2.4.1 is live.</ui-timeline-description>
109
+ </ui-timeline-item>
110
+ </ui-timeline>
111
+ ```
112
+
113
+ `ui-timeline` has the `list` role and each item the `listitem` role. With `feed`, the same markup becomes a feed of articles. Put a `<time>` with `datetime` inside `ui-timeline-time`, so the date is machine readable while the text stays friendly. The part binds to that `<time>`.
114
+
115
+ When focus lands on an event, screen readers read its title as its name, then its time and description. Links and buttons inside an event stay in the tab order: Tab moves from the event to them, and arrow keys pressed on them stay with them.
116
+
117
+ ## Horizontal
118
+
119
+ Set `orientation="horizontal"` for a row, like a roadmap. Left and Right move between events instead of Up and Down, and they swap in right-to-left text. Set `loop="false"` to stop at either end.
120
+
121
+ ```ts title="horizontal.ts"
122
+ import "@ui-sdk/web/timeline"
123
+
124
+ const milestones = [
125
+ { title: "Kickoff", dateTime: "2026-01", time: "January" },
126
+ { title: "Design review", dateTime: "2026-03", time: "March" },
127
+ { title: "Beta", dateTime: "2026-06", time: "June" },
128
+ { title: "Launch", dateTime: "2026-09", time: "September" },
129
+ ]
130
+
131
+ function mount(root: HTMLElement) {
132
+ root.innerHTML = `
133
+ <ui-timeline orientation="horizontal" loop="false" aria-label="Roadmap">
134
+ ${milestones
135
+ .map(
136
+ (milestone) => `
137
+ <ui-timeline-item>
138
+ <ui-timeline-marker></ui-timeline-marker>
139
+ <ui-timeline-connector></ui-timeline-connector>
140
+ <ui-timeline-title>${milestone.title}</ui-timeline-title>
141
+ <ui-timeline-time><time datetime="${milestone.dateTime}">${milestone.time}</time></ui-timeline-time>
142
+ </ui-timeline-item>`
143
+ )
144
+ .join("")}
145
+ </ui-timeline>
146
+ `
147
+ }
148
+
149
+ export { mount }
150
+ ```
151
+
152
+ Tab into the roadmap and press Right to reach Launch. Right again stays there.
153
+
154
+ ## Status
155
+
156
+ Give each item a `status` attribute of `complete`, `current` or `upcoming` for a process, like an order's progress. The current event gets `aria-current="step"`, and Tab lands on it first. Every part of an event shows its status with `data-complete`, `data-current` or `data-upcoming`.
157
+
158
+ The timeline element's `api` property has the controller's methods. Call its `focus()` with an item's `value` to move focus to it from anywhere.
159
+
160
+ ```ts title="status.ts"
161
+ import "@ui-sdk/web/timeline"
162
+ import { Check, createElement } from "lucide"
163
+
164
+ const steps = [
165
+ {
166
+ value: "placed",
167
+ title: "Order placed",
168
+ dateTime: "2026-11-01",
169
+ time: "Nov 1",
170
+ description: "We received your order.",
171
+ status: "complete",
172
+ },
173
+ {
174
+ value: "packed",
175
+ title: "Packed",
176
+ dateTime: "2026-11-02",
177
+ time: "Nov 2",
178
+ description: "Your items left the shelf.",
179
+ status: "complete",
180
+ },
181
+ {
182
+ value: "shipped",
183
+ title: "Shipped",
184
+ dateTime: "2026-11-03",
185
+ time: "Nov 3",
186
+ description: "On its way with the carrier.",
187
+ status: "current",
188
+ },
189
+ {
190
+ value: "delivered",
191
+ title: "Delivered",
192
+ dateTime: "2026-11-05",
193
+ time: "Nov 5",
194
+ description: "Expected by Thursday.",
195
+ status: "upcoming",
196
+ },
197
+ ]
198
+
199
+ function mount(root: HTMLElement) {
200
+ root.innerHTML = `
201
+ <div data-slot="stack">
202
+ <div data-slot="controls">
203
+ <button type="button">Go to Current Step</button>
204
+ </div>
205
+ <ui-timeline aria-label="Order status">
206
+ ${steps
207
+ .map(
208
+ (step) => `
209
+ <ui-timeline-item value="${step.value}" status="${step.status}">
210
+ <ui-timeline-marker>${step.status === "complete" ? createElement(Check, { "aria-hidden": "true" }).outerHTML : ""}</ui-timeline-marker>
211
+ <ui-timeline-connector></ui-timeline-connector>
212
+ <ui-timeline-title>${step.title}</ui-timeline-title>
213
+ <ui-timeline-time><time datetime="${step.dateTime}">${step.time}</time></ui-timeline-time>
214
+ <ui-timeline-description>${step.description}</ui-timeline-description>
215
+ </ui-timeline-item>`
216
+ )
217
+ .join("")}
218
+ </ui-timeline>
219
+ </div>
220
+ `
221
+ const timeline = root.querySelector("ui-timeline")!
222
+ root
223
+ .querySelector('[data-slot="controls"] button')!
224
+ .addEventListener("click", () => timeline.api.focus("shipped"))
225
+ }
226
+
227
+ export { mount }
228
+ ```
229
+
230
+ Tab into the order status. Focus starts on Shipped, the current step. Move away, then choose Go to Current Step.
231
+
232
+ A marker shows status only to sighted people. When the status matters, say it in the title or description too, like "Shipped, in progress".
233
+
234
+ ## Details
235
+
236
+ Put a [Collapsible](./collapsible.md) inside an item for details that can open. Its trigger is a button inside the event, so Tab reaches it after the event, and arrow keys still move between events.
237
+
238
+ ```ts title="details.ts"
239
+ import "@ui-sdk/web/timeline"
240
+ import "@ui-sdk/web/collapsible"
241
+ import { ChevronDown, createElement } from "lucide"
242
+
243
+ const releases = [
244
+ {
245
+ title: "Version 2.4",
246
+ dateTime: "2026-10-28",
247
+ time: "October 28",
248
+ description: "Faster search and resumable uploads.",
249
+ changes: [
250
+ "Search now matches file contents, not only names.",
251
+ "Uploads resume after the connection drops.",
252
+ ],
253
+ },
254
+ {
255
+ title: "Version 2.3",
256
+ dateTime: "2026-09-30",
257
+ time: "September 30",
258
+ description: "Shared links and a new sidebar.",
259
+ changes: [
260
+ "Shared links remember the folder they were opened from.",
261
+ "The sidebar collapses to icons on narrow screens.",
262
+ ],
263
+ },
264
+ {
265
+ title: "Version 2.2",
266
+ dateTime: "2026-08-26",
267
+ time: "August 26",
268
+ description: "Dark mode follows your system.",
269
+ changes: ["Dark mode follows the system setting.", "Avatars are sharper."],
270
+ },
271
+ ]
272
+
273
+ function mount(root: HTMLElement) {
274
+ root.innerHTML = `
275
+ <ui-timeline aria-label="Changelog">
276
+ ${releases
277
+ .map(
278
+ (release) => `
279
+ <ui-timeline-item>
280
+ <ui-timeline-marker></ui-timeline-marker>
281
+ <ui-timeline-connector></ui-timeline-connector>
282
+ <ui-timeline-title>${release.title}</ui-timeline-title>
283
+ <ui-timeline-time><time datetime="${release.dateTime}">${release.time}</time></ui-timeline-time>
284
+ <ui-timeline-description>${release.description}</ui-timeline-description>
285
+ <ui-collapsible>
286
+ <ui-collapsible-trigger>
287
+ <button type="button" aria-expanded="false">
288
+ What Changed
289
+ ${createElement(ChevronDown, { "aria-hidden": "true" }).outerHTML}
290
+ </button>
291
+ </ui-collapsible-trigger>
292
+ <ui-collapsible-panel hidden>
293
+ <ul>
294
+ ${release.changes.map((change) => `<li>${change}</li>`).join("")}
295
+ </ul>
296
+ </ui-collapsible-panel>
297
+ </ui-collapsible>
298
+ </ui-timeline-item>`
299
+ )
300
+ .join("")}
301
+ </ui-timeline>
302
+ `
303
+ }
304
+
305
+ export { mount }
306
+ ```
307
+
308
+ Tab to What Changed under Version 2.4 and press Enter. Shift+Tab back to the event, then press Down for Version 2.3.
309
+
310
+ ## Feed
311
+
312
+ Set `feed` for a timeline that loads more as people scroll, like a social feed. It follows the [WAI-ARIA feed pattern](https://www.w3.org/WAI/ARIA/apg/patterns/feed/): the root becomes a `feed` and each item an `article` with its position and the count, and Page Down and Page Up move between articles from anywhere inside one.
313
+
314
+ Set the `busy` property, or attribute, while you load or change articles. It sets `aria-busy`, so screen readers wait for the new articles before reading on.
315
+
316
+ ```ts title="feed.ts"
317
+ import "@ui-sdk/web/timeline"
318
+ import { log } from "./log"
319
+
320
+ const updates = [
321
+ {
322
+ author: "Ada",
323
+ date: "2026-11-10",
324
+ time: "Nov 10",
325
+ text: "Shipped the new onboarding flow.",
326
+ },
327
+ {
328
+ author: "Grace",
329
+ date: "2026-11-10",
330
+ time: "Nov 10",
331
+ text: "Fixed the flaky upload test.",
332
+ },
333
+ {
334
+ author: "Linus",
335
+ date: "2026-11-09",
336
+ time: "Nov 9",
337
+ text: "Moved the docs to the new theme.",
338
+ },
339
+ {
340
+ author: "Margaret",
341
+ date: "2026-11-09",
342
+ time: "Nov 9",
343
+ text: "Wrote the launch checklist.",
344
+ },
345
+ {
346
+ author: "Ada",
347
+ date: "2026-11-08",
348
+ time: "Nov 8",
349
+ text: "Cut search latency in half.",
350
+ },
351
+ {
352
+ author: "Grace",
353
+ date: "2026-11-07",
354
+ time: "Nov 7",
355
+ text: "Added keyboard shortcuts to the editor.",
356
+ },
357
+ {
358
+ author: "Linus",
359
+ date: "2026-11-06",
360
+ time: "Nov 6",
361
+ text: "Cleaned up the old billing code.",
362
+ },
363
+ {
364
+ author: "Margaret",
365
+ date: "2026-11-05",
366
+ time: "Nov 5",
367
+ text: "Ran the accessibility review.",
368
+ },
369
+ {
370
+ author: "Ada",
371
+ date: "2026-11-04",
372
+ time: "Nov 4",
373
+ text: "Started the mobile layout.",
374
+ },
375
+ ]
376
+
377
+ const pageSize = 3
378
+
379
+ const article = (update: (typeof updates)[number]) => `
380
+ <ui-timeline-item>
381
+ <ui-timeline-marker></ui-timeline-marker>
382
+ <ui-timeline-connector></ui-timeline-connector>
383
+ <ui-timeline-title>${update.author}</ui-timeline-title>
384
+ <ui-timeline-time><time datetime="${update.date}">${update.time}</time></ui-timeline-time>
385
+ <ui-timeline-description>${update.text}</ui-timeline-description>
386
+ </ui-timeline-item>`
387
+
388
+ function mount(root: HTMLElement) {
389
+ root.innerHTML = `
390
+ <div data-slot="stack">
391
+ <div data-slot="controls">
392
+ <button type="button">Load More</button>
393
+ </div>
394
+ <ui-timeline feed aria-label="Team updates">
395
+ ${updates.slice(0, pageSize).map(article).join("")}
396
+ </ui-timeline>
397
+ </div>
398
+ `
399
+ const timeline = root.querySelector("ui-timeline")!
400
+ const button = root.querySelector("button")!
401
+ let count = pageSize
402
+ let timer: ReturnType<typeof setTimeout> | undefined
403
+ button.addEventListener("click", () => {
404
+ timeline.busy = true
405
+ button.disabled = true
406
+ button.textContent = "Loading…"
407
+ timer = setTimeout(() => {
408
+ timeline.insertAdjacentHTML(
409
+ "beforeend",
410
+ updates
411
+ .slice(count, count + pageSize)
412
+ .map(article)
413
+ .join("")
414
+ )
415
+ count += pageSize
416
+ timeline.busy = false
417
+ button.disabled = count >= updates.length
418
+ button.textContent = "Load More"
419
+ log(root, `Loaded ${pageSize} more updates`)
420
+ }, 600)
421
+ })
422
+ return () => clearTimeout(timer)
423
+ }
424
+
425
+ export { mount }
426
+ ```
427
+
428
+ Tab into the updates and press Page Down. Choose Load More: the feed is busy until three more updates arrive. The console logs each load.
429
+
430
+ Use a list for most timelines. A feed is for long lists that grow, where a screen reader's reading mode should flow from one article to the next.
431
+
432
+ ## Custom Rendering
433
+
434
+ Put a heading inside `ui-timeline-title` so people can move between events by heading, or add `as-child` to make the heading itself the part:
435
+
436
+ ```html
437
+ <ui-timeline-title as-child><h3>Deployed to production</h3></ui-timeline-title>
438
+ ```
439
+
440
+ [Parts and Composition](../parts-and-composition.md) explains the rendering contract.
441
+
442
+ ## Styling
443
+
444
+ The parts have no styles. Lay an item out as a grid, with the marker in its own column and the connector positioned along it. `data-orientation` on every part says which way the events run.
445
+
446
+ Use `data-first` and `data-last` on items to hide the connector after the last event. They're written once the elements are defined; before that, `:last-child` does the same.
447
+
448
+ Each part has a `data-slot`, such as `timeline-marker`, and its state attributes are listed under [Data Attributes](#data-attributes). The time's attributes land on the `<time>` inside it.
449
+
450
+ `<ui-timeline>` writes `--timeline-count`, how many events it holds, and each `<ui-timeline-item>` writes `--timeline-index`, its place from 0. Use them for a horizontal row's grid columns, or to stagger an animation.
451
+
452
+ ### `<ui-timeline>`
453
+ - `--timeline-count`: How many events are in the page. Size a horizontal grid's columns with it.
454
+
455
+ ### `<ui-timeline-item>`
456
+ - `--timeline-index`: The event's place among the events in the page, 0 for the first. It follows them as they move.
457
+
458
+ ## Data Attributes
459
+
460
+ ### `<ui-timeline>`
461
+ `[data-slot="timeline"]`
462
+
463
+ - `data-orientation` (`horizontal`, `vertical`): Which way the events run.
464
+ - `data-busy`: Present while a feed is loading or changing events, with `busy`.
465
+
466
+ ### `<ui-timeline-item>`
467
+ `[data-slot="timeline-item"]`
468
+
469
+ - `data-complete`: Present when the event's status is `complete`.
470
+ - `data-orientation` (`horizontal`, `vertical`): Which way the events run.
471
+ - `data-current`: Present when the event's status is `current`.
472
+ - `data-upcoming`: Present when the event's status is `upcoming`.
473
+ - `data-first`: Present on the first event. Written once it's in the page.
474
+ - `data-last`: Present on the last event. Written once it's in the page.
475
+
476
+ ### `<ui-timeline-marker>`
477
+ `[data-slot="timeline-marker"]`
478
+
479
+ - `data-complete`: Present when the event's status is `complete`.
480
+ - `data-orientation` (`horizontal`, `vertical`): Which way the events run.
481
+ - `data-current`: Present when the event's status is `current`.
482
+ - `data-upcoming`: Present when the event's status is `upcoming`.
483
+
484
+ ### `<ui-timeline-connector>`
485
+ `[data-slot="timeline-connector"]`
486
+
487
+ - `data-complete`: Present when the event's status is `complete`.
488
+ - `data-orientation` (`horizontal`, `vertical`): Which way the events run.
489
+ - `data-current`: Present when the event's status is `current`.
490
+ - `data-upcoming`: Present when the event's status is `upcoming`.
491
+
492
+ ### `<ui-timeline-time>`
493
+ `[data-slot="timeline-time"]`
494
+
495
+ - `data-complete`: Present when the event's status is `complete`.
496
+ - `data-orientation` (`horizontal`, `vertical`): Which way the events run.
497
+ - `data-current`: Present when the event's status is `current`.
498
+ - `data-upcoming`: Present when the event's status is `upcoming`.
499
+
500
+ ### `<ui-timeline-title>`
501
+ `[data-slot="timeline-title"]`
502
+
503
+ - `data-complete`: Present when the event's status is `complete`.
504
+ - `data-orientation` (`horizontal`, `vertical`): Which way the events run.
505
+ - `data-current`: Present when the event's status is `current`.
506
+ - `data-upcoming`: Present when the event's status is `upcoming`.
507
+
508
+ ### `<ui-timeline-description>`
509
+ `[data-slot="timeline-description"]`
510
+
511
+ - `data-complete`: Present when the event's status is `complete`.
512
+ - `data-orientation` (`horizontal`, `vertical`): Which way the events run.
513
+ - `data-current`: Present when the event's status is `current`.
514
+ - `data-upcoming`: Present when the event's status is `upcoming`.
515
+
516
+ ## API Reference
517
+
518
+ Props are attributes in kebab case: `"false"` is false, as in `loop="false"`.
519
+
520
+ ### Timeline
521
+
522
+ - `orientation?` (`TimelineOrientation`): Which arrow keys move between events: up and down, or left and right.
523
+ - `loop?` (`boolean`): Whether arrow keys wrap from the last event to the first.
524
+ - `feed?` (`boolean`): Whether the events are a feed that loads more as people scroll, rather than a list. Each event becomes an article with its position, and Page Down and Page Up move between them from anywhere inside one.
525
+ - `busy?` (`boolean`): Whether a feed is loading or changing events, which sets `aria-busy` so screen readers wait until it's done. Only a feed reads it.
526
+ - `controller?` (`{ focus: (value?: string) => void; }`): Focuses an event from anywhere. Create one with `createTimelineController()`.
527
+ - `debug?` (`boolean`): Logs every state change with its reason to the console, in development builds.
528
+
529
+ ### TimelineItem
530
+
531
+ - `value?` (`string`): Names the event for the controller's `focus()`. Generated when left out.
532
+ - `status?` (`TimelineStatus`): Where the event stands in a process. The `"current"` one sets `aria-current="step"` and takes the tab stop first.
533
+
534
+ `ui-timeline-marker`, `ui-timeline-connector`, `ui-timeline-time`, `ui-timeline-title` and `ui-timeline-description` take no props of their own.
535
+
536
+ ### State
537
+
538
+ The same state shows as data attributes on each part. On `ui-timeline`:
539
+
540
+ - `orientation` (`TimelineOrientation`): Which way the events run.
541
+ - `feed` (`boolean`): Whether the events are a feed rather than a list.
542
+ - `busy` (`boolean`): Whether a feed is loading or changing events.
543
+
544
+ On `ui-timeline-item` and every part inside it:
545
+
546
+ - `status` (`TimelineStatus | undefined`): Where the event stands in a process, or `undefined` when it has no status.
547
+ - `orientation` (`TimelineOrientation`): Which way the events run.
548
+
549
+ ### Controller
550
+
551
+ The element's `api` property has the same methods.
552
+
553
+ - `focus(value?)` (`(value?: string | undefined) => void`): Moves focus to an event by its `value`, or to the event that holds the tab stop.
554
+
555
+ ## Accessibility
556
+
557
+ A timeline is a `list` of `listitem`s, named with `aria-label`. With `feed`, it follows the [WAI-ARIA feed pattern](https://www.w3.org/WAI/ARIA/apg/patterns/feed/): a `feed` of `article`s, each with `aria-posinset` and `aria-setsize`, and `aria-busy` while it loads. Each event is named by its title through `aria-labelledby` and described by its time and description through `aria-describedby`. The current event has `aria-current="step"`.
558
+
559
+ ### Keyboard
560
+
561
+ The events have one tab stop, a roving focus. Tab enters on the current event, else the first, then returns to the event focused last.
562
+
563
+ | Key | Action |
564
+ | -------------------------- | ---------------------------------------------------------- |
565
+ | `ArrowDown` / `ArrowUp` | Move focus between events in a vertical timeline |
566
+ | `ArrowRight` / `ArrowLeft` | Move focus between events in a horizontal timeline |
567
+ | `Home` / `End` | Focus the first or last event |
568
+ | `PageDown` / `PageUp` | In a feed, focus the next or previous article, from inside |
569
+ | `Tab` | Move from an event to the links and buttons inside it |
570
+
571
+ Arrow keys move only from an event itself, so controls inside keep them. In right-to-left text, Left and Right swap.
572
+
573
+ ### Tested Behavior
574
+
575
+ Every line below is an automated test.
576
+
577
+ - A busy feed sets aria-busy.
578
+
579
+ **A list of events**
580
+
581
+ - The events are a named list of list items.
582
+ - Each event is named by its title and described by its time and description.
583
+ - Tab lands on the current event, then on the links inside it, then leaves.
584
+ - The current event says it's the current step.
585
+ - Each event and its parts show its status.
586
+ - ArrowDown and ArrowUp move between events.
587
+ - ArrowLeft and ArrowRight do nothing in a vertical list.
588
+ - Home and End move to the first and last events.
589
+ - Arrow keys wrap from the last event to the first.
590
+ - Arrow keys on a link inside an event leave focus on the link.
591
+ - Page Down does nothing in a list.
592
+ - Tab comes back to the event focused last.
593
+ - Only the event with the tab stop is in the tab order.
594
+ - The first and last events are marked.
595
+ - An event added at the top becomes the first.
596
+ - Events that change places move the first and last marks.
597
+ - Each event carries its place and the list how many there are.
598
+ - The tab stop follows the current step when it moves before focus enters.
599
+ - The controller moves focus to an event.
600
+ - Markers and connectors are hidden from assistive technology.
601
+
602
+ **A list that doesn't loop**
603
+
604
+ - Arrow keys stop at either end.
605
+
606
+ **A horizontal list**
607
+
608
+ - ArrowRight and ArrowLeft move between events.
609
+ - ArrowDown and ArrowUp do nothing.
610
+
611
+ **A feed**
612
+
613
+ - The events are a named feed of articles.
614
+ - Each article says where it sits and how many there are.
615
+ - An article added at the top moves every position.
616
+ - Articles moved inside a wrapper take their new places.
617
+ - Page Down and Page Up move between articles.
618
+ - Page Down from a link inside an article moves to the next article.
619
+ - Page Down on the last article stays there.
620
+ - The feed isn't busy until it's told.
621
+
622
+ Runs in React, Vue and web components.