@proyecto-viviana/solidaria 0.4.2 → 0.6.0-rc.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 (1377) hide show
  1. package/LICENSE-APACHE-2.0 +201 -0
  2. package/NOTICE +91 -0
  3. package/dist/_chunk/DragManager.js +71 -25
  4. package/dist/_chunk/DragManager.js.map +1 -1
  5. package/dist/_chunk/DragManager.jsx +71 -25
  6. package/dist/_chunk/DragManager.jsx.map +1 -1
  7. package/dist/_chunk/FocusScope.js +281 -66
  8. package/dist/_chunk/FocusScope.js.map +1 -1
  9. package/dist/_chunk/FocusScope.jsx +274 -55
  10. package/dist/_chunk/FocusScope.jsx.map +1 -1
  11. package/dist/_chunk/actiongroup.js +43 -19
  12. package/dist/_chunk/actiongroup.js.map +1 -1
  13. package/dist/_chunk/actiongroup.jsx +43 -19
  14. package/dist/_chunk/actiongroup.jsx.map +1 -1
  15. package/dist/_chunk/announce.js +19 -6
  16. package/dist/_chunk/announce.js.map +1 -1
  17. package/dist/_chunk/announce.jsx +19 -6
  18. package/dist/_chunk/announce.jsx.map +1 -1
  19. package/dist/_chunk/ariaHideOutside.js +212 -10
  20. package/dist/_chunk/ariaHideOutside.js.map +1 -1
  21. package/dist/_chunk/ariaHideOutside.jsx +212 -10
  22. package/dist/_chunk/ariaHideOutside.jsx.map +1 -1
  23. package/dist/_chunk/autocomplete.js +26 -7
  24. package/dist/_chunk/autocomplete.js.map +1 -1
  25. package/dist/_chunk/autocomplete.jsx +26 -7
  26. package/dist/_chunk/autocomplete.jsx.map +1 -1
  27. package/dist/_chunk/breadcrumbs.js +17 -2
  28. package/dist/_chunk/breadcrumbs.js.map +1 -1
  29. package/dist/_chunk/breadcrumbs.jsx +17 -2
  30. package/dist/_chunk/breadcrumbs.jsx.map +1 -1
  31. package/dist/_chunk/button.js +53 -20
  32. package/dist/_chunk/button.js.map +1 -1
  33. package/dist/_chunk/button.jsx +53 -20
  34. package/dist/_chunk/button.jsx.map +1 -1
  35. package/dist/_chunk/calendar.js +341 -56
  36. package/dist/_chunk/calendar.js.map +1 -1
  37. package/dist/_chunk/calendar.jsx +341 -56
  38. package/dist/_chunk/calendar.jsx.map +1 -1
  39. package/dist/_chunk/checkbox.js +69 -26
  40. package/dist/_chunk/checkbox.js.map +1 -1
  41. package/dist/_chunk/checkbox.jsx +69 -26
  42. package/dist/_chunk/checkbox.jsx.map +1 -1
  43. package/dist/_chunk/color.js +307 -48
  44. package/dist/_chunk/color.js.map +1 -1
  45. package/dist/_chunk/color.jsx +307 -48
  46. package/dist/_chunk/color.jsx.map +1 -1
  47. package/dist/_chunk/combobox.js +193 -103
  48. package/dist/_chunk/combobox.js.map +1 -1
  49. package/dist/_chunk/combobox.jsx +193 -103
  50. package/dist/_chunk/combobox.jsx.map +1 -1
  51. package/dist/_chunk/constants.js +12 -0
  52. package/dist/_chunk/constants.js.map +1 -1
  53. package/dist/_chunk/constants.jsx +12 -0
  54. package/dist/_chunk/constants.jsx.map +1 -1
  55. package/dist/_chunk/createCollator.js +12 -0
  56. package/dist/_chunk/createCollator.js.map +1 -1
  57. package/dist/_chunk/createCollator.jsx +12 -0
  58. package/dist/_chunk/createCollator.jsx.map +1 -1
  59. package/dist/_chunk/createCollectionRowInteraction.js +50 -13
  60. package/dist/_chunk/createCollectionRowInteraction.js.map +1 -1
  61. package/dist/_chunk/createCollectionRowInteraction.jsx +50 -13
  62. package/dist/_chunk/createCollectionRowInteraction.jsx.map +1 -1
  63. package/dist/_chunk/createField.js +35 -25
  64. package/dist/_chunk/createField.js.map +1 -1
  65. package/dist/_chunk/createField.jsx +35 -25
  66. package/dist/_chunk/createField.jsx.map +1 -1
  67. package/dist/_chunk/createFocus.js +18 -5
  68. package/dist/_chunk/createFocus.js.map +1 -1
  69. package/dist/_chunk/createFocus.jsx +18 -5
  70. package/dist/_chunk/createFocus.jsx.map +1 -1
  71. package/dist/_chunk/createFocusRing.js +16 -7
  72. package/dist/_chunk/createFocusRing.js.map +1 -1
  73. package/dist/_chunk/createFocusRing.jsx +16 -7
  74. package/dist/_chunk/createFocusRing.jsx.map +1 -1
  75. package/dist/_chunk/createFocusWithin.js +16 -4
  76. package/dist/_chunk/createFocusWithin.js.map +1 -1
  77. package/dist/_chunk/createFocusWithin.jsx +16 -4
  78. package/dist/_chunk/createFocusWithin.jsx.map +1 -1
  79. package/dist/_chunk/createFocusable.js +39 -53
  80. package/dist/_chunk/createFocusable.js.map +1 -1
  81. package/dist/_chunk/createFocusable.jsx +39 -53
  82. package/dist/_chunk/createFocusable.jsx.map +1 -1
  83. package/dist/_chunk/createFormReset.js +24 -12
  84. package/dist/_chunk/createFormReset.js.map +1 -1
  85. package/dist/_chunk/createFormReset.jsx +24 -12
  86. package/dist/_chunk/createFormReset.jsx.map +1 -1
  87. package/dist/_chunk/createFormValidation.js +41 -17
  88. package/dist/_chunk/createFormValidation.js.map +1 -1
  89. package/dist/_chunk/createFormValidation.jsx +41 -17
  90. package/dist/_chunk/createFormValidation.jsx.map +1 -1
  91. package/dist/_chunk/createHover.js +56 -42
  92. package/dist/_chunk/createHover.js.map +1 -1
  93. package/dist/_chunk/createHover.jsx +56 -42
  94. package/dist/_chunk/createHover.jsx.map +1 -1
  95. package/dist/_chunk/createKeyboard.js +205 -0
  96. package/dist/_chunk/createKeyboard.js.map +1 -0
  97. package/dist/_chunk/createKeyboard.jsx +205 -0
  98. package/dist/_chunk/createKeyboard.jsx.map +1 -0
  99. package/dist/_chunk/createLabel.js +17 -4
  100. package/dist/_chunk/createLabel.js.map +1 -1
  101. package/dist/_chunk/createLabel.jsx +17 -4
  102. package/dist/_chunk/createLabel.jsx.map +1 -1
  103. package/dist/_chunk/createLabels.js +14 -2
  104. package/dist/_chunk/createLabels.js.map +1 -1
  105. package/dist/_chunk/createLabels.jsx +14 -2
  106. package/dist/_chunk/createLabels.jsx.map +1 -1
  107. package/dist/_chunk/createLandmark.js +19 -3
  108. package/dist/_chunk/createLandmark.js.map +1 -1
  109. package/dist/_chunk/createLandmark.jsx +19 -3
  110. package/dist/_chunk/createLandmark.jsx.map +1 -1
  111. package/dist/_chunk/createLongPress.js +105 -0
  112. package/dist/_chunk/createLongPress.js.map +1 -0
  113. package/dist/_chunk/createLongPress.jsx +105 -0
  114. package/dist/_chunk/createLongPress.jsx.map +1 -0
  115. package/dist/_chunk/createOverlay.js +220 -111
  116. package/dist/_chunk/createOverlay.js.map +1 -1
  117. package/dist/_chunk/createOverlay.jsx +220 -111
  118. package/dist/_chunk/createOverlay.jsx.map +1 -1
  119. package/dist/_chunk/createOverlayTrigger.js +58 -0
  120. package/dist/_chunk/createOverlayTrigger.js.map +1 -0
  121. package/dist/_chunk/createOverlayTrigger.jsx +58 -0
  122. package/dist/_chunk/createOverlayTrigger.jsx.map +1 -0
  123. package/dist/_chunk/createPress.js +38 -28
  124. package/dist/_chunk/createPress.js.map +1 -1
  125. package/dist/_chunk/createPress.jsx +38 -28
  126. package/dist/_chunk/createPress.jsx.map +1 -1
  127. package/dist/_chunk/createProgressBar.js +17 -4
  128. package/dist/_chunk/createProgressBar.js.map +1 -1
  129. package/dist/_chunk/createProgressBar.jsx +17 -4
  130. package/dist/_chunk/createProgressBar.jsx.map +1 -1
  131. package/dist/_chunk/createSelectableItem.js +58 -20
  132. package/dist/_chunk/createSelectableItem.js.map +1 -1
  133. package/dist/_chunk/createSelectableItem.jsx +58 -20
  134. package/dist/_chunk/createSelectableItem.jsx.map +1 -1
  135. package/dist/_chunk/createSelectableList.js +776 -0
  136. package/dist/_chunk/createSelectableList.js.map +1 -0
  137. package/dist/_chunk/createSelectableList.jsx +776 -0
  138. package/dist/_chunk/createSelectableList.jsx.map +1 -0
  139. package/dist/_chunk/createStringFormatter.js +350 -5
  140. package/dist/_chunk/createStringFormatter.js.map +1 -1
  141. package/dist/_chunk/createStringFormatter.jsx +350 -5
  142. package/dist/_chunk/createStringFormatter.jsx.map +1 -1
  143. package/dist/_chunk/createToggle.js +68 -19
  144. package/dist/_chunk/createToggle.js.map +1 -1
  145. package/dist/_chunk/createToggle.jsx +68 -19
  146. package/dist/_chunk/createToggle.jsx.map +1 -1
  147. package/dist/_chunk/createTypeSelect.js +15 -3
  148. package/dist/_chunk/createTypeSelect.js.map +1 -1
  149. package/dist/_chunk/createTypeSelect.jsx +15 -3
  150. package/dist/_chunk/createTypeSelect.jsx.map +1 -1
  151. package/dist/_chunk/{visually-hidden.js → createVisuallyHidden.js} +16 -4
  152. package/dist/_chunk/createVisuallyHidden.js.map +1 -0
  153. package/dist/_chunk/{visually-hidden.jsx → createVisuallyHidden.jsx} +16 -4
  154. package/dist/_chunk/createVisuallyHidden.jsx.map +1 -0
  155. package/dist/_chunk/datepicker.js +687 -602
  156. package/dist/_chunk/datepicker.js.map +1 -1
  157. package/dist/_chunk/datepicker.jsx +687 -602
  158. package/dist/_chunk/datepicker.jsx.map +1 -1
  159. package/dist/_chunk/dialog.js +49 -19
  160. package/dist/_chunk/dialog.js.map +1 -1
  161. package/dist/_chunk/dialog.jsx +49 -19
  162. package/dist/_chunk/dialog.jsx.map +1 -1
  163. package/dist/_chunk/disclosure.js +48 -28
  164. package/dist/_chunk/disclosure.js.map +1 -1
  165. package/dist/_chunk/disclosure.jsx +48 -28
  166. package/dist/_chunk/disclosure.jsx.map +1 -1
  167. package/dist/_chunk/dnd.js +1340 -1172
  168. package/dist/_chunk/dnd.js.map +1 -1
  169. package/dist/_chunk/dnd.jsx +1340 -1172
  170. package/dist/_chunk/dnd.jsx.map +1 -1
  171. package/dist/_chunk/dom.js +1200 -0
  172. package/dist/_chunk/dom.js.map +1 -0
  173. package/dist/_chunk/dom.jsx +1200 -0
  174. package/dist/_chunk/dom.jsx.map +1 -0
  175. package/dist/_chunk/env.js +1 -57
  176. package/dist/_chunk/env.js.map +1 -1
  177. package/dist/_chunk/env.jsx +1 -57
  178. package/dist/_chunk/env.jsx.map +1 -1
  179. package/dist/_chunk/filterDOMProps.js +32 -7
  180. package/dist/_chunk/filterDOMProps.js.map +1 -1
  181. package/dist/_chunk/filterDOMProps.jsx +32 -7
  182. package/dist/_chunk/filterDOMProps.jsx.map +1 -1
  183. package/dist/_chunk/focus.js +570 -338
  184. package/dist/_chunk/focus.js.map +1 -1
  185. package/dist/_chunk/focus.jsx +570 -338
  186. package/dist/_chunk/focus.jsx.map +1 -1
  187. package/dist/_chunk/grid.js +62 -8
  188. package/dist/_chunk/grid.js.map +1 -1
  189. package/dist/_chunk/grid.jsx +62 -8
  190. package/dist/_chunk/grid.jsx.map +1 -1
  191. package/dist/_chunk/gridlist.js +192 -53
  192. package/dist/_chunk/gridlist.js.map +1 -1
  193. package/dist/_chunk/gridlist.jsx +192 -53
  194. package/dist/_chunk/gridlist.jsx.map +1 -1
  195. package/dist/_chunk/i18n.js +68 -1
  196. package/dist/_chunk/i18n.js.map +1 -1
  197. package/dist/_chunk/i18n.jsx +68 -1
  198. package/dist/_chunk/i18n.jsx.map +1 -1
  199. package/dist/_chunk/interactions.js +38 -102
  200. package/dist/_chunk/interactions.js.map +1 -1
  201. package/dist/_chunk/interactions.jsx +38 -100
  202. package/dist/_chunk/interactions.jsx.map +1 -1
  203. package/dist/_chunk/intl.js +280 -0
  204. package/dist/_chunk/intl.js.map +1 -0
  205. package/dist/_chunk/intl.jsx +280 -0
  206. package/dist/_chunk/intl.jsx.map +1 -0
  207. package/dist/_chunk/link.js +15 -4
  208. package/dist/_chunk/link.js.map +1 -1
  209. package/dist/_chunk/link.jsx +15 -4
  210. package/dist/_chunk/link.jsx.map +1 -1
  211. package/dist/_chunk/listbox.js +99 -175
  212. package/dist/_chunk/listbox.js.map +1 -1
  213. package/dist/_chunk/listbox.jsx +99 -175
  214. package/dist/_chunk/listbox.jsx.map +1 -1
  215. package/dist/_chunk/locale.js +58 -12
  216. package/dist/_chunk/locale.js.map +1 -1
  217. package/dist/_chunk/locale.jsx +57 -11
  218. package/dist/_chunk/locale.jsx.map +1 -1
  219. package/dist/_chunk/menu.js +298 -57
  220. package/dist/_chunk/menu.js.map +1 -1
  221. package/dist/_chunk/menu.jsx +298 -57
  222. package/dist/_chunk/menu.jsx.map +1 -1
  223. package/dist/_chunk/mergeProps.js +216 -0
  224. package/dist/_chunk/mergeProps.js.map +1 -0
  225. package/dist/_chunk/mergeProps.jsx +216 -0
  226. package/dist/_chunk/mergeProps.jsx.map +1 -0
  227. package/dist/_chunk/meter.js +16 -4
  228. package/dist/_chunk/meter.js.map +1 -1
  229. package/dist/_chunk/meter.jsx +16 -4
  230. package/dist/_chunk/meter.jsx.map +1 -1
  231. package/dist/_chunk/numberfield.js +167 -22
  232. package/dist/_chunk/numberfield.js.map +1 -1
  233. package/dist/_chunk/numberfield.jsx +167 -22
  234. package/dist/_chunk/numberfield.jsx.map +1 -1
  235. package/dist/_chunk/overlays.js +87 -74
  236. package/dist/_chunk/overlays.js.map +1 -1
  237. package/dist/_chunk/overlays.jsx +71 -57
  238. package/dist/_chunk/overlays.jsx.map +1 -1
  239. package/dist/_chunk/owner.js +23 -0
  240. package/dist/_chunk/owner.js.map +1 -0
  241. package/dist/_chunk/owner.jsx +23 -0
  242. package/dist/_chunk/owner.jsx.map +1 -0
  243. package/dist/_chunk/popover.js +180 -42
  244. package/dist/_chunk/popover.js.map +1 -1
  245. package/dist/_chunk/popover.jsx +180 -42
  246. package/dist/_chunk/popover.jsx.map +1 -1
  247. package/dist/_chunk/radio.js +92 -32
  248. package/dist/_chunk/radio.js.map +1 -1
  249. package/dist/_chunk/radio.jsx +92 -32
  250. package/dist/_chunk/radio.jsx.map +1 -1
  251. package/dist/_chunk/reactivity.js.map +1 -1
  252. package/dist/_chunk/reactivity.jsx.map +1 -1
  253. package/dist/_chunk/refs.js +41 -0
  254. package/dist/_chunk/refs.js.map +1 -0
  255. package/dist/_chunk/refs.jsx +41 -0
  256. package/dist/_chunk/refs.jsx.map +1 -0
  257. package/dist/_chunk/searchfield.js +69 -3
  258. package/dist/_chunk/searchfield.js.map +1 -1
  259. package/dist/_chunk/searchfield.jsx +69 -3
  260. package/dist/_chunk/searchfield.jsx.map +1 -1
  261. package/dist/_chunk/select.js +226 -80
  262. package/dist/_chunk/select.js.map +1 -1
  263. package/dist/_chunk/select.jsx +162 -70
  264. package/dist/_chunk/select.jsx.map +1 -1
  265. package/dist/_chunk/selection.js +20 -638
  266. package/dist/_chunk/selection.js.map +1 -1
  267. package/dist/_chunk/selection.jsx +20 -638
  268. package/dist/_chunk/selection.jsx.map +1 -1
  269. package/dist/_chunk/separator.js +12 -0
  270. package/dist/_chunk/separator.js.map +1 -1
  271. package/dist/_chunk/separator.jsx +12 -0
  272. package/dist/_chunk/separator.jsx.map +1 -1
  273. package/dist/_chunk/slider.js +25 -16
  274. package/dist/_chunk/slider.js.map +1 -1
  275. package/dist/_chunk/slider.jsx +25 -16
  276. package/dist/_chunk/slider.jsx.map +1 -1
  277. package/dist/_chunk/spinbutton.js +52 -42
  278. package/dist/_chunk/spinbutton.js.map +1 -1
  279. package/dist/_chunk/spinbutton.jsx +52 -42
  280. package/dist/_chunk/spinbutton.jsx.map +1 -1
  281. package/dist/_chunk/steplist.js +14 -1
  282. package/dist/_chunk/steplist.js.map +1 -1
  283. package/dist/_chunk/steplist.jsx +14 -1
  284. package/dist/_chunk/steplist.jsx.map +1 -1
  285. package/dist/_chunk/switch.js +21 -3
  286. package/dist/_chunk/switch.js.map +1 -1
  287. package/dist/_chunk/switch.jsx +21 -3
  288. package/dist/_chunk/switch.jsx.map +1 -1
  289. package/dist/_chunk/table.js +666 -88
  290. package/dist/_chunk/table.js.map +1 -1
  291. package/dist/_chunk/table.jsx +666 -88
  292. package/dist/_chunk/table.jsx.map +1 -1
  293. package/dist/_chunk/tabs.js +115 -17
  294. package/dist/_chunk/tabs.js.map +1 -1
  295. package/dist/_chunk/tabs.jsx +115 -17
  296. package/dist/_chunk/tabs.jsx.map +1 -1
  297. package/dist/_chunk/tag.js +240 -39
  298. package/dist/_chunk/tag.js.map +1 -1
  299. package/dist/_chunk/tag.jsx +240 -39
  300. package/dist/_chunk/tag.jsx.map +1 -1
  301. package/dist/_chunk/textfield.js +83 -12
  302. package/dist/_chunk/textfield.js.map +1 -1
  303. package/dist/_chunk/textfield.jsx +83 -12
  304. package/dist/_chunk/textfield.jsx.map +1 -1
  305. package/dist/_chunk/toast.js +61 -28
  306. package/dist/_chunk/toast.js.map +1 -1
  307. package/dist/_chunk/toast.jsx +61 -28
  308. package/dist/_chunk/toast.jsx.map +1 -1
  309. package/dist/_chunk/tokenfield.js +567 -0
  310. package/dist/_chunk/tokenfield.js.map +1 -0
  311. package/dist/_chunk/tokenfield.jsx +567 -0
  312. package/dist/_chunk/tokenfield.jsx.map +1 -0
  313. package/dist/_chunk/toolbar.js +25 -8
  314. package/dist/_chunk/toolbar.js.map +1 -1
  315. package/dist/_chunk/toolbar.jsx +25 -8
  316. package/dist/_chunk/toolbar.jsx.map +1 -1
  317. package/dist/_chunk/tooltip.js +379 -6
  318. package/dist/_chunk/tooltip.js.map +1 -1
  319. package/dist/_chunk/tooltip.jsx +379 -6
  320. package/dist/_chunk/tooltip.jsx.map +1 -1
  321. package/dist/_chunk/tree.js +280 -69
  322. package/dist/_chunk/tree.js.map +1 -1
  323. package/dist/_chunk/tree.jsx +280 -69
  324. package/dist/_chunk/tree.jsx.map +1 -1
  325. package/dist/_chunk/utils.js +192 -150
  326. package/dist/_chunk/utils.js.map +1 -1
  327. package/dist/_chunk/utils.jsx +192 -150
  328. package/dist/_chunk/utils.jsx.map +1 -1
  329. package/dist/_chunk/virtualFocus.js +54 -0
  330. package/dist/_chunk/virtualFocus.js.map +1 -0
  331. package/dist/_chunk/virtualFocus.jsx +54 -0
  332. package/dist/_chunk/virtualFocus.jsx.map +1 -0
  333. package/dist/_chunk/virtualizer.js +202 -0
  334. package/dist/_chunk/virtualizer.js.map +1 -0
  335. package/dist/_chunk/virtualizer.jsx +202 -0
  336. package/dist/_chunk/virtualizer.jsx.map +1 -0
  337. package/dist/actiongroup/createActionGroup.d.ts +2 -1
  338. package/dist/actiongroup/createActionGroup.d.ts.map +1 -1
  339. package/dist/autocomplete/createAutocomplete.d.ts +1 -9
  340. package/dist/autocomplete/createAutocomplete.d.ts.map +1 -1
  341. package/dist/autocomplete/intl/index.d.ts +13 -0
  342. package/dist/autocomplete/intl/index.d.ts.map +1 -0
  343. package/dist/breadcrumbs/createBreadcrumbs.d.ts +3 -1
  344. package/dist/breadcrumbs/createBreadcrumbs.d.ts.map +1 -1
  345. package/dist/breadcrumbs/intl/index.d.ts +13 -0
  346. package/dist/breadcrumbs/intl/index.d.ts.map +1 -0
  347. package/dist/button/createButton.d.ts.map +1 -1
  348. package/dist/button/createToggleButton.d.ts.map +1 -1
  349. package/dist/button/createToggleButtonGroup.d.ts +1 -1
  350. package/dist/button/createToggleButtonGroup.d.ts.map +1 -1
  351. package/dist/button/types.d.ts +14 -0
  352. package/dist/button/types.d.ts.map +1 -1
  353. package/dist/calendar/createCalendar.d.ts +1 -7
  354. package/dist/calendar/createCalendar.d.ts.map +1 -1
  355. package/dist/calendar/createCalendarCell.d.ts +0 -6
  356. package/dist/calendar/createCalendarCell.d.ts.map +1 -1
  357. package/dist/calendar/createCalendarGrid.d.ts +1 -7
  358. package/dist/calendar/createCalendarGrid.d.ts.map +1 -1
  359. package/dist/calendar/createCalendarMonthPicker.d.ts +0 -8
  360. package/dist/calendar/createCalendarMonthPicker.d.ts.map +1 -1
  361. package/dist/calendar/createCalendarYearPicker.d.ts +0 -8
  362. package/dist/calendar/createCalendarYearPicker.d.ts.map +1 -1
  363. package/dist/calendar/createRangeCalendar.d.ts +13 -7
  364. package/dist/calendar/createRangeCalendar.d.ts.map +1 -1
  365. package/dist/calendar/createRangeCalendarCell.d.ts +2 -6
  366. package/dist/calendar/createRangeCalendarCell.d.ts.map +1 -1
  367. package/dist/calendar/intl/index.d.ts.map +1 -1
  368. package/dist/calendar/utils.d.ts.map +1 -1
  369. package/dist/checkbox/createCheckbox.d.ts +2 -1
  370. package/dist/checkbox/createCheckbox.d.ts.map +1 -1
  371. package/dist/checkbox/createCheckboxGroup.d.ts +1 -9
  372. package/dist/checkbox/createCheckboxGroup.d.ts.map +1 -1
  373. package/dist/checkbox/createCheckboxGroupItem.d.ts +0 -8
  374. package/dist/checkbox/createCheckboxGroupItem.d.ts.map +1 -1
  375. package/dist/collections/index.d.ts +1 -1
  376. package/dist/collections/index.d.ts.map +1 -1
  377. package/dist/collections/index.js +18 -2
  378. package/dist/collections/index.js.map +1 -1
  379. package/dist/collections/index.jsx +18 -2
  380. package/dist/collections/index.jsx.map +1 -1
  381. package/dist/color/createColorArea.d.ts +2 -7
  382. package/dist/color/createColorArea.d.ts.map +1 -1
  383. package/dist/color/createColorField.d.ts +2 -7
  384. package/dist/color/createColorField.d.ts.map +1 -1
  385. package/dist/color/createColorSlider.d.ts +1 -6
  386. package/dist/color/createColorSlider.d.ts.map +1 -1
  387. package/dist/color/createColorSwatch.d.ts +1 -6
  388. package/dist/color/createColorSwatch.d.ts.map +1 -1
  389. package/dist/color/createColorWheel.d.ts +1 -6
  390. package/dist/color/createColorWheel.d.ts.map +1 -1
  391. package/dist/color/intl/index.d.ts.map +1 -1
  392. package/dist/color/types.d.ts +47 -1
  393. package/dist/color/types.d.ts.map +1 -1
  394. package/dist/combobox/createComboBox.d.ts +17 -8
  395. package/dist/combobox/createComboBox.d.ts.map +1 -1
  396. package/dist/combobox/intl/generated-locales.d.ts +3 -0
  397. package/dist/combobox/intl/generated-locales.d.ts.map +1 -1
  398. package/dist/combobox/intl/index.d.ts +3 -2
  399. package/dist/combobox/intl/index.d.ts.map +1 -1
  400. package/dist/datepicker/createDateField.d.ts +0 -10
  401. package/dist/datepicker/createDateField.d.ts.map +1 -1
  402. package/dist/datepicker/createDatePicker.d.ts +0 -16
  403. package/dist/datepicker/createDatePicker.d.ts.map +1 -1
  404. package/dist/datepicker/createDatePickerGroup.d.ts +1 -1
  405. package/dist/datepicker/createDatePickerGroup.d.ts.map +1 -1
  406. package/dist/datepicker/createDateRangePicker.d.ts +0 -21
  407. package/dist/datepicker/createDateRangePicker.d.ts.map +1 -1
  408. package/dist/datepicker/createDateSegment.d.ts +0 -9
  409. package/dist/datepicker/createDateSegment.d.ts.map +1 -1
  410. package/dist/datepicker/createDisplayNames.d.ts +1 -9
  411. package/dist/datepicker/createDisplayNames.d.ts.map +1 -1
  412. package/dist/datepicker/createTimeField.d.ts.map +1 -1
  413. package/dist/datepicker/intl.d.ts.map +1 -1
  414. package/dist/dialog/createDialog.d.ts +2 -4
  415. package/dist/dialog/createDialog.d.ts.map +1 -1
  416. package/dist/dialog/types.d.ts +14 -0
  417. package/dist/dialog/types.d.ts.map +1 -1
  418. package/dist/disclosure/createDisclosure.d.ts +1 -8
  419. package/dist/disclosure/createDisclosure.d.ts.map +1 -1
  420. package/dist/disclosure/createDisclosureGroup.d.ts +3 -4
  421. package/dist/disclosure/createDisclosureGroup.d.ts.map +1 -1
  422. package/dist/dnd/DragManager.d.ts +1 -16
  423. package/dist/dnd/DragManager.d.ts.map +1 -1
  424. package/dist/dnd/DropTargetKeyboardNavigation.d.ts +2 -2
  425. package/dist/dnd/createDrag.d.ts +1 -7
  426. package/dist/dnd/createDrag.d.ts.map +1 -1
  427. package/dist/dnd/createDraggableCollection.d.ts +1 -7
  428. package/dist/dnd/createDraggableCollection.d.ts.map +1 -1
  429. package/dist/dnd/createDraggableItem.d.ts +2 -7
  430. package/dist/dnd/createDraggableItem.d.ts.map +1 -1
  431. package/dist/dnd/createDrop.d.ts +1 -7
  432. package/dist/dnd/createDrop.d.ts.map +1 -1
  433. package/dist/dnd/createDropIndicator.d.ts +27 -0
  434. package/dist/dnd/createDropIndicator.d.ts.map +1 -0
  435. package/dist/dnd/createDroppableCollection.d.ts +6 -8
  436. package/dist/dnd/createDroppableCollection.d.ts.map +1 -1
  437. package/dist/dnd/createDroppableItem.d.ts +12 -10
  438. package/dist/dnd/createDroppableItem.d.ts.map +1 -1
  439. package/dist/dnd/index.d.ts +3 -1
  440. package/dist/dnd/index.d.ts.map +1 -1
  441. package/dist/dnd/index.js +2 -2
  442. package/dist/dnd/index.jsx +2 -2
  443. package/dist/dnd/intl/index.d.ts +6 -4
  444. package/dist/dnd/intl/index.d.ts.map +1 -1
  445. package/dist/dnd/types.d.ts +20 -1
  446. package/dist/dnd/types.d.ts.map +1 -1
  447. package/dist/dnd/utils.d.ts +4 -0
  448. package/dist/dnd/utils.d.ts.map +1 -1
  449. package/dist/focus/FocusScope.d.ts +9 -5
  450. package/dist/focus/FocusScope.d.ts.map +1 -1
  451. package/dist/focus/createAutoFocus.d.ts +3 -0
  452. package/dist/focus/createAutoFocus.d.ts.map +1 -1
  453. package/dist/focus/createFocusRestore.d.ts +3 -0
  454. package/dist/focus/createFocusRestore.d.ts.map +1 -1
  455. package/dist/focus/createHasTabbableChild.d.ts +13 -0
  456. package/dist/focus/createHasTabbableChild.d.ts.map +1 -0
  457. package/dist/focus/createVirtualFocus.d.ts +4 -1
  458. package/dist/focus/createVirtualFocus.d.ts.map +1 -1
  459. package/dist/focus/index.js +3 -2
  460. package/dist/focus/index.jsx +3 -2
  461. package/dist/focus/virtualFocus.d.ts +1 -1
  462. package/dist/form/createFormReset.d.ts +1 -7
  463. package/dist/form/createFormReset.d.ts.map +1 -1
  464. package/dist/form/createFormValidation.d.ts +1 -9
  465. package/dist/form/createFormValidation.d.ts.map +1 -1
  466. package/dist/grid/GridKeyboardDelegate.d.ts.map +1 -1
  467. package/dist/grid/createGrid.d.ts +1 -5
  468. package/dist/grid/createGrid.d.ts.map +1 -1
  469. package/dist/grid/createGridCell.d.ts +1 -5
  470. package/dist/grid/createGridCell.d.ts.map +1 -1
  471. package/dist/grid/createGridRow.d.ts +1 -5
  472. package/dist/grid/createGridRow.d.ts.map +1 -1
  473. package/dist/grid/index.d.ts +2 -2
  474. package/dist/grid/intl/index.d.ts +18 -0
  475. package/dist/grid/intl/index.d.ts.map +1 -0
  476. package/dist/grid/types.d.ts +25 -2
  477. package/dist/grid/types.d.ts.map +1 -1
  478. package/dist/gridlist/createGridList.d.ts +3 -5
  479. package/dist/gridlist/createGridList.d.ts.map +1 -1
  480. package/dist/gridlist/createGridListItem.d.ts +1 -5
  481. package/dist/gridlist/createGridListItem.d.ts.map +1 -1
  482. package/dist/gridlist/createGridListSection.d.ts +0 -4
  483. package/dist/gridlist/createGridListSection.d.ts.map +1 -1
  484. package/dist/gridlist/createGridListSelectionCheckbox.d.ts +1 -5
  485. package/dist/gridlist/createGridListSelectionCheckbox.d.ts.map +1 -1
  486. package/dist/gridlist/intl/index.d.ts +14 -0
  487. package/dist/gridlist/intl/index.d.ts.map +1 -0
  488. package/dist/gridlist/types.d.ts +56 -2
  489. package/dist/gridlist/types.d.ts.map +1 -1
  490. package/dist/i18n/compileIcu.d.ts +24 -0
  491. package/dist/i18n/compileIcu.d.ts.map +1 -0
  492. package/dist/i18n/createCollator.d.ts +0 -7
  493. package/dist/i18n/createCollator.d.ts.map +1 -1
  494. package/dist/i18n/createDateFormatter.d.ts +0 -7
  495. package/dist/i18n/createDateFormatter.d.ts.map +1 -1
  496. package/dist/i18n/createFilter.d.ts +0 -7
  497. package/dist/i18n/createFilter.d.ts.map +1 -1
  498. package/dist/i18n/createListFormatter.d.ts +9 -0
  499. package/dist/i18n/createListFormatter.d.ts.map +1 -0
  500. package/dist/i18n/createNumberFormatter.d.ts +0 -7
  501. package/dist/i18n/createNumberFormatter.d.ts.map +1 -1
  502. package/dist/i18n/createStringFormatter.d.ts +14 -4
  503. package/dist/i18n/createStringFormatter.d.ts.map +1 -1
  504. package/dist/i18n/index.d.ts +1 -0
  505. package/dist/i18n/index.d.ts.map +1 -1
  506. package/dist/i18n/index.js +2 -2
  507. package/dist/i18n/index.jsx +2 -2
  508. package/dist/i18n/locale.d.ts +2 -8
  509. package/dist/i18n/locale.d.ts.map +1 -1
  510. package/dist/i18n/utils.d.ts +0 -7
  511. package/dist/i18n/utils.d.ts.map +1 -1
  512. package/dist/index.d.ts +10 -7
  513. package/dist/index.d.ts.map +1 -1
  514. package/dist/index.js +27 -21
  515. package/dist/index.jsx +27 -21
  516. package/dist/interactions/FocusableProvider.d.ts +3 -2
  517. package/dist/interactions/FocusableProvider.d.ts.map +1 -1
  518. package/dist/interactions/PressEvent.d.ts +2 -1
  519. package/dist/interactions/PressEvent.d.ts.map +1 -1
  520. package/dist/interactions/createContextMenu.d.ts +24 -0
  521. package/dist/interactions/createContextMenu.d.ts.map +1 -0
  522. package/dist/interactions/createFocus.d.ts +3 -2
  523. package/dist/interactions/createFocus.d.ts.map +1 -1
  524. package/dist/interactions/createFocusRing.d.ts +2 -1
  525. package/dist/interactions/createFocusRing.d.ts.map +1 -1
  526. package/dist/interactions/createFocusWithin.d.ts +1 -6
  527. package/dist/interactions/createFocusWithin.d.ts.map +1 -1
  528. package/dist/interactions/createFocusable.d.ts +2 -6
  529. package/dist/interactions/createFocusable.d.ts.map +1 -1
  530. package/dist/interactions/createHover.d.ts +3 -10
  531. package/dist/interactions/createHover.d.ts.map +1 -1
  532. package/dist/interactions/createInteractionModality.d.ts +12 -10
  533. package/dist/interactions/createInteractionModality.d.ts.map +1 -1
  534. package/dist/interactions/createKeyboard.d.ts +12 -3
  535. package/dist/interactions/createKeyboard.d.ts.map +1 -1
  536. package/dist/interactions/createKeyboardShortcutHandler.d.ts +24 -0
  537. package/dist/interactions/createKeyboardShortcutHandler.d.ts.map +1 -0
  538. package/dist/interactions/createLongPress.d.ts +4 -7
  539. package/dist/interactions/createLongPress.d.ts.map +1 -1
  540. package/dist/interactions/createMove.d.ts +1 -6
  541. package/dist/interactions/createMove.d.ts.map +1 -1
  542. package/dist/interactions/createPress.d.ts +2 -7
  543. package/dist/interactions/createPress.d.ts.map +1 -1
  544. package/dist/interactions/index.d.ts +1 -1
  545. package/dist/interactions/index.d.ts.map +1 -1
  546. package/dist/interactions/index.js +5 -3
  547. package/dist/interactions/index.jsx +5 -3
  548. package/dist/label/createField.d.ts +7 -1
  549. package/dist/label/createField.d.ts.map +1 -1
  550. package/dist/label/createLabel.d.ts +1 -1
  551. package/dist/label/createLabel.d.ts.map +1 -1
  552. package/dist/label/createLabels.d.ts +0 -7
  553. package/dist/label/createLabels.d.ts.map +1 -1
  554. package/dist/landmark/createLandmark.d.ts +4 -1
  555. package/dist/landmark/createLandmark.d.ts.map +1 -1
  556. package/dist/link/createLink.d.ts +1 -1
  557. package/dist/link/createLink.d.ts.map +1 -1
  558. package/dist/listbox/createListBox.d.ts +8 -7
  559. package/dist/listbox/createListBox.d.ts.map +1 -1
  560. package/dist/listbox/createOption.d.ts +7 -1
  561. package/dist/listbox/createOption.d.ts.map +1 -1
  562. package/dist/live-announcer/announce.d.ts +2 -13
  563. package/dist/live-announcer/announce.d.ts.map +1 -1
  564. package/dist/menu/createMenu.d.ts +3 -7
  565. package/dist/menu/createMenu.d.ts.map +1 -1
  566. package/dist/menu/createMenuItem.d.ts +2 -1
  567. package/dist/menu/createMenuItem.d.ts.map +1 -1
  568. package/dist/menu/createMenuTrigger.d.ts +24 -20
  569. package/dist/menu/createMenuTrigger.d.ts.map +1 -1
  570. package/dist/menu/index.d.ts +1 -1
  571. package/dist/menu/index.d.ts.map +1 -1
  572. package/dist/menu/intl/index.d.ts +4 -0
  573. package/dist/menu/intl/index.d.ts.map +1 -0
  574. package/dist/meter/createMeter.d.ts +2 -1
  575. package/dist/meter/createMeter.d.ts.map +1 -1
  576. package/dist/numberfield/createNumberField.d.ts +29 -6
  577. package/dist/numberfield/createNumberField.d.ts.map +1 -1
  578. package/dist/overlays/ariaHideOutside.d.ts +0 -4
  579. package/dist/overlays/ariaHideOutside.d.ts.map +1 -1
  580. package/dist/overlays/createInteractOutside.d.ts +2 -5
  581. package/dist/overlays/createInteractOutside.d.ts.map +1 -1
  582. package/dist/overlays/createModal.d.ts +3 -6
  583. package/dist/overlays/createModal.d.ts.map +1 -1
  584. package/dist/overlays/createOverlay.d.ts +1 -5
  585. package/dist/overlays/createOverlay.d.ts.map +1 -1
  586. package/dist/overlays/createOverlayTrigger.d.ts +2 -6
  587. package/dist/overlays/createOverlayTrigger.d.ts.map +1 -1
  588. package/dist/overlays/createPreventScroll.d.ts +0 -4
  589. package/dist/overlays/createPreventScroll.d.ts.map +1 -1
  590. package/dist/overlays/index.d.ts +1 -0
  591. package/dist/overlays/index.d.ts.map +1 -1
  592. package/dist/overlays/index.js +3 -2
  593. package/dist/overlays/index.jsx +3 -2
  594. package/dist/overlays/intl/index.d.ts +13 -0
  595. package/dist/overlays/intl/index.d.ts.map +1 -0
  596. package/dist/popover/calculatePosition.d.ts +1 -1
  597. package/dist/popover/calculatePosition.d.ts.map +1 -1
  598. package/dist/popover/createOverlayPosition.d.ts +1 -7
  599. package/dist/popover/createOverlayPosition.d.ts.map +1 -1
  600. package/dist/popover/createPopover.d.ts +6 -7
  601. package/dist/popover/createPopover.d.ts.map +1 -1
  602. package/dist/progress/createProgressBar.d.ts +2 -10
  603. package/dist/progress/createProgressBar.d.ts.map +1 -1
  604. package/dist/radio/createRadio.d.ts +8 -1
  605. package/dist/radio/createRadio.d.ts.map +1 -1
  606. package/dist/radio/createRadioGroup.d.ts +1 -9
  607. package/dist/radio/createRadioGroup.d.ts.map +1 -1
  608. package/dist/searchfield/createSearchField.d.ts +1 -1
  609. package/dist/searchfield/createSearchField.d.ts.map +1 -1
  610. package/dist/searchfield/intl/index.d.ts +13 -0
  611. package/dist/searchfield/intl/index.d.ts.map +1 -0
  612. package/dist/select/createHiddenSelect.d.ts +3 -10
  613. package/dist/select/createHiddenSelect.d.ts.map +1 -1
  614. package/dist/select/createSelect.d.ts +10 -6
  615. package/dist/select/createSelect.d.ts.map +1 -1
  616. package/dist/selection/DOMLayoutDelegate.d.ts.map +1 -1
  617. package/dist/selection/ListKeyboardDelegate.d.ts +2 -1
  618. package/dist/selection/ListKeyboardDelegate.d.ts.map +1 -1
  619. package/dist/selection/constants.d.ts.map +1 -1
  620. package/dist/selection/createCollectionRowInteraction.d.ts +12 -1
  621. package/dist/selection/createCollectionRowInteraction.d.ts.map +1 -1
  622. package/dist/selection/createScrollIntoViewOnFocus.d.ts +0 -11
  623. package/dist/selection/createScrollIntoViewOnFocus.d.ts.map +1 -1
  624. package/dist/selection/createSelectableCollection.d.ts +1 -23
  625. package/dist/selection/createSelectableCollection.d.ts.map +1 -1
  626. package/dist/selection/createSelectableItem.d.ts +2 -29
  627. package/dist/selection/createSelectableItem.d.ts.map +1 -1
  628. package/dist/selection/createSelectableList.d.ts +4 -17
  629. package/dist/selection/createSelectableList.d.ts.map +1 -1
  630. package/dist/selection/createTypeSelect.d.ts +2 -8
  631. package/dist/selection/createTypeSelect.d.ts.map +1 -1
  632. package/dist/selection/index.js +3 -2
  633. package/dist/selection/index.jsx +3 -2
  634. package/dist/selection/selectItem.d.ts.map +1 -1
  635. package/dist/selection/utils.d.ts +1 -1
  636. package/dist/selection/utils.d.ts.map +1 -1
  637. package/dist/separator/createSeparator.d.ts +3 -1
  638. package/dist/separator/createSeparator.d.ts.map +1 -1
  639. package/dist/slider/createSlider.d.ts +1 -6
  640. package/dist/slider/createSlider.d.ts.map +1 -1
  641. package/dist/spinbutton/createSpinButton.d.ts +0 -9
  642. package/dist/spinbutton/createSpinButton.d.ts.map +1 -1
  643. package/dist/spinbutton/index.d.ts +2 -2
  644. package/dist/spinbutton/index.d.ts.map +1 -1
  645. package/dist/spinbutton/intl.d.ts.map +1 -1
  646. package/dist/ssr/index.d.ts +3 -9
  647. package/dist/ssr/index.d.ts.map +1 -1
  648. package/dist/ssr/index.js +47 -26
  649. package/dist/ssr/index.js.map +1 -1
  650. package/dist/ssr/index.jsx +47 -26
  651. package/dist/ssr/index.jsx.map +1 -1
  652. package/dist/steplist/createStepList.d.ts +1 -1
  653. package/dist/steplist/createStepList.d.ts.map +1 -1
  654. package/dist/switch/createSwitch.d.ts +2 -1
  655. package/dist/switch/createSwitch.d.ts.map +1 -1
  656. package/dist/table/createTable.d.ts +1 -5
  657. package/dist/table/createTable.d.ts.map +1 -1
  658. package/dist/table/createTableCell.d.ts +1 -5
  659. package/dist/table/createTableCell.d.ts.map +1 -1
  660. package/dist/table/createTableColumnHeader.d.ts +1 -5
  661. package/dist/table/createTableColumnHeader.d.ts.map +1 -1
  662. package/dist/table/createTableColumnResize.d.ts +2 -8
  663. package/dist/table/createTableColumnResize.d.ts.map +1 -1
  664. package/dist/table/createTableHeaderRow.d.ts +1 -5
  665. package/dist/table/createTableHeaderRow.d.ts.map +1 -1
  666. package/dist/table/createTableRow.d.ts +1 -5
  667. package/dist/table/createTableRow.d.ts.map +1 -1
  668. package/dist/table/createTableRowGroup.d.ts +1 -5
  669. package/dist/table/createTableRowGroup.d.ts.map +1 -1
  670. package/dist/table/createTableSelectAllCheckbox.d.ts +1 -5
  671. package/dist/table/createTableSelectAllCheckbox.d.ts.map +1 -1
  672. package/dist/table/createTableSelectionCheckbox.d.ts +1 -5
  673. package/dist/table/createTableSelectionCheckbox.d.ts.map +1 -1
  674. package/dist/table/index.d.ts +2 -2
  675. package/dist/table/intl/index.d.ts +23 -0
  676. package/dist/table/intl/index.d.ts.map +1 -0
  677. package/dist/table/types.d.ts +44 -2
  678. package/dist/table/types.d.ts.map +1 -1
  679. package/dist/table/utils.d.ts.map +1 -1
  680. package/dist/tabs/createTabs.d.ts +5 -9
  681. package/dist/tabs/createTabs.d.ts.map +1 -1
  682. package/dist/tag/createTag.d.ts +4 -8
  683. package/dist/tag/createTag.d.ts.map +1 -1
  684. package/dist/tag/createTagGroup.d.ts +0 -9
  685. package/dist/tag/createTagGroup.d.ts.map +1 -1
  686. package/dist/tag/intl/index.d.ts +14 -0
  687. package/dist/tag/intl/index.d.ts.map +1 -0
  688. package/dist/textfield/createTextField.d.ts +6 -8
  689. package/dist/textfield/createTextField.d.ts.map +1 -1
  690. package/dist/toast/createToast.d.ts +1 -8
  691. package/dist/toast/createToast.d.ts.map +1 -1
  692. package/dist/toast/createToastRegion.d.ts +7 -18
  693. package/dist/toast/createToastRegion.d.ts.map +1 -1
  694. package/dist/toast/intl/index.d.ts +14 -0
  695. package/dist/toast/intl/index.d.ts.map +1 -0
  696. package/dist/toggle/createToggle.d.ts +8 -1
  697. package/dist/toggle/createToggle.d.ts.map +1 -1
  698. package/dist/tokenfield/createToken.d.ts +15 -0
  699. package/dist/tokenfield/createToken.d.ts.map +1 -0
  700. package/dist/tokenfield/createTokenField.d.ts +52 -0
  701. package/dist/tokenfield/createTokenField.d.ts.map +1 -0
  702. package/dist/tokenfield/index.d.ts +3 -0
  703. package/dist/tokenfield/index.d.ts.map +1 -0
  704. package/dist/tokenfield/index.js +2 -0
  705. package/dist/tokenfield/index.jsx +2 -0
  706. package/dist/toolbar/createToolbar.d.ts +1 -1
  707. package/dist/toolbar/createToolbar.d.ts.map +1 -1
  708. package/dist/tooltip/createPreviewTrigger.d.ts +23 -0
  709. package/dist/tooltip/createPreviewTrigger.d.ts.map +1 -0
  710. package/dist/tooltip/createSafeArea.d.ts +20 -0
  711. package/dist/tooltip/createSafeArea.d.ts.map +1 -0
  712. package/dist/tooltip/createTooltip.d.ts +1 -1
  713. package/dist/tooltip/createTooltip.d.ts.map +1 -1
  714. package/dist/tooltip/createTooltipTrigger.d.ts +1 -9
  715. package/dist/tooltip/createTooltipTrigger.d.ts.map +1 -1
  716. package/dist/tooltip/index.d.ts +2 -0
  717. package/dist/tooltip/index.d.ts.map +1 -1
  718. package/dist/tooltip/index.js +2 -2
  719. package/dist/tooltip/index.jsx +2 -2
  720. package/dist/tooltip/intl/index.d.ts +4 -0
  721. package/dist/tooltip/intl/index.d.ts.map +1 -0
  722. package/dist/tree/createTree.d.ts +1 -5
  723. package/dist/tree/createTree.d.ts.map +1 -1
  724. package/dist/tree/createTreeItem.d.ts +1 -5
  725. package/dist/tree/createTreeItem.d.ts.map +1 -1
  726. package/dist/tree/createTreeSelectionCheckbox.d.ts +1 -5
  727. package/dist/tree/createTreeSelectionCheckbox.d.ts.map +1 -1
  728. package/dist/tree/intl/index.d.ts +14 -0
  729. package/dist/tree/intl/index.d.ts.map +1 -0
  730. package/dist/tree/types.d.ts +35 -2
  731. package/dist/tree/types.d.ts.map +1 -1
  732. package/dist/utils/ShadowTreeWalker.d.ts +30 -0
  733. package/dist/utils/ShadowTreeWalker.d.ts.map +1 -0
  734. package/dist/utils/animation.d.ts +1 -29
  735. package/dist/utils/animation.d.ts.map +1 -1
  736. package/dist/utils/capture.d.ts +14 -0
  737. package/dist/utils/capture.d.ts.map +1 -0
  738. package/dist/utils/createDescription.d.ts +1 -25
  739. package/dist/utils/createDescription.d.ts.map +1 -1
  740. package/dist/utils/dom.d.ts +45 -11
  741. package/dist/utils/dom.d.ts.map +1 -1
  742. package/dist/utils/domAttrs.d.ts +16 -0
  743. package/dist/utils/domAttrs.d.ts.map +1 -0
  744. package/dist/utils/env.d.ts +2 -0
  745. package/dist/utils/env.d.ts.map +1 -1
  746. package/dist/utils/events.d.ts +0 -4
  747. package/dist/utils/events.d.ts.map +1 -1
  748. package/dist/utils/filterDOMProps.d.ts +0 -6
  749. package/dist/utils/filterDOMProps.d.ts.map +1 -1
  750. package/dist/utils/focus.d.ts +19 -6
  751. package/dist/utils/focus.d.ts.map +1 -1
  752. package/dist/utils/geometry.d.ts +1 -1
  753. package/dist/utils/geometry.d.ts.map +1 -1
  754. package/dist/utils/getMetaValue.d.ts +13 -0
  755. package/dist/utils/getMetaValue.d.ts.map +1 -0
  756. package/dist/utils/getNonce.d.ts +9 -0
  757. package/dist/utils/getNonce.d.ts.map +1 -0
  758. package/dist/utils/globalListeners.d.ts +0 -6
  759. package/dist/utils/globalListeners.d.ts.map +1 -1
  760. package/dist/utils/index.d.ts +6 -1
  761. package/dist/utils/index.d.ts.map +1 -1
  762. package/dist/utils/index.js +7 -4
  763. package/dist/utils/index.jsx +7 -4
  764. package/dist/utils/keyboard.d.ts +0 -4
  765. package/dist/utils/keyboard.d.ts.map +1 -1
  766. package/dist/utils/mergeProps.d.ts +5 -2
  767. package/dist/utils/mergeProps.d.ts.map +1 -1
  768. package/dist/utils/owner.d.ts +14 -0
  769. package/dist/utils/owner.d.ts.map +1 -0
  770. package/dist/utils/platform.d.ts +0 -4
  771. package/dist/utils/platform.d.ts.map +1 -1
  772. package/dist/utils/reactivity.d.ts +2 -0
  773. package/dist/utils/reactivity.d.ts.map +1 -1
  774. package/dist/utils/refs.d.ts +20 -0
  775. package/dist/utils/refs.d.ts.map +1 -0
  776. package/dist/utils/runAfterTransition.d.ts +2 -0
  777. package/dist/utils/runAfterTransition.d.ts.map +1 -0
  778. package/dist/utils/scrollIntoView.d.ts +0 -4
  779. package/dist/utils/scrollIntoView.d.ts.map +1 -1
  780. package/dist/utils/splitProps.d.ts +17 -0
  781. package/dist/utils/splitProps.d.ts.map +1 -0
  782. package/dist/utils/textSelection.d.ts +0 -8
  783. package/dist/utils/textSelection.d.ts.map +1 -1
  784. package/dist/virtualizer/ScrollView.d.ts +38 -0
  785. package/dist/virtualizer/ScrollView.d.ts.map +1 -0
  786. package/dist/virtualizer/index.d.ts +3 -0
  787. package/dist/virtualizer/index.d.ts.map +1 -0
  788. package/dist/virtualizer/index.js +2 -0
  789. package/dist/virtualizer/index.jsx +2 -0
  790. package/dist/virtualizer/utils.d.ts +10 -0
  791. package/dist/virtualizer/utils.d.ts.map +1 -0
  792. package/dist/visually-hidden/createVisuallyHidden.d.ts +2 -9
  793. package/dist/visually-hidden/createVisuallyHidden.d.ts.map +1 -1
  794. package/dist/visually-hidden/index.js +1 -1
  795. package/dist/visually-hidden/index.jsx +1 -1
  796. package/package.json +30 -11
  797. package/src/actiongroup/createActionGroup.ts +49 -27
  798. package/src/autocomplete/createAutocomplete.ts +32 -5
  799. package/src/autocomplete/intl/ar-AE.json +3 -0
  800. package/src/autocomplete/intl/bg-BG.json +3 -0
  801. package/src/autocomplete/intl/cs-CZ.json +3 -0
  802. package/src/autocomplete/intl/da-DK.json +3 -0
  803. package/src/autocomplete/intl/de-DE.json +3 -0
  804. package/src/autocomplete/intl/el-GR.json +3 -0
  805. package/src/autocomplete/intl/en-US.json +3 -0
  806. package/src/autocomplete/intl/es-ES.json +3 -0
  807. package/src/autocomplete/intl/et-EE.json +3 -0
  808. package/src/autocomplete/intl/fi-FI.json +3 -0
  809. package/src/autocomplete/intl/fr-FR.json +3 -0
  810. package/src/autocomplete/intl/he-IL.json +3 -0
  811. package/src/autocomplete/intl/hr-HR.json +3 -0
  812. package/src/autocomplete/intl/hu-HU.json +3 -0
  813. package/src/autocomplete/intl/index.ts +122 -0
  814. package/src/autocomplete/intl/it-IT.json +3 -0
  815. package/src/autocomplete/intl/ja-JP.json +3 -0
  816. package/src/autocomplete/intl/ko-KR.json +3 -0
  817. package/src/autocomplete/intl/lt-LT.json +3 -0
  818. package/src/autocomplete/intl/lv-LV.json +3 -0
  819. package/src/autocomplete/intl/nb-NO.json +3 -0
  820. package/src/autocomplete/intl/nl-NL.json +3 -0
  821. package/src/autocomplete/intl/pl-PL.json +3 -0
  822. package/src/autocomplete/intl/pt-BR.json +3 -0
  823. package/src/autocomplete/intl/pt-PT.json +3 -0
  824. package/src/autocomplete/intl/ro-RO.json +3 -0
  825. package/src/autocomplete/intl/ru-RU.json +3 -0
  826. package/src/autocomplete/intl/sk-SK.json +3 -0
  827. package/src/autocomplete/intl/sl-SI.json +3 -0
  828. package/src/autocomplete/intl/sr-SP.json +3 -0
  829. package/src/autocomplete/intl/sv-SE.json +3 -0
  830. package/src/autocomplete/intl/tr-TR.json +3 -0
  831. package/src/autocomplete/intl/uk-UA.json +3 -0
  832. package/src/autocomplete/intl/zh-CN.json +3 -0
  833. package/src/autocomplete/intl/zh-TW.json +3 -0
  834. package/src/breadcrumbs/createBreadcrumbs.ts +18 -1
  835. package/src/breadcrumbs/intl/ar-AE.json +3 -0
  836. package/src/breadcrumbs/intl/bg-BG.json +3 -0
  837. package/src/breadcrumbs/intl/cs-CZ.json +3 -0
  838. package/src/breadcrumbs/intl/da-DK.json +3 -0
  839. package/src/breadcrumbs/intl/de-DE.json +3 -0
  840. package/src/breadcrumbs/intl/el-GR.json +3 -0
  841. package/src/breadcrumbs/intl/en-US.json +3 -0
  842. package/src/breadcrumbs/intl/es-ES.json +3 -0
  843. package/src/breadcrumbs/intl/et-EE.json +3 -0
  844. package/src/breadcrumbs/intl/fi-FI.json +3 -0
  845. package/src/breadcrumbs/intl/fr-FR.json +3 -0
  846. package/src/breadcrumbs/intl/he-IL.json +3 -0
  847. package/src/breadcrumbs/intl/hr-HR.json +3 -0
  848. package/src/breadcrumbs/intl/hu-HU.json +3 -0
  849. package/src/breadcrumbs/intl/index.ts +122 -0
  850. package/src/breadcrumbs/intl/it-IT.json +3 -0
  851. package/src/breadcrumbs/intl/ja-JP.json +3 -0
  852. package/src/breadcrumbs/intl/ko-KR.json +3 -0
  853. package/src/breadcrumbs/intl/lt-LT.json +3 -0
  854. package/src/breadcrumbs/intl/lv-LV.json +3 -0
  855. package/src/breadcrumbs/intl/nb-NO.json +3 -0
  856. package/src/breadcrumbs/intl/nl-NL.json +3 -0
  857. package/src/breadcrumbs/intl/pl-PL.json +3 -0
  858. package/src/breadcrumbs/intl/pt-BR.json +3 -0
  859. package/src/breadcrumbs/intl/pt-PT.json +3 -0
  860. package/src/breadcrumbs/intl/ro-RO.json +3 -0
  861. package/src/breadcrumbs/intl/ru-RU.json +3 -0
  862. package/src/breadcrumbs/intl/sk-SK.json +3 -0
  863. package/src/breadcrumbs/intl/sl-SI.json +3 -0
  864. package/src/breadcrumbs/intl/sr-SP.json +3 -0
  865. package/src/breadcrumbs/intl/sv-SE.json +3 -0
  866. package/src/breadcrumbs/intl/tr-TR.json +3 -0
  867. package/src/breadcrumbs/intl/uk-UA.json +3 -0
  868. package/src/breadcrumbs/intl/zh-CN.json +3 -0
  869. package/src/breadcrumbs/intl/zh-TW.json +3 -0
  870. package/src/button/createButton.ts +15 -1
  871. package/src/button/createToggleButton.ts +18 -5
  872. package/src/button/createToggleButtonGroup.ts +23 -8
  873. package/src/button/types.ts +16 -0
  874. package/src/calendar/createCalendar.ts +22 -3
  875. package/src/calendar/createCalendarCell.ts +104 -15
  876. package/src/calendar/createCalendarGrid.ts +37 -13
  877. package/src/calendar/createCalendarMonthPicker.ts +14 -0
  878. package/src/calendar/createCalendarYearPicker.ts +14 -0
  879. package/src/calendar/createRangeCalendar.ts +124 -1
  880. package/src/calendar/createRangeCalendarCell.ts +179 -40
  881. package/src/calendar/intl/index.ts +37 -0
  882. package/src/calendar/utils.ts +14 -0
  883. package/src/checkbox/createCheckbox.ts +32 -17
  884. package/src/checkbox/createCheckboxGroup.ts +31 -13
  885. package/src/checkbox/createCheckboxGroupItem.ts +15 -1
  886. package/src/collections/index.ts +21 -3
  887. package/src/color/createColorArea.ts +226 -29
  888. package/src/color/createColorField.ts +98 -22
  889. package/src/color/createColorSlider.ts +24 -3
  890. package/src/color/createColorSwatch.ts +18 -1
  891. package/src/color/createColorWheel.ts +27 -5
  892. package/src/color/intl/index.ts +35 -0
  893. package/src/color/types.ts +47 -1
  894. package/src/combobox/createComboBox.ts +303 -152
  895. package/src/combobox/intl/generated-locales.ts +38 -1
  896. package/src/combobox/intl/index.ts +38 -2
  897. package/src/datepicker/createDateField.ts +38 -22
  898. package/src/datepicker/createDatePicker.ts +14 -0
  899. package/src/datepicker/createDatePickerGroup.ts +24 -12
  900. package/src/datepicker/createDateRangePicker.ts +14 -0
  901. package/src/datepicker/createDateSegment.ts +110 -46
  902. package/src/datepicker/createDisplayNames.ts +16 -1
  903. package/src/datepicker/createTimeField.ts +15 -5
  904. package/src/datepicker/intl.ts +623 -544
  905. package/src/dialog/createDialog.ts +57 -30
  906. package/src/dialog/types.ts +14 -0
  907. package/src/disclosure/createDisclosure.ts +28 -6
  908. package/src/disclosure/createDisclosureGroup.ts +3 -4
  909. package/src/dnd/DragManager.ts +60 -9
  910. package/src/dnd/DropTargetKeyboardNavigation.ts +8 -6
  911. package/src/dnd/createDrag.ts +18 -1
  912. package/src/dnd/createDraggableCollection.ts +96 -32
  913. package/src/dnd/createDraggableItem.ts +73 -31
  914. package/src/dnd/createDrop.ts +18 -1
  915. package/src/dnd/createDropIndicator.ts +92 -0
  916. package/src/dnd/createDroppableCollection.ts +113 -48
  917. package/src/dnd/createDroppableItem.ts +161 -13
  918. package/src/dnd/index.ts +3 -0
  919. package/src/dnd/intl/index.ts +77 -66
  920. package/src/dnd/types.ts +20 -1
  921. package/src/dnd/utils.ts +19 -0
  922. package/src/focus/FocusScope.tsx +542 -157
  923. package/src/focus/createAutoFocus.ts +94 -68
  924. package/src/focus/createFocusRestore.ts +16 -12
  925. package/src/focus/createHasTabbableChild.ts +78 -0
  926. package/src/focus/createVirtualFocus.ts +21 -5
  927. package/src/focus/virtualFocus.ts +1 -1
  928. package/src/form/createFormReset.ts +40 -17
  929. package/src/form/createFormValidation.ts +128 -86
  930. package/src/grid/GridKeyboardDelegate.ts +14 -0
  931. package/src/grid/createGrid.ts +17 -2
  932. package/src/grid/createGridCell.ts +17 -2
  933. package/src/grid/createGridRow.ts +17 -2
  934. package/src/grid/index.ts +2 -2
  935. package/src/grid/intl/ar-AE.json +8 -0
  936. package/src/grid/intl/bg-BG.json +8 -0
  937. package/src/grid/intl/cs-CZ.json +8 -0
  938. package/src/grid/intl/da-DK.json +8 -0
  939. package/src/grid/intl/de-DE.json +8 -0
  940. package/src/grid/intl/el-GR.json +8 -0
  941. package/src/grid/intl/en-US.json +8 -0
  942. package/src/grid/intl/es-ES.json +8 -0
  943. package/src/grid/intl/et-EE.json +8 -0
  944. package/src/grid/intl/fi-FI.json +8 -0
  945. package/src/grid/intl/fr-FR.json +8 -0
  946. package/src/grid/intl/he-IL.json +8 -0
  947. package/src/grid/intl/hr-HR.json +8 -0
  948. package/src/grid/intl/hu-HU.json +8 -0
  949. package/src/grid/intl/index.ts +127 -0
  950. package/src/grid/intl/it-IT.json +8 -0
  951. package/src/grid/intl/ja-JP.json +8 -0
  952. package/src/grid/intl/ko-KR.json +8 -0
  953. package/src/grid/intl/lt-LT.json +8 -0
  954. package/src/grid/intl/lv-LV.json +8 -0
  955. package/src/grid/intl/nb-NO.json +8 -0
  956. package/src/grid/intl/nl-NL.json +8 -0
  957. package/src/grid/intl/pl-PL.json +8 -0
  958. package/src/grid/intl/pt-BR.json +8 -0
  959. package/src/grid/intl/pt-PT.json +8 -0
  960. package/src/grid/intl/ro-RO.json +8 -0
  961. package/src/grid/intl/ru-RU.json +8 -0
  962. package/src/grid/intl/sk-SK.json +8 -0
  963. package/src/grid/intl/sl-SI.json +8 -0
  964. package/src/grid/intl/sr-SP.json +8 -0
  965. package/src/grid/intl/sv-SE.json +8 -0
  966. package/src/grid/intl/tr-TR.json +8 -0
  967. package/src/grid/intl/uk-UA.json +8 -0
  968. package/src/grid/intl/zh-CN.json +8 -0
  969. package/src/grid/intl/zh-TW.json +8 -0
  970. package/src/grid/types.ts +25 -2
  971. package/src/gridlist/createGridList.ts +172 -42
  972. package/src/gridlist/createGridListItem.ts +51 -13
  973. package/src/gridlist/createGridListSection.ts +14 -0
  974. package/src/gridlist/createGridListSelectionCheckbox.ts +31 -4
  975. package/src/gridlist/intl/ar-AE.json +4 -0
  976. package/src/gridlist/intl/bg-BG.json +4 -0
  977. package/src/gridlist/intl/cs-CZ.json +4 -0
  978. package/src/gridlist/intl/da-DK.json +4 -0
  979. package/src/gridlist/intl/de-DE.json +4 -0
  980. package/src/gridlist/intl/el-GR.json +4 -0
  981. package/src/gridlist/intl/en-US.json +4 -0
  982. package/src/gridlist/intl/es-ES.json +4 -0
  983. package/src/gridlist/intl/et-EE.json +4 -0
  984. package/src/gridlist/intl/fi-FI.json +4 -0
  985. package/src/gridlist/intl/fr-FR.json +4 -0
  986. package/src/gridlist/intl/he-IL.json +4 -0
  987. package/src/gridlist/intl/hr-HR.json +4 -0
  988. package/src/gridlist/intl/hu-HU.json +4 -0
  989. package/src/gridlist/intl/index.ts +123 -0
  990. package/src/gridlist/intl/it-IT.json +4 -0
  991. package/src/gridlist/intl/ja-JP.json +4 -0
  992. package/src/gridlist/intl/ko-KR.json +4 -0
  993. package/src/gridlist/intl/lt-LT.json +4 -0
  994. package/src/gridlist/intl/lv-LV.json +4 -0
  995. package/src/gridlist/intl/nb-NO.json +4 -0
  996. package/src/gridlist/intl/nl-NL.json +4 -0
  997. package/src/gridlist/intl/pl-PL.json +4 -0
  998. package/src/gridlist/intl/pt-BR.json +4 -0
  999. package/src/gridlist/intl/pt-PT.json +4 -0
  1000. package/src/gridlist/intl/ro-RO.json +4 -0
  1001. package/src/gridlist/intl/ru-RU.json +4 -0
  1002. package/src/gridlist/intl/sk-SK.json +4 -0
  1003. package/src/gridlist/intl/sl-SI.json +4 -0
  1004. package/src/gridlist/intl/sr-SP.json +4 -0
  1005. package/src/gridlist/intl/sv-SE.json +4 -0
  1006. package/src/gridlist/intl/tr-TR.json +4 -0
  1007. package/src/gridlist/intl/uk-UA.json +4 -0
  1008. package/src/gridlist/intl/zh-CN.json +4 -0
  1009. package/src/gridlist/intl/zh-TW.json +4 -0
  1010. package/src/gridlist/types.ts +54 -2
  1011. package/src/i18n/compileIcu.ts +440 -0
  1012. package/src/i18n/createCollator.ts +14 -0
  1013. package/src/i18n/createDateFormatter.ts +14 -0
  1014. package/src/i18n/createFilter.ts +14 -0
  1015. package/src/i18n/createListFormatter.ts +38 -0
  1016. package/src/i18n/createNumberFormatter.ts +14 -0
  1017. package/src/i18n/createStringFormatter.ts +64 -8
  1018. package/src/i18n/index.ts +3 -0
  1019. package/src/i18n/locale.tsx +60 -19
  1020. package/src/i18n/utils.ts +14 -0
  1021. package/src/index.ts +49 -1
  1022. package/src/interactions/FocusableProvider.tsx +28 -11
  1023. package/src/interactions/PressEvent.ts +16 -1
  1024. package/src/interactions/createContextMenu.ts +108 -0
  1025. package/src/interactions/createFocus.ts +26 -6
  1026. package/src/interactions/createFocusRing.ts +28 -13
  1027. package/src/interactions/createFocusWithin.ts +23 -3
  1028. package/src/interactions/createFocusable.ts +45 -28
  1029. package/src/interactions/createHover.ts +102 -81
  1030. package/src/interactions/createInteractionModality.ts +135 -45
  1031. package/src/interactions/createKeyboard.ts +85 -9
  1032. package/src/interactions/createKeyboardShortcutHandler.ts +157 -0
  1033. package/src/interactions/createLongPress.ts +31 -9
  1034. package/src/interactions/createMove.ts +24 -3
  1035. package/src/interactions/createPress.ts +85 -41
  1036. package/src/interactions/index.ts +1 -0
  1037. package/src/label/createField.ts +58 -63
  1038. package/src/label/createLabel.ts +21 -4
  1039. package/src/label/createLabels.ts +25 -1
  1040. package/src/landmark/createLandmark.ts +27 -4
  1041. package/src/link/createLink.ts +20 -12
  1042. package/src/listbox/createListBox.ts +86 -310
  1043. package/src/listbox/createOption.ts +50 -14
  1044. package/src/live-announcer/announce.ts +21 -6
  1045. package/src/menu/createMenu.ts +92 -5
  1046. package/src/menu/createMenuItem.ts +40 -23
  1047. package/src/menu/createMenuTrigger.ts +179 -51
  1048. package/src/menu/index.ts +2 -0
  1049. package/src/menu/intl/index.ts +130 -0
  1050. package/src/meter/createMeter.ts +20 -5
  1051. package/src/numberfield/createNumberField.ts +254 -14
  1052. package/src/overlays/ariaHideOutside.ts +76 -11
  1053. package/src/overlays/createInteractOutside.ts +74 -47
  1054. package/src/overlays/createModal.tsx +42 -27
  1055. package/src/overlays/createOverlay.ts +107 -66
  1056. package/src/overlays/createOverlayTrigger.ts +21 -6
  1057. package/src/overlays/createPreventScroll.ts +92 -62
  1058. package/src/overlays/index.ts +2 -0
  1059. package/src/overlays/intl/ar-AE.json +3 -0
  1060. package/src/overlays/intl/bg-BG.json +3 -0
  1061. package/src/overlays/intl/cs-CZ.json +3 -0
  1062. package/src/overlays/intl/da-DK.json +3 -0
  1063. package/src/overlays/intl/de-DE.json +3 -0
  1064. package/src/overlays/intl/el-GR.json +3 -0
  1065. package/src/overlays/intl/en-US.json +3 -0
  1066. package/src/overlays/intl/es-ES.json +3 -0
  1067. package/src/overlays/intl/et-EE.json +3 -0
  1068. package/src/overlays/intl/fi-FI.json +3 -0
  1069. package/src/overlays/intl/fr-FR.json +3 -0
  1070. package/src/overlays/intl/he-IL.json +3 -0
  1071. package/src/overlays/intl/hr-HR.json +3 -0
  1072. package/src/overlays/intl/hu-HU.json +3 -0
  1073. package/src/overlays/intl/index.ts +122 -0
  1074. package/src/overlays/intl/it-IT.json +3 -0
  1075. package/src/overlays/intl/ja-JP.json +3 -0
  1076. package/src/overlays/intl/ko-KR.json +3 -0
  1077. package/src/overlays/intl/lt-LT.json +3 -0
  1078. package/src/overlays/intl/lv-LV.json +3 -0
  1079. package/src/overlays/intl/nb-NO.json +3 -0
  1080. package/src/overlays/intl/nl-NL.json +3 -0
  1081. package/src/overlays/intl/pl-PL.json +3 -0
  1082. package/src/overlays/intl/pt-BR.json +3 -0
  1083. package/src/overlays/intl/pt-PT.json +3 -0
  1084. package/src/overlays/intl/ro-RO.json +3 -0
  1085. package/src/overlays/intl/ru-RU.json +3 -0
  1086. package/src/overlays/intl/sk-SK.json +3 -0
  1087. package/src/overlays/intl/sl-SI.json +3 -0
  1088. package/src/overlays/intl/sr-SP.json +3 -0
  1089. package/src/overlays/intl/sv-SE.json +3 -0
  1090. package/src/overlays/intl/tr-TR.json +3 -0
  1091. package/src/overlays/intl/uk-UA.json +3 -0
  1092. package/src/overlays/intl/zh-CN.json +3 -0
  1093. package/src/overlays/intl/zh-TW.json +3 -0
  1094. package/src/popover/calculatePosition.ts +21 -3
  1095. package/src/popover/createOverlayPosition.ts +149 -41
  1096. package/src/popover/createPopover.ts +88 -23
  1097. package/src/progress/createProgressBar.ts +19 -4
  1098. package/src/radio/createRadio.ts +80 -25
  1099. package/src/radio/createRadioGroup.ts +47 -13
  1100. package/src/searchfield/createSearchField.ts +31 -2
  1101. package/src/searchfield/intl/ar-AE.json +3 -0
  1102. package/src/searchfield/intl/bg-BG.json +3 -0
  1103. package/src/searchfield/intl/cs-CZ.json +3 -0
  1104. package/src/searchfield/intl/da-DK.json +3 -0
  1105. package/src/searchfield/intl/de-DE.json +3 -0
  1106. package/src/searchfield/intl/el-GR.json +3 -0
  1107. package/src/searchfield/intl/en-US.json +3 -0
  1108. package/src/searchfield/intl/es-ES.json +3 -0
  1109. package/src/searchfield/intl/et-EE.json +3 -0
  1110. package/src/searchfield/intl/fi-FI.json +3 -0
  1111. package/src/searchfield/intl/fr-FR.json +3 -0
  1112. package/src/searchfield/intl/he-IL.json +3 -0
  1113. package/src/searchfield/intl/hr-HR.json +3 -0
  1114. package/src/searchfield/intl/hu-HU.json +3 -0
  1115. package/src/searchfield/intl/index.ts +122 -0
  1116. package/src/searchfield/intl/it-IT.json +3 -0
  1117. package/src/searchfield/intl/ja-JP.json +3 -0
  1118. package/src/searchfield/intl/ko-KR.json +3 -0
  1119. package/src/searchfield/intl/lt-LT.json +3 -0
  1120. package/src/searchfield/intl/lv-LV.json +3 -0
  1121. package/src/searchfield/intl/nb-NO.json +3 -0
  1122. package/src/searchfield/intl/nl-NL.json +3 -0
  1123. package/src/searchfield/intl/pl-PL.json +3 -0
  1124. package/src/searchfield/intl/pt-BR.json +3 -0
  1125. package/src/searchfield/intl/pt-PT.json +3 -0
  1126. package/src/searchfield/intl/ro-RO.json +3 -0
  1127. package/src/searchfield/intl/ru-RU.json +3 -0
  1128. package/src/searchfield/intl/sk-SK.json +3 -0
  1129. package/src/searchfield/intl/sl-SI.json +3 -0
  1130. package/src/searchfield/intl/sr-SP.json +3 -0
  1131. package/src/searchfield/intl/sv-SE.json +3 -0
  1132. package/src/searchfield/intl/tr-TR.json +3 -0
  1133. package/src/searchfield/intl/uk-UA.json +3 -0
  1134. package/src/searchfield/intl/zh-CN.json +3 -0
  1135. package/src/searchfield/intl/zh-TW.json +3 -0
  1136. package/src/select/createHiddenSelect.tsx +166 -69
  1137. package/src/select/createSelect.ts +80 -34
  1138. package/src/selection/DOMLayoutDelegate.ts +14 -0
  1139. package/src/selection/ListKeyboardDelegate.ts +16 -1
  1140. package/src/selection/constants.ts +14 -0
  1141. package/src/selection/createCollectionRowInteraction.ts +75 -6
  1142. package/src/selection/createScrollIntoViewOnFocus.ts +23 -8
  1143. package/src/selection/createSelectableCollection.ts +352 -226
  1144. package/src/selection/createSelectableItem.ts +51 -12
  1145. package/src/selection/createSelectableList.ts +21 -1
  1146. package/src/selection/createTypeSelect.ts +21 -5
  1147. package/src/selection/selectItem.ts +14 -0
  1148. package/src/selection/utils.ts +15 -1
  1149. package/src/separator/createSeparator.ts +17 -1
  1150. package/src/slider/createSlider.ts +24 -18
  1151. package/src/spinbutton/createSpinButton.ts +16 -2
  1152. package/src/spinbutton/index.ts +2 -10
  1153. package/src/spinbutton/intl.ts +70 -34
  1154. package/src/ssr/index.tsx +79 -48
  1155. package/src/steplist/createStepList.ts +17 -2
  1156. package/src/switch/createSwitch.ts +25 -4
  1157. package/src/table/createTable.ts +104 -52
  1158. package/src/table/createTableCell.ts +17 -2
  1159. package/src/table/createTableColumnHeader.ts +21 -3
  1160. package/src/table/createTableColumnResize.ts +19 -3
  1161. package/src/table/createTableHeaderRow.ts +17 -2
  1162. package/src/table/createTableRow.ts +29 -22
  1163. package/src/table/createTableRowGroup.ts +18 -3
  1164. package/src/table/createTableSelectAllCheckbox.ts +30 -14
  1165. package/src/table/createTableSelectionCheckbox.ts +21 -3
  1166. package/src/table/index.ts +2 -2
  1167. package/src/table/intl/ar-AE.json +13 -0
  1168. package/src/table/intl/bg-BG.json +13 -0
  1169. package/src/table/intl/cs-CZ.json +13 -0
  1170. package/src/table/intl/da-DK.json +13 -0
  1171. package/src/table/intl/de-DE.json +13 -0
  1172. package/src/table/intl/el-GR.json +13 -0
  1173. package/src/table/intl/en-US.json +13 -0
  1174. package/src/table/intl/es-ES.json +13 -0
  1175. package/src/table/intl/et-EE.json +13 -0
  1176. package/src/table/intl/fi-FI.json +13 -0
  1177. package/src/table/intl/fr-FR.json +13 -0
  1178. package/src/table/intl/he-IL.json +13 -0
  1179. package/src/table/intl/hr-HR.json +13 -0
  1180. package/src/table/intl/hu-HU.json +13 -0
  1181. package/src/table/intl/index.ts +132 -0
  1182. package/src/table/intl/it-IT.json +13 -0
  1183. package/src/table/intl/ja-JP.json +13 -0
  1184. package/src/table/intl/ko-KR.json +13 -0
  1185. package/src/table/intl/lt-LT.json +13 -0
  1186. package/src/table/intl/lv-LV.json +13 -0
  1187. package/src/table/intl/nb-NO.json +13 -0
  1188. package/src/table/intl/nl-NL.json +13 -0
  1189. package/src/table/intl/pl-PL.json +13 -0
  1190. package/src/table/intl/pt-BR.json +13 -0
  1191. package/src/table/intl/pt-PT.json +13 -0
  1192. package/src/table/intl/ro-RO.json +13 -0
  1193. package/src/table/intl/ru-RU.json +13 -0
  1194. package/src/table/intl/sk-SK.json +13 -0
  1195. package/src/table/intl/sl-SI.json +13 -0
  1196. package/src/table/intl/sr-SP.json +13 -0
  1197. package/src/table/intl/sv-SE.json +13 -0
  1198. package/src/table/intl/tr-TR.json +13 -0
  1199. package/src/table/intl/uk-UA.json +13 -0
  1200. package/src/table/intl/zh-CN.json +13 -0
  1201. package/src/table/intl/zh-TW.json +13 -0
  1202. package/src/table/types.ts +44 -2
  1203. package/src/table/utils.ts +15 -6
  1204. package/src/tabs/createTabs.ts +104 -37
  1205. package/src/tag/createTag.ts +118 -37
  1206. package/src/tag/createTagGroup.ts +20 -12
  1207. package/src/tag/intl/ar-AE.json +4 -0
  1208. package/src/tag/intl/bg-BG.json +4 -0
  1209. package/src/tag/intl/cs-CZ.json +4 -0
  1210. package/src/tag/intl/da-DK.json +4 -0
  1211. package/src/tag/intl/de-DE.json +4 -0
  1212. package/src/tag/intl/el-GR.json +4 -0
  1213. package/src/tag/intl/en-US.json +4 -0
  1214. package/src/tag/intl/es-ES.json +4 -0
  1215. package/src/tag/intl/et-EE.json +4 -0
  1216. package/src/tag/intl/fi-FI.json +4 -0
  1217. package/src/tag/intl/fr-FR.json +4 -0
  1218. package/src/tag/intl/he-IL.json +4 -0
  1219. package/src/tag/intl/hr-HR.json +4 -0
  1220. package/src/tag/intl/hu-HU.json +4 -0
  1221. package/src/tag/intl/index.ts +123 -0
  1222. package/src/tag/intl/it-IT.json +4 -0
  1223. package/src/tag/intl/ja-JP.json +4 -0
  1224. package/src/tag/intl/ko-KR.json +4 -0
  1225. package/src/tag/intl/lt-LT.json +4 -0
  1226. package/src/tag/intl/lv-LV.json +4 -0
  1227. package/src/tag/intl/nb-NO.json +4 -0
  1228. package/src/tag/intl/nl-NL.json +4 -0
  1229. package/src/tag/intl/pl-PL.json +4 -0
  1230. package/src/tag/intl/pt-BR.json +4 -0
  1231. package/src/tag/intl/pt-PT.json +4 -0
  1232. package/src/tag/intl/ro-RO.json +4 -0
  1233. package/src/tag/intl/ru-RU.json +4 -0
  1234. package/src/tag/intl/sk-SK.json +4 -0
  1235. package/src/tag/intl/sl-SI.json +4 -0
  1236. package/src/tag/intl/sr-SP.json +4 -0
  1237. package/src/tag/intl/sv-SE.json +4 -0
  1238. package/src/tag/intl/tr-TR.json +4 -0
  1239. package/src/tag/intl/uk-UA.json +4 -0
  1240. package/src/tag/intl/zh-CN.json +4 -0
  1241. package/src/tag/intl/zh-TW.json +4 -0
  1242. package/src/textfield/createTextField.ts +104 -14
  1243. package/src/toast/createToast.ts +39 -6
  1244. package/src/toast/createToastRegion.ts +28 -15
  1245. package/src/toast/intl/ar-AE.json +4 -0
  1246. package/src/toast/intl/bg-BG.json +4 -0
  1247. package/src/toast/intl/cs-CZ.json +4 -0
  1248. package/src/toast/intl/da-DK.json +4 -0
  1249. package/src/toast/intl/de-DE.json +4 -0
  1250. package/src/toast/intl/el-GR.json +4 -0
  1251. package/src/toast/intl/en-US.json +4 -0
  1252. package/src/toast/intl/es-ES.json +4 -0
  1253. package/src/toast/intl/et-EE.json +4 -0
  1254. package/src/toast/intl/fi-FI.json +4 -0
  1255. package/src/toast/intl/fr-FR.json +4 -0
  1256. package/src/toast/intl/he-IL.json +4 -0
  1257. package/src/toast/intl/hr-HR.json +4 -0
  1258. package/src/toast/intl/hu-HU.json +4 -0
  1259. package/src/toast/intl/index.ts +123 -0
  1260. package/src/toast/intl/it-IT.json +4 -0
  1261. package/src/toast/intl/ja-JP.json +4 -0
  1262. package/src/toast/intl/ko-KR.json +4 -0
  1263. package/src/toast/intl/lt-LT.json +4 -0
  1264. package/src/toast/intl/lv-LV.json +4 -0
  1265. package/src/toast/intl/nb-NO.json +4 -0
  1266. package/src/toast/intl/nl-NL.json +4 -0
  1267. package/src/toast/intl/pl-PL.json +4 -0
  1268. package/src/toast/intl/pt-BR.json +4 -0
  1269. package/src/toast/intl/pt-PT.json +4 -0
  1270. package/src/toast/intl/ro-RO.json +4 -0
  1271. package/src/toast/intl/ru-RU.json +4 -0
  1272. package/src/toast/intl/sk-SK.json +4 -0
  1273. package/src/toast/intl/sl-SI.json +4 -0
  1274. package/src/toast/intl/sr-SP.json +4 -0
  1275. package/src/toast/intl/sv-SE.json +4 -0
  1276. package/src/toast/intl/tr-TR.json +4 -0
  1277. package/src/toast/intl/uk-UA.json +4 -0
  1278. package/src/toast/intl/zh-CN.json +4 -0
  1279. package/src/toast/intl/zh-TW.json +4 -0
  1280. package/src/toggle/createToggle.ts +96 -15
  1281. package/src/tokenfield/createToken.ts +82 -0
  1282. package/src/tokenfield/createTokenField.ts +859 -0
  1283. package/src/tokenfield/index.ts +10 -0
  1284. package/src/toolbar/createToolbar.ts +26 -5
  1285. package/src/tooltip/createPreviewTrigger.ts +301 -0
  1286. package/src/tooltip/createSafeArea.ts +165 -0
  1287. package/src/tooltip/createTooltip.ts +15 -1
  1288. package/src/tooltip/createTooltipTrigger.ts +24 -3
  1289. package/src/tooltip/index.ts +7 -0
  1290. package/src/tooltip/intl/index.ts +76 -0
  1291. package/src/tree/createTree.ts +66 -50
  1292. package/src/tree/createTreeItem.ts +85 -21
  1293. package/src/tree/createTreeSelectionCheckbox.ts +29 -28
  1294. package/src/tree/intl/ar-AE.json +4 -0
  1295. package/src/tree/intl/bg-BG.json +4 -0
  1296. package/src/tree/intl/cs-CZ.json +4 -0
  1297. package/src/tree/intl/da-DK.json +4 -0
  1298. package/src/tree/intl/de-DE.json +4 -0
  1299. package/src/tree/intl/el-GR.json +4 -0
  1300. package/src/tree/intl/en-US.json +4 -0
  1301. package/src/tree/intl/es-ES.json +4 -0
  1302. package/src/tree/intl/et-EE.json +4 -0
  1303. package/src/tree/intl/fi-FI.json +4 -0
  1304. package/src/tree/intl/fr-FR.json +4 -0
  1305. package/src/tree/intl/he-IL.json +4 -0
  1306. package/src/tree/intl/hr-HR.json +4 -0
  1307. package/src/tree/intl/hu-HU.json +4 -0
  1308. package/src/tree/intl/index.ts +123 -0
  1309. package/src/tree/intl/it-IT.json +4 -0
  1310. package/src/tree/intl/ja-JP.json +4 -0
  1311. package/src/tree/intl/ko-KR.json +4 -0
  1312. package/src/tree/intl/lt-LT.json +4 -0
  1313. package/src/tree/intl/lv-LV.json +4 -0
  1314. package/src/tree/intl/nb-NO.json +4 -0
  1315. package/src/tree/intl/nl-NL.json +4 -0
  1316. package/src/tree/intl/pl-PL.json +4 -0
  1317. package/src/tree/intl/pt-BR.json +4 -0
  1318. package/src/tree/intl/pt-PT.json +4 -0
  1319. package/src/tree/intl/ro-RO.json +4 -0
  1320. package/src/tree/intl/ru-RU.json +4 -0
  1321. package/src/tree/intl/sk-SK.json +4 -0
  1322. package/src/tree/intl/sl-SI.json +4 -0
  1323. package/src/tree/intl/sr-SP.json +4 -0
  1324. package/src/tree/intl/sv-SE.json +4 -0
  1325. package/src/tree/intl/tr-TR.json +4 -0
  1326. package/src/tree/intl/uk-UA.json +4 -0
  1327. package/src/tree/intl/zh-CN.json +4 -0
  1328. package/src/tree/intl/zh-TW.json +4 -0
  1329. package/src/tree/types.ts +35 -2
  1330. package/src/utils/ShadowTreeWalker.ts +249 -0
  1331. package/src/utils/animation.ts +106 -85
  1332. package/src/utils/capture.ts +51 -0
  1333. package/src/utils/createDescription.ts +31 -8
  1334. package/src/utils/dom.ts +314 -33
  1335. package/src/utils/domAttrs.ts +84 -0
  1336. package/src/utils/env.ts +2 -0
  1337. package/src/utils/events.ts +39 -3
  1338. package/src/utils/filterDOMProps.ts +34 -2
  1339. package/src/utils/focus.ts +186 -32
  1340. package/src/utils/geometry.ts +15 -1
  1341. package/src/utils/getMetaValue.ts +57 -0
  1342. package/src/utils/getNonce.ts +40 -0
  1343. package/src/utils/globalListeners.ts +16 -3
  1344. package/src/utils/index.ts +14 -0
  1345. package/src/utils/keyboard.ts +15 -1
  1346. package/src/utils/mergeProps.ts +149 -16
  1347. package/src/utils/owner.ts +26 -0
  1348. package/src/utils/platform.ts +15 -1
  1349. package/src/utils/reactivity.ts +2 -0
  1350. package/src/utils/refs.ts +53 -0
  1351. package/src/utils/runAfterTransition.ts +117 -0
  1352. package/src/utils/scrollIntoView.ts +14 -0
  1353. package/src/utils/splitProps.ts +70 -0
  1354. package/src/utils/textSelection.ts +15 -1
  1355. package/src/virtualizer/ScrollView.ts +210 -0
  1356. package/src/virtualizer/index.ts +2 -0
  1357. package/src/virtualizer/utils.ts +100 -0
  1358. package/src/visually-hidden/createVisuallyHidden.ts +20 -4
  1359. package/dist/_chunk/createInteractionModality.js +0 -268
  1360. package/dist/_chunk/createInteractionModality.js.map +0 -1
  1361. package/dist/_chunk/createInteractionModality.jsx +0 -268
  1362. package/dist/_chunk/createInteractionModality.jsx.map +0 -1
  1363. package/dist/_chunk/focus2.js +0 -631
  1364. package/dist/_chunk/focus2.js.map +0 -1
  1365. package/dist/_chunk/focus2.jsx +0 -631
  1366. package/dist/_chunk/focus2.jsx.map +0 -1
  1367. package/dist/_chunk/visually-hidden.js.map +0 -1
  1368. package/dist/_chunk/visually-hidden.jsx.map +0 -1
  1369. package/dist/checkbox/createCheckboxGroupState.d.ts +0 -71
  1370. package/dist/checkbox/createCheckboxGroupState.d.ts.map +0 -1
  1371. package/dist/radio/createRadioGroupState.d.ts +0 -77
  1372. package/dist/radio/createRadioGroupState.d.ts.map +0 -1
  1373. package/dist/toggle/createToggleState.d.ts +0 -34
  1374. package/dist/toggle/createToggleState.d.ts.map +0 -1
  1375. package/src/checkbox/createCheckboxGroupState.ts +0 -174
  1376. package/src/radio/createRadioGroupState.ts +0 -177
  1377. package/src/toggle/createToggleState.ts +0 -86
@@ -1 +1 @@
1
- {"version":3,"file":"ariaHideOutside.jsx","names":[],"sources":["../../src/overlays/ariaHideOutside.ts"],"sourcesContent":["/**\n * Hides all elements in the DOM outside the given targets from screen readers.\n * Based on @react-aria/overlays ariaHideOutside.\n */\n\nimport { getOwnerWindow } from \"../utils\";\n\nconst supportsInert = typeof HTMLElement !== \"undefined\" && \"inert\" in HTMLElement.prototype;\n\nexport interface AriaHideOutsideOptions {\n /** The root element to start hiding from. */\n root?: Element;\n /** Whether to use the `inert` attribute instead of `aria-hidden`. */\n shouldUseInert?: boolean;\n}\n\n// Keeps a ref count of all hidden elements. Added to when hiding an element, and\n// subtracted from when showing it again. When it reaches zero, aria-hidden is removed.\nconst refCountMap = new WeakMap<Element, number>();\n\ninterface ObserverWrapper {\n visibleNodes: Set<Element>;\n hiddenNodes: Set<Element>;\n observe: () => void;\n disconnect: () => void;\n}\n\nconst observerStack: ObserverWrapper[] = [];\n\n/**\n * Hides all elements in the DOM outside the given targets from screen readers using aria-hidden,\n * and returns a function to revert these changes. In addition, changes to the DOM are watched\n * and new elements outside the targets are automatically hidden.\n * @param targets - The elements that should remain visible.\n * @param options - Options for hiding behavior.\n * @returns - A function to restore all hidden elements.\n */\nexport function ariaHideOutside(\n targets: Element[],\n options?: AriaHideOutsideOptions | Element,\n): () => void {\n const windowObj = getOwnerWindow(targets?.[0]);\n const opts = options instanceof windowObj.Element ? { root: options } : options;\n const root = opts?.root ?? document.body;\n const shouldUseInert = opts?.shouldUseInert && supportsInert;\n const visibleNodes = new Set<Element>(targets);\n const hiddenNodes = new Set<Element>();\n\n const getHidden = (element: Element): boolean => {\n return shouldUseInert && element instanceof windowObj.HTMLElement\n ? element.inert\n : element.getAttribute(\"aria-hidden\") === \"true\";\n };\n\n const setHidden = (element: Element, hidden: boolean): void => {\n if (shouldUseInert && element instanceof windowObj.HTMLElement) {\n element.inert = hidden;\n } else if (hidden) {\n element.setAttribute(\"aria-hidden\", \"true\");\n } else {\n element.removeAttribute(\"aria-hidden\");\n if (element instanceof windowObj.HTMLElement) {\n // We only ever call setHidden with hidden = false when the nodeCount is 1 aka\n // we are trying to make the element visible to screen readers again, so remove inert as well\n element.inert = false;\n }\n }\n };\n\n const hide = (node: Element): void => {\n let refCount = refCountMap.get(node) ?? 0;\n\n // If already aria-hidden, and the ref count is zero, then this element\n // was already hidden and there's nothing for us to do.\n if (getHidden(node) && refCount === 0) {\n return;\n }\n\n if (refCount === 0) {\n setHidden(node, true);\n }\n\n hiddenNodes.add(node);\n refCountMap.set(node, refCount + 1);\n };\n\n const walk = (walkRoot: Element): void => {\n // Keep live announcer and top layer elements (e.g. toasts) visible.\n for (const element of walkRoot.querySelectorAll(\n \"[data-live-announcer], [data-solidaria-top-layer]\",\n )) {\n visibleNodes.add(element);\n }\n\n const acceptNode = (node: Element): number => {\n // Skip this node and its children if it is one of the target nodes, or a live announcer.\n // Also skip children of already hidden nodes, as aria-hidden is recursive. An exception is\n // made for elements with role=\"row\" since VoiceOver on iOS has issues hiding elements with role=\"row\".\n // For that case we want to hide the cells inside as well (https://bugs.webkit.org/show_bug.cgi?id=222623).\n if (\n hiddenNodes.has(node) ||\n visibleNodes.has(node) ||\n (node.parentElement &&\n hiddenNodes.has(node.parentElement) &&\n node.parentElement.getAttribute(\"role\") !== \"row\")\n ) {\n return NodeFilter.FILTER_REJECT;\n }\n\n // Skip this node but continue to children if one of the targets is inside the node.\n for (const target of visibleNodes) {\n if (node.contains(target)) {\n return NodeFilter.FILTER_SKIP;\n }\n }\n\n return NodeFilter.FILTER_ACCEPT;\n };\n\n const walker = document.createTreeWalker(walkRoot, NodeFilter.SHOW_ELEMENT, { acceptNode });\n\n // TreeWalker does not include the root.\n const acceptRoot = acceptNode(walkRoot);\n if (acceptRoot === NodeFilter.FILTER_ACCEPT) {\n hide(walkRoot);\n }\n\n if (acceptRoot !== NodeFilter.FILTER_REJECT) {\n let node = walker.nextNode() as Element;\n while (node != null) {\n hide(node);\n node = walker.nextNode() as Element;\n }\n }\n };\n\n // If there is already a MutationObserver listening from a previous call,\n // disconnect it so the new one takes over.\n if (observerStack.length) {\n observerStack[observerStack.length - 1].disconnect();\n }\n\n walk(root);\n\n const observer = new MutationObserver((changes) => {\n for (const change of changes) {\n if (change.type !== \"childList\") {\n continue;\n }\n\n // If the parent element of the added nodes is not within one of the targets,\n // and not already inside a hidden node, hide all of the new children.\n if (![...visibleNodes, ...hiddenNodes].some((node) => node.contains(change.target))) {\n for (const node of change.addedNodes) {\n if (\n (node instanceof HTMLElement || node instanceof SVGElement) &&\n (node.dataset.liveAnnouncer === \"true\" || node.dataset.solidariaTopLayer === \"true\")\n ) {\n visibleNodes.add(node);\n } else if (node instanceof Element) {\n walk(node);\n }\n }\n }\n }\n });\n\n observer.observe(root, { childList: true, subtree: true });\n\n const observerWrapper: ObserverWrapper = {\n visibleNodes,\n hiddenNodes,\n observe() {\n observer.observe(root, { childList: true, subtree: true });\n },\n disconnect() {\n observer.disconnect();\n },\n };\n\n observerStack.push(observerWrapper);\n\n return (): void => {\n observer.disconnect();\n\n for (const node of hiddenNodes) {\n const count = refCountMap.get(node);\n if (count == null) {\n continue;\n }\n if (count === 1) {\n setHidden(node, false);\n refCountMap.delete(node);\n } else {\n refCountMap.set(node, count - 1);\n }\n }\n\n // Remove this observer from the stack, and start the previous one.\n if (observerWrapper === observerStack[observerStack.length - 1]) {\n observerStack.pop();\n if (observerStack.length) {\n observerStack[observerStack.length - 1].observe();\n }\n } else {\n observerStack.splice(observerStack.indexOf(observerWrapper), 1);\n }\n };\n}\n\n/**\n * Keeps an element visible when aria-hiding is active.\n * Used for elements like live regions that should remain accessible.\n */\nexport function keepVisible(element: Element): (() => void) | undefined {\n const observer = observerStack[observerStack.length - 1];\n if (observer && !observer.visibleNodes.has(element)) {\n observer.visibleNodes.add(element);\n return () => {\n observer.visibleNodes.delete(element);\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ariaHideOutside.jsx","names":[],"sources":["../../src/utils/ShadowTreeWalker.ts","../../src/overlays/ariaHideOutside.ts"],"sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\n// Ported to SolidJS for Proyecto Viviana; based on packages/react-aria/src/utils/shadowdom/ShadowTreeWalker.ts\n// Adobe's source is based on:\n// https://github.com/microsoft/tabster/blob/a89fc5d7e332d48f68d03b1ca6e344489d1c3898/src/Shadowdomize/ShadowTreeWalker.ts\n\nimport { shadowDOM } from \"@proyecto-viviana/solid-stately/private/flags/flags\";\nimport { nodeContains } from \"./dom\";\n\nexport class ShadowTreeWalker implements TreeWalker {\n public readonly filter: NodeFilter | null;\n public readonly root: Node;\n public readonly whatToShow: number;\n\n private readonly doc: Document;\n private walkerStack: TreeWalker[] = [];\n private current: Node;\n private currentSetFor = new Set<TreeWalker>();\n\n constructor(doc: Document, root: Node, whatToShow?: number, filter?: NodeFilter | null) {\n this.doc = doc;\n this.root = root;\n this.filter = filter ?? null;\n this.whatToShow = whatToShow ?? NodeFilter.SHOW_ALL;\n this.current = root;\n\n this.walkerStack.unshift(doc.createTreeWalker(root, whatToShow, this.acceptNode));\n\n const shadowRoot = (root as Element).shadowRoot;\n if (shadowRoot) {\n this.walkerStack.unshift(\n this.doc.createTreeWalker(shadowRoot, this.whatToShow, {\n acceptNode: this.acceptNode,\n }),\n );\n }\n }\n\n private acceptNode = (node: Node): number => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const shadowRoot = (node as Element).shadowRoot;\n if (shadowRoot) {\n this.walkerStack.unshift(\n this.doc.createTreeWalker(shadowRoot, this.whatToShow, {\n acceptNode: this.acceptNode,\n }),\n );\n return NodeFilter.FILTER_ACCEPT;\n }\n\n if (typeof this.filter === \"function\") {\n return this.filter(node);\n }\n if (this.filter?.acceptNode) {\n return this.filter.acceptNode(node);\n }\n if (this.filter === null) {\n return NodeFilter.FILTER_ACCEPT;\n }\n }\n\n return NodeFilter.FILTER_SKIP;\n };\n\n public get currentNode(): Node {\n return this.current;\n }\n\n public set currentNode(node: Node) {\n if (!nodeContains(this.root, node)) {\n throw new Error(\"Cannot set currentNode to a node that is not contained by the root node.\");\n }\n\n const walkers: TreeWalker[] = [];\n let currentNode: Node | null | undefined = node;\n let walkerCurrentNode = node;\n this.current = node;\n\n while (currentNode && currentNode !== this.root) {\n if (currentNode.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n const shadowRoot = currentNode as ShadowRoot;\n const walker = this.doc.createTreeWalker(shadowRoot, this.whatToShow, {\n acceptNode: this.acceptNode,\n });\n walkers.push(walker);\n walker.currentNode = walkerCurrentNode;\n this.currentSetFor.add(walker);\n currentNode = walkerCurrentNode = shadowRoot.host;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n const walker = this.doc.createTreeWalker(this.root, this.whatToShow, {\n acceptNode: this.acceptNode,\n });\n walkers.push(walker);\n walker.currentNode = walkerCurrentNode;\n this.currentSetFor.add(walker);\n this.walkerStack = walkers;\n }\n\n public firstChild(): Node | null {\n const currentNode = this.currentNode;\n const newNode = this.nextNode();\n if (!nodeContains(currentNode, newNode)) {\n this.currentNode = currentNode;\n return null;\n }\n if (newNode) {\n this.currentNode = newNode;\n }\n return newNode;\n }\n\n public lastChild(): Node | null {\n const walker = this.walkerStack[0];\n const newNode = walker.lastChild();\n if (newNode) {\n this.currentNode = newNode;\n }\n return newNode;\n }\n\n public nextNode(): Node | null {\n const nextNode = this.walkerStack[0].nextNode();\n if (nextNode) {\n const shadowRoot = (nextNode as Element).shadowRoot;\n if (shadowRoot) {\n let nodeResult: number | undefined;\n if (typeof this.filter === \"function\") {\n nodeResult = this.filter(nextNode);\n } else if (this.filter?.acceptNode) {\n nodeResult = this.filter.acceptNode(nextNode);\n }\n\n if (nodeResult === NodeFilter.FILTER_ACCEPT) {\n this.currentNode = nextNode;\n return nextNode;\n }\n\n const childNode = this.nextNode();\n if (childNode) {\n this.currentNode = childNode;\n }\n return childNode;\n }\n\n this.currentNode = nextNode;\n return nextNode;\n }\n\n if (this.walkerStack.length > 1) {\n this.walkerStack.shift();\n const parentNode = this.nextNode();\n if (parentNode) {\n this.currentNode = parentNode;\n }\n return parentNode;\n }\n return null;\n }\n\n public previousNode(): Node | null {\n const currentWalker = this.walkerStack[0];\n if (currentWalker.currentNode === currentWalker.root) {\n if (this.currentSetFor.has(currentWalker)) {\n this.currentSetFor.delete(currentWalker);\n if (this.walkerStack.length > 1) {\n this.walkerStack.shift();\n const parentNode = this.previousNode();\n if (parentNode) {\n this.currentNode = parentNode;\n }\n return parentNode;\n }\n }\n return null;\n }\n\n const previousNode = currentWalker.previousNode();\n if (previousNode) {\n const shadowRoot = (previousNode as Element).shadowRoot;\n if (shadowRoot) {\n let nodeResult: number | undefined;\n if (typeof this.filter === \"function\") {\n nodeResult = this.filter(previousNode);\n } else if (this.filter?.acceptNode) {\n nodeResult = this.filter.acceptNode(previousNode);\n }\n\n if (nodeResult === NodeFilter.FILTER_ACCEPT) {\n this.currentNode = previousNode;\n return previousNode;\n }\n\n const childNode = this.lastChild();\n if (childNode) {\n this.currentNode = childNode;\n }\n return childNode;\n }\n\n this.currentNode = previousNode;\n return previousNode;\n }\n\n if (this.walkerStack.length > 1) {\n this.walkerStack.shift();\n const parentNode = this.previousNode();\n if (parentNode) {\n this.currentNode = parentNode;\n }\n return parentNode;\n }\n return null;\n }\n\n /** @deprecated */\n public nextSibling(): Node | null {\n return null;\n }\n\n /** @deprecated */\n public previousSibling(): Node | null {\n return null;\n }\n\n /** @deprecated */\n public parentNode(): Node | null {\n return null;\n }\n}\n\n/** Shadow DOM-safe version of `Document.createTreeWalker`. */\nexport function createShadowTreeWalker(\n doc: Document,\n root: Node,\n whatToShow?: number,\n filter?: NodeFilter | null,\n): TreeWalker {\n if (shadowDOM()) {\n return new ShadowTreeWalker(doc, root, whatToShow, filter);\n }\n return doc.createTreeWalker(root, whatToShow, filter);\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n// Ported to SolidJS for Proyecto Viviana; based on packages/react-aria/src/overlays/ariaHideOutside.ts\n\n/**\n * Hides all elements in the DOM outside the given targets from screen readers.\n * Ported from packages/react-aria/src/overlays/ariaHideOutside.ts.\n */\n\nimport { shadowDOM } from \"@proyecto-viviana/solid-stately/private/flags/flags\";\nimport { getOwnerDocument, getOwnerWindow, nodeContains } from \"../utils\";\nimport { createShadowTreeWalker } from \"../utils/ShadowTreeWalker\";\n\nconst supportsInert = typeof HTMLElement !== \"undefined\" && \"inert\" in HTMLElement.prototype;\n\nfunction isAlwaysVisibleNode(node: HTMLElement | SVGElement): boolean {\n return node.dataset.liveAnnouncer === \"true\" || node.dataset.solidariaTopLayer !== undefined;\n}\n\nexport interface AriaHideOutsideOptions {\n /** The root element to start hiding from. */\n root?: Element;\n /** Whether to use the `inert` attribute instead of `aria-hidden`. */\n shouldUseInert?: boolean;\n}\n\n// Keeps a ref count of all hidden elements. Added to when hiding an element, and\n// subtracted from when showing it again. When it reaches zero, aria-hidden is removed.\nconst refCountMap = new WeakMap<Element, number>();\n\ninterface ObserverWrapper {\n visibleNodes: Set<Element>;\n hiddenNodes: Set<Element>;\n observe: () => void;\n disconnect: () => void;\n}\n\nconst observerStack: ObserverWrapper[] = [];\n\n/**\n * Hides all elements in the DOM outside the given targets from screen readers using aria-hidden,\n * and returns a function to revert these changes. In addition, changes to the DOM are watched\n * and new elements outside the targets are automatically hidden.\n * @param targets - The elements that should remain visible.\n * @param options - Options for hiding behavior.\n * @returns - A function to restore all hidden elements.\n */\nexport function ariaHideOutside(\n targets: Element[],\n options?: AriaHideOutsideOptions | Element,\n): () => void {\n const windowObj = getOwnerWindow(targets?.[0]);\n const opts = options instanceof windowObj.Element ? { root: options } : options;\n const root = opts?.root ?? getOwnerDocument(targets?.[0]).body;\n const shouldUseInert = opts?.shouldUseInert && supportsInert;\n const visibleNodes = new Set<Element>(targets);\n const hiddenNodes = new Set<Element>();\n\n const shadowRootsToWatch = new Set<ShadowRoot>();\n if (shadowDOM()) {\n const boundary = root.getRootNode();\n for (const target of targets) {\n let current = target.getRootNode();\n while (current instanceof windowObj.ShadowRoot && current !== boundary) {\n shadowRootsToWatch.add(current);\n current = current.host.getRootNode();\n }\n }\n }\n\n const getHidden = (element: Element): boolean => {\n return shouldUseInert && element instanceof windowObj.HTMLElement\n ? element.inert\n : element.getAttribute(\"aria-hidden\") === \"true\";\n };\n\n const setHidden = (element: Element, hidden: boolean): void => {\n if (shouldUseInert && element instanceof windowObj.HTMLElement) {\n element.inert = hidden;\n } else if (hidden) {\n element.setAttribute(\"aria-hidden\", \"true\");\n } else {\n element.removeAttribute(\"aria-hidden\");\n if (element instanceof windowObj.HTMLElement) {\n // We only ever call setHidden with hidden = false when the nodeCount is 1 aka\n // we are trying to make the element visible to screen readers again, so remove inert as well\n element.inert = false;\n }\n }\n };\n\n const hide = (node: Element): void => {\n let refCount = refCountMap.get(node) ?? 0;\n\n // If already aria-hidden, and the ref count is zero, then this element\n // was already hidden and there's nothing for us to do.\n if (getHidden(node) && refCount === 0) {\n return;\n }\n\n if (refCount === 0) {\n setHidden(node, true);\n }\n\n hiddenNodes.add(node);\n refCountMap.set(node, refCount + 1);\n };\n\n const walk = (walkRoot: Element): void => {\n // Keep live announcer and top layer elements (e.g. toasts) visible.\n for (const element of walkRoot.querySelectorAll(\n \"[data-live-announcer], [data-solidaria-top-layer]\",\n )) {\n visibleNodes.add(element);\n }\n\n const acceptNode = (node: Element): number => {\n // Skip this node and its children if it is one of the target nodes, or a live announcer.\n // Also skip children of already hidden nodes, as aria-hidden is recursive. An exception is\n // made for elements with role=\"row\" since VoiceOver on iOS has issues hiding elements with role=\"row\".\n // For that case we want to hide the cells inside as well (https://bugs.webkit.org/show_bug.cgi?id=222623).\n if (\n hiddenNodes.has(node) ||\n visibleNodes.has(node) ||\n (node.parentElement &&\n hiddenNodes.has(node.parentElement) &&\n node.parentElement.getAttribute(\"role\") !== \"row\")\n ) {\n return NodeFilter.FILTER_REJECT;\n }\n\n // Skip this node but continue to children if one of the targets is inside the node.\n for (const target of visibleNodes) {\n if (nodeContains(node, target)) {\n return NodeFilter.FILTER_SKIP;\n }\n }\n\n return NodeFilter.FILTER_ACCEPT;\n };\n\n const walker = createShadowTreeWalker(\n getOwnerDocument(walkRoot),\n walkRoot,\n NodeFilter.SHOW_ELEMENT,\n { acceptNode },\n );\n\n // TreeWalker does not include the root.\n const acceptRoot = acceptNode(walkRoot);\n if (acceptRoot === NodeFilter.FILTER_ACCEPT) {\n hide(walkRoot);\n }\n\n if (acceptRoot !== NodeFilter.FILTER_REJECT) {\n let node = walker.nextNode() as Element;\n while (node != null) {\n hide(node);\n node = walker.nextNode() as Element;\n }\n }\n };\n\n // If there is already a MutationObserver listening from a previous call,\n // disconnect it so the new one takes over.\n if (observerStack.length) {\n observerStack[observerStack.length - 1].disconnect();\n }\n\n walk(root);\n\n const processMutations = (changes: MutationRecord[]): void => {\n for (const change of changes) {\n if (change.type !== \"childList\") {\n continue;\n }\n\n // If the parent element of the added nodes is not within one of the targets,\n // and not already inside a hidden node, hide all of the new children.\n if (\n change.target.isConnected &&\n ![...visibleNodes, ...hiddenNodes].some((node) => nodeContains(node, change.target))\n ) {\n for (const node of change.addedNodes) {\n if (\n (node instanceof windowObj.HTMLElement || node instanceof windowObj.SVGElement) &&\n isAlwaysVisibleNode(node)\n ) {\n visibleNodes.add(node);\n } else if (node instanceof windowObj.Element) {\n walk(node);\n }\n }\n }\n\n if (shadowDOM()) {\n for (const shadowRoot of shadowRootsToWatch) {\n if (!shadowRoot.isConnected) {\n observer.disconnect();\n break;\n }\n }\n }\n }\n };\n\n const observer = new windowObj.MutationObserver(processMutations);\n\n observer.observe(root, { childList: true, subtree: true });\n\n const shadowObservers = new Set<MutationObserver>();\n if (shadowDOM()) {\n for (const shadowRoot of shadowRootsToWatch) {\n const shadowObserver = new windowObj.MutationObserver(processMutations);\n shadowObserver.observe(shadowRoot, { childList: true, subtree: true });\n shadowObservers.add(shadowObserver);\n }\n }\n\n const observerWrapper: ObserverWrapper = {\n visibleNodes,\n hiddenNodes,\n observe() {\n observer.observe(root, { childList: true, subtree: true });\n },\n disconnect() {\n observer.disconnect();\n },\n };\n\n observerStack.push(observerWrapper);\n\n return (): void => {\n observer.disconnect();\n if (shadowDOM()) {\n for (const shadowObserver of shadowObservers) {\n shadowObserver.disconnect();\n }\n }\n\n for (const node of hiddenNodes) {\n const count = refCountMap.get(node);\n if (count == null) {\n continue;\n }\n if (count === 1) {\n setHidden(node, false);\n refCountMap.delete(node);\n } else {\n refCountMap.set(node, count - 1);\n }\n }\n\n // Remove this observer from the stack, and start the previous one.\n if (observerWrapper === observerStack[observerStack.length - 1]) {\n observerStack.pop();\n if (observerStack.length) {\n observerStack[observerStack.length - 1].observe();\n }\n } else {\n observerStack.splice(observerStack.indexOf(observerWrapper), 1);\n }\n };\n}\n\n/**\n * Keeps an element visible when aria-hiding is active.\n * Used for elements like live regions that should remain accessible.\n */\nexport function keepVisible(element: Element): (() => void) | undefined {\n const observer = observerStack[observerStack.length - 1];\n if (observer && !observer.visibleNodes.has(element)) {\n observer.visibleNodes.add(element);\n return () => {\n observer.visibleNodes.delete(element);\n };\n }\n}\n"],"mappings":"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"}
@@ -1,8 +1,19 @@
1
- import { a as getEventTarget, i as getActiveElement } from "./focus.js";
2
- import { s as getPointerType } from "./createInteractionModality.js";
1
+ /*
2
+ * Copyright 2024 Adobe. All rights reserved.
3
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
+ * you may not use this file except in compliance with the License. You may obtain a copy
5
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ *
7
+ * Unless required by applicable law or agreed to in writing, software distributed under
8
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9
+ * OF ANY KIND, either express or implied. See the License for the specific language
10
+ * governing permissions and limitations under the License.
11
+ */
12
+ // Ported to SolidJS for Proyecto Viviana; based on packages/react-aria/src/autocomplete/useAutocomplete.ts
13
+ import { P as getPointerType, n as getActiveElement, r as getEventTarget } from "./dom.js";
3
14
  import { createId, getOwnerDocument } from "../ssr/index.js";
4
15
  import { n as FOCUS_EVENT, t as CLEAR_FOCUS_EVENT } from "./constants.js";
5
- import { createEffect, createSignal, onCleanup } from "solid-js";
16
+ import { createSignal, createTrackedEffect } from "solid-js";
6
17
  //#region src/autocomplete/createAutocomplete.ts
7
18
  /**
8
19
  * createAutocomplete - Accessibility hook for autocomplete components
@@ -73,14 +84,18 @@ function createAutocomplete(props, state) {
73
84
  const handleBeforeInput = (e) => {
74
85
  lastInputType = e.inputType || "";
75
86
  };
76
- createEffect(() => {
87
+ createTrackedEffect(() => {
88
+ const _s2Cleanups = [];
77
89
  const input = inputRef();
78
90
  if (input) {
79
91
  input.addEventListener("beforeinput", handleBeforeInput);
80
- onCleanup(() => {
92
+ _s2Cleanups.push(() => {
81
93
  input.removeEventListener("beforeinput", handleBeforeInput);
82
94
  });
83
95
  }
96
+ return () => {
97
+ for (const c of _s2Cleanups) c();
98
+ };
84
99
  });
85
100
  const focusFirstItem = () => {
86
101
  delayNextActiveDescendant = true;
@@ -197,16 +212,20 @@ function createAutocomplete(props, state) {
197
212
  }
198
213
  delayNextActiveDescendant = false;
199
214
  };
200
- createEffect(() => {
215
+ createTrackedEffect(() => {
216
+ const _s2Cleanups = [];
201
217
  if (!shouldUseVirtualFocus()) return;
202
218
  const collection = collectionRef();
203
219
  if (collection) {
204
220
  collection.addEventListener("focusin", updateActiveDescendant);
205
- onCleanup(() => {
221
+ _s2Cleanups.push(() => {
206
222
  collection.removeEventListener("focusin", updateActiveDescendant);
207
223
  clearTimeout(activeDescendantTimeout);
208
224
  });
209
225
  }
226
+ return () => {
227
+ for (const c of _s2Cleanups) c();
228
+ };
210
229
  });
211
230
  const filterFn = filter ? (nodeTextValue, node) => filter(nodeTextValue, state.inputValue(), node) : void 0;
212
231
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"autocomplete.js","names":["inputEvent"],"sources":["../../src/autocomplete/createAutocomplete.ts"],"sourcesContent":["/**\n * createAutocomplete - Accessibility hook for autocomplete components\n *\n * Provides keyboard navigation, virtual focus via aria-activedescendant,\n * and filtering capabilities for autocomplete inputs.\n *\n * Based on @react-aria/autocomplete useAutocomplete.\n */\n\nimport { createSignal, createEffect, onCleanup, type Accessor } from \"solid-js\";\nimport { createId, getOwnerDocument } from \"../ssr\";\nimport { type AutocompleteState, type CollectionNode } from \"@proyecto-viviana/solid-stately\";\nimport { FOCUS_EVENT, CLEAR_FOCUS_EVENT } from \"../selection/constants\";\nimport { getActiveElement, getEventTarget } from \"../utils/dom\";\nimport { getPointerType } from \"../interactions\";\n\nexport interface CollectionOptions {\n /** The id of the collection element. */\n id?: string;\n /** Accessible label for the collection. */\n \"aria-label\"?: string;\n /** Whether the collection items should use virtual focus instead of being focused directly. */\n shouldUseVirtualFocus: boolean;\n /** Whether typeahead is disabled. */\n disallowTypeAhead: boolean;\n /** Whether and where to focus an item when the collection mounts. */\n autoFocus?: boolean | \"first\" | \"last\";\n}\n\nexport interface AutocompleteInputProps {\n /** Current input value. */\n value: Accessor<string>;\n /** Handler for input value changes. */\n onChange: (value: string) => void;\n /** Handler for key events. */\n onKeyDown: (e: KeyboardEvent) => void;\n /** Handler for focus events. */\n onFocus: (e: FocusEvent) => void;\n /** Handler for blur events. */\n onBlur: (e: FocusEvent) => void;\n /** The id of the currently focused item for aria-activedescendant. */\n \"aria-activedescendant\": Accessor<string | undefined>;\n /** The id of the controlled collection. */\n \"aria-controls\": string;\n /** Autocomplete type. */\n \"aria-autocomplete\": \"list\" | \"none\" | \"inline\" | \"both\";\n /** Enter key hint for mobile keyboards. */\n enterKeyHint: \"go\";\n /** Disable autocorrect. */\n autoCorrect: \"off\";\n /** Disable spell check. */\n spellCheck: \"false\";\n /** Disable browser autocomplete. */\n autoComplete: \"off\";\n}\n\nexport interface AriaAutocompleteOptions<T = unknown> {\n /** Ref accessor for the input element. */\n inputRef: Accessor<HTMLInputElement | undefined>;\n /** Ref accessor for the collection element. */\n collectionRef: Accessor<HTMLElement | undefined>;\n /** Optional id override for the controlled collection element. */\n collectionId?: string;\n /** Optional accessible name for the controlled collection element. */\n collectionAriaLabel?: string;\n /**\n * An optional filter function used to determine if an option should be included.\n * @param textValue - The text value of the item\n * @param inputValue - The current input value\n * @param node - The collection node being filtered\n */\n filter?: (textValue: string, inputValue: string, node: CollectionNode<T>) => boolean;\n /**\n * Whether to focus the first item after filtering.\n * @default false\n */\n disableAutoFocusFirst?: boolean;\n /**\n * Whether to disable virtual focus (aria-activedescendant).\n * @default false\n */\n disableVirtualFocus?: boolean;\n}\n\nexport interface AutocompleteAria<T = unknown> {\n /** Props for the autocomplete input element. */\n inputProps: AutocompleteInputProps;\n /** Props for the collection (ListBox/Menu). */\n collectionProps: CollectionOptions;\n /** A filter function that returns if the item should be shown. */\n filter?: (nodeTextValue: string, node: CollectionNode<T>) => boolean;\n}\n\nfunction toKeyboardEventInit(e: KeyboardEvent): KeyboardEventInit {\n return {\n key: e.key,\n code: e.code,\n location: e.location,\n repeat: e.repeat,\n isComposing: e.isComposing,\n ctrlKey: e.ctrlKey,\n shiftKey: e.shiftKey,\n altKey: e.altKey,\n metaKey: e.metaKey,\n bubbles: e.bubbles,\n cancelable: e.cancelable,\n };\n}\n\n// Custom event names for collection communication.\n// These are the shared @react-aria/selection constants the collection's\n// createSelectableCollection listens for (FOCUS_EVENT / CLEAR_FOCUS_EVENT);\n// the aliases below are retained for backwards-compatible re-exports.\n/** @deprecated Use {@link FOCUS_EVENT} from the selection layer. */\nexport const AUTOCOMPLETE_FOCUS_EVENT = FOCUS_EVENT;\n/** @deprecated Use {@link CLEAR_FOCUS_EVENT} from the selection layer. */\nexport const AUTOCOMPLETE_CLEAR_FOCUS_EVENT = CLEAR_FOCUS_EVENT;\n\n/**\n * Provides the behavior and accessibility implementation for an autocomplete component.\n * An autocomplete combines a text input with a collection, allowing users to filter\n * the collection's contents to match a query.\n *\n * @example\n * ```tsx\n * const state = createAutocompleteState({ defaultInputValue: '' });\n * let inputRef, collectionRef;\n *\n * const { inputProps, collectionProps, filter } = createAutocomplete({\n * inputRef: () => inputRef,\n * collectionRef: () => collectionRef,\n * filter: (textValue, inputValue) =>\n * textValue.toLowerCase().includes(inputValue.toLowerCase()),\n * }, state);\n *\n * return (\n * <div>\n * <input ref={inputRef} {...inputProps} />\n * <ul ref={collectionRef} {...collectionProps}>\n * {items.filter(item => filter?.(item.name) ?? true).map(item => (\n * <li key={item.id}>{item.name}</li>\n * ))}\n * </ul>\n * </div>\n * );\n * ```\n */\nexport function createAutocomplete<T = unknown>(\n props: AriaAutocompleteOptions<T>,\n state: AutocompleteState,\n): AutocompleteAria<T> {\n const {\n inputRef,\n collectionRef,\n filter,\n collectionId: collectionIdProp,\n collectionAriaLabel,\n disableAutoFocusFirst = false,\n disableVirtualFocus = false,\n } = props;\n\n const collectionId = collectionIdProp ?? createId();\n const [shouldUseVirtualFocus] = createSignal(!disableVirtualFocus);\n // When the first item should be focused but the collection hasn't mounted yet,\n // defer it by threading autoFocus through collectionProps so the collection\n // focuses on mount (mirrors upstream's autoFocusOnMount state).\n const [autoFocusOnMount, setAutoFocusOnMount] = createSignal(false);\n let lastInputType = \"\";\n\n // Reverse-focus (collection → input aria-activedescendant) bookkeeping, mirroring\n // useAutocomplete's queuedActiveDescendant / delayNextActiveDescendant / timeout\n // refs. `queuedActiveDescendant` is the id of the option the collection has\n // virtually focused — tracked synchronously on every collection `focusin`, even\n // while the visible aria-activedescendant reflection is deferred, so key\n // navigation always dispatches to the right item. When typing forward,\n // `delayNextActiveDescendant` defers the next reflection behind a 500ms timeout so\n // a screen reader finishes announcing the just-typed letter before naming the\n // active option; every new focusin (and teardown) clears the pending timeout.\n let queuedActiveDescendant: string | null = null;\n let delayNextActiveDescendant = false;\n let activeDescendantTimeout: ReturnType<typeof setTimeout> | undefined;\n const ACTIVE_DESCENDANT_DELAY = 500;\n\n // Track the input type for determining focus behavior. We listen to\n // `beforeinput` (not `input`) so `lastInputType` is set before the input's\n // `onChange` runs, mirroring @react-aria/autocomplete.\n const handleBeforeInput = (e: Event) => {\n const inputEvent = e as InputEvent;\n lastInputType = inputEvent.inputType || \"\";\n };\n\n // Set up beforeinput event listener\n createEffect(() => {\n const input = inputRef();\n if (input) {\n input.addEventListener(\"beforeinput\", handleBeforeInput);\n onCleanup(() => {\n input.removeEventListener(\"beforeinput\", handleBeforeInput);\n });\n }\n });\n\n // Focus first item in collection\n const focusFirstItem = () => {\n // Typing forward focuses the first filtered row, but the resulting\n // aria-activedescendant reflection must wait so the SR announces the typed\n // letter first (see updateActiveDescendant). Mirrors useAutocomplete\n // setting delayNextActiveDescendant.current = true before the focus event.\n delayNextActiveDescendant = true;\n const collection = collectionRef();\n if (!collection) {\n // Collection isn't mounted yet — defer focusing the first item to mount\n // time via collectionProps.autoFocus instead of firing a focus event into\n // a not-yet-rendered collection.\n setAutoFocusOnMount(true);\n return;\n }\n collection.dispatchEvent(\n new CustomEvent(FOCUS_EVENT, {\n cancelable: true,\n bubbles: true,\n detail: { focusStrategy: \"first\" },\n }),\n );\n };\n\n // Clear virtual focus\n const clearVirtualFocus = (clearFocusKey = false) => {\n setAutoFocusOnMount(false);\n // Drop any pending delayed reflection and the tracked item alongside the\n // active descendant so a subsequent focusin can't resurrect a stale id\n // (mirrors useAutocomplete clearing queuedActiveDescendant / the timeout /\n // delayNextActiveDescendant in clearVirtualFocus).\n clearTimeout(activeDescendantTimeout);\n queuedActiveDescendant = null;\n delayNextActiveDescendant = false;\n state.setFocusedNodeId(null);\n const collection = collectionRef();\n if (collection) {\n collection.dispatchEvent(\n new CustomEvent(CLEAR_FOCUS_EVENT, {\n cancelable: true,\n bubbles: true,\n detail: { clearFocusKey },\n }),\n );\n }\n };\n\n // Handle input value changes\n const onChange = (value: string) => {\n // Focus first item when typing forward, clear when backspacing/pasting.\n // IME composition (e.g. CJK input) reports 'insertCompositionText'/\n // 'insertFromComposition' instead of 'insertText'; treat those as forward\n // typing so the first item still gets virtual focus.\n if (\n (lastInputType === \"insertText\" ||\n lastInputType === \"insertCompositionText\" ||\n lastInputType === \"insertFromComposition\") &&\n !disableAutoFocusFirst\n ) {\n focusFirstItem();\n } else if (\n lastInputType &&\n (lastInputType.includes(\"insert\") ||\n lastInputType.includes(\"delete\") ||\n lastInputType.includes(\"history\"))\n ) {\n clearVirtualFocus(true);\n }\n\n state.setInputValue(value);\n };\n\n // Handle keyboard navigation\n const onKeyDown = (e: KeyboardEvent) => {\n if (\"isComposing\" in e && e.isComposing) {\n return;\n }\n\n // Navigate against the id the collection has virtually focused, tracked\n // synchronously on every focusin, NOT the (possibly still-delayed)\n // aria-activedescendant reflection in state — mirrors useAutocomplete\n // reading queuedActiveDescendant.current here. Reading state.focusedNodeId()\n // would be null during the post-type reflection delay, so arrows would\n // re-focus the first row instead of advancing.\n const focusedNodeId = queuedActiveDescendant;\n const collection = collectionRef();\n const ownerDocument = getOwnerDocument(inputRef() ?? collection);\n\n switch (e.key) {\n case \"Escape\":\n // Let the input handle Escape (e.g., clear value)\n if (e.defaultPrevented) {\n return;\n }\n break;\n\n case \" \":\n // Space shouldn't trigger item action\n return;\n\n case \"Tab\":\n // Let Tab propagate normally for focus management\n return;\n\n case \"ArrowUp\":\n case \"ArrowDown\":\n case \"Home\":\n case \"End\":\n case \"PageUp\":\n case \"PageDown\": {\n // Prevent cursor movement in input\n e.preventDefault();\n\n // Dispatch focus event to collection\n if (collection) {\n collection.dispatchEvent(\n new CustomEvent(FOCUS_EVENT, {\n cancelable: true,\n bubbles: true,\n }),\n );\n }\n break;\n }\n\n case \"ArrowLeft\":\n case \"ArrowRight\":\n // With no virtual focus, just let the arrow move the text cursor; stop\n // propagation so it doesn't leak into the collection. With virtual focus,\n // fall through to dispatch the key to the focused item below, then clear\n // the active descendant only after the item has seen it.\n if (!focusedNodeId) {\n e.stopPropagation();\n return;\n }\n break;\n\n case \"Enter\":\n // Trigger click on focused item\n if (focusedNodeId) {\n const item = ownerDocument?.getElementById(focusedNodeId);\n if (item) {\n item.click();\n e.preventDefault();\n }\n }\n return;\n }\n\n // Forward keyboard events to the focused item (or the collection when there\n // is no virtual focus) so the collection can act on them, e.g. onAction.\n // Gated only on the collection existing — NOT on e.defaultPrevented: arrows\n // call preventDefault above to stop the input's text cursor moving, but the\n // key must still be re-dispatched to the row so navigation advances (mirrors\n // useAutocomplete forwarding whenever collectionRef.current !== null).\n if (collection) {\n e.stopPropagation();\n\n let shouldPerformDefaultAction = true;\n if (focusedNodeId) {\n const item = ownerDocument?.getElementById(focusedNodeId);\n if (item) {\n shouldPerformDefaultAction = item.dispatchEvent(\n new KeyboardEvent(e.type, toKeyboardEventInit(e)),\n );\n }\n } else {\n shouldPerformDefaultAction = collection.dispatchEvent(\n new KeyboardEvent(e.type, toKeyboardEventInit(e)),\n );\n }\n\n // After the focused item has seen ArrowLeft/ArrowRight, clear the active\n // descendant so SR announcements aren't interrupted, but retain the\n // collection's focused key so navigation restarts where it left off. If\n // the item consumed the key (e.g. an expandable row collapsing), it\n // cancels the event and we keep virtual focus.\n if (shouldPerformDefaultAction && (e.key === \"ArrowLeft\" || e.key === \"ArrowRight\")) {\n clearVirtualFocus();\n }\n }\n };\n\n // Handle focus events\n const onFocus = (e: FocusEvent) => {\n if (!e.isTrusted) return;\n\n // Restore virtual focus when refocusing input\n const focusedNodeId = state.focusedNodeId();\n if (focusedNodeId) {\n const item = document.getElementById(focusedNodeId);\n if (item) {\n // Item still exists, keep focus on it\n }\n }\n };\n\n const onBlur = (e: FocusEvent) => {\n if (!e.isTrusted) return;\n // Virtual focus blur handling would go here\n };\n\n // Reverse path: mirror the collection's virtually-focused option into the\n // input's aria-activedescendant. The collection dispatches a synthetic,\n // bubbling `focusin` (via moveVirtualFocus) on its focused option; we read the\n // target id, track it in `queuedActiveDescendant` synchronously (so key nav\n // always dispatches to the right item), and reflect it into AutocompleteState\n // — immediately, or, when `delayNextActiveDescendant` was set by forward\n // typing, behind a 500ms timeout so the SR finishes announcing the typed\n // letter before naming the active option. Faithful port of useAutocomplete's\n // updateActiveDescendantEvent.\n const updateActiveDescendant = (e: Event) => {\n const input = inputRef();\n // If the user clicks/taps an option directly (non-touch), pull real focus\n // back to the input so typing keeps working.\n if (\n !e.isTrusted &&\n shouldUseVirtualFocus() &&\n input &&\n getActiveElement(getOwnerDocument(input)) !== input &&\n getPointerType() !== \"touch\"\n ) {\n input.focus();\n }\n\n const target = getEventTarget<Element>(e);\n if (e.isTrusted || !target || queuedActiveDescendant === target.id) {\n return;\n }\n\n const collection = collectionRef();\n // A new focusin supersedes any pending delayed reflection.\n clearTimeout(activeDescendantTimeout);\n if (target !== collection) {\n const targetId = target.id;\n if (delayNextActiveDescendant) {\n // Forward typing just focused the first row: track it now, but defer the\n // aria-activedescendant reflection so the just-typed letter is announced\n // before the active option.\n queuedActiveDescendant = targetId;\n activeDescendantTimeout = setTimeout(() => {\n state.setFocusedNodeId(targetId);\n }, ACTIVE_DESCENDANT_DELAY);\n } else {\n queuedActiveDescendant = targetId;\n state.setFocusedNodeId(targetId);\n }\n } else if (\n queuedActiveDescendant &&\n !getOwnerDocument(collection)?.getElementById(queuedActiveDescendant)\n ) {\n // Refocus of the collection itself while the previously focused node no\n // longer exists (filtered away, or the input was refocused): clear the\n // tracked item and the active descendant.\n queuedActiveDescendant = null;\n state.setFocusedNodeId(null);\n }\n // Reflection delay is a one-shot; the next focusin reflects immediately\n // unless forward typing sets the flag again.\n delayNextActiveDescendant = false;\n };\n\n createEffect(() => {\n if (!shouldUseVirtualFocus()) return;\n const collection = collectionRef();\n if (collection) {\n collection.addEventListener(\"focusin\", updateActiveDescendant);\n onCleanup(() => {\n collection.removeEventListener(\"focusin\", updateActiveDescendant);\n clearTimeout(activeDescendantTimeout);\n });\n }\n });\n\n // Create filter function. The user's 3-arg predicate (textValue, inputValue,\n // node) is closed over the current input value and exposed to the collection\n // as the 2-arg (nodeTextValue, node) shape that UNSTABLE_useFilteredListState\n // (createFilteredListState) expects.\n const filterFn = filter\n ? (nodeTextValue: string, node: CollectionNode<T>) =>\n filter(nodeTextValue, state.inputValue(), node)\n : undefined;\n\n return {\n inputProps: {\n value: state.inputValue,\n onChange,\n onKeyDown,\n onFocus,\n onBlur,\n get \"aria-activedescendant\"() {\n return () => (shouldUseVirtualFocus() ? (state.focusedNodeId() ?? undefined) : undefined);\n },\n \"aria-controls\": collectionId,\n \"aria-autocomplete\": \"list\",\n enterKeyHint: \"go\",\n autoCorrect: \"off\",\n spellCheck: \"false\",\n autoComplete: \"off\",\n },\n collectionProps: {\n id: collectionId,\n \"aria-label\": collectionAriaLabel,\n shouldUseVirtualFocus: shouldUseVirtualFocus(),\n disallowTypeAhead: shouldUseVirtualFocus(),\n get autoFocus() {\n return autoFocusOnMount() ? \"first\" : false;\n },\n },\n filter: filterFn,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"autocomplete.js","names":["inputEvent"],"sources":["../../src/autocomplete/createAutocomplete.ts"],"sourcesContent":["/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n// Ported to SolidJS for Proyecto Viviana; based on packages/react-aria/src/autocomplete/useAutocomplete.ts\n\n/**\n * createAutocomplete - Accessibility hook for autocomplete components\n *\n * Provides keyboard navigation, virtual focus via aria-activedescendant,\n * and filtering capabilities for autocomplete inputs.\n *\n * Based on @react-aria/autocomplete useAutocomplete.\n */\n\nimport { createSignal, createTrackedEffect } from \"solid-js\";\nimport type { Accessor } from \"solid-js\";\nimport { createId, getOwnerDocument } from \"../ssr\";\nimport { type AutocompleteState, type CollectionNode } from \"@proyecto-viviana/solid-stately\";\nimport { FOCUS_EVENT, CLEAR_FOCUS_EVENT } from \"../selection/constants\";\nimport { getActiveElement, getEventTarget } from \"../utils/dom\";\nimport { getPointerType } from \"../interactions\";\n\nexport interface CollectionOptions {\n /** The id of the collection element. */\n id?: string;\n /** Accessible label for the collection. */\n \"aria-label\"?: string;\n /** Whether the collection items should use virtual focus instead of being focused directly. */\n shouldUseVirtualFocus: boolean;\n /** Whether typeahead is disabled. */\n disallowTypeAhead: boolean;\n /** Whether and where to focus an item when the collection mounts. */\n autoFocus?: boolean | \"first\" | \"last\";\n}\n\nexport interface AutocompleteInputProps {\n /** Current input value. */\n value: Accessor<string>;\n /** Handler for input value changes. */\n onChange: (value: string) => void;\n /** Handler for key events. */\n onKeyDown: (e: KeyboardEvent) => void;\n /** Handler for focus events. */\n onFocus: (e: FocusEvent) => void;\n /** Handler for blur events. */\n onBlur: (e: FocusEvent) => void;\n /** The id of the currently focused item for aria-activedescendant. */\n \"aria-activedescendant\": Accessor<string | undefined>;\n /** The id of the controlled collection. */\n \"aria-controls\": string;\n /** Autocomplete type. */\n \"aria-autocomplete\": \"list\" | \"none\" | \"inline\" | \"both\";\n /** Enter key hint for mobile keyboards. */\n enterKeyHint: \"go\";\n /** Disable autocorrect. */\n autoCorrect: \"off\";\n /** Disable spell check. */\n spellCheck: \"false\";\n /** Disable browser autocomplete. */\n autoComplete: \"off\";\n}\n\nexport interface AriaAutocompleteOptions<T = unknown> {\n /** Ref accessor for the input element. */\n inputRef: Accessor<HTMLInputElement | undefined>;\n /** Ref accessor for the collection element. */\n collectionRef: Accessor<HTMLElement | undefined>;\n /** Optional id override for the controlled collection element. */\n collectionId?: string;\n /** Optional accessible name for the controlled collection element. */\n collectionAriaLabel?: string;\n /**\n * An optional filter function used to determine if an option should be included.\n * @param textValue - The text value of the item\n * @param inputValue - The current input value\n * @param node - The collection node being filtered\n */\n filter?: (textValue: string, inputValue: string, node: CollectionNode<T>) => boolean;\n /**\n * Whether to focus the first item after filtering.\n * @default false\n */\n disableAutoFocusFirst?: boolean;\n /**\n * Whether to disable virtual focus (aria-activedescendant).\n * @default false\n */\n disableVirtualFocus?: boolean;\n}\n\nexport interface AutocompleteAria<T = unknown> {\n /** Props for the autocomplete input element. */\n inputProps: AutocompleteInputProps;\n /** Props for the collection (ListBox/Menu). */\n collectionProps: CollectionOptions;\n /** A filter function that returns if the item should be shown. */\n filter?: (nodeTextValue: string, node: CollectionNode<T>) => boolean;\n}\n\nfunction toKeyboardEventInit(e: KeyboardEvent): KeyboardEventInit {\n return {\n key: e.key,\n code: e.code,\n location: e.location,\n repeat: e.repeat,\n isComposing: e.isComposing,\n ctrlKey: e.ctrlKey,\n shiftKey: e.shiftKey,\n altKey: e.altKey,\n metaKey: e.metaKey,\n bubbles: e.bubbles,\n cancelable: e.cancelable,\n };\n}\n\n// Custom event names for collection communication.\n// These are the shared @react-aria/selection constants the collection's\n// createSelectableCollection listens for (FOCUS_EVENT / CLEAR_FOCUS_EVENT);\n// the aliases below are retained for backwards-compatible re-exports.\n/** @deprecated Use {@link FOCUS_EVENT} from the selection layer. */\nexport const AUTOCOMPLETE_FOCUS_EVENT = FOCUS_EVENT;\n/** @deprecated Use {@link CLEAR_FOCUS_EVENT} from the selection layer. */\nexport const AUTOCOMPLETE_CLEAR_FOCUS_EVENT = CLEAR_FOCUS_EVENT;\n\n/**\n * Provides the behavior and accessibility implementation for an autocomplete component.\n * An autocomplete combines a text input with a collection, allowing users to filter\n * the collection's contents to match a query.\n *\n * @example\n * ```tsx\n * const state = createAutocompleteState({ defaultInputValue: '' });\n * let inputRef, collectionRef;\n *\n * const { inputProps, collectionProps, filter } = createAutocomplete({\n * inputRef: () => inputRef,\n * collectionRef: () => collectionRef,\n * filter: (textValue, inputValue) =>\n * textValue.toLowerCase().includes(inputValue.toLowerCase()),\n * }, state);\n *\n * return (\n * <div>\n * <input ref={inputRef} {...inputProps} />\n * <ul ref={collectionRef} {...collectionProps}>\n * {items.filter(item => filter?.(item.name) ?? true).map(item => (\n * <li key={item.id}>{item.name}</li>\n * ))}\n * </ul>\n * </div>\n * );\n * ```\n */\nexport function createAutocomplete<T = unknown>(\n props: AriaAutocompleteOptions<T>,\n state: AutocompleteState,\n): AutocompleteAria<T> {\n const {\n inputRef,\n collectionRef,\n filter,\n collectionId: collectionIdProp,\n collectionAriaLabel,\n disableAutoFocusFirst = false,\n disableVirtualFocus = false,\n } = props;\n\n const collectionId = collectionIdProp ?? createId();\n const [shouldUseVirtualFocus] = createSignal(!disableVirtualFocus);\n // When the first item should be focused but the collection hasn't mounted yet,\n // defer it by threading autoFocus through collectionProps so the collection\n // focuses on mount (mirrors upstream's autoFocusOnMount state).\n const [autoFocusOnMount, setAutoFocusOnMount] = createSignal(false);\n let lastInputType = \"\";\n\n // Reverse-focus (collection → input aria-activedescendant) bookkeeping, mirroring\n // useAutocomplete's queuedActiveDescendant / delayNextActiveDescendant / timeout\n // refs. `queuedActiveDescendant` is the id of the option the collection has\n // virtually focused — tracked synchronously on every collection `focusin`, even\n // while the visible aria-activedescendant reflection is deferred, so key\n // navigation always dispatches to the right item. When typing forward,\n // `delayNextActiveDescendant` defers the next reflection behind a 500ms timeout so\n // a screen reader finishes announcing the just-typed letter before naming the\n // active option; every new focusin (and teardown) clears the pending timeout.\n let queuedActiveDescendant: string | null = null;\n let delayNextActiveDescendant = false;\n let activeDescendantTimeout: ReturnType<typeof setTimeout> | undefined;\n const ACTIVE_DESCENDANT_DELAY = 500;\n\n // Track the input type for determining focus behavior. We listen to\n // `beforeinput` (not `input`) so `lastInputType` is set before the input's\n // `onChange` runs, mirroring @react-aria/autocomplete.\n const handleBeforeInput = (e: Event) => {\n const inputEvent = e as InputEvent;\n lastInputType = inputEvent.inputType || \"\";\n };\n\n // Set up beforeinput event listener\n createTrackedEffect(() => {\n const _s2Cleanups: Array<() => void> = [];\n\n const input = inputRef();\n if (input) {\n input.addEventListener(\"beforeinput\", handleBeforeInput);\n _s2Cleanups.push(() => {\n input.removeEventListener(\"beforeinput\", handleBeforeInput);\n });\n }\n\n return () => {\n for (const c of _s2Cleanups) c();\n };\n });\n\n // Focus first item in collection\n const focusFirstItem = () => {\n // Typing forward focuses the first filtered row, but the resulting\n // aria-activedescendant reflection must wait so the SR announces the typed\n // letter first (see updateActiveDescendant). Mirrors useAutocomplete\n // setting delayNextActiveDescendant.current = true before the focus event.\n delayNextActiveDescendant = true;\n const collection = collectionRef();\n if (!collection) {\n // Collection isn't mounted yet — defer focusing the first item to mount\n // time via collectionProps.autoFocus instead of firing a focus event into\n // a not-yet-rendered collection.\n setAutoFocusOnMount(true);\n return;\n }\n collection.dispatchEvent(\n new CustomEvent(FOCUS_EVENT, {\n cancelable: true,\n bubbles: true,\n detail: { focusStrategy: \"first\" },\n }),\n );\n };\n\n // Clear virtual focus\n const clearVirtualFocus = (clearFocusKey = false) => {\n setAutoFocusOnMount(false);\n // Drop any pending delayed reflection and the tracked item alongside the\n // active descendant so a subsequent focusin can't resurrect a stale id\n // (mirrors useAutocomplete clearing queuedActiveDescendant / the timeout /\n // delayNextActiveDescendant in clearVirtualFocus).\n clearTimeout(activeDescendantTimeout);\n queuedActiveDescendant = null;\n delayNextActiveDescendant = false;\n state.setFocusedNodeId(null);\n const collection = collectionRef();\n if (collection) {\n collection.dispatchEvent(\n new CustomEvent(CLEAR_FOCUS_EVENT, {\n cancelable: true,\n bubbles: true,\n detail: { clearFocusKey },\n }),\n );\n }\n };\n\n // Handle input value changes\n const onChange = (value: string) => {\n // Focus first item when typing forward, clear when backspacing/pasting.\n // IME composition (e.g. CJK input) reports 'insertCompositionText'/\n // 'insertFromComposition' instead of 'insertText'; treat those as forward\n // typing so the first item still gets virtual focus.\n if (\n (lastInputType === \"insertText\" ||\n lastInputType === \"insertCompositionText\" ||\n lastInputType === \"insertFromComposition\") &&\n !disableAutoFocusFirst\n ) {\n focusFirstItem();\n } else if (\n lastInputType &&\n (lastInputType.includes(\"insert\") ||\n lastInputType.includes(\"delete\") ||\n lastInputType.includes(\"history\"))\n ) {\n clearVirtualFocus(true);\n }\n\n state.setInputValue(value);\n };\n\n // Handle keyboard navigation\n const onKeyDown = (e: KeyboardEvent) => {\n if (\"isComposing\" in e && e.isComposing) {\n return;\n }\n\n // Navigate against the id the collection has virtually focused, tracked\n // synchronously on every focusin, NOT the (possibly still-delayed)\n // aria-activedescendant reflection in state — mirrors useAutocomplete\n // reading queuedActiveDescendant.current here. Reading state.focusedNodeId()\n // would be null during the post-type reflection delay, so arrows would\n // re-focus the first row instead of advancing.\n const focusedNodeId = queuedActiveDescendant;\n const collection = collectionRef();\n const ownerDocument = getOwnerDocument(inputRef() ?? collection);\n\n switch (e.key) {\n case \"Escape\":\n // Let the input handle Escape (e.g., clear value)\n if (e.defaultPrevented) {\n return;\n }\n break;\n\n case \" \":\n // Space shouldn't trigger item action\n return;\n\n case \"Tab\":\n // Let Tab propagate normally for focus management\n return;\n\n case \"ArrowUp\":\n case \"ArrowDown\":\n case \"Home\":\n case \"End\":\n case \"PageUp\":\n case \"PageDown\": {\n // Prevent cursor movement in input\n e.preventDefault();\n\n // Dispatch focus event to collection\n if (collection) {\n collection.dispatchEvent(\n new CustomEvent(FOCUS_EVENT, {\n cancelable: true,\n bubbles: true,\n }),\n );\n }\n break;\n }\n\n case \"ArrowLeft\":\n case \"ArrowRight\":\n // With no virtual focus, just let the arrow move the text cursor; stop\n // propagation so it doesn't leak into the collection. With virtual focus,\n // fall through to dispatch the key to the focused item below, then clear\n // the active descendant only after the item has seen it.\n if (!focusedNodeId) {\n e.stopPropagation();\n return;\n }\n break;\n\n case \"Enter\":\n // Trigger click on focused item\n if (focusedNodeId) {\n const item = ownerDocument?.getElementById(focusedNodeId);\n if (item) {\n item.click();\n e.preventDefault();\n }\n }\n return;\n }\n\n // Forward keyboard events to the focused item (or the collection when there\n // is no virtual focus) so the collection can act on them, e.g. onAction.\n // Gated only on the collection existing — NOT on e.defaultPrevented: arrows\n // call preventDefault above to stop the input's text cursor moving, but the\n // key must still be re-dispatched to the row so navigation advances (mirrors\n // useAutocomplete forwarding whenever collectionRef.current !== null).\n if (collection) {\n e.stopPropagation();\n\n let shouldPerformDefaultAction = true;\n if (focusedNodeId) {\n const item = ownerDocument?.getElementById(focusedNodeId);\n if (item) {\n shouldPerformDefaultAction = item.dispatchEvent(\n new KeyboardEvent(e.type, toKeyboardEventInit(e)),\n );\n }\n } else {\n shouldPerformDefaultAction = collection.dispatchEvent(\n new KeyboardEvent(e.type, toKeyboardEventInit(e)),\n );\n }\n\n // After the focused item has seen ArrowLeft/ArrowRight, clear the active\n // descendant so SR announcements aren't interrupted, but retain the\n // collection's focused key so navigation restarts where it left off. If\n // the item consumed the key (e.g. an expandable row collapsing), it\n // cancels the event and we keep virtual focus.\n if (shouldPerformDefaultAction && (e.key === \"ArrowLeft\" || e.key === \"ArrowRight\")) {\n clearVirtualFocus();\n }\n }\n };\n\n // Handle focus events\n const onFocus = (e: FocusEvent) => {\n if (!e.isTrusted) return;\n\n // Restore virtual focus when refocusing input\n const focusedNodeId = state.focusedNodeId();\n if (focusedNodeId) {\n const item = document.getElementById(focusedNodeId);\n if (item) {\n // Item still exists, keep focus on it\n }\n }\n };\n\n const onBlur = (e: FocusEvent) => {\n if (!e.isTrusted) return;\n // Virtual focus blur handling would go here\n };\n\n // Reverse path: mirror the collection's virtually-focused option into the\n // input's aria-activedescendant. The collection dispatches a synthetic,\n // bubbling `focusin` (via moveVirtualFocus) on its focused option; we read the\n // target id, track it in `queuedActiveDescendant` synchronously (so key nav\n // always dispatches to the right item), and reflect it into AutocompleteState\n // — immediately, or, when `delayNextActiveDescendant` was set by forward\n // typing, behind a 500ms timeout so the SR finishes announcing the typed\n // letter before naming the active option. Faithful port of useAutocomplete's\n // updateActiveDescendantEvent.\n const updateActiveDescendant = (e: Event) => {\n const input = inputRef();\n // If the user clicks/taps an option directly (non-touch), pull real focus\n // back to the input so typing keeps working.\n if (\n !e.isTrusted &&\n shouldUseVirtualFocus() &&\n input &&\n getActiveElement(getOwnerDocument(input)) !== input &&\n getPointerType() !== \"touch\"\n ) {\n input.focus();\n }\n\n const target = getEventTarget<Element>(e);\n if (e.isTrusted || !target || queuedActiveDescendant === target.id) {\n return;\n }\n\n const collection = collectionRef();\n // A new focusin supersedes any pending delayed reflection.\n clearTimeout(activeDescendantTimeout);\n if (target !== collection) {\n const targetId = target.id;\n if (delayNextActiveDescendant) {\n // Forward typing just focused the first row: track it now, but defer the\n // aria-activedescendant reflection so the just-typed letter is announced\n // before the active option.\n queuedActiveDescendant = targetId;\n activeDescendantTimeout = setTimeout(() => {\n state.setFocusedNodeId(targetId);\n }, ACTIVE_DESCENDANT_DELAY);\n } else {\n queuedActiveDescendant = targetId;\n state.setFocusedNodeId(targetId);\n }\n } else if (\n queuedActiveDescendant &&\n !getOwnerDocument(collection)?.getElementById(queuedActiveDescendant)\n ) {\n // Refocus of the collection itself while the previously focused node no\n // longer exists (filtered away, or the input was refocused): clear the\n // tracked item and the active descendant.\n queuedActiveDescendant = null;\n state.setFocusedNodeId(null);\n }\n // Reflection delay is a one-shot; the next focusin reflects immediately\n // unless forward typing sets the flag again.\n delayNextActiveDescendant = false;\n };\n\n createTrackedEffect(() => {\n const _s2Cleanups: Array<() => void> = [];\n\n if (!shouldUseVirtualFocus()) return;\n const collection = collectionRef();\n if (collection) {\n collection.addEventListener(\"focusin\", updateActiveDescendant);\n _s2Cleanups.push(() => {\n collection.removeEventListener(\"focusin\", updateActiveDescendant);\n clearTimeout(activeDescendantTimeout);\n });\n }\n\n return () => {\n for (const c of _s2Cleanups) c();\n };\n });\n\n // Create filter function. The user's 3-arg predicate (textValue, inputValue,\n // node) is closed over the current input value and exposed to the collection\n // as the 2-arg (nodeTextValue, node) shape that UNSTABLE_useFilteredListState\n // (createFilteredListState) expects.\n const filterFn = filter\n ? (nodeTextValue: string, node: CollectionNode<T>) =>\n filter(nodeTextValue, state.inputValue(), node)\n : undefined;\n\n return {\n inputProps: {\n value: state.inputValue,\n onChange,\n onKeyDown,\n onFocus,\n onBlur,\n get \"aria-activedescendant\"() {\n return () => (shouldUseVirtualFocus() ? (state.focusedNodeId() ?? undefined) : undefined);\n },\n \"aria-controls\": collectionId,\n \"aria-autocomplete\": \"list\",\n enterKeyHint: \"go\",\n autoCorrect: \"off\",\n spellCheck: \"false\",\n autoComplete: \"off\",\n },\n collectionProps: {\n id: collectionId,\n \"aria-label\": collectionAriaLabel,\n shouldUseVirtualFocus: shouldUseVirtualFocus(),\n disallowTypeAhead: shouldUseVirtualFocus(),\n get autoFocus() {\n return autoFocusOnMount() ? \"first\" : false;\n },\n },\n filter: filterFn,\n };\n}\n"],"mappings":"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"}
@@ -1,8 +1,19 @@
1
- import { a as getEventTarget, i as getActiveElement } from "./focus.jsx";
2
- import { s as getPointerType } from "./createInteractionModality.jsx";
1
+ /*
2
+ * Copyright 2024 Adobe. All rights reserved.
3
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
+ * you may not use this file except in compliance with the License. You may obtain a copy
5
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ *
7
+ * Unless required by applicable law or agreed to in writing, software distributed under
8
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9
+ * OF ANY KIND, either express or implied. See the License for the specific language
10
+ * governing permissions and limitations under the License.
11
+ */
12
+ // Ported to SolidJS for Proyecto Viviana; based on packages/react-aria/src/autocomplete/useAutocomplete.ts
13
+ import { P as getPointerType, n as getActiveElement, r as getEventTarget } from "./dom.jsx";
3
14
  import { createId, getOwnerDocument } from "../ssr/index.jsx";
4
15
  import { n as FOCUS_EVENT, t as CLEAR_FOCUS_EVENT } from "./constants.jsx";
5
- import { createEffect, createSignal, onCleanup } from "solid-js";
16
+ import { createSignal, createTrackedEffect } from "solid-js";
6
17
  //#region src/autocomplete/createAutocomplete.ts
7
18
  /**
8
19
  * createAutocomplete - Accessibility hook for autocomplete components
@@ -73,14 +84,18 @@ function createAutocomplete(props, state) {
73
84
  const handleBeforeInput = (e) => {
74
85
  lastInputType = e.inputType || "";
75
86
  };
76
- createEffect(() => {
87
+ createTrackedEffect(() => {
88
+ const _s2Cleanups = [];
77
89
  const input = inputRef();
78
90
  if (input) {
79
91
  input.addEventListener("beforeinput", handleBeforeInput);
80
- onCleanup(() => {
92
+ _s2Cleanups.push(() => {
81
93
  input.removeEventListener("beforeinput", handleBeforeInput);
82
94
  });
83
95
  }
96
+ return () => {
97
+ for (const c of _s2Cleanups) c();
98
+ };
84
99
  });
85
100
  const focusFirstItem = () => {
86
101
  delayNextActiveDescendant = true;
@@ -197,16 +212,20 @@ function createAutocomplete(props, state) {
197
212
  }
198
213
  delayNextActiveDescendant = false;
199
214
  };
200
- createEffect(() => {
215
+ createTrackedEffect(() => {
216
+ const _s2Cleanups = [];
201
217
  if (!shouldUseVirtualFocus()) return;
202
218
  const collection = collectionRef();
203
219
  if (collection) {
204
220
  collection.addEventListener("focusin", updateActiveDescendant);
205
- onCleanup(() => {
221
+ _s2Cleanups.push(() => {
206
222
  collection.removeEventListener("focusin", updateActiveDescendant);
207
223
  clearTimeout(activeDescendantTimeout);
208
224
  });
209
225
  }
226
+ return () => {
227
+ for (const c of _s2Cleanups) c();
228
+ };
210
229
  });
211
230
  const filterFn = filter ? (nodeTextValue, node) => filter(nodeTextValue, state.inputValue(), node) : void 0;
212
231
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"autocomplete.jsx","names":["inputEvent"],"sources":["../../src/autocomplete/createAutocomplete.ts"],"sourcesContent":["/**\n * createAutocomplete - Accessibility hook for autocomplete components\n *\n * Provides keyboard navigation, virtual focus via aria-activedescendant,\n * and filtering capabilities for autocomplete inputs.\n *\n * Based on @react-aria/autocomplete useAutocomplete.\n */\n\nimport { createSignal, createEffect, onCleanup, type Accessor } from \"solid-js\";\nimport { createId, getOwnerDocument } from \"../ssr\";\nimport { type AutocompleteState, type CollectionNode } from \"@proyecto-viviana/solid-stately\";\nimport { FOCUS_EVENT, CLEAR_FOCUS_EVENT } from \"../selection/constants\";\nimport { getActiveElement, getEventTarget } from \"../utils/dom\";\nimport { getPointerType } from \"../interactions\";\n\nexport interface CollectionOptions {\n /** The id of the collection element. */\n id?: string;\n /** Accessible label for the collection. */\n \"aria-label\"?: string;\n /** Whether the collection items should use virtual focus instead of being focused directly. */\n shouldUseVirtualFocus: boolean;\n /** Whether typeahead is disabled. */\n disallowTypeAhead: boolean;\n /** Whether and where to focus an item when the collection mounts. */\n autoFocus?: boolean | \"first\" | \"last\";\n}\n\nexport interface AutocompleteInputProps {\n /** Current input value. */\n value: Accessor<string>;\n /** Handler for input value changes. */\n onChange: (value: string) => void;\n /** Handler for key events. */\n onKeyDown: (e: KeyboardEvent) => void;\n /** Handler for focus events. */\n onFocus: (e: FocusEvent) => void;\n /** Handler for blur events. */\n onBlur: (e: FocusEvent) => void;\n /** The id of the currently focused item for aria-activedescendant. */\n \"aria-activedescendant\": Accessor<string | undefined>;\n /** The id of the controlled collection. */\n \"aria-controls\": string;\n /** Autocomplete type. */\n \"aria-autocomplete\": \"list\" | \"none\" | \"inline\" | \"both\";\n /** Enter key hint for mobile keyboards. */\n enterKeyHint: \"go\";\n /** Disable autocorrect. */\n autoCorrect: \"off\";\n /** Disable spell check. */\n spellCheck: \"false\";\n /** Disable browser autocomplete. */\n autoComplete: \"off\";\n}\n\nexport interface AriaAutocompleteOptions<T = unknown> {\n /** Ref accessor for the input element. */\n inputRef: Accessor<HTMLInputElement | undefined>;\n /** Ref accessor for the collection element. */\n collectionRef: Accessor<HTMLElement | undefined>;\n /** Optional id override for the controlled collection element. */\n collectionId?: string;\n /** Optional accessible name for the controlled collection element. */\n collectionAriaLabel?: string;\n /**\n * An optional filter function used to determine if an option should be included.\n * @param textValue - The text value of the item\n * @param inputValue - The current input value\n * @param node - The collection node being filtered\n */\n filter?: (textValue: string, inputValue: string, node: CollectionNode<T>) => boolean;\n /**\n * Whether to focus the first item after filtering.\n * @default false\n */\n disableAutoFocusFirst?: boolean;\n /**\n * Whether to disable virtual focus (aria-activedescendant).\n * @default false\n */\n disableVirtualFocus?: boolean;\n}\n\nexport interface AutocompleteAria<T = unknown> {\n /** Props for the autocomplete input element. */\n inputProps: AutocompleteInputProps;\n /** Props for the collection (ListBox/Menu). */\n collectionProps: CollectionOptions;\n /** A filter function that returns if the item should be shown. */\n filter?: (nodeTextValue: string, node: CollectionNode<T>) => boolean;\n}\n\nfunction toKeyboardEventInit(e: KeyboardEvent): KeyboardEventInit {\n return {\n key: e.key,\n code: e.code,\n location: e.location,\n repeat: e.repeat,\n isComposing: e.isComposing,\n ctrlKey: e.ctrlKey,\n shiftKey: e.shiftKey,\n altKey: e.altKey,\n metaKey: e.metaKey,\n bubbles: e.bubbles,\n cancelable: e.cancelable,\n };\n}\n\n// Custom event names for collection communication.\n// These are the shared @react-aria/selection constants the collection's\n// createSelectableCollection listens for (FOCUS_EVENT / CLEAR_FOCUS_EVENT);\n// the aliases below are retained for backwards-compatible re-exports.\n/** @deprecated Use {@link FOCUS_EVENT} from the selection layer. */\nexport const AUTOCOMPLETE_FOCUS_EVENT = FOCUS_EVENT;\n/** @deprecated Use {@link CLEAR_FOCUS_EVENT} from the selection layer. */\nexport const AUTOCOMPLETE_CLEAR_FOCUS_EVENT = CLEAR_FOCUS_EVENT;\n\n/**\n * Provides the behavior and accessibility implementation for an autocomplete component.\n * An autocomplete combines a text input with a collection, allowing users to filter\n * the collection's contents to match a query.\n *\n * @example\n * ```tsx\n * const state = createAutocompleteState({ defaultInputValue: '' });\n * let inputRef, collectionRef;\n *\n * const { inputProps, collectionProps, filter } = createAutocomplete({\n * inputRef: () => inputRef,\n * collectionRef: () => collectionRef,\n * filter: (textValue, inputValue) =>\n * textValue.toLowerCase().includes(inputValue.toLowerCase()),\n * }, state);\n *\n * return (\n * <div>\n * <input ref={inputRef} {...inputProps} />\n * <ul ref={collectionRef} {...collectionProps}>\n * {items.filter(item => filter?.(item.name) ?? true).map(item => (\n * <li key={item.id}>{item.name}</li>\n * ))}\n * </ul>\n * </div>\n * );\n * ```\n */\nexport function createAutocomplete<T = unknown>(\n props: AriaAutocompleteOptions<T>,\n state: AutocompleteState,\n): AutocompleteAria<T> {\n const {\n inputRef,\n collectionRef,\n filter,\n collectionId: collectionIdProp,\n collectionAriaLabel,\n disableAutoFocusFirst = false,\n disableVirtualFocus = false,\n } = props;\n\n const collectionId = collectionIdProp ?? createId();\n const [shouldUseVirtualFocus] = createSignal(!disableVirtualFocus);\n // When the first item should be focused but the collection hasn't mounted yet,\n // defer it by threading autoFocus through collectionProps so the collection\n // focuses on mount (mirrors upstream's autoFocusOnMount state).\n const [autoFocusOnMount, setAutoFocusOnMount] = createSignal(false);\n let lastInputType = \"\";\n\n // Reverse-focus (collection → input aria-activedescendant) bookkeeping, mirroring\n // useAutocomplete's queuedActiveDescendant / delayNextActiveDescendant / timeout\n // refs. `queuedActiveDescendant` is the id of the option the collection has\n // virtually focused — tracked synchronously on every collection `focusin`, even\n // while the visible aria-activedescendant reflection is deferred, so key\n // navigation always dispatches to the right item. When typing forward,\n // `delayNextActiveDescendant` defers the next reflection behind a 500ms timeout so\n // a screen reader finishes announcing the just-typed letter before naming the\n // active option; every new focusin (and teardown) clears the pending timeout.\n let queuedActiveDescendant: string | null = null;\n let delayNextActiveDescendant = false;\n let activeDescendantTimeout: ReturnType<typeof setTimeout> | undefined;\n const ACTIVE_DESCENDANT_DELAY = 500;\n\n // Track the input type for determining focus behavior. We listen to\n // `beforeinput` (not `input`) so `lastInputType` is set before the input's\n // `onChange` runs, mirroring @react-aria/autocomplete.\n const handleBeforeInput = (e: Event) => {\n const inputEvent = e as InputEvent;\n lastInputType = inputEvent.inputType || \"\";\n };\n\n // Set up beforeinput event listener\n createEffect(() => {\n const input = inputRef();\n if (input) {\n input.addEventListener(\"beforeinput\", handleBeforeInput);\n onCleanup(() => {\n input.removeEventListener(\"beforeinput\", handleBeforeInput);\n });\n }\n });\n\n // Focus first item in collection\n const focusFirstItem = () => {\n // Typing forward focuses the first filtered row, but the resulting\n // aria-activedescendant reflection must wait so the SR announces the typed\n // letter first (see updateActiveDescendant). Mirrors useAutocomplete\n // setting delayNextActiveDescendant.current = true before the focus event.\n delayNextActiveDescendant = true;\n const collection = collectionRef();\n if (!collection) {\n // Collection isn't mounted yet — defer focusing the first item to mount\n // time via collectionProps.autoFocus instead of firing a focus event into\n // a not-yet-rendered collection.\n setAutoFocusOnMount(true);\n return;\n }\n collection.dispatchEvent(\n new CustomEvent(FOCUS_EVENT, {\n cancelable: true,\n bubbles: true,\n detail: { focusStrategy: \"first\" },\n }),\n );\n };\n\n // Clear virtual focus\n const clearVirtualFocus = (clearFocusKey = false) => {\n setAutoFocusOnMount(false);\n // Drop any pending delayed reflection and the tracked item alongside the\n // active descendant so a subsequent focusin can't resurrect a stale id\n // (mirrors useAutocomplete clearing queuedActiveDescendant / the timeout /\n // delayNextActiveDescendant in clearVirtualFocus).\n clearTimeout(activeDescendantTimeout);\n queuedActiveDescendant = null;\n delayNextActiveDescendant = false;\n state.setFocusedNodeId(null);\n const collection = collectionRef();\n if (collection) {\n collection.dispatchEvent(\n new CustomEvent(CLEAR_FOCUS_EVENT, {\n cancelable: true,\n bubbles: true,\n detail: { clearFocusKey },\n }),\n );\n }\n };\n\n // Handle input value changes\n const onChange = (value: string) => {\n // Focus first item when typing forward, clear when backspacing/pasting.\n // IME composition (e.g. CJK input) reports 'insertCompositionText'/\n // 'insertFromComposition' instead of 'insertText'; treat those as forward\n // typing so the first item still gets virtual focus.\n if (\n (lastInputType === \"insertText\" ||\n lastInputType === \"insertCompositionText\" ||\n lastInputType === \"insertFromComposition\") &&\n !disableAutoFocusFirst\n ) {\n focusFirstItem();\n } else if (\n lastInputType &&\n (lastInputType.includes(\"insert\") ||\n lastInputType.includes(\"delete\") ||\n lastInputType.includes(\"history\"))\n ) {\n clearVirtualFocus(true);\n }\n\n state.setInputValue(value);\n };\n\n // Handle keyboard navigation\n const onKeyDown = (e: KeyboardEvent) => {\n if (\"isComposing\" in e && e.isComposing) {\n return;\n }\n\n // Navigate against the id the collection has virtually focused, tracked\n // synchronously on every focusin, NOT the (possibly still-delayed)\n // aria-activedescendant reflection in state — mirrors useAutocomplete\n // reading queuedActiveDescendant.current here. Reading state.focusedNodeId()\n // would be null during the post-type reflection delay, so arrows would\n // re-focus the first row instead of advancing.\n const focusedNodeId = queuedActiveDescendant;\n const collection = collectionRef();\n const ownerDocument = getOwnerDocument(inputRef() ?? collection);\n\n switch (e.key) {\n case \"Escape\":\n // Let the input handle Escape (e.g., clear value)\n if (e.defaultPrevented) {\n return;\n }\n break;\n\n case \" \":\n // Space shouldn't trigger item action\n return;\n\n case \"Tab\":\n // Let Tab propagate normally for focus management\n return;\n\n case \"ArrowUp\":\n case \"ArrowDown\":\n case \"Home\":\n case \"End\":\n case \"PageUp\":\n case \"PageDown\": {\n // Prevent cursor movement in input\n e.preventDefault();\n\n // Dispatch focus event to collection\n if (collection) {\n collection.dispatchEvent(\n new CustomEvent(FOCUS_EVENT, {\n cancelable: true,\n bubbles: true,\n }),\n );\n }\n break;\n }\n\n case \"ArrowLeft\":\n case \"ArrowRight\":\n // With no virtual focus, just let the arrow move the text cursor; stop\n // propagation so it doesn't leak into the collection. With virtual focus,\n // fall through to dispatch the key to the focused item below, then clear\n // the active descendant only after the item has seen it.\n if (!focusedNodeId) {\n e.stopPropagation();\n return;\n }\n break;\n\n case \"Enter\":\n // Trigger click on focused item\n if (focusedNodeId) {\n const item = ownerDocument?.getElementById(focusedNodeId);\n if (item) {\n item.click();\n e.preventDefault();\n }\n }\n return;\n }\n\n // Forward keyboard events to the focused item (or the collection when there\n // is no virtual focus) so the collection can act on them, e.g. onAction.\n // Gated only on the collection existing — NOT on e.defaultPrevented: arrows\n // call preventDefault above to stop the input's text cursor moving, but the\n // key must still be re-dispatched to the row so navigation advances (mirrors\n // useAutocomplete forwarding whenever collectionRef.current !== null).\n if (collection) {\n e.stopPropagation();\n\n let shouldPerformDefaultAction = true;\n if (focusedNodeId) {\n const item = ownerDocument?.getElementById(focusedNodeId);\n if (item) {\n shouldPerformDefaultAction = item.dispatchEvent(\n new KeyboardEvent(e.type, toKeyboardEventInit(e)),\n );\n }\n } else {\n shouldPerformDefaultAction = collection.dispatchEvent(\n new KeyboardEvent(e.type, toKeyboardEventInit(e)),\n );\n }\n\n // After the focused item has seen ArrowLeft/ArrowRight, clear the active\n // descendant so SR announcements aren't interrupted, but retain the\n // collection's focused key so navigation restarts where it left off. If\n // the item consumed the key (e.g. an expandable row collapsing), it\n // cancels the event and we keep virtual focus.\n if (shouldPerformDefaultAction && (e.key === \"ArrowLeft\" || e.key === \"ArrowRight\")) {\n clearVirtualFocus();\n }\n }\n };\n\n // Handle focus events\n const onFocus = (e: FocusEvent) => {\n if (!e.isTrusted) return;\n\n // Restore virtual focus when refocusing input\n const focusedNodeId = state.focusedNodeId();\n if (focusedNodeId) {\n const item = document.getElementById(focusedNodeId);\n if (item) {\n // Item still exists, keep focus on it\n }\n }\n };\n\n const onBlur = (e: FocusEvent) => {\n if (!e.isTrusted) return;\n // Virtual focus blur handling would go here\n };\n\n // Reverse path: mirror the collection's virtually-focused option into the\n // input's aria-activedescendant. The collection dispatches a synthetic,\n // bubbling `focusin` (via moveVirtualFocus) on its focused option; we read the\n // target id, track it in `queuedActiveDescendant` synchronously (so key nav\n // always dispatches to the right item), and reflect it into AutocompleteState\n // — immediately, or, when `delayNextActiveDescendant` was set by forward\n // typing, behind a 500ms timeout so the SR finishes announcing the typed\n // letter before naming the active option. Faithful port of useAutocomplete's\n // updateActiveDescendantEvent.\n const updateActiveDescendant = (e: Event) => {\n const input = inputRef();\n // If the user clicks/taps an option directly (non-touch), pull real focus\n // back to the input so typing keeps working.\n if (\n !e.isTrusted &&\n shouldUseVirtualFocus() &&\n input &&\n getActiveElement(getOwnerDocument(input)) !== input &&\n getPointerType() !== \"touch\"\n ) {\n input.focus();\n }\n\n const target = getEventTarget<Element>(e);\n if (e.isTrusted || !target || queuedActiveDescendant === target.id) {\n return;\n }\n\n const collection = collectionRef();\n // A new focusin supersedes any pending delayed reflection.\n clearTimeout(activeDescendantTimeout);\n if (target !== collection) {\n const targetId = target.id;\n if (delayNextActiveDescendant) {\n // Forward typing just focused the first row: track it now, but defer the\n // aria-activedescendant reflection so the just-typed letter is announced\n // before the active option.\n queuedActiveDescendant = targetId;\n activeDescendantTimeout = setTimeout(() => {\n state.setFocusedNodeId(targetId);\n }, ACTIVE_DESCENDANT_DELAY);\n } else {\n queuedActiveDescendant = targetId;\n state.setFocusedNodeId(targetId);\n }\n } else if (\n queuedActiveDescendant &&\n !getOwnerDocument(collection)?.getElementById(queuedActiveDescendant)\n ) {\n // Refocus of the collection itself while the previously focused node no\n // longer exists (filtered away, or the input was refocused): clear the\n // tracked item and the active descendant.\n queuedActiveDescendant = null;\n state.setFocusedNodeId(null);\n }\n // Reflection delay is a one-shot; the next focusin reflects immediately\n // unless forward typing sets the flag again.\n delayNextActiveDescendant = false;\n };\n\n createEffect(() => {\n if (!shouldUseVirtualFocus()) return;\n const collection = collectionRef();\n if (collection) {\n collection.addEventListener(\"focusin\", updateActiveDescendant);\n onCleanup(() => {\n collection.removeEventListener(\"focusin\", updateActiveDescendant);\n clearTimeout(activeDescendantTimeout);\n });\n }\n });\n\n // Create filter function. The user's 3-arg predicate (textValue, inputValue,\n // node) is closed over the current input value and exposed to the collection\n // as the 2-arg (nodeTextValue, node) shape that UNSTABLE_useFilteredListState\n // (createFilteredListState) expects.\n const filterFn = filter\n ? (nodeTextValue: string, node: CollectionNode<T>) =>\n filter(nodeTextValue, state.inputValue(), node)\n : undefined;\n\n return {\n inputProps: {\n value: state.inputValue,\n onChange,\n onKeyDown,\n onFocus,\n onBlur,\n get \"aria-activedescendant\"() {\n return () => (shouldUseVirtualFocus() ? (state.focusedNodeId() ?? undefined) : undefined);\n },\n \"aria-controls\": collectionId,\n \"aria-autocomplete\": \"list\",\n enterKeyHint: \"go\",\n autoCorrect: \"off\",\n spellCheck: \"false\",\n autoComplete: \"off\",\n },\n collectionProps: {\n id: collectionId,\n \"aria-label\": collectionAriaLabel,\n shouldUseVirtualFocus: shouldUseVirtualFocus(),\n disallowTypeAhead: shouldUseVirtualFocus(),\n get autoFocus() {\n return autoFocusOnMount() ? \"first\" : false;\n },\n },\n filter: filterFn,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"autocomplete.jsx","names":["inputEvent"],"sources":["../../src/autocomplete/createAutocomplete.ts"],"sourcesContent":["/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n// Ported to SolidJS for Proyecto Viviana; based on packages/react-aria/src/autocomplete/useAutocomplete.ts\n\n/**\n * createAutocomplete - Accessibility hook for autocomplete components\n *\n * Provides keyboard navigation, virtual focus via aria-activedescendant,\n * and filtering capabilities for autocomplete inputs.\n *\n * Based on @react-aria/autocomplete useAutocomplete.\n */\n\nimport { createSignal, createTrackedEffect } from \"solid-js\";\nimport type { Accessor } from \"solid-js\";\nimport { createId, getOwnerDocument } from \"../ssr\";\nimport { type AutocompleteState, type CollectionNode } from \"@proyecto-viviana/solid-stately\";\nimport { FOCUS_EVENT, CLEAR_FOCUS_EVENT } from \"../selection/constants\";\nimport { getActiveElement, getEventTarget } from \"../utils/dom\";\nimport { getPointerType } from \"../interactions\";\n\nexport interface CollectionOptions {\n /** The id of the collection element. */\n id?: string;\n /** Accessible label for the collection. */\n \"aria-label\"?: string;\n /** Whether the collection items should use virtual focus instead of being focused directly. */\n shouldUseVirtualFocus: boolean;\n /** Whether typeahead is disabled. */\n disallowTypeAhead: boolean;\n /** Whether and where to focus an item when the collection mounts. */\n autoFocus?: boolean | \"first\" | \"last\";\n}\n\nexport interface AutocompleteInputProps {\n /** Current input value. */\n value: Accessor<string>;\n /** Handler for input value changes. */\n onChange: (value: string) => void;\n /** Handler for key events. */\n onKeyDown: (e: KeyboardEvent) => void;\n /** Handler for focus events. */\n onFocus: (e: FocusEvent) => void;\n /** Handler for blur events. */\n onBlur: (e: FocusEvent) => void;\n /** The id of the currently focused item for aria-activedescendant. */\n \"aria-activedescendant\": Accessor<string | undefined>;\n /** The id of the controlled collection. */\n \"aria-controls\": string;\n /** Autocomplete type. */\n \"aria-autocomplete\": \"list\" | \"none\" | \"inline\" | \"both\";\n /** Enter key hint for mobile keyboards. */\n enterKeyHint: \"go\";\n /** Disable autocorrect. */\n autoCorrect: \"off\";\n /** Disable spell check. */\n spellCheck: \"false\";\n /** Disable browser autocomplete. */\n autoComplete: \"off\";\n}\n\nexport interface AriaAutocompleteOptions<T = unknown> {\n /** Ref accessor for the input element. */\n inputRef: Accessor<HTMLInputElement | undefined>;\n /** Ref accessor for the collection element. */\n collectionRef: Accessor<HTMLElement | undefined>;\n /** Optional id override for the controlled collection element. */\n collectionId?: string;\n /** Optional accessible name for the controlled collection element. */\n collectionAriaLabel?: string;\n /**\n * An optional filter function used to determine if an option should be included.\n * @param textValue - The text value of the item\n * @param inputValue - The current input value\n * @param node - The collection node being filtered\n */\n filter?: (textValue: string, inputValue: string, node: CollectionNode<T>) => boolean;\n /**\n * Whether to focus the first item after filtering.\n * @default false\n */\n disableAutoFocusFirst?: boolean;\n /**\n * Whether to disable virtual focus (aria-activedescendant).\n * @default false\n */\n disableVirtualFocus?: boolean;\n}\n\nexport interface AutocompleteAria<T = unknown> {\n /** Props for the autocomplete input element. */\n inputProps: AutocompleteInputProps;\n /** Props for the collection (ListBox/Menu). */\n collectionProps: CollectionOptions;\n /** A filter function that returns if the item should be shown. */\n filter?: (nodeTextValue: string, node: CollectionNode<T>) => boolean;\n}\n\nfunction toKeyboardEventInit(e: KeyboardEvent): KeyboardEventInit {\n return {\n key: e.key,\n code: e.code,\n location: e.location,\n repeat: e.repeat,\n isComposing: e.isComposing,\n ctrlKey: e.ctrlKey,\n shiftKey: e.shiftKey,\n altKey: e.altKey,\n metaKey: e.metaKey,\n bubbles: e.bubbles,\n cancelable: e.cancelable,\n };\n}\n\n// Custom event names for collection communication.\n// These are the shared @react-aria/selection constants the collection's\n// createSelectableCollection listens for (FOCUS_EVENT / CLEAR_FOCUS_EVENT);\n// the aliases below are retained for backwards-compatible re-exports.\n/** @deprecated Use {@link FOCUS_EVENT} from the selection layer. */\nexport const AUTOCOMPLETE_FOCUS_EVENT = FOCUS_EVENT;\n/** @deprecated Use {@link CLEAR_FOCUS_EVENT} from the selection layer. */\nexport const AUTOCOMPLETE_CLEAR_FOCUS_EVENT = CLEAR_FOCUS_EVENT;\n\n/**\n * Provides the behavior and accessibility implementation for an autocomplete component.\n * An autocomplete combines a text input with a collection, allowing users to filter\n * the collection's contents to match a query.\n *\n * @example\n * ```tsx\n * const state = createAutocompleteState({ defaultInputValue: '' });\n * let inputRef, collectionRef;\n *\n * const { inputProps, collectionProps, filter } = createAutocomplete({\n * inputRef: () => inputRef,\n * collectionRef: () => collectionRef,\n * filter: (textValue, inputValue) =>\n * textValue.toLowerCase().includes(inputValue.toLowerCase()),\n * }, state);\n *\n * return (\n * <div>\n * <input ref={inputRef} {...inputProps} />\n * <ul ref={collectionRef} {...collectionProps}>\n * {items.filter(item => filter?.(item.name) ?? true).map(item => (\n * <li key={item.id}>{item.name}</li>\n * ))}\n * </ul>\n * </div>\n * );\n * ```\n */\nexport function createAutocomplete<T = unknown>(\n props: AriaAutocompleteOptions<T>,\n state: AutocompleteState,\n): AutocompleteAria<T> {\n const {\n inputRef,\n collectionRef,\n filter,\n collectionId: collectionIdProp,\n collectionAriaLabel,\n disableAutoFocusFirst = false,\n disableVirtualFocus = false,\n } = props;\n\n const collectionId = collectionIdProp ?? createId();\n const [shouldUseVirtualFocus] = createSignal(!disableVirtualFocus);\n // When the first item should be focused but the collection hasn't mounted yet,\n // defer it by threading autoFocus through collectionProps so the collection\n // focuses on mount (mirrors upstream's autoFocusOnMount state).\n const [autoFocusOnMount, setAutoFocusOnMount] = createSignal(false);\n let lastInputType = \"\";\n\n // Reverse-focus (collection → input aria-activedescendant) bookkeeping, mirroring\n // useAutocomplete's queuedActiveDescendant / delayNextActiveDescendant / timeout\n // refs. `queuedActiveDescendant` is the id of the option the collection has\n // virtually focused — tracked synchronously on every collection `focusin`, even\n // while the visible aria-activedescendant reflection is deferred, so key\n // navigation always dispatches to the right item. When typing forward,\n // `delayNextActiveDescendant` defers the next reflection behind a 500ms timeout so\n // a screen reader finishes announcing the just-typed letter before naming the\n // active option; every new focusin (and teardown) clears the pending timeout.\n let queuedActiveDescendant: string | null = null;\n let delayNextActiveDescendant = false;\n let activeDescendantTimeout: ReturnType<typeof setTimeout> | undefined;\n const ACTIVE_DESCENDANT_DELAY = 500;\n\n // Track the input type for determining focus behavior. We listen to\n // `beforeinput` (not `input`) so `lastInputType` is set before the input's\n // `onChange` runs, mirroring @react-aria/autocomplete.\n const handleBeforeInput = (e: Event) => {\n const inputEvent = e as InputEvent;\n lastInputType = inputEvent.inputType || \"\";\n };\n\n // Set up beforeinput event listener\n createTrackedEffect(() => {\n const _s2Cleanups: Array<() => void> = [];\n\n const input = inputRef();\n if (input) {\n input.addEventListener(\"beforeinput\", handleBeforeInput);\n _s2Cleanups.push(() => {\n input.removeEventListener(\"beforeinput\", handleBeforeInput);\n });\n }\n\n return () => {\n for (const c of _s2Cleanups) c();\n };\n });\n\n // Focus first item in collection\n const focusFirstItem = () => {\n // Typing forward focuses the first filtered row, but the resulting\n // aria-activedescendant reflection must wait so the SR announces the typed\n // letter first (see updateActiveDescendant). Mirrors useAutocomplete\n // setting delayNextActiveDescendant.current = true before the focus event.\n delayNextActiveDescendant = true;\n const collection = collectionRef();\n if (!collection) {\n // Collection isn't mounted yet — defer focusing the first item to mount\n // time via collectionProps.autoFocus instead of firing a focus event into\n // a not-yet-rendered collection.\n setAutoFocusOnMount(true);\n return;\n }\n collection.dispatchEvent(\n new CustomEvent(FOCUS_EVENT, {\n cancelable: true,\n bubbles: true,\n detail: { focusStrategy: \"first\" },\n }),\n );\n };\n\n // Clear virtual focus\n const clearVirtualFocus = (clearFocusKey = false) => {\n setAutoFocusOnMount(false);\n // Drop any pending delayed reflection and the tracked item alongside the\n // active descendant so a subsequent focusin can't resurrect a stale id\n // (mirrors useAutocomplete clearing queuedActiveDescendant / the timeout /\n // delayNextActiveDescendant in clearVirtualFocus).\n clearTimeout(activeDescendantTimeout);\n queuedActiveDescendant = null;\n delayNextActiveDescendant = false;\n state.setFocusedNodeId(null);\n const collection = collectionRef();\n if (collection) {\n collection.dispatchEvent(\n new CustomEvent(CLEAR_FOCUS_EVENT, {\n cancelable: true,\n bubbles: true,\n detail: { clearFocusKey },\n }),\n );\n }\n };\n\n // Handle input value changes\n const onChange = (value: string) => {\n // Focus first item when typing forward, clear when backspacing/pasting.\n // IME composition (e.g. CJK input) reports 'insertCompositionText'/\n // 'insertFromComposition' instead of 'insertText'; treat those as forward\n // typing so the first item still gets virtual focus.\n if (\n (lastInputType === \"insertText\" ||\n lastInputType === \"insertCompositionText\" ||\n lastInputType === \"insertFromComposition\") &&\n !disableAutoFocusFirst\n ) {\n focusFirstItem();\n } else if (\n lastInputType &&\n (lastInputType.includes(\"insert\") ||\n lastInputType.includes(\"delete\") ||\n lastInputType.includes(\"history\"))\n ) {\n clearVirtualFocus(true);\n }\n\n state.setInputValue(value);\n };\n\n // Handle keyboard navigation\n const onKeyDown = (e: KeyboardEvent) => {\n if (\"isComposing\" in e && e.isComposing) {\n return;\n }\n\n // Navigate against the id the collection has virtually focused, tracked\n // synchronously on every focusin, NOT the (possibly still-delayed)\n // aria-activedescendant reflection in state — mirrors useAutocomplete\n // reading queuedActiveDescendant.current here. Reading state.focusedNodeId()\n // would be null during the post-type reflection delay, so arrows would\n // re-focus the first row instead of advancing.\n const focusedNodeId = queuedActiveDescendant;\n const collection = collectionRef();\n const ownerDocument = getOwnerDocument(inputRef() ?? collection);\n\n switch (e.key) {\n case \"Escape\":\n // Let the input handle Escape (e.g., clear value)\n if (e.defaultPrevented) {\n return;\n }\n break;\n\n case \" \":\n // Space shouldn't trigger item action\n return;\n\n case \"Tab\":\n // Let Tab propagate normally for focus management\n return;\n\n case \"ArrowUp\":\n case \"ArrowDown\":\n case \"Home\":\n case \"End\":\n case \"PageUp\":\n case \"PageDown\": {\n // Prevent cursor movement in input\n e.preventDefault();\n\n // Dispatch focus event to collection\n if (collection) {\n collection.dispatchEvent(\n new CustomEvent(FOCUS_EVENT, {\n cancelable: true,\n bubbles: true,\n }),\n );\n }\n break;\n }\n\n case \"ArrowLeft\":\n case \"ArrowRight\":\n // With no virtual focus, just let the arrow move the text cursor; stop\n // propagation so it doesn't leak into the collection. With virtual focus,\n // fall through to dispatch the key to the focused item below, then clear\n // the active descendant only after the item has seen it.\n if (!focusedNodeId) {\n e.stopPropagation();\n return;\n }\n break;\n\n case \"Enter\":\n // Trigger click on focused item\n if (focusedNodeId) {\n const item = ownerDocument?.getElementById(focusedNodeId);\n if (item) {\n item.click();\n e.preventDefault();\n }\n }\n return;\n }\n\n // Forward keyboard events to the focused item (or the collection when there\n // is no virtual focus) so the collection can act on them, e.g. onAction.\n // Gated only on the collection existing — NOT on e.defaultPrevented: arrows\n // call preventDefault above to stop the input's text cursor moving, but the\n // key must still be re-dispatched to the row so navigation advances (mirrors\n // useAutocomplete forwarding whenever collectionRef.current !== null).\n if (collection) {\n e.stopPropagation();\n\n let shouldPerformDefaultAction = true;\n if (focusedNodeId) {\n const item = ownerDocument?.getElementById(focusedNodeId);\n if (item) {\n shouldPerformDefaultAction = item.dispatchEvent(\n new KeyboardEvent(e.type, toKeyboardEventInit(e)),\n );\n }\n } else {\n shouldPerformDefaultAction = collection.dispatchEvent(\n new KeyboardEvent(e.type, toKeyboardEventInit(e)),\n );\n }\n\n // After the focused item has seen ArrowLeft/ArrowRight, clear the active\n // descendant so SR announcements aren't interrupted, but retain the\n // collection's focused key so navigation restarts where it left off. If\n // the item consumed the key (e.g. an expandable row collapsing), it\n // cancels the event and we keep virtual focus.\n if (shouldPerformDefaultAction && (e.key === \"ArrowLeft\" || e.key === \"ArrowRight\")) {\n clearVirtualFocus();\n }\n }\n };\n\n // Handle focus events\n const onFocus = (e: FocusEvent) => {\n if (!e.isTrusted) return;\n\n // Restore virtual focus when refocusing input\n const focusedNodeId = state.focusedNodeId();\n if (focusedNodeId) {\n const item = document.getElementById(focusedNodeId);\n if (item) {\n // Item still exists, keep focus on it\n }\n }\n };\n\n const onBlur = (e: FocusEvent) => {\n if (!e.isTrusted) return;\n // Virtual focus blur handling would go here\n };\n\n // Reverse path: mirror the collection's virtually-focused option into the\n // input's aria-activedescendant. The collection dispatches a synthetic,\n // bubbling `focusin` (via moveVirtualFocus) on its focused option; we read the\n // target id, track it in `queuedActiveDescendant` synchronously (so key nav\n // always dispatches to the right item), and reflect it into AutocompleteState\n // — immediately, or, when `delayNextActiveDescendant` was set by forward\n // typing, behind a 500ms timeout so the SR finishes announcing the typed\n // letter before naming the active option. Faithful port of useAutocomplete's\n // updateActiveDescendantEvent.\n const updateActiveDescendant = (e: Event) => {\n const input = inputRef();\n // If the user clicks/taps an option directly (non-touch), pull real focus\n // back to the input so typing keeps working.\n if (\n !e.isTrusted &&\n shouldUseVirtualFocus() &&\n input &&\n getActiveElement(getOwnerDocument(input)) !== input &&\n getPointerType() !== \"touch\"\n ) {\n input.focus();\n }\n\n const target = getEventTarget<Element>(e);\n if (e.isTrusted || !target || queuedActiveDescendant === target.id) {\n return;\n }\n\n const collection = collectionRef();\n // A new focusin supersedes any pending delayed reflection.\n clearTimeout(activeDescendantTimeout);\n if (target !== collection) {\n const targetId = target.id;\n if (delayNextActiveDescendant) {\n // Forward typing just focused the first row: track it now, but defer the\n // aria-activedescendant reflection so the just-typed letter is announced\n // before the active option.\n queuedActiveDescendant = targetId;\n activeDescendantTimeout = setTimeout(() => {\n state.setFocusedNodeId(targetId);\n }, ACTIVE_DESCENDANT_DELAY);\n } else {\n queuedActiveDescendant = targetId;\n state.setFocusedNodeId(targetId);\n }\n } else if (\n queuedActiveDescendant &&\n !getOwnerDocument(collection)?.getElementById(queuedActiveDescendant)\n ) {\n // Refocus of the collection itself while the previously focused node no\n // longer exists (filtered away, or the input was refocused): clear the\n // tracked item and the active descendant.\n queuedActiveDescendant = null;\n state.setFocusedNodeId(null);\n }\n // Reflection delay is a one-shot; the next focusin reflects immediately\n // unless forward typing sets the flag again.\n delayNextActiveDescendant = false;\n };\n\n createTrackedEffect(() => {\n const _s2Cleanups: Array<() => void> = [];\n\n if (!shouldUseVirtualFocus()) return;\n const collection = collectionRef();\n if (collection) {\n collection.addEventListener(\"focusin\", updateActiveDescendant);\n _s2Cleanups.push(() => {\n collection.removeEventListener(\"focusin\", updateActiveDescendant);\n clearTimeout(activeDescendantTimeout);\n });\n }\n\n return () => {\n for (const c of _s2Cleanups) c();\n };\n });\n\n // Create filter function. The user's 3-arg predicate (textValue, inputValue,\n // node) is closed over the current input value and exposed to the collection\n // as the 2-arg (nodeTextValue, node) shape that UNSTABLE_useFilteredListState\n // (createFilteredListState) expects.\n const filterFn = filter\n ? (nodeTextValue: string, node: CollectionNode<T>) =>\n filter(nodeTextValue, state.inputValue(), node)\n : undefined;\n\n return {\n inputProps: {\n value: state.inputValue,\n onChange,\n onKeyDown,\n onFocus,\n onBlur,\n get \"aria-activedescendant\"() {\n return () => (shouldUseVirtualFocus() ? (state.focusedNodeId() ?? undefined) : undefined);\n },\n \"aria-controls\": collectionId,\n \"aria-autocomplete\": \"list\",\n enterKeyHint: \"go\",\n autoCorrect: \"off\",\n spellCheck: \"false\",\n autoComplete: \"off\",\n },\n collectionProps: {\n id: collectionId,\n \"aria-label\": collectionAriaLabel,\n shouldUseVirtualFocus: shouldUseVirtualFocus(),\n disallowTypeAhead: shouldUseVirtualFocus(),\n get autoFocus() {\n return autoFocusOnMount() ? \"first\" : false;\n },\n },\n filter: filterFn,\n };\n}\n"],"mappings":"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"}
@@ -1,4 +1,17 @@
1
- import { i as mergeProps } from "./env.js";
1
+ /*
2
+ * Copyright 2020 Adobe. All rights reserved.
3
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
+ * you may not use this file except in compliance with the License. You may obtain a copy
5
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ *
7
+ * Unless required by applicable law or agreed to in writing, software distributed under
8
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9
+ * OF ANY KIND, either express or implied. See the License for the specific language
10
+ * governing permissions and limitations under the License.
11
+ */
12
+ // Ported to SolidJS for Proyecto Viviana; based on packages/react-aria/src/breadcrumbs/useBreadcrumbItem.ts
13
+ // Ported to SolidJS for Proyecto Viviana; based on packages/react-aria/src/breadcrumbs/useBreadcrumbs.ts
14
+ import { t as mergeProps } from "./mergeProps.js";
2
15
  import { t as filterDOMProps } from "./filterDOMProps.js";
3
16
  import { t as access } from "./reactivity.js";
4
17
  import { t as createLink } from "./link.js";
@@ -7,7 +20,9 @@ import { t as createLink } from "./link.js";
7
20
  * Breadcrumbs hooks for Solidaria
8
21
  *
9
22
  * Provides accessibility implementation for breadcrumb navigation.
10
- * Port of @react-aria/breadcrumbs.
23
+ * Ported from:
24
+ * - packages/react-aria/src/breadcrumbs/useBreadcrumbs.ts
25
+ * - packages/react-aria/src/breadcrumbs/useBreadcrumbItem.ts
11
26
  */
12
27
  /**
13
28
  * Provides accessibility implementation for the breadcrumbs navigation container.
@@ -1 +1 @@
1
- {"version":3,"file":"breadcrumbs.js","names":[],"sources":["../../src/breadcrumbs/createBreadcrumbs.ts"],"sourcesContent":["/**\n * Breadcrumbs hooks for Solidaria\n *\n * Provides accessibility implementation for breadcrumb navigation.\n * Port of @react-aria/breadcrumbs.\n */\n\nimport { createLink, type AriaLinkProps, type LinkAria } from \"../link\";\nimport { filterDOMProps } from \"../utils/filterDOMProps\";\nimport { mergeProps } from \"../utils/mergeProps\";\nimport { type MaybeAccessor, access } from \"../utils/reactivity\";\n\nexport interface AriaBreadcrumbsProps {\n /** Provides a label for the breadcrumbs navigation. */\n \"aria-label\"?: string;\n /** Identifies the element (or elements) that labels the breadcrumbs. */\n \"aria-labelledby\"?: string;\n /** Identifies the element (or elements) that describes the breadcrumbs. */\n \"aria-describedby\"?: string;\n /** Identifies the element (or elements) that provide a detailed description. */\n \"aria-details\"?: string;\n /** Whether the breadcrumbs are disabled. */\n isDisabled?: boolean;\n}\n\nexport interface BreadcrumbsAria {\n /** Props for the breadcrumbs nav element. */\n navProps: Record<string, unknown>;\n}\n\nexport interface AriaBreadcrumbItemProps extends Omit<AriaLinkProps, \"aria-current\"> {\n /** The DOM id for the breadcrumb item. */\n id?: string;\n /** Whether this is the current/last item in the breadcrumb trail. */\n isCurrent?: boolean;\n /** The type of current location for aria-current. @default 'page' */\n \"aria-current\"?: \"page\" | \"step\" | \"location\" | \"date\" | \"time\" | boolean;\n /** The HTML element type. @default 'a' */\n elementType?: string;\n}\n\nexport interface BreadcrumbItemAria extends LinkAria {\n /** Props for the breadcrumb item element. */\n itemProps: Record<string, unknown>;\n}\n\n/**\n * Provides accessibility implementation for the breadcrumbs navigation container.\n */\nexport function createBreadcrumbs(\n props: MaybeAccessor<AriaBreadcrumbsProps> = {},\n): BreadcrumbsAria {\n const getProps = () => access(props);\n\n const getNavProps = (): Record<string, unknown> => {\n const p = getProps();\n\n // Only apply a default label when no other label source exists.\n const ariaLabel = p[\"aria-label\"] ?? (p[\"aria-labelledby\"] ? undefined : \"Breadcrumbs\");\n\n return mergeProps(filterDOMProps(p as Record<string, unknown>, { labelable: true }), {\n \"aria-label\": ariaLabel,\n \"aria-details\": p[\"aria-details\"],\n });\n };\n\n return {\n get navProps() {\n return getNavProps();\n },\n };\n}\n\n/**\n * Provides accessibility implementation for an individual breadcrumb item.\n */\nexport function createBreadcrumbItem(\n props: MaybeAccessor<AriaBreadcrumbItemProps> = {},\n): BreadcrumbItemAria {\n const getProps = () => access(props);\n\n const isCurrent = () => getProps().isCurrent ?? false;\n const isDisabled = () => getProps().isDisabled ?? false;\n const elementType = () => getProps().elementType ?? \"a\";\n\n // Use createLink for base link behavior\n // Current items are treated as disabled (can't navigate to current page).\n // Keep the whole return value (do NOT destructure linkProps): `linkProps` is a\n // reactive getter, and destructuring it here would snapshot getLinkProps() once\n // at mount — freezing role/tabIndex to whatever elementType was during the\n // transient first render (e.g. before isCurrent settles). Reading\n // linkAria.linkProps fresh inside getItemProps keeps it live, mirroring React\n // re-running useLink every render.\n const linkAria = createLink({\n get isDisabled() {\n return isDisabled() || isCurrent();\n },\n get elementType() {\n return elementType();\n },\n get href() {\n return isCurrent() ? undefined : getProps().href;\n },\n get target() {\n return getProps().target;\n },\n get rel() {\n return getProps().rel;\n },\n get onPress() {\n return getProps().onPress;\n },\n get onPressStart() {\n return getProps().onPressStart;\n },\n get onPressEnd() {\n return getProps().onPressEnd;\n },\n get onClick() {\n return getProps().onClick;\n },\n get onFocus() {\n return getProps().onFocus;\n },\n get onBlur() {\n return getProps().onBlur;\n },\n get onFocusChange() {\n return getProps().onFocusChange;\n },\n get onKeyDown() {\n return getProps().onKeyDown;\n },\n get onKeyUp() {\n return getProps().onKeyUp;\n },\n get autoFocus() {\n return getProps().autoFocus;\n },\n get \"aria-label\"() {\n return getProps()[\"aria-label\"];\n },\n get \"aria-labelledby\"() {\n return getProps()[\"aria-labelledby\"];\n },\n get \"aria-describedby\"() {\n return getProps()[\"aria-describedby\"];\n },\n get \"aria-details\"() {\n return getProps()[\"aria-details\"];\n },\n });\n\n const getItemProps = (): Record<string, unknown> => {\n const p = getProps();\n const current = isCurrent();\n // Read fresh each call so elementType-driven role/tabIndex stay reactive.\n const linkProps = linkAria.linkProps;\n\n // Start with link props, forwarding id if provided\n let baseProps: Record<string, unknown> = p.id ? mergeProps(linkProps, { id: p.id }) : linkProps;\n\n // Add aria-current for current page\n if (current) {\n const ariaCurrent = p[\"aria-current\"] ?? \"page\";\n baseProps = mergeProps(baseProps, {\n \"aria-current\": ariaCurrent,\n });\n }\n\n // Add aria-disabled for disabled items\n if (isDisabled()) {\n baseProps = mergeProps(baseProps, {\n \"aria-disabled\": true,\n });\n }\n\n return baseProps;\n };\n\n return {\n get itemProps() {\n return getItemProps();\n },\n get linkProps() {\n return linkAria.linkProps;\n },\n isPressed: linkAria.isPressed,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;AAiDA,SAAgB,kBACd,QAA6C,CAAC,GAC7B;CACjB,MAAM,iBAAiB,OAAO,KAAK;CAEnC,MAAM,oBAA6C;EACjD,MAAM,IAAI,SAAS;EAGnB,MAAM,YAAY,EAAE,kBAAkB,EAAE,qBAAqB,KAAA,IAAY;EAEzE,OAAO,WAAW,eAAe,GAA8B,EAAE,WAAW,KAAK,CAAC,GAAG;GACnF,cAAc;GACd,gBAAgB,EAAE;EACpB,CAAC;CACH;CAEA,OAAO,EACL,IAAI,WAAW;EACb,OAAO,YAAY;CACrB,EACF;AACF;;;;AAKA,SAAgB,qBACd,QAAgD,CAAC,GAC7B;CACpB,MAAM,iBAAiB,OAAO,KAAK;CAEnC,MAAM,kBAAkB,SAAS,CAAC,CAAC,aAAa;CAChD,MAAM,mBAAmB,SAAS,CAAC,CAAC,cAAc;CAClD,MAAM,oBAAoB,SAAS,CAAC,CAAC,eAAe;CAUpD,MAAM,WAAW,WAAW;EAC1B,IAAI,aAAa;GACf,OAAO,WAAW,KAAK,UAAU;EACnC;EACA,IAAI,cAAc;GAChB,OAAO,YAAY;EACrB;EACA,IAAI,OAAO;GACT,OAAO,UAAU,IAAI,KAAA,IAAY,SAAS,CAAC,CAAC;EAC9C;EACA,IAAI,SAAS;GACX,OAAO,SAAS,CAAC,CAAC;EACpB;EACA,IAAI,MAAM;GACR,OAAO,SAAS,CAAC,CAAC;EACpB;EACA,IAAI,UAAU;GACZ,OAAO,SAAS,CAAC,CAAC;EACpB;EACA,IAAI,eAAe;GACjB,OAAO,SAAS,CAAC,CAAC;EACpB;EACA,IAAI,aAAa;GACf,OAAO,SAAS,CAAC,CAAC;EACpB;EACA,IAAI,UAAU;GACZ,OAAO,SAAS,CAAC,CAAC;EACpB;EACA,IAAI,UAAU;GACZ,OAAO,SAAS,CAAC,CAAC;EACpB;EACA,IAAI,SAAS;GACX,OAAO,SAAS,CAAC,CAAC;EACpB;EACA,IAAI,gBAAgB;GAClB,OAAO,SAAS,CAAC,CAAC;EACpB;EACA,IAAI,YAAY;GACd,OAAO,SAAS,CAAC,CAAC;EACpB;EACA,IAAI,UAAU;GACZ,OAAO,SAAS,CAAC,CAAC;EACpB;EACA,IAAI,YAAY;GACd,OAAO,SAAS,CAAC,CAAC;EACpB;EACA,IAAI,eAAe;GACjB,OAAO,SAAS,CAAC,CAAC;EACpB;EACA,IAAI,oBAAoB;GACtB,OAAO,SAAS,CAAC,CAAC;EACpB;EACA,IAAI,qBAAqB;GACvB,OAAO,SAAS,CAAC,CAAC;EACpB;EACA,IAAI,iBAAiB;GACnB,OAAO,SAAS,CAAC,CAAC;EACpB;CACF,CAAC;CAED,MAAM,qBAA8C;EAClD,MAAM,IAAI,SAAS;EACnB,MAAM,UAAU,UAAU;EAE1B,MAAM,YAAY,SAAS;EAG3B,IAAI,YAAqC,EAAE,KAAK,WAAW,WAAW,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI;EAGtF,IAAI,SAAS;GACX,MAAM,cAAc,EAAE,mBAAmB;GACzC,YAAY,WAAW,WAAW,EAChC,gBAAgB,YAClB,CAAC;EACH;EAGA,IAAI,WAAW,GACb,YAAY,WAAW,WAAW,EAChC,iBAAiB,KACnB,CAAC;EAGH,OAAO;CACT;CAEA,OAAO;EACL,IAAI,YAAY;GACd,OAAO,aAAa;EACtB;EACA,IAAI,YAAY;GACd,OAAO,SAAS;EAClB;EACA,WAAW,SAAS;CACtB;AACF"}
1
+ {"version":3,"file":"breadcrumbs.js","names":[],"sources":["../../src/breadcrumbs/createBreadcrumbs.ts"],"sourcesContent":["/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n// Ported to SolidJS for Proyecto Viviana; based on packages/react-aria/src/breadcrumbs/useBreadcrumbItem.ts\n// Ported to SolidJS for Proyecto Viviana; based on packages/react-aria/src/breadcrumbs/useBreadcrumbs.ts\n\n/**\n * Breadcrumbs hooks for Solidaria\n *\n * Provides accessibility implementation for breadcrumb navigation.\n * Ported from:\n * - packages/react-aria/src/breadcrumbs/useBreadcrumbs.ts\n * - packages/react-aria/src/breadcrumbs/useBreadcrumbItem.ts\n */\n\nimport { createLink, type AriaLinkProps, type LinkAria } from \"../link\";\nimport { filterDOMProps } from \"../utils/filterDOMProps\";\nimport { mergeProps } from \"../utils/mergeProps\";\nimport { type MaybeAccessor, access } from \"../utils/reactivity\";\n\nexport interface AriaBreadcrumbsProps {\n /** Provides a label for the breadcrumbs navigation. */\n \"aria-label\"?: string;\n /** Identifies the element (or elements) that labels the breadcrumbs. */\n \"aria-labelledby\"?: string;\n /** Identifies the element (or elements) that describes the breadcrumbs. */\n \"aria-describedby\"?: string;\n /** Identifies the element (or elements) that provide a detailed description. */\n \"aria-details\"?: string;\n /** Whether the breadcrumbs are disabled. */\n isDisabled?: boolean;\n}\n\nexport interface BreadcrumbsAria {\n /** Props for the breadcrumbs nav element. */\n navProps: Record<string, unknown>;\n}\n\nexport interface AriaBreadcrumbItemProps extends Omit<AriaLinkProps, \"aria-current\"> {\n /** The DOM id for the breadcrumb item. */\n id?: string;\n /** Whether this is the current/last item in the breadcrumb trail. */\n isCurrent?: boolean;\n /** The type of current location for aria-current. @default 'page' */\n \"aria-current\"?: \"page\" | \"step\" | \"location\" | \"date\" | \"time\" | boolean;\n /** The HTML element type. @default 'a' */\n elementType?: string;\n}\n\nexport interface BreadcrumbItemAria extends LinkAria {\n /** Props for the breadcrumb item element. */\n itemProps: Record<string, unknown>;\n}\n\n/**\n * Provides accessibility implementation for the breadcrumbs navigation container.\n */\nexport function createBreadcrumbs(\n props: MaybeAccessor<AriaBreadcrumbsProps> = {},\n): BreadcrumbsAria {\n const getProps = () => access(props);\n\n const getNavProps = (): Record<string, unknown> => {\n const p = getProps();\n\n // Only apply a default label when no other label source exists.\n const ariaLabel = p[\"aria-label\"] ?? (p[\"aria-labelledby\"] ? undefined : \"Breadcrumbs\");\n\n return mergeProps(filterDOMProps(p as Record<string, unknown>, { labelable: true }), {\n \"aria-label\": ariaLabel,\n \"aria-details\": p[\"aria-details\"],\n });\n };\n\n return {\n get navProps() {\n return getNavProps();\n },\n };\n}\n\n/**\n * Provides accessibility implementation for an individual breadcrumb item.\n */\nexport function createBreadcrumbItem(\n props: MaybeAccessor<AriaBreadcrumbItemProps> = {},\n): BreadcrumbItemAria {\n const getProps = () => access(props);\n\n const isCurrent = () => getProps().isCurrent ?? false;\n const isDisabled = () => getProps().isDisabled ?? false;\n const elementType = () => getProps().elementType ?? \"a\";\n\n // Use createLink for base link behavior\n // Current items are treated as disabled (can't navigate to current page).\n // Keep the whole return value (do NOT destructure linkProps): `linkProps` is a\n // reactive getter, and destructuring it here would snapshot getLinkProps() once\n // at mount — freezing role/tabIndex to whatever elementType was during the\n // transient first render (e.g. before isCurrent settles). Reading\n // linkAria.linkProps fresh inside getItemProps keeps it live, mirroring React\n // re-running useLink every render.\n const linkAria = createLink({\n get isDisabled() {\n return isDisabled() || isCurrent();\n },\n get elementType() {\n return elementType();\n },\n get href() {\n return isCurrent() ? undefined : getProps().href;\n },\n get target() {\n return getProps().target;\n },\n get rel() {\n return getProps().rel;\n },\n get onPress() {\n return getProps().onPress;\n },\n get onPressStart() {\n return getProps().onPressStart;\n },\n get onPressEnd() {\n return getProps().onPressEnd;\n },\n get onClick() {\n return getProps().onClick;\n },\n get onFocus() {\n return getProps().onFocus;\n },\n get onBlur() {\n return getProps().onBlur;\n },\n get onFocusChange() {\n return getProps().onFocusChange;\n },\n get onKeyDown() {\n return getProps().onKeyDown;\n },\n get onKeyUp() {\n return getProps().onKeyUp;\n },\n get autoFocus() {\n return getProps().autoFocus;\n },\n get \"aria-label\"() {\n return getProps()[\"aria-label\"];\n },\n get \"aria-labelledby\"() {\n return getProps()[\"aria-labelledby\"];\n },\n get \"aria-describedby\"() {\n return getProps()[\"aria-describedby\"];\n },\n get \"aria-details\"() {\n return getProps()[\"aria-details\"];\n },\n });\n\n const getItemProps = (): Record<string, unknown> => {\n const p = getProps();\n const current = isCurrent();\n // Read fresh each call so elementType-driven role/tabIndex stay reactive.\n const linkProps = linkAria.linkProps;\n\n // Start with link props, forwarding id if provided\n let baseProps: Record<string, unknown> = p.id ? mergeProps(linkProps, { id: p.id }) : linkProps;\n\n // Add aria-current for current page\n if (current) {\n const ariaCurrent = p[\"aria-current\"] ?? \"page\";\n baseProps = mergeProps(baseProps, {\n \"aria-current\": ariaCurrent,\n });\n }\n\n // Add aria-disabled for disabled items\n if (isDisabled()) {\n baseProps = mergeProps(baseProps, {\n \"aria-disabled\": true,\n });\n }\n\n return baseProps;\n };\n\n return {\n get itemProps() {\n return getItemProps();\n },\n get linkProps() {\n return linkAria.linkProps;\n },\n isPressed: linkAria.isPressed,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkEA,SAAgB,kBACd,QAA6C,CAAC,GAC7B;CACjB,MAAM,iBAAiB,OAAO,KAAK;CAEnC,MAAM,oBAA6C;EACjD,MAAM,IAAI,SAAS;EAGnB,MAAM,YAAY,EAAE,kBAAkB,EAAE,qBAAqB,KAAA,IAAY;EAEzE,OAAO,WAAW,eAAe,GAA8B,EAAE,WAAW,KAAK,CAAC,GAAG;GACnF,cAAc;GACd,gBAAgB,EAAE;EACpB,CAAC;CACH;CAEA,OAAO,EACL,IAAI,WAAW;EACb,OAAO,YAAY;CACrB,EACF;AACF;;;;AAKA,SAAgB,qBACd,QAAgD,CAAC,GAC7B;CACpB,MAAM,iBAAiB,OAAO,KAAK;CAEnC,MAAM,kBAAkB,SAAS,CAAC,CAAC,aAAa;CAChD,MAAM,mBAAmB,SAAS,CAAC,CAAC,cAAc;CAClD,MAAM,oBAAoB,SAAS,CAAC,CAAC,eAAe;CAUpD,MAAM,WAAW,WAAW;EAC1B,IAAI,aAAa;GACf,OAAO,WAAW,KAAK,UAAU;EACnC;EACA,IAAI,cAAc;GAChB,OAAO,YAAY;EACrB;EACA,IAAI,OAAO;GACT,OAAO,UAAU,IAAI,KAAA,IAAY,SAAS,CAAC,CAAC;EAC9C;EACA,IAAI,SAAS;GACX,OAAO,SAAS,CAAC,CAAC;EACpB;EACA,IAAI,MAAM;GACR,OAAO,SAAS,CAAC,CAAC;EACpB;EACA,IAAI,UAAU;GACZ,OAAO,SAAS,CAAC,CAAC;EACpB;EACA,IAAI,eAAe;GACjB,OAAO,SAAS,CAAC,CAAC;EACpB;EACA,IAAI,aAAa;GACf,OAAO,SAAS,CAAC,CAAC;EACpB;EACA,IAAI,UAAU;GACZ,OAAO,SAAS,CAAC,CAAC;EACpB;EACA,IAAI,UAAU;GACZ,OAAO,SAAS,CAAC,CAAC;EACpB;EACA,IAAI,SAAS;GACX,OAAO,SAAS,CAAC,CAAC;EACpB;EACA,IAAI,gBAAgB;GAClB,OAAO,SAAS,CAAC,CAAC;EACpB;EACA,IAAI,YAAY;GACd,OAAO,SAAS,CAAC,CAAC;EACpB;EACA,IAAI,UAAU;GACZ,OAAO,SAAS,CAAC,CAAC;EACpB;EACA,IAAI,YAAY;GACd,OAAO,SAAS,CAAC,CAAC;EACpB;EACA,IAAI,eAAe;GACjB,OAAO,SAAS,CAAC,CAAC;EACpB;EACA,IAAI,oBAAoB;GACtB,OAAO,SAAS,CAAC,CAAC;EACpB;EACA,IAAI,qBAAqB;GACvB,OAAO,SAAS,CAAC,CAAC;EACpB;EACA,IAAI,iBAAiB;GACnB,OAAO,SAAS,CAAC,CAAC;EACpB;CACF,CAAC;CAED,MAAM,qBAA8C;EAClD,MAAM,IAAI,SAAS;EACnB,MAAM,UAAU,UAAU;EAE1B,MAAM,YAAY,SAAS;EAG3B,IAAI,YAAqC,EAAE,KAAK,WAAW,WAAW,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI;EAGtF,IAAI,SAAS;GACX,MAAM,cAAc,EAAE,mBAAmB;GACzC,YAAY,WAAW,WAAW,EAChC,gBAAgB,YAClB,CAAC;EACH;EAGA,IAAI,WAAW,GACb,YAAY,WAAW,WAAW,EAChC,iBAAiB,KACnB,CAAC;EAGH,OAAO;CACT;CAEA,OAAO;EACL,IAAI,YAAY;GACd,OAAO,aAAa;EACtB;EACA,IAAI,YAAY;GACd,OAAO,SAAS;EAClB;EACA,WAAW,SAAS;CACtB;AACF"}
@@ -1,4 +1,17 @@
1
- import { i as mergeProps } from "./env.jsx";
1
+ /*
2
+ * Copyright 2020 Adobe. All rights reserved.
3
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
+ * you may not use this file except in compliance with the License. You may obtain a copy
5
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ *
7
+ * Unless required by applicable law or agreed to in writing, software distributed under
8
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9
+ * OF ANY KIND, either express or implied. See the License for the specific language
10
+ * governing permissions and limitations under the License.
11
+ */
12
+ // Ported to SolidJS for Proyecto Viviana; based on packages/react-aria/src/breadcrumbs/useBreadcrumbItem.ts
13
+ // Ported to SolidJS for Proyecto Viviana; based on packages/react-aria/src/breadcrumbs/useBreadcrumbs.ts
14
+ import { t as mergeProps } from "./mergeProps.jsx";
2
15
  import { t as filterDOMProps } from "./filterDOMProps.jsx";
3
16
  import { t as access } from "./reactivity.jsx";
4
17
  import { t as createLink } from "./link.jsx";
@@ -7,7 +20,9 @@ import { t as createLink } from "./link.jsx";
7
20
  * Breadcrumbs hooks for Solidaria
8
21
  *
9
22
  * Provides accessibility implementation for breadcrumb navigation.
10
- * Port of @react-aria/breadcrumbs.
23
+ * Ported from:
24
+ * - packages/react-aria/src/breadcrumbs/useBreadcrumbs.ts
25
+ * - packages/react-aria/src/breadcrumbs/useBreadcrumbItem.ts
11
26
  */
12
27
  /**
13
28
  * Provides accessibility implementation for the breadcrumbs navigation container.