@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/radio/useRadioGroupState.ts
14
+
1
15
  /**
2
16
  * Radio group state for Solid Stately
3
17
  *
@@ -7,8 +21,8 @@
7
21
  * This is a 1:1 port of @react-stately/radio's useRadioGroupState.
8
22
  */
9
23
 
10
- import { createMemo, createSignal, Accessor, untrack } from "solid-js";
11
- import { type MaybeAccessor, access } from "../utils";
24
+ import { createMemo, Accessor, untrack } from "solid-js";
25
+ import { createInternalSignal, type MaybeAccessor, access } from "../utils";
12
26
  import { createId } from "../ssr";
13
27
  import {
14
28
  createFormValidationState,
@@ -123,15 +137,15 @@ export function createRadioGroupState(props: MaybeAccessor<RadioGroupProps> = {}
123
137
 
124
138
  // Create internal signal for uncontrolled mode
125
139
  // Initialize with defaultValue only (not value, which is for controlled mode)
126
- const [internalValue, setInternalValue] = createSignal<string | null>(
140
+ const [internalValue, setInternalValue] = createInternalSignal<string | null>(
127
141
  initialProps.defaultValue ?? null,
128
142
  );
129
- const [lastFocusedValue, setLastFocusedValueInternal] = createSignal<string | null>(null);
143
+ const [lastFocusedValue, setLastFocusedValueInternal] = createInternalSignal<string | null>(null);
130
144
 
131
145
  // SolidJS-specific: Version counter for triggering DOM sync across all radios
132
146
  // This handles the case where native radio behavior causes DOM state to desync
133
147
  // from our reactive state (e.g., clicking a radio unchecks siblings in the DOM)
134
- const [syncVersion, setSyncVersion] = createSignal(0);
148
+ const [syncVersion, setSyncVersion] = createInternalSignal(0);
135
149
 
136
150
  const controlledValue = createMemo<string | null | undefined>(() => {
137
151
  const value = getProps().value;
@@ -206,7 +220,10 @@ export function createRadioGroupState(props: MaybeAccessor<RadioGroupProps> = {}
206
220
  const state: RadioGroupState = {
207
221
  name,
208
222
  selectedValue,
209
- defaultSelectedValue: initialProps.defaultValue ?? null,
223
+ // useRadioGroupState.ts:125 — a controlled value, including null, is the
224
+ // reset default. defaultValue applies only while uncontrolled.
225
+ defaultSelectedValue:
226
+ initialProps.value !== undefined ? initialProps.value : (initialProps.defaultValue ?? null),
210
227
  setSelectedValue,
211
228
  lastFocusedValue,
212
229
  setLastFocusedValue,
@@ -1,10 +1,25 @@
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/searchfield/useSearchFieldState.ts
14
+
1
15
  /**
2
16
  * Creates state for a search field component.
3
17
  * Based on @react-stately/searchfield useSearchFieldState.
4
18
  */
5
19
 
6
- import { type Accessor, createSignal, createMemo } from "solid-js";
7
- import { access, type MaybeAccessor } from "../utils";
20
+ import { createMemo } from "solid-js";
21
+ import type { Accessor } from "solid-js";
22
+ import { createInternalSignal, access, type MaybeAccessor } from "../utils";
8
23
 
9
24
  export interface SearchFieldStateProps {
10
25
  /** The current value (controlled). */
@@ -32,7 +47,7 @@ export function createSearchFieldState(
32
47
 
33
48
  const isControlled = () => getProps().value !== undefined;
34
49
 
35
- const [internalValue, setInternalValue] = createSignal(getProps().defaultValue ?? "");
50
+ const [internalValue, setInternalValue] = createInternalSignal(getProps().defaultValue ?? "");
36
51
 
37
52
  const value = createMemo(() => {
38
53
  const p = getProps();
@@ -1,17 +1,51 @@
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/select/useSelectState.ts
14
+
1
15
  /**
2
16
  * State management for select components.
3
17
  * Based on @react-stately/select useSelectState.
4
18
  */
5
19
 
6
- import { createSignal, createMemo, type Accessor } from "solid-js";
7
- import { access, type MaybeAccessor } from "../utils";
20
+ import { createMemo, untrack } from "solid-js";
21
+ import type { Accessor } from "solid-js";
22
+ import { createInternalSignal, propsAccessor, type MaybeAccessor } from "../utils";
8
23
  import { createListState } from "../collections/createListState";
9
24
  import { createOverlayTriggerState } from "../overlays";
10
- import type { Key, CollectionNode, Collection } from "../collections/types";
11
- import type { SelectionMode, Selection } from "../collections/types";
25
+ import type { Key, CollectionNode, Collection, FocusStrategy } from "../collections/types";
12
26
  import type { SelectionManager } from "../selection/SelectionManager";
27
+ import {
28
+ createFormValidationState,
29
+ type FormValidationState,
30
+ type ValidationFunction,
31
+ } from "../form";
32
+
33
+ /** Select never uses the collection `"none"` mode. */
34
+ export type SelectSelectionMode = "single" | "multiple";
35
+
36
+ /** Single mode is `Key | null`. Multiple mode is `readonly Key[]`. */
37
+ export type SelectValueType<M extends SelectSelectionMode> = M extends "single"
38
+ ? Key | null
39
+ : readonly Key[];
40
+
41
+ /** `onChange` receives a mutable `Key[]` in multiple mode. */
42
+ export type SelectChangeValueType<M extends SelectSelectionMode> = M extends "single"
43
+ ? Key | null
44
+ : Key[];
13
45
 
14
- export interface SelectStateProps<T = unknown> {
46
+ type SelectValidationType<M extends SelectSelectionMode> = M extends "single" ? Key : Key[];
47
+
48
+ export interface SelectStateProps<T = unknown, M extends SelectSelectionMode = "single"> {
15
49
  /** The items to display in the select. */
16
50
  items: T[];
17
51
  /** Function to get the key for an item. */
@@ -22,33 +56,71 @@ export interface SelectStateProps<T = unknown> {
22
56
  getDisabled?: (item: T) => boolean;
23
57
  /** Keys of disabled items. */
24
58
  disabledKeys?: Iterable<Key>;
25
- /** The currently selected key (controlled). */
59
+ /**
60
+ * Whether single or multiple selection is enabled.
61
+ * @default 'single'
62
+ */
63
+ selectionMode?: M;
64
+ /**
65
+ * The current value (controlled).
66
+ * Single mode is `Key | null`. Multiple mode is `readonly Key[]`.
67
+ */
68
+ value?: SelectValueType<M>;
69
+ /** The default value (uncontrolled). */
70
+ defaultValue?: SelectValueType<M>;
71
+ /** Handler called when the value changes. */
72
+ onChange?: (value: SelectChangeValueType<M>) => void;
73
+ /**
74
+ * The currently selected key in the collection (controlled).
75
+ * @deprecated Use `value`.
76
+ */
26
77
  selectedKey?: Key | null;
27
- /** The default selected key (uncontrolled). */
78
+ /**
79
+ * The initial selected key in the collection (uncontrolled).
80
+ * @deprecated Use `defaultValue`.
81
+ */
28
82
  defaultSelectedKey?: Key | null;
29
- /** The selected keys (controlled, for multiple selection mode). */
30
- selectedKeys?: "all" | Iterable<Key>;
31
- /** Default selected keys (uncontrolled, for multiple selection mode). */
32
- defaultSelectedKeys?: "all" | Iterable<Key>;
33
- /** Handler called when the selection changes. */
83
+ /**
84
+ * Handler that is called when the selection changes.
85
+ * @deprecated Use `onChange`.
86
+ */
34
87
  onSelectionChange?: (key: Key | null) => void;
35
- /** Handler called when selected keys change. */
36
- onSelectionChangeKeys?: (keys: Selection) => void;
37
- /** Selection mode for the select. */
38
- selectionMode?: Extract<SelectionMode, "single" | "multiple">;
39
88
  /** Whether the select is open (controlled). */
40
89
  isOpen?: boolean;
41
90
  /** Whether the select is open by default (uncontrolled). */
42
91
  defaultOpen?: boolean;
43
92
  /** Handler called when the open state changes. */
44
93
  onOpenChange?: (isOpen: boolean) => void;
94
+ /**
95
+ * Whether the Select should close when an item is selected. Defaults to true
96
+ * when selectionMode is single, false otherwise.
97
+ */
98
+ shouldCloseOnSelect?: boolean;
99
+ /** Whether the select should be allowed to be open when the collection is empty. */
100
+ allowsEmptyCollection?: boolean;
45
101
  /** Whether the select is disabled. */
46
102
  isDisabled?: boolean;
47
103
  /** Whether the select is required. */
48
104
  isRequired?: boolean;
105
+ /** Whether the select is invalid (controlled). */
106
+ isInvalid?: boolean;
107
+ /** @deprecated Use isInvalid instead. */
108
+ validationState?: "valid" | "invalid";
109
+ /** Custom validation function. */
110
+ validate?: ValidationFunction<SelectValidationType<M> | null>;
111
+ /**
112
+ * Whether to use native HTML form validation or ARIA validation semantics.
113
+ * @default "native"
114
+ */
115
+ validationBehavior?: "aria" | "native";
116
+ /** Field name(s) for server error lookup. */
117
+ name?: string | string[];
49
118
  }
50
119
 
51
- export interface SelectState<T = unknown> {
120
+ export interface SelectState<
121
+ T = unknown,
122
+ M extends SelectSelectionMode = "single",
123
+ > extends FormValidationState {
52
124
  /** The collection of items. */
53
125
  readonly collection: Accessor<Collection<T>>;
54
126
  /**
@@ -59,23 +131,48 @@ export interface SelectState<T = unknown> {
59
131
  /** Whether the select dropdown is open. */
60
132
  readonly isOpen: Accessor<boolean>;
61
133
  /** Open the select dropdown. */
62
- open(): void;
134
+ open(focusStrategy?: FocusStrategy | null): void;
63
135
  /** Close the select dropdown. */
64
136
  close(): void;
65
137
  /** Toggle the select dropdown. */
66
- toggle(): void;
67
- /** The currently selected key. */
138
+ toggle(focusStrategy?: FocusStrategy | null): void;
139
+ /** Controls which item will be auto focused when the menu opens. */
140
+ readonly focusStrategy: Accessor<FocusStrategy | null>;
141
+ /**
142
+ * The key for the first selected item.
143
+ * @deprecated Use `value`.
144
+ */
68
145
  readonly selectedKey: Accessor<Key | null>;
69
- /** The selected keys. */
70
- readonly selectedKeys: Accessor<Selection>;
71
- /** The currently selected item. */
72
- readonly selectedItem: Accessor<CollectionNode<T> | null>;
73
- /** The currently selected items. */
74
- readonly selectedItems: Accessor<CollectionNode<T>[]>;
75
- /** Set the selected key. */
146
+ /**
147
+ * The default selected key.
148
+ * @deprecated Use `defaultValue`.
149
+ */
150
+ readonly defaultSelectedKey: Key | null;
151
+ /**
152
+ * Sets the selected key.
153
+ * @deprecated Use `setValue`.
154
+ */
76
155
  setSelectedKey(key: Key | null): void;
77
- /** Set selected keys. */
156
+ /** The current select value. */
157
+ readonly value: Accessor<SelectValueType<M>>;
158
+ /** The default select value. */
159
+ readonly defaultValue: SelectValueType<M>;
160
+ /** Sets the select value. */
161
+ setValue(value: Key | readonly Key[] | null): void;
162
+ /**
163
+ * Selected keys derived from `value`.
164
+ * Kept for list and hidden-select adapters. Never `"all"`.
165
+ */
166
+ readonly selectedKeys: Accessor<Set<Key>>;
167
+ /** Replace the selected keys. */
78
168
  setSelectedKeys(keys: Iterable<Key>): void;
169
+ /**
170
+ * The value of the first selected item.
171
+ * @deprecated Use `selectedItems`.
172
+ */
173
+ readonly selectedItem: Accessor<CollectionNode<T> | null>;
174
+ /** The value of the selected items. */
175
+ readonly selectedItems: Accessor<CollectionNode<T>[]>;
79
176
  /** The currently focused key. */
80
177
  readonly focusedKey: Accessor<Key | null>;
81
178
  /** Set the focused key. */
@@ -91,20 +188,29 @@ export interface SelectState<T = unknown> {
91
188
  /** Whether the select is required. */
92
189
  readonly isRequired: boolean;
93
190
  /** The selection mode. */
94
- readonly selectionMode: Accessor<"single" | "multiple">;
191
+ readonly selectionMode: Accessor<M>;
192
+ /** Whether selecting an item closes the menu. */
193
+ readonly shouldCloseOnSelect: Accessor<boolean>;
194
+ }
195
+
196
+ function convertValue(value: Key | readonly Key[] | null | undefined): readonly Key[] | undefined {
197
+ if (value === undefined) return undefined;
198
+ if (value === null || typeof value === "string" || typeof value === "number") {
199
+ return value == null ? [] : [value];
200
+ }
201
+ return value;
95
202
  }
96
203
 
97
204
  /**
98
205
  * Creates state for a select component.
99
206
  * Combines list state with overlay trigger state for dropdown behavior.
100
207
  */
101
- export function createSelectState<T = unknown>(
102
- props: MaybeAccessor<SelectStateProps<T>>,
103
- ): SelectState<T> {
104
- const getProps = () => access(props);
105
- const selectionMode: Accessor<"single" | "multiple"> = () => getProps().selectionMode ?? "single";
208
+ export function createSelectState<T = unknown, M extends SelectSelectionMode = "single">(
209
+ props: MaybeAccessor<SelectStateProps<T, M>>,
210
+ ): SelectState<T, M> {
211
+ const getProps = propsAccessor(props);
212
+ const selectionMode: Accessor<M> = () => (getProps().selectionMode ?? "single") as M;
106
213
 
107
- // Overlay trigger state for open/close
108
214
  const overlayState = createOverlayTriggerState({
109
215
  get isOpen() {
110
216
  return getProps().isOpen;
@@ -117,83 +223,155 @@ export function createSelectState<T = unknown>(
117
223
  },
118
224
  });
119
225
 
120
- // Track selected key
121
- const isControlledSingle = () => getProps().selectedKey !== undefined;
122
- const isControlledMultiple = () => getProps().selectedKeys !== undefined;
123
- const [internalSelectedKey, setInternalSelectedKey] = createSignal<Key | null>(
124
- getProps().defaultSelectedKey ?? null,
125
- );
126
- const [internalSelectedKeys, setInternalSelectedKeys] = createSignal<Selection>(
127
- getProps().defaultSelectedKeys === "all"
128
- ? "all"
129
- : new Set(getProps().defaultSelectedKeys ?? []),
130
- );
226
+ const resolvedDefault = untrack((): Key | readonly Key[] | null => {
227
+ const current = getProps();
228
+ if (current.defaultValue !== undefined) {
229
+ return current.defaultValue as Key | readonly Key[] | null;
230
+ }
231
+ const mode = current.selectionMode ?? "single";
232
+ return mode === "single" ? (current.defaultSelectedKey ?? null) : [];
233
+ });
131
234
 
132
- const selectedKey: Accessor<Key | null> = () => {
133
- if (selectionMode() === "multiple") {
134
- const keys = selectedKeys();
135
- if (keys === "all") return null;
136
- return keys.size > 0 ? Array.from(keys)[0] : null;
235
+ const controlledProp = (): SelectValueType<M> | undefined => {
236
+ const current = getProps();
237
+ if (current.value !== undefined) return current.value;
238
+ if (selectionMode() === "single" && current.selectedKey !== undefined) {
239
+ return (current.selectedKey ?? null) as SelectValueType<M>;
137
240
  }
241
+ return undefined;
242
+ };
243
+
244
+ const [internalValue, setInternalValue] = createInternalSignal<Key | readonly Key[] | null>(
245
+ resolvedDefault,
246
+ );
138
247
 
139
- return isControlledSingle() ? (getProps().selectedKey ?? null) : internalSelectedKey();
248
+ const readControlled = (): Key | readonly Key[] | null | undefined => {
249
+ const controlled = controlledProp();
250
+ return controlled === undefined ? undefined : (controlled as Key | readonly Key[] | null);
140
251
  };
141
252
 
142
- const setSelectedKey = (key: Key | null) => {
143
- if (selectionMode() === "multiple") {
144
- if (key == null) {
145
- if (!isControlledMultiple()) {
146
- setInternalSelectedKeys(new Set<Key>());
147
- }
148
- getProps().onSelectionChangeKeys?.(new Set<Key>());
149
- getProps().onSelectionChange?.(null);
150
- } else {
151
- const next = new Set([key]);
152
- if (!isControlledMultiple()) {
153
- setInternalSelectedKeys(next);
253
+ let valueRef: Key | readonly Key[] | null = untrack(() => {
254
+ const controlled = readControlled();
255
+ return controlled !== undefined ? controlled : internalValue();
256
+ });
257
+ let wroteThisTurn = false;
258
+
259
+ const syncValueRef = () => {
260
+ if (wroteThisTurn) return;
261
+ const controlled = readControlled();
262
+ valueRef = controlled !== undefined ? controlled : untrack(internalValue);
263
+ };
264
+
265
+ const displayValue = (): Key | readonly Key[] | null => {
266
+ const controlled = readControlled();
267
+ const raw = controlled !== undefined ? controlled : internalValue();
268
+ if (
269
+ selectionMode() === "single" &&
270
+ raw !== null &&
271
+ typeof raw !== "string" &&
272
+ typeof raw !== "number"
273
+ ) {
274
+ return raw[0] ?? null;
275
+ }
276
+ return raw;
277
+ };
278
+
279
+ const setValue = (next: Key | readonly Key[] | null) => {
280
+ syncValueRef();
281
+ if (selectionMode() === "single") {
282
+ const key: Key | null =
283
+ typeof next === "string" || typeof next === "number"
284
+ ? next
285
+ : next === null
286
+ ? null
287
+ : (next[0] ?? null);
288
+ // Both callbacks follow this request, not a comparison with displayValue.
289
+ // A refused controlled value stays stale for the turn, so a second
290
+ // same-key call would notify the legacy callback again. React Stately
291
+ // still compares displayValue; this is the Solid same-turn adaptation.
292
+ // A later turn resyncs valueRef, and a different key is its own request.
293
+ if (!Object.is(valueRef, key)) {
294
+ valueRef = key;
295
+ wroteThisTurn = true;
296
+ queueMicrotask(() => {
297
+ wroteThisTurn = false;
298
+ });
299
+ if (controlledProp() === undefined) {
300
+ setInternalValue(key);
154
301
  }
155
- getProps().onSelectionChangeKeys?.(next);
302
+ getProps().onChange?.(key as SelectChangeValueType<M>);
156
303
  getProps().onSelectionChange?.(key);
157
304
  }
158
305
  return;
159
306
  }
160
307
 
161
- if (!isControlledSingle()) {
162
- setInternalSelectedKey(key);
163
- }
164
- getProps().onSelectionChange?.(key);
165
- getProps().onSelectionChangeKeys?.(key != null ? new Set([key]) : new Set<Key>());
166
- };
167
-
168
- const selectedKeys: Accessor<Selection> = createMemo(() => {
169
- if (selectionMode() === "multiple") {
170
- if (isControlledMultiple()) {
171
- const keys = getProps().selectedKeys;
172
- return keys === "all" ? "all" : new Set<Key>(keys ?? []);
308
+ // Keep the readonly list for state. `onChange` receives its own mutable copy.
309
+ const keys: readonly Key[] =
310
+ typeof next === "string" || typeof next === "number" ? [next] : next === null ? [] : next;
311
+ if (!Object.is(valueRef, keys)) {
312
+ valueRef = keys;
313
+ wroteThisTurn = true;
314
+ queueMicrotask(() => {
315
+ wroteThisTurn = false;
316
+ });
317
+ if (controlledProp() === undefined) {
318
+ setInternalValue(keys);
173
319
  }
174
- return internalSelectedKeys();
320
+ getProps().onChange?.([...keys] as SelectChangeValueType<M>);
175
321
  }
176
-
177
- const key = selectedKey();
178
- return key != null ? new Set<Key>([key]) : new Set<Key>();
179
- });
322
+ };
180
323
 
181
324
  const setSelectedKeys = (keys: Iterable<Key>) => {
182
- const next = new Set(keys);
183
325
  if (selectionMode() === "multiple") {
184
- if (!isControlledMultiple()) {
185
- setInternalSelectedKeys(next);
186
- }
187
- getProps().onSelectionChangeKeys?.(next);
188
- getProps().onSelectionChange?.(next.size > 0 ? Array.from(next)[0] : null);
326
+ setValue([...keys]);
189
327
  return;
190
328
  }
191
-
192
- const key = next.size > 0 ? Array.from(next)[0] : null;
193
- setSelectedKey(key);
329
+ let key: Key | null = null;
330
+ for (const item of keys) {
331
+ key = item;
332
+ break;
333
+ }
334
+ setValue(key);
194
335
  };
195
336
 
196
- // Create list state with select selection mode
337
+ const initialDisplay = untrack(displayValue);
338
+ const stateDefaultValue = (resolvedDefault ?? initialDisplay) as SelectValueType<M>;
339
+ const defaultSelectedKey =
340
+ untrack(() => getProps().defaultSelectedKey) ??
341
+ (untrack(() => getProps().selectionMode) === "single" ? (initialDisplay as Key) : null);
342
+
343
+ const shouldCloseOnSelect = () => getProps().shouldCloseOnSelect ?? selectionMode() === "single";
344
+
345
+ const validation = createFormValidationState({
346
+ get value() {
347
+ const display = displayValue();
348
+ if (
349
+ display !== null &&
350
+ typeof display !== "string" &&
351
+ typeof display !== "number" &&
352
+ display.length === 0
353
+ ) {
354
+ return null;
355
+ }
356
+ return display;
357
+ },
358
+ get isInvalid() {
359
+ return getProps().isInvalid;
360
+ },
361
+ get validationState() {
362
+ return getProps().validationState;
363
+ },
364
+ get validate() {
365
+ return getProps().validate as ValidationFunction<unknown> | undefined;
366
+ },
367
+ get name() {
368
+ return getProps().name;
369
+ },
370
+ get validationBehavior() {
371
+ return getProps().validationBehavior ?? "native";
372
+ },
373
+ });
374
+
197
375
  const listState = createListState<T>({
198
376
  get items() {
199
377
  return getProps().items;
@@ -213,40 +391,39 @@ export function createSelectState<T = unknown>(
213
391
  get selectionMode() {
214
392
  return selectionMode();
215
393
  },
216
- disallowEmptySelection: true,
394
+ // Upstream only requires a value in single-selection mode. Multiple
395
+ // selection must permit toggling the last selected option off.
396
+ get disallowEmptySelection() {
397
+ return selectionMode() === "single";
398
+ },
399
+ allowDuplicateSelectionEvents: true,
217
400
  get selectedKeys() {
218
- const keys = selectedKeys();
219
- if (keys === "all") return "all";
220
- return keys;
401
+ return convertValue(displayValue()) ?? [];
221
402
  },
222
403
  onSelectionChange(keys) {
223
- if (selectionMode() === "multiple") {
224
- if (!isControlledMultiple()) {
225
- setInternalSelectedKeys(keys);
226
- }
227
- getProps().onSelectionChangeKeys?.(keys);
228
- if (keys !== "all") {
229
- getProps().onSelectionChange?.(keys.size > 0 ? Array.from(keys)[0] : null);
230
- }
231
- return;
232
- }
233
-
234
- // Get the first (and only) selected key
235
404
  if (keys === "all") return;
236
- const key = keys.size > 0 ? Array.from(keys)[0] : null;
237
- setSelectedKey(key);
238
- // Close the dropdown after selection in single mode
239
- overlayState.close();
405
+ if (selectionMode() === "single") {
406
+ setValue(keys.values().next().value ?? null);
407
+ } else {
408
+ setValue([...keys]);
409
+ }
410
+ if (shouldCloseOnSelect()) {
411
+ overlayState.close();
412
+ }
413
+ validation.commitValidation();
240
414
  },
241
415
  });
242
416
 
417
+ const [focusStrategy, setFocusStrategy] = createInternalSignal<FocusStrategy | null>(null);
243
418
  // The select's own focus state (the trigger), separate from the collection's
244
419
  // focus-within state on the selection manager — upstream useSelectState keeps
245
420
  // these apart with a dedicated useState. Sharing the manager's signal makes
246
421
  // trigger focus re-arm the item roving-focus effect and steal focus back.
247
- const [isFocused, setFocused] = createSignal(false);
422
+ const [isFocused, setFocused] = createInternalSignal(false);
423
+
424
+ const selectedKey: Accessor<Key | null> = () => listState.selectionManager.firstSelectedKey;
425
+ const selectedKeys: Accessor<Set<Key>> = () => new Set(convertValue(displayValue()) ?? []);
248
426
 
249
- // Get the selected item from the collection (memoized)
250
427
  const selectedItem: Accessor<CollectionNode<T> | null> = createMemo(() => {
251
428
  const key = selectedKey();
252
429
  if (key == null) return null;
@@ -254,43 +431,53 @@ export function createSelectState<T = unknown>(
254
431
  });
255
432
 
256
433
  const selectedItems: Accessor<CollectionNode<T>[]> = createMemo(() => {
257
- const keys = selectedKeys();
258
- if (keys === "all") {
259
- return Array.from(listState.collection());
260
- }
261
-
262
434
  const items: CollectionNode<T>[] = [];
263
- for (const key of keys) {
435
+ for (const key of listState.selectionManager.selectedKeys) {
264
436
  const item = listState.collection().getItem(key);
265
437
  if (item) items.push(item);
266
438
  }
267
439
  return items;
268
440
  });
269
441
 
442
+ const canOpenMenu = () =>
443
+ listState.collection().size !== 0 || getProps().allowsEmptyCollection === true;
444
+
270
445
  return {
271
- // Collection
446
+ realtimeValidation: validation.realtimeValidation,
447
+ displayValidation: validation.displayValidation,
448
+ updateValidation: validation.updateValidation,
449
+ resetValidation: validation.resetValidation,
450
+ commitValidation: validation.commitValidation,
272
451
  collection: listState.collection,
273
452
  selectionManager: listState.selectionManager,
274
-
275
- // Focus management
276
453
  focusedKey: listState.focusedKey,
277
454
  setFocusedKey: listState.setFocusedKey,
278
455
  isFocused,
279
456
  setFocused,
280
-
281
- // Overlay state
282
457
  isOpen: overlayState.isOpen,
283
- open: overlayState.open,
458
+ open(strategy: FocusStrategy | null = null) {
459
+ if (!canOpenMenu()) return;
460
+ setFocusStrategy(strategy);
461
+ overlayState.open();
462
+ },
284
463
  close: overlayState.close,
285
- toggle: overlayState.toggle,
286
-
287
- // Select-specific
464
+ toggle(strategy: FocusStrategy | null = null) {
465
+ if (!canOpenMenu()) return;
466
+ setFocusStrategy(strategy);
467
+ overlayState.toggle();
468
+ },
469
+ focusStrategy,
288
470
  selectionMode,
471
+ shouldCloseOnSelect,
472
+ value: () => displayValue() as SelectValueType<M>,
473
+ defaultValue: stateDefaultValue,
474
+ setValue,
289
475
  selectedKey,
476
+ defaultSelectedKey,
477
+ setSelectedKey: setValue,
290
478
  selectedKeys,
291
479
  selectedItem,
292
480
  selectedItems,
293
- setSelectedKey,
294
481
  setSelectedKeys,
295
482
  isKeyDisabled: (key: Key) => listState.isDisabled(key),
296
483
  get isDisabled() {