@proyecto-viviana/solid-stately 0.5.1 → 0.6.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (418) hide show
  1. package/LICENSE-APACHE-2.0 +201 -0
  2. package/NOTICE +91 -0
  3. package/README.md +59 -29
  4. package/dist/autocomplete/createAutocompleteState.d.ts +2 -1
  5. package/dist/autocomplete/createAutocompleteState.d.ts.map +1 -0
  6. package/dist/autocomplete/index.d.ts +1 -0
  7. package/dist/autocomplete/index.d.ts.map +1 -0
  8. package/dist/calendar/IncompleteDate.d.ts +2 -1
  9. package/dist/calendar/IncompleteDate.d.ts.map +1 -0
  10. package/dist/calendar/createCalendarState.d.ts +10 -9
  11. package/dist/calendar/createCalendarState.d.ts.map +1 -0
  12. package/dist/calendar/createDateFieldState.d.ts +4 -20
  13. package/dist/calendar/createDateFieldState.d.ts.map +1 -0
  14. package/dist/calendar/createDatePickerState.d.ts +4 -7
  15. package/dist/calendar/createDatePickerState.d.ts.map +1 -0
  16. package/dist/calendar/createRangeCalendarState.d.ts +9 -7
  17. package/dist/calendar/createRangeCalendarState.d.ts.map +1 -0
  18. package/dist/calendar/createTimeFieldState.d.ts +5 -24
  19. package/dist/calendar/createTimeFieldState.d.ts.map +1 -0
  20. package/dist/calendar/index.d.ts +1 -0
  21. package/dist/calendar/index.d.ts.map +1 -0
  22. package/dist/calendar/intl/index.d.ts +1 -0
  23. package/dist/calendar/intl/index.d.ts.map +1 -0
  24. package/dist/checkbox/createCheckboxGroupState.d.ts +3 -0
  25. package/dist/checkbox/createCheckboxGroupState.d.ts.map +1 -0
  26. package/dist/checkbox/index.d.ts +1 -0
  27. package/dist/checkbox/index.d.ts.map +1 -0
  28. package/dist/collections/ListCollection.d.ts +5 -0
  29. package/dist/collections/ListCollection.d.ts.map +1 -0
  30. package/dist/collections/createListState.d.ts +2 -6
  31. package/dist/collections/createListState.d.ts.map +1 -0
  32. package/dist/collections/createMenuState.d.ts +74 -13
  33. package/dist/collections/createMenuState.d.ts.map +1 -0
  34. package/dist/collections/createSelectionState.d.ts +2 -5
  35. package/dist/collections/createSelectionState.d.ts.map +1 -0
  36. package/dist/collections/getChildNodes.d.ts +6 -3
  37. package/dist/collections/getChildNodes.d.ts.map +1 -0
  38. package/dist/collections/index.d.ts +2 -1
  39. package/dist/collections/index.d.ts.map +1 -0
  40. package/dist/collections/types.d.ts +36 -2
  41. package/dist/collections/types.d.ts.map +1 -0
  42. package/dist/color/Color.d.ts +7 -1
  43. package/dist/color/Color.d.ts.map +1 -0
  44. package/dist/color/createColorAreaState.d.ts +6 -5
  45. package/dist/color/createColorAreaState.d.ts.map +1 -0
  46. package/dist/color/createColorFieldState.d.ts +4 -5
  47. package/dist/color/createColorFieldState.d.ts.map +1 -0
  48. package/dist/color/createColorSliderState.d.ts +4 -5
  49. package/dist/color/createColorSliderState.d.ts.map +1 -0
  50. package/dist/color/createColorWheelState.d.ts +2 -5
  51. package/dist/color/createColorWheelState.d.ts.map +1 -0
  52. package/dist/color/getColorChannels.d.ts +3 -0
  53. package/dist/color/getColorChannels.d.ts.map +1 -0
  54. package/dist/color/index.d.ts +2 -1
  55. package/dist/color/index.d.ts.map +1 -0
  56. package/dist/color/intl/index.d.ts +1 -0
  57. package/dist/color/intl/index.d.ts.map +1 -0
  58. package/dist/color/types.d.ts +2 -1
  59. package/dist/color/types.d.ts.map +1 -0
  60. package/dist/combobox/createComboBoxState.d.ts +92 -29
  61. package/dist/combobox/createComboBoxState.d.ts.map +1 -0
  62. package/dist/combobox/index.d.ts +2 -1
  63. package/dist/combobox/index.d.ts.map +1 -0
  64. package/dist/data/createAsyncList.d.ts +1 -7
  65. package/dist/data/createAsyncList.d.ts.map +1 -0
  66. package/dist/data/createListData.d.ts +1 -6
  67. package/dist/data/createListData.d.ts.map +1 -0
  68. package/dist/data/createTreeData.d.ts +1 -6
  69. package/dist/data/createTreeData.d.ts.map +1 -0
  70. package/dist/data/index.d.ts +1 -0
  71. package/dist/data/index.d.ts.map +1 -0
  72. package/dist/datepicker/index.d.ts +1 -0
  73. package/dist/datepicker/index.d.ts.map +1 -0
  74. package/dist/disclosure/createDisclosureState.d.ts +2 -5
  75. package/dist/disclosure/createDisclosureState.d.ts.map +1 -0
  76. package/dist/disclosure/index.d.ts +1 -0
  77. package/dist/disclosure/index.d.ts.map +1 -0
  78. package/dist/dnd/createDragState.d.ts +2 -6
  79. package/dist/dnd/createDragState.d.ts.map +1 -0
  80. package/dist/dnd/createDraggableCollectionState.d.ts +44 -11
  81. package/dist/dnd/createDraggableCollectionState.d.ts.map +1 -0
  82. package/dist/dnd/createDropState.d.ts +2 -6
  83. package/dist/dnd/createDropState.d.ts.map +1 -0
  84. package/dist/dnd/createDroppableCollectionState.d.ts +34 -11
  85. package/dist/dnd/createDroppableCollectionState.d.ts.map +1 -0
  86. package/dist/dnd/index.d.ts +3 -2
  87. package/dist/dnd/index.d.ts.map +1 -0
  88. package/dist/dnd/types.d.ts +17 -0
  89. package/dist/dnd/types.d.ts.map +1 -0
  90. package/dist/form/createFormValidationState.d.ts +2 -9
  91. package/{src → dist}/form/createFormValidationState.d.ts.map +1 -1
  92. package/dist/form/index.d.ts +1 -0
  93. package/dist/form/index.d.ts.map +1 -0
  94. package/dist/grid/createGridState.d.ts +4 -3
  95. package/dist/grid/createGridState.d.ts.map +1 -0
  96. package/dist/grid/index.d.ts +1 -0
  97. package/dist/grid/index.d.ts.map +1 -0
  98. package/dist/grid/types.d.ts +23 -1
  99. package/dist/grid/types.d.ts.map +1 -0
  100. package/dist/index.d.ts +7 -5
  101. package/dist/index.d.ts.map +1 -0
  102. package/dist/index.js +2947 -969
  103. package/dist/index.js.map +1 -1
  104. package/dist/menu/index.d.ts +3 -1
  105. package/dist/menu/index.d.ts.map +1 -0
  106. package/dist/numberfield/createNumberFieldState.d.ts +37 -9
  107. package/dist/numberfield/createNumberFieldState.d.ts.map +1 -0
  108. package/dist/numberfield/index.d.ts +1 -0
  109. package/dist/numberfield/index.d.ts.map +1 -0
  110. package/dist/overlays/createOverlayTriggerState.d.ts +12 -1
  111. package/dist/overlays/createOverlayTriggerState.d.ts.map +1 -0
  112. package/dist/overlays/index.d.ts +1 -0
  113. package/dist/overlays/index.d.ts.map +1 -0
  114. package/dist/private/flags/flags.d.ts +5 -0
  115. package/dist/private/flags/flags.d.ts.map +1 -0
  116. package/dist/private/flags/flags.js +26 -0
  117. package/dist/private/flags/flags.js.map +1 -0
  118. package/dist/radio/createRadioGroupState.d.ts +1 -0
  119. package/dist/radio/createRadioGroupState.d.ts.map +1 -0
  120. package/dist/radio/index.d.ts +1 -0
  121. package/dist/radio/index.d.ts.map +1 -0
  122. package/dist/searchfield/createSearchFieldState.d.ts +2 -5
  123. package/dist/searchfield/createSearchFieldState.d.ts.map +1 -0
  124. package/dist/searchfield/index.d.ts +1 -0
  125. package/dist/searchfield/index.d.ts.map +1 -0
  126. package/dist/select/createSelectState.d.ts +100 -33
  127. package/dist/select/createSelectState.d.ts.map +1 -0
  128. package/dist/select/index.d.ts +2 -1
  129. package/dist/select/index.d.ts.map +1 -0
  130. package/dist/selection/Selection.d.ts +2 -1
  131. package/dist/selection/Selection.d.ts.map +1 -0
  132. package/dist/selection/SelectionManager.d.ts +1 -19
  133. package/dist/selection/SelectionManager.d.ts.map +1 -0
  134. package/dist/selection/createMultipleSelectionState.d.ts +2 -13
  135. package/dist/selection/createMultipleSelectionState.d.ts.map +1 -0
  136. package/dist/selection/index.d.ts +1 -0
  137. package/dist/selection/index.d.ts.map +1 -0
  138. package/dist/slider/createSliderState.d.ts +37 -14
  139. package/dist/slider/createSliderState.d.ts.map +1 -0
  140. package/dist/slider/index.d.ts +1 -0
  141. package/dist/slider/index.d.ts.map +1 -0
  142. package/dist/ssr/index.d.ts +2 -13
  143. package/dist/ssr/index.d.ts.map +1 -0
  144. package/dist/steplist/createStepListState.d.ts +10 -18
  145. package/dist/steplist/createStepListState.d.ts.map +1 -0
  146. package/dist/steplist/index.d.ts +1 -0
  147. package/dist/steplist/index.d.ts.map +1 -0
  148. package/dist/table/TableCollection.d.ts +1 -0
  149. package/dist/table/TableCollection.d.ts.map +1 -0
  150. package/dist/table/createTableColumnResizeState.d.ts +2 -9
  151. package/dist/table/createTableColumnResizeState.d.ts.map +1 -0
  152. package/dist/table/createTableState.d.ts +3 -6
  153. package/dist/table/createTableState.d.ts.map +1 -0
  154. package/dist/table/createTreeGridState.d.ts +3 -9
  155. package/dist/table/createTreeGridState.d.ts.map +1 -0
  156. package/dist/table/index.d.ts +1 -0
  157. package/dist/table/index.d.ts.map +1 -0
  158. package/dist/table/types.d.ts +37 -3
  159. package/dist/table/types.d.ts.map +1 -0
  160. package/dist/tabs/createTabListState.d.ts +2 -5
  161. package/dist/tabs/createTabListState.d.ts.map +1 -0
  162. package/dist/tabs/index.d.ts +1 -0
  163. package/dist/tabs/index.d.ts.map +1 -0
  164. package/dist/textfield/createTextFieldState.d.ts +1 -0
  165. package/dist/textfield/createTextFieldState.d.ts.map +1 -0
  166. package/dist/textfield/index.d.ts +1 -0
  167. package/dist/textfield/index.d.ts.map +1 -0
  168. package/dist/toast/createToastState.d.ts +2 -5
  169. package/dist/toast/createToastState.d.ts.map +1 -0
  170. package/dist/toast/index.d.ts +1 -0
  171. package/dist/toast/index.d.ts.map +1 -0
  172. package/dist/toggle/createToggleGroupState.d.ts +1 -0
  173. package/dist/toggle/createToggleGroupState.d.ts.map +1 -0
  174. package/dist/toggle/createToggleState.d.ts +1 -0
  175. package/dist/toggle/createToggleState.d.ts.map +1 -0
  176. package/dist/toggle/index.d.ts +1 -0
  177. package/dist/toggle/index.d.ts.map +1 -0
  178. package/dist/tokenfield/TokenFieldValue.d.ts +96 -0
  179. package/dist/tokenfield/TokenFieldValue.d.ts.map +1 -0
  180. package/dist/tokenfield/createTokenFieldState.d.ts +33 -0
  181. package/dist/tokenfield/createTokenFieldState.d.ts.map +1 -0
  182. package/dist/tokenfield/index.d.ts +3 -0
  183. package/dist/tokenfield/index.d.ts.map +1 -0
  184. package/dist/tooltip/createTooltipTriggerState.d.ts +9 -8
  185. package/dist/tooltip/createTooltipTriggerState.d.ts.map +1 -0
  186. package/dist/tooltip/index.d.ts +1 -0
  187. package/dist/tooltip/index.d.ts.map +1 -0
  188. package/dist/tree/TreeCollection.d.ts +1 -0
  189. package/dist/tree/TreeCollection.d.ts.map +1 -0
  190. package/dist/tree/createTreeState.d.ts +3 -8
  191. package/dist/tree/createTreeState.d.ts.map +1 -0
  192. package/dist/tree/index.d.ts +1 -0
  193. package/dist/tree/index.d.ts.map +1 -0
  194. package/dist/tree/types.d.ts +19 -1
  195. package/dist/tree/types.d.ts.map +1 -0
  196. package/dist/utils/index.d.ts +3 -1
  197. package/dist/utils/index.d.ts.map +1 -0
  198. package/dist/utils/owner.d.ts +9 -0
  199. package/dist/utils/owner.d.ts.map +1 -0
  200. package/dist/utils/reactivity.d.ts +24 -0
  201. package/dist/utils/reactivity.d.ts.map +1 -0
  202. package/package.json +21 -9
  203. package/src/autocomplete/createAutocompleteState.ts +18 -4
  204. package/src/calendar/IncompleteDate.ts +15 -1
  205. package/src/calendar/createCalendarState.ts +321 -125
  206. package/src/calendar/createDateFieldState.ts +45 -31
  207. package/src/calendar/createDatePickerState.ts +47 -26
  208. package/src/calendar/createRangeCalendarState.ts +173 -86
  209. package/src/calendar/createTimeFieldState.ts +26 -7
  210. package/src/calendar/intl/index.ts +37 -2
  211. package/src/checkbox/createCheckboxGroupState.ts +45 -13
  212. package/src/collections/ListCollection.ts +31 -0
  213. package/src/collections/createListState.ts +27 -10
  214. package/src/collections/createMenuState.ts +190 -15
  215. package/src/collections/createSelectionState.ts +33 -13
  216. package/src/collections/getChildNodes.ts +20 -3
  217. package/src/collections/index.ts +6 -0
  218. package/src/collections/types.ts +35 -2
  219. package/src/color/Color.ts +61 -22
  220. package/src/color/createColorAreaState.ts +48 -4
  221. package/src/color/createColorFieldState.ts +114 -38
  222. package/src/color/createColorSliderState.ts +61 -9
  223. package/src/color/createColorWheelState.ts +29 -9
  224. package/src/color/getColorChannels.ts +16 -0
  225. package/src/color/index.ts +1 -0
  226. package/src/color/intl/index.ts +38 -3
  227. package/src/color/types.ts +1 -1
  228. package/src/combobox/createComboBoxState.ts +530 -297
  229. package/src/combobox/index.ts +4 -0
  230. package/src/data/createAsyncList.ts +41 -6
  231. package/src/data/createListData.ts +27 -4
  232. package/src/data/createTreeData.ts +30 -6
  233. package/src/disclosure/createDisclosureState.ts +40 -19
  234. package/src/dnd/createDragState.ts +22 -4
  235. package/src/dnd/createDraggableCollectionState.ts +145 -11
  236. package/src/dnd/createDropState.ts +21 -3
  237. package/src/dnd/createDroppableCollectionState.ts +127 -11
  238. package/src/dnd/index.ts +4 -0
  239. package/src/dnd/types.ts +16 -0
  240. package/src/form/createFormValidationState.ts +69 -37
  241. package/src/grid/createGridState.ts +196 -111
  242. package/src/grid/types.ts +22 -1
  243. package/src/index.ts +33 -2
  244. package/src/menu/index.ts +7 -0
  245. package/src/numberfield/createNumberFieldState.ts +247 -98
  246. package/src/overlays/createOverlayTriggerState.ts +31 -4
  247. package/src/private/flags/flags.ts +25 -0
  248. package/src/radio/createRadioGroupState.ts +23 -6
  249. package/src/searchfield/createSearchFieldState.ts +18 -3
  250. package/src/select/createSelectState.ts +317 -130
  251. package/src/select/index.ts +8 -1
  252. package/src/selection/Selection.ts +15 -1
  253. package/src/selection/SelectionManager.ts +17 -1
  254. package/src/selection/createMultipleSelectionState.ts +45 -26
  255. package/src/slider/createSliderState.ts +243 -104
  256. package/src/ssr/index.ts +34 -4
  257. package/src/steplist/createStepListState.ts +184 -130
  258. package/src/table/TableCollection.ts +14 -0
  259. package/src/table/createTableColumnResizeState.ts +71 -14
  260. package/src/table/createTableState.ts +26 -4
  261. package/src/table/createTreeGridState.ts +22 -6
  262. package/src/table/types.ts +38 -5
  263. package/src/tabs/createTabListState.ts +63 -43
  264. package/src/textfield/createTextFieldState.ts +17 -3
  265. package/src/toast/createToastState.ts +28 -3
  266. package/src/toggle/createToggleGroupState.ts +20 -5
  267. package/src/toggle/createToggleState.ts +19 -4
  268. package/src/tokenfield/TokenFieldValue.ts +499 -0
  269. package/src/tokenfield/createTokenFieldState.ts +88 -0
  270. package/src/tokenfield/index.ts +15 -0
  271. package/src/tooltip/createTooltipTriggerState.ts +49 -13
  272. package/src/tree/TreeCollection.ts +14 -0
  273. package/src/tree/createTreeState.ts +70 -36
  274. package/src/tree/types.ts +18 -1
  275. package/src/utils/index.ts +10 -1
  276. package/src/utils/owner.ts +20 -0
  277. package/src/utils/reactivity.ts +53 -1
  278. package/src/autocomplete/createAutocompleteState.d.ts +0 -48
  279. package/src/autocomplete/createAutocompleteState.d.ts.map +0 -1
  280. package/src/autocomplete/index.d.ts +0 -6
  281. package/src/autocomplete/index.d.ts.map +0 -1
  282. package/src/calendar/createCalendarState.d.ts +0 -152
  283. package/src/calendar/createCalendarState.d.ts.map +0 -1
  284. package/src/calendar/createDateFieldState.d.ts +0 -145
  285. package/src/calendar/createDateFieldState.d.ts.map +0 -1
  286. package/src/calendar/createRangeCalendarState.d.ts +0 -171
  287. package/src/calendar/createRangeCalendarState.d.ts.map +0 -1
  288. package/src/calendar/createTimeFieldState.d.ts +0 -97
  289. package/src/calendar/createTimeFieldState.d.ts.map +0 -1
  290. package/src/calendar/index.d.ts +0 -80
  291. package/src/calendar/index.d.ts.map +0 -1
  292. package/src/checkbox/createCheckboxGroupState.d.ts +0 -73
  293. package/src/checkbox/createCheckboxGroupState.d.ts.map +0 -1
  294. package/src/checkbox/index.d.ts +0 -6
  295. package/src/checkbox/index.d.ts.map +0 -1
  296. package/src/collections/ListCollection.d.ts +0 -40
  297. package/src/collections/ListCollection.d.ts.map +0 -1
  298. package/src/collections/createListState.d.ts +0 -94
  299. package/src/collections/createListState.d.ts.map +0 -1
  300. package/src/collections/createMenuState.d.ts +0 -55
  301. package/src/collections/createMenuState.d.ts.map +0 -1
  302. package/src/collections/createSelectionState.d.ts +0 -89
  303. package/src/collections/createSelectionState.d.ts.map +0 -1
  304. package/src/collections/index.d.ts +0 -38
  305. package/src/collections/index.d.ts.map +0 -1
  306. package/src/collections/types.d.ts +0 -147
  307. package/src/collections/types.d.ts.map +0 -1
  308. package/src/color/Color.d.ts +0 -43
  309. package/src/color/Color.d.ts.map +0 -1
  310. package/src/color/createColorAreaState.d.ts +0 -78
  311. package/src/color/createColorAreaState.d.ts.map +0 -1
  312. package/src/color/createColorFieldState.d.ts +0 -57
  313. package/src/color/createColorFieldState.d.ts.map +0 -1
  314. package/src/color/createColorSliderState.d.ts +0 -69
  315. package/src/color/createColorSliderState.d.ts.map +0 -1
  316. package/src/color/createColorWheelState.d.ts +0 -53
  317. package/src/color/createColorWheelState.d.ts.map +0 -1
  318. package/src/color/index.d.ts +0 -39
  319. package/src/color/index.d.ts.map +0 -1
  320. package/src/color/types.d.ts +0 -111
  321. package/src/color/types.d.ts.map +0 -1
  322. package/src/combobox/createComboBoxState.d.ts +0 -127
  323. package/src/combobox/createComboBoxState.d.ts.map +0 -1
  324. package/src/combobox/index.d.ts +0 -13
  325. package/src/combobox/index.d.ts.map +0 -1
  326. package/src/disclosure/createDisclosureState.d.ts +0 -68
  327. package/src/disclosure/createDisclosureState.d.ts.map +0 -1
  328. package/src/disclosure/index.d.ts +0 -10
  329. package/src/disclosure/index.d.ts.map +0 -1
  330. package/src/dnd/createDragState.d.ts +0 -68
  331. package/src/dnd/createDragState.d.ts.map +0 -1
  332. package/src/dnd/createDraggableCollectionState.d.ts +0 -68
  333. package/src/dnd/createDraggableCollectionState.d.ts.map +0 -1
  334. package/src/dnd/createDropState.d.ts +0 -80
  335. package/src/dnd/createDropState.d.ts.map +0 -1
  336. package/src/dnd/createDroppableCollectionState.d.ts +0 -107
  337. package/src/dnd/createDroppableCollectionState.d.ts.map +0 -1
  338. package/src/dnd/index.d.ts +0 -60
  339. package/src/dnd/index.d.ts.map +0 -1
  340. package/src/dnd/types.d.ts +0 -277
  341. package/src/dnd/types.d.ts.map +0 -1
  342. package/src/form/createFormValidationState.d.ts +0 -102
  343. package/src/form/index.d.ts +0 -16
  344. package/src/form/index.d.ts.map +0 -1
  345. package/src/grid/createGridState.d.ts +0 -15
  346. package/src/grid/createGridState.d.ts.map +0 -1
  347. package/src/grid/index.d.ts +0 -7
  348. package/src/grid/index.d.ts.map +0 -1
  349. package/src/grid/types.d.ts +0 -163
  350. package/src/grid/types.d.ts.map +0 -1
  351. package/src/index.d.ts +0 -311
  352. package/src/index.d.ts.map +0 -1
  353. package/src/numberfield/createNumberFieldState.d.ts +0 -67
  354. package/src/numberfield/createNumberFieldState.d.ts.map +0 -1
  355. package/src/numberfield/index.d.ts +0 -6
  356. package/src/numberfield/index.d.ts.map +0 -1
  357. package/src/overlays/createOverlayTriggerState.d.ts +0 -34
  358. package/src/overlays/createOverlayTriggerState.d.ts.map +0 -1
  359. package/src/overlays/index.d.ts +0 -6
  360. package/src/overlays/index.d.ts.map +0 -1
  361. package/src/radio/createRadioGroupState.d.ts +0 -79
  362. package/src/radio/createRadioGroupState.d.ts.map +0 -1
  363. package/src/radio/index.d.ts +0 -7
  364. package/src/radio/index.d.ts.map +0 -1
  365. package/src/searchfield/createSearchFieldState.d.ts +0 -27
  366. package/src/searchfield/createSearchFieldState.d.ts.map +0 -1
  367. package/src/searchfield/index.d.ts +0 -3
  368. package/src/searchfield/index.d.ts.map +0 -1
  369. package/src/select/createSelectState.d.ts +0 -75
  370. package/src/select/createSelectState.d.ts.map +0 -1
  371. package/src/select/index.d.ts +0 -2
  372. package/src/select/index.d.ts.map +0 -1
  373. package/src/slider/createSliderState.d.ts +0 -72
  374. package/src/slider/createSliderState.d.ts.map +0 -1
  375. package/src/slider/index.d.ts +0 -3
  376. package/src/slider/index.d.ts.map +0 -1
  377. package/src/ssr/index.d.ts +0 -28
  378. package/src/ssr/index.d.ts.map +0 -1
  379. package/src/table/TableCollection.d.ts +0 -54
  380. package/src/table/TableCollection.d.ts.map +0 -1
  381. package/src/table/createTableState.d.ts +0 -15
  382. package/src/table/createTableState.d.ts.map +0 -1
  383. package/src/table/index.d.ts +0 -18
  384. package/src/table/index.d.ts.map +0 -1
  385. package/src/table/types.d.ts +0 -145
  386. package/src/table/types.d.ts.map +0 -1
  387. package/src/tabs/createTabListState.d.ts +0 -70
  388. package/src/tabs/createTabListState.d.ts.map +0 -1
  389. package/src/tabs/index.d.ts +0 -8
  390. package/src/tabs/index.d.ts.map +0 -1
  391. package/src/textfield/createTextFieldState.d.ts +0 -32
  392. package/src/textfield/createTextFieldState.d.ts.map +0 -1
  393. package/src/textfield/index.d.ts +0 -6
  394. package/src/textfield/index.d.ts.map +0 -1
  395. package/src/toast/createToastState.d.ts +0 -129
  396. package/src/toast/createToastState.d.ts.map +0 -1
  397. package/src/toast/index.d.ts +0 -12
  398. package/src/toast/index.d.ts.map +0 -1
  399. package/src/toggle/createToggleState.d.ts +0 -34
  400. package/src/toggle/createToggleState.d.ts.map +0 -1
  401. package/src/toggle/index.d.ts +0 -2
  402. package/src/toggle/index.d.ts.map +0 -1
  403. package/src/tooltip/createTooltipTriggerState.d.ts +0 -39
  404. package/src/tooltip/createTooltipTriggerState.d.ts.map +0 -1
  405. package/src/tooltip/index.d.ts +0 -7
  406. package/src/tooltip/index.d.ts.map +0 -1
  407. package/src/tree/TreeCollection.d.ts +0 -43
  408. package/src/tree/TreeCollection.d.ts.map +0 -1
  409. package/src/tree/createTreeState.d.ts +0 -17
  410. package/src/tree/createTreeState.d.ts.map +0 -1
  411. package/src/tree/index.d.ts +0 -13
  412. package/src/tree/index.d.ts.map +0 -1
  413. package/src/tree/types.d.ts +0 -162
  414. package/src/tree/types.d.ts.map +0 -1
  415. package/src/utils/index.d.ts +0 -2
  416. package/src/utils/index.d.ts.map +0 -1
  417. package/src/utils/reactivity.d.ts +0 -28
  418. package/src/utils/reactivity.d.ts.map +0 -1
@@ -1,3 +1,17 @@
1
+ /*
2
+ * Copyright 2020 Adobe. All rights reserved.
3
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
+ * you may not use this file except in compliance with the License. You may obtain a copy
5
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ *
7
+ * Unless required by applicable law or agreed to in writing, software distributed under
8
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9
+ * OF ANY KIND, either express or implied. See the License for the specific language
10
+ * governing permissions and limitations under the License.
11
+ */
12
+
13
+ // Ported to SolidJS for Proyecto Viviana; based on packages/react-stately/src/calendar/useCalendarState.ts
14
+
1
15
  /**
2
16
  * CalendarState for Solid-Stately
3
17
  *
@@ -5,7 +19,8 @@
5
19
  * Based on @react-stately/calendar useCalendarState
6
20
  */
7
21
 
8
- import { createSignal, createMemo, createEffect, type Accessor } from "solid-js";
22
+ import { createMemo, createEffect } from "solid-js";
23
+ import type { Accessor } from "solid-js";
9
24
  import {
10
25
  type Calendar as InternationalizedCalendar,
11
26
  type CalendarDate,
@@ -25,8 +40,9 @@ import {
25
40
  createCalendar as intlCreateCalendar,
26
41
  toCalendar as intlToCalendar,
27
42
  toCalendarDate as intlToCalendarDate,
43
+ minDate,
28
44
  } from "@internationalized/date";
29
- import { access, type MaybeAccessor } from "../utils";
45
+ import { access, createInternalSignal, propsAccessor, readNow, type MaybeAccessor } from "../utils";
30
46
 
31
47
  export type ValidationState = "valid" | "invalid";
32
48
  export type CalendarPageBehavior = "single" | "visible";
@@ -75,7 +91,7 @@ export interface CalendarStateProps<
75
91
  /** Callback that is called for each date in the calendar to determine if it is unavailable. */
76
92
  isDateUnavailable?: (date: DateValue) => boolean;
77
93
  /** The number of months to display at once. */
78
- visibleMonths?: number;
94
+ visibleMonths?: MaybeAccessor<number | undefined>;
79
95
  /** Controls whether paging advances by one month or by the visible month range. */
80
96
  pageBehavior?: CalendarPageBehavior;
81
97
  /** Determines how the visible months align around the initial focused date. */
@@ -86,6 +102,8 @@ export interface CalendarStateProps<
86
102
  isDateDisabled?: (date: DateValue) => boolean;
87
103
  /** Validation state. */
88
104
  validationState?: MaybeAccessor<ValidationState | undefined>;
105
+ /** Whether the current selection is invalid according to application logic. */
106
+ isInvalid?: boolean;
89
107
  /** Error message. */
90
108
  errorMessage?: string;
91
109
  /** The first day of the week (0 = Sunday, 1 = Monday, etc.). */
@@ -138,6 +156,10 @@ export interface CalendarState<
138
156
  isOutsideVisibleRange: (date: DateValue) => boolean;
139
157
  /** Whether a date is invalid. */
140
158
  isInvalid: (date: DateValue) => boolean;
159
+ /** Whether the previous page is entirely outside min/max. */
160
+ isPreviousVisibleRangeInvalid: () => boolean;
161
+ /** Whether the next page is entirely outside min/max. */
162
+ isNextVisibleRangeInvalid: () => boolean;
141
163
  /** Moves focus to the previous page (month). */
142
164
  focusPreviousPage: () => void;
143
165
  /** Moves focus to the next page (month). */
@@ -186,21 +208,28 @@ export interface CalendarState<
186
208
  export function createCalendarState<
187
209
  T extends DateValue = CalendarDate,
188
210
  M extends CalendarSelectionMode = "single",
189
- >(props: CalendarStateProps<T, M> = {}): CalendarState<T, M> {
211
+ >(props: MaybeAccessor<CalendarStateProps<T, M>> = {}): CalendarState<T, M> {
212
+ const getProps = propsAccessor(props);
190
213
  const timeZone = getLocalTimeZone();
191
- const locale = createMemo(() => access(props.locale) ?? "en-US");
192
- const minValueState = createMemo(() => access(props.minValue) ?? null);
193
- const maxValueState = createMemo(() => access(props.maxValue) ?? null);
214
+ const locale = createMemo(() => access(getProps().locale) ?? "en-US");
215
+ const minValueState = createMemo(() => access(getProps().minValue) ?? null);
216
+ const maxValueState = createMemo(() => access(getProps().maxValue) ?? null);
194
217
  const selectionMode = createMemo<CalendarSelectionMode>(
195
- () => access(props.selectionMode) ?? "single",
218
+ () => access(getProps().selectionMode) ?? "single",
196
219
  );
197
220
  const resolvedOptions = createMemo(() => new DateFormatter(locale()).resolvedOptions());
198
221
  const calendar = createMemo(() =>
199
- (props.createCalendar ?? intlCreateCalendar)(resolvedOptions().calendar as CalendarIdentifier),
222
+ (getProps().createCalendar ?? intlCreateCalendar)(
223
+ resolvedOptions().calendar as CalendarIdentifier,
224
+ ),
225
+ );
226
+ const visibleMonths = createMemo(() =>
227
+ Math.max(1, Number(access(getProps().visibleMonths) ?? 1)),
200
228
  );
201
- const visibleMonths = props.visibleMonths ?? 1;
202
- const firstDayOfWeekName = (): CalendarDayOfWeek | undefined =>
203
- props.firstDayOfWeek == null ? undefined : dayOfWeekNames[props.firstDayOfWeek];
229
+ const firstDayOfWeekName = (): CalendarDayOfWeek | undefined => {
230
+ const firstDayOfWeek = getProps().firstDayOfWeek;
231
+ return firstDayOfWeek == null ? undefined : dayOfWeekNames[firstDayOfWeek];
232
+ };
204
233
 
205
234
  const toDisplayCalendarDate = (date: DateValue): CalendarDate =>
206
235
  intlToCalendar(toCalendarDate(date), calendar());
@@ -208,15 +237,15 @@ export function createCalendarState<
208
237
  const selectionAlignmentOffset = (): number => {
209
238
  // Mirrors @react-stately/calendar useCalendarState, where selectionAlignment
210
239
  // defaults to "center" (alignCenter) when not provided.
211
- switch (props.selectionAlignment) {
240
+ switch (getProps().selectionAlignment) {
212
241
  case "start":
213
242
  return 0;
214
243
  case "end":
215
- return Math.max(visibleMonths - 1, 0);
244
+ return Math.max(visibleMonths() - 1, 0);
216
245
  case "center":
217
246
  default: {
218
- let halfDuration = Math.floor(visibleMonths / 2);
219
- if (halfDuration > 0 && visibleMonths % 2 === 0) {
247
+ let halfDuration = Math.floor(visibleMonths() / 2);
248
+ if (halfDuration > 0 && visibleMonths() % 2 === 0) {
220
249
  halfDuration--;
221
250
  }
222
251
  return halfDuration;
@@ -224,15 +253,50 @@ export function createCalendarState<
224
253
  }
225
254
  };
226
255
 
256
+ const rawAlignStart = (date: CalendarDate): CalendarDate => startOfMonth(date);
257
+
258
+ const rawAlignEnd = (date: CalendarDate, months: number): CalendarDate =>
259
+ startOfMonth(date).subtract({ months: Math.max(months - 1, 0) });
260
+
261
+ // Month-duration constrainStart. The focused date only gates the clamp.
262
+ // alignStart(min) and alignEnd(max) take no min/max of their own. Compare
263
+ // instead of maxDate/minDate so a cross-calendar null is not introduced.
264
+ const constrainVisibleRangeStart = (
265
+ date: CalendarDate,
266
+ aligned: CalendarDate,
267
+ months: number,
268
+ ): CalendarDate => {
269
+ const minValue = access(getProps().minValue);
270
+ const maxValue = access(getProps().maxValue);
271
+ let constrained = aligned;
272
+
273
+ if (minValue && date.compare(toDisplayCalendarDate(minValue)) >= 0) {
274
+ const minStart = rawAlignStart(toDisplayCalendarDate(minValue));
275
+ if (minStart.compare(constrained) > 0) {
276
+ constrained = minStart;
277
+ }
278
+ }
279
+
280
+ if (maxValue && date.compare(toDisplayCalendarDate(maxValue)) <= 0) {
281
+ const maxStart = rawAlignEnd(toDisplayCalendarDate(maxValue), months);
282
+ if (maxStart.compare(constrained) < 0) {
283
+ constrained = maxStart;
284
+ }
285
+ }
286
+
287
+ return constrained;
288
+ };
289
+
227
290
  const alignVisibleRangeStart = (date: CalendarDate): CalendarDate => {
228
291
  const offset = selectionAlignmentOffset();
229
- return startOfMonth(offset > 0 ? date.subtract({ months: offset }) : date);
292
+ const aligned = rawAlignStart(offset > 0 ? date.subtract({ months: offset }) : date);
293
+ return constrainVisibleRangeStart(date, aligned, visibleMonths());
230
294
  };
231
295
 
232
296
  const visibleRangeEnd = (start: CalendarDate): CalendarDate => {
233
297
  let end = endOfMonth(start);
234
298
 
235
- for (let i = 1; i < visibleMonths; i++) {
299
+ for (let i = 1; i < visibleMonths(); i++) {
236
300
  end = endOfMonth(end.add({ months: 1 }));
237
301
  }
238
302
 
@@ -240,8 +304,8 @@ export function createCalendarState<
240
304
  };
241
305
 
242
306
  const constrainDate = (date: CalendarDate): CalendarDate => {
243
- const minValue = access(props.minValue);
244
- const maxValue = access(props.maxValue);
307
+ const minValue = access(getProps().minValue);
308
+ const maxValue = access(getProps().maxValue);
245
309
 
246
310
  let constrained = date;
247
311
 
@@ -257,45 +321,51 @@ export function createCalendarState<
257
321
 
258
322
  // Determine the initially focused date
259
323
  const getInitialFocusedDate = (): CalendarDate => {
260
- const controlledFocused = access(props.focusedValue);
324
+ const controlledFocused = access(getProps().focusedValue);
261
325
  if (controlledFocused) {
262
326
  return toDisplayCalendarDate(controlledFocused);
263
327
  }
264
- if (props.defaultFocusedValue) {
265
- return toDisplayCalendarDate(props.defaultFocusedValue);
266
- }
267
- const controlledValue = access(props.value);
268
- const controlledFirst = Array.isArray(controlledValue) ? controlledValue[0] : controlledValue;
269
- if (controlledFirst) {
270
- return toDisplayCalendarDate(controlledFirst);
328
+ const defaultFocusedValue = getProps().defaultFocusedValue;
329
+ if (defaultFocusedValue) {
330
+ return toDisplayCalendarDate(defaultFocusedValue);
271
331
  }
272
- const defaultFirst = Array.isArray(props.defaultValue)
273
- ? props.defaultValue[0]
274
- : props.defaultValue;
275
- if (defaultFirst) {
276
- return toDisplayCalendarDate(defaultFirst);
332
+ // A controlled null is a cleared selection. Pin useControlledState treats
333
+ // `value !== undefined` as controlled, so null must not fall through to defaultValue.
334
+ const controlledValue = access(getProps().value);
335
+ if (controlledValue !== undefined) {
336
+ const controlledFirst = Array.isArray(controlledValue) ? controlledValue[0] : controlledValue;
337
+ if (controlledFirst) {
338
+ return toDisplayCalendarDate(controlledFirst);
339
+ }
340
+ } else {
341
+ const defaultValue = getProps().defaultValue;
342
+ const defaultFirst = Array.isArray(defaultValue) ? defaultValue[0] : defaultValue;
343
+ if (defaultFirst) {
344
+ return toDisplayCalendarDate(defaultFirst);
345
+ }
277
346
  }
278
347
  return intlToCalendar(today(timeZone), calendar());
279
348
  };
280
349
 
281
350
  // State signals
282
351
  const initialFocusedDate = constrainDate(getInitialFocusedDate());
283
- const [internalValue, setInternalValue] = createSignal<T | T[] | null>(
284
- (props.defaultValue as T | T[] | null) ?? null,
352
+ const [internalValue, setInternalValue] = createInternalSignal<T | T[] | null>(
353
+ (getProps().defaultValue as T | T[] | null) ?? null,
285
354
  );
286
- const [focusedDate, setFocusedDateInternal] = createSignal<CalendarDate>(initialFocusedDate);
287
- const [visibleRangeStart, setVisibleRangeStart] = createSignal<CalendarDate>(
355
+ const [focusedDate, setFocusedDateInternal] =
356
+ createInternalSignal<CalendarDate>(initialFocusedDate);
357
+ const [visibleRangeStart, setVisibleRangeStart] = createInternalSignal<CalendarDate>(
288
358
  alignVisibleRangeStart(initialFocusedDate),
289
359
  );
290
360
  // Init from autoFocus, mirroring @react-stately useCalendarState
291
361
  // (`useState(props.autoFocus || false)`). Without autoFocus the calendar
292
362
  // mounts unfocused and never steals DOM focus.
293
- const [isFocused, setFocused] = createSignal(props.autoFocus ?? false);
294
- const [isPaginating, setIsPaginating] = createSignal(false);
363
+ const [isFocused, setFocused] = createInternalSignal(getProps().autoFocus ?? false);
364
+ const [isPaginating, setIsPaginating] = createInternalSignal(false);
295
365
 
296
366
  // Controlled vs uncontrolled value
297
367
  const sourceValue = createMemo<T | T[] | null>(() => {
298
- const controlled = access(props.value);
368
+ const controlled = access(getProps().value);
299
369
  return controlled !== undefined ? (controlled as T | T[] | null) : internalValue();
300
370
  });
301
371
  const value = createMemo<T | T[] | null>(() => {
@@ -307,80 +377,129 @@ export function createCalendarState<
307
377
  });
308
378
 
309
379
  // Derived states
310
- const isDisabled = createMemo(() => access(props.isDisabled) ?? false);
311
- const isReadOnly = createMemo(() => access(props.isReadOnly) ?? false);
312
- const validationState = createMemo(() => access(props.validationState));
313
- const isValueInvalid = createMemo(() => validationState() === "invalid");
380
+ const isDisabled = createMemo(() => access(getProps().isDisabled) ?? false);
381
+ const isReadOnly = createMemo(() => access(getProps().isReadOnly) ?? false);
382
+ const validationState = createMemo(() => access(getProps().validationState));
383
+ // A value is invalid when the caller says so, validationState is invalid,
384
+ // or a selected date is unavailable or outside min/max. Mirrors useCalendarState.
385
+ const isInvalidSelection = createMemo(() => {
386
+ const current = value();
387
+ if (current == null) return false;
388
+ const dates = Array.isArray(current) ? current : [current];
389
+ const min = access(getProps().minValue);
390
+ const max = access(getProps().maxValue);
391
+ const minCal = min != null ? toDisplayCalendarDate(min) : null;
392
+ const maxCal = max != null ? toDisplayCalendarDate(max) : null;
393
+ return dates.some((date) => {
394
+ const cal = toDisplayCalendarDate(date);
395
+ return (
396
+ Boolean(getProps().isDateUnavailable?.(cal)) ||
397
+ (minCal != null && cal.compare(minCal) < 0) ||
398
+ (maxCal != null && cal.compare(maxCal) > 0)
399
+ );
400
+ });
401
+ });
402
+ const isValueInvalid = createMemo(
403
+ () =>
404
+ Boolean(access(getProps().isInvalid)) ||
405
+ validationState() === "invalid" ||
406
+ isInvalidSelection(),
407
+ );
314
408
 
315
- // Visible range based on the paged range start.
316
- const visibleRange = createMemo(() => {
409
+ // Visible range based on the paged range start. Function (not memo) so
410
+ // onFocusChange snapshots see the live page after a same-turn write.
411
+ const visibleRange = () => {
317
412
  const start = visibleRangeStart();
318
413
  const end = visibleRangeEnd(start);
319
414
 
320
415
  return { start, end };
321
- });
322
-
323
- const syncVisibleRangeForFocusedDate = (nextFocusedDate: CalendarDate) => {
324
- const range = visibleRange();
416
+ };
325
417
 
418
+ const syncVisibleRangeForFocusedDate = (
419
+ nextFocusedDate: CalendarDate,
420
+ range: { start: CalendarDate; end: CalendarDate },
421
+ months: number,
422
+ ) => {
326
423
  if (nextFocusedDate.compare(range.start) < 0) {
327
- setVisibleRangeStart(startOfMonth(nextFocusedDate.subtract({ months: visibleMonths - 1 })));
424
+ setVisibleRangeStart(
425
+ constrainVisibleRangeStart(nextFocusedDate, rawAlignEnd(nextFocusedDate, months), months),
426
+ );
328
427
  } else if (nextFocusedDate.compare(range.end) > 0) {
329
- setVisibleRangeStart(startOfMonth(nextFocusedDate));
428
+ setVisibleRangeStart(
429
+ constrainVisibleRangeStart(nextFocusedDate, rawAlignStart(nextFocusedDate), months),
430
+ );
330
431
  }
331
432
  };
332
433
 
333
- createEffect(() => {
334
- const controlledFocused = access(props.focusedValue);
335
- if (!controlledFocused) {
336
- return;
337
- }
338
-
339
- const nextFocusedDate = constrainDate(toDisplayCalendarDate(controlledFocused));
340
-
341
- const currentFocusedDate = focusedDate();
342
- if (
343
- nextFocusedDate.compare(currentFocusedDate) !== 0 ||
344
- !isEqualCalendar(nextFocusedDate.calendar, currentFocusedDate.calendar)
345
- ) {
346
- setFocusedDateInternal(nextFocusedDate);
347
- }
348
-
349
- syncVisibleRangeForFocusedDate(nextFocusedDate);
350
- });
351
-
352
- createEffect(() => {
353
- const controlledFocused = access(props.focusedValue);
354
- if (controlledFocused) {
355
- return;
356
- }
357
-
358
- const currentFocusedDate = focusedDate();
359
- const nextFocusedDate = constrainDate(currentFocusedDate);
360
-
361
- if (
362
- nextFocusedDate.compare(currentFocusedDate) === 0 &&
363
- isEqualCalendar(nextFocusedDate.calendar, currentFocusedDate.calendar)
364
- ) {
365
- return;
366
- }
367
-
368
- syncVisibleRangeForFocusedDate(nextFocusedDate);
369
- setFocusedDateInternal(nextFocusedDate);
370
- props.onFocusChange?.(nextFocusedDate);
371
- });
372
-
373
- createEffect(() => {
374
- const currentFocusedDate = focusedDate();
375
- const nextFocusedDate = toDisplayCalendarDate(currentFocusedDate);
434
+ createEffect(
435
+ () => {
436
+ const controlledFocused = access(getProps().focusedValue);
437
+ if (!controlledFocused) return null;
438
+ return {
439
+ nextFocusedDate: constrainDate(toDisplayCalendarDate(controlledFocused)),
440
+ currentFocusedDate: focusedDate(),
441
+ range: visibleRange(),
442
+ months: visibleMonths(),
443
+ };
444
+ },
445
+ (data) => {
446
+ if (!data) return;
447
+ const { nextFocusedDate, currentFocusedDate, range, months } = data;
448
+ if (
449
+ nextFocusedDate.compare(currentFocusedDate) !== 0 ||
450
+ !isEqualCalendar(nextFocusedDate.calendar, currentFocusedDate.calendar)
451
+ ) {
452
+ setFocusedDateInternal(nextFocusedDate);
453
+ }
454
+ syncVisibleRangeForFocusedDate(nextFocusedDate, range, months);
455
+ },
456
+ );
376
457
 
377
- if (isEqualCalendar(currentFocusedDate.calendar, nextFocusedDate.calendar)) {
378
- return;
379
- }
458
+ createEffect(
459
+ () => {
460
+ const controlledFocused = access(getProps().focusedValue);
461
+ if (controlledFocused) return null;
462
+ const currentFocusedDate = focusedDate();
463
+ const nextFocusedDate = constrainDate(currentFocusedDate);
464
+ if (
465
+ nextFocusedDate.compare(currentFocusedDate) === 0 &&
466
+ isEqualCalendar(nextFocusedDate.calendar, currentFocusedDate.calendar)
467
+ ) {
468
+ return null;
469
+ }
470
+ return {
471
+ currentFocusedDate,
472
+ nextFocusedDate,
473
+ range: visibleRange(),
474
+ months: visibleMonths(),
475
+ };
476
+ },
477
+ (data) => {
478
+ if (!data) return;
479
+ syncVisibleRangeForFocusedDate(data.nextFocusedDate, data.range, data.months);
480
+ setFocusedDateInternal(data.nextFocusedDate);
481
+ getProps().onFocusChange?.(data.nextFocusedDate);
482
+ },
483
+ );
380
484
 
381
- setFocusedDateInternal(nextFocusedDate);
382
- setVisibleRangeStart(alignVisibleRangeStart(nextFocusedDate));
383
- });
485
+ createEffect(
486
+ () => {
487
+ const currentFocusedDate = focusedDate();
488
+ const nextFocusedDate = toDisplayCalendarDate(currentFocusedDate);
489
+ if (isEqualCalendar(currentFocusedDate.calendar, nextFocusedDate.calendar)) {
490
+ return null;
491
+ }
492
+ return {
493
+ nextFocusedDate,
494
+ alignedStart: alignVisibleRangeStart(nextFocusedDate),
495
+ };
496
+ },
497
+ (data) => {
498
+ if (!data) return;
499
+ setFocusedDateInternal(data.nextFocusedDate);
500
+ setVisibleRangeStart(data.alignedStart);
501
+ },
502
+ );
384
503
 
385
504
  // Format week days for headers
386
505
  const weekDays = createMemo(() => {
@@ -408,31 +527,54 @@ export function createCalendarState<
408
527
  return formatter.format(formattableMonth.toDate(timeZone));
409
528
  });
410
529
 
530
+ // Walks previousAvailableDate from minValue ?? minDate(constrained, startDate)
531
+ // rather than from startDate alone, so a date before the visible month remains
532
+ // selectable when isDateUnavailable is set. Mirrors useCalendarState.normalizeValue.
533
+ const normalizeValue = (newValue: CalendarDate): T | null => {
534
+ const constrained = constrainDate(newValue);
535
+ const minBound = access(getProps().minValue);
536
+ const lowerBound =
537
+ minBound != null
538
+ ? toDisplayCalendarDate(minBound)
539
+ : (minDate(constrained, visibleRange().start) ?? constrained);
540
+ const prev = previousAvailableDate(constrained, lowerBound, getProps().isDateUnavailable);
541
+ if (!prev) {
542
+ return null;
543
+ }
544
+
545
+ const oldValue = sourceValue();
546
+ const referenceValue = Array.isArray(oldValue) ? (oldValue[0] ?? null) : oldValue;
547
+ return convertValue(prev, referenceValue) as T;
548
+ };
549
+
411
550
  // Set value with onChange callback
412
551
  const setValue = (newValue: T | T[] | null) => {
413
552
  if (isDisabled() || isReadOnly()) return;
414
553
 
415
554
  const oldValue = sourceValue();
416
- const referenceValue = Array.isArray(oldValue) ? (oldValue[0] ?? null) : oldValue;
417
555
 
418
556
  let nextValue: T | T[] | null;
419
557
  if (newValue == null) {
420
558
  nextValue = selectionMode() === "multiple" ? ([] as T[]) : null;
421
559
  } else if (Array.isArray(newValue)) {
422
- nextValue = newValue.map(
423
- (v) => convertValue(constrainDate(toDisplayCalendarDate(v)), referenceValue) as T,
424
- );
560
+ nextValue = newValue
561
+ .map((v) => normalizeValue(toDisplayCalendarDate(v)))
562
+ .filter((v): v is T => v != null);
425
563
  } else {
426
- nextValue = convertValue(constrainDate(toDisplayCalendarDate(newValue)), referenceValue) as T;
564
+ const localValue = normalizeValue(toDisplayCalendarDate(newValue));
565
+ if (!localValue) {
566
+ return;
567
+ }
568
+ nextValue = localValue;
427
569
  }
428
570
 
429
- const controlled = access(props.value);
571
+ const controlled = access(getProps().value);
430
572
  if (controlled === undefined) {
431
573
  setInternalValue(() => nextValue);
432
574
  }
433
575
 
434
- if (!Object.is(oldValue, nextValue) && props.onChange) {
435
- props.onChange(nextValue as CalendarValueType<T | null, M>);
576
+ if (!Object.is(oldValue, nextValue)) {
577
+ getProps().onChange?.(nextValue as CalendarValueType<T | null, M>);
436
578
  }
437
579
  };
438
580
 
@@ -444,9 +586,9 @@ export function createCalendarState<
444
586
  return;
445
587
  }
446
588
 
447
- syncVisibleRangeForFocusedDate(constrained);
589
+ syncVisibleRangeForFocusedDate(constrained, visibleRange(), visibleMonths());
448
590
  setFocusedDateInternal(constrained);
449
- props.onFocusChange?.(constrained);
591
+ getProps().onFocusChange?.(constrained);
450
592
  };
451
593
 
452
594
  // Check if a date is selected
@@ -471,16 +613,16 @@ export function createCalendarState<
471
613
 
472
614
  // Check if a date is unavailable
473
615
  const isCellUnavailable = (date: DateValue): boolean => {
474
- return props.isDateUnavailable?.(date) ?? false;
616
+ return getProps().isDateUnavailable?.(date) ?? false;
475
617
  };
476
618
 
477
619
  // Check if a date is disabled
478
620
  const isCellDisabled = (date: DateValue): boolean => {
479
621
  if (isDisabled()) return true;
480
- if (props.isDateDisabled?.(date)) return true;
622
+ if (getProps().isDateDisabled?.(date)) return true;
481
623
 
482
- const minValue = access(props.minValue);
483
- const maxValue = access(props.maxValue);
624
+ const minValue = access(getProps().minValue);
625
+ const maxValue = access(getProps().maxValue);
484
626
  const calDate = toDisplayCalendarDate(date);
485
627
 
486
628
  // Dates outside the visible range are disabled, mirroring
@@ -510,24 +652,51 @@ export function createCalendarState<
510
652
  return isCellDisabled(date) || isCellUnavailable(date);
511
653
  };
512
654
 
655
+ // RAC `useCalendarState.ts` `isPreviousVisibleRangeInvalid` /
656
+ // `isNextVisibleRangeInvalid`: prev = startDate−1 invalid; next = endDate+1.
657
+ const isDateOutsideAllowedRange = (date: DateValue): boolean => {
658
+ const min = minValueState();
659
+ const max = maxValueState();
660
+ const calDate = toDisplayCalendarDate(date);
661
+ if (min && calDate.compare(toDisplayCalendarDate(min)) < 0) return true;
662
+ if (max && calDate.compare(toDisplayCalendarDate(max)) > 0) return true;
663
+ return false;
664
+ };
665
+
666
+ const isPreviousVisibleRangeInvalid = () => {
667
+ const start = visibleRange().start;
668
+ const previous = start.subtract({ days: 1 });
669
+ return isSameDay(previous, start) || isDateOutsideAllowedRange(previous);
670
+ };
671
+
672
+ const isNextVisibleRangeInvalid = () => {
673
+ const end = visibleRange().end;
674
+ const next = end.add({ days: 1 });
675
+ return isSameDay(next, end) || isDateOutsideAllowedRange(next);
676
+ };
677
+
513
678
  // Navigation methods
514
679
  const focusPreviousPage = () => {
515
680
  setIsPaginating(true);
516
- const pageMonths = props.pageBehavior === "single" ? 1 : visibleMonths;
517
- const nextFocusedDate = constrainDate(focusedDate().subtract({ months: pageMonths }));
681
+ const pageMonths = getProps().pageBehavior === "single" ? 1 : visibleMonths();
682
+ const currentFocused = focusedDate();
683
+ const nextFocusedDate = constrainDate(currentFocused.subtract({ months: pageMonths }));
684
+ const slidStart = startOfMonth(visibleRangeStart().subtract({ months: pageMonths }));
518
685
  setFocusedDateInternal(nextFocusedDate);
519
- setVisibleRangeStart(startOfMonth(visibleRangeStart().subtract({ months: pageMonths })));
520
- props.onFocusChange?.(nextFocusedDate);
686
+ setVisibleRangeStart(constrainVisibleRangeStart(currentFocused, slidStart, pageMonths));
687
+ getProps().onFocusChange?.(nextFocusedDate);
521
688
  setIsPaginating(false);
522
689
  };
523
690
 
524
691
  const focusNextPage = () => {
525
692
  setIsPaginating(true);
526
- const pageMonths = props.pageBehavior === "single" ? 1 : visibleMonths;
527
- const nextFocusedDate = constrainDate(focusedDate().add({ months: pageMonths }));
693
+ const pageMonths = getProps().pageBehavior === "single" ? 1 : visibleMonths();
694
+ const currentFocused = focusedDate();
695
+ const nextFocusedDate = constrainDate(currentFocused.add({ months: pageMonths }));
696
+ const slidStart = startOfMonth(visibleRangeStart().add({ months: pageMonths }));
528
697
  setFocusedDateInternal(nextFocusedDate);
529
- setVisibleRangeStart(startOfMonth(visibleRangeStart().add({ months: pageMonths })));
530
- props.onFocusChange?.(nextFocusedDate);
698
+ setVisibleRangeStart(constrainVisibleRangeStart(currentFocused, slidStart, pageMonths));
699
+ getProps().onFocusChange?.(nextFocusedDate);
531
700
  setIsPaginating(false);
532
701
  };
533
702
 
@@ -583,7 +752,7 @@ export function createCalendarState<
583
752
  if (isReadOnly() || isDisabled()) return;
584
753
 
585
754
  if (selectionMode() === "multiple") {
586
- const current = value();
755
+ const current = access(getProps().value) !== undefined ? value() : readNow(internalValue);
587
756
  const base: CalendarDate[] = Array.isArray(current)
588
757
  ? current.map((v) => toDisplayCalendarDate(v))
589
758
  : current != null
@@ -655,6 +824,8 @@ export function createCalendarState<
655
824
  isCellDisabled,
656
825
  isOutsideVisibleRange,
657
826
  isInvalid,
827
+ isPreviousVisibleRangeInvalid,
828
+ isNextVisibleRangeInvalid,
658
829
  focusPreviousPage,
659
830
  focusNextPage,
660
831
  focusPreviousSection,
@@ -673,7 +844,9 @@ export function createCalendarState<
673
844
  getWeeksInMonth: getWeeksInMonthFn,
674
845
  weekDays,
675
846
  title,
676
- visibleMonths,
847
+ get visibleMonths() {
848
+ return visibleMonths();
849
+ },
677
850
  isPaginating,
678
851
  };
679
852
  }
@@ -695,3 +868,26 @@ function convertValue(newValue: CalendarDate, oldValue?: DateValue | null): Date
695
868
 
696
869
  return localValue;
697
870
  }
871
+
872
+ /**
873
+ * Walks backward from `date` while it is unavailable and still at/after `minValue`.
874
+ * Mirrors @react-stately/calendar previousAvailableDate.
875
+ */
876
+ function previousAvailableDate(
877
+ date: CalendarDate,
878
+ minValue: CalendarDate,
879
+ isDateUnavailable?: (date: DateValue) => boolean,
880
+ ): CalendarDate | null {
881
+ if (!isDateUnavailable) {
882
+ return date;
883
+ }
884
+
885
+ while (date.compare(minValue) >= 0 && isDateUnavailable(date)) {
886
+ date = date.subtract({ days: 1 });
887
+ }
888
+
889
+ if (date.compare(minValue) >= 0) {
890
+ return date;
891
+ }
892
+ return null;
893
+ }