@proyecto-viviana/solidaria-components 0.3.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (398) hide show
  1. package/dist/ActionBar.js +184 -0
  2. package/dist/ActionBar.js.map +1 -0
  3. package/dist/ActionBar.jsx +128 -0
  4. package/dist/ActionBar.jsx.map +1 -0
  5. package/dist/ActionGroup.js +179 -0
  6. package/dist/ActionGroup.js.map +1 -0
  7. package/dist/ActionGroup.jsx +129 -0
  8. package/dist/ActionGroup.jsx.map +1 -0
  9. package/dist/Alert.js +111 -0
  10. package/dist/Alert.js.map +1 -0
  11. package/dist/Alert.jsx +82 -0
  12. package/dist/Alert.jsx.map +1 -0
  13. package/dist/Autocomplete.js +130 -0
  14. package/dist/Autocomplete.js.map +1 -0
  15. package/dist/Autocomplete.jsx +116 -0
  16. package/dist/Autocomplete.jsx.map +1 -0
  17. package/dist/Breadcrumbs.d.ts.map +1 -1
  18. package/dist/Breadcrumbs.js +334 -0
  19. package/dist/Breadcrumbs.js.map +1 -0
  20. package/dist/Breadcrumbs.jsx +266 -0
  21. package/dist/Breadcrumbs.jsx.map +1 -0
  22. package/dist/Button.d.ts.map +1 -1
  23. package/dist/Button.js +348 -0
  24. package/dist/Button.js.map +1 -0
  25. package/dist/Button.jsx +314 -0
  26. package/dist/Button.jsx.map +1 -0
  27. package/dist/Calendar.d.ts +4 -4
  28. package/dist/Calendar.d.ts.map +1 -1
  29. package/dist/Calendar.js +538 -0
  30. package/dist/Calendar.js.map +1 -0
  31. package/dist/Calendar.jsx +333 -0
  32. package/dist/Calendar.jsx.map +1 -0
  33. package/dist/CalendarPicker.d.ts +33 -0
  34. package/dist/CalendarPicker.d.ts.map +1 -0
  35. package/dist/CalendarPicker.js +44 -0
  36. package/dist/CalendarPicker.js.map +1 -0
  37. package/dist/CalendarPicker.jsx +44 -0
  38. package/dist/CalendarPicker.jsx.map +1 -0
  39. package/dist/Checkbox.d.ts +83 -4
  40. package/dist/Checkbox.d.ts.map +1 -1
  41. package/dist/Checkbox.js +923 -0
  42. package/dist/Checkbox.js.map +1 -0
  43. package/dist/Checkbox.jsx +707 -0
  44. package/dist/Checkbox.jsx.map +1 -0
  45. package/dist/Collection.d.ts.map +1 -1
  46. package/dist/Collection.js +202 -0
  47. package/dist/Collection.js.map +1 -0
  48. package/dist/Collection.jsx +152 -0
  49. package/dist/Collection.jsx.map +1 -0
  50. package/dist/Color.d.ts.map +1 -1
  51. package/dist/Color.js +1720 -0
  52. package/dist/Color.js.map +1 -0
  53. package/dist/Color.jsx +1344 -0
  54. package/dist/Color.jsx.map +1 -0
  55. package/dist/ColorEditor.js +208 -0
  56. package/dist/ColorEditor.js.map +1 -0
  57. package/dist/ColorEditor.jsx +120 -0
  58. package/dist/ColorEditor.jsx.map +1 -0
  59. package/dist/ComboBox.d.ts +4 -4
  60. package/dist/ComboBox.d.ts.map +1 -1
  61. package/dist/ComboBox.js +992 -0
  62. package/dist/ComboBox.js.map +1 -0
  63. package/dist/ComboBox.jsx +714 -0
  64. package/dist/ComboBox.jsx.map +1 -0
  65. package/dist/ContextualHelpTrigger.js +146 -0
  66. package/dist/ContextualHelpTrigger.js.map +1 -0
  67. package/dist/ContextualHelpTrigger.jsx +109 -0
  68. package/dist/ContextualHelpTrigger.jsx.map +1 -0
  69. package/dist/DateField.d.ts +3 -3
  70. package/dist/DateField.d.ts.map +1 -1
  71. package/dist/DateField.js +4 -0
  72. package/dist/DateField.jsx +4 -0
  73. package/dist/DateField2.js +499 -0
  74. package/dist/DateField2.js.map +1 -0
  75. package/dist/DateField2.jsx +317 -0
  76. package/dist/DateField2.jsx.map +1 -0
  77. package/dist/DatePicker.d.ts +4 -4
  78. package/dist/DatePicker.d.ts.map +1 -1
  79. package/dist/DatePicker.js +991 -0
  80. package/dist/DatePicker.js.map +1 -0
  81. package/dist/DatePicker.jsx +682 -0
  82. package/dist/DatePicker.jsx.map +1 -0
  83. package/dist/Dialog.d.ts.map +1 -1
  84. package/dist/Dialog.js +337 -0
  85. package/dist/Dialog.js.map +1 -0
  86. package/dist/Dialog.jsx +192 -0
  87. package/dist/Dialog.jsx.map +1 -0
  88. package/dist/Disclosure.d.ts.map +1 -1
  89. package/dist/Disclosure.js +328 -0
  90. package/dist/Disclosure.js.map +1 -0
  91. package/dist/Disclosure.jsx +230 -0
  92. package/dist/Disclosure.jsx.map +1 -0
  93. package/dist/DragAndDrop.d.ts.map +1 -1
  94. package/dist/DragAndDrop.js +176 -0
  95. package/dist/DragAndDrop.js.map +1 -0
  96. package/dist/DragAndDrop.jsx +160 -0
  97. package/dist/DragAndDrop.jsx.map +1 -0
  98. package/dist/DropZone.d.ts.map +1 -1
  99. package/dist/DropZone.js +189 -0
  100. package/dist/DropZone.js.map +1 -0
  101. package/dist/DropZone.jsx +144 -0
  102. package/dist/DropZone.jsx.map +1 -0
  103. package/dist/FieldError.js +66 -0
  104. package/dist/FieldError.js.map +1 -0
  105. package/dist/FieldError.jsx +47 -0
  106. package/dist/FieldError.jsx.map +1 -0
  107. package/dist/FileTrigger.js +79 -0
  108. package/dist/FileTrigger.js.map +1 -0
  109. package/dist/FileTrigger.jsx +49 -0
  110. package/dist/FileTrigger.jsx.map +1 -0
  111. package/dist/Focusable.js +70 -0
  112. package/dist/Focusable.js.map +1 -0
  113. package/dist/Focusable.jsx +69 -0
  114. package/dist/Focusable.jsx.map +1 -0
  115. package/dist/Form.js +99 -0
  116. package/dist/Form.js.map +1 -0
  117. package/dist/Form.jsx +73 -0
  118. package/dist/Form.jsx.map +1 -0
  119. package/dist/GridList.d.ts +34 -2
  120. package/dist/GridList.d.ts.map +1 -1
  121. package/dist/GridList.js +723 -0
  122. package/dist/GridList.js.map +1 -0
  123. package/dist/GridList.jsx +552 -0
  124. package/dist/GridList.jsx.map +1 -0
  125. package/dist/HiddenTimeInput.js +104 -0
  126. package/dist/HiddenTimeInput.js.map +1 -0
  127. package/dist/HiddenTimeInput.jsx +69 -0
  128. package/dist/HiddenTimeInput.jsx.map +1 -0
  129. package/dist/Icon.d.ts.map +1 -1
  130. package/dist/Icon.js +127 -0
  131. package/dist/Icon.js.map +1 -0
  132. package/dist/Icon.jsx +72 -0
  133. package/dist/Icon.jsx.map +1 -0
  134. package/dist/Keyboard.js +30 -0
  135. package/dist/Keyboard.js.map +1 -0
  136. package/dist/Keyboard.jsx +24 -0
  137. package/dist/Keyboard.jsx.map +1 -0
  138. package/dist/Landmark.js +134 -0
  139. package/dist/Landmark.js.map +1 -0
  140. package/dist/Landmark.jsx +118 -0
  141. package/dist/Landmark.jsx.map +1 -0
  142. package/dist/Link.d.ts.map +1 -1
  143. package/dist/Link.js +219 -0
  144. package/dist/Link.js.map +1 -0
  145. package/dist/Link.jsx +189 -0
  146. package/dist/Link.jsx.map +1 -0
  147. package/dist/ListBox.d.ts.map +1 -1
  148. package/dist/ListBox.js +670 -0
  149. package/dist/ListBox.js.map +1 -0
  150. package/dist/ListBox.jsx +508 -0
  151. package/dist/ListBox.jsx.map +1 -0
  152. package/dist/Menu.d.ts +27 -9
  153. package/dist/Menu.d.ts.map +1 -1
  154. package/dist/Menu.js +1254 -0
  155. package/dist/Menu.js.map +1 -0
  156. package/dist/Menu.jsx +1042 -0
  157. package/dist/Menu.jsx.map +1 -0
  158. package/dist/Meter.d.ts.map +1 -1
  159. package/dist/Meter.js +123 -0
  160. package/dist/Meter.js.map +1 -0
  161. package/dist/Meter.jsx +107 -0
  162. package/dist/Meter.jsx.map +1 -0
  163. package/dist/Modal.d.ts.map +1 -1
  164. package/dist/Modal.js +380 -0
  165. package/dist/Modal.js.map +1 -0
  166. package/dist/Modal.jsx +314 -0
  167. package/dist/Modal.jsx.map +1 -0
  168. package/dist/NumberField.d.ts +3 -3
  169. package/dist/NumberField.d.ts.map +1 -1
  170. package/dist/NumberField.js +573 -0
  171. package/dist/NumberField.js.map +1 -0
  172. package/dist/NumberField.jsx +443 -0
  173. package/dist/NumberField.jsx.map +1 -0
  174. package/dist/Popover.d.ts +10 -2
  175. package/dist/Popover.d.ts.map +1 -1
  176. package/dist/Popover.js +464 -0
  177. package/dist/Popover.js.map +1 -0
  178. package/dist/Popover.jsx +333 -0
  179. package/dist/Popover.jsx.map +1 -0
  180. package/dist/Pressable.js +69 -0
  181. package/dist/Pressable.js.map +1 -0
  182. package/dist/Pressable.jsx +68 -0
  183. package/dist/Pressable.jsx.map +1 -0
  184. package/dist/ProgressBar.d.ts.map +1 -1
  185. package/dist/ProgressBar.js +130 -0
  186. package/dist/ProgressBar.js.map +1 -0
  187. package/dist/ProgressBar.jsx +114 -0
  188. package/dist/ProgressBar.jsx.map +1 -0
  189. package/dist/RadioGroup.d.ts +82 -4
  190. package/dist/RadioGroup.d.ts.map +1 -1
  191. package/dist/RadioGroup.js +931 -0
  192. package/dist/RadioGroup.js.map +1 -0
  193. package/dist/RadioGroup.jsx +681 -0
  194. package/dist/RadioGroup.jsx.map +1 -0
  195. package/dist/RangeCalendar.d.ts.map +1 -1
  196. package/dist/RangeCalendar.js +410 -0
  197. package/dist/RangeCalendar.js.map +1 -0
  198. package/dist/RangeCalendar.jsx +253 -0
  199. package/dist/RangeCalendar.jsx.map +1 -0
  200. package/dist/RouterProvider.js +118 -0
  201. package/dist/RouterProvider.js.map +1 -0
  202. package/dist/RouterProvider.jsx +112 -0
  203. package/dist/RouterProvider.jsx.map +1 -0
  204. package/dist/SearchField.d.ts +2 -2
  205. package/dist/SearchField.d.ts.map +1 -1
  206. package/dist/SearchField.js +643 -0
  207. package/dist/SearchField.js.map +1 -0
  208. package/dist/SearchField.jsx +526 -0
  209. package/dist/SearchField.jsx.map +1 -0
  210. package/dist/Select.d.ts.map +1 -1
  211. package/dist/Select.js +1031 -0
  212. package/dist/Select.js.map +1 -0
  213. package/dist/Select.jsx +744 -0
  214. package/dist/Select.jsx.map +1 -0
  215. package/dist/SelectionIndicator.d.ts.map +1 -1
  216. package/dist/SelectionIndicator.js +86 -0
  217. package/dist/SelectionIndicator.js.map +1 -0
  218. package/dist/SelectionIndicator.jsx +50 -0
  219. package/dist/SelectionIndicator.jsx.map +1 -0
  220. package/dist/Separator.js +97 -0
  221. package/dist/Separator.js.map +1 -0
  222. package/dist/Separator.jsx +85 -0
  223. package/dist/Separator.jsx.map +1 -0
  224. package/dist/SharedElementTransition.d.ts.map +1 -1
  225. package/dist/SharedElementTransition.js +165 -0
  226. package/dist/SharedElementTransition.js.map +1 -0
  227. package/dist/SharedElementTransition.jsx +138 -0
  228. package/dist/SharedElementTransition.jsx.map +1 -0
  229. package/dist/Slider.d.ts +33 -1
  230. package/dist/Slider.d.ts.map +1 -1
  231. package/dist/Slider.js +515 -0
  232. package/dist/Slider.js.map +1 -0
  233. package/dist/Slider.jsx +403 -0
  234. package/dist/Slider.jsx.map +1 -0
  235. package/dist/StepList.js +198 -0
  236. package/dist/StepList.js.map +1 -0
  237. package/dist/StepList.jsx +141 -0
  238. package/dist/StepList.jsx.map +1 -0
  239. package/dist/Switch.d.ts +65 -2
  240. package/dist/Switch.d.ts.map +1 -1
  241. package/dist/Switch.js +534 -0
  242. package/dist/Switch.js.map +1 -0
  243. package/dist/Switch.jsx +393 -0
  244. package/dist/Switch.jsx.map +1 -0
  245. package/dist/Table.d.ts +48 -0
  246. package/dist/Table.d.ts.map +1 -1
  247. package/dist/Table.js +1759 -0
  248. package/dist/Table.js.map +1 -0
  249. package/dist/Table.jsx +1348 -0
  250. package/dist/Table.jsx.map +1 -0
  251. package/dist/Tabs.d.ts +0 -4
  252. package/dist/Tabs.d.ts.map +1 -1
  253. package/dist/Tabs.js +595 -0
  254. package/dist/Tabs.js.map +1 -0
  255. package/dist/Tabs.jsx +367 -0
  256. package/dist/Tabs.jsx.map +1 -0
  257. package/dist/TagGroup.d.ts.map +1 -1
  258. package/dist/TagGroup.js +378 -0
  259. package/dist/TagGroup.js.map +1 -0
  260. package/dist/TagGroup.jsx +270 -0
  261. package/dist/TagGroup.jsx.map +1 -0
  262. package/dist/Text.d.ts +18 -6
  263. package/dist/Text.d.ts.map +1 -1
  264. package/dist/Text.js +42 -0
  265. package/dist/Text.js.map +1 -0
  266. package/dist/Text.jsx +35 -0
  267. package/dist/Text.jsx.map +1 -0
  268. package/dist/TextField.d.ts +6 -6
  269. package/dist/TextField.d.ts.map +1 -1
  270. package/dist/TextField.js +436 -0
  271. package/dist/TextField.js.map +1 -0
  272. package/dist/TextField.jsx +403 -0
  273. package/dist/TextField.jsx.map +1 -0
  274. package/dist/TimeField.d.ts +3 -3
  275. package/dist/TimeField.d.ts.map +1 -1
  276. package/dist/TimeField.js +372 -0
  277. package/dist/TimeField.js.map +1 -0
  278. package/dist/TimeField.jsx +224 -0
  279. package/dist/TimeField.jsx.map +1 -0
  280. package/dist/Toast.d.ts +14 -0
  281. package/dist/Toast.d.ts.map +1 -1
  282. package/dist/Toast.js +551 -0
  283. package/dist/Toast.js.map +1 -0
  284. package/dist/Toast.jsx +361 -0
  285. package/dist/Toast.jsx.map +1 -0
  286. package/dist/ToggleButton.d.ts.map +1 -1
  287. package/dist/ToggleButton.js +123 -0
  288. package/dist/ToggleButton.js.map +1 -0
  289. package/dist/ToggleButton.jsx +88 -0
  290. package/dist/ToggleButton.jsx.map +1 -0
  291. package/dist/ToggleButtonGroup.d.ts.map +1 -1
  292. package/dist/ToggleButtonGroup.js +114 -0
  293. package/dist/ToggleButtonGroup.js.map +1 -0
  294. package/dist/ToggleButtonGroup.jsx +85 -0
  295. package/dist/ToggleButtonGroup.jsx.map +1 -0
  296. package/dist/Toolbar.js +112 -0
  297. package/dist/Toolbar.js.map +1 -0
  298. package/dist/Toolbar.jsx +92 -0
  299. package/dist/Toolbar.jsx.map +1 -0
  300. package/dist/Tooltip.d.ts.map +1 -1
  301. package/dist/Tooltip.js +539 -0
  302. package/dist/Tooltip.js.map +1 -0
  303. package/dist/Tooltip.jsx +465 -0
  304. package/dist/Tooltip.jsx.map +1 -0
  305. package/dist/Tree.d.ts +14 -2
  306. package/dist/Tree.d.ts.map +1 -1
  307. package/dist/Tree.js +1424 -0
  308. package/dist/Tree.js.map +1 -0
  309. package/dist/Tree.jsx +1172 -0
  310. package/dist/Tree.jsx.map +1 -0
  311. package/dist/Virtualizer.d.ts +16 -2
  312. package/dist/Virtualizer.d.ts.map +1 -1
  313. package/dist/Virtualizer.js +2 -0
  314. package/dist/Virtualizer.jsx +2 -0
  315. package/dist/Virtualizer2.js +751 -0
  316. package/dist/Virtualizer2.js.map +1 -0
  317. package/dist/Virtualizer2.jsx +730 -0
  318. package/dist/Virtualizer2.jsx.map +1 -0
  319. package/dist/VirtualizerLayouts.d.ts +18 -0
  320. package/dist/VirtualizerLayouts.d.ts.map +1 -1
  321. package/dist/VisuallyHidden.js +42 -0
  322. package/dist/VisuallyHidden.js.map +1 -0
  323. package/dist/VisuallyHidden.jsx +35 -0
  324. package/dist/VisuallyHidden.jsx.map +1 -0
  325. package/dist/contexts.js +33 -0
  326. package/dist/contexts.js.map +1 -0
  327. package/dist/contexts.jsx +33 -0
  328. package/dist/contexts.jsx.map +1 -0
  329. package/dist/index.d.ts +7 -6
  330. package/dist/index.d.ts.map +1 -1
  331. package/dist/index.js +70 -23932
  332. package/dist/index.jsx +70 -18337
  333. package/dist/useDragAndDrop.js +2 -0
  334. package/dist/useDragAndDrop.jsx +2 -0
  335. package/dist/useDragAndDrop2.js +395 -0
  336. package/dist/useDragAndDrop2.js.map +1 -0
  337. package/dist/useDragAndDrop2.jsx +395 -0
  338. package/dist/useDragAndDrop2.jsx.map +1 -0
  339. package/dist/utils.d.ts +83 -11
  340. package/dist/utils.d.ts.map +1 -1
  341. package/dist/utils.js +285 -0
  342. package/dist/utils.js.map +1 -0
  343. package/dist/utils.jsx +277 -0
  344. package/dist/utils.jsx.map +1 -0
  345. package/dist/virtualizer/Layout.js +144 -0
  346. package/dist/virtualizer/Layout.js.map +1 -0
  347. package/dist/virtualizer/Layout.jsx +144 -0
  348. package/dist/virtualizer/Layout.jsx.map +1 -0
  349. package/package.json +401 -4
  350. package/src/Breadcrumbs.tsx +3 -1
  351. package/src/Button.tsx +22 -2
  352. package/src/Calendar.tsx +27 -10
  353. package/src/CalendarPicker.tsx +73 -0
  354. package/src/Checkbox.tsx +539 -3
  355. package/src/Collection.tsx +9 -3
  356. package/src/Color.tsx +42 -14
  357. package/src/ComboBox.tsx +50 -6
  358. package/src/DateField.tsx +20 -2
  359. package/src/DatePicker.tsx +57 -5
  360. package/src/Dialog.tsx +13 -5
  361. package/src/Disclosure.tsx +3 -1
  362. package/src/DragAndDrop.tsx +3 -1
  363. package/src/DropZone.tsx +3 -1
  364. package/src/GridList.tsx +125 -24
  365. package/src/Icon.tsx +3 -1
  366. package/src/Link.tsx +3 -1
  367. package/src/ListBox.tsx +31 -4
  368. package/src/Menu.tsx +252 -128
  369. package/src/Meter.tsx +3 -1
  370. package/src/Modal.tsx +100 -52
  371. package/src/NumberField.tsx +51 -8
  372. package/src/Popover.tsx +40 -10
  373. package/src/ProgressBar.tsx +3 -1
  374. package/src/RadioGroup.tsx +468 -4
  375. package/src/RangeCalendar.tsx +3 -1
  376. package/src/SearchField.tsx +27 -3
  377. package/src/Select.tsx +22 -7
  378. package/src/SelectionIndicator.tsx +3 -1
  379. package/src/SharedElementTransition.tsx +3 -1
  380. package/src/Slider.tsx +159 -13
  381. package/src/Switch.tsx +395 -2
  382. package/src/Table.tsx +409 -95
  383. package/src/Tabs.tsx +16 -45
  384. package/src/TagGroup.tsx +3 -1
  385. package/src/Text.tsx +31 -10
  386. package/src/TextField.tsx +43 -5
  387. package/src/TimeField.tsx +20 -2
  388. package/src/Toast.tsx +79 -14
  389. package/src/ToggleButton.tsx +3 -1
  390. package/src/ToggleButtonGroup.tsx +3 -1
  391. package/src/Tooltip.tsx +3 -1
  392. package/src/Tree.tsx +77 -9
  393. package/src/Virtualizer.tsx +180 -31
  394. package/src/VirtualizerLayouts.ts +45 -10
  395. package/src/index.ts +50 -0
  396. package/src/utils.tsx +243 -27
  397. package/dist/index.js.map +0 -1
  398. package/dist/index.jsx.map +0 -1
@@ -0,0 +1,372 @@
1
+ import { Provider, dataAttr, useIsHydrated, useRenderProps } from "./utils.js";
2
+ import { TextContext } from "./Text.js";
3
+ import { FormContext } from "./Form.js";
4
+ import { HiddenTimeInput } from "./HiddenTimeInput.js";
5
+ import { createComponent, getNextElement, insert, mergeProps, runHydrationEvents, spread, template, use } from "solid-js/web";
6
+ import { For, Show, createContext, createMemo, createSignal, splitProps, useContext } from "solid-js";
7
+ import { createTimeField, createTimeSegment } from "@proyecto-viviana/solidaria";
8
+ import { access, createTimeFieldState } from "@proyecto-viviana/solid-stately";
9
+ //#region src/TimeField.tsx
10
+ /**
11
+ * TimeField component for solidaria-components
12
+ *
13
+ * Pre-wired headless time field component with segment-based editing.
14
+ * Port of react-aria-components/src/TimeField.tsx
15
+ */
16
+ var _tmpl$ = /*#__PURE__*/ template(`<div class="solidaria-TimeField solidaria-TimeField--placeholder"aria-hidden=true>`), _tmpl$2 = /*#__PURE__*/ template(`<div>`), _tmpl$3 = /*#__PURE__*/ template(`<span>`), _tmpl$4 = /*#__PURE__*/ template(`<p>`);
17
+ const TimeFieldContext = createContext(null);
18
+ const TimeFieldStateContext = createContext(null);
19
+ function withFormValidationBehavior(props, formContext) {
20
+ if (!formContext?.validationBehavior) return props;
21
+ return new Proxy(props, {
22
+ get(target, property, receiver) {
23
+ const localValue = Reflect.get(target, property, receiver);
24
+ if (property === "validationBehavior" && localValue === void 0) return formContext.validationBehavior;
25
+ return localValue;
26
+ },
27
+ has(target, property) {
28
+ return Reflect.has(target, property) || property === "validationBehavior" && formContext.validationBehavior !== void 0;
29
+ },
30
+ ownKeys(target) {
31
+ const keys = new Set(Reflect.ownKeys(target));
32
+ if (formContext.validationBehavior !== void 0) keys.add("validationBehavior");
33
+ return Array.from(keys);
34
+ },
35
+ getOwnPropertyDescriptor(target, property) {
36
+ const descriptor = Reflect.getOwnPropertyDescriptor(target, property);
37
+ if (descriptor) return descriptor;
38
+ if (property === "validationBehavior" && formContext.validationBehavior !== void 0) return {
39
+ enumerable: true,
40
+ configurable: true,
41
+ get: () => formContext.validationBehavior
42
+ };
43
+ }
44
+ });
45
+ }
46
+ function useTimeFieldContextValue() {
47
+ const context = useContext(TimeFieldContext);
48
+ if (!context) throw new Error("TimeField components must be used within a TimeField");
49
+ return context;
50
+ }
51
+ function useTimeFieldContext() {
52
+ return useTimeFieldContextValue().state;
53
+ }
54
+ /**
55
+ * A time field allows users to enter and edit time values using a keyboard.
56
+ *
57
+ * @example
58
+ * ```tsx
59
+ * <TimeField label="Time">
60
+ * <Label>Time</Label>
61
+ * <TimeInput>
62
+ * {(segment) => <TimeSegment segment={segment} />}
63
+ * </TimeInput>
64
+ * </TimeField>
65
+ * ```
66
+ */
67
+ function TimeField(props) {
68
+ const isHydrated = useIsHydrated();
69
+ const formContext = useContext(FormContext);
70
+ return createComponent(Show, {
71
+ get when() {
72
+ return isHydrated();
73
+ },
74
+ get fallback() {
75
+ return getNextElement(_tmpl$);
76
+ },
77
+ get children() {
78
+ return createComponent(TimeFieldInner, mergeProps(props, { __formContext: formContext }));
79
+ }
80
+ });
81
+ }
82
+ /**
83
+ * Internal TimeField component that renders after client mount.
84
+ */
85
+ function TimeFieldInner(props) {
86
+ const formContext = props.__formContext ?? useContext(FormContext);
87
+ const [local, stateProps, rest] = splitProps(withFormValidationBehavior(props, formContext), [
88
+ "children",
89
+ "class",
90
+ "style",
91
+ "slot",
92
+ "__formContext"
93
+ ], [
94
+ "value",
95
+ "defaultValue",
96
+ "onChange",
97
+ "minValue",
98
+ "maxValue",
99
+ "isInvalid",
100
+ "isDisabled",
101
+ "isReadOnly",
102
+ "isRequired",
103
+ "locale",
104
+ "granularity",
105
+ "hourCycle",
106
+ "shouldForceLeadingZeros",
107
+ "validationState",
108
+ "validationBehavior",
109
+ "validate",
110
+ "description",
111
+ "errorMessage",
112
+ "placeholderValue"
113
+ ]);
114
+ const [fieldRef, setFieldRef] = createSignal(null);
115
+ const state = createTimeFieldState(stateProps);
116
+ const fieldAria = createTimeField(() => ({
117
+ ...rest,
118
+ description: stateProps.description,
119
+ errorMessage: stateProps.errorMessage
120
+ }), state, fieldRef);
121
+ const renderValues = createMemo(() => ({
122
+ isDisabled: state.isDisabled(),
123
+ isReadOnly: state.isReadOnly(),
124
+ isRequired: state.isRequired(),
125
+ isInvalid: state.isInvalid()
126
+ }));
127
+ const renderProps = useRenderProps({
128
+ class: local.class,
129
+ style: local.style,
130
+ defaultClassName: "solidaria-TimeField"
131
+ }, renderValues);
132
+ const validationBehavior = () => stateProps.validationBehavior ?? formContext?.validationBehavior ?? "native";
133
+ const textSlots = { slots: {
134
+ get description() {
135
+ return fieldAria.descriptionProps;
136
+ },
137
+ get errorMessage() {
138
+ return fieldAria.errorMessageProps;
139
+ }
140
+ } };
141
+ return createComponent(TimeFieldStateContext.Provider, {
142
+ value: state,
143
+ get children() {
144
+ return createComponent(TimeFieldContext.Provider, {
145
+ get value() {
146
+ return {
147
+ state,
148
+ aria: {
149
+ labelProps: fieldAria.labelProps,
150
+ inputProps: fieldAria.inputProps,
151
+ descriptionProps: fieldAria.descriptionProps,
152
+ errorMessageProps: fieldAria.errorMessageProps
153
+ }
154
+ };
155
+ },
156
+ get children() {
157
+ return [(() => {
158
+ var _el$2 = getNextElement(_tmpl$2);
159
+ use(setFieldRef, _el$2);
160
+ spread(_el$2, mergeProps(() => fieldAria.fieldProps, {
161
+ get ["class"]() {
162
+ return renderProps.class();
163
+ },
164
+ get style() {
165
+ return renderProps.style();
166
+ },
167
+ get ["data-disabled"]() {
168
+ return dataAttr(state.isDisabled());
169
+ },
170
+ get ["data-readonly"]() {
171
+ return dataAttr(state.isReadOnly());
172
+ },
173
+ get ["data-required"]() {
174
+ return dataAttr(state.isRequired());
175
+ },
176
+ get ["data-invalid"]() {
177
+ return dataAttr(state.isInvalid());
178
+ }
179
+ }), false, true);
180
+ insert(_el$2, createComponent(Provider, {
181
+ values: [[TextContext, textSlots]],
182
+ get children() {
183
+ return local.children;
184
+ }
185
+ }));
186
+ runHydrationEvents();
187
+ return _el$2;
188
+ })(), createComponent(Show, {
189
+ get when() {
190
+ return rest.name;
191
+ },
192
+ get children() {
193
+ return createComponent(HiddenTimeInput, {
194
+ get name() {
195
+ return rest.name;
196
+ },
197
+ get form() {
198
+ return rest.form;
199
+ },
200
+ get value() {
201
+ return state.value();
202
+ },
203
+ get autoComplete() {
204
+ return rest.autoComplete;
205
+ },
206
+ get isDisabled() {
207
+ return state.isDisabled();
208
+ },
209
+ get isRequired() {
210
+ return state.isRequired();
211
+ },
212
+ get validationBehavior() {
213
+ return validationBehavior();
214
+ },
215
+ validationState: state,
216
+ focus: () => {
217
+ fieldRef()?.querySelector("[role=\"spinbutton\"]")?.focus();
218
+ },
219
+ get minValue() {
220
+ return access(stateProps.minValue);
221
+ },
222
+ get maxValue() {
223
+ return access(stateProps.maxValue);
224
+ },
225
+ get granularity() {
226
+ return state.granularity;
227
+ }
228
+ });
229
+ }
230
+ })];
231
+ }
232
+ });
233
+ }
234
+ });
235
+ }
236
+ /**
237
+ * The input area containing time segments.
238
+ */
239
+ function TimeInput(props) {
240
+ const { state, aria } = useTimeFieldContextValue();
241
+ const [isFocused, setIsFocused] = createSignal(false);
242
+ const renderValues = createMemo(() => ({
243
+ isDisabled: state.isDisabled(),
244
+ isFocused: isFocused()
245
+ }));
246
+ const renderProps = useRenderProps({
247
+ class: props.class,
248
+ style: props.style,
249
+ defaultClassName: "solidaria-TimeInput"
250
+ }, renderValues);
251
+ return (() => {
252
+ var _el$3 = getNextElement(_tmpl$2);
253
+ spread(_el$3, mergeProps(() => aria.inputProps, {
254
+ get ["class"]() {
255
+ return renderProps.class();
256
+ },
257
+ get style() {
258
+ return renderProps.style();
259
+ },
260
+ get ["data-disabled"]() {
261
+ return dataAttr(state.isDisabled());
262
+ },
263
+ get ["data-focused"]() {
264
+ return dataAttr(isFocused());
265
+ },
266
+ "onFocusIn": () => setIsFocused(true),
267
+ "onFocusOut": () => setIsFocused(false)
268
+ }), false, true);
269
+ insert(_el$3, createComponent(For, {
270
+ get each() {
271
+ return state.segments();
272
+ },
273
+ children: (segment) => props.children?.(segment)
274
+ }));
275
+ runHydrationEvents();
276
+ return _el$3;
277
+ })();
278
+ }
279
+ /**
280
+ * A segment of a time field (hour, minute, second, AM/PM).
281
+ */
282
+ function TimeSegment(props) {
283
+ const state = useTimeFieldContext();
284
+ const [segmentRef, setSegmentRef] = createSignal(null);
285
+ const segmentAria = createTimeSegment({ segment: props.segment }, state, segmentRef);
286
+ const renderValues = createMemo(() => ({
287
+ isFocused: segmentAria.isFocused,
288
+ isEditable: segmentAria.isEditable,
289
+ isPlaceholder: segmentAria.isPlaceholder,
290
+ type: props.segment.type,
291
+ text: segmentAria.text
292
+ }));
293
+ const renderProps = useRenderProps({
294
+ get children() {
295
+ return props.children;
296
+ },
297
+ class: props.class,
298
+ style: props.style,
299
+ defaultClassName: "solidaria-TimeSegment"
300
+ }, renderValues);
301
+ const getChildren = () => {
302
+ if (typeof props.children === "function") return renderProps.renderChildren();
303
+ return segmentAria.text;
304
+ };
305
+ return (() => {
306
+ var _el$4 = getNextElement(_tmpl$2);
307
+ use(setSegmentRef, _el$4);
308
+ spread(_el$4, mergeProps(() => segmentAria.segmentProps, {
309
+ get ["class"]() {
310
+ return renderProps.class();
311
+ },
312
+ get style() {
313
+ return renderProps.style();
314
+ },
315
+ get ["data-focused"]() {
316
+ return dataAttr(segmentAria.isFocused);
317
+ },
318
+ get ["data-editable"]() {
319
+ return dataAttr(segmentAria.isEditable);
320
+ },
321
+ get ["data-placeholder"]() {
322
+ return dataAttr(segmentAria.isPlaceholder);
323
+ },
324
+ get ["data-type"]() {
325
+ return props.segment.type;
326
+ }
327
+ }), false, true);
328
+ insert(_el$4, getChildren);
329
+ runHydrationEvents();
330
+ return _el$4;
331
+ })();
332
+ }
333
+ function TimeFieldLabel(props) {
334
+ const { aria } = useTimeFieldContextValue();
335
+ return (() => {
336
+ var _el$5 = getNextElement(_tmpl$3);
337
+ spread(_el$5, mergeProps(() => aria.labelProps, { get ["class"]() {
338
+ return props.class;
339
+ } }), false, true);
340
+ insert(_el$5, () => props.children);
341
+ runHydrationEvents();
342
+ return _el$5;
343
+ })();
344
+ }
345
+ function TimeFieldDescription(props) {
346
+ const { aria } = useTimeFieldContextValue();
347
+ return (() => {
348
+ var _el$6 = getNextElement(_tmpl$4);
349
+ spread(_el$6, mergeProps(() => aria.descriptionProps, { get ["class"]() {
350
+ return props.class;
351
+ } }), false, true);
352
+ insert(_el$6, () => props.children);
353
+ runHydrationEvents();
354
+ return _el$6;
355
+ })();
356
+ }
357
+ function TimeFieldErrorMessage(props) {
358
+ const { aria } = useTimeFieldContextValue();
359
+ return (() => {
360
+ var _el$7 = getNextElement(_tmpl$4);
361
+ spread(_el$7, mergeProps(() => aria.errorMessageProps, { get ["class"]() {
362
+ return props.class;
363
+ } }), false, true);
364
+ insert(_el$7, () => props.children);
365
+ runHydrationEvents();
366
+ return _el$7;
367
+ })();
368
+ }
369
+ //#endregion
370
+ export { TimeField, TimeFieldContext, TimeFieldDescription, TimeFieldErrorMessage, TimeFieldLabel, TimeFieldStateContext, TimeInput, TimeSegment, useTimeFieldContext };
371
+
372
+ //# sourceMappingURL=TimeField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimeField.js","names":["JSX","Context","createContext","createMemo","createSignal","splitProps","useContext","For","Show","createTimeField","createTimeSegment","AriaTimeFieldProps","createTimeFieldState","access","TimeFieldState","TimeFieldStateProps","TimeSegment","TimeSegmentType","TimeValue","RenderChildren","ClassNameOrFunction","StyleOrFunction","SlotProps","useRenderProps","dataAttr","useIsHydrated","Provider","TextContext","HiddenTimeInput","FormContext","FormProps","TimeFieldRenderProps","isDisabled","isReadOnly","isRequired","isInvalid","TimeFieldProps","Omit","T","children","Element","segment","class","style","locale","TimeInputRenderProps","isFocused","TimeInputProps","TimeSegmentRenderProps","isEditable","isPlaceholder","type","text","TimeSegmentProps","TimeFieldContextValue","state","aria","labelProps","Record","inputProps","descriptionProps","errorMessageProps","TimeFieldContext","TimeFieldStateContext","withFormValidationBehavior","props","P","formContext","validationBehavior","Proxy","get","target","property","receiver","localValue","Reflect","undefined","has","ownKeys","keys","Set","add","Array","from","getOwnPropertyDescriptor","descriptor","enumerable","configurable","useTimeFieldContextValue","context","Error","useTimeFieldContext","TimeField","isHydrated","_$createComponent","when","fallback","_$getNextElement","_tmpl$","TimeFieldInner","_$mergeProps","__formContext","TimeFieldInnerProps","mergedProps","local","stateProps","rest","fieldRef","setFieldRef","HTMLDivElement","fieldAria","description","errorMessage","renderValues","renderProps","defaultClassName","textSlots","slots","value","_el$2","_tmpl$2","_$use","_$spread","fieldProps","data-disabled","data-readonly","data-required","data-invalid","_$insert","values","_$runHydrationEvents","name","form","autoComplete","validationState","focus","querySelector","HTMLElement","minValue","maxValue","granularity","TimeInput","setIsFocused","_el$3","data-focused","onFocusIn","onFocusOut","each","segments","segmentRef","setSegmentRef","segmentAria","getChildren","renderChildren","_el$4","segmentProps","data-editable","data-placeholder","data-type","TimeFieldLabelProps","TimeFieldLabel","_el$5","_tmpl$3","TimeFieldDescriptionProps","TimeFieldDescription","_el$6","_tmpl$4","TimeFieldErrorMessageProps","TimeFieldErrorMessage","_el$7"],"sources":["../src/TimeField.tsx"],"sourcesContent":["/**\n * TimeField component for solidaria-components\n *\n * Pre-wired headless time field component with segment-based editing.\n * Port of react-aria-components/src/TimeField.tsx\n */\n\nimport {\n type JSX,\n type Context,\n createContext,\n createMemo,\n createSignal,\n splitProps,\n useContext,\n For,\n Show,\n} from \"solid-js\";\nimport {\n createTimeField,\n createTimeSegment,\n type AriaTimeFieldProps,\n} from \"@proyecto-viviana/solidaria\";\nimport {\n createTimeFieldState,\n access,\n type TimeFieldState,\n type TimeFieldStateProps,\n type TimeSegment as TimeSegmentType,\n type TimeValue,\n} from \"@proyecto-viviana/solid-stately\";\nimport {\n type RenderChildren,\n type ClassNameOrFunction,\n type StyleOrFunction,\n type SlotProps,\n useRenderProps,\n dataAttr,\n useIsHydrated,\n Provider,\n} from \"./utils\";\nimport { TextContext } from \"./Text\";\nimport { HiddenTimeInput } from \"./HiddenTimeInput\";\nimport { FormContext, type FormProps } from \"./Form\";\n\nexport interface TimeFieldRenderProps {\n /** Whether the field is disabled. */\n isDisabled: boolean;\n /** Whether the field is read-only. */\n isReadOnly: boolean;\n /** Whether the field is required. */\n isRequired: boolean;\n /** Whether the field is invalid. */\n isInvalid: boolean;\n}\n\nexport interface TimeFieldProps<T extends TimeValue = TimeValue>\n extends\n Omit<AriaTimeFieldProps, \"id\" | \"isDisabled\" | \"isReadOnly\" | \"isRequired\">,\n Omit<TimeFieldStateProps<T>, \"locale\">,\n SlotProps {\n /** The children of the component. */\n children?: JSX.Element | ((segment: TimeSegmentType) => JSX.Element);\n /** The CSS className for the element. */\n class?: ClassNameOrFunction<TimeFieldRenderProps>;\n /** The inline style for the element. */\n style?: StyleOrFunction<TimeFieldRenderProps>;\n /** The locale to use for formatting. */\n locale?: string;\n}\n\nexport interface TimeInputRenderProps {\n /** Whether the input is disabled. */\n isDisabled: boolean;\n /** Whether the input is focused. */\n isFocused: boolean;\n}\n\nexport interface TimeInputProps extends SlotProps {\n /** The children of the component (render function receiving segments). */\n children?: (segment: TimeSegmentType) => JSX.Element;\n /** The CSS className for the element. */\n class?: ClassNameOrFunction<TimeInputRenderProps>;\n /** The inline style for the element. */\n style?: StyleOrFunction<TimeInputRenderProps>;\n}\n\nexport interface TimeSegmentRenderProps {\n /** Whether the segment is focused. */\n isFocused: boolean;\n /** Whether the segment is editable. */\n isEditable: boolean;\n /** Whether the segment is a placeholder. */\n isPlaceholder: boolean;\n /** The segment type. */\n type: TimeSegmentType[\"type\"];\n /** The text to display. */\n text: string;\n}\n\nexport interface TimeSegmentProps extends SlotProps {\n /** The segment data. */\n segment: TimeSegmentType;\n /** The children of the component. A function may be provided to receive render props. */\n children?: RenderChildren<TimeSegmentRenderProps>;\n /** The CSS className for the element. */\n class?: ClassNameOrFunction<TimeSegmentRenderProps>;\n /** The inline style for the element. */\n style?: StyleOrFunction<TimeSegmentRenderProps>;\n}\n\nexport interface TimeFieldContextValue {\n state: TimeFieldState<TimeValue>;\n aria: {\n labelProps: Record<string, unknown>;\n inputProps: Record<string, unknown>;\n descriptionProps: Record<string, unknown>;\n errorMessageProps: Record<string, unknown>;\n };\n}\n\nexport const TimeFieldContext = createContext<TimeFieldContextValue | null>(null);\nexport const TimeFieldStateContext = createContext<TimeFieldState<TimeValue> | null>(null);\n\nfunction withFormValidationBehavior<P extends object>(props: P, formContext: FormProps | null): P {\n if (!formContext?.validationBehavior) {\n return props;\n }\n\n return new Proxy(props, {\n get(target, property, receiver) {\n const localValue = Reflect.get(target, property, receiver);\n if (property === \"validationBehavior\" && localValue === undefined) {\n return formContext.validationBehavior;\n }\n\n return localValue;\n },\n has(target, property) {\n return (\n Reflect.has(target, property) ||\n (property === \"validationBehavior\" && formContext.validationBehavior !== undefined)\n );\n },\n ownKeys(target) {\n const keys = new Set(Reflect.ownKeys(target));\n if (formContext.validationBehavior !== undefined) {\n keys.add(\"validationBehavior\");\n }\n\n return Array.from(keys);\n },\n getOwnPropertyDescriptor(target, property) {\n const descriptor = Reflect.getOwnPropertyDescriptor(target, property);\n if (descriptor) {\n return descriptor;\n }\n\n if (property === \"validationBehavior\" && formContext.validationBehavior !== undefined) {\n return {\n enumerable: true,\n configurable: true,\n get: () => formContext.validationBehavior,\n };\n }\n\n return undefined;\n },\n });\n}\n\nfunction useTimeFieldContextValue(): TimeFieldContextValue {\n const context = useContext(TimeFieldContext);\n if (!context) {\n throw new Error(\"TimeField components must be used within a TimeField\");\n }\n return context;\n}\n\nexport function useTimeFieldContext(): TimeFieldState<TimeValue> {\n return useTimeFieldContextValue().state;\n}\n\n/**\n * A time field allows users to enter and edit time values using a keyboard.\n *\n * @example\n * ```tsx\n * <TimeField label=\"Time\">\n * <Label>Time</Label>\n * <TimeInput>\n * {(segment) => <TimeSegment segment={segment} />}\n * </TimeInput>\n * </TimeField>\n * ```\n */\nexport function TimeField<T extends TimeValue = TimeValue>(props: TimeFieldProps<T>): JSX.Element {\n // Use hydration-safe pattern for client-only rendering\n const isHydrated = useIsHydrated();\n const formContext = useContext(FormContext);\n\n return (\n <Show\n when={isHydrated()}\n fallback={\n <div class=\"solidaria-TimeField solidaria-TimeField--placeholder\" aria-hidden=\"true\" />\n }\n >\n <TimeFieldInner {...props} __formContext={formContext} />\n </Show>\n );\n}\n\ntype TimeFieldInnerProps<T extends TimeValue = TimeValue> = TimeFieldProps<T> & {\n __formContext?: FormProps | null;\n};\n\n/**\n * Internal TimeField component that renders after client mount.\n */\nfunction TimeFieldInner<T extends TimeValue = TimeValue>(\n props: TimeFieldInnerProps<T>,\n): JSX.Element {\n const formContext = props.__formContext ?? useContext(FormContext);\n const mergedProps = withFormValidationBehavior(props, formContext);\n const [local, stateProps, rest] = splitProps(\n mergedProps,\n [\"children\", \"class\", \"style\", \"slot\", \"__formContext\"],\n [\n \"value\",\n \"defaultValue\",\n \"onChange\",\n \"minValue\",\n \"maxValue\",\n \"isInvalid\",\n \"isDisabled\",\n \"isReadOnly\",\n \"isRequired\",\n \"locale\",\n \"granularity\",\n \"hourCycle\",\n \"shouldForceLeadingZeros\",\n \"validationState\",\n \"validationBehavior\",\n \"validate\",\n \"description\",\n \"errorMessage\",\n \"placeholderValue\",\n ],\n );\n\n const [fieldRef, setFieldRef] = createSignal<HTMLDivElement | null>(null);\n\n const state = createTimeFieldState(stateProps);\n\n const fieldAria = createTimeField(\n () => ({\n ...(rest as Record<string, unknown>),\n description: stateProps.description,\n errorMessage: stateProps.errorMessage,\n }),\n state as unknown as TimeFieldState<TimeValue>,\n fieldRef,\n );\n\n const renderValues = createMemo<TimeFieldRenderProps>(() => ({\n isDisabled: state.isDisabled(),\n isReadOnly: state.isReadOnly(),\n isRequired: state.isRequired(),\n isInvalid: state.isInvalid(),\n }));\n\n const renderProps = useRenderProps(\n {\n class: local.class,\n style: local.style,\n defaultClassName: \"solidaria-TimeField\",\n },\n renderValues,\n );\n\n const validationBehavior = () =>\n (stateProps as { validationBehavior?: \"aria\" | \"native\" }).validationBehavior ??\n formContext?.validationBehavior ??\n \"native\";\n\n const textSlots = {\n slots: {\n get description() {\n return fieldAria.descriptionProps;\n },\n get errorMessage() {\n return fieldAria.errorMessageProps;\n },\n },\n };\n\n return (\n <TimeFieldStateContext.Provider value={state as unknown as TimeFieldState<TimeValue>}>\n <TimeFieldContext.Provider\n value={{\n state: state as unknown as TimeFieldState<TimeValue>,\n aria: {\n labelProps: fieldAria.labelProps,\n inputProps: fieldAria.inputProps,\n descriptionProps: fieldAria.descriptionProps,\n errorMessageProps: fieldAria.errorMessageProps,\n },\n }}\n >\n <div\n ref={setFieldRef}\n {...fieldAria.fieldProps}\n class={renderProps.class()}\n style={renderProps.style()}\n data-disabled={dataAttr(state.isDisabled())}\n data-readonly={dataAttr(state.isReadOnly())}\n data-required={dataAttr(state.isRequired())}\n data-invalid={dataAttr(state.isInvalid())}\n >\n <Provider values={[[TextContext, textSlots]] as Array<[Context<unknown>, unknown]>}>\n {local.children as JSX.Element}\n </Provider>\n </div>\n <Show when={(rest as Record<string, unknown>).name}>\n <HiddenTimeInput\n name={(rest as Record<string, unknown>).name as string | undefined}\n form={(rest as Record<string, unknown>).form as string | undefined}\n value={state.value()}\n autoComplete={(rest as Record<string, unknown>).autoComplete as string | undefined}\n isDisabled={state.isDisabled()}\n isRequired={state.isRequired()}\n validationBehavior={validationBehavior()}\n validationState={state}\n focus={() => {\n fieldRef()?.querySelector<HTMLElement>('[role=\"spinbutton\"]')?.focus();\n }}\n minValue={access(stateProps.minValue) as TimeValue | undefined}\n maxValue={access(stateProps.maxValue) as TimeValue | undefined}\n granularity={state.granularity}\n />\n </Show>\n </TimeFieldContext.Provider>\n </TimeFieldStateContext.Provider>\n );\n}\n\n/**\n * The input area containing time segments.\n */\nexport function TimeInput(props: TimeInputProps): JSX.Element {\n const { state, aria } = useTimeFieldContextValue();\n const [isFocused, setIsFocused] = createSignal(false);\n\n const renderValues = createMemo<TimeInputRenderProps>(() => ({\n isDisabled: state.isDisabled(),\n isFocused: isFocused(),\n }));\n\n const renderProps = useRenderProps(\n {\n class: props.class,\n style: props.style,\n defaultClassName: \"solidaria-TimeInput\",\n },\n renderValues,\n );\n\n return (\n <div\n {...aria.inputProps}\n class={renderProps.class()}\n style={renderProps.style()}\n data-disabled={dataAttr(state.isDisabled())}\n data-focused={dataAttr(isFocused())}\n onFocusIn={() => setIsFocused(true)}\n onFocusOut={() => setIsFocused(false)}\n >\n <For each={state.segments()}>{(segment) => props.children?.(segment)}</For>\n </div>\n );\n}\n\n/**\n * A segment of a time field (hour, minute, second, AM/PM).\n */\nexport function TimeSegment(props: TimeSegmentProps): JSX.Element {\n const state = useTimeFieldContext();\n const [segmentRef, setSegmentRef] = createSignal<HTMLDivElement | null>(null);\n\n const segmentAria = createTimeSegment(\n { segment: props.segment },\n state as unknown as TimeFieldState,\n segmentRef,\n );\n\n const renderValues = createMemo<TimeSegmentRenderProps>(() => ({\n isFocused: segmentAria.isFocused,\n isEditable: segmentAria.isEditable,\n isPlaceholder: segmentAria.isPlaceholder,\n type: props.segment.type,\n text: segmentAria.text,\n }));\n\n const renderProps = useRenderProps(\n {\n get children() {\n return props.children;\n },\n class: props.class,\n style: props.style,\n defaultClassName: \"solidaria-TimeSegment\",\n },\n renderValues,\n );\n\n // Determine children content - avoid Show for SSR hydration compatibility\n const getChildren = () => {\n if (typeof props.children === \"function\") {\n return renderProps.renderChildren();\n }\n return segmentAria.text;\n };\n\n return (\n <div\n ref={setSegmentRef}\n {...segmentAria.segmentProps}\n class={renderProps.class()}\n style={renderProps.style()}\n data-focused={dataAttr(segmentAria.isFocused)}\n data-editable={dataAttr(segmentAria.isEditable)}\n data-placeholder={dataAttr(segmentAria.isPlaceholder)}\n data-type={props.segment.type}\n >\n {getChildren()}\n </div>\n );\n}\n\nexport interface TimeFieldLabelProps {\n children?: JSX.Element;\n class?: string;\n}\n\nexport function TimeFieldLabel(props: TimeFieldLabelProps): JSX.Element {\n const { aria } = useTimeFieldContextValue();\n return (\n <span {...aria.labelProps} class={props.class}>\n {props.children}\n </span>\n );\n}\n\nexport interface TimeFieldDescriptionProps {\n children?: JSX.Element;\n class?: string;\n}\n\nexport function TimeFieldDescription(props: TimeFieldDescriptionProps): JSX.Element {\n const { aria } = useTimeFieldContextValue();\n return (\n <p {...aria.descriptionProps} class={props.class}>\n {props.children}\n </p>\n );\n}\n\nexport interface TimeFieldErrorMessageProps {\n children?: JSX.Element;\n class?: string;\n}\n\nexport function TimeFieldErrorMessage(props: TimeFieldErrorMessageProps): JSX.Element {\n const { aria } = useTimeFieldContextValue();\n return (\n <p {...aria.errorMessageProps} class={props.class}>\n {props.children}\n </p>\n );\n}\n\nexport type { TimeFieldState, TimeSegmentType, TimeValue };\n"],"mappings":";;;;;;;;;;;;;;;;AAyHA,MAAa8D,mBAAmB5D,cAA4C,IAAI;AAChF,MAAa6D,wBAAwB7D,cAAgD,IAAI;AAEzF,SAAS8D,2BAA6CC,OAAUE,aAAkC;CAChG,IAAI,CAACA,aAAaC,oBAChB,OAAOH;CAGT,OAAO,IAAII,MAAMJ,OAAO;EACtBK,IAAIC,QAAQC,UAAUC,UAAU;GAC9B,MAAMC,aAAaC,QAAQL,IAAIC,QAAQC,UAAUC,QAAQ;GACzD,IAAID,aAAa,wBAAwBE,eAAeE,KAAAA,GACtD,OAAOT,YAAYC;GAGrB,OAAOM;EACT;EACAG,IAAIN,QAAQC,UAAU;GACpB,OACEG,QAAQE,IAAIN,QAAQC,QAAQ,KAC3BA,aAAa,wBAAwBL,YAAYC,uBAAuBQ,KAAAA;EAE7E;EACAE,QAAQP,QAAQ;GACd,MAAMQ,OAAO,IAAIC,IAAIL,QAAQG,QAAQP,MAAM,CAAC;GAC5C,IAAIJ,YAAYC,uBAAuBQ,KAAAA,GACrCG,KAAKE,IAAI,oBAAoB;GAG/B,OAAOC,MAAMC,KAAKJ,IAAI;EACxB;EACAK,yBAAyBb,QAAQC,UAAU;GACzC,MAAMa,aAAaV,QAAQS,yBAAyBb,QAAQC,QAAQ;GACpE,IAAIa,YACF,OAAOA;GAGT,IAAIb,aAAa,wBAAwBL,YAAYC,uBAAuBQ,KAAAA,GAC1E,OAAO;IACLU,YAAY;IACZC,cAAc;IACdjB,WAAWH,YAAYC;GACzB;EAIJ;CACF,CAAC;AACH;AAEA,SAASoB,2BAAkD;CACzD,MAAMC,UAAUnF,WAAWwD,gBAAgB;CAC3C,IAAI,CAAC2B,SACH,MAAM,IAAIC,MAAM,sDAAsD;CAExE,OAAOD;AACT;AAEA,SAAgBE,sBAAiD;CAC/D,OAAOH,yBAAyB,CAAC,CAACjC;AACpC;;;;;;;;;;;;;;AAeA,SAAgBqC,UAA2C3B,OAAuC;CAEhG,MAAM4B,aAAapE,cAAc;CACjC,MAAM0C,cAAc7D,WAAWuB,WAAW;CAE1C,OAAAiE,gBACGtF,MAAI;EAAA,IACHuF,OAAI;GAAA,OAAEF,WAAW;EAAC;EAAA,IAClBG,WAAQ;GAAA,OAAAC,eAAAC,MAAA;EAAA;EAAA,IAAA3D,WAAA;GAAA,OAAAuD,gBAIPK,gBAAcC,WAAKnC,OAAK,EAAEoC,eAAelC,YAAW,CAAA,CAAA;EAAA;CAAA,CAAA;AAG3D;;;;AASA,SAASgC,eACPlC,OACa;CACb,MAAME,cAAcF,MAAMoC,iBAAiB/F,WAAWuB,WAAW;CAEjE,MAAM,CAAC2E,OAAOC,YAAYC,QAAQrG,WADd2D,2BAA2BC,OAAOE,WAEpDoC,GACA;EAAC;EAAY;EAAS;EAAS;EAAQ;CAAe,GACtD;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CAAkB,CAEtB;CAEA,MAAM,CAACI,UAAUC,eAAexG,aAAoC,IAAI;CAExE,MAAMmD,QAAQ3C,qBAAqB6F,UAAU;CAE7C,MAAMK,YAAYrG,uBACT;EACL,GAAIiG;EACJK,aAAaN,WAAWM;EACxBC,cAAcP,WAAWO;CAC3B,IACAzD,OACAoD,QACF;CAEA,MAAMM,eAAe9G,kBAAwC;EAC3D6B,YAAYuB,MAAMvB,WAAW;EAC7BC,YAAYsB,MAAMtB,WAAW;EAC7BC,YAAYqB,MAAMrB,WAAW;EAC7BC,WAAWoB,MAAMpB,UAAU;CAC7B,EAAE;CAEF,MAAM+E,cAAc3F,eAClB;EACEmB,OAAO8D,MAAM9D;EACbC,OAAO6D,MAAM7D;EACbwE,kBAAkB;CACpB,GACAF,YACF;CAEA,MAAM7C,2BACHqC,WAA0DrC,sBAC3DD,aAAaC,sBACb;CAEF,MAAMgD,YAAY,EAChBC,OAAO;EACL,IAAIN,cAAc;GAChB,OAAOD,UAAUlD;EACnB;EACA,IAAIoD,eAAe;GACjB,OAAOF,UAAUjD;EACnB;CACF,EACF;CAEA,OAAAiC,gBACG/B,sBAAsBrC,UAAQ;EAAC4F,OAAO/D;EAA6C,IAAAhB,WAAA;GAAA,OAAAuD,gBACjFhC,iBAAiBpC,UAAQ;IAAA,IACxB4F,QAAK;KAAA,OAAE;MACE/D;MACPC,MAAM;OACJC,YAAYqD,UAAUrD;OACtBE,YAAYmD,UAAUnD;OACtBC,kBAAkBkD,UAAUlD;OAC5BC,mBAAmBiD,UAAUjD;MAC/B;KACF;IAAC;IAAA,IAAAtB,WAAA;KAAA,OAAA,QAAA;MAAA,IAAAgF,QAAAtB,eAAAuB,OAAA;MAAAC,IAGMb,aAAWW,KAAA;MAAAG,OAAAH,OAAAnB,iBACZU,UAAUa,YAAU;OAAA,KAAA,WAAA;QAAA,OACjBT,YAAYxE,MAAM;OAAC;OAAA,IAC1BC,QAAK;QAAA,OAAEuE,YAAYvE,MAAM;OAAC;OAAA,KAAA,mBAAA;QAAA,OACXnB,SAAS+B,MAAMvB,WAAW,CAAC;OAAC;OAAA,KAAA,mBAAA;QAAA,OAC5BR,SAAS+B,MAAMtB,WAAW,CAAC;OAAC;OAAA,KAAA,mBAAA;QAAA,OAC5BT,SAAS+B,MAAMrB,WAAW,CAAC;OAAC;OAAA,KAAA,kBAAA;QAAA,OAC7BV,SAAS+B,MAAMpB,UAAU,CAAC;OAAC;MAAA,CAAA,GAAA,OAAA,IAAA;MAAA6F,OAAAT,OAAAzB,gBAExCpE,UAAQ;OAACuG,QAAQ,CAAC,CAACtG,aAAayF,SAAS,CAAC;OAAuC,IAAA7E,WAAA;QAAA,OAC/EiE,MAAMjE;OAAuB;MAAA,CAAA,CAAA;MAAA2F,mBAAA;MAAA,OAAAX;KAAA,EAAA,CAAA,GAAAzB,gBAGjCtF,MAAI;MAAA,IAACuF,OAAI;OAAA,OAAGW,KAAiCyB;MAAI;MAAA,IAAA5F,WAAA;OAAA,OAAAuD,gBAC/ClE,iBAAe;QAAA,IACduG,OAAI;SAAA,OAAGzB,KAAiCyB;QAA0B;QAAA,IAClEC,OAAI;SAAA,OAAG1B,KAAiC0B;QAA0B;QAAA,IAClEd,QAAK;SAAA,OAAE/D,MAAM+D,MAAM;QAAC;QAAA,IACpBe,eAAY;SAAA,OAAG3B,KAAiC2B;QAAkC;QAAA,IAClFrG,aAAU;SAAA,OAAEuB,MAAMvB,WAAW;QAAC;QAAA,IAC9BE,aAAU;SAAA,OAAEqB,MAAMrB,WAAW;QAAC;QAAA,IAC9BkC,qBAAkB;SAAA,OAAEA,mBAAmB;QAAC;QACxCkE,iBAAiB/E;QACjBgF,aAAa;SACX5B,SAAS,CAAC,EAAE6B,cAA2B,uBAAqB,CAAC,EAAED,MAAM;QACvE;QAAC,IACDG,WAAQ;SAAA,OAAE7H,OAAO4F,WAAWiC,QAAQ;QAA0B;QAAA,IAC9DC,WAAQ;SAAA,OAAE9H,OAAO4F,WAAWkC,QAAQ;QAA0B;QAAA,IAC9DC,cAAW;SAAA,OAAErF,MAAMqF;QAAW;OAAA,CAAA;MAAA;KAAA,CAAA,CAAA;IAAA;GAAA,CAAA;EAAA;CAAA,CAAA;AAM1C;;;;AAKA,SAAgBC,UAAU5E,OAAoC;CAC5D,MAAM,EAAEV,OAAOC,SAASgC,yBAAyB;CACjD,MAAM,CAAC1C,WAAWgG,gBAAgB1I,aAAa,KAAK;CAEpD,MAAM6G,eAAe9G,kBAAwC;EAC3D6B,YAAYuB,MAAMvB,WAAW;EAC7Bc,WAAWA,UAAU;CACvB,EAAE;CAEF,MAAMoE,cAAc3F,eAClB;EACEmB,OAAOuB,MAAMvB;EACbC,OAAOsB,MAAMtB;EACbwE,kBAAkB;CACpB,GACAF,YACF;CAEA,cAAA;EAAA,IAAA8B,QAAA9C,eAAAuB,OAAA;EAAAE,OAAAqB,OAAA3C,iBAEQ5C,KAAKG,YAAU;GAAA,KAAA,WAAA;IAAA,OACZuD,YAAYxE,MAAM;GAAC;GAAA,IAC1BC,QAAK;IAAA,OAAEuE,YAAYvE,MAAM;GAAC;GAAA,KAAA,mBAAA;IAAA,OACXnB,SAAS+B,MAAMvB,WAAW,CAAC;GAAC;GAAA,KAAA,kBAAA;IAAA,OAC7BR,SAASsB,UAAU,CAAC;GAAC;GAAA,mBAClBgG,aAAa,IAAI;GAAC,oBACjBA,aAAa,KAAK;EAAC,CAAA,GAAA,OAAA,IAAA;EAAAd,OAAAe,OAAAjD,gBAEpCvF,KAAG;GAAA,IAAC4I,OAAI;IAAA,OAAE5F,MAAM6F,SAAS;GAAC;GAAA7G,WAAIE,YAAYwB,MAAM1B,WAAWE,OAAO;EAAC,CAAA,CAAA;EAAAyF,mBAAA;EAAA,OAAAa;CAAA,EAAA,CAAA;AAG1E;;;;AAKA,SAAgB/H,YAAYiD,OAAsC;CAChE,MAAMV,QAAQoC,oBAAoB;CAClC,MAAM,CAAC0D,YAAYC,iBAAiBlJ,aAAoC,IAAI;CAE5E,MAAMmJ,cAAc7I,kBAClB,EAAE+B,SAASwB,MAAMxB,QAAQ,GACzBc,OACA8F,UACF;CAEA,MAAMpC,eAAe9G,kBAA0C;EAC7D2C,WAAWyG,YAAYzG;EACvBG,YAAYsG,YAAYtG;EACxBC,eAAeqG,YAAYrG;EAC3BC,MAAMc,MAAMxB,QAAQU;EACpBC,MAAMmG,YAAYnG;CACpB,EAAE;CAEF,MAAM8D,cAAc3F,eAClB;EACE,IAAIgB,WAAW;GACb,OAAO0B,MAAM1B;EACf;EACAG,OAAOuB,MAAMvB;EACbC,OAAOsB,MAAMtB;EACbwE,kBAAkB;CACpB,GACAF,YACF;CAGA,MAAMuC,oBAAoB;EACxB,IAAI,OAAOvF,MAAM1B,aAAa,YAC5B,OAAO2E,YAAYuC,eAAe;EAEpC,OAAOF,YAAYnG;CACrB;CAEA,cAAA;EAAA,IAAAsG,QAAAzD,eAAAuB,OAAA;EAAAC,IAES6B,eAAaI,KAAA;EAAAhC,OAAAgC,OAAAtD,iBACdmD,YAAYI,cAAY;GAAA,KAAA,WAAA;IAAA,OACrBzC,YAAYxE,MAAM;GAAC;GAAA,IAC1BC,QAAK;IAAA,OAAEuE,YAAYvE,MAAM;GAAC;GAAA,KAAA,kBAAA;IAAA,OACZnB,SAAS+H,YAAYzG,SAAS;GAAC;GAAA,KAAA,mBAAA;IAAA,OAC9BtB,SAAS+H,YAAYtG,UAAU;GAAC;GAAA,KAAA,sBAAA;IAAA,OAC7BzB,SAAS+H,YAAYrG,aAAa;GAAC;GAAA,KAAA,eAAA;IAAA,OAC1Ce,MAAMxB,QAAQU;GAAI;EAAA,CAAA,GAAA,OAAA,IAAA;EAAA6E,OAAA0B,OAE5BF,WAAW;EAAAtB,mBAAA;EAAA,OAAAwB;CAAA,EAAA,CAAA;AAGlB;AAOA,SAAgBM,eAAe/F,OAAyC;CACtE,MAAM,EAAET,SAASgC,yBAAyB;CAC1C,cAAA;EAAA,IAAAyE,QAAAhE,eAAAiE,OAAA;EAAAxC,OAAAuC,OAAA7D,iBACY5C,KAAKC,YAAU,EAAA,KAAA,WAAA;GAAA,OAASQ,MAAMvB;EAAK,EAAA,CAAA,GAAA,OAAA,IAAA;EAAAsF,OAAAiC,aAC1ChG,MAAM1B,QAAQ;EAAA2F,mBAAA;EAAA,OAAA+B;CAAA,EAAA,CAAA;AAGrB;AAOA,SAAgBG,qBAAqBnG,OAA+C;CAClF,MAAM,EAAET,SAASgC,yBAAyB;CAC1C,cAAA;EAAA,IAAA6E,QAAApE,eAAAqE,OAAA;EAAA5C,OAAA2C,OAAAjE,iBACS5C,KAAKI,kBAAgB,EAAA,KAAA,WAAA;GAAA,OAASK,MAAMvB;EAAK,EAAA,CAAA,GAAA,OAAA,IAAA;EAAAsF,OAAAqC,aAC7CpG,MAAM1B,QAAQ;EAAA2F,mBAAA;EAAA,OAAAmC;CAAA,EAAA,CAAA;AAGrB;AAOA,SAAgBG,sBAAsBvG,OAAgD;CACpF,MAAM,EAAET,SAASgC,yBAAyB;CAC1C,cAAA;EAAA,IAAAiF,QAAAxE,eAAAqE,OAAA;EAAA5C,OAAA+C,OAAArE,iBACS5C,KAAKK,mBAAiB,EAAA,KAAA,WAAA;GAAA,OAASI,MAAMvB;EAAK,EAAA,CAAA,GAAA,OAAA,IAAA;EAAAsF,OAAAyC,aAC9CxG,MAAM1B,QAAQ;EAAA2F,mBAAA;EAAA,OAAAuC;CAAA,EAAA,CAAA;AAGrB"}
@@ -0,0 +1,224 @@
1
+ import { Provider, dataAttr, useIsHydrated, useRenderProps } from "./utils.jsx";
2
+ import { TextContext } from "./Text.jsx";
3
+ import { FormContext } from "./Form.jsx";
4
+ import { HiddenTimeInput } from "./HiddenTimeInput.jsx";
5
+ import { For, Show, createContext, createMemo, createSignal, splitProps, useContext } from "solid-js";
6
+ import { createTimeField, createTimeSegment } from "@proyecto-viviana/solidaria";
7
+ import { access, createTimeFieldState } from "@proyecto-viviana/solid-stately";
8
+ //#region src/TimeField.tsx
9
+ /**
10
+ * TimeField component for solidaria-components
11
+ *
12
+ * Pre-wired headless time field component with segment-based editing.
13
+ * Port of react-aria-components/src/TimeField.tsx
14
+ */
15
+ const TimeFieldContext = createContext(null);
16
+ const TimeFieldStateContext = createContext(null);
17
+ function withFormValidationBehavior(props, formContext) {
18
+ if (!formContext?.validationBehavior) return props;
19
+ return new Proxy(props, {
20
+ get(target, property, receiver) {
21
+ const localValue = Reflect.get(target, property, receiver);
22
+ if (property === "validationBehavior" && localValue === void 0) return formContext.validationBehavior;
23
+ return localValue;
24
+ },
25
+ has(target, property) {
26
+ return Reflect.has(target, property) || property === "validationBehavior" && formContext.validationBehavior !== void 0;
27
+ },
28
+ ownKeys(target) {
29
+ const keys = new Set(Reflect.ownKeys(target));
30
+ if (formContext.validationBehavior !== void 0) keys.add("validationBehavior");
31
+ return Array.from(keys);
32
+ },
33
+ getOwnPropertyDescriptor(target, property) {
34
+ const descriptor = Reflect.getOwnPropertyDescriptor(target, property);
35
+ if (descriptor) return descriptor;
36
+ if (property === "validationBehavior" && formContext.validationBehavior !== void 0) return {
37
+ enumerable: true,
38
+ configurable: true,
39
+ get: () => formContext.validationBehavior
40
+ };
41
+ }
42
+ });
43
+ }
44
+ function useTimeFieldContextValue() {
45
+ const context = useContext(TimeFieldContext);
46
+ if (!context) throw new Error("TimeField components must be used within a TimeField");
47
+ return context;
48
+ }
49
+ function useTimeFieldContext() {
50
+ return useTimeFieldContextValue().state;
51
+ }
52
+ /**
53
+ * A time field allows users to enter and edit time values using a keyboard.
54
+ *
55
+ * @example
56
+ * ```tsx
57
+ * <TimeField label="Time">
58
+ * <Label>Time</Label>
59
+ * <TimeInput>
60
+ * {(segment) => <TimeSegment segment={segment} />}
61
+ * </TimeInput>
62
+ * </TimeField>
63
+ * ```
64
+ */
65
+ function TimeField(props) {
66
+ const isHydrated = useIsHydrated();
67
+ const formContext = useContext(FormContext);
68
+ return <Show when={isHydrated()} fallback={<div class="solidaria-TimeField solidaria-TimeField--placeholder" aria-hidden="true" />}>
69
+ <TimeFieldInner {...props} __formContext={formContext} />
70
+ </Show>;
71
+ }
72
+ /**
73
+ * Internal TimeField component that renders after client mount.
74
+ */
75
+ function TimeFieldInner(props) {
76
+ const formContext = props.__formContext ?? useContext(FormContext);
77
+ const [local, stateProps, rest] = splitProps(withFormValidationBehavior(props, formContext), [
78
+ "children",
79
+ "class",
80
+ "style",
81
+ "slot",
82
+ "__formContext"
83
+ ], [
84
+ "value",
85
+ "defaultValue",
86
+ "onChange",
87
+ "minValue",
88
+ "maxValue",
89
+ "isInvalid",
90
+ "isDisabled",
91
+ "isReadOnly",
92
+ "isRequired",
93
+ "locale",
94
+ "granularity",
95
+ "hourCycle",
96
+ "shouldForceLeadingZeros",
97
+ "validationState",
98
+ "validationBehavior",
99
+ "validate",
100
+ "description",
101
+ "errorMessage",
102
+ "placeholderValue"
103
+ ]);
104
+ const [fieldRef, setFieldRef] = createSignal(null);
105
+ const state = createTimeFieldState(stateProps);
106
+ const fieldAria = createTimeField(() => ({
107
+ ...rest,
108
+ description: stateProps.description,
109
+ errorMessage: stateProps.errorMessage
110
+ }), state, fieldRef);
111
+ const renderValues = createMemo(() => ({
112
+ isDisabled: state.isDisabled(),
113
+ isReadOnly: state.isReadOnly(),
114
+ isRequired: state.isRequired(),
115
+ isInvalid: state.isInvalid()
116
+ }));
117
+ const renderProps = useRenderProps({
118
+ class: local.class,
119
+ style: local.style,
120
+ defaultClassName: "solidaria-TimeField"
121
+ }, renderValues);
122
+ const validationBehavior = () => stateProps.validationBehavior ?? formContext?.validationBehavior ?? "native";
123
+ const textSlots = { slots: {
124
+ get description() {
125
+ return fieldAria.descriptionProps;
126
+ },
127
+ get errorMessage() {
128
+ return fieldAria.errorMessageProps;
129
+ }
130
+ } };
131
+ return <TimeFieldStateContext.Provider value={state}>
132
+ <TimeFieldContext.Provider value={{
133
+ state,
134
+ aria: {
135
+ labelProps: fieldAria.labelProps,
136
+ inputProps: fieldAria.inputProps,
137
+ descriptionProps: fieldAria.descriptionProps,
138
+ errorMessageProps: fieldAria.errorMessageProps
139
+ }
140
+ }}>
141
+ <div ref={setFieldRef} {...fieldAria.fieldProps} class={renderProps.class()} style={renderProps.style()} data-disabled={dataAttr(state.isDisabled())} data-readonly={dataAttr(state.isReadOnly())} data-required={dataAttr(state.isRequired())} data-invalid={dataAttr(state.isInvalid())}>
142
+ <Provider values={[[TextContext, textSlots]]}>
143
+ {local.children}
144
+ </Provider>
145
+ </div>
146
+ <Show when={rest.name}>
147
+ <HiddenTimeInput name={rest.name} form={rest.form} value={state.value()} autoComplete={rest.autoComplete} isDisabled={state.isDisabled()} isRequired={state.isRequired()} validationBehavior={validationBehavior()} validationState={state} focus={() => {
148
+ fieldRef()?.querySelector("[role=\"spinbutton\"]")?.focus();
149
+ }} minValue={access(stateProps.minValue)} maxValue={access(stateProps.maxValue)} granularity={state.granularity} />
150
+ </Show>
151
+ </TimeFieldContext.Provider>
152
+ </TimeFieldStateContext.Provider>;
153
+ }
154
+ /**
155
+ * The input area containing time segments.
156
+ */
157
+ function TimeInput(props) {
158
+ const { state, aria } = useTimeFieldContextValue();
159
+ const [isFocused, setIsFocused] = createSignal(false);
160
+ const renderValues = createMemo(() => ({
161
+ isDisabled: state.isDisabled(),
162
+ isFocused: isFocused()
163
+ }));
164
+ const renderProps = useRenderProps({
165
+ class: props.class,
166
+ style: props.style,
167
+ defaultClassName: "solidaria-TimeInput"
168
+ }, renderValues);
169
+ return <div {...aria.inputProps} class={renderProps.class()} style={renderProps.style()} data-disabled={dataAttr(state.isDisabled())} data-focused={dataAttr(isFocused())} onFocusIn={() => setIsFocused(true)} onFocusOut={() => setIsFocused(false)}>
170
+ <For each={state.segments()}>{(segment) => props.children?.(segment)}</For>
171
+ </div>;
172
+ }
173
+ /**
174
+ * A segment of a time field (hour, minute, second, AM/PM).
175
+ */
176
+ function TimeSegment(props) {
177
+ const state = useTimeFieldContext();
178
+ const [segmentRef, setSegmentRef] = createSignal(null);
179
+ const segmentAria = createTimeSegment({ segment: props.segment }, state, segmentRef);
180
+ const renderValues = createMemo(() => ({
181
+ isFocused: segmentAria.isFocused,
182
+ isEditable: segmentAria.isEditable,
183
+ isPlaceholder: segmentAria.isPlaceholder,
184
+ type: props.segment.type,
185
+ text: segmentAria.text
186
+ }));
187
+ const renderProps = useRenderProps({
188
+ get children() {
189
+ return props.children;
190
+ },
191
+ class: props.class,
192
+ style: props.style,
193
+ defaultClassName: "solidaria-TimeSegment"
194
+ }, renderValues);
195
+ const getChildren = () => {
196
+ if (typeof props.children === "function") return renderProps.renderChildren();
197
+ return segmentAria.text;
198
+ };
199
+ return <div ref={setSegmentRef} {...segmentAria.segmentProps} class={renderProps.class()} style={renderProps.style()} data-focused={dataAttr(segmentAria.isFocused)} data-editable={dataAttr(segmentAria.isEditable)} data-placeholder={dataAttr(segmentAria.isPlaceholder)} data-type={props.segment.type}>
200
+ {getChildren()}
201
+ </div>;
202
+ }
203
+ function TimeFieldLabel(props) {
204
+ const { aria } = useTimeFieldContextValue();
205
+ return <span {...aria.labelProps} class={props.class}>
206
+ {props.children}
207
+ </span>;
208
+ }
209
+ function TimeFieldDescription(props) {
210
+ const { aria } = useTimeFieldContextValue();
211
+ return <p {...aria.descriptionProps} class={props.class}>
212
+ {props.children}
213
+ </p>;
214
+ }
215
+ function TimeFieldErrorMessage(props) {
216
+ const { aria } = useTimeFieldContextValue();
217
+ return <p {...aria.errorMessageProps} class={props.class}>
218
+ {props.children}
219
+ </p>;
220
+ }
221
+ //#endregion
222
+ export { TimeField, TimeFieldContext, TimeFieldDescription, TimeFieldErrorMessage, TimeFieldLabel, TimeFieldStateContext, TimeInput, TimeSegment, useTimeFieldContext };
223
+
224
+ //# sourceMappingURL=TimeField.jsx.map