@proyecto-viviana/solidaria-components 0.3.2 → 0.4.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 (417) hide show
  1. package/dist/ActionBar.d.ts.map +1 -1
  2. package/dist/ActionBar.js +175 -0
  3. package/dist/ActionBar.js.map +1 -0
  4. package/dist/ActionBar.jsx +119 -0
  5. package/dist/ActionBar.jsx.map +1 -0
  6. package/dist/ActionGroup.d.ts.map +1 -1
  7. package/dist/ActionGroup.js +179 -0
  8. package/dist/ActionGroup.js.map +1 -0
  9. package/dist/ActionGroup.jsx +129 -0
  10. package/dist/ActionGroup.jsx.map +1 -0
  11. package/dist/Alert.js +111 -0
  12. package/dist/Alert.js.map +1 -0
  13. package/dist/Alert.jsx +82 -0
  14. package/dist/Alert.jsx.map +1 -0
  15. package/dist/Autocomplete.d.ts +2 -2
  16. package/dist/Autocomplete.d.ts.map +1 -1
  17. package/dist/Autocomplete.js +130 -0
  18. package/dist/Autocomplete.js.map +1 -0
  19. package/dist/Autocomplete.jsx +116 -0
  20. package/dist/Autocomplete.jsx.map +1 -0
  21. package/dist/Breadcrumbs.d.ts.map +1 -1
  22. package/dist/Breadcrumbs.js +333 -0
  23. package/dist/Breadcrumbs.js.map +1 -0
  24. package/dist/Breadcrumbs.jsx +261 -0
  25. package/dist/Breadcrumbs.jsx.map +1 -0
  26. package/dist/Button.d.ts.map +1 -1
  27. package/dist/Button.js +348 -0
  28. package/dist/Button.js.map +1 -0
  29. package/dist/Button.jsx +314 -0
  30. package/dist/Button.jsx.map +1 -0
  31. package/dist/Calendar.d.ts +4 -4
  32. package/dist/Calendar.d.ts.map +1 -1
  33. package/dist/Calendar.js +573 -0
  34. package/dist/Calendar.js.map +1 -0
  35. package/dist/Calendar.jsx +342 -0
  36. package/dist/Calendar.jsx.map +1 -0
  37. package/dist/CalendarPicker.d.ts +33 -0
  38. package/dist/CalendarPicker.d.ts.map +1 -0
  39. package/dist/CalendarPicker.js +44 -0
  40. package/dist/CalendarPicker.js.map +1 -0
  41. package/dist/CalendarPicker.jsx +44 -0
  42. package/dist/CalendarPicker.jsx.map +1 -0
  43. package/dist/Checkbox.d.ts +83 -4
  44. package/dist/Checkbox.d.ts.map +1 -1
  45. package/dist/Checkbox.js +923 -0
  46. package/dist/Checkbox.js.map +1 -0
  47. package/dist/Checkbox.jsx +707 -0
  48. package/dist/Checkbox.jsx.map +1 -0
  49. package/dist/Collection.d.ts.map +1 -1
  50. package/dist/Collection.js +202 -0
  51. package/dist/Collection.js.map +1 -0
  52. package/dist/Collection.jsx +152 -0
  53. package/dist/Collection.jsx.map +1 -0
  54. package/dist/Color.d.ts.map +1 -1
  55. package/dist/Color.js +1717 -0
  56. package/dist/Color.js.map +1 -0
  57. package/dist/Color.jsx +1340 -0
  58. package/dist/Color.jsx.map +1 -0
  59. package/dist/ColorEditor.js +208 -0
  60. package/dist/ColorEditor.js.map +1 -0
  61. package/dist/ColorEditor.jsx +120 -0
  62. package/dist/ColorEditor.jsx.map +1 -0
  63. package/dist/ComboBox.d.ts +8 -4
  64. package/dist/ComboBox.d.ts.map +1 -1
  65. package/dist/ComboBox.js +1000 -0
  66. package/dist/ComboBox.js.map +1 -0
  67. package/dist/ComboBox.jsx +724 -0
  68. package/dist/ComboBox.jsx.map +1 -0
  69. package/dist/ContextualHelpTrigger.js +146 -0
  70. package/dist/ContextualHelpTrigger.js.map +1 -0
  71. package/dist/ContextualHelpTrigger.jsx +109 -0
  72. package/dist/ContextualHelpTrigger.jsx.map +1 -0
  73. package/dist/DateField.d.ts +14 -5
  74. package/dist/DateField.d.ts.map +1 -1
  75. package/dist/DateField.js +4 -0
  76. package/dist/DateField.jsx +4 -0
  77. package/dist/DateField2.js +502 -0
  78. package/dist/DateField2.js.map +1 -0
  79. package/dist/DateField2.jsx +354 -0
  80. package/dist/DateField2.jsx.map +1 -0
  81. package/dist/DatePicker.d.ts +46 -7
  82. package/dist/DatePicker.d.ts.map +1 -1
  83. package/dist/DatePicker.js +7 -0
  84. package/dist/DatePicker.jsx +7 -0
  85. package/dist/DatePicker2.js +1171 -0
  86. package/dist/DatePicker2.js.map +1 -0
  87. package/dist/DatePicker2.jsx +820 -0
  88. package/dist/DatePicker2.jsx.map +1 -0
  89. package/dist/DateRangePickerContext.d.ts +2 -0
  90. package/dist/DateRangePickerContext.d.ts.map +1 -1
  91. package/dist/Dialog.d.ts.map +1 -1
  92. package/dist/Dialog.js +337 -0
  93. package/dist/Dialog.js.map +1 -0
  94. package/dist/Dialog.jsx +192 -0
  95. package/dist/Dialog.jsx.map +1 -0
  96. package/dist/Disclosure.d.ts.map +1 -1
  97. package/dist/Disclosure.js +331 -0
  98. package/dist/Disclosure.js.map +1 -0
  99. package/dist/Disclosure.jsx +230 -0
  100. package/dist/Disclosure.jsx.map +1 -0
  101. package/dist/DragAndDrop.d.ts.map +1 -1
  102. package/dist/DragAndDrop.js +176 -0
  103. package/dist/DragAndDrop.js.map +1 -0
  104. package/dist/DragAndDrop.jsx +160 -0
  105. package/dist/DragAndDrop.jsx.map +1 -0
  106. package/dist/DropZone.d.ts.map +1 -1
  107. package/dist/DropZone.js +189 -0
  108. package/dist/DropZone.js.map +1 -0
  109. package/dist/DropZone.jsx +144 -0
  110. package/dist/DropZone.jsx.map +1 -0
  111. package/dist/FieldError.js +66 -0
  112. package/dist/FieldError.js.map +1 -0
  113. package/dist/FieldError.jsx +47 -0
  114. package/dist/FieldError.jsx.map +1 -0
  115. package/dist/FileTrigger.js +79 -0
  116. package/dist/FileTrigger.js.map +1 -0
  117. package/dist/FileTrigger.jsx +49 -0
  118. package/dist/FileTrigger.jsx.map +1 -0
  119. package/dist/Focusable.js +70 -0
  120. package/dist/Focusable.js.map +1 -0
  121. package/dist/Focusable.jsx +69 -0
  122. package/dist/Focusable.jsx.map +1 -0
  123. package/dist/Form.js +99 -0
  124. package/dist/Form.js.map +1 -0
  125. package/dist/Form.jsx +73 -0
  126. package/dist/Form.jsx.map +1 -0
  127. package/dist/GridList.d.ts +34 -2
  128. package/dist/GridList.d.ts.map +1 -1
  129. package/dist/GridList.js +723 -0
  130. package/dist/GridList.js.map +1 -0
  131. package/dist/GridList.jsx +552 -0
  132. package/dist/GridList.jsx.map +1 -0
  133. package/dist/Icon.d.ts.map +1 -1
  134. package/dist/Icon.js +127 -0
  135. package/dist/Icon.js.map +1 -0
  136. package/dist/Icon.jsx +72 -0
  137. package/dist/Icon.jsx.map +1 -0
  138. package/dist/Keyboard.js +30 -0
  139. package/dist/Keyboard.js.map +1 -0
  140. package/dist/Keyboard.jsx +24 -0
  141. package/dist/Keyboard.jsx.map +1 -0
  142. package/dist/Landmark.js +134 -0
  143. package/dist/Landmark.js.map +1 -0
  144. package/dist/Landmark.jsx +118 -0
  145. package/dist/Landmark.jsx.map +1 -0
  146. package/dist/Link.d.ts.map +1 -1
  147. package/dist/Link.js +219 -0
  148. package/dist/Link.js.map +1 -0
  149. package/dist/Link.jsx +189 -0
  150. package/dist/Link.jsx.map +1 -0
  151. package/dist/ListBox.d.ts +2 -2
  152. package/dist/ListBox.d.ts.map +1 -1
  153. package/dist/ListBox.js +831 -0
  154. package/dist/ListBox.js.map +1 -0
  155. package/dist/ListBox.jsx +644 -0
  156. package/dist/ListBox.jsx.map +1 -0
  157. package/dist/Menu.d.ts +27 -9
  158. package/dist/Menu.d.ts.map +1 -1
  159. package/dist/Menu.js +1254 -0
  160. package/dist/Menu.js.map +1 -0
  161. package/dist/Menu.jsx +1042 -0
  162. package/dist/Menu.jsx.map +1 -0
  163. package/dist/Meter.d.ts.map +1 -1
  164. package/dist/Meter.js +123 -0
  165. package/dist/Meter.js.map +1 -0
  166. package/dist/Meter.jsx +107 -0
  167. package/dist/Meter.jsx.map +1 -0
  168. package/dist/Modal.d.ts.map +1 -1
  169. package/dist/Modal.js +382 -0
  170. package/dist/Modal.js.map +1 -0
  171. package/dist/Modal.jsx +314 -0
  172. package/dist/Modal.jsx.map +1 -0
  173. package/dist/NumberField.d.ts +3 -3
  174. package/dist/NumberField.d.ts.map +1 -1
  175. package/dist/NumberField.js +573 -0
  176. package/dist/NumberField.js.map +1 -0
  177. package/dist/NumberField.jsx +443 -0
  178. package/dist/NumberField.jsx.map +1 -0
  179. package/dist/Popover.d.ts +10 -2
  180. package/dist/Popover.d.ts.map +1 -1
  181. package/dist/Popover.js +471 -0
  182. package/dist/Popover.js.map +1 -0
  183. package/dist/Popover.jsx +354 -0
  184. package/dist/Popover.jsx.map +1 -0
  185. package/dist/Pressable.js +69 -0
  186. package/dist/Pressable.js.map +1 -0
  187. package/dist/Pressable.jsx +68 -0
  188. package/dist/Pressable.jsx.map +1 -0
  189. package/dist/ProgressBar.d.ts.map +1 -1
  190. package/dist/ProgressBar.js +130 -0
  191. package/dist/ProgressBar.js.map +1 -0
  192. package/dist/ProgressBar.jsx +114 -0
  193. package/dist/ProgressBar.jsx.map +1 -0
  194. package/dist/RadioGroup.d.ts +82 -4
  195. package/dist/RadioGroup.d.ts.map +1 -1
  196. package/dist/RadioGroup.js +931 -0
  197. package/dist/RadioGroup.js.map +1 -0
  198. package/dist/RadioGroup.jsx +681 -0
  199. package/dist/RadioGroup.jsx.map +1 -0
  200. package/dist/RangeCalendar.d.ts.map +1 -1
  201. package/dist/RangeCalendar.js +546 -0
  202. package/dist/RangeCalendar.js.map +1 -0
  203. package/dist/RangeCalendar.jsx +323 -0
  204. package/dist/RangeCalendar.jsx.map +1 -0
  205. package/dist/RouterProvider.js +118 -0
  206. package/dist/RouterProvider.js.map +1 -0
  207. package/dist/RouterProvider.jsx +112 -0
  208. package/dist/RouterProvider.jsx.map +1 -0
  209. package/dist/SearchField.d.ts +2 -2
  210. package/dist/SearchField.d.ts.map +1 -1
  211. package/dist/SearchField.js +667 -0
  212. package/dist/SearchField.js.map +1 -0
  213. package/dist/SearchField.jsx +550 -0
  214. package/dist/SearchField.jsx.map +1 -0
  215. package/dist/Select.d.ts +7 -0
  216. package/dist/Select.d.ts.map +1 -1
  217. package/dist/Select.js +1044 -0
  218. package/dist/Select.js.map +1 -0
  219. package/dist/Select.jsx +759 -0
  220. package/dist/Select.jsx.map +1 -0
  221. package/dist/SelectionIndicator.d.ts.map +1 -1
  222. package/dist/SelectionIndicator.js +86 -0
  223. package/dist/SelectionIndicator.js.map +1 -0
  224. package/dist/SelectionIndicator.jsx +50 -0
  225. package/dist/SelectionIndicator.jsx.map +1 -0
  226. package/dist/Separator.js +97 -0
  227. package/dist/Separator.js.map +1 -0
  228. package/dist/Separator.jsx +85 -0
  229. package/dist/Separator.jsx.map +1 -0
  230. package/dist/SharedElementTransition.d.ts.map +1 -1
  231. package/dist/SharedElementTransition.js +167 -0
  232. package/dist/SharedElementTransition.js.map +1 -0
  233. package/dist/SharedElementTransition.jsx +140 -0
  234. package/dist/SharedElementTransition.jsx.map +1 -0
  235. package/dist/Slider.d.ts +33 -1
  236. package/dist/Slider.d.ts.map +1 -1
  237. package/dist/Slider.js +515 -0
  238. package/dist/Slider.js.map +1 -0
  239. package/dist/Slider.jsx +403 -0
  240. package/dist/Slider.jsx.map +1 -0
  241. package/dist/StepList.d.ts.map +1 -1
  242. package/dist/StepList.js +191 -0
  243. package/dist/StepList.js.map +1 -0
  244. package/dist/StepList.jsx +136 -0
  245. package/dist/StepList.jsx.map +1 -0
  246. package/dist/Switch.d.ts +65 -2
  247. package/dist/Switch.d.ts.map +1 -1
  248. package/dist/Switch.js +534 -0
  249. package/dist/Switch.js.map +1 -0
  250. package/dist/Switch.jsx +393 -0
  251. package/dist/Switch.jsx.map +1 -0
  252. package/dist/Table.d.ts +50 -0
  253. package/dist/Table.d.ts.map +1 -1
  254. package/dist/Table.js +1766 -0
  255. package/dist/Table.js.map +1 -0
  256. package/dist/Table.jsx +1355 -0
  257. package/dist/Table.jsx.map +1 -0
  258. package/dist/Tabs.d.ts +0 -4
  259. package/dist/Tabs.d.ts.map +1 -1
  260. package/dist/Tabs.js +598 -0
  261. package/dist/Tabs.js.map +1 -0
  262. package/dist/Tabs.jsx +367 -0
  263. package/dist/Tabs.jsx.map +1 -0
  264. package/dist/TagGroup.d.ts +3 -1
  265. package/dist/TagGroup.d.ts.map +1 -1
  266. package/dist/TagGroup.js +382 -0
  267. package/dist/TagGroup.js.map +1 -0
  268. package/dist/TagGroup.jsx +273 -0
  269. package/dist/TagGroup.jsx.map +1 -0
  270. package/dist/Text.d.ts +18 -6
  271. package/dist/Text.d.ts.map +1 -1
  272. package/dist/Text.js +42 -0
  273. package/dist/Text.js.map +1 -0
  274. package/dist/Text.jsx +35 -0
  275. package/dist/Text.jsx.map +1 -0
  276. package/dist/TextField.d.ts +6 -6
  277. package/dist/TextField.d.ts.map +1 -1
  278. package/dist/TextField.js +439 -0
  279. package/dist/TextField.js.map +1 -0
  280. package/dist/TextField.jsx +406 -0
  281. package/dist/TextField.jsx.map +1 -0
  282. package/dist/TimeField.d.ts +17 -53
  283. package/dist/TimeField.d.ts.map +1 -1
  284. package/dist/TimeField.js +278 -0
  285. package/dist/TimeField.js.map +1 -0
  286. package/dist/TimeField.jsx +218 -0
  287. package/dist/TimeField.jsx.map +1 -0
  288. package/dist/Toast.d.ts +14 -0
  289. package/dist/Toast.d.ts.map +1 -1
  290. package/dist/Toast.js +551 -0
  291. package/dist/Toast.js.map +1 -0
  292. package/dist/Toast.jsx +361 -0
  293. package/dist/Toast.jsx.map +1 -0
  294. package/dist/ToggleButton.d.ts.map +1 -1
  295. package/dist/ToggleButton.js +123 -0
  296. package/dist/ToggleButton.js.map +1 -0
  297. package/dist/ToggleButton.jsx +88 -0
  298. package/dist/ToggleButton.jsx.map +1 -0
  299. package/dist/ToggleButtonGroup.d.ts.map +1 -1
  300. package/dist/ToggleButtonGroup.js +114 -0
  301. package/dist/ToggleButtonGroup.js.map +1 -0
  302. package/dist/ToggleButtonGroup.jsx +85 -0
  303. package/dist/ToggleButtonGroup.jsx.map +1 -0
  304. package/dist/Toolbar.js +112 -0
  305. package/dist/Toolbar.js.map +1 -0
  306. package/dist/Toolbar.jsx +92 -0
  307. package/dist/Toolbar.jsx.map +1 -0
  308. package/dist/Tooltip.d.ts.map +1 -1
  309. package/dist/Tooltip.js +539 -0
  310. package/dist/Tooltip.js.map +1 -0
  311. package/dist/Tooltip.jsx +465 -0
  312. package/dist/Tooltip.jsx.map +1 -0
  313. package/dist/Tree.d.ts +14 -2
  314. package/dist/Tree.d.ts.map +1 -1
  315. package/dist/Tree.js +1424 -0
  316. package/dist/Tree.js.map +1 -0
  317. package/dist/Tree.jsx +1172 -0
  318. package/dist/Tree.jsx.map +1 -0
  319. package/dist/Virtualizer.d.ts +16 -2
  320. package/dist/Virtualizer.d.ts.map +1 -1
  321. package/dist/Virtualizer.js +2 -0
  322. package/dist/Virtualizer.jsx +2 -0
  323. package/dist/Virtualizer2.js +751 -0
  324. package/dist/Virtualizer2.js.map +1 -0
  325. package/dist/Virtualizer2.jsx +730 -0
  326. package/dist/Virtualizer2.jsx.map +1 -0
  327. package/dist/VirtualizerLayouts.d.ts +18 -0
  328. package/dist/VirtualizerLayouts.d.ts.map +1 -1
  329. package/dist/VisuallyHidden.js +42 -0
  330. package/dist/VisuallyHidden.js.map +1 -0
  331. package/dist/VisuallyHidden.jsx +35 -0
  332. package/dist/VisuallyHidden.jsx.map +1 -0
  333. package/dist/contexts.js +33 -0
  334. package/dist/contexts.js.map +1 -0
  335. package/dist/contexts.jsx +33 -0
  336. package/dist/contexts.jsx.map +1 -0
  337. package/dist/index.d.ts +9 -9
  338. package/dist/index.d.ts.map +1 -1
  339. package/dist/index.js +69 -23932
  340. package/dist/index.jsx +69 -18337
  341. package/dist/useDragAndDrop.d.ts +0 -8
  342. package/dist/useDragAndDrop.d.ts.map +1 -1
  343. package/dist/useDragAndDrop.js +2 -0
  344. package/dist/useDragAndDrop.jsx +2 -0
  345. package/dist/useDragAndDrop2.js +399 -0
  346. package/dist/useDragAndDrop2.js.map +1 -0
  347. package/dist/useDragAndDrop2.jsx +399 -0
  348. package/dist/useDragAndDrop2.jsx.map +1 -0
  349. package/dist/utils.d.ts +84 -11
  350. package/dist/utils.d.ts.map +1 -1
  351. package/dist/utils.js +285 -0
  352. package/dist/utils.js.map +1 -0
  353. package/dist/utils.jsx +277 -0
  354. package/dist/utils.jsx.map +1 -0
  355. package/dist/virtualizer/Layout.js +144 -0
  356. package/dist/virtualizer/Layout.js.map +1 -0
  357. package/dist/virtualizer/Layout.jsx +144 -0
  358. package/dist/virtualizer/Layout.jsx.map +1 -0
  359. package/package.json +395 -4
  360. package/src/ActionBar.tsx +10 -12
  361. package/src/ActionGroup.tsx +5 -3
  362. package/src/Autocomplete.tsx +14 -9
  363. package/src/Breadcrumbs.tsx +58 -39
  364. package/src/Button.tsx +22 -2
  365. package/src/Calendar.tsx +57 -11
  366. package/src/CalendarPicker.tsx +73 -0
  367. package/src/Checkbox.tsx +539 -3
  368. package/src/Collection.tsx +9 -3
  369. package/src/Color.tsx +84 -41
  370. package/src/ComboBox.tsx +97 -21
  371. package/src/DateField.tsx +304 -53
  372. package/src/DatePicker.tsx +402 -62
  373. package/src/DateRangePickerContext.tsx +2 -0
  374. package/src/Dialog.tsx +13 -5
  375. package/src/Disclosure.tsx +7 -1
  376. package/src/DragAndDrop.tsx +3 -1
  377. package/src/DropZone.tsx +3 -1
  378. package/src/GridList.tsx +133 -26
  379. package/src/Icon.tsx +3 -1
  380. package/src/Link.tsx +3 -1
  381. package/src/ListBox.tsx +354 -25
  382. package/src/Menu.tsx +252 -128
  383. package/src/Meter.tsx +3 -1
  384. package/src/Modal.tsx +120 -56
  385. package/src/NumberField.tsx +51 -8
  386. package/src/Popover.tsx +68 -17
  387. package/src/ProgressBar.tsx +3 -1
  388. package/src/RadioGroup.tsx +468 -4
  389. package/src/RangeCalendar.tsx +123 -2
  390. package/src/SearchField.tsx +80 -4
  391. package/src/Select.tsx +122 -26
  392. package/src/SelectionIndicator.tsx +3 -1
  393. package/src/SharedElementTransition.tsx +95 -37
  394. package/src/Slider.tsx +159 -13
  395. package/src/StepList.tsx +0 -7
  396. package/src/Switch.tsx +395 -2
  397. package/src/Table.tsx +428 -99
  398. package/src/Tabs.tsx +17 -45
  399. package/src/TagGroup.tsx +29 -7
  400. package/src/Text.tsx +31 -10
  401. package/src/TextField.tsx +44 -6
  402. package/src/TimeField.tsx +127 -192
  403. package/src/Toast.tsx +79 -14
  404. package/src/ToggleButton.tsx +3 -1
  405. package/src/ToggleButtonGroup.tsx +3 -1
  406. package/src/Tooltip.tsx +3 -1
  407. package/src/Tree.tsx +91 -13
  408. package/src/Virtualizer.tsx +180 -31
  409. package/src/VirtualizerLayouts.ts +45 -10
  410. package/src/index.ts +51 -8
  411. package/src/useDragAndDrop.ts +8 -10
  412. package/src/utils.tsx +246 -30
  413. package/dist/HiddenTimeInput.d.ts +0 -25
  414. package/dist/HiddenTimeInput.d.ts.map +0 -1
  415. package/dist/index.js.map +0 -1
  416. package/dist/index.jsx.map +0 -1
  417. package/src/HiddenTimeInput.tsx +0 -133
package/src/DateField.tsx CHANGED
@@ -7,6 +7,7 @@
7
7
 
8
8
  import {
9
9
  type JSX,
10
+ type Context,
10
11
  createContext,
11
12
  createEffect,
12
13
  createMemo,
@@ -14,14 +15,25 @@ import {
14
15
  onCleanup,
15
16
  splitProps,
16
17
  useContext,
17
- For,
18
+ Index,
18
19
  Show,
19
20
  } from "solid-js";
20
21
  import {
21
22
  createDateField,
22
23
  createDateSegment,
24
+ createFocusRing,
25
+ createHover,
26
+ createVisuallyHidden,
27
+ mergeProps,
23
28
  type AriaDateFieldProps,
24
29
  } from "@proyecto-viviana/solidaria";
30
+ import {
31
+ parseDate,
32
+ parseDateTime,
33
+ toCalendarDate,
34
+ toCalendarDateTime,
35
+ toLocalTimeZone,
36
+ } from "@internationalized/date";
25
37
  import {
26
38
  createDateFieldState,
27
39
  access,
@@ -39,8 +51,9 @@ import {
39
51
  useRenderProps,
40
52
  dataAttr,
41
53
  useIsHydrated,
54
+ Provider,
42
55
  } from "./utils";
43
- import { HiddenDateInput } from "./HiddenDateInput";
56
+ import { TextContext } from "./Text";
44
57
  import { FormContext, type FormProps } from "./Form";
45
58
  import {
46
59
  DateRangePickerContext,
@@ -92,12 +105,20 @@ export interface DateInputProps extends SlotProps {
92
105
  }
93
106
 
94
107
  export interface DateSegmentRenderProps {
108
+ /** Whether the segment is hovered. */
109
+ isHovered: boolean;
95
110
  /** Whether the segment is focused. */
96
111
  isFocused: boolean;
97
- /** Whether the segment is editable. */
98
- isEditable: boolean;
112
+ /** Whether the segment is keyboard focused. */
113
+ isFocusVisible: boolean;
99
114
  /** Whether the segment is a placeholder. */
100
115
  isPlaceholder: boolean;
116
+ /** Whether the segment is read only. */
117
+ isReadOnly: boolean;
118
+ /** Whether the segment is disabled. */
119
+ isDisabled: boolean;
120
+ /** Whether the segment is invalid. */
121
+ isInvalid: boolean;
101
122
  /** The segment type. */
102
123
  type: DateSegmentType["type"];
103
124
  /** The text to display. */
@@ -120,6 +141,10 @@ export interface DateFieldContextValue {
120
141
  aria: {
121
142
  labelProps: Record<string, unknown>;
122
143
  inputProps: Record<string, unknown>;
144
+ // The hidden validation <input> props (native type/required/onChange). Only
145
+ // the standalone DateField provides these; DatePicker/DateRangePicker manage
146
+ // their own hidden inputs, so this stays optional and its <input> is gated.
147
+ hiddenInputProps?: Record<string, unknown>;
123
148
  descriptionProps: Record<string, unknown>;
124
149
  errorMessageProps: Record<string, unknown>;
125
150
  };
@@ -275,14 +300,37 @@ function DateFieldInner<T extends DateValue = CalendarDate>(
275
300
  );
276
301
 
277
302
  const [fieldRef, setFieldRef] = createSignal<HTMLDivElement | null>(null);
303
+ // Ref to the hidden validation <input> (the DateInput's `<Input>` sibling).
304
+ // RAC's DateField creates this ref, passes it to useDateField, and threads it
305
+ // onto the <Input> via InputContext so useFormReset/useFormValidation target
306
+ // that element. We mirror that: create it here, hand it to createDateField
307
+ // below, and attach it to the same input through the context getter.
308
+ const [validationInputRef, setValidationInputRef] =
309
+ createSignal<HTMLInputElement | null>(null);
278
310
 
279
311
  const state = createDateFieldState(stateProps);
280
312
 
281
313
  const fieldAria = createDateField(
282
314
  () => ({
283
315
  ...(rest as Record<string, unknown>),
316
+ // RAC threads the same props into both useDateFieldState and useDateField;
317
+ // these live in `stateProps` here, so forward them so the field hook can
318
+ // build aria-disabled and the native validation <input> (type/required).
319
+ // access() unwraps the MaybeAccessor state-prop declarations.
320
+ isDisabled: access(stateProps.isDisabled),
321
+ isReadOnly: access(stateProps.isReadOnly),
322
+ isRequired: access(stateProps.isRequired),
323
+ // Mirror RAC DateField: validationBehavior ?? formValidationBehavior ??
324
+ // 'native'. withFormValidationBehavior already folds the form default into
325
+ // stateProps.validationBehavior; the last `?? 'native'` is the standalone
326
+ // default that flips the hidden input to type="text".
327
+ validationBehavior: stateProps.validationBehavior ?? "native",
284
328
  description: stateProps.description,
285
329
  errorMessage: stateProps.errorMessage,
330
+ // Form-reset + native constraint validation are wired onto this input by
331
+ // createDateField (see its createFormReset/createFormValidation calls),
332
+ // exactly as RAC's useDateField wires them onto props.inputRef.
333
+ inputRef: () => validationInputRef() ?? undefined,
286
334
  }),
287
335
  state as unknown as DateFieldState<DateValue>,
288
336
  fieldRef,
@@ -304,27 +352,57 @@ function DateFieldInner<T extends DateValue = CalendarDate>(
304
352
  renderValues,
305
353
  );
306
354
 
307
- const validationBehavior = () =>
308
- (stateProps as { validationBehavior?: "aria" | "native" }).validationBehavior ??
309
- formContext?.validationBehavior ??
310
- "native";
355
+ const textSlots = {
356
+ slots: {
357
+ get description() {
358
+ return fieldAria.descriptionProps;
359
+ },
360
+ get errorMessage() {
361
+ return fieldAria.errorMessageProps;
362
+ },
363
+ },
364
+ };
311
365
 
312
366
  return (
313
367
  <DateFieldStateContext.Provider value={state as unknown as DateFieldState<DateValue>}>
314
368
  <DateFieldContext.Provider
315
369
  value={{
316
370
  state: state as unknown as DateFieldState<DateValue>,
371
+ // Read through getters so consumers see the LIVE memo values, not a
372
+ // snapshot frozen at first render. `createDescription` appends the
373
+ // value-description id via a deferred effect; the group's
374
+ // aria-describedby only picks it up if the props stay reactive here.
317
375
  aria: {
318
- labelProps: fieldAria.labelProps,
319
- inputProps: fieldAria.inputProps,
320
- descriptionProps: fieldAria.descriptionProps,
321
- errorMessageProps: fieldAria.errorMessageProps,
376
+ get labelProps() {
377
+ return fieldAria.labelProps;
378
+ },
379
+ // The segment group props (role="group", aria-labelledby, unicode-bidi
380
+ // isolate style, arrow-key nav, focus-within handlers) are routed to the
381
+ // DateInput element — mirroring RAC, where useDateField.fieldProps is
382
+ // published through GroupContext and consumed by the DateInput <Group>.
383
+ // The outer wrapper stays roleless.
384
+ get inputProps() {
385
+ return fieldAria.fieldProps;
386
+ },
387
+ // The REAL hidden validation input props (type/hidden/required/onChange
388
+ // under native validation). Rendered as the DateInput's <input> sibling.
389
+ // Thread the validation-input ref through here — mirroring RAC's
390
+ // `[InputContext, {...inputProps, ref: inputRef}]` — so createDateField's
391
+ // form-reset/validation wiring resolves to the mounted element.
392
+ get hiddenInputProps() {
393
+ return mergeProps(fieldAria.inputProps, { ref: setValidationInputRef });
394
+ },
395
+ get descriptionProps() {
396
+ return fieldAria.descriptionProps;
397
+ },
398
+ get errorMessageProps() {
399
+ return fieldAria.errorMessageProps;
400
+ },
322
401
  },
323
402
  }}
324
403
  >
325
404
  <div
326
405
  ref={setFieldRef}
327
- {...fieldAria.fieldProps}
328
406
  class={renderProps.class()}
329
407
  style={renderProps.style()}
330
408
  data-disabled={dataAttr(state.isDisabled())}
@@ -332,31 +410,125 @@ function DateFieldInner<T extends DateValue = CalendarDate>(
332
410
  data-required={dataAttr(state.isRequired())}
333
411
  data-invalid={dataAttr(state.isInvalid())}
334
412
  >
335
- {local.children as JSX.Element}
413
+ <Provider values={[[TextContext, textSlots]] as Array<[Context<unknown>, unknown]>}>
414
+ {local.children as JSX.Element}
415
+ </Provider>
336
416
  </div>
337
- <Show when={(rest as Record<string, unknown>).name}>
338
- <HiddenDateInput
339
- name={(rest as Record<string, unknown>).name as string | undefined}
340
- form={(rest as Record<string, unknown>).form as string | undefined}
341
- value={state.value()}
342
- autoComplete={(rest as Record<string, unknown>).autoComplete as string | undefined}
343
- isDisabled={state.isDisabled()}
344
- isRequired={state.isRequired()}
345
- validationBehavior={validationBehavior()}
346
- validationState={state}
347
- focus={() => {
348
- fieldRef()?.querySelector<HTMLElement>('[role="spinbutton"]')?.focus();
349
- }}
350
- minValue={access(stateProps.minValue) as DateValue | undefined}
351
- maxValue={access(stateProps.maxValue) as DateValue | undefined}
352
- granularity={state.granularity}
353
- />
354
- </Show>
417
+ {/*
418
+ RAC renders <HiddenDateInput> UNCONDITIONALLY at the DateField root
419
+ (react-aria-components DateField.mjs). It is NOT a validation input — it
420
+ is a clipped, aria-hidden, tabIndex={-1} native date input that mirrors
421
+ the value for browser autofill. Its `form=""` detaches it from form
422
+ submission (the DateInput's <Input> above is what submits), so it never
423
+ double-counts in FormData. It renders regardless of `name` — hence no
424
+ <Show> gate — which is why it appears in the focus trail as the trailing
425
+ tabindex="-1" element.
426
+ */}
427
+ <RootHiddenDateInput
428
+ autoComplete={(rest as Record<string, unknown>).autoComplete as string | undefined}
429
+ name={(rest as Record<string, unknown>).name as string | undefined}
430
+ isDisabled={state.isDisabled()}
431
+ state={state as unknown as DateFieldState<DateValue>}
432
+ />
355
433
  </DateFieldContext.Provider>
356
434
  </DateFieldStateContext.Provider>
357
435
  );
358
436
  }
359
437
 
438
+ const HIDDEN_DATE_SEGMENTS: readonly string[] = ["day", "month", "year"];
439
+ const HIDDEN_TIME_SEGMENTS: readonly string[] = ["hour", "minute", "second"];
440
+ const HIDDEN_GRANULARITY_MAP: Record<string, number> = { hour: 1, minute: 2, second: 3 };
441
+
442
+ interface RootHiddenDateInputProps {
443
+ autoComplete?: string;
444
+ name?: string;
445
+ isDisabled?: boolean;
446
+ state: DateFieldState<DateValue>;
447
+ }
448
+
449
+ /**
450
+ * The always-rendered hidden date input at the DateField root — a faithful port
451
+ * of react-aria-components' HiddenDateInput (private/HiddenDateInput.mjs). It is
452
+ * NOT a validation input: it is a clipped, aria-hidden, tabIndex={-1} native
453
+ * date input that mirrors the current value for browser autofill. `form=""`
454
+ * detaches it from form submission (the DateInput's <Input> submits), so it
455
+ * never double-counts in FormData. RAC renders it unconditionally, which is why
456
+ * it appears as the trailing tabindex="-1" element in the focus trail.
457
+ */
458
+ function RootHiddenDateInput(props: RootHiddenDateInputProps): JSX.Element {
459
+ // RAC uses useVisuallyHidden with position:fixed/top:0/left:0 to keep the
460
+ // clipped input from scrolling the page.
461
+ const { visuallyHiddenProps } = createVisuallyHidden(() => ({
462
+ style: { position: "fixed", top: "0", left: "0" },
463
+ }));
464
+
465
+ const granularity = () => props.state.granularity ?? "day";
466
+ const inputStep = () => {
467
+ const g = granularity();
468
+ if (g === "second") return 1;
469
+ if (g === "hour") return 3600;
470
+ return 60;
471
+ };
472
+ const inputType = () => (granularity() === "day" ? "date" : "datetime-local");
473
+ const dateValue = () => {
474
+ const value = props.state.value();
475
+ if (!value) return "";
476
+ if (granularity() === "day") return toCalendarDate(value).toString();
477
+ return toCalendarDateTime(
478
+ "timeZone" in value ? toLocalTimeZone(value) : value,
479
+ ).toString();
480
+ };
481
+
482
+ const onChange: JSX.EventHandler<HTMLInputElement, Event> = (event) => {
483
+ const targetString = (event.currentTarget.value ?? "").toString();
484
+ if (!targetString) return;
485
+ try {
486
+ const g = granularity();
487
+ const targetValue = (g === "day" ? parseDate(targetString) : parseDateTime(targetString)) as
488
+ unknown as Record<string, number>;
489
+ let timeSegments = HIDDEN_TIME_SEGMENTS;
490
+ if (HIDDEN_TIME_SEGMENTS.includes(g)) {
491
+ timeSegments = HIDDEN_TIME_SEGMENTS.slice(0, HIDDEN_GRANULARITY_MAP[g]);
492
+ }
493
+ const state = props.state as unknown as {
494
+ setSegment?: (type: string, value: number) => void;
495
+ setValue: (value: unknown) => void;
496
+ };
497
+ // Only DateFieldState (not DatePickerState) exposes setSegment; validate
498
+ // each parsed segment before committing the new value, mirroring RAC.
499
+ if (typeof state.setSegment === "function") {
500
+ for (const type in targetValue) {
501
+ if (HIDDEN_DATE_SEGMENTS.includes(type)) state.setSegment(type, targetValue[type]);
502
+ if (timeSegments.includes(type)) state.setSegment(type, targetValue[type]);
503
+ }
504
+ }
505
+ state.setValue(targetValue);
506
+ } catch {
507
+ // ignore unparseable autofill values
508
+ }
509
+ };
510
+
511
+ return (
512
+ <div
513
+ {...(visuallyHiddenProps() as unknown as Record<string, unknown>)}
514
+ aria-hidden="true"
515
+ data-testid="hidden-dateinput-container"
516
+ >
517
+ <input
518
+ tabIndex={-1}
519
+ autocomplete={props.autoComplete}
520
+ disabled={props.isDisabled}
521
+ type={inputType()}
522
+ form=""
523
+ name={props.name}
524
+ step={inputStep()}
525
+ value={dateValue()}
526
+ onChange={onChange}
527
+ />
528
+ </div>
529
+ );
530
+ }
531
+
360
532
  /**
361
533
  * The input area containing date segments.
362
534
  */
@@ -380,6 +552,20 @@ export function DateInput(props: DateInputProps): JSX.Element {
380
552
  renderValues,
381
553
  );
382
554
 
555
+ // The group props (role="group", aria-labelledby, unicode-bidi:isolate,
556
+ // arrow-key nav, focus-within handlers) carry the field's own `style` and
557
+ // focus handlers. Merge — not clobber — so the group keeps its unicode-bidi
558
+ // isolation and the local isFocused signal chains onto the field's
559
+ // focusWithin handlers. Solid onFocus/onBlur do not bubble, so track focus
560
+ // via onFocusIn/onFocusOut.
561
+ const inputDivProps = createMemo(() =>
562
+ mergeProps(aria.inputProps, {
563
+ onFocusIn: () => setIsFocused(true),
564
+ onFocusOut: () => setIsFocused(false),
565
+ style: renderProps.style(),
566
+ }),
567
+ );
568
+
383
569
  createEffect(() => {
384
570
  const element = inputRef();
385
571
  const handler = props.onPointerDownCapture;
@@ -395,16 +581,41 @@ export function DateInput(props: DateInputProps): JSX.Element {
395
581
  <DateFieldContext.Provider value={context as DateFieldContextValue}>
396
582
  <div
397
583
  ref={setInputRef}
398
- {...aria.inputProps}
584
+ {...inputDivProps()}
399
585
  class={renderProps.class()}
400
- style={renderProps.style()}
401
586
  data-disabled={dataAttr(state.isDisabled())}
402
587
  data-focused={dataAttr(isFocused())}
403
- onFocusIn={() => setIsFocused(true)}
404
- onFocusOut={() => setIsFocused(false)}
405
588
  >
406
- <For each={state.segments()}>{(segment) => props.children?.(segment)}</For>
589
+ {/*
590
+ <Index> keys by position, not identity, so each DateSegment instance
591
+ stays alive across keystrokes (state.segments() re-mints segment
592
+ objects every edit). A stable Proxy forwards property reads to the
593
+ live per-index accessor so the child stays reactive.
594
+ */}
595
+ <Index each={state.segments()}>
596
+ {(segment) => {
597
+ const liveSegment = new Proxy({} as DateSegmentType, {
598
+ get: (_t, key) => (segment() as unknown as Record<PropertyKey, unknown>)[key],
599
+ has: (_t, key) => key in (segment() as object),
600
+ });
601
+ return props.children?.(liveSegment);
602
+ }}
603
+ </Index>
407
604
  </div>
605
+ {/*
606
+ The hidden validation input, sibling of the group — mirrors RAC's
607
+ DateInputInner `<><Group/><Input/></>`. Under native validation
608
+ (default) `useDateField` publishes it as `type="text" hidden required`
609
+ so browser constraint validation fires; under aria validation it stays
610
+ `type="hidden"`. Both carry the ISO value string. Only the standalone
611
+ DateField supplies these props; inside a DatePicker/DateRangePicker the
612
+ field is presentation and its owner renders the hidden input instead.
613
+ */}
614
+ <Show when={aria.hiddenInputProps}>
615
+ {(hiddenInputProps) => (
616
+ <input {...(hiddenInputProps() as JSX.InputHTMLAttributes<HTMLInputElement>)} />
617
+ )}
618
+ </Show>
408
619
  </DateFieldContext.Provider>
409
620
  );
410
621
  }
@@ -416,19 +627,41 @@ export function DateSegment(props: DateSegmentProps): JSX.Element {
416
627
  const { state } = useDateFieldContext();
417
628
  const [segmentRef, setSegmentRef] = createSignal<HTMLElement | null>(null);
418
629
 
419
- const segmentAria = createDateSegment({ segment: props.segment }, state, segmentRef);
630
+ const segmentAria = createDateSegment(
631
+ {
632
+ get segment() {
633
+ return props.segment;
634
+ },
635
+ },
636
+ state,
637
+ segmentRef,
638
+ );
639
+
640
+ // Mirror upstream DateSegment: focus/focus-visible come from useFocusRing()
641
+ // and hover from useHover({isDisabled: field disabled || literal segment}).
642
+ // Literals never hover; the field being disabled suppresses hover entirely.
643
+ const { isFocused, isFocusVisible, focusProps } = createFocusRing();
644
+ const { isHovered, hoverProps } = createHover(() => ({
645
+ isDisabled: state.isDisabled() || props.segment.type === "literal",
646
+ }));
420
647
 
421
648
  const renderValues = createMemo<DateSegmentRenderProps>(() => ({
422
- isFocused: segmentAria.isFocused,
423
- isEditable: segmentAria.isEditable,
424
- isPlaceholder: segmentAria.isPlaceholder,
649
+ isHovered: isHovered(),
650
+ isFocused: isFocused(),
651
+ isFocusVisible: isFocusVisible(),
652
+ isPlaceholder: props.segment.isPlaceholder,
653
+ isReadOnly: state.isReadOnly(),
654
+ isDisabled: state.isDisabled(),
655
+ isInvalid: state.isInvalid(),
425
656
  type: props.segment.type,
426
- text: segmentAria.text,
657
+ text: props.segment.text,
427
658
  }));
428
659
 
429
660
  const renderProps = useRenderProps(
430
661
  {
431
- children: props.children,
662
+ get children() {
663
+ return props.children;
664
+ },
432
665
  class: props.class,
433
666
  style: props.style,
434
667
  defaultClassName: "solidaria-DateSegment",
@@ -441,19 +674,37 @@ export function DateSegment(props: DateSegmentProps): JSX.Element {
441
674
  if (typeof props.children === "function") {
442
675
  return renderProps.renderChildren();
443
676
  }
444
- return segmentAria.text;
677
+ return props.segment.text;
445
678
  };
446
679
 
680
+ // Mirror upstream's `mergeProps(filterDOMProps(otherProps), segmentProps,
681
+ // focusProps, hoverProps)`: the segment's behavior/style props (caretColor +
682
+ // RTL direction) chain with the focus-ring and hover handlers so neither
683
+ // clobbers the other.
684
+ const segmentElementProps = createMemo(() =>
685
+ mergeProps(
686
+ segmentAria.segmentProps,
687
+ focusProps as Record<string, unknown>,
688
+ hoverProps as Record<string, unknown>,
689
+ {
690
+ style: renderProps.style(),
691
+ },
692
+ ),
693
+ );
694
+
447
695
  return (
448
696
  <span
449
697
  ref={setSegmentRef}
450
- {...segmentAria.segmentProps}
698
+ {...segmentElementProps()}
451
699
  class={renderProps.class()}
452
- style={renderProps.style()}
453
- data-focused={dataAttr(segmentAria.isFocused)}
454
- data-editable={dataAttr(segmentAria.isEditable)}
455
- data-placeholder={dataAttr(segmentAria.isPlaceholder)}
700
+ data-placeholder={props.segment.isPlaceholder || undefined}
701
+ data-invalid={state.isInvalid() || undefined}
702
+ data-readonly={state.isReadOnly() || undefined}
703
+ data-disabled={state.isDisabled() || undefined}
456
704
  data-type={props.segment.type}
705
+ data-hovered={isHovered() || undefined}
706
+ data-focused={isFocused() || undefined}
707
+ data-focus-visible={isFocusVisible() || undefined}
457
708
  >
458
709
  {getChildren()}
459
710
  </span>
@@ -482,9 +733,9 @@ export interface DateFieldDescriptionProps {
482
733
  export function DateFieldDescription(props: DateFieldDescriptionProps): JSX.Element {
483
734
  const { aria } = useDateFieldContext();
484
735
  return (
485
- <p {...aria.descriptionProps} class={props.class}>
736
+ <span {...aria.descriptionProps} class={props.class}>
486
737
  {props.children}
487
- </p>
738
+ </span>
488
739
  );
489
740
  }
490
741
 
@@ -496,9 +747,9 @@ export interface DateFieldErrorMessageProps {
496
747
  export function DateFieldErrorMessage(props: DateFieldErrorMessageProps): JSX.Element {
497
748
  const { aria } = useDateFieldContext();
498
749
  return (
499
- <p {...aria.errorMessageProps} class={props.class}>
750
+ <span {...aria.errorMessageProps} class={props.class}>
500
751
  {props.children}
501
- </p>
752
+ </span>
502
753
  );
503
754
  }
504
755