@proyecto-viviana/solidaria 0.3.0 → 0.4.0

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 (566) hide show
  1. package/dist/_chunk/actiongroup.js +207 -0
  2. package/dist/_chunk/actiongroup.js.map +1 -0
  3. package/dist/_chunk/actiongroup.jsx +207 -0
  4. package/dist/_chunk/actiongroup.jsx.map +1 -0
  5. package/dist/_chunk/ariaHideOutside.js +122 -0
  6. package/dist/_chunk/ariaHideOutside.js.map +1 -0
  7. package/dist/_chunk/ariaHideOutside.jsx +122 -0
  8. package/dist/_chunk/ariaHideOutside.jsx.map +1 -0
  9. package/dist/_chunk/autocomplete.js +196 -0
  10. package/dist/_chunk/autocomplete.js.map +1 -0
  11. package/dist/_chunk/autocomplete.jsx +196 -0
  12. package/dist/_chunk/autocomplete.jsx.map +1 -0
  13. package/dist/_chunk/breadcrumbs.js +119 -0
  14. package/dist/_chunk/breadcrumbs.js.map +1 -0
  15. package/dist/_chunk/breadcrumbs.jsx +119 -0
  16. package/dist/_chunk/breadcrumbs.jsx.map +1 -0
  17. package/dist/_chunk/button.js +276 -0
  18. package/dist/_chunk/button.js.map +1 -0
  19. package/dist/_chunk/button.jsx +276 -0
  20. package/dist/_chunk/button.jsx.map +1 -0
  21. package/dist/_chunk/calendar.js +1036 -0
  22. package/dist/_chunk/calendar.js.map +1 -0
  23. package/dist/_chunk/calendar.jsx +1036 -0
  24. package/dist/_chunk/calendar.jsx.map +1 -0
  25. package/dist/_chunk/checkbox.js +234 -0
  26. package/dist/_chunk/checkbox.js.map +1 -0
  27. package/dist/_chunk/checkbox.jsx +234 -0
  28. package/dist/_chunk/checkbox.jsx.map +1 -0
  29. package/dist/_chunk/color.js +1174 -0
  30. package/dist/_chunk/color.js.map +1 -0
  31. package/dist/_chunk/color.jsx +1174 -0
  32. package/dist/_chunk/color.jsx.map +1 -0
  33. package/dist/_chunk/combobox.js +436 -0
  34. package/dist/_chunk/combobox.js.map +1 -0
  35. package/dist/_chunk/combobox.jsx +436 -0
  36. package/dist/_chunk/combobox.jsx.map +1 -0
  37. package/dist/_chunk/createCollator.js +229 -0
  38. package/dist/_chunk/createCollator.js.map +1 -0
  39. package/dist/_chunk/createCollator.jsx +223 -0
  40. package/dist/_chunk/createCollator.jsx.map +1 -0
  41. package/dist/_chunk/createCollectionRowInteraction.js +133 -0
  42. package/dist/_chunk/createCollectionRowInteraction.js.map +1 -0
  43. package/dist/_chunk/createCollectionRowInteraction.jsx +133 -0
  44. package/dist/_chunk/createCollectionRowInteraction.jsx.map +1 -0
  45. package/dist/_chunk/createField.js +54 -0
  46. package/dist/_chunk/createField.js.map +1 -0
  47. package/dist/_chunk/createField.jsx +54 -0
  48. package/dist/_chunk/createField.jsx.map +1 -0
  49. package/dist/_chunk/createFocus.js +101 -0
  50. package/dist/_chunk/createFocus.js.map +1 -0
  51. package/dist/_chunk/createFocus.jsx +101 -0
  52. package/dist/_chunk/createFocus.jsx.map +1 -0
  53. package/dist/_chunk/createFocusRing.js +54 -0
  54. package/dist/_chunk/createFocusRing.js.map +1 -0
  55. package/dist/_chunk/createFocusRing.jsx +54 -0
  56. package/dist/_chunk/createFocusRing.jsx.map +1 -0
  57. package/dist/_chunk/createFocusWithin.js +121 -0
  58. package/dist/_chunk/createFocusWithin.js.map +1 -0
  59. package/dist/_chunk/createFocusWithin.jsx +121 -0
  60. package/dist/_chunk/createFocusWithin.jsx.map +1 -0
  61. package/dist/_chunk/createFocusable.js +131 -0
  62. package/dist/_chunk/createFocusable.js.map +1 -0
  63. package/dist/_chunk/createFocusable.jsx +131 -0
  64. package/dist/_chunk/createFocusable.jsx.map +1 -0
  65. package/dist/_chunk/createFormValidation.js +135 -0
  66. package/dist/_chunk/createFormValidation.js.map +1 -0
  67. package/dist/_chunk/createFormValidation.jsx +135 -0
  68. package/dist/_chunk/createFormValidation.jsx.map +1 -0
  69. package/dist/_chunk/createHover.js +130 -0
  70. package/dist/_chunk/createHover.js.map +1 -0
  71. package/dist/_chunk/createHover.jsx +130 -0
  72. package/dist/_chunk/createHover.jsx.map +1 -0
  73. package/dist/_chunk/createInteractionModality.js +269 -0
  74. package/dist/_chunk/createInteractionModality.js.map +1 -0
  75. package/dist/_chunk/createInteractionModality.jsx +269 -0
  76. package/dist/_chunk/createInteractionModality.jsx.map +1 -0
  77. package/dist/_chunk/createLabel.js +46 -0
  78. package/dist/_chunk/createLabel.js.map +1 -0
  79. package/dist/_chunk/createLabel.jsx +46 -0
  80. package/dist/_chunk/createLabel.jsx.map +1 -0
  81. package/dist/_chunk/createLabels.js +31 -0
  82. package/dist/_chunk/createLabels.js.map +1 -0
  83. package/dist/_chunk/createLabels.jsx +31 -0
  84. package/dist/_chunk/createLabels.jsx.map +1 -0
  85. package/dist/_chunk/createLandmark.js +198 -0
  86. package/dist/_chunk/createLandmark.js.map +1 -0
  87. package/dist/_chunk/createLandmark.jsx +198 -0
  88. package/dist/_chunk/createLandmark.jsx.map +1 -0
  89. package/dist/_chunk/createLongPress.js +91 -0
  90. package/dist/_chunk/createLongPress.js.map +1 -0
  91. package/dist/_chunk/createLongPress.jsx +91 -0
  92. package/dist/_chunk/createLongPress.jsx.map +1 -0
  93. package/dist/_chunk/createOverlay.js +327 -0
  94. package/dist/_chunk/createOverlay.js.map +1 -0
  95. package/dist/_chunk/createOverlay.jsx +327 -0
  96. package/dist/_chunk/createOverlay.jsx.map +1 -0
  97. package/dist/_chunk/createPress.js +526 -0
  98. package/dist/_chunk/createPress.js.map +1 -0
  99. package/dist/_chunk/createPress.jsx +526 -0
  100. package/dist/_chunk/createPress.jsx.map +1 -0
  101. package/dist/_chunk/createProgressBar.js +81 -0
  102. package/dist/_chunk/createProgressBar.js.map +1 -0
  103. package/dist/_chunk/createProgressBar.jsx +81 -0
  104. package/dist/_chunk/createProgressBar.jsx.map +1 -0
  105. package/dist/_chunk/createSelectableItem.js +298 -0
  106. package/dist/_chunk/createSelectableItem.js.map +1 -0
  107. package/dist/_chunk/createSelectableItem.jsx +298 -0
  108. package/dist/_chunk/createSelectableItem.jsx.map +1 -0
  109. package/dist/_chunk/createToggle.js +158 -0
  110. package/dist/_chunk/createToggle.js.map +1 -0
  111. package/dist/_chunk/createToggle.jsx +158 -0
  112. package/dist/_chunk/createToggle.jsx.map +1 -0
  113. package/dist/_chunk/createTypeSelect.js +125 -0
  114. package/dist/_chunk/createTypeSelect.js.map +1 -0
  115. package/dist/_chunk/createTypeSelect.jsx +125 -0
  116. package/dist/_chunk/createTypeSelect.jsx.map +1 -0
  117. package/dist/_chunk/datepicker.js +1393 -0
  118. package/dist/_chunk/datepicker.js.map +1 -0
  119. package/dist/_chunk/datepicker.jsx +1393 -0
  120. package/dist/_chunk/datepicker.jsx.map +1 -0
  121. package/dist/_chunk/dialog.js +62 -0
  122. package/dist/_chunk/dialog.js.map +1 -0
  123. package/dist/_chunk/dialog.jsx +62 -0
  124. package/dist/_chunk/dialog.jsx.map +1 -0
  125. package/dist/_chunk/disclosure.js +185 -0
  126. package/dist/_chunk/disclosure.js.map +1 -0
  127. package/dist/_chunk/disclosure.jsx +185 -0
  128. package/dist/_chunk/disclosure.jsx.map +1 -0
  129. package/dist/_chunk/dnd.js +1304 -0
  130. package/dist/_chunk/dnd.js.map +1 -0
  131. package/dist/_chunk/dnd.jsx +1304 -0
  132. package/dist/_chunk/dnd.jsx.map +1 -0
  133. package/dist/_chunk/env.js +105 -0
  134. package/dist/_chunk/env.js.map +1 -0
  135. package/dist/_chunk/env.jsx +105 -0
  136. package/dist/_chunk/env.jsx.map +1 -0
  137. package/dist/_chunk/filterDOMProps.js +82 -0
  138. package/dist/_chunk/filterDOMProps.js.map +1 -0
  139. package/dist/_chunk/filterDOMProps.jsx +82 -0
  140. package/dist/_chunk/filterDOMProps.jsx.map +1 -0
  141. package/dist/_chunk/focus.js +399 -0
  142. package/dist/_chunk/focus.js.map +1 -0
  143. package/dist/_chunk/focus.jsx +399 -0
  144. package/dist/_chunk/focus.jsx.map +1 -0
  145. package/dist/_chunk/focus2.js +895 -0
  146. package/dist/_chunk/focus2.js.map +1 -0
  147. package/dist/_chunk/focus2.jsx +870 -0
  148. package/dist/_chunk/focus2.jsx.map +1 -0
  149. package/dist/_chunk/form.js +39 -0
  150. package/dist/_chunk/form.js.map +1 -0
  151. package/dist/_chunk/form.jsx +39 -0
  152. package/dist/_chunk/form.jsx.map +1 -0
  153. package/dist/_chunk/grid.js +623 -0
  154. package/dist/_chunk/grid.js.map +1 -0
  155. package/dist/_chunk/grid.jsx +623 -0
  156. package/dist/_chunk/grid.jsx.map +1 -0
  157. package/dist/_chunk/gridlist.js +364 -0
  158. package/dist/_chunk/gridlist.js.map +1 -0
  159. package/dist/_chunk/gridlist.jsx +364 -0
  160. package/dist/_chunk/gridlist.jsx.map +1 -0
  161. package/dist/_chunk/i18n.js +254 -0
  162. package/dist/_chunk/i18n.js.map +1 -0
  163. package/dist/_chunk/i18n.jsx +254 -0
  164. package/dist/_chunk/i18n.jsx.map +1 -0
  165. package/dist/_chunk/interactions.js +241 -0
  166. package/dist/_chunk/interactions.js.map +1 -0
  167. package/dist/_chunk/interactions.jsx +237 -0
  168. package/dist/_chunk/interactions.jsx.map +1 -0
  169. package/dist/_chunk/link.js +96 -0
  170. package/dist/_chunk/link.js.map +1 -0
  171. package/dist/_chunk/link.jsx +96 -0
  172. package/dist/_chunk/link.jsx.map +1 -0
  173. package/dist/_chunk/listbox.js +324 -0
  174. package/dist/_chunk/listbox.js.map +1 -0
  175. package/dist/_chunk/listbox.jsx +324 -0
  176. package/dist/_chunk/listbox.jsx.map +1 -0
  177. package/dist/_chunk/live-announcer.js +207 -0
  178. package/dist/_chunk/live-announcer.js.map +1 -0
  179. package/dist/_chunk/live-announcer.jsx +207 -0
  180. package/dist/_chunk/live-announcer.jsx.map +1 -0
  181. package/dist/_chunk/menu.js +518 -0
  182. package/dist/_chunk/menu.js.map +1 -0
  183. package/dist/_chunk/menu.jsx +518 -0
  184. package/dist/_chunk/menu.jsx.map +1 -0
  185. package/dist/_chunk/meter.js +33 -0
  186. package/dist/_chunk/meter.js.map +1 -0
  187. package/dist/_chunk/meter.jsx +33 -0
  188. package/dist/_chunk/meter.jsx.map +1 -0
  189. package/dist/_chunk/numberfield.js +258 -0
  190. package/dist/_chunk/numberfield.js.map +1 -0
  191. package/dist/_chunk/numberfield.jsx +258 -0
  192. package/dist/_chunk/numberfield.jsx.map +1 -0
  193. package/dist/_chunk/overlays.js +186 -0
  194. package/dist/_chunk/overlays.js.map +1 -0
  195. package/dist/_chunk/overlays.jsx +162 -0
  196. package/dist/_chunk/overlays.jsx.map +1 -0
  197. package/dist/_chunk/popover.js +574 -0
  198. package/dist/_chunk/popover.js.map +1 -0
  199. package/dist/_chunk/popover.jsx +574 -0
  200. package/dist/_chunk/popover.jsx.map +1 -0
  201. package/dist/_chunk/radio.js +319 -0
  202. package/dist/_chunk/radio.js.map +1 -0
  203. package/dist/_chunk/radio.jsx +319 -0
  204. package/dist/_chunk/radio.jsx.map +1 -0
  205. package/dist/_chunk/searchfield.js +209 -0
  206. package/dist/_chunk/searchfield.js.map +1 -0
  207. package/dist/_chunk/searchfield.jsx +209 -0
  208. package/dist/_chunk/searchfield.jsx.map +1 -0
  209. package/dist/_chunk/select.js +403 -0
  210. package/dist/_chunk/select.js.map +1 -0
  211. package/dist/_chunk/select.jsx +394 -0
  212. package/dist/_chunk/select.jsx.map +1 -0
  213. package/dist/_chunk/selection.js +679 -0
  214. package/dist/_chunk/selection.js.map +1 -0
  215. package/dist/_chunk/selection.jsx +679 -0
  216. package/dist/_chunk/selection.jsx.map +1 -0
  217. package/dist/_chunk/separator.js +29 -0
  218. package/dist/_chunk/separator.js.map +1 -0
  219. package/dist/_chunk/separator.jsx +29 -0
  220. package/dist/_chunk/separator.jsx.map +1 -0
  221. package/dist/_chunk/slider.js +255 -0
  222. package/dist/_chunk/slider.js.map +1 -0
  223. package/dist/_chunk/slider.jsx +255 -0
  224. package/dist/_chunk/slider.jsx.map +1 -0
  225. package/dist/_chunk/steplist.js +66 -0
  226. package/dist/_chunk/steplist.js.map +1 -0
  227. package/dist/_chunk/steplist.jsx +66 -0
  228. package/dist/_chunk/steplist.jsx.map +1 -0
  229. package/dist/_chunk/switch.js +34 -0
  230. package/dist/_chunk/switch.js.map +1 -0
  231. package/dist/_chunk/switch.jsx +34 -0
  232. package/dist/_chunk/switch.jsx.map +1 -0
  233. package/dist/_chunk/table.js +1051 -0
  234. package/dist/_chunk/table.js.map +1 -0
  235. package/dist/_chunk/table.jsx +1051 -0
  236. package/dist/_chunk/table.jsx.map +1 -0
  237. package/dist/_chunk/tabs.js +260 -0
  238. package/dist/_chunk/tabs.js.map +1 -0
  239. package/dist/_chunk/tabs.jsx +260 -0
  240. package/dist/_chunk/tabs.jsx.map +1 -0
  241. package/dist/_chunk/tag.js +286 -0
  242. package/dist/_chunk/tag.js.map +1 -0
  243. package/dist/_chunk/tag.jsx +286 -0
  244. package/dist/_chunk/tag.jsx.map +1 -0
  245. package/dist/_chunk/textfield.js +109 -0
  246. package/dist/_chunk/textfield.js.map +1 -0
  247. package/dist/_chunk/textfield.jsx +109 -0
  248. package/dist/_chunk/textfield.jsx.map +1 -0
  249. package/dist/_chunk/toast.js +250 -0
  250. package/dist/_chunk/toast.js.map +1 -0
  251. package/dist/_chunk/toast.jsx +250 -0
  252. package/dist/_chunk/toast.jsx.map +1 -0
  253. package/dist/_chunk/toolbar.js +258 -0
  254. package/dist/_chunk/toolbar.js.map +1 -0
  255. package/dist/_chunk/toolbar.jsx +258 -0
  256. package/dist/_chunk/toolbar.jsx.map +1 -0
  257. package/dist/_chunk/tooltip.js +185 -0
  258. package/dist/_chunk/tooltip.js.map +1 -0
  259. package/dist/_chunk/tooltip.jsx +185 -0
  260. package/dist/_chunk/tooltip.jsx.map +1 -0
  261. package/dist/_chunk/tree.js +424 -0
  262. package/dist/_chunk/tree.js.map +1 -0
  263. package/dist/_chunk/tree.jsx +424 -0
  264. package/dist/_chunk/tree.jsx.map +1 -0
  265. package/dist/_chunk/utils.js +665 -0
  266. package/dist/_chunk/utils.js.map +1 -0
  267. package/dist/_chunk/utils.jsx +665 -0
  268. package/dist/_chunk/utils.jsx.map +1 -0
  269. package/dist/_chunk/visually-hidden.js +92 -0
  270. package/dist/_chunk/visually-hidden.js.map +1 -0
  271. package/dist/_chunk/visually-hidden.jsx +92 -0
  272. package/dist/_chunk/visually-hidden.jsx.map +1 -0
  273. package/dist/actiongroup/index.js +2 -0
  274. package/dist/actiongroup/index.jsx +2 -0
  275. package/dist/autocomplete/createAutocomplete.d.ts +2 -0
  276. package/dist/autocomplete/createAutocomplete.d.ts.map +1 -1
  277. package/dist/autocomplete/index.js +2 -0
  278. package/dist/autocomplete/index.jsx +2 -0
  279. package/dist/breadcrumbs/index.js +2 -0
  280. package/dist/breadcrumbs/index.jsx +2 -0
  281. package/dist/button/index.js +2 -0
  282. package/dist/button/index.jsx +2 -0
  283. package/dist/calendar/createCalendar.d.ts.map +1 -1
  284. package/dist/calendar/createCalendarCell.d.ts.map +1 -1
  285. package/dist/calendar/createCalendarGrid.d.ts.map +1 -1
  286. package/dist/calendar/createCalendarMonthPicker.d.ts +41 -0
  287. package/dist/calendar/createCalendarMonthPicker.d.ts.map +1 -0
  288. package/dist/calendar/createCalendarYearPicker.d.ts +49 -0
  289. package/dist/calendar/createCalendarYearPicker.d.ts.map +1 -0
  290. package/dist/calendar/createRangeCalendar.d.ts.map +1 -1
  291. package/dist/calendar/index.d.ts +2 -0
  292. package/dist/calendar/index.d.ts.map +1 -1
  293. package/dist/calendar/index.js +2 -0
  294. package/dist/calendar/index.jsx +2 -0
  295. package/dist/calendar/utils.d.ts +4 -0
  296. package/dist/calendar/utils.d.ts.map +1 -1
  297. package/dist/checkbox/createCheckbox.d.ts +4 -0
  298. package/dist/checkbox/createCheckbox.d.ts.map +1 -1
  299. package/dist/checkbox/createCheckboxGroupItem.d.ts.map +1 -1
  300. package/dist/checkbox/index.js +2 -0
  301. package/dist/checkbox/index.jsx +2 -0
  302. package/dist/collections/index.js +160 -0
  303. package/dist/collections/index.js.map +1 -0
  304. package/dist/collections/index.jsx +160 -0
  305. package/dist/collections/index.jsx.map +1 -0
  306. package/dist/color/index.js +2 -0
  307. package/dist/color/index.jsx +2 -0
  308. package/dist/combobox/index.js +2 -0
  309. package/dist/combobox/index.jsx +2 -0
  310. package/dist/datepicker/createDateSegment.d.ts.map +1 -1
  311. package/dist/datepicker/index.js +2 -0
  312. package/dist/datepicker/index.jsx +2 -0
  313. package/dist/dialog/index.js +2 -0
  314. package/dist/dialog/index.jsx +2 -0
  315. package/dist/disclosure/index.js +2 -0
  316. package/dist/disclosure/index.jsx +2 -0
  317. package/dist/dnd/createDroppableCollection.d.ts.map +1 -1
  318. package/dist/dnd/index.js +2 -0
  319. package/dist/dnd/index.jsx +2 -0
  320. package/dist/dnd/utils.d.ts +2 -2
  321. package/dist/dnd/utils.d.ts.map +1 -1
  322. package/dist/focus/FocusScope.d.ts.map +1 -1
  323. package/dist/focus/index.js +2 -0
  324. package/dist/focus/index.jsx +2 -0
  325. package/dist/form/createFormValidation.d.ts.map +1 -1
  326. package/dist/form/index.js +3 -0
  327. package/dist/form/index.jsx +3 -0
  328. package/dist/grid/index.js +2 -0
  329. package/dist/grid/index.jsx +2 -0
  330. package/dist/gridlist/createGridList.d.ts +7 -1
  331. package/dist/gridlist/createGridList.d.ts.map +1 -1
  332. package/dist/gridlist/createGridListItem.d.ts +1 -1
  333. package/dist/gridlist/createGridListItem.d.ts.map +1 -1
  334. package/dist/gridlist/createGridListSection.d.ts +15 -0
  335. package/dist/gridlist/createGridListSection.d.ts.map +1 -0
  336. package/dist/gridlist/index.d.ts +2 -1
  337. package/dist/gridlist/index.d.ts.map +1 -1
  338. package/dist/gridlist/index.js +2 -0
  339. package/dist/gridlist/index.jsx +2 -0
  340. package/dist/gridlist/types.d.ts +50 -0
  341. package/dist/gridlist/types.d.ts.map +1 -1
  342. package/dist/i18n/index.js +3 -0
  343. package/dist/i18n/index.jsx +3 -0
  344. package/dist/index.d.ts +7 -3
  345. package/dist/index.d.ts.map +1 -1
  346. package/dist/index.js +71 -18311
  347. package/dist/index.jsx +71 -18242
  348. package/dist/interactions/PressEvent.d.ts +11 -0
  349. package/dist/interactions/PressEvent.d.ts.map +1 -1
  350. package/dist/interactions/createInteractionModality.d.ts +0 -1
  351. package/dist/interactions/createInteractionModality.d.ts.map +1 -1
  352. package/dist/interactions/createKeyboard.d.ts.map +1 -1
  353. package/dist/interactions/createPress.d.ts.map +1 -1
  354. package/dist/interactions/index.js +10 -0
  355. package/dist/interactions/index.jsx +10 -0
  356. package/dist/label/index.js +4 -0
  357. package/dist/label/index.jsx +4 -0
  358. package/dist/landmark/index.js +2 -0
  359. package/dist/landmark/index.jsx +2 -0
  360. package/dist/link/index.js +2 -0
  361. package/dist/link/index.jsx +2 -0
  362. package/dist/listbox/createListBox.d.ts +37 -0
  363. package/dist/listbox/createListBox.d.ts.map +1 -1
  364. package/dist/listbox/createOption.d.ts +6 -0
  365. package/dist/listbox/createOption.d.ts.map +1 -1
  366. package/dist/listbox/index.js +2 -0
  367. package/dist/listbox/index.jsx +2 -0
  368. package/dist/live-announcer/index.js +2 -0
  369. package/dist/live-announcer/index.jsx +2 -0
  370. package/dist/menu/createMenu.d.ts +7 -4
  371. package/dist/menu/createMenu.d.ts.map +1 -1
  372. package/dist/menu/createMenuItem.d.ts +9 -1
  373. package/dist/menu/createMenuItem.d.ts.map +1 -1
  374. package/dist/menu/index.js +2 -0
  375. package/dist/menu/index.jsx +2 -0
  376. package/dist/meter/index.js +2 -0
  377. package/dist/meter/index.jsx +2 -0
  378. package/dist/numberfield/createNumberField.d.ts.map +1 -1
  379. package/dist/numberfield/index.js +2 -0
  380. package/dist/numberfield/index.jsx +2 -0
  381. package/dist/overlays/index.js +4 -0
  382. package/dist/overlays/index.jsx +4 -0
  383. package/dist/popover/calculatePosition.d.ts +2 -0
  384. package/dist/popover/calculatePosition.d.ts.map +1 -1
  385. package/dist/popover/createOverlayPosition.d.ts +8 -0
  386. package/dist/popover/createOverlayPosition.d.ts.map +1 -1
  387. package/dist/popover/index.js +2 -0
  388. package/dist/popover/index.jsx +2 -0
  389. package/dist/progress/index.js +2 -0
  390. package/dist/progress/index.jsx +2 -0
  391. package/dist/radio/createRadio.d.ts +2 -0
  392. package/dist/radio/createRadio.d.ts.map +1 -1
  393. package/dist/radio/index.js +2 -0
  394. package/dist/radio/index.jsx +2 -0
  395. package/dist/searchfield/index.js +2 -0
  396. package/dist/searchfield/index.jsx +2 -0
  397. package/dist/select/createSelect.d.ts.map +1 -1
  398. package/dist/select/index.js +2 -0
  399. package/dist/select/index.jsx +2 -0
  400. package/dist/selection/DOMLayoutDelegate.d.ts +58 -0
  401. package/dist/selection/DOMLayoutDelegate.d.ts.map +1 -0
  402. package/dist/selection/ListKeyboardDelegate.d.ts +95 -0
  403. package/dist/selection/ListKeyboardDelegate.d.ts.map +1 -0
  404. package/dist/selection/constants.d.ts +15 -0
  405. package/dist/selection/constants.d.ts.map +1 -0
  406. package/dist/selection/createCollectionRowInteraction.d.ts +13 -0
  407. package/dist/selection/createCollectionRowInteraction.d.ts.map +1 -0
  408. package/dist/selection/createScrollIntoViewOnFocus.d.ts +31 -0
  409. package/dist/selection/createScrollIntoViewOnFocus.d.ts.map +1 -0
  410. package/dist/selection/createSelectableCollection.d.ts +69 -0
  411. package/dist/selection/createSelectableCollection.d.ts.map +1 -0
  412. package/dist/selection/createSelectableItem.d.ts +154 -0
  413. package/dist/selection/createSelectableItem.d.ts.map +1 -0
  414. package/dist/selection/createSelectableList.d.ts +43 -0
  415. package/dist/selection/createSelectableList.d.ts.map +1 -0
  416. package/dist/selection/createTypeSelect.d.ts.map +1 -1
  417. package/dist/selection/index.d.ts +9 -0
  418. package/dist/selection/index.d.ts.map +1 -1
  419. package/dist/selection/index.js +4 -0
  420. package/dist/selection/index.jsx +4 -0
  421. package/dist/selection/selectItem.d.ts +29 -0
  422. package/dist/selection/selectItem.d.ts.map +1 -0
  423. package/dist/selection/utils.d.ts +40 -0
  424. package/dist/selection/utils.d.ts.map +1 -0
  425. package/dist/separator/index.js +2 -0
  426. package/dist/separator/index.jsx +2 -0
  427. package/dist/slider/createSlider.d.ts.map +1 -1
  428. package/dist/slider/index.js +2 -0
  429. package/dist/slider/index.jsx +2 -0
  430. package/dist/ssr/index.d.ts +17 -0
  431. package/dist/ssr/index.d.ts.map +1 -1
  432. package/dist/ssr/index.js +299 -0
  433. package/dist/ssr/index.js.map +1 -0
  434. package/dist/ssr/index.jsx +292 -0
  435. package/dist/ssr/index.jsx.map +1 -0
  436. package/dist/steplist/index.js +2 -0
  437. package/dist/steplist/index.jsx +2 -0
  438. package/dist/switch/createSwitch.d.ts +4 -0
  439. package/dist/switch/createSwitch.d.ts.map +1 -1
  440. package/dist/switch/index.js +2 -0
  441. package/dist/switch/index.jsx +2 -0
  442. package/dist/table/createTable.d.ts.map +1 -1
  443. package/dist/table/createTableRow.d.ts +1 -1
  444. package/dist/table/createTableRow.d.ts.map +1 -1
  445. package/dist/table/createTableSelectAllCheckbox.d.ts.map +1 -1
  446. package/dist/table/index.js +2 -0
  447. package/dist/table/index.jsx +2 -0
  448. package/dist/table/types.d.ts +27 -1
  449. package/dist/table/types.d.ts.map +1 -1
  450. package/dist/tabs/createTabs.d.ts +4 -3
  451. package/dist/tabs/createTabs.d.ts.map +1 -1
  452. package/dist/tabs/index.js +2 -0
  453. package/dist/tabs/index.jsx +2 -0
  454. package/dist/tag/createTag.d.ts +2 -0
  455. package/dist/tag/createTag.d.ts.map +1 -1
  456. package/dist/tag/index.js +2 -0
  457. package/dist/tag/index.jsx +2 -0
  458. package/dist/textfield/index.js +2 -0
  459. package/dist/textfield/index.jsx +2 -0
  460. package/dist/toast/createToast.d.ts.map +1 -1
  461. package/dist/toast/index.js +2 -0
  462. package/dist/toast/index.jsx +2 -0
  463. package/dist/toggle/createToggle.d.ts +4 -0
  464. package/dist/toggle/createToggle.d.ts.map +1 -1
  465. package/dist/toggle/index.js +3 -0
  466. package/dist/toggle/index.jsx +3 -0
  467. package/dist/toolbar/createToolbar.d.ts +1 -1
  468. package/dist/toolbar/createToolbar.d.ts.map +1 -1
  469. package/dist/toolbar/index.js +2 -0
  470. package/dist/toolbar/index.jsx +2 -0
  471. package/dist/tooltip/index.js +2 -0
  472. package/dist/tooltip/index.jsx +2 -0
  473. package/dist/tree/createTree.d.ts +5 -1
  474. package/dist/tree/createTree.d.ts.map +1 -1
  475. package/dist/tree/createTreeItem.d.ts +1 -1
  476. package/dist/tree/createTreeItem.d.ts.map +1 -1
  477. package/dist/tree/index.js +2 -0
  478. package/dist/tree/index.jsx +2 -0
  479. package/dist/tree/types.d.ts +10 -0
  480. package/dist/tree/types.d.ts.map +1 -1
  481. package/dist/utils/animation.d.ts +60 -0
  482. package/dist/utils/animation.d.ts.map +1 -0
  483. package/dist/utils/dom.d.ts +48 -2
  484. package/dist/utils/dom.d.ts.map +1 -1
  485. package/dist/utils/index.d.ts +4 -1
  486. package/dist/utils/index.d.ts.map +1 -1
  487. package/dist/utils/index.js +5 -0
  488. package/dist/utils/index.jsx +5 -0
  489. package/dist/utils/keyboard.d.ts +17 -0
  490. package/dist/utils/keyboard.d.ts.map +1 -0
  491. package/dist/utils/mergeProps.d.ts.map +1 -1
  492. package/dist/utils/scrollIntoView.d.ts +30 -0
  493. package/dist/utils/scrollIntoView.d.ts.map +1 -0
  494. package/dist/visually-hidden/index.js +2 -0
  495. package/dist/visually-hidden/index.jsx +2 -0
  496. package/package.json +304 -3
  497. package/src/autocomplete/createAutocomplete.ts +67 -21
  498. package/src/calendar/createCalendar.ts +2 -0
  499. package/src/calendar/createCalendarCell.ts +19 -2
  500. package/src/calendar/createCalendarGrid.ts +43 -9
  501. package/src/calendar/createCalendarMonthPicker.ts +105 -0
  502. package/src/calendar/createCalendarYearPicker.ts +144 -0
  503. package/src/calendar/createRangeCalendar.ts +2 -0
  504. package/src/calendar/index.ts +17 -0
  505. package/src/calendar/utils.ts +4 -0
  506. package/src/checkbox/createCheckbox.ts +10 -0
  507. package/src/checkbox/createCheckboxGroupItem.ts +12 -16
  508. package/src/datepicker/createDateSegment.ts +6 -1
  509. package/src/dnd/createDroppableCollection.ts +4 -1
  510. package/src/dnd/utils.ts +27 -3
  511. package/src/focus/FocusScope.tsx +152 -18
  512. package/src/form/createFormValidation.ts +8 -1
  513. package/src/gridlist/createGridList.ts +145 -42
  514. package/src/gridlist/createGridListItem.ts +87 -155
  515. package/src/gridlist/createGridListSection.ts +54 -0
  516. package/src/gridlist/index.ts +3 -0
  517. package/src/gridlist/types.ts +47 -0
  518. package/src/index.ts +40 -0
  519. package/src/interactions/PressEvent.ts +14 -0
  520. package/src/interactions/createInteractionModality.ts +21 -12
  521. package/src/interactions/createKeyboard.ts +10 -0
  522. package/src/interactions/createPress.ts +29 -6
  523. package/src/listbox/createListBox.ts +129 -8
  524. package/src/listbox/createOption.ts +68 -73
  525. package/src/menu/createMenu.ts +93 -16
  526. package/src/menu/createMenuItem.ts +253 -41
  527. package/src/numberfield/createNumberField.ts +82 -14
  528. package/src/popover/calculatePosition.ts +19 -7
  529. package/src/popover/createOverlayPosition.ts +9 -0
  530. package/src/radio/createRadio.ts +19 -2
  531. package/src/select/createSelect.ts +18 -2
  532. package/src/selection/DOMLayoutDelegate.ts +102 -0
  533. package/src/selection/ListKeyboardDelegate.ts +398 -0
  534. package/src/selection/constants.ts +16 -0
  535. package/src/selection/createCollectionRowInteraction.ts +209 -0
  536. package/src/selection/createScrollIntoViewOnFocus.ts +65 -0
  537. package/src/selection/createSelectableCollection.ts +645 -0
  538. package/src/selection/createSelectableItem.ts +498 -0
  539. package/src/selection/createSelectableList.ts +93 -0
  540. package/src/selection/createTypeSelect.ts +112 -51
  541. package/src/selection/index.ts +31 -0
  542. package/src/selection/selectItem.ts +80 -0
  543. package/src/selection/utils.ts +82 -0
  544. package/src/slider/createSlider.ts +48 -1
  545. package/src/ssr/index.tsx +31 -0
  546. package/src/switch/createSwitch.ts +10 -0
  547. package/src/table/createTable.ts +56 -26
  548. package/src/table/createTableRow.ts +198 -203
  549. package/src/table/createTableSelectAllCheckbox.ts +3 -4
  550. package/src/table/types.ts +29 -1
  551. package/src/tabs/createTabs.ts +50 -20
  552. package/src/tag/createTag.ts +9 -4
  553. package/src/toast/createToast.ts +1 -0
  554. package/src/toggle/createToggle.ts +20 -0
  555. package/src/toolbar/createToolbar.ts +43 -42
  556. package/src/tree/createTree.ts +100 -42
  557. package/src/tree/createTreeItem.ts +105 -120
  558. package/src/tree/types.ts +10 -0
  559. package/src/utils/animation.ts +151 -0
  560. package/src/utils/dom.ts +215 -25
  561. package/src/utils/index.ts +8 -0
  562. package/src/utils/keyboard.ts +25 -0
  563. package/src/utils/mergeProps.ts +8 -1
  564. package/src/utils/scrollIntoView.ts +181 -0
  565. package/dist/index.js.map +0 -1
  566. package/dist/index.jsx.map +0 -1
@@ -0,0 +1,258 @@
1
+ import { i as access } from "./env.js";
2
+ import { g as isTabbable, p as isFocusable, s as getOwnerDocument, t as focusSafely } from "./focus.js";
3
+ import { a as useLocale } from "./createCollator.js";
4
+ import { createSignal, onCleanup, onMount } from "solid-js";
5
+ //#region src/toolbar/createToolbar.ts
6
+ /**
7
+ * createToolbar - Accessibility hook for toolbar elements
8
+ *
9
+ * Provides keyboard navigation between toolbar items using arrow keys.
10
+ * Based on @react-aria/toolbar useToolbar.
11
+ */
12
+ function getFocusableElements(root, tabbable = false) {
13
+ const elements = [];
14
+ const filter = tabbable ? isTabbable : isFocusable;
15
+ if (filter(root)) elements.push(root);
16
+ const descendants = root.querySelectorAll("*");
17
+ for (let i = 0; i < descendants.length; i++) {
18
+ const el = descendants[i];
19
+ if (filter(el)) elements.push(el);
20
+ }
21
+ return elements;
22
+ }
23
+ function getActiveElement(doc) {
24
+ let activeElement = doc.activeElement;
25
+ while (activeElement?.shadowRoot?.activeElement) activeElement = activeElement.shadowRoot.activeElement;
26
+ return activeElement;
27
+ }
28
+ const TEXT_INPUT_TYPES = new Set([
29
+ "",
30
+ "text",
31
+ "search",
32
+ "url",
33
+ "tel",
34
+ "password",
35
+ "email",
36
+ "number",
37
+ "date",
38
+ "datetime-local",
39
+ "month",
40
+ "time",
41
+ "week"
42
+ ]);
43
+ function isTextInputLikeElement(target) {
44
+ if (!(target instanceof HTMLElement)) return false;
45
+ if (target.isContentEditable || !!target.closest("[contenteditable=\"true\"]")) return true;
46
+ if (target.getAttribute("role") === "textbox") return true;
47
+ if (target instanceof HTMLTextAreaElement || target instanceof HTMLSelectElement) return true;
48
+ if (target instanceof HTMLInputElement) {
49
+ const type = target.type.toLowerCase();
50
+ return TEXT_INPUT_TYPES.has(type);
51
+ }
52
+ return false;
53
+ }
54
+ function createFocusManager(ref) {
55
+ return {
56
+ focusNext(opts = {}) {
57
+ const root = ref();
58
+ if (!root) return null;
59
+ const { from, tabbable = true, wrap = false, accept } = opts;
60
+ const doc = getOwnerDocument(root);
61
+ const current = from || getActiveElement(doc);
62
+ let elements = getFocusableElements(root, tabbable);
63
+ if (accept) elements = elements.filter(accept);
64
+ if (!current || elements.length === 0) return null;
65
+ let nextIndex = elements.indexOf(current) + 1;
66
+ if (nextIndex >= elements.length) if (wrap) nextIndex = 0;
67
+ else return null;
68
+ const nextElement = elements[nextIndex];
69
+ if (nextElement) {
70
+ focusSafely(nextElement);
71
+ return nextElement;
72
+ }
73
+ return null;
74
+ },
75
+ focusPrevious(opts = {}) {
76
+ const root = ref();
77
+ if (!root) return null;
78
+ const { from, tabbable = true, wrap = false, accept } = opts;
79
+ const doc = getOwnerDocument(root);
80
+ const current = from || getActiveElement(doc);
81
+ let elements = getFocusableElements(root, tabbable);
82
+ if (accept) elements = elements.filter(accept);
83
+ if (!current || elements.length === 0) return null;
84
+ let prevIndex = elements.indexOf(current) - 1;
85
+ if (prevIndex < 0) if (wrap) prevIndex = elements.length - 1;
86
+ else return null;
87
+ const prevElement = elements[prevIndex];
88
+ if (prevElement) {
89
+ focusSafely(prevElement);
90
+ return prevElement;
91
+ }
92
+ return null;
93
+ },
94
+ focusFirst(opts = {}) {
95
+ const root = ref();
96
+ if (!root) return null;
97
+ const { tabbable = true, accept } = opts;
98
+ let elements = getFocusableElements(root, tabbable);
99
+ if (accept) elements = elements.filter(accept);
100
+ if (elements.length > 0) {
101
+ focusSafely(elements[0]);
102
+ return elements[0];
103
+ }
104
+ return null;
105
+ },
106
+ focusLast(opts = {}) {
107
+ const root = ref();
108
+ if (!root) return null;
109
+ const { tabbable = true, accept } = opts;
110
+ let elements = getFocusableElements(root, tabbable);
111
+ if (accept) elements = elements.filter(accept);
112
+ if (elements.length > 0) {
113
+ const lastElement = elements[elements.length - 1];
114
+ focusSafely(lastElement);
115
+ return lastElement;
116
+ }
117
+ return null;
118
+ }
119
+ };
120
+ }
121
+ /**
122
+ * Provides the behavior and accessibility implementation for a toolbar.
123
+ * A toolbar is a container for a set of interactive controls with arrow key navigation.
124
+ *
125
+ * @example
126
+ * ```tsx
127
+ * let ref;
128
+ * const { toolbarProps } = createToolbar({ orientation: 'horizontal' });
129
+ * return (
130
+ * <div {...toolbarProps}>
131
+ * <Button>Cut</Button>
132
+ * <Button>Copy</Button>
133
+ * <Button>Paste</Button>
134
+ * </div>
135
+ * );
136
+ * ```
137
+ */
138
+ function createToolbar(props = {}) {
139
+ let toolbarRef;
140
+ const [isInToolbar, setIsInToolbar] = createSignal(false);
141
+ let lastFocusedElement = null;
142
+ const locale = useLocale();
143
+ const orientation = () => access(props.orientation) ?? "horizontal";
144
+ const ariaLabel = () => access(props["aria-label"]);
145
+ const ariaLabelledby = () => access(props["aria-labelledby"]);
146
+ const focusManager = createFocusManager(() => toolbarRef);
147
+ onMount(() => {
148
+ if (toolbarRef) {
149
+ const parentToolbar = toolbarRef.parentElement?.closest("[role=\"toolbar\"]");
150
+ setIsInToolbar(!!parentToolbar);
151
+ }
152
+ });
153
+ const onKeyDown = (e) => {
154
+ const root = toolbarRef;
155
+ if (!root) return;
156
+ if (isInToolbar()) return;
157
+ const target = e.target;
158
+ if (!(target instanceof Element) || !root.contains(target)) return;
159
+ const doc = getOwnerDocument(root);
160
+ if (isTextInputLikeElement(target)) switch (e.key) {
161
+ case "ArrowRight":
162
+ case "ArrowLeft":
163
+ case "ArrowDown":
164
+ case "ArrowUp": return;
165
+ }
166
+ const isRTL = locale().direction === "rtl";
167
+ const isHorizontal = orientation() === "horizontal";
168
+ let handled = false;
169
+ switch (e.key) {
170
+ case "ArrowRight":
171
+ if (isHorizontal) {
172
+ if (isRTL) focusManager.focusPrevious({ tabbable: true });
173
+ else focusManager.focusNext({ tabbable: true });
174
+ handled = true;
175
+ }
176
+ break;
177
+ case "ArrowLeft":
178
+ if (isHorizontal) {
179
+ if (isRTL) focusManager.focusNext({ tabbable: true });
180
+ else focusManager.focusPrevious({ tabbable: true });
181
+ handled = true;
182
+ }
183
+ break;
184
+ case "ArrowDown":
185
+ if (!isHorizontal) {
186
+ focusManager.focusNext({ tabbable: true });
187
+ handled = true;
188
+ }
189
+ break;
190
+ case "ArrowUp":
191
+ if (!isHorizontal) {
192
+ focusManager.focusPrevious({ tabbable: true });
193
+ handled = true;
194
+ }
195
+ break;
196
+ case "Tab":
197
+ lastFocusedElement = getActiveElement(doc);
198
+ if (e.shiftKey) focusManager.focusFirst({ tabbable: true });
199
+ else focusManager.focusLast({ tabbable: true });
200
+ return;
201
+ }
202
+ if (handled) {
203
+ e.preventDefault();
204
+ e.stopPropagation();
205
+ }
206
+ };
207
+ const onBlur = (e) => {
208
+ const root = toolbarRef;
209
+ if (!root) return;
210
+ if (isInToolbar()) return;
211
+ const relatedTarget = e.relatedTarget;
212
+ if (!(relatedTarget && root.contains(relatedTarget)) && !lastFocusedElement) lastFocusedElement = e.target;
213
+ };
214
+ const onFocus = (e) => {
215
+ const root = toolbarRef;
216
+ if (!root) return;
217
+ if (isInToolbar()) return;
218
+ const relatedTarget = e.relatedTarget;
219
+ const target = e.target;
220
+ if (lastFocusedElement && !(relatedTarget && root.contains(relatedTarget)) && target instanceof Node && root.contains(target)) {
221
+ focusSafely(lastFocusedElement);
222
+ lastFocusedElement = null;
223
+ }
224
+ };
225
+ const setRef = (el) => {
226
+ toolbarRef = el;
227
+ el.addEventListener("keydown", onKeyDown, true);
228
+ el.addEventListener("focus", onFocus, true);
229
+ el.addEventListener("blur", onBlur, true);
230
+ onCleanup(() => {
231
+ el.removeEventListener("keydown", onKeyDown, true);
232
+ el.removeEventListener("focus", onFocus, true);
233
+ el.removeEventListener("blur", onBlur, true);
234
+ });
235
+ };
236
+ return {
237
+ toolbarProps: {
238
+ get role() {
239
+ return isInToolbar() ? "group" : "toolbar";
240
+ },
241
+ get "aria-orientation"() {
242
+ return isInToolbar() ? void 0 : orientation();
243
+ },
244
+ get "aria-label"() {
245
+ return ariaLabel();
246
+ },
247
+ get "aria-labelledby"() {
248
+ return ariaLabel() ? void 0 : ariaLabelledby();
249
+ },
250
+ ref: setRef
251
+ },
252
+ orientation
253
+ };
254
+ }
255
+ //#endregion
256
+ export { createToolbar as t };
257
+
258
+ //# sourceMappingURL=toolbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolbar.js","names":[],"sources":["../../src/toolbar/createToolbar.ts"],"sourcesContent":["/**\n * createToolbar - Accessibility hook for toolbar elements\n *\n * Provides keyboard navigation between toolbar items using arrow keys.\n * Based on @react-aria/toolbar useToolbar.\n */\n\nimport { createSignal, onMount, onCleanup, type Accessor } from \"solid-js\";\nimport { type MaybeAccessor, access } from \"../utils\";\nimport { useLocale } from \"../i18n\";\nimport { getOwnerDocument, isFocusable, isTabbable } from \"../utils\";\nimport { focusSafely } from \"../utils/focus\";\n\nexport type Orientation = \"horizontal\" | \"vertical\";\n\nexport interface AriaToolbarProps {\n /** The orientation of the toolbar. @default 'horizontal' */\n orientation?: MaybeAccessor<Orientation>;\n /** An accessibility label for the toolbar. */\n \"aria-label\"?: MaybeAccessor<string>;\n /** Identifies the element (or elements) that labels the toolbar. */\n \"aria-labelledby\"?: MaybeAccessor<string>;\n}\n\nexport interface ToolbarAria {\n /** Props for the toolbar container element. */\n toolbarProps: {\n role: \"toolbar\" | \"group\";\n \"aria-orientation\"?: Orientation;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n tabIndex?: number;\n ref: (el: HTMLElement) => void;\n };\n /** The orientation of the toolbar. */\n orientation: Accessor<Orientation>;\n}\n\ninterface FocusManagerOptions {\n from?: Element;\n tabbable?: boolean;\n wrap?: boolean;\n accept?: (node: Element) => boolean;\n}\n\ninterface FocusManager {\n focusNext(opts?: FocusManagerOptions): HTMLElement | null;\n focusPrevious(opts?: FocusManagerOptions): HTMLElement | null;\n focusFirst(opts?: FocusManagerOptions): HTMLElement | null;\n focusLast(opts?: FocusManagerOptions): HTMLElement | null;\n}\n\nfunction getFocusableElements(root: Element, tabbable = false): HTMLElement[] {\n const elements: HTMLElement[] = [];\n const filter = tabbable ? isTabbable : isFocusable;\n\n // Check the root element itself\n if (filter(root)) {\n elements.push(root as HTMLElement);\n }\n\n // Check all descendants\n const descendants = root.querySelectorAll(\"*\");\n for (let i = 0; i < descendants.length; i++) {\n const el = descendants[i];\n if (filter(el)) {\n elements.push(el as HTMLElement);\n }\n }\n\n return elements;\n}\n\nfunction getActiveElement(doc: Document): Element | null {\n let activeElement = doc.activeElement;\n while (activeElement?.shadowRoot?.activeElement) {\n activeElement = activeElement.shadowRoot.activeElement;\n }\n return activeElement;\n}\n\nconst TEXT_INPUT_TYPES = new Set([\n \"\",\n \"text\",\n \"search\",\n \"url\",\n \"tel\",\n \"password\",\n \"email\",\n \"number\",\n \"date\",\n \"datetime-local\",\n \"month\",\n \"time\",\n \"week\",\n]);\n\nfunction isTextInputLikeElement(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) {\n return false;\n }\n\n if (target.isContentEditable || !!target.closest('[contenteditable=\"true\"]')) {\n return true;\n }\n\n if (target.getAttribute(\"role\") === \"textbox\") {\n return true;\n }\n\n if (target instanceof HTMLTextAreaElement || target instanceof HTMLSelectElement) {\n return true;\n }\n\n if (target instanceof HTMLInputElement) {\n const type = target.type.toLowerCase();\n return TEXT_INPUT_TYPES.has(type);\n }\n\n return false;\n}\n\nfunction createFocusManager(ref: Accessor<HTMLElement | undefined>): FocusManager {\n return {\n focusNext(opts: FocusManagerOptions = {}) {\n const root = ref();\n if (!root) return null;\n\n const { from, tabbable = true, wrap = false, accept } = opts;\n const doc = getOwnerDocument(root);\n const current = from || getActiveElement(doc);\n\n let elements = getFocusableElements(root, tabbable);\n if (accept) {\n elements = elements.filter(accept);\n }\n\n if (!current || elements.length === 0) return null;\n\n const currentIndex = elements.indexOf(current as HTMLElement);\n let nextIndex = currentIndex + 1;\n\n if (nextIndex >= elements.length) {\n if (wrap) {\n nextIndex = 0;\n } else {\n return null;\n }\n }\n\n const nextElement = elements[nextIndex];\n if (nextElement) {\n focusSafely(nextElement);\n return nextElement;\n }\n\n return null;\n },\n\n focusPrevious(opts: FocusManagerOptions = {}) {\n const root = ref();\n if (!root) return null;\n\n const { from, tabbable = true, wrap = false, accept } = opts;\n const doc = getOwnerDocument(root);\n const current = from || getActiveElement(doc);\n\n let elements = getFocusableElements(root, tabbable);\n if (accept) {\n elements = elements.filter(accept);\n }\n\n if (!current || elements.length === 0) return null;\n\n const currentIndex = elements.indexOf(current as HTMLElement);\n let prevIndex = currentIndex - 1;\n\n if (prevIndex < 0) {\n if (wrap) {\n prevIndex = elements.length - 1;\n } else {\n return null;\n }\n }\n\n const prevElement = elements[prevIndex];\n if (prevElement) {\n focusSafely(prevElement);\n return prevElement;\n }\n\n return null;\n },\n\n focusFirst(opts: FocusManagerOptions = {}) {\n const root = ref();\n if (!root) return null;\n\n const { tabbable = true, accept } = opts;\n let elements = getFocusableElements(root, tabbable);\n if (accept) {\n elements = elements.filter(accept);\n }\n\n if (elements.length > 0) {\n focusSafely(elements[0]);\n return elements[0];\n }\n\n return null;\n },\n\n focusLast(opts: FocusManagerOptions = {}) {\n const root = ref();\n if (!root) return null;\n\n const { tabbable = true, accept } = opts;\n let elements = getFocusableElements(root, tabbable);\n if (accept) {\n elements = elements.filter(accept);\n }\n\n if (elements.length > 0) {\n const lastElement = elements[elements.length - 1];\n focusSafely(lastElement);\n return lastElement;\n }\n\n return null;\n },\n };\n}\n\n/**\n * Provides the behavior and accessibility implementation for a toolbar.\n * A toolbar is a container for a set of interactive controls with arrow key navigation.\n *\n * @example\n * ```tsx\n * let ref;\n * const { toolbarProps } = createToolbar({ orientation: 'horizontal' });\n * return (\n * <div {...toolbarProps}>\n * <Button>Cut</Button>\n * <Button>Copy</Button>\n * <Button>Paste</Button>\n * </div>\n * );\n * ```\n */\nexport function createToolbar(props: AriaToolbarProps = {}): ToolbarAria {\n let toolbarRef: HTMLElement | undefined;\n const [isInToolbar, setIsInToolbar] = createSignal(false);\n let lastFocusedElement: Element | null = null;\n\n const locale = useLocale();\n const orientation = () => access(props.orientation) ?? \"horizontal\";\n const ariaLabel = () => access(props[\"aria-label\"]);\n const ariaLabelledby = () => access(props[\"aria-labelledby\"]);\n\n const focusManager = createFocusManager(() => toolbarRef);\n\n // Check if this toolbar is nested inside another toolbar\n onMount(() => {\n if (toolbarRef) {\n const parentToolbar = toolbarRef.parentElement?.closest('[role=\"toolbar\"]');\n setIsInToolbar(!!parentToolbar);\n }\n });\n\n // Keyboard event handler\n const onKeyDown = (e: KeyboardEvent) => {\n const root = toolbarRef;\n if (!root) return;\n\n // Don't handle if nested toolbar (parent handles navigation)\n if (isInToolbar()) return;\n\n const target = e.target;\n if (!(target instanceof Element) || !root.contains(target)) {\n return;\n }\n\n const doc = getOwnerDocument(root);\n\n // Text entry controls keep the arrow keys for caret/value navigation.\n // Upstream useToolbar has no such guard; a text input placed inside a\n // toolbar would otherwise lose caret movement. Kept (narrowed to arrows)\n // as a suspected divergence pending a dedicated ActionBar/Toolbar cert.\n if (isTextInputLikeElement(target)) {\n switch (e.key) {\n case \"ArrowRight\":\n case \"ArrowLeft\":\n case \"ArrowDown\":\n case \"ArrowUp\":\n return;\n }\n }\n\n const dir = locale().direction;\n const isRTL = dir === \"rtl\";\n const isHorizontal = orientation() === \"horizontal\";\n\n let handled = false;\n\n switch (e.key) {\n case \"ArrowRight\":\n if (isHorizontal) {\n if (isRTL) {\n focusManager.focusPrevious({ tabbable: true });\n } else {\n focusManager.focusNext({ tabbable: true });\n }\n handled = true;\n }\n break;\n case \"ArrowLeft\":\n if (isHorizontal) {\n if (isRTL) {\n focusManager.focusNext({ tabbable: true });\n } else {\n focusManager.focusPrevious({ tabbable: true });\n }\n handled = true;\n }\n break;\n case \"ArrowDown\":\n if (!isHorizontal) {\n focusManager.focusNext({ tabbable: true });\n handled = true;\n }\n break;\n case \"ArrowUp\":\n if (!isHorizontal) {\n focusManager.focusPrevious({ tabbable: true });\n handled = true;\n }\n break;\n case \"Tab\":\n // Move focus to the first/last child so the browser's own Tab handling\n // then carries focus OUT of the whole toolbar. Faithful to upstream\n // useToolbar: there is no roving tabindex — every item stays tabbable,\n // so a bare Tab would otherwise step to the next item instead of leaving.\n lastFocusedElement = getActiveElement(doc);\n if (e.shiftKey) {\n focusManager.focusFirst({ tabbable: true });\n } else {\n focusManager.focusLast({ tabbable: true });\n }\n return;\n }\n\n if (handled) {\n e.preventDefault();\n e.stopPropagation();\n }\n };\n\n // Record the last focused child when focus moves out of the toolbar.\n const onBlur = (e: FocusEvent) => {\n const root = toolbarRef;\n if (!root) return;\n if (isInToolbar()) return;\n\n const relatedTarget = e.relatedTarget as Node | null;\n if (!(relatedTarget && root.contains(relatedTarget)) && !lastFocusedElement) {\n lastFocusedElement = e.target as Element;\n }\n };\n\n // Restore focus to the last focused child when focus returns into the toolbar.\n // If that element was removed, focus() is a no-op and the browser lands on the\n // first/last child per direction — matching upstream useToolbar.\n const onFocus = (e: FocusEvent) => {\n const root = toolbarRef;\n if (!root) return;\n if (isInToolbar()) return;\n\n const relatedTarget = e.relatedTarget as Node | null;\n const target = e.target;\n if (\n lastFocusedElement &&\n !(relatedTarget && root.contains(relatedTarget)) &&\n target instanceof Node &&\n root.contains(target)\n ) {\n focusSafely(lastFocusedElement as HTMLElement);\n lastFocusedElement = null;\n }\n };\n\n // Set up capture event listeners\n const setRef = (el: HTMLElement) => {\n toolbarRef = el;\n\n // Use capture phase so container handlers run before the focused child's.\n el.addEventListener(\"keydown\", onKeyDown, true);\n el.addEventListener(\"focus\", onFocus, true);\n el.addEventListener(\"blur\", onBlur, true);\n\n onCleanup(() => {\n el.removeEventListener(\"keydown\", onKeyDown, true);\n el.removeEventListener(\"focus\", onFocus, true);\n el.removeEventListener(\"blur\", onBlur, true);\n });\n };\n\n return {\n toolbarProps: {\n get role() {\n return isInToolbar() ? \"group\" : \"toolbar\";\n },\n get \"aria-orientation\"() {\n return isInToolbar() ? undefined : orientation();\n },\n get \"aria-label\"() {\n return ariaLabel();\n },\n get \"aria-labelledby\"() {\n // Only use aria-labelledby if no aria-label is provided\n return ariaLabel() ? undefined : ariaLabelledby();\n },\n ref: setRef,\n },\n orientation,\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,258 @@
1
+ import { i as access } from "./env.jsx";
2
+ import { g as isTabbable, p as isFocusable, s as getOwnerDocument, t as focusSafely } from "./focus.jsx";
3
+ import { a as useLocale } from "./createCollator.jsx";
4
+ import { createSignal, onCleanup, onMount } from "solid-js";
5
+ //#region src/toolbar/createToolbar.ts
6
+ /**
7
+ * createToolbar - Accessibility hook for toolbar elements
8
+ *
9
+ * Provides keyboard navigation between toolbar items using arrow keys.
10
+ * Based on @react-aria/toolbar useToolbar.
11
+ */
12
+ function getFocusableElements(root, tabbable = false) {
13
+ const elements = [];
14
+ const filter = tabbable ? isTabbable : isFocusable;
15
+ if (filter(root)) elements.push(root);
16
+ const descendants = root.querySelectorAll("*");
17
+ for (let i = 0; i < descendants.length; i++) {
18
+ const el = descendants[i];
19
+ if (filter(el)) elements.push(el);
20
+ }
21
+ return elements;
22
+ }
23
+ function getActiveElement(doc) {
24
+ let activeElement = doc.activeElement;
25
+ while (activeElement?.shadowRoot?.activeElement) activeElement = activeElement.shadowRoot.activeElement;
26
+ return activeElement;
27
+ }
28
+ const TEXT_INPUT_TYPES = new Set([
29
+ "",
30
+ "text",
31
+ "search",
32
+ "url",
33
+ "tel",
34
+ "password",
35
+ "email",
36
+ "number",
37
+ "date",
38
+ "datetime-local",
39
+ "month",
40
+ "time",
41
+ "week"
42
+ ]);
43
+ function isTextInputLikeElement(target) {
44
+ if (!(target instanceof HTMLElement)) return false;
45
+ if (target.isContentEditable || !!target.closest("[contenteditable=\"true\"]")) return true;
46
+ if (target.getAttribute("role") === "textbox") return true;
47
+ if (target instanceof HTMLTextAreaElement || target instanceof HTMLSelectElement) return true;
48
+ if (target instanceof HTMLInputElement) {
49
+ const type = target.type.toLowerCase();
50
+ return TEXT_INPUT_TYPES.has(type);
51
+ }
52
+ return false;
53
+ }
54
+ function createFocusManager(ref) {
55
+ return {
56
+ focusNext(opts = {}) {
57
+ const root = ref();
58
+ if (!root) return null;
59
+ const { from, tabbable = true, wrap = false, accept } = opts;
60
+ const doc = getOwnerDocument(root);
61
+ const current = from || getActiveElement(doc);
62
+ let elements = getFocusableElements(root, tabbable);
63
+ if (accept) elements = elements.filter(accept);
64
+ if (!current || elements.length === 0) return null;
65
+ let nextIndex = elements.indexOf(current) + 1;
66
+ if (nextIndex >= elements.length) if (wrap) nextIndex = 0;
67
+ else return null;
68
+ const nextElement = elements[nextIndex];
69
+ if (nextElement) {
70
+ focusSafely(nextElement);
71
+ return nextElement;
72
+ }
73
+ return null;
74
+ },
75
+ focusPrevious(opts = {}) {
76
+ const root = ref();
77
+ if (!root) return null;
78
+ const { from, tabbable = true, wrap = false, accept } = opts;
79
+ const doc = getOwnerDocument(root);
80
+ const current = from || getActiveElement(doc);
81
+ let elements = getFocusableElements(root, tabbable);
82
+ if (accept) elements = elements.filter(accept);
83
+ if (!current || elements.length === 0) return null;
84
+ let prevIndex = elements.indexOf(current) - 1;
85
+ if (prevIndex < 0) if (wrap) prevIndex = elements.length - 1;
86
+ else return null;
87
+ const prevElement = elements[prevIndex];
88
+ if (prevElement) {
89
+ focusSafely(prevElement);
90
+ return prevElement;
91
+ }
92
+ return null;
93
+ },
94
+ focusFirst(opts = {}) {
95
+ const root = ref();
96
+ if (!root) return null;
97
+ const { tabbable = true, accept } = opts;
98
+ let elements = getFocusableElements(root, tabbable);
99
+ if (accept) elements = elements.filter(accept);
100
+ if (elements.length > 0) {
101
+ focusSafely(elements[0]);
102
+ return elements[0];
103
+ }
104
+ return null;
105
+ },
106
+ focusLast(opts = {}) {
107
+ const root = ref();
108
+ if (!root) return null;
109
+ const { tabbable = true, accept } = opts;
110
+ let elements = getFocusableElements(root, tabbable);
111
+ if (accept) elements = elements.filter(accept);
112
+ if (elements.length > 0) {
113
+ const lastElement = elements[elements.length - 1];
114
+ focusSafely(lastElement);
115
+ return lastElement;
116
+ }
117
+ return null;
118
+ }
119
+ };
120
+ }
121
+ /**
122
+ * Provides the behavior and accessibility implementation for a toolbar.
123
+ * A toolbar is a container for a set of interactive controls with arrow key navigation.
124
+ *
125
+ * @example
126
+ * ```tsx
127
+ * let ref;
128
+ * const { toolbarProps } = createToolbar({ orientation: 'horizontal' });
129
+ * return (
130
+ * <div {...toolbarProps}>
131
+ * <Button>Cut</Button>
132
+ * <Button>Copy</Button>
133
+ * <Button>Paste</Button>
134
+ * </div>
135
+ * );
136
+ * ```
137
+ */
138
+ function createToolbar(props = {}) {
139
+ let toolbarRef;
140
+ const [isInToolbar, setIsInToolbar] = createSignal(false);
141
+ let lastFocusedElement = null;
142
+ const locale = useLocale();
143
+ const orientation = () => access(props.orientation) ?? "horizontal";
144
+ const ariaLabel = () => access(props["aria-label"]);
145
+ const ariaLabelledby = () => access(props["aria-labelledby"]);
146
+ const focusManager = createFocusManager(() => toolbarRef);
147
+ onMount(() => {
148
+ if (toolbarRef) {
149
+ const parentToolbar = toolbarRef.parentElement?.closest("[role=\"toolbar\"]");
150
+ setIsInToolbar(!!parentToolbar);
151
+ }
152
+ });
153
+ const onKeyDown = (e) => {
154
+ const root = toolbarRef;
155
+ if (!root) return;
156
+ if (isInToolbar()) return;
157
+ const target = e.target;
158
+ if (!(target instanceof Element) || !root.contains(target)) return;
159
+ const doc = getOwnerDocument(root);
160
+ if (isTextInputLikeElement(target)) switch (e.key) {
161
+ case "ArrowRight":
162
+ case "ArrowLeft":
163
+ case "ArrowDown":
164
+ case "ArrowUp": return;
165
+ }
166
+ const isRTL = locale().direction === "rtl";
167
+ const isHorizontal = orientation() === "horizontal";
168
+ let handled = false;
169
+ switch (e.key) {
170
+ case "ArrowRight":
171
+ if (isHorizontal) {
172
+ if (isRTL) focusManager.focusPrevious({ tabbable: true });
173
+ else focusManager.focusNext({ tabbable: true });
174
+ handled = true;
175
+ }
176
+ break;
177
+ case "ArrowLeft":
178
+ if (isHorizontal) {
179
+ if (isRTL) focusManager.focusNext({ tabbable: true });
180
+ else focusManager.focusPrevious({ tabbable: true });
181
+ handled = true;
182
+ }
183
+ break;
184
+ case "ArrowDown":
185
+ if (!isHorizontal) {
186
+ focusManager.focusNext({ tabbable: true });
187
+ handled = true;
188
+ }
189
+ break;
190
+ case "ArrowUp":
191
+ if (!isHorizontal) {
192
+ focusManager.focusPrevious({ tabbable: true });
193
+ handled = true;
194
+ }
195
+ break;
196
+ case "Tab":
197
+ lastFocusedElement = getActiveElement(doc);
198
+ if (e.shiftKey) focusManager.focusFirst({ tabbable: true });
199
+ else focusManager.focusLast({ tabbable: true });
200
+ return;
201
+ }
202
+ if (handled) {
203
+ e.preventDefault();
204
+ e.stopPropagation();
205
+ }
206
+ };
207
+ const onBlur = (e) => {
208
+ const root = toolbarRef;
209
+ if (!root) return;
210
+ if (isInToolbar()) return;
211
+ const relatedTarget = e.relatedTarget;
212
+ if (!(relatedTarget && root.contains(relatedTarget)) && !lastFocusedElement) lastFocusedElement = e.target;
213
+ };
214
+ const onFocus = (e) => {
215
+ const root = toolbarRef;
216
+ if (!root) return;
217
+ if (isInToolbar()) return;
218
+ const relatedTarget = e.relatedTarget;
219
+ const target = e.target;
220
+ if (lastFocusedElement && !(relatedTarget && root.contains(relatedTarget)) && target instanceof Node && root.contains(target)) {
221
+ focusSafely(lastFocusedElement);
222
+ lastFocusedElement = null;
223
+ }
224
+ };
225
+ const setRef = (el) => {
226
+ toolbarRef = el;
227
+ el.addEventListener("keydown", onKeyDown, true);
228
+ el.addEventListener("focus", onFocus, true);
229
+ el.addEventListener("blur", onBlur, true);
230
+ onCleanup(() => {
231
+ el.removeEventListener("keydown", onKeyDown, true);
232
+ el.removeEventListener("focus", onFocus, true);
233
+ el.removeEventListener("blur", onBlur, true);
234
+ });
235
+ };
236
+ return {
237
+ toolbarProps: {
238
+ get role() {
239
+ return isInToolbar() ? "group" : "toolbar";
240
+ },
241
+ get "aria-orientation"() {
242
+ return isInToolbar() ? void 0 : orientation();
243
+ },
244
+ get "aria-label"() {
245
+ return ariaLabel();
246
+ },
247
+ get "aria-labelledby"() {
248
+ return ariaLabel() ? void 0 : ariaLabelledby();
249
+ },
250
+ ref: setRef
251
+ },
252
+ orientation
253
+ };
254
+ }
255
+ //#endregion
256
+ export { createToolbar as t };
257
+
258
+ //# sourceMappingURL=toolbar.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolbar.jsx","names":[],"sources":["../../src/toolbar/createToolbar.ts"],"sourcesContent":["/**\n * createToolbar - Accessibility hook for toolbar elements\n *\n * Provides keyboard navigation between toolbar items using arrow keys.\n * Based on @react-aria/toolbar useToolbar.\n */\n\nimport { createSignal, onMount, onCleanup, type Accessor } from \"solid-js\";\nimport { type MaybeAccessor, access } from \"../utils\";\nimport { useLocale } from \"../i18n\";\nimport { getOwnerDocument, isFocusable, isTabbable } from \"../utils\";\nimport { focusSafely } from \"../utils/focus\";\n\nexport type Orientation = \"horizontal\" | \"vertical\";\n\nexport interface AriaToolbarProps {\n /** The orientation of the toolbar. @default 'horizontal' */\n orientation?: MaybeAccessor<Orientation>;\n /** An accessibility label for the toolbar. */\n \"aria-label\"?: MaybeAccessor<string>;\n /** Identifies the element (or elements) that labels the toolbar. */\n \"aria-labelledby\"?: MaybeAccessor<string>;\n}\n\nexport interface ToolbarAria {\n /** Props for the toolbar container element. */\n toolbarProps: {\n role: \"toolbar\" | \"group\";\n \"aria-orientation\"?: Orientation;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n tabIndex?: number;\n ref: (el: HTMLElement) => void;\n };\n /** The orientation of the toolbar. */\n orientation: Accessor<Orientation>;\n}\n\ninterface FocusManagerOptions {\n from?: Element;\n tabbable?: boolean;\n wrap?: boolean;\n accept?: (node: Element) => boolean;\n}\n\ninterface FocusManager {\n focusNext(opts?: FocusManagerOptions): HTMLElement | null;\n focusPrevious(opts?: FocusManagerOptions): HTMLElement | null;\n focusFirst(opts?: FocusManagerOptions): HTMLElement | null;\n focusLast(opts?: FocusManagerOptions): HTMLElement | null;\n}\n\nfunction getFocusableElements(root: Element, tabbable = false): HTMLElement[] {\n const elements: HTMLElement[] = [];\n const filter = tabbable ? isTabbable : isFocusable;\n\n // Check the root element itself\n if (filter(root)) {\n elements.push(root as HTMLElement);\n }\n\n // Check all descendants\n const descendants = root.querySelectorAll(\"*\");\n for (let i = 0; i < descendants.length; i++) {\n const el = descendants[i];\n if (filter(el)) {\n elements.push(el as HTMLElement);\n }\n }\n\n return elements;\n}\n\nfunction getActiveElement(doc: Document): Element | null {\n let activeElement = doc.activeElement;\n while (activeElement?.shadowRoot?.activeElement) {\n activeElement = activeElement.shadowRoot.activeElement;\n }\n return activeElement;\n}\n\nconst TEXT_INPUT_TYPES = new Set([\n \"\",\n \"text\",\n \"search\",\n \"url\",\n \"tel\",\n \"password\",\n \"email\",\n \"number\",\n \"date\",\n \"datetime-local\",\n \"month\",\n \"time\",\n \"week\",\n]);\n\nfunction isTextInputLikeElement(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) {\n return false;\n }\n\n if (target.isContentEditable || !!target.closest('[contenteditable=\"true\"]')) {\n return true;\n }\n\n if (target.getAttribute(\"role\") === \"textbox\") {\n return true;\n }\n\n if (target instanceof HTMLTextAreaElement || target instanceof HTMLSelectElement) {\n return true;\n }\n\n if (target instanceof HTMLInputElement) {\n const type = target.type.toLowerCase();\n return TEXT_INPUT_TYPES.has(type);\n }\n\n return false;\n}\n\nfunction createFocusManager(ref: Accessor<HTMLElement | undefined>): FocusManager {\n return {\n focusNext(opts: FocusManagerOptions = {}) {\n const root = ref();\n if (!root) return null;\n\n const { from, tabbable = true, wrap = false, accept } = opts;\n const doc = getOwnerDocument(root);\n const current = from || getActiveElement(doc);\n\n let elements = getFocusableElements(root, tabbable);\n if (accept) {\n elements = elements.filter(accept);\n }\n\n if (!current || elements.length === 0) return null;\n\n const currentIndex = elements.indexOf(current as HTMLElement);\n let nextIndex = currentIndex + 1;\n\n if (nextIndex >= elements.length) {\n if (wrap) {\n nextIndex = 0;\n } else {\n return null;\n }\n }\n\n const nextElement = elements[nextIndex];\n if (nextElement) {\n focusSafely(nextElement);\n return nextElement;\n }\n\n return null;\n },\n\n focusPrevious(opts: FocusManagerOptions = {}) {\n const root = ref();\n if (!root) return null;\n\n const { from, tabbable = true, wrap = false, accept } = opts;\n const doc = getOwnerDocument(root);\n const current = from || getActiveElement(doc);\n\n let elements = getFocusableElements(root, tabbable);\n if (accept) {\n elements = elements.filter(accept);\n }\n\n if (!current || elements.length === 0) return null;\n\n const currentIndex = elements.indexOf(current as HTMLElement);\n let prevIndex = currentIndex - 1;\n\n if (prevIndex < 0) {\n if (wrap) {\n prevIndex = elements.length - 1;\n } else {\n return null;\n }\n }\n\n const prevElement = elements[prevIndex];\n if (prevElement) {\n focusSafely(prevElement);\n return prevElement;\n }\n\n return null;\n },\n\n focusFirst(opts: FocusManagerOptions = {}) {\n const root = ref();\n if (!root) return null;\n\n const { tabbable = true, accept } = opts;\n let elements = getFocusableElements(root, tabbable);\n if (accept) {\n elements = elements.filter(accept);\n }\n\n if (elements.length > 0) {\n focusSafely(elements[0]);\n return elements[0];\n }\n\n return null;\n },\n\n focusLast(opts: FocusManagerOptions = {}) {\n const root = ref();\n if (!root) return null;\n\n const { tabbable = true, accept } = opts;\n let elements = getFocusableElements(root, tabbable);\n if (accept) {\n elements = elements.filter(accept);\n }\n\n if (elements.length > 0) {\n const lastElement = elements[elements.length - 1];\n focusSafely(lastElement);\n return lastElement;\n }\n\n return null;\n },\n };\n}\n\n/**\n * Provides the behavior and accessibility implementation for a toolbar.\n * A toolbar is a container for a set of interactive controls with arrow key navigation.\n *\n * @example\n * ```tsx\n * let ref;\n * const { toolbarProps } = createToolbar({ orientation: 'horizontal' });\n * return (\n * <div {...toolbarProps}>\n * <Button>Cut</Button>\n * <Button>Copy</Button>\n * <Button>Paste</Button>\n * </div>\n * );\n * ```\n */\nexport function createToolbar(props: AriaToolbarProps = {}): ToolbarAria {\n let toolbarRef: HTMLElement | undefined;\n const [isInToolbar, setIsInToolbar] = createSignal(false);\n let lastFocusedElement: Element | null = null;\n\n const locale = useLocale();\n const orientation = () => access(props.orientation) ?? \"horizontal\";\n const ariaLabel = () => access(props[\"aria-label\"]);\n const ariaLabelledby = () => access(props[\"aria-labelledby\"]);\n\n const focusManager = createFocusManager(() => toolbarRef);\n\n // Check if this toolbar is nested inside another toolbar\n onMount(() => {\n if (toolbarRef) {\n const parentToolbar = toolbarRef.parentElement?.closest('[role=\"toolbar\"]');\n setIsInToolbar(!!parentToolbar);\n }\n });\n\n // Keyboard event handler\n const onKeyDown = (e: KeyboardEvent) => {\n const root = toolbarRef;\n if (!root) return;\n\n // Don't handle if nested toolbar (parent handles navigation)\n if (isInToolbar()) return;\n\n const target = e.target;\n if (!(target instanceof Element) || !root.contains(target)) {\n return;\n }\n\n const doc = getOwnerDocument(root);\n\n // Text entry controls keep the arrow keys for caret/value navigation.\n // Upstream useToolbar has no such guard; a text input placed inside a\n // toolbar would otherwise lose caret movement. Kept (narrowed to arrows)\n // as a suspected divergence pending a dedicated ActionBar/Toolbar cert.\n if (isTextInputLikeElement(target)) {\n switch (e.key) {\n case \"ArrowRight\":\n case \"ArrowLeft\":\n case \"ArrowDown\":\n case \"ArrowUp\":\n return;\n }\n }\n\n const dir = locale().direction;\n const isRTL = dir === \"rtl\";\n const isHorizontal = orientation() === \"horizontal\";\n\n let handled = false;\n\n switch (e.key) {\n case \"ArrowRight\":\n if (isHorizontal) {\n if (isRTL) {\n focusManager.focusPrevious({ tabbable: true });\n } else {\n focusManager.focusNext({ tabbable: true });\n }\n handled = true;\n }\n break;\n case \"ArrowLeft\":\n if (isHorizontal) {\n if (isRTL) {\n focusManager.focusNext({ tabbable: true });\n } else {\n focusManager.focusPrevious({ tabbable: true });\n }\n handled = true;\n }\n break;\n case \"ArrowDown\":\n if (!isHorizontal) {\n focusManager.focusNext({ tabbable: true });\n handled = true;\n }\n break;\n case \"ArrowUp\":\n if (!isHorizontal) {\n focusManager.focusPrevious({ tabbable: true });\n handled = true;\n }\n break;\n case \"Tab\":\n // Move focus to the first/last child so the browser's own Tab handling\n // then carries focus OUT of the whole toolbar. Faithful to upstream\n // useToolbar: there is no roving tabindex — every item stays tabbable,\n // so a bare Tab would otherwise step to the next item instead of leaving.\n lastFocusedElement = getActiveElement(doc);\n if (e.shiftKey) {\n focusManager.focusFirst({ tabbable: true });\n } else {\n focusManager.focusLast({ tabbable: true });\n }\n return;\n }\n\n if (handled) {\n e.preventDefault();\n e.stopPropagation();\n }\n };\n\n // Record the last focused child when focus moves out of the toolbar.\n const onBlur = (e: FocusEvent) => {\n const root = toolbarRef;\n if (!root) return;\n if (isInToolbar()) return;\n\n const relatedTarget = e.relatedTarget as Node | null;\n if (!(relatedTarget && root.contains(relatedTarget)) && !lastFocusedElement) {\n lastFocusedElement = e.target as Element;\n }\n };\n\n // Restore focus to the last focused child when focus returns into the toolbar.\n // If that element was removed, focus() is a no-op and the browser lands on the\n // first/last child per direction — matching upstream useToolbar.\n const onFocus = (e: FocusEvent) => {\n const root = toolbarRef;\n if (!root) return;\n if (isInToolbar()) return;\n\n const relatedTarget = e.relatedTarget as Node | null;\n const target = e.target;\n if (\n lastFocusedElement &&\n !(relatedTarget && root.contains(relatedTarget)) &&\n target instanceof Node &&\n root.contains(target)\n ) {\n focusSafely(lastFocusedElement as HTMLElement);\n lastFocusedElement = null;\n }\n };\n\n // Set up capture event listeners\n const setRef = (el: HTMLElement) => {\n toolbarRef = el;\n\n // Use capture phase so container handlers run before the focused child's.\n el.addEventListener(\"keydown\", onKeyDown, true);\n el.addEventListener(\"focus\", onFocus, true);\n el.addEventListener(\"blur\", onBlur, true);\n\n onCleanup(() => {\n el.removeEventListener(\"keydown\", onKeyDown, true);\n el.removeEventListener(\"focus\", onFocus, true);\n el.removeEventListener(\"blur\", onBlur, true);\n });\n };\n\n return {\n toolbarProps: {\n get role() {\n return isInToolbar() ? \"group\" : \"toolbar\";\n },\n get \"aria-orientation\"() {\n return isInToolbar() ? undefined : orientation();\n },\n get \"aria-label\"() {\n return ariaLabel();\n },\n get \"aria-labelledby\"() {\n // Only use aria-labelledby if no aria-label is provided\n return ariaLabel() ? undefined : ariaLabelledby();\n },\n ref: setRef,\n },\n orientation,\n };\n}\n"],"mappings":"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"}