@proyecto-viviana/solidaria 0.2.5 → 0.3.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 (555) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +31 -236
  3. package/dist/actiongroup/createActionGroup.d.ts +29 -0
  4. package/dist/actiongroup/createActionGroup.d.ts.map +1 -0
  5. package/dist/actiongroup/index.d.ts +2 -0
  6. package/dist/actiongroup/index.d.ts.map +1 -0
  7. package/dist/autocomplete/createAutocomplete.d.ts +16 -12
  8. package/dist/autocomplete/createAutocomplete.d.ts.map +1 -1
  9. package/dist/autocomplete/index.d.ts +1 -1
  10. package/dist/autocomplete/index.d.ts.map +1 -1
  11. package/dist/breadcrumbs/createBreadcrumbs.d.ts +11 -7
  12. package/dist/breadcrumbs/createBreadcrumbs.d.ts.map +1 -1
  13. package/dist/breadcrumbs/index.d.ts +1 -1
  14. package/dist/button/createButton.d.ts +1 -1
  15. package/dist/button/createButton.d.ts.map +1 -1
  16. package/dist/button/createToggleButton.d.ts +3 -3
  17. package/dist/button/createToggleButtonGroup.d.ts +32 -0
  18. package/dist/button/createToggleButtonGroup.d.ts.map +1 -0
  19. package/dist/button/index.d.ts +6 -4
  20. package/dist/button/index.d.ts.map +1 -1
  21. package/dist/button/types.d.ts +18 -12
  22. package/dist/button/types.d.ts.map +1 -1
  23. package/dist/calendar/createCalendar.d.ts +15 -5
  24. package/dist/calendar/createCalendar.d.ts.map +1 -1
  25. package/dist/calendar/createCalendarCell.d.ts +8 -2
  26. package/dist/calendar/createCalendarCell.d.ts.map +1 -1
  27. package/dist/calendar/createCalendarGrid.d.ts +4 -4
  28. package/dist/calendar/createCalendarGrid.d.ts.map +1 -1
  29. package/dist/calendar/createRangeCalendar.d.ts +15 -5
  30. package/dist/calendar/createRangeCalendar.d.ts.map +1 -1
  31. package/dist/calendar/createRangeCalendarCell.d.ts +7 -3
  32. package/dist/calendar/createRangeCalendarCell.d.ts.map +1 -1
  33. package/dist/calendar/index.d.ts +5 -5
  34. package/dist/calendar/index.d.ts.map +1 -1
  35. package/dist/calendar/intl/index.d.ts +12 -0
  36. package/dist/calendar/intl/index.d.ts.map +1 -0
  37. package/dist/calendar/utils.d.ts +12 -0
  38. package/dist/calendar/utils.d.ts.map +1 -0
  39. package/dist/checkbox/createCheckbox.d.ts +6 -6
  40. package/dist/checkbox/createCheckbox.d.ts.map +1 -1
  41. package/dist/checkbox/createCheckboxGroup.d.ts +11 -7
  42. package/dist/checkbox/createCheckboxGroup.d.ts.map +1 -1
  43. package/dist/checkbox/createCheckboxGroupItem.d.ts +4 -4
  44. package/dist/checkbox/createCheckboxGroupItem.d.ts.map +1 -1
  45. package/dist/checkbox/createCheckboxGroupState.d.ts +2 -2
  46. package/dist/checkbox/createCheckboxGroupState.d.ts.map +1 -1
  47. package/dist/checkbox/index.d.ts +8 -8
  48. package/dist/checkbox/index.d.ts.map +1 -1
  49. package/dist/collections/index.d.ts +56 -0
  50. package/dist/collections/index.d.ts.map +1 -0
  51. package/dist/color/createColorArea.d.ts +3 -3
  52. package/dist/color/createColorArea.d.ts.map +1 -1
  53. package/dist/color/createColorField.d.ts +4 -4
  54. package/dist/color/createColorField.d.ts.map +1 -1
  55. package/dist/color/createColorSlider.d.ts +4 -4
  56. package/dist/color/createColorSlider.d.ts.map +1 -1
  57. package/dist/color/createColorSwatch.d.ts +2 -2
  58. package/dist/color/createColorSwatch.d.ts.map +1 -1
  59. package/dist/color/createColorWheel.d.ts +3 -3
  60. package/dist/color/createColorWheel.d.ts.map +1 -1
  61. package/dist/color/index.d.ts +6 -6
  62. package/dist/color/types.d.ts +98 -16
  63. package/dist/color/types.d.ts.map +1 -1
  64. package/dist/combobox/createComboBox.d.ts +16 -7
  65. package/dist/combobox/createComboBox.d.ts.map +1 -1
  66. package/dist/combobox/index.d.ts +1 -1
  67. package/dist/combobox/intl/index.d.ts +1 -1
  68. package/dist/datepicker/createDateField.d.ts +18 -6
  69. package/dist/datepicker/createDateField.d.ts.map +1 -1
  70. package/dist/datepicker/createDatePicker.d.ts +57 -5
  71. package/dist/datepicker/createDatePicker.d.ts.map +1 -1
  72. package/dist/datepicker/createDatePickerGroup.d.ts +19 -0
  73. package/dist/datepicker/createDatePickerGroup.d.ts.map +1 -0
  74. package/dist/datepicker/createDateRangePicker.d.ts +42 -0
  75. package/dist/datepicker/createDateRangePicker.d.ts.map +1 -0
  76. package/dist/datepicker/createDateSegment.d.ts +11 -3
  77. package/dist/datepicker/createDateSegment.d.ts.map +1 -1
  78. package/dist/datepicker/createTimeField.d.ts +11 -5
  79. package/dist/datepicker/createTimeField.d.ts.map +1 -1
  80. package/dist/datepicker/createTimeSegment.d.ts +29 -0
  81. package/dist/datepicker/createTimeSegment.d.ts.map +1 -0
  82. package/dist/datepicker/index.d.ts +7 -4
  83. package/dist/datepicker/index.d.ts.map +1 -1
  84. package/dist/dialog/createDialog.d.ts +5 -5
  85. package/dist/dialog/createDialog.d.ts.map +1 -1
  86. package/dist/dialog/index.d.ts +2 -2
  87. package/dist/dialog/index.d.ts.map +1 -1
  88. package/dist/dialog/types.d.ts +4 -4
  89. package/dist/disclosure/createDisclosure.d.ts +5 -2
  90. package/dist/disclosure/createDisclosure.d.ts.map +1 -1
  91. package/dist/disclosure/createDisclosureGroup.d.ts +4 -3
  92. package/dist/disclosure/createDisclosureGroup.d.ts.map +1 -1
  93. package/dist/disclosure/index.d.ts +2 -2
  94. package/dist/dnd/createDrag.d.ts +2 -2
  95. package/dist/dnd/createDrag.d.ts.map +1 -1
  96. package/dist/dnd/createDraggableCollection.d.ts +6 -2
  97. package/dist/dnd/createDraggableCollection.d.ts.map +1 -1
  98. package/dist/dnd/createDraggableItem.d.ts +3 -3
  99. package/dist/dnd/createDraggableItem.d.ts.map +1 -1
  100. package/dist/dnd/createDrop.d.ts +2 -2
  101. package/dist/dnd/createDrop.d.ts.map +1 -1
  102. package/dist/dnd/createDroppableCollection.d.ts +55 -4
  103. package/dist/dnd/createDroppableCollection.d.ts.map +1 -1
  104. package/dist/dnd/createDroppableItem.d.ts +3 -3
  105. package/dist/dnd/createDroppableItem.d.ts.map +1 -1
  106. package/dist/dnd/index.d.ts +12 -12
  107. package/dist/dnd/index.d.ts.map +1 -1
  108. package/dist/dnd/types.d.ts +2 -2
  109. package/dist/dnd/types.d.ts.map +1 -1
  110. package/dist/dnd/utils.d.ts +1 -1
  111. package/dist/dnd/utils.d.ts.map +1 -1
  112. package/dist/focus/FocusScope.d.ts +1 -1
  113. package/dist/focus/FocusScope.d.ts.map +1 -1
  114. package/dist/focus/createAutoFocus.d.ts.map +1 -1
  115. package/dist/focus/createFocusRestore.d.ts.map +1 -1
  116. package/dist/focus/createVirtualFocus.d.ts +4 -4
  117. package/dist/focus/createVirtualFocus.d.ts.map +1 -1
  118. package/dist/focus/index.d.ts +4 -4
  119. package/dist/focus/index.d.ts.map +1 -1
  120. package/dist/form/createFormReset.d.ts +1 -1
  121. package/dist/form/createFormValidation.d.ts +3 -3
  122. package/dist/form/createFormValidation.d.ts.map +1 -1
  123. package/dist/form/index.d.ts +2 -2
  124. package/dist/form/index.d.ts.map +1 -1
  125. package/dist/grid/GridKeyboardDelegate.d.ts +5 -5
  126. package/dist/grid/createGrid.d.ts +3 -3
  127. package/dist/grid/createGrid.d.ts.map +1 -1
  128. package/dist/grid/createGridCell.d.ts +3 -3
  129. package/dist/grid/createGridRow.d.ts +3 -3
  130. package/dist/grid/index.d.ts +5 -5
  131. package/dist/grid/types.d.ts +8 -8
  132. package/dist/gridlist/createGridList.d.ts +6 -4
  133. package/dist/gridlist/createGridList.d.ts.map +1 -1
  134. package/dist/gridlist/createGridListItem.d.ts +4 -4
  135. package/dist/gridlist/createGridListItem.d.ts.map +1 -1
  136. package/dist/gridlist/createGridListSelectionCheckbox.d.ts +3 -3
  137. package/dist/gridlist/createGridListSelectionCheckbox.d.ts.map +1 -1
  138. package/dist/gridlist/index.d.ts +4 -4
  139. package/dist/gridlist/types.d.ts +11 -7
  140. package/dist/gridlist/types.d.ts.map +1 -1
  141. package/dist/i18n/createCollator.d.ts.map +1 -1
  142. package/dist/i18n/createDateFormatter.d.ts.map +1 -1
  143. package/dist/i18n/createFilter.d.ts.map +1 -1
  144. package/dist/i18n/createNumberFormatter.d.ts +1 -1
  145. package/dist/i18n/createNumberFormatter.d.ts.map +1 -1
  146. package/dist/i18n/createStringFormatter.d.ts +2 -2
  147. package/dist/i18n/createStringFormatter.d.ts.map +1 -1
  148. package/dist/i18n/index.d.ts +8 -8
  149. package/dist/i18n/index.d.ts.map +1 -1
  150. package/dist/i18n/locale.d.ts +2 -2
  151. package/dist/i18n/locale.d.ts.map +1 -1
  152. package/dist/i18n/utils.d.ts.map +1 -1
  153. package/dist/index.d.ts +52 -49
  154. package/dist/index.d.ts.map +1 -1
  155. package/dist/index.js +18089 -15690
  156. package/dist/index.js.map +1 -7
  157. package/dist/index.jsx +18242 -0
  158. package/dist/index.jsx.map +1 -0
  159. package/dist/interactions/FocusableProvider.d.ts +2 -2
  160. package/dist/interactions/FocusableProvider.d.ts.map +1 -1
  161. package/dist/interactions/PressEvent.d.ts +2 -2
  162. package/dist/interactions/createFocus.d.ts +1 -1
  163. package/dist/interactions/createFocus.d.ts.map +1 -1
  164. package/dist/interactions/createFocusRing.d.ts +1 -1
  165. package/dist/interactions/createFocusRing.d.ts.map +1 -1
  166. package/dist/interactions/createFocusWithin.d.ts +1 -1
  167. package/dist/interactions/createFocusWithin.d.ts.map +1 -1
  168. package/dist/interactions/createFocusable.d.ts +3 -3
  169. package/dist/interactions/createFocusable.d.ts.map +1 -1
  170. package/dist/interactions/createHover.d.ts +5 -5
  171. package/dist/interactions/createHover.d.ts.map +1 -1
  172. package/dist/interactions/createInteractionModality.d.ts +3 -3
  173. package/dist/interactions/createInteractionModality.d.ts.map +1 -1
  174. package/dist/interactions/createKeyboard.d.ts +1 -1
  175. package/dist/interactions/createLongPress.d.ts +5 -5
  176. package/dist/interactions/createMove.d.ts +5 -5
  177. package/dist/interactions/createMove.d.ts.map +1 -1
  178. package/dist/interactions/createPress.d.ts +4 -4
  179. package/dist/interactions/createPress.d.ts.map +1 -1
  180. package/dist/interactions/index.d.ts +12 -12
  181. package/dist/interactions/index.d.ts.map +1 -1
  182. package/dist/label/createField.d.ts +4 -4
  183. package/dist/label/createField.d.ts.map +1 -1
  184. package/dist/label/createLabel.d.ts +7 -7
  185. package/dist/label/createLabel.d.ts.map +1 -1
  186. package/dist/label/createLabels.d.ts +1 -1
  187. package/dist/label/createLabels.d.ts.map +1 -1
  188. package/dist/label/index.d.ts +5 -5
  189. package/dist/landmark/createLandmark.d.ts +5 -5
  190. package/dist/landmark/createLandmark.d.ts.map +1 -1
  191. package/dist/landmark/index.d.ts +1 -1
  192. package/dist/link/createLink.d.ts +23 -7
  193. package/dist/link/createLink.d.ts.map +1 -1
  194. package/dist/link/index.d.ts +1 -1
  195. package/dist/listbox/createListBox.d.ts +12 -6
  196. package/dist/listbox/createListBox.d.ts.map +1 -1
  197. package/dist/listbox/createOption.d.ts +21 -4
  198. package/dist/listbox/createOption.d.ts.map +1 -1
  199. package/dist/listbox/index.d.ts +2 -2
  200. package/dist/listbox/index.d.ts.map +1 -1
  201. package/dist/live-announcer/announce.d.ts +2 -2
  202. package/dist/live-announcer/announce.d.ts.map +1 -1
  203. package/dist/live-announcer/index.d.ts +1 -1
  204. package/dist/menu/createMenu.d.ts +8 -7
  205. package/dist/menu/createMenu.d.ts.map +1 -1
  206. package/dist/menu/createMenuItem.d.ts +16 -4
  207. package/dist/menu/createMenuItem.d.ts.map +1 -1
  208. package/dist/menu/createMenuTrigger.d.ts +4 -4
  209. package/dist/menu/index.d.ts +3 -3
  210. package/dist/menu/index.d.ts.map +1 -1
  211. package/dist/meter/createMeter.d.ts +6 -6
  212. package/dist/meter/createMeter.d.ts.map +1 -1
  213. package/dist/meter/index.d.ts +1 -1
  214. package/dist/numberfield/createNumberField.d.ts +27 -8
  215. package/dist/numberfield/createNumberField.d.ts.map +1 -1
  216. package/dist/numberfield/index.d.ts +1 -1
  217. package/dist/overlays/ariaHideOutside.d.ts.map +1 -1
  218. package/dist/overlays/createModal.d.ts +19 -3
  219. package/dist/overlays/createModal.d.ts.map +1 -1
  220. package/dist/overlays/createOverlay.d.ts +1 -1
  221. package/dist/overlays/createOverlay.d.ts.map +1 -1
  222. package/dist/overlays/createOverlayTrigger.d.ts +6 -6
  223. package/dist/overlays/index.d.ts +6 -6
  224. package/dist/overlays/index.d.ts.map +1 -1
  225. package/dist/popover/calculatePosition.d.ts +4 -4
  226. package/dist/popover/calculatePosition.d.ts.map +1 -1
  227. package/dist/popover/createOverlayPosition.d.ts +3 -3
  228. package/dist/popover/createOverlayPosition.d.ts.map +1 -1
  229. package/dist/popover/createPopover.d.ts +4 -4
  230. package/dist/popover/createPopover.d.ts.map +1 -1
  231. package/dist/popover/index.d.ts +3 -3
  232. package/dist/progress/createProgressBar.d.ts +7 -5
  233. package/dist/progress/createProgressBar.d.ts.map +1 -1
  234. package/dist/progress/index.d.ts +1 -1
  235. package/dist/radio/createRadio.d.ts +7 -7
  236. package/dist/radio/createRadio.d.ts.map +1 -1
  237. package/dist/radio/createRadioGroup.d.ts +11 -11
  238. package/dist/radio/createRadioGroup.d.ts.map +1 -1
  239. package/dist/radio/createRadioGroupState.d.ts +3 -3
  240. package/dist/radio/createRadioGroupState.d.ts.map +1 -1
  241. package/dist/radio/index.d.ts +3 -3
  242. package/dist/radio/index.d.ts.map +1 -1
  243. package/dist/searchfield/createSearchField.d.ts +7 -7
  244. package/dist/searchfield/createSearchField.d.ts.map +1 -1
  245. package/dist/searchfield/index.d.ts +2 -2
  246. package/dist/select/createHiddenSelect.d.ts +4 -4
  247. package/dist/select/createHiddenSelect.d.ts.map +1 -1
  248. package/dist/select/createSelect.d.ts +14 -6
  249. package/dist/select/createSelect.d.ts.map +1 -1
  250. package/dist/select/index.d.ts +2 -2
  251. package/dist/select/index.d.ts.map +1 -1
  252. package/dist/selection/createTypeSelect.d.ts +2 -2
  253. package/dist/selection/index.d.ts +1 -1
  254. package/dist/separator/createSeparator.d.ts +9 -5
  255. package/dist/separator/createSeparator.d.ts.map +1 -1
  256. package/dist/separator/index.d.ts +1 -1
  257. package/dist/slider/createSlider.d.ts +11 -7
  258. package/dist/slider/createSlider.d.ts.map +1 -1
  259. package/dist/slider/index.d.ts +2 -2
  260. package/dist/ssr/index.d.ts +1 -1
  261. package/dist/ssr/index.d.ts.map +1 -1
  262. package/dist/steplist/createStepList.d.ts +36 -0
  263. package/dist/steplist/createStepList.d.ts.map +1 -0
  264. package/dist/steplist/index.d.ts +2 -0
  265. package/dist/steplist/index.d.ts.map +1 -0
  266. package/dist/switch/createSwitch.d.ts +6 -4
  267. package/dist/switch/createSwitch.d.ts.map +1 -1
  268. package/dist/switch/index.d.ts +1 -1
  269. package/dist/table/createTable.d.ts +3 -3
  270. package/dist/table/createTable.d.ts.map +1 -1
  271. package/dist/table/createTableCell.d.ts +3 -3
  272. package/dist/table/createTableCell.d.ts.map +1 -1
  273. package/dist/table/createTableColumnHeader.d.ts +3 -3
  274. package/dist/table/createTableColumnHeader.d.ts.map +1 -1
  275. package/dist/table/createTableColumnResize.d.ts +41 -0
  276. package/dist/table/createTableColumnResize.d.ts.map +1 -0
  277. package/dist/table/createTableHeaderRow.d.ts +3 -3
  278. package/dist/table/createTableRow.d.ts +3 -3
  279. package/dist/table/createTableRow.d.ts.map +1 -1
  280. package/dist/table/createTableRowGroup.d.ts +2 -2
  281. package/dist/table/createTableRowGroup.d.ts.map +1 -1
  282. package/dist/table/createTableSelectAllCheckbox.d.ts +3 -3
  283. package/dist/table/createTableSelectAllCheckbox.d.ts.map +1 -1
  284. package/dist/table/createTableSelectionCheckbox.d.ts +3 -3
  285. package/dist/table/index.d.ts +11 -9
  286. package/dist/table/index.d.ts.map +1 -1
  287. package/dist/table/types.d.ts +15 -7
  288. package/dist/table/types.d.ts.map +1 -1
  289. package/dist/tabs/createTabs.d.ts +28 -25
  290. package/dist/tabs/createTabs.d.ts.map +1 -1
  291. package/dist/tabs/index.d.ts +1 -1
  292. package/dist/tag/createTag.d.ts +2 -2
  293. package/dist/tag/createTag.d.ts.map +1 -1
  294. package/dist/tag/createTagGroup.d.ts +5 -5
  295. package/dist/tag/createTagGroup.d.ts.map +1 -1
  296. package/dist/tag/index.d.ts +2 -2
  297. package/dist/tag/index.d.ts.map +1 -1
  298. package/dist/textfield/createTextField.d.ts +17 -11
  299. package/dist/textfield/createTextField.d.ts.map +1 -1
  300. package/dist/textfield/index.d.ts +1 -1
  301. package/dist/textfield/index.d.ts.map +1 -1
  302. package/dist/toast/createToast.d.ts +6 -2
  303. package/dist/toast/createToast.d.ts.map +1 -1
  304. package/dist/toast/createToastRegion.d.ts +5 -3
  305. package/dist/toast/createToastRegion.d.ts.map +1 -1
  306. package/dist/toast/index.d.ts +2 -2
  307. package/dist/toast/index.d.ts.map +1 -1
  308. package/dist/toggle/createToggle.d.ts +9 -9
  309. package/dist/toggle/createToggle.d.ts.map +1 -1
  310. package/dist/toggle/createToggleState.d.ts +2 -2
  311. package/dist/toggle/createToggleState.d.ts.map +1 -1
  312. package/dist/toggle/index.d.ts +4 -4
  313. package/dist/toggle/index.d.ts.map +1 -1
  314. package/dist/toolbar/createToolbar.d.ts +9 -9
  315. package/dist/toolbar/createToolbar.d.ts.map +1 -1
  316. package/dist/toolbar/index.d.ts +1 -1
  317. package/dist/toolbar/index.d.ts.map +1 -1
  318. package/dist/tooltip/createTooltip.d.ts +5 -5
  319. package/dist/tooltip/createTooltip.d.ts.map +1 -1
  320. package/dist/tooltip/createTooltipTrigger.d.ts +10 -5
  321. package/dist/tooltip/createTooltipTrigger.d.ts.map +1 -1
  322. package/dist/tooltip/index.d.ts +2 -2
  323. package/dist/tree/createTree.d.ts +3 -3
  324. package/dist/tree/createTree.d.ts.map +1 -1
  325. package/dist/tree/createTreeItem.d.ts +4 -4
  326. package/dist/tree/createTreeItem.d.ts.map +1 -1
  327. package/dist/tree/createTreeSelectionCheckbox.d.ts +3 -3
  328. package/dist/tree/createTreeSelectionCheckbox.d.ts.map +1 -1
  329. package/dist/tree/index.d.ts +4 -4
  330. package/dist/tree/types.d.ts +13 -5
  331. package/dist/tree/types.d.ts.map +1 -1
  332. package/dist/utils/createDescription.d.ts +2 -2
  333. package/dist/utils/createDescription.d.ts.map +1 -1
  334. package/dist/utils/dom.d.ts.map +1 -1
  335. package/dist/utils/env.d.ts +1 -1
  336. package/dist/utils/env.d.ts.map +1 -1
  337. package/dist/utils/focus.d.ts +1 -1
  338. package/dist/utils/focus.d.ts.map +1 -1
  339. package/dist/utils/geometry.d.ts.map +1 -1
  340. package/dist/utils/index.d.ts +12 -12
  341. package/dist/utils/index.d.ts.map +1 -1
  342. package/dist/utils/mergeProps.d.ts.map +1 -1
  343. package/dist/utils/platform.d.ts.map +1 -1
  344. package/dist/utils/reactivity.d.ts +1 -1
  345. package/dist/visually-hidden/createVisuallyHidden.d.ts +2 -2
  346. package/dist/visually-hidden/createVisuallyHidden.d.ts.map +1 -1
  347. package/dist/visually-hidden/index.d.ts +1 -1
  348. package/package.json +34 -32
  349. package/src/actiongroup/createActionGroup.ts +334 -0
  350. package/src/actiongroup/index.ts +8 -0
  351. package/src/autocomplete/createAutocomplete.ts +137 -131
  352. package/src/autocomplete/index.ts +1 -1
  353. package/src/breadcrumbs/createBreadcrumbs.ts +37 -51
  354. package/src/breadcrumbs/index.ts +1 -1
  355. package/src/button/createButton.ts +102 -73
  356. package/src/button/createToggleButton.ts +10 -10
  357. package/src/button/createToggleButtonGroup.ts +121 -0
  358. package/src/button/index.ts +10 -4
  359. package/src/button/types.ts +18 -12
  360. package/src/calendar/createCalendar.ts +62 -29
  361. package/src/calendar/createCalendarCell.ts +102 -48
  362. package/src/calendar/createCalendarGrid.ts +78 -47
  363. package/src/calendar/createRangeCalendar.ts +66 -31
  364. package/src/calendar/createRangeCalendarCell.ts +115 -37
  365. package/src/calendar/index.ts +5 -9
  366. package/src/calendar/intl/index.ts +210 -0
  367. package/src/calendar/utils.ts +227 -0
  368. package/src/checkbox/createCheckbox.ts +13 -21
  369. package/src/checkbox/createCheckboxGroup.ts +86 -45
  370. package/src/checkbox/createCheckboxGroupItem.ts +16 -27
  371. package/src/checkbox/createCheckboxGroupState.ts +3 -22
  372. package/src/checkbox/index.ts +8 -10
  373. package/src/collections/index.ts +246 -0
  374. package/src/color/createColorArea.ts +458 -314
  375. package/src/color/createColorField.ts +186 -137
  376. package/src/color/createColorSlider.ts +444 -197
  377. package/src/color/createColorSwatch.ts +65 -40
  378. package/src/color/createColorWheel.ts +343 -208
  379. package/src/color/index.ts +24 -24
  380. package/src/color/types.ts +198 -116
  381. package/src/combobox/createComboBox.ts +727 -647
  382. package/src/combobox/index.ts +6 -6
  383. package/src/combobox/intl/index.ts +5 -5
  384. package/src/datepicker/createDateField.ts +192 -39
  385. package/src/datepicker/createDatePicker.ts +294 -63
  386. package/src/datepicker/createDatePickerGroup.ts +149 -0
  387. package/src/datepicker/createDateRangePicker.ts +294 -0
  388. package/src/datepicker/createDateSegment.ts +316 -75
  389. package/src/datepicker/createTimeField.ts +38 -34
  390. package/src/datepicker/createTimeSegment.ts +352 -0
  391. package/src/datepicker/index.ts +24 -11
  392. package/src/dialog/createDialog.ts +127 -120
  393. package/src/dialog/index.ts +2 -2
  394. package/src/dialog/types.ts +19 -19
  395. package/src/disclosure/createDisclosure.ts +138 -33
  396. package/src/disclosure/createDisclosureGroup.ts +8 -18
  397. package/src/disclosure/index.ts +2 -2
  398. package/src/dnd/createDrag.ts +218 -209
  399. package/src/dnd/createDraggableCollection.ts +96 -63
  400. package/src/dnd/createDraggableItem.ts +260 -243
  401. package/src/dnd/createDrop.ts +313 -321
  402. package/src/dnd/createDroppableCollection.ts +799 -293
  403. package/src/dnd/createDroppableItem.ts +215 -213
  404. package/src/dnd/index.ts +66 -47
  405. package/src/dnd/types.ts +86 -89
  406. package/src/dnd/utils.ts +281 -294
  407. package/src/focus/FocusScope.tsx +155 -164
  408. package/src/focus/createAutoFocus.ts +305 -321
  409. package/src/focus/createFocusRestore.ts +300 -313
  410. package/src/focus/createVirtualFocus.ts +380 -396
  411. package/src/focus/index.ts +4 -8
  412. package/src/form/createFormReset.ts +4 -4
  413. package/src/form/createFormValidation.ts +201 -224
  414. package/src/form/index.ts +8 -11
  415. package/src/grid/GridKeyboardDelegate.ts +30 -30
  416. package/src/grid/createGrid.ts +38 -36
  417. package/src/grid/createGridCell.ts +18 -18
  418. package/src/grid/createGridRow.ts +14 -14
  419. package/src/grid/index.ts +5 -5
  420. package/src/grid/types.ts +8 -8
  421. package/src/gridlist/createGridList.ts +45 -24
  422. package/src/gridlist/createGridListItem.ts +68 -23
  423. package/src/gridlist/createGridListSelectionCheckbox.ts +12 -9
  424. package/src/gridlist/index.ts +4 -4
  425. package/src/gridlist/types.ts +11 -7
  426. package/src/i18n/createCollator.ts +66 -79
  427. package/src/i18n/createDateFormatter.ts +75 -83
  428. package/src/i18n/createFilter.ts +118 -131
  429. package/src/i18n/createNumberFormatter.ts +50 -52
  430. package/src/i18n/createStringFormatter.ts +19 -15
  431. package/src/i18n/index.ts +37 -40
  432. package/src/i18n/locale.tsx +163 -188
  433. package/src/i18n/utils.ts +95 -99
  434. package/src/index.ts +114 -164
  435. package/src/interactions/FocusableProvider.tsx +3 -7
  436. package/src/interactions/PressEvent.ts +4 -4
  437. package/src/interactions/createFocus.ts +16 -11
  438. package/src/interactions/createFocusRing.ts +21 -19
  439. package/src/interactions/createFocusWithin.ts +24 -16
  440. package/src/interactions/createFocusable.ts +15 -16
  441. package/src/interactions/createHover.ts +70 -55
  442. package/src/interactions/createInteractionModality.ts +75 -82
  443. package/src/interactions/createKeyboard.ts +2 -2
  444. package/src/interactions/createLongPress.ts +174 -174
  445. package/src/interactions/createMove.ts +299 -289
  446. package/src/interactions/createPress.ts +168 -91
  447. package/src/interactions/index.ts +24 -16
  448. package/src/label/createField.ts +18 -19
  449. package/src/label/createLabel.ts +18 -30
  450. package/src/label/createLabels.ts +8 -12
  451. package/src/label/index.ts +5 -5
  452. package/src/landmark/createLandmark.ts +356 -377
  453. package/src/landmark/index.ts +8 -8
  454. package/src/link/createLink.ts +96 -54
  455. package/src/link/index.ts +1 -1
  456. package/src/listbox/createListBox.ts +319 -269
  457. package/src/listbox/createOption.ts +208 -151
  458. package/src/listbox/index.ts +8 -12
  459. package/src/live-announcer/announce.ts +295 -322
  460. package/src/live-announcer/index.ts +9 -9
  461. package/src/menu/createMenu.ts +434 -396
  462. package/src/menu/createMenuItem.ts +201 -149
  463. package/src/menu/createMenuTrigger.ts +88 -88
  464. package/src/menu/index.ts +9 -18
  465. package/src/meter/createMeter.ts +7 -20
  466. package/src/meter/index.ts +1 -1
  467. package/src/numberfield/createNumberField.ts +368 -268
  468. package/src/numberfield/index.ts +5 -5
  469. package/src/overlays/ariaHideOutside.ts +223 -219
  470. package/src/overlays/createInteractOutside.ts +152 -149
  471. package/src/overlays/createModal.tsx +238 -202
  472. package/src/overlays/createOverlay.ts +195 -155
  473. package/src/overlays/createOverlayTrigger.ts +85 -85
  474. package/src/overlays/createPreventScroll.ts +288 -266
  475. package/src/overlays/index.ts +37 -44
  476. package/src/popover/calculatePosition.ts +117 -119
  477. package/src/popover/createOverlayPosition.ts +52 -43
  478. package/src/popover/createPopover.ts +63 -24
  479. package/src/popover/index.ts +3 -3
  480. package/src/progress/createProgressBar.ts +36 -32
  481. package/src/progress/index.ts +1 -1
  482. package/src/radio/createRadio.ts +95 -73
  483. package/src/radio/createRadioGroup.ts +142 -62
  484. package/src/radio/createRadioGroupState.ts +7 -31
  485. package/src/radio/index.ts +3 -8
  486. package/src/searchfield/createSearchField.ts +269 -186
  487. package/src/searchfield/index.ts +2 -2
  488. package/src/select/createHiddenSelect.tsx +276 -236
  489. package/src/select/createSelect.ts +430 -395
  490. package/src/select/index.ts +9 -14
  491. package/src/selection/createTypeSelect.ts +11 -11
  492. package/src/selection/index.ts +1 -1
  493. package/src/separator/createSeparator.ts +20 -25
  494. package/src/separator/index.ts +1 -1
  495. package/src/slider/createSlider.ts +333 -349
  496. package/src/slider/index.ts +2 -2
  497. package/src/ssr/index.tsx +331 -370
  498. package/src/steplist/createStepList.ts +106 -0
  499. package/src/steplist/index.ts +8 -0
  500. package/src/switch/createSwitch.ts +9 -14
  501. package/src/switch/index.ts +1 -1
  502. package/src/table/createTable.ts +155 -86
  503. package/src/table/createTableCell.ts +17 -16
  504. package/src/table/createTableColumnHeader.ts +67 -20
  505. package/src/table/createTableColumnResize.ts +256 -0
  506. package/src/table/createTableHeaderRow.ts +7 -7
  507. package/src/table/createTableRow.ts +149 -29
  508. package/src/table/createTableRowGroup.ts +5 -7
  509. package/src/table/createTableSelectAllCheckbox.ts +12 -11
  510. package/src/table/createTableSelectionCheckbox.ts +8 -8
  511. package/src/table/index.ts +14 -9
  512. package/src/table/types.ts +15 -7
  513. package/src/tabs/createTabs.ts +138 -127
  514. package/src/tabs/index.ts +1 -1
  515. package/src/tag/createTag.ts +171 -40
  516. package/src/tag/createTagGroup.ts +50 -39
  517. package/src/tag/index.ts +2 -6
  518. package/src/textfield/createTextField.ts +67 -35
  519. package/src/textfield/index.ts +1 -5
  520. package/src/toast/createToast.ts +34 -26
  521. package/src/toast/createToastRegion.ts +169 -27
  522. package/src/toast/index.ts +2 -6
  523. package/src/toggle/createToggle.ts +95 -53
  524. package/src/toggle/createToggleState.ts +2 -10
  525. package/src/toggle/index.ts +4 -5
  526. package/src/toolbar/createToolbar.ts +226 -169
  527. package/src/toolbar/index.ts +1 -1
  528. package/src/tooltip/createTooltip.ts +66 -79
  529. package/src/tooltip/createTooltipTrigger.ts +238 -222
  530. package/src/tooltip/index.ts +6 -6
  531. package/src/tree/createTree.ts +259 -246
  532. package/src/tree/createTreeItem.ts +282 -233
  533. package/src/tree/createTreeSelectionCheckbox.ts +71 -68
  534. package/src/tree/index.ts +16 -16
  535. package/src/tree/types.ts +95 -87
  536. package/src/utils/createDescription.ts +6 -23
  537. package/src/utils/dom.ts +61 -54
  538. package/src/utils/env.ts +53 -54
  539. package/src/utils/events.ts +7 -7
  540. package/src/utils/filterDOMProps.ts +49 -49
  541. package/src/utils/focus.ts +60 -68
  542. package/src/utils/geometry.ts +1 -4
  543. package/src/utils/globalListeners.ts +9 -9
  544. package/src/utils/index.ts +12 -22
  545. package/src/utils/mergeProps.ts +42 -15
  546. package/src/utils/platform.ts +16 -6
  547. package/src/utils/reactivity.ts +3 -3
  548. package/src/utils/textSelection.ts +16 -16
  549. package/src/visually-hidden/createVisuallyHidden.ts +127 -124
  550. package/src/visually-hidden/index.ts +6 -6
  551. package/dist/i18n/NumberFormatter.d.ts +0 -43
  552. package/dist/i18n/NumberFormatter.d.ts.map +0 -1
  553. package/dist/index.ssr.js +0 -15875
  554. package/dist/index.ssr.js.map +0 -7
  555. package/src/i18n/NumberFormatter.ts +0 -266
@@ -7,20 +7,16 @@
7
7
  * This is a 1:1 port of @react-aria/radio's useRadio hook.
8
8
  */
9
9
 
10
- import { JSX, Accessor, createEffect } from 'solid-js';
11
- import { createPress } from '../interactions/createPress';
12
- import { createFocusable } from '../interactions/createFocusable';
13
- import { mergeProps } from '../utils/mergeProps';
14
- import { filterDOMProps } from '../utils/filterDOMProps';
15
- import { type MaybeAccessor, access } from '../utils/reactivity';
16
- import { isDevEnv } from '../utils/env';
17
- import { type RadioGroupState, radioGroupSyncVersion } from '@proyecto-viviana/solid-stately';
18
- import { radioGroupData } from './createRadioGroup';
19
- import { type PressEvent } from '../interactions/PressEvent';
20
-
21
- // ============================================
22
- // TYPES
23
- // ============================================
10
+ import { JSX, Accessor, createEffect } from "solid-js";
11
+ import { createPress } from "../interactions/createPress";
12
+ import { createFocusable } from "../interactions/createFocusable";
13
+ import { mergeProps } from "../utils/mergeProps";
14
+ import { filterDOMProps } from "../utils/filterDOMProps";
15
+ import { type MaybeAccessor, access } from "../utils/reactivity";
16
+ import { isDevEnv } from "../utils/env";
17
+ import { type RadioGroupState, radioGroupSyncVersion } from "@proyecto-viviana/solid-stately";
18
+ import { radioGroupData } from "./createRadioGroup";
19
+ import { type PressEvent } from "../interactions/PressEvent";
24
20
 
25
21
  export interface AriaRadioProps {
26
22
  /** The value of the radio button, used when submitting an HTML form. */
@@ -30,11 +26,11 @@ export interface AriaRadioProps {
30
26
  /** The label for the radio button. */
31
27
  children?: JSX.Element;
32
28
  /** Defines a string value that labels the current element. */
33
- 'aria-label'?: string;
29
+ "aria-label"?: string;
34
30
  /** Identifies the element (or elements) that labels the current element. */
35
- 'aria-labelledby'?: string;
31
+ "aria-labelledby"?: string;
36
32
  /** Identifies the element (or elements) that describes the object. */
37
- 'aria-describedby'?: string;
33
+ "aria-describedby"?: string;
38
34
  /** Handler that is called when the press is released over the target. */
39
35
  onPress?: (e: PressEvent) => void;
40
36
  /** Handler that is called when a press interaction starts. */
@@ -74,10 +70,6 @@ export interface RadioAria {
74
70
  isPressed: Accessor<boolean>;
75
71
  }
76
72
 
77
- // ============================================
78
- // IMPLEMENTATION
79
- // ============================================
80
-
81
73
  /**
82
74
  * Provides the behavior and accessibility implementation for an individual
83
75
  * radio button in a radio group.
@@ -85,7 +77,7 @@ export interface RadioAria {
85
77
  export function createRadio(
86
78
  props: MaybeAccessor<AriaRadioProps>,
87
79
  state: RadioGroupState,
88
- ref: () => HTMLInputElement | null
80
+ ref: () => HTMLInputElement | null,
89
81
  ): RadioAria {
90
82
  const getProps = () => access(props);
91
83
 
@@ -97,13 +89,14 @@ export function createRadio(
97
89
  return selected === v;
98
90
  };
99
91
 
100
- // Warn if no accessible label
101
92
  createEffect(() => {
102
93
  const p = getProps();
103
94
  const hasChildren = p.children != null;
104
- const hasAriaLabel = p['aria-label'] != null || p['aria-labelledby'] != null;
95
+ const hasAriaLabel = p["aria-label"] != null || p["aria-labelledby"] != null;
105
96
  if (!hasChildren && !hasAriaLabel && isDevEnv()) {
106
- console.warn('If you do not provide children, you must specify an aria-label for accessibility');
97
+ console.warn(
98
+ "If you do not provide children, you must specify an aria-label for accessibility",
99
+ );
107
100
  }
108
101
  });
109
102
 
@@ -120,25 +113,19 @@ export function createRadio(
120
113
  // We track `syncVersion` to ensure this effect runs on EVERY selection attempt,
121
114
  // even in controlled mode where isSelected() may not change.
122
115
  createEffect(() => {
123
- const inputEl = ref();
124
- if (!inputEl) return;
125
-
126
- // Track syncVersion to trigger on any selection attempt
127
- // This is crucial for controlled mode where isSelected() may not change
128
- // syncVersion is stored in an internal WeakMap to maintain API parity with React-Aria
116
+ // The WeakMap accessor is outside the public API to maintain React Aria parity.
129
117
  const syncVersion = radioGroupSyncVersion.get(state);
130
118
  syncVersion?.();
131
119
 
132
- // Read the reactive state to establish tracking and get current value
133
120
  const shouldBeChecked = isSelected();
121
+ const inputEl = ref();
122
+ if (!inputEl) return;
134
123
 
135
- // Sync the DOM checked state immediately
136
124
  if (inputEl.checked !== shouldBeChecked) {
137
125
  inputEl.checked = shouldBeChecked;
138
126
  }
139
127
  });
140
128
 
141
- // Handle input change
142
129
  // SolidJS-specific: Unlike React, the input's `checked` state can get out of sync
143
130
  // with our reactive state. This happens because:
144
131
  // 1. A readonly `<input type="radio" />` is always "checkable" in the browser
@@ -172,49 +159,88 @@ export function createRadio(
172
159
 
173
160
  // Handle press state for keyboard interactions and cases where labelProps is not used.
174
161
  const { pressProps, isPressed } = createPress({
175
- get onPressStart() { return getProps().onPressStart; },
176
- get onPressEnd() { return getProps().onPressEnd; },
177
- get onPressChange() { return getProps().onPressChange; },
178
- get onPress() { return getProps().onPress; },
179
- get onPressUp() { return getProps().onPressUp; },
180
- get isDisabled() { return isDisabled(); },
162
+ get onPressStart() {
163
+ return getProps().onPressStart;
164
+ },
165
+ get onPressEnd() {
166
+ return getProps().onPressEnd;
167
+ },
168
+ get onPressChange() {
169
+ return getProps().onPressChange;
170
+ },
171
+ get onPress() {
172
+ return getProps().onPress;
173
+ },
174
+ get onPressUp() {
175
+ return getProps().onPressUp;
176
+ },
177
+ get onClick() {
178
+ return getProps().onClick;
179
+ },
180
+ get isDisabled() {
181
+ return isDisabled();
182
+ },
181
183
  });
182
184
 
183
- // Handle press state on the label.
184
185
  const { pressProps: labelPressProps, isPressed: isLabelPressed } = createPress({
185
- get onPressStart() { return getProps().onPressStart; },
186
- get onPressEnd() { return getProps().onPressEnd; },
187
- get onPressChange() { return getProps().onPressChange; },
188
- get onPressUp() { return getProps().onPressUp; },
186
+ get onPressStart() {
187
+ return getProps().onPressStart;
188
+ },
189
+ get onPressEnd() {
190
+ return getProps().onPressEnd;
191
+ },
192
+ get onPressChange() {
193
+ return getProps().onPressChange;
194
+ },
195
+ get onPressUp() {
196
+ return getProps().onPressUp;
197
+ },
198
+ get onClick() {
199
+ return getProps().onClick;
200
+ },
189
201
  onPress(e: PressEvent) {
190
202
  getProps().onPress?.(e);
191
203
  state.setSelectedValue(value());
192
204
  ref()?.focus();
193
205
  },
194
- get isDisabled() { return isDisabled(); },
206
+ get isDisabled() {
207
+ return isDisabled();
208
+ },
195
209
  });
196
210
 
197
- // Handle focusable
198
- const { focusableProps } = createFocusable({
199
- get isDisabled() { return isDisabled(); },
200
- get autoFocus() { return getProps().autoFocus; },
201
- onFocus(e: FocusEvent) {
202
- getProps().onFocus?.(e);
203
- state.setLastFocusedValue(value());
211
+ const { focusableProps } = createFocusable(
212
+ {
213
+ get isDisabled() {
214
+ return isDisabled();
215
+ },
216
+ get autoFocus() {
217
+ return getProps().autoFocus;
218
+ },
219
+ onFocus(e: FocusEvent) {
220
+ getProps().onFocus?.(e);
221
+ state.setLastFocusedValue(value());
222
+ },
223
+ get onBlur() {
224
+ return getProps().onBlur;
225
+ },
226
+ get onFocusChange() {
227
+ return getProps().onFocusChange;
228
+ },
229
+ get onKeyDown() {
230
+ return getProps().onKeyDown;
231
+ },
232
+ get onKeyUp() {
233
+ return getProps().onKeyUp;
234
+ },
204
235
  },
205
- get onBlur() { return getProps().onBlur; },
206
- get onFocusChange() { return getProps().onFocusChange; },
207
- get onKeyDown() { return getProps().onKeyDown; },
208
- get onKeyUp() { return getProps().onKeyUp; },
209
- }, ref as unknown as (el: HTMLElement) => void);
236
+ ref as unknown as (el: HTMLElement) => void,
237
+ );
210
238
 
211
- // Combine press and focusable props for input
212
239
  const interactions = mergeProps(pressProps, focusableProps);
213
240
 
214
- // Filter DOM props
215
- const domProps = () => filterDOMProps(getProps() as unknown as Record<string, unknown>, { labelable: true });
241
+ const domProps = () =>
242
+ filterDOMProps(getProps() as unknown as Record<string, unknown>, { labelable: true });
216
243
 
217
- // Calculate tabIndex based on selection and focus state
218
244
  const getTabIndex = (): number | undefined => {
219
245
  if (isDisabled()) {
220
246
  return undefined;
@@ -225,13 +251,11 @@ export function createRadio(
225
251
  const currentValue = value();
226
252
 
227
253
  if (selected != null) {
228
- // If there's a selection, only the selected radio is focusable
229
254
  if (selected === currentValue) {
230
255
  return 0;
231
256
  }
232
257
  return -1;
233
258
  } else {
234
- // If no selection, the last focused or first radio is focusable
235
259
  if (lastFocused === currentValue || lastFocused == null) {
236
260
  return 0;
237
261
  }
@@ -239,10 +263,8 @@ export function createRadio(
239
263
  }
240
264
  };
241
265
 
242
- // Get group data
243
266
  const getGroupData = () => radioGroupData.get(state);
244
267
 
245
- // Combined pressed state
246
268
  const combinedIsPressed: Accessor<boolean> = () => isPressed() || isLabelPressed();
247
269
 
248
270
  return {
@@ -254,10 +276,9 @@ export function createRadio(
254
276
  const p = getProps();
255
277
  const groupData = getGroupData();
256
278
 
257
- // Build aria-describedby
258
279
  const describedByIds: string[] = [];
259
- if (p['aria-describedby']) {
260
- describedByIds.push(p['aria-describedby']);
280
+ if (p["aria-describedby"]) {
281
+ describedByIds.push(p["aria-describedby"]);
261
282
  }
262
283
  if (state.isInvalid && groupData?.errorMessageId) {
263
284
  describedByIds.push(groupData.errorMessageId);
@@ -265,19 +286,20 @@ export function createRadio(
265
286
  if (groupData?.descriptionId) {
266
287
  describedByIds.push(groupData.descriptionId);
267
288
  }
268
- const ariaDescribedBy = describedByIds.length > 0 ? describedByIds.join(' ') : undefined;
289
+ const ariaDescribedBy = describedByIds.length > 0 ? describedByIds.join(" ") : undefined;
290
+ const validationBehavior = groupData?.validationBehavior ?? "native";
269
291
 
270
292
  return mergeProps(domProps(), interactions, {
271
- type: 'radio' as const,
293
+ type: "radio" as const,
272
294
  name: groupData?.name,
273
295
  form: groupData?.form,
274
296
  tabIndex: getTabIndex(),
275
297
  disabled: isDisabled(),
276
- required: state.isRequired && groupData?.validationBehavior === 'native',
298
+ required: validationBehavior === "native" ? state.isRequired : undefined,
277
299
  checked: isSelected(),
278
300
  value: value(),
279
301
  onChange,
280
- 'aria-describedby': ariaDescribedBy,
302
+ "aria-describedby": ariaDescribedBy,
281
303
  }) as JSX.InputHTMLAttributes<HTMLInputElement>;
282
304
  },
283
305
  isDisabled: isDisabled(),
@@ -7,18 +7,16 @@
7
7
  * This is a 1:1 port of @react-aria/radio's useRadioGroup hook.
8
8
  */
9
9
 
10
- import { JSX } from 'solid-js';
11
- import { createField } from '../label/createField';
12
- import { createFocusWithin } from '../interactions/createFocusWithin';
13
- import { mergeProps } from '../utils/mergeProps';
14
- import { filterDOMProps } from '../utils/filterDOMProps';
15
- import { createId } from '../ssr';
16
- import { type MaybeAccessor, access } from '../utils/reactivity';
17
- import { type RadioGroupState } from '@proyecto-viviana/solid-stately';
18
-
19
- // ============================================
20
- // TYPES
21
- // ============================================
10
+ import { JSX } from "solid-js";
11
+ import { createField } from "../label/createField";
12
+ import { createFocusWithin } from "../interactions/createFocusWithin";
13
+ import { mergeProps } from "../utils/mergeProps";
14
+ import { filterDOMProps } from "../utils/filterDOMProps";
15
+ import { focusSafely, getEventTarget } from "../utils";
16
+ import { useLocale } from "../i18n";
17
+ import { createId } from "../ssr";
18
+ import { type MaybeAccessor, access } from "../utils/reactivity";
19
+ import { type RadioGroupState, type ValidityState } from "@proyecto-viviana/solid-stately";
22
20
 
23
21
  export interface AriaRadioGroupProps {
24
22
  /** The content to display as the label. */
@@ -26,7 +24,9 @@ export interface AriaRadioGroupProps {
26
24
  /** A description for the radio group. Provides additional context. */
27
25
  description?: JSX.Element;
28
26
  /** An error message for the radio group. */
29
- errorMessage?: JSX.Element | ((validation: { isInvalid: boolean; validationErrors: string[] }) => JSX.Element);
27
+ errorMessage?:
28
+ | JSX.Element
29
+ | ((validation: { isInvalid: boolean; validationErrors: string[] }) => JSX.Element);
30
30
  /** Whether the radio group is disabled. */
31
31
  isDisabled?: boolean;
32
32
  /** Whether the radio group is read only. */
@@ -36,13 +36,13 @@ export interface AriaRadioGroupProps {
36
36
  /** Whether the radio group is invalid. */
37
37
  isInvalid?: boolean;
38
38
  /** The axis the Radio Button(s) should align with. Defaults to 'vertical'. */
39
- orientation?: 'horizontal' | 'vertical';
39
+ orientation?: "horizontal" | "vertical";
40
40
  /** The name of the radio group, used when submitting an HTML form. */
41
41
  name?: string;
42
42
  /** The form to associate the radio group with. */
43
43
  form?: string;
44
44
  /** Validation behavior for the radio group. */
45
- validationBehavior?: 'aria' | 'native';
45
+ validationBehavior?: "aria" | "native";
46
46
  /** Handler that is called when the radio group receives focus. */
47
47
  onFocus?: (e: FocusEvent) => void;
48
48
  /** Handler that is called when the radio group loses focus. */
@@ -50,13 +50,13 @@ export interface AriaRadioGroupProps {
50
50
  /** Handler that is called when the radio group's focus status changes. */
51
51
  onFocusChange?: (isFocused: boolean) => void;
52
52
  /** Defines a string value that labels the current element. */
53
- 'aria-label'?: string;
53
+ "aria-label"?: string;
54
54
  /** Identifies the element (or elements) that labels the current element. */
55
- 'aria-labelledby'?: string;
55
+ "aria-labelledby"?: string;
56
56
  /** Identifies the element (or elements) that describes the object. */
57
- 'aria-describedby'?: string;
57
+ "aria-describedby"?: string;
58
58
  /** Identifies the element (or elements) that provide an error message for the object. */
59
- 'aria-errormessage'?: string;
59
+ "aria-errormessage"?: string;
60
60
  /** The element's unique identifier. */
61
61
  id?: string;
62
62
  }
@@ -75,7 +75,7 @@ export interface RadioGroupAria {
75
75
  /** Validation errors, if any. */
76
76
  validationErrors: string[];
77
77
  /** Validation details, if any. */
78
- validationDetails: Record<string, boolean>;
78
+ validationDetails: ValidityState;
79
79
  }
80
80
 
81
81
  // WeakMap to share data between radio group and radio items
@@ -84,40 +84,61 @@ interface RadioGroupData {
84
84
  form: string | undefined;
85
85
  descriptionId: string | undefined;
86
86
  errorMessageId: string | undefined;
87
- validationBehavior: 'aria' | 'native';
87
+ validationBehavior: "aria" | "native";
88
88
  }
89
89
 
90
90
  export const radioGroupData: WeakMap<RadioGroupState, RadioGroupData> = new WeakMap();
91
91
 
92
- // ============================================
93
- // IMPLEMENTATION
94
- // ============================================
95
-
96
92
  /**
97
93
  * Provides the behavior and accessibility implementation for a radio group component.
98
94
  * Radio groups allow users to select a single item from a list of mutually exclusive options.
99
95
  */
100
96
  export function createRadioGroup(
101
97
  props: MaybeAccessor<AriaRadioGroupProps>,
102
- state: RadioGroupState
98
+ state: RadioGroupState,
103
99
  ): RadioGroupAria {
104
100
  const getProps = () => access(props);
101
+ const locale = useLocale();
105
102
 
106
- const orientation = () => getProps().orientation ?? 'vertical';
103
+ const orientation = () => getProps().orientation ?? "vertical";
107
104
  const isReadOnly = () => getProps().isReadOnly ?? false;
108
105
  const isRequired = () => getProps().isRequired ?? false;
109
106
  const isDisabled = () => getProps().isDisabled ?? false;
110
- const validationBehavior = () => getProps().validationBehavior ?? 'aria';
107
+ const validationBehavior = () => getProps().validationBehavior ?? "native";
108
+ const displayValidation = () => state.displayValidation();
109
+ const validationErrors = () => displayValidation().validationErrors;
110
+ const validationDetails = () => displayValidation().validationDetails;
111
+ const isInvalid = () => displayValidation().isInvalid;
112
+ const fallbackErrorMessage = () => {
113
+ const errors = validationErrors();
114
+ return errors.length > 0 ? errors : undefined;
115
+ };
111
116
 
112
- // Use field for label, description, error message
113
117
  const { labelProps, fieldProps, descriptionProps, errorMessageProps } = createField({
114
- get label() { return getProps().label; },
115
- get description() { return getProps().description; },
116
- get errorMessage() { return getProps().errorMessage; },
117
- get isInvalid() { return state.isInvalid; },
118
+ get id() {
119
+ return getProps().id;
120
+ },
121
+ get label() {
122
+ return getProps().label;
123
+ },
124
+ get "aria-label"() {
125
+ return getProps()["aria-label"];
126
+ },
127
+ get "aria-labelledby"() {
128
+ return getProps()["aria-labelledby"];
129
+ },
130
+ get description() {
131
+ return getProps().description;
132
+ },
133
+ get errorMessage() {
134
+ return getProps().errorMessage ?? fallbackErrorMessage();
135
+ },
136
+ get isInvalid() {
137
+ return isInvalid();
138
+ },
118
139
  // Radio group is not an HTML input element so it
119
140
  // shouldn't be labeled by a <label> element.
120
- labelElementType: 'span',
141
+ labelElementType: "span",
121
142
  });
122
143
 
123
144
  // Handle focus within - reset focusable radio when group loses focus and no selection
@@ -132,13 +153,11 @@ export function createRadioGroup(
132
153
  onFocusWithinChange: (isFocused: boolean) => getProps().onFocusChange?.(isFocused),
133
154
  });
134
155
 
135
- // Filter DOM props
136
- const domProps = () => filterDOMProps(getProps() as unknown as Record<string, unknown>, { labelable: true });
156
+ const domProps = () =>
157
+ filterDOMProps(getProps() as unknown as Record<string, unknown>, { labelable: true });
137
158
 
138
- // Generate group name
139
159
  const groupName = getProps().name ?? createId();
140
160
 
141
- // Store data for radio items to access
142
161
  radioGroupData.set(state, {
143
162
  name: groupName,
144
163
  form: getProps().form,
@@ -147,43 +166,104 @@ export function createRadioGroup(
147
166
  validationBehavior: validationBehavior(),
148
167
  });
149
168
 
150
- // Keyboard navigation handler for arrow keys
151
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
152
- const onKeyDown = (_e: KeyboardEvent) => {
153
- // For now, we rely on native radio behavior
154
- // The complex tree walker implementation can be added later if needed
155
- // Most browsers handle arrow key navigation natively for radio groups
169
+ const getNavigableRadios = (root: HTMLElement): HTMLInputElement[] => {
170
+ return Array.from(root.querySelectorAll('input[type="radio"]')).filter(
171
+ (el): el is HTMLInputElement => {
172
+ return el instanceof HTMLInputElement && !el.matches(":disabled");
173
+ },
174
+ );
175
+ };
176
+
177
+ // Keyboard navigation parity with React Aria.
178
+ const onKeyDown: JSX.EventHandler<HTMLDivElement, KeyboardEvent> = (e) => {
179
+ let nextDir: "next" | "prev" | null = null;
180
+ const currentOrientation = orientation();
181
+ const isHorizontal = currentOrientation !== "vertical";
182
+ const isRTL = locale().direction === "rtl" && isHorizontal;
183
+
184
+ switch (e.key) {
185
+ case "ArrowRight":
186
+ nextDir = isRTL ? "prev" : "next";
187
+ break;
188
+ case "ArrowLeft":
189
+ nextDir = isRTL ? "next" : "prev";
190
+ break;
191
+ case "ArrowDown":
192
+ nextDir = "next";
193
+ break;
194
+ case "ArrowUp":
195
+ nextDir = "prev";
196
+ break;
197
+ default:
198
+ return;
199
+ }
200
+
201
+ e.preventDefault();
202
+
203
+ const root = e.currentTarget;
204
+ if (!(root instanceof HTMLElement)) {
205
+ return;
206
+ }
207
+
208
+ const radios = getNavigableRadios(root);
209
+ if (radios.length === 0) {
210
+ return;
211
+ }
212
+
213
+ const eventTarget = getEventTarget<Element>(e);
214
+ const activeElement = root.ownerDocument.activeElement;
215
+
216
+ const currentRadio =
217
+ eventTarget instanceof HTMLInputElement && eventTarget.type === "radio"
218
+ ? eventTarget
219
+ : activeElement instanceof HTMLInputElement && activeElement.type === "radio"
220
+ ? activeElement
221
+ : null;
222
+
223
+ const currentIndex = currentRadio ? radios.indexOf(currentRadio) : -1;
224
+
225
+ let nextIndex: number;
226
+ if (nextDir === "next") {
227
+ nextIndex = currentIndex >= 0 ? (currentIndex + 1) % radios.length : 0;
228
+ } else {
229
+ nextIndex =
230
+ currentIndex >= 0 ? (currentIndex - 1 + radios.length) % radios.length : radios.length - 1;
231
+ }
232
+
233
+ const nextRadio = radios[nextIndex];
234
+ if (!nextRadio) {
235
+ return;
236
+ }
237
+
238
+ focusSafely(nextRadio);
239
+ state.setSelectedValue(nextRadio.value);
156
240
  };
157
241
 
158
242
  return {
159
243
  get radioGroupProps() {
160
- return mergeProps(
161
- domProps(),
162
- focusWithinProps as unknown as Record<string, unknown>,
163
- {
164
- role: 'radiogroup',
165
- onKeyDown,
166
- 'aria-invalid': state.isInvalid || undefined,
167
- 'aria-errormessage': getProps()['aria-errormessage'],
168
- 'aria-readonly': isReadOnly() || undefined,
169
- 'aria-required': isRequired() || undefined,
170
- 'aria-disabled': isDisabled() || undefined,
171
- 'aria-orientation': orientation(),
172
- ...fieldProps,
173
- }
174
- ) as JSX.HTMLAttributes<HTMLDivElement>;
244
+ return mergeProps(domProps(), focusWithinProps as unknown as Record<string, unknown>, {
245
+ role: "radiogroup",
246
+ onKeyDown,
247
+ "aria-invalid": isInvalid() || undefined,
248
+ "aria-errormessage": getProps()["aria-errormessage"],
249
+ "aria-readonly": isReadOnly() || undefined,
250
+ "aria-required": isRequired() || undefined,
251
+ "aria-disabled": isDisabled() || undefined,
252
+ "aria-orientation": orientation(),
253
+ ...fieldProps,
254
+ }) as JSX.HTMLAttributes<HTMLDivElement>;
175
255
  },
176
256
  labelProps: labelProps as JSX.HTMLAttributes<HTMLElement>,
177
257
  descriptionProps,
178
258
  errorMessageProps,
179
259
  get isInvalid() {
180
- return state.isInvalid;
260
+ return isInvalid();
181
261
  },
182
262
  get validationErrors() {
183
- return []; // Simplified - full validation can be added later
263
+ return validationErrors();
184
264
  },
185
265
  get validationDetails() {
186
- return {}; // Simplified - full validation can be added later
266
+ return validationDetails();
187
267
  },
188
268
  };
189
269
  }