@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
@@ -5,20 +5,24 @@
5
5
  * Based on @react-aria/calendar useCalendarCell
6
6
  */
7
7
 
8
- import { createSignal, createMemo, onMount } from 'solid-js';
9
- import { access, type MaybeAccessor } from '../utils/reactivity';
10
- import type { CalendarState, CalendarDate, DateValue } from '@proyecto-viviana/solid-stately';
11
- import { isToday as isTodayUtil, DateFormatter, getLocalTimeZone } from '@internationalized/date';
12
-
13
- // ============================================
14
- // TYPES
15
- // ============================================
8
+ import { createSignal, createMemo, createEffect, type Accessor } from "solid-js";
9
+ import { access, type MaybeAccessor } from "../utils/reactivity";
10
+ import { focusSafely } from "../utils/focus";
11
+ import { createFocusRing } from "../interactions/createFocusRing";
12
+ import { getInteractionModality } from "../interactions/createInteractionModality";
13
+ import { useLocale } from "../i18n";
14
+ import { mergeProps } from "../utils/mergeProps";
15
+ import type { CalendarState, CalendarDate, DateValue } from "@proyecto-viviana/solid-stately";
16
+ import { isToday as isTodayUtil, DateFormatter, getLocalTimeZone } from "@internationalized/date";
17
+ import { getCalendarHookData } from "./utils";
16
18
 
17
19
  export interface AriaCalendarCellProps {
18
20
  /** The date represented by the cell. */
19
21
  date: DateValue;
20
22
  /** Whether the cell is disabled. */
21
23
  isDisabled?: boolean;
24
+ /** Whether the date is outside the current month grid. */
25
+ isOutsideMonth?: boolean;
22
26
  }
23
27
 
24
28
  export interface CalendarCellAria {
@@ -30,10 +34,14 @@ export interface CalendarCellAria {
30
34
  isSelected: boolean;
31
35
  /** Whether the cell is focused. */
32
36
  isFocused: boolean;
37
+ /** Whether the cell should display a keyboard focus ring. */
38
+ isFocusVisible: boolean;
33
39
  /** Whether the cell is disabled. */
34
40
  isDisabled: boolean;
35
41
  /** Whether the cell is unavailable (e.g., booked date). */
36
42
  isUnavailable: boolean;
43
+ /** Whether the cell is part of an invalid selection. */
44
+ isInvalid: boolean;
37
45
  /** Whether the cell is outside the visible month. */
38
46
  isOutsideMonth: boolean;
39
47
  /** Whether the cell represents today. */
@@ -44,21 +52,22 @@ export interface CalendarCellAria {
44
52
  formattedDate: string;
45
53
  }
46
54
 
47
- // ============================================
48
- // IMPLEMENTATION
49
- // ============================================
50
-
51
55
  /**
52
56
  * Provides the behavior and accessibility implementation for a calendar cell.
53
57
  */
54
58
  export function createCalendarCell<T extends CalendarState>(
55
59
  props: MaybeAccessor<AriaCalendarCellProps>,
56
60
  state: T,
57
- ref?: () => HTMLElement | null
61
+ ref?: () => HTMLElement | null,
58
62
  ): CalendarCellAria {
59
63
  const getProps = () => access(props);
60
64
  const [isPressed, setIsPressed] = createSignal(false);
65
+ const { focusProps, isFocusVisible: isRingFocusVisible } = createFocusRing();
61
66
  const timeZone = getLocalTimeZone();
67
+ const inheritedLocale = useLocale();
68
+ const stateWithLocale = state as T & { locale?: Accessor<string> };
69
+ const locale = () => stateWithLocale.locale?.() ?? inheritedLocale().locale;
70
+ let ignoreNextClick = false;
62
71
 
63
72
  // Get the date from props
64
73
  const date = createMemo(() => getProps().date as CalendarDate);
@@ -66,16 +75,32 @@ export function createCalendarCell<T extends CalendarState>(
66
75
  // Check states
67
76
  const isSelected = createMemo(() => state.isSelected(date()));
68
77
  const isFocused = createMemo(() => state.isCellFocused(date()));
78
+ const isInvalid = createMemo(() => state.isValueInvalid() && isSelected());
69
79
  const isDisabled = createMemo(() => {
70
80
  return getProps().isDisabled || state.isCellDisabled(date());
71
81
  });
72
82
  const isUnavailable = createMemo(() => state.isCellUnavailable(date()));
73
- const isOutsideMonth = createMemo(() => state.isOutsideVisibleRange(date()));
83
+ const isOutsideMonth = createMemo(
84
+ () => getProps().isOutsideMonth ?? state.isOutsideVisibleRange(date()),
85
+ );
74
86
  const isToday = createMemo(() => isTodayUtil(date(), timeZone));
87
+ const isCellFocusVisible = createMemo(
88
+ () => isFocused() && isRingFocusVisible() && getInteractionModality() !== null,
89
+ );
75
90
 
76
91
  // Format the date for display
77
92
  const formattedDate = createMemo(() => {
78
- return date().day.toString();
93
+ const d = date();
94
+ const formatter = new DateFormatter(locale(), {
95
+ day: "numeric",
96
+ timeZone,
97
+ calendar: d.calendar.identifier,
98
+ } as Intl.DateTimeFormatOptions);
99
+
100
+ return (
101
+ formatter.formatToParts(d.toDate(timeZone)).find((part) => part.type === "day")?.value ??
102
+ d.day.toString()
103
+ );
79
104
  });
80
105
 
81
106
  // Handle pointer down - this is where selection happens
@@ -87,6 +112,7 @@ export function createCalendarCell<T extends CalendarState>(
87
112
  // Select the date on pointer down for immediate response
88
113
  // This matches React Aria's behavior of using onPressStart
89
114
  state.selectDate(date());
115
+ ignoreNextClick = true;
90
116
  // Prevent default to avoid double-triggering with onClick
91
117
  e.preventDefault();
92
118
  }
@@ -94,6 +120,11 @@ export function createCalendarCell<T extends CalendarState>(
94
120
 
95
121
  // Handle click - kept for accessibility (keyboard Enter/Space)
96
122
  const handleClick = () => {
123
+ if (ignoreNextClick) {
124
+ ignoreNextClick = false;
125
+ return;
126
+ }
127
+
97
128
  // Only select on click if not already selected via pointerdown
98
129
  // This handles keyboard activation (Enter/Space)
99
130
  if (!isDisabled() && !isUnavailable()) {
@@ -105,51 +136,68 @@ export function createCalendarCell<T extends CalendarState>(
105
136
  setIsPressed(false);
106
137
  };
107
138
 
108
- // Focus the button when it becomes focused in state
109
- onMount(() => {
139
+ // Keep DOM focus synchronized with focused date updates.
140
+ // Use focusSafely (preventScroll) to match @react-aria/calendar — bare focus()
141
+ // causes the browser to auto-scroll the page when bringing the cell into view,
142
+ // which is wrong inside a popover. Scroll-into-view should be opt-in based on
143
+ // interaction modality (handled at a higher layer when needed).
144
+ createEffect(() => {
110
145
  const element = ref?.();
111
146
  if (element && isFocused()) {
112
- element.focus();
147
+ focusSafely(element);
113
148
  }
114
149
  });
115
150
 
116
151
  // Cell props (for the td element)
117
152
  const cellProps = createMemo(() => ({
118
- role: 'gridcell',
119
- 'aria-disabled': isDisabled() || undefined,
120
- 'aria-selected': isSelected() || undefined,
153
+ role: "gridcell",
154
+ "aria-disabled": isDisabled() || isUnavailable() || undefined,
155
+ "aria-selected": isSelected() || undefined,
156
+ "aria-invalid": isInvalid() || undefined,
121
157
  }));
122
158
 
123
159
  // Button props (for the interactive element inside)
124
160
  const buttonProps = createMemo(() => {
125
161
  const d = date();
126
- const formatter = new DateFormatter('en-US', {
127
- weekday: 'long',
128
- year: 'numeric',
129
- month: 'long',
130
- day: 'numeric',
131
- });
132
-
133
- return {
134
- role: 'button',
135
- tabIndex: isFocused() ? 0 : -1,
136
- 'aria-label': formatter.format(d.toDate(timeZone)),
137
- 'aria-disabled': isDisabled() || undefined,
138
- 'aria-pressed': isPressed() || undefined,
139
- disabled: isDisabled(),
140
- onClick: handleClick,
141
- onPointerDown: handlePointerDown,
142
- onPointerUp: handlePointerUp,
143
- onPointerLeave: handlePointerUp,
144
- onFocus: () => {
145
- // Only update if this cell isn't already the focused date
146
- // This prevents infinite loops when focus is programmatically set
147
- if (!state.isCellFocused(d)) {
148
- state.setFocusedDate(d);
149
- }
150
- state.setFocused(true);
151
- },
152
- };
162
+ const formatter = new DateFormatter(locale(), {
163
+ weekday: "long",
164
+ year: "numeric",
165
+ month: "long",
166
+ day: "numeric",
167
+ calendar: d.calendar.identifier,
168
+ } as Intl.DateTimeFormatOptions);
169
+ let label = formatter.format(d.toDate(timeZone));
170
+ if (isSelected()) {
171
+ label += " selected";
172
+ }
173
+ const errorMessageId = getCalendarHookData(state)?.errorMessageId;
174
+
175
+ return mergeProps(
176
+ focusProps as Record<string, unknown>,
177
+ {
178
+ role: "button",
179
+ tabIndex: isFocused() ? 0 : -1,
180
+ "aria-label": label,
181
+ "aria-disabled": isDisabled() || isUnavailable() || undefined,
182
+ "aria-invalid": isInvalid() || undefined,
183
+ "aria-describedby": isInvalid() ? errorMessageId : undefined,
184
+ "aria-pressed": isPressed() || undefined,
185
+ "data-focus-visible": isCellFocusVisible() || undefined,
186
+ disabled: isDisabled() || isUnavailable(),
187
+ onClick: handleClick,
188
+ onPointerDown: handlePointerDown,
189
+ onPointerUp: handlePointerUp,
190
+ onPointerLeave: handlePointerUp,
191
+ onFocus: () => {
192
+ // Only update if this cell isn't already the focused date.
193
+ // This prevents infinite loops when focus is programmatically set.
194
+ if (!state.isCellFocused(d)) {
195
+ state.setFocusedDate(d);
196
+ }
197
+ state.setFocused(true);
198
+ },
199
+ } as Record<string, unknown>,
200
+ );
153
201
  });
154
202
 
155
203
  return {
@@ -165,12 +213,18 @@ export function createCalendarCell<T extends CalendarState>(
165
213
  get isFocused() {
166
214
  return isFocused();
167
215
  },
216
+ get isFocusVisible() {
217
+ return isCellFocusVisible();
218
+ },
168
219
  get isDisabled() {
169
220
  return isDisabled();
170
221
  },
171
222
  get isUnavailable() {
172
223
  return isUnavailable();
173
224
  },
225
+ get isInvalid() {
226
+ return isInvalid();
227
+ },
174
228
  get isOutsideMonth() {
175
229
  return isOutsideMonth();
176
230
  },
@@ -5,13 +5,10 @@
5
5
  * Based on @react-aria/calendar useCalendarGrid
6
6
  */
7
7
 
8
- import { createMemo, onMount, onCleanup } from 'solid-js';
9
- import { type MaybeAccessor } from '../utils/reactivity';
10
- import type { CalendarState, CalendarDate } from '@proyecto-viviana/solid-stately';
11
-
12
- // ============================================
13
- // TYPES
14
- // ============================================
8
+ import { createMemo } from "solid-js";
9
+ import { DateFormatter, startOfWeek, today } from "@internationalized/date";
10
+ import { access, type MaybeAccessor } from "../utils/reactivity";
11
+ import type { CalendarState, CalendarDate } from "@proyecto-viviana/solid-stately";
15
12
 
16
13
  export interface AriaCalendarGridProps {
17
14
  /** The start date of the grid (defaults to start of focused month). */
@@ -19,7 +16,7 @@ export interface AriaCalendarGridProps {
19
16
  /** The end date of the grid (defaults to end of focused month). */
20
17
  endDate?: CalendarDate;
21
18
  /** The number of weeks to display. */
22
- weekdayStyle?: 'narrow' | 'short' | 'long';
19
+ weekdayStyle?: "narrow" | "short" | "long";
23
20
  }
24
21
 
25
22
  export interface CalendarGridAria {
@@ -31,100 +28,134 @@ export interface CalendarGridAria {
31
28
  weekDays: string[];
32
29
  }
33
30
 
34
- // ============================================
35
- // IMPLEMENTATION
36
- // ============================================
37
-
38
31
  /**
39
32
  * Provides the behavior and accessibility implementation for a calendar grid.
40
33
  */
41
34
  export function createCalendarGrid<T extends CalendarState>(
42
- _props: MaybeAccessor<AriaCalendarGridProps>,
35
+ props: MaybeAccessor<AriaCalendarGridProps>,
43
36
  state: T,
44
- ref?: () => HTMLElement | null
37
+ ref?: () => HTMLElement | null,
45
38
  ): CalendarGridAria {
46
39
  // Week days for headers
47
- const weekDays = createMemo(() => state.weekDays());
40
+ const weekDays = createMemo(() => {
41
+ const gridProps = access(props);
42
+ const formatter = new DateFormatter(state.locale(), {
43
+ weekday: gridProps.weekdayStyle ?? "narrow",
44
+ timeZone: state.timeZone,
45
+ });
46
+ const weekStart = startOfWeek(today(state.timeZone), state.locale(), state.firstDayOfWeek());
47
+
48
+ return Array.from({ length: 7 }, (_, index) =>
49
+ formatter.format(weekStart.add({ days: index }).toDate(state.timeZone)),
50
+ );
51
+ });
48
52
 
49
53
  // Handle keyboard navigation
54
+ const isRTL = (): boolean => {
55
+ const element = ref?.();
56
+ const scopedDirection = element?.closest("[dir]")?.getAttribute("dir");
57
+ const documentDirection = typeof document !== "undefined" ? document.dir : "";
58
+ return (scopedDirection ?? documentDirection) === "rtl";
59
+ };
60
+
50
61
  const handleKeyDown = (e: KeyboardEvent) => {
51
62
  if (state.isDisabled()) return;
52
63
 
53
64
  switch (e.key) {
54
- case 'ArrowLeft':
65
+ case "ArrowLeft":
55
66
  e.preventDefault();
56
- state.focusPreviousDay();
67
+ e.stopPropagation();
68
+ if (isRTL()) {
69
+ state.focusNextDay();
70
+ } else {
71
+ state.focusPreviousDay();
72
+ }
57
73
  break;
58
- case 'ArrowRight':
74
+ case "ArrowRight":
59
75
  e.preventDefault();
60
- state.focusNextDay();
76
+ e.stopPropagation();
77
+ if (isRTL()) {
78
+ state.focusPreviousDay();
79
+ } else {
80
+ state.focusNextDay();
81
+ }
61
82
  break;
62
- case 'ArrowUp':
83
+ case "ArrowUp":
63
84
  e.preventDefault();
85
+ e.stopPropagation();
64
86
  state.focusPreviousWeek();
65
87
  break;
66
- case 'ArrowDown':
88
+ case "ArrowDown":
67
89
  e.preventDefault();
90
+ e.stopPropagation();
68
91
  state.focusNextWeek();
69
92
  break;
70
- case 'PageUp':
93
+ case "PageUp":
71
94
  e.preventDefault();
95
+ e.stopPropagation();
72
96
  if (e.shiftKey) {
73
97
  state.focusPreviousSection(); // Previous year
74
98
  } else {
75
- state.focusPreviousPage(); // Previous month
99
+ state.setFocusedDate(state.focusedDate().subtract({ months: 1 }));
76
100
  }
77
101
  break;
78
- case 'PageDown':
102
+ case "PageDown":
79
103
  e.preventDefault();
104
+ e.stopPropagation();
80
105
  if (e.shiftKey) {
81
106
  state.focusNextSection(); // Next year
82
107
  } else {
83
- state.focusNextPage(); // Next month
108
+ state.setFocusedDate(state.focusedDate().add({ months: 1 }));
84
109
  }
85
110
  break;
86
- case 'Home':
111
+ case "Home":
87
112
  e.preventDefault();
113
+ e.stopPropagation();
88
114
  state.focusPageStart();
89
115
  break;
90
- case 'End':
116
+ case "End":
91
117
  e.preventDefault();
118
+ e.stopPropagation();
92
119
  state.focusPageEnd();
93
120
  break;
94
- case 'Enter':
95
- case ' ':
121
+ case "Enter":
122
+ case " ":
96
123
  e.preventDefault();
97
124
  state.selectFocusedDate();
98
125
  break;
126
+ case "Escape":
127
+ if (
128
+ "anchorDate" in state &&
129
+ typeof state.anchorDate === "function" &&
130
+ state.anchorDate() &&
131
+ "setAnchorDate" in state &&
132
+ typeof state.setAnchorDate === "function"
133
+ ) {
134
+ e.preventDefault();
135
+ e.stopPropagation();
136
+ state.setAnchorDate(null);
137
+ if ("setDragging" in state && typeof state.setDragging === "function") {
138
+ state.setDragging(false);
139
+ }
140
+ }
141
+ break;
99
142
  }
100
143
  };
101
144
 
102
- // Register keyboard listener
103
- onMount(() => {
104
- const element = ref?.();
105
- if (element) {
106
- element.addEventListener('keydown', handleKeyDown);
107
- onCleanup(() => {
108
- element.removeEventListener('keydown', handleKeyDown);
109
- });
110
- }
111
- });
112
-
113
145
  // Grid props
114
146
  const gridProps = createMemo(() => ({
115
- role: 'grid',
116
- 'aria-readonly': state.isReadOnly() || undefined,
117
- 'aria-disabled': state.isDisabled() || undefined,
147
+ role: "grid",
148
+ "aria-readonly": state.isReadOnly() || undefined,
149
+ "aria-disabled": state.isDisabled() || undefined,
118
150
  tabIndex: state.isFocused() ? 0 : -1,
119
151
  onFocus: () => state.setFocused(true),
120
152
  onBlur: () => state.setFocused(false),
121
153
  onKeyDown: handleKeyDown,
122
154
  }));
123
155
 
124
- // Header props
125
- const headerProps = createMemo(() => ({
126
- role: 'row',
127
- }));
156
+ // Header props are intentionally empty. Consumers render this on <thead>,
157
+ // which already has correct table semantics.
158
+ const headerProps = createMemo(() => ({}));
128
159
 
129
160
  return {
130
161
  get gridProps() {
@@ -5,15 +5,17 @@
5
5
  * Based on @react-aria/calendar useRangeCalendar
6
6
  */
7
7
 
8
- import { createMemo } from 'solid-js';
9
- import { createId } from '../ssr';
10
- import { access, type MaybeAccessor } from '../utils/reactivity';
11
- import { mergeProps } from '../utils/mergeProps';
12
- import type { RangeCalendarState } from '@proyecto-viviana/solid-stately';
13
-
14
- // ============================================
15
- // TYPES
16
- // ============================================
8
+ import { createMemo } from "solid-js";
9
+ import { createId } from "../ssr";
10
+ import { access, type MaybeAccessor } from "../utils/reactivity";
11
+ import { mergeProps } from "../utils/mergeProps";
12
+ import type { RangeCalendarState } from "@proyecto-viviana/solid-stately";
13
+ import {
14
+ formatSelectedDateDescription,
15
+ formatVisibleRangeDescription,
16
+ getCalendarHookData,
17
+ setCalendarHookData,
18
+ } from "./utils";
17
19
 
18
20
  export interface AriaRangeCalendarProps {
19
21
  /** An ID for the calendar. */
@@ -23,11 +25,19 @@ export interface AriaRangeCalendarProps {
23
25
  /** Whether the calendar is read-only. */
24
26
  isReadOnly?: boolean;
25
27
  /** An accessible label for the calendar. */
26
- 'aria-label'?: string;
28
+ "aria-label"?: string;
27
29
  /** The ID of an element that labels the calendar. */
28
- 'aria-labelledby'?: string;
30
+ "aria-labelledby"?: string;
29
31
  /** The ID of an element that describes the calendar. */
30
- 'aria-describedby'?: string;
32
+ "aria-describedby"?: string;
33
+ /** The ID of an element that provides additional details about the calendar. */
34
+ "aria-details"?: string;
35
+ /** Whether the current selection is invalid. */
36
+ isInvalid?: boolean;
37
+ /** Error message rendered for invalid selections. */
38
+ errorMessage?: string;
39
+ /** ID of the rendered error message element. */
40
+ errorMessageId?: string;
31
41
  }
32
42
 
33
43
  export interface RangeCalendarAria {
@@ -39,35 +49,55 @@ export interface RangeCalendarAria {
39
49
  nextButtonProps: Record<string, unknown>;
40
50
  /** Props for the title/heading element. */
41
51
  titleProps: Record<string, unknown>;
52
+ /** Props for the error message element, if any. */
53
+ errorMessageProps: Record<string, unknown>;
42
54
  /** An accessible label for the title. */
43
55
  title: string;
44
56
  }
45
57
 
46
- // ============================================
47
- // IMPLEMENTATION
48
- // ============================================
49
-
50
58
  /**
51
59
  * Provides the behavior and accessibility implementation for a range calendar component.
52
60
  */
53
61
  export function createRangeCalendar<T extends RangeCalendarState>(
54
62
  props: MaybeAccessor<AriaRangeCalendarProps>,
55
- state: T
63
+ state: T,
56
64
  ): RangeCalendarAria {
57
65
  const getProps = () => access(props);
58
66
  const id = createId(getProps().id);
59
67
  const titleId = createId();
68
+ const errorMessageId = createId(getProps().errorMessageId);
60
69
 
61
70
  // Title (e.g., "December 2024")
62
71
  const title = createMemo(() => state.title());
72
+ const visibleRangeDescription = createMemo(() => {
73
+ const range = state.visibleRange();
74
+ return formatVisibleRangeDescription(range.start, range.end, state.timeZone, state.locale());
75
+ });
76
+ const calendarLabel = createMemo(() => {
77
+ const p = getProps();
78
+ return [p["aria-label"], visibleRangeDescription()].filter(Boolean).join(", ");
79
+ });
80
+ const selectedDateDescription = createMemo(() => formatSelectedDateDescription(state));
81
+
82
+ const initialProps = getProps();
83
+ const existingHookData = getCalendarHookData(state);
84
+ setCalendarHookData(state, {
85
+ errorMessageId:
86
+ initialProps.errorMessage || initialProps.errorMessageId
87
+ ? errorMessageId
88
+ : existingHookData?.errorMessageId,
89
+ get selectedDateDescription() {
90
+ return selectedDateDescription();
91
+ },
92
+ });
63
93
 
64
94
  // Previous button props
65
95
  const prevButtonProps = createMemo(() => {
66
96
  const p = getProps();
67
- const isDisabled = p.isDisabled || state.isDisabled();
97
+ const isDisabled = p.isDisabled || state.isDisabled() || state.isPreviousVisibleRangeInvalid();
68
98
 
69
99
  return {
70
- 'aria-label': 'Previous month',
100
+ "aria-label": "Previous month",
71
101
  onClick: () => {
72
102
  if (!isDisabled) {
73
103
  state.focusPreviousPage();
@@ -81,10 +111,10 @@ export function createRangeCalendar<T extends RangeCalendarState>(
81
111
  // Next button props
82
112
  const nextButtonProps = createMemo(() => {
83
113
  const p = getProps();
84
- const isDisabled = p.isDisabled || state.isDisabled();
114
+ const isDisabled = p.isDisabled || state.isDisabled() || state.isNextVisibleRangeInvalid();
85
115
 
86
116
  return {
87
- 'aria-label': 'Next month',
117
+ "aria-label": "Next month",
88
118
  onClick: () => {
89
119
  if (!isDisabled) {
90
120
  state.focusNextPage();
@@ -98,22 +128,24 @@ export function createRangeCalendar<T extends RangeCalendarState>(
98
128
  // Title props
99
129
  const titleProps = createMemo(() => ({
100
130
  id: titleId,
101
- 'aria-live': 'polite' as const,
131
+ "aria-live": "polite" as const,
132
+ }));
133
+ const errorMessageProps = createMemo(() => ({
134
+ id: errorMessageId,
102
135
  }));
103
136
 
104
137
  // Calendar container props
105
138
  const calendarProps = createMemo(() => {
106
139
  const p = getProps();
107
140
 
108
- return mergeProps(
109
- {
110
- id,
111
- role: 'group',
112
- 'aria-labelledby': p['aria-labelledby'] ?? titleId,
113
- 'aria-label': p['aria-label'],
114
- 'aria-describedby': p['aria-describedby'],
115
- }
116
- );
141
+ return mergeProps({
142
+ id,
143
+ role: "application",
144
+ "aria-labelledby": p["aria-labelledby"],
145
+ "aria-label": calendarLabel(),
146
+ "aria-describedby": p["aria-describedby"],
147
+ "aria-details": p["aria-details"],
148
+ });
117
149
  });
118
150
 
119
151
  return {
@@ -129,6 +161,9 @@ export function createRangeCalendar<T extends RangeCalendarState>(
129
161
  get titleProps() {
130
162
  return titleProps();
131
163
  },
164
+ get errorMessageProps() {
165
+ return errorMessageProps();
166
+ },
132
167
  get title() {
133
168
  return title();
134
169
  },