@proyecto-viviana/solidaria-components 0.4.0 → 0.5.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 (226) hide show
  1. package/dist/ActionBar.d.ts.map +1 -1
  2. package/dist/ActionBar.js +2 -11
  3. package/dist/ActionBar.js.map +1 -1
  4. package/dist/ActionBar.jsx +2 -11
  5. package/dist/ActionBar.jsx.map +1 -1
  6. package/dist/ActionGroup.d.ts.map +1 -1
  7. package/dist/ActionGroup.js +1 -1
  8. package/dist/ActionGroup.js.map +1 -1
  9. package/dist/ActionGroup.jsx +1 -1
  10. package/dist/ActionGroup.jsx.map +1 -1
  11. package/dist/Autocomplete.d.ts +2 -2
  12. package/dist/Autocomplete.d.ts.map +1 -1
  13. package/dist/Autocomplete.js +7 -7
  14. package/dist/Autocomplete.js.map +1 -1
  15. package/dist/Autocomplete.jsx +7 -7
  16. package/dist/Autocomplete.jsx.map +1 -1
  17. package/dist/Breadcrumbs.d.ts.map +1 -1
  18. package/dist/Breadcrumbs.js +18 -18
  19. package/dist/Breadcrumbs.js.map +1 -1
  20. package/dist/Breadcrumbs.jsx +21 -26
  21. package/dist/Breadcrumbs.jsx.map +1 -1
  22. package/dist/Calendar.d.ts.map +1 -1
  23. package/dist/Calendar.js +100 -65
  24. package/dist/Calendar.js.map +1 -1
  25. package/dist/Calendar.jsx +10 -1
  26. package/dist/Calendar.jsx.map +1 -1
  27. package/dist/Color.d.ts.map +1 -1
  28. package/dist/Color.js +15 -18
  29. package/dist/Color.js.map +1 -1
  30. package/dist/Color.jsx +15 -19
  31. package/dist/Color.jsx.map +1 -1
  32. package/dist/ComboBox.d.ts +4 -0
  33. package/dist/ComboBox.d.ts.map +1 -1
  34. package/dist/ComboBox.js +21 -13
  35. package/dist/ComboBox.js.map +1 -1
  36. package/dist/ComboBox.jsx +23 -13
  37. package/dist/ComboBox.jsx.map +1 -1
  38. package/dist/DateField.d.ts +11 -2
  39. package/dist/DateField.d.ts.map +1 -1
  40. package/dist/DateField2.js +237 -234
  41. package/dist/DateField2.js.map +1 -1
  42. package/dist/DateField2.jsx +134 -97
  43. package/dist/DateField2.jsx.map +1 -1
  44. package/dist/DatePicker.d.ts +42 -3
  45. package/dist/DatePicker.d.ts.map +1 -1
  46. package/dist/DatePicker.js +6 -990
  47. package/dist/DatePicker.jsx +6 -681
  48. package/dist/DatePicker2.js +1171 -0
  49. package/dist/DatePicker2.js.map +1 -0
  50. package/dist/DatePicker2.jsx +820 -0
  51. package/dist/DatePicker2.jsx.map +1 -0
  52. package/dist/DateRangePickerContext.d.ts +2 -0
  53. package/dist/DateRangePickerContext.d.ts.map +1 -1
  54. package/dist/Disclosure.d.ts.map +1 -1
  55. package/dist/Disclosure.js +3 -0
  56. package/dist/Disclosure.js.map +1 -1
  57. package/dist/Disclosure.jsx +1 -1
  58. package/dist/Disclosure.jsx.map +1 -1
  59. package/dist/ElementTag.d.ts +29 -0
  60. package/dist/ElementTag.d.ts.map +1 -0
  61. package/dist/ElementTag.js +220 -0
  62. package/dist/ElementTag.js.map +1 -0
  63. package/dist/ElementTag.jsx +67 -0
  64. package/dist/ElementTag.jsx.map +1 -0
  65. package/dist/GridList.d.ts.map +1 -1
  66. package/dist/GridList.js +2 -2
  67. package/dist/GridList.js.map +1 -1
  68. package/dist/GridList.jsx +2 -2
  69. package/dist/GridList.jsx.map +1 -1
  70. package/dist/Landmark.js +4 -3
  71. package/dist/Landmark.js.map +1 -1
  72. package/dist/Landmark.jsx +3 -3
  73. package/dist/Landmark.jsx.map +1 -1
  74. package/dist/Link.js +3 -2
  75. package/dist/Link.js.map +1 -1
  76. package/dist/Link.jsx +3 -3
  77. package/dist/Link.jsx.map +1 -1
  78. package/dist/ListBox.d.ts +2 -2
  79. package/dist/ListBox.d.ts.map +1 -1
  80. package/dist/ListBox.js +327 -166
  81. package/dist/ListBox.js.map +1 -1
  82. package/dist/ListBox.jsx +161 -25
  83. package/dist/ListBox.jsx.map +1 -1
  84. package/dist/Modal.d.ts.map +1 -1
  85. package/dist/Modal.js +7 -5
  86. package/dist/Modal.js.map +1 -1
  87. package/dist/Modal.jsx +5 -5
  88. package/dist/Modal.jsx.map +1 -1
  89. package/dist/Popover.d.ts.map +1 -1
  90. package/dist/Popover.js +16 -9
  91. package/dist/Popover.js.map +1 -1
  92. package/dist/Popover.jsx +25 -4
  93. package/dist/Popover.jsx.map +1 -1
  94. package/dist/RangeCalendar.d.ts.map +1 -1
  95. package/dist/RangeCalendar.js +182 -46
  96. package/dist/RangeCalendar.js.map +1 -1
  97. package/dist/RangeCalendar.jsx +72 -2
  98. package/dist/RangeCalendar.jsx.map +1 -1
  99. package/dist/SearchField.d.ts.map +1 -1
  100. package/dist/SearchField.js +26 -2
  101. package/dist/SearchField.js.map +1 -1
  102. package/dist/SearchField.jsx +26 -2
  103. package/dist/SearchField.jsx.map +1 -1
  104. package/dist/Select.d.ts +7 -0
  105. package/dist/Select.d.ts.map +1 -1
  106. package/dist/Select.js +64 -51
  107. package/dist/Select.js.map +1 -1
  108. package/dist/Select.jsx +35 -20
  109. package/dist/Select.jsx.map +1 -1
  110. package/dist/Separator.js +3 -2
  111. package/dist/Separator.js.map +1 -1
  112. package/dist/Separator.jsx +2 -2
  113. package/dist/Separator.jsx.map +1 -1
  114. package/dist/SharedElementTransition.d.ts.map +1 -1
  115. package/dist/SharedElementTransition.js +35 -33
  116. package/dist/SharedElementTransition.js.map +1 -1
  117. package/dist/SharedElementTransition.jsx +35 -33
  118. package/dist/SharedElementTransition.jsx.map +1 -1
  119. package/dist/StepList.d.ts.map +1 -1
  120. package/dist/StepList.js +2 -9
  121. package/dist/StepList.js.map +1 -1
  122. package/dist/StepList.jsx +1 -6
  123. package/dist/StepList.jsx.map +1 -1
  124. package/dist/Table.d.ts +2 -0
  125. package/dist/Table.d.ts.map +1 -1
  126. package/dist/Table.js +10 -3
  127. package/dist/Table.js.map +1 -1
  128. package/dist/Table.jsx +10 -3
  129. package/dist/Table.jsx.map +1 -1
  130. package/dist/Tabs.d.ts.map +1 -1
  131. package/dist/Tabs.js +3 -0
  132. package/dist/Tabs.js.map +1 -1
  133. package/dist/Tabs.jsx +1 -1
  134. package/dist/Tabs.jsx.map +1 -1
  135. package/dist/TagGroup.d.ts +3 -1
  136. package/dist/TagGroup.d.ts.map +1 -1
  137. package/dist/TagGroup.js +12 -8
  138. package/dist/TagGroup.js.map +1 -1
  139. package/dist/TagGroup.jsx +11 -8
  140. package/dist/TagGroup.jsx.map +1 -1
  141. package/dist/Text.d.ts.map +1 -1
  142. package/dist/Text.js +9 -8
  143. package/dist/Text.js.map +1 -1
  144. package/dist/Text.jsx +3 -3
  145. package/dist/Text.jsx.map +1 -1
  146. package/dist/TextField.js +4 -1
  147. package/dist/TextField.js.map +1 -1
  148. package/dist/TextField.jsx +4 -1
  149. package/dist/TextField.jsx.map +1 -1
  150. package/dist/TimeField.d.ts +14 -50
  151. package/dist/TimeField.d.ts.map +1 -1
  152. package/dist/TimeField.js +111 -205
  153. package/dist/TimeField.js.map +1 -1
  154. package/dist/TimeField.jsx +76 -82
  155. package/dist/TimeField.jsx.map +1 -1
  156. package/dist/Tree.d.ts.map +1 -1
  157. package/dist/Tree.js +3 -3
  158. package/dist/Tree.js.map +1 -1
  159. package/dist/Tree.jsx +3 -3
  160. package/dist/Tree.jsx.map +1 -1
  161. package/dist/VisuallyHidden.d.ts.map +1 -1
  162. package/dist/VisuallyHidden.js +3 -11
  163. package/dist/VisuallyHidden.js.map +1 -1
  164. package/dist/VisuallyHidden.jsx +3 -4
  165. package/dist/VisuallyHidden.jsx.map +1 -1
  166. package/dist/index.d.ts +3 -3
  167. package/dist/index.d.ts.map +1 -1
  168. package/dist/index.js +6 -6
  169. package/dist/index.jsx +6 -6
  170. package/dist/useDragAndDrop.d.ts +0 -8
  171. package/dist/useDragAndDrop.d.ts.map +1 -1
  172. package/dist/useDragAndDrop2.js +6 -2
  173. package/dist/useDragAndDrop2.js.map +1 -1
  174. package/dist/useDragAndDrop2.jsx +6 -2
  175. package/dist/useDragAndDrop2.jsx.map +1 -1
  176. package/dist/utils.d.ts +1 -0
  177. package/dist/utils.d.ts.map +1 -1
  178. package/dist/utils.js +2 -2
  179. package/dist/utils.js.map +1 -1
  180. package/dist/utils.jsx +2 -2
  181. package/dist/utils.jsx.map +1 -1
  182. package/package.json +3 -9
  183. package/src/ActionBar.tsx +10 -12
  184. package/src/ActionGroup.tsx +5 -3
  185. package/src/Autocomplete.tsx +14 -9
  186. package/src/Breadcrumbs.tsx +57 -42
  187. package/src/Calendar.tsx +30 -1
  188. package/src/Color.tsx +42 -27
  189. package/src/ComboBox.tsx +49 -17
  190. package/src/DateField.tsx +285 -52
  191. package/src/DatePicker.tsx +345 -57
  192. package/src/DateRangePickerContext.tsx +2 -0
  193. package/src/Disclosure.tsx +4 -0
  194. package/src/ElementTag.tsx +116 -0
  195. package/src/GridList.tsx +8 -2
  196. package/src/Landmark.tsx +4 -4
  197. package/src/Link.tsx +4 -4
  198. package/src/ListBox.tsx +323 -21
  199. package/src/Modal.tsx +21 -5
  200. package/src/Popover.tsx +28 -7
  201. package/src/RangeCalendar.tsx +120 -1
  202. package/src/SearchField.tsx +53 -1
  203. package/src/Select.tsx +114 -22
  204. package/src/Separator.tsx +3 -3
  205. package/src/SharedElementTransition.tsx +92 -36
  206. package/src/StepList.tsx +0 -7
  207. package/src/Table.tsx +19 -4
  208. package/src/Tabs.tsx +1 -0
  209. package/src/TagGroup.tsx +26 -6
  210. package/src/Text.tsx +5 -4
  211. package/src/TextField.tsx +1 -1
  212. package/src/TimeField.tsx +113 -196
  213. package/src/Tree.tsx +14 -4
  214. package/src/VisuallyHidden.tsx +8 -12
  215. package/src/index.ts +3 -8
  216. package/src/useDragAndDrop.ts +8 -10
  217. package/src/utils.tsx +3 -3
  218. package/dist/DatePicker.js.map +0 -1
  219. package/dist/DatePicker.jsx.map +0 -1
  220. package/dist/HiddenTimeInput.d.ts +0 -25
  221. package/dist/HiddenTimeInput.d.ts.map +0 -1
  222. package/dist/HiddenTimeInput.js +0 -104
  223. package/dist/HiddenTimeInput.js.map +0 -1
  224. package/dist/HiddenTimeInput.jsx +0 -69
  225. package/dist/HiddenTimeInput.jsx.map +0 -1
  226. package/src/HiddenTimeInput.tsx +0 -133
@@ -1,109 +1,11 @@
1
1
  import { Provider, dataAttr, useIsHydrated, useRenderProps } from "./utils.js";
2
2
  import { TextContext } from "./Text.js";
3
3
  import { FormContext } from "./Form.js";
4
- import { addEventListener, createComponent, effect, getNextElement, insert, mergeProps, runHydrationEvents, setAttribute, setProperty, spread, style, template, use } from "solid-js/web";
5
- import { For, Show, createContext, createEffect, createMemo, createSignal, onCleanup, splitProps, useContext } from "solid-js";
6
- import { createDateField, createDateSegment, createFormValidation } from "@proyecto-viviana/solidaria";
4
+ import { className, createComponent, effect, getNextElement, insert, mergeProps, runHydrationEvents, setAttribute, setProperty, spread, style, template, use } from "solid-js/web";
5
+ import { Index, Show, createContext, createEffect, createMemo, createSignal, onCleanup, splitProps, useContext } from "solid-js";
6
+ import { createDateField, createDateSegment, createFocusRing, createHover, createVisuallyHidden, mergeProps as mergeProps$2 } from "@proyecto-viviana/solidaria";
7
7
  import { access, createDateFieldState } from "@proyecto-viviana/solid-stately";
8
- //#region src/HiddenDateInput.tsx
9
- /**
10
- * HiddenDateInput component for solidaria-components
11
- *
12
- * A hidden native date/datetime-local input for form submission.
13
- * Renders server-side with the initial value for SSR safety.
14
- */
15
- var _tmpl$$1 = /*#__PURE__*/ template(`<input tabindex=-1 aria-hidden=true>`);
16
- function accessValue(value) {
17
- return typeof value === "function" ? value() : value;
18
- }
19
- function formatDateValue(value, granularity) {
20
- if (!value) return "";
21
- if ("timeZone" in value) return String(value);
22
- const dateValue = value;
23
- const year = String(dateValue.year).padStart(4, "0");
24
- const month = String(dateValue.month).padStart(2, "0");
25
- const day = String(dateValue.day).padStart(2, "0");
26
- if (granularity === "day") return `${year}-${month}-${day}`;
27
- const hasHour = "hour" in dateValue;
28
- const hour = hasHour ? String(dateValue.hour).padStart(2, "0") : "00";
29
- const hasMinute = hasHour && "minute" in dateValue;
30
- const minute = hasMinute ? String(dateValue.minute).padStart(2, "0") : "00";
31
- if (granularity === "second" && hasMinute && "second" in dateValue) return `${year}-${month}-${day}T${hour}:${minute}:${String(dateValue.second).padStart(2, "0")}`;
32
- return `${year}-${month}-${day}T${hour}:${minute}`;
33
- }
34
- function HiddenDateInput(props) {
35
- const granularity = () => props.granularity ?? "day";
36
- const hasValidationBehavior = () => props.validationBehavior != null;
37
- const validationBehavior = () => props.validationBehavior;
38
- const usesNativeValidation = () => validationBehavior() === "native";
39
- const value = () => accessValue(props.value);
40
- const minValue = () => accessValue(props.minValue);
41
- const maxValue = () => accessValue(props.maxValue);
42
- const hasTimeZoneValue = () => Boolean(value() && "timeZone" in value() || minValue() && "timeZone" in minValue() || maxValue() && "timeZone" in maxValue());
43
- const inputType = () => usesNativeValidation() ? "text" : hasValidationBehavior() ? "hidden" : hasTimeZoneValue() ? "hidden" : granularity() === "day" ? "date" : "datetime-local";
44
- const formattedValue = () => formatDateValue(value(), granularity());
45
- const formattedMin = () => formatDateValue(minValue(), granularity());
46
- const formattedMax = () => formatDateValue(maxValue(), granularity());
47
- const [inputRef, setInputRef] = createSignal();
48
- if (props.validationState) createFormValidation({
49
- get validationBehavior() {
50
- return validationBehavior();
51
- },
52
- get focus() {
53
- return props.focus;
54
- }
55
- }, props.validationState, inputRef);
56
- createEffect(() => {
57
- const val = formattedValue();
58
- const input = inputRef();
59
- if (input && input.value !== val) input.value = val;
60
- });
61
- return (() => {
62
- var _el$ = getNextElement(_tmpl$$1);
63
- addEventListener(_el$, "change", usesNativeValidation() ? () => {} : void 0);
64
- use((el) => {
65
- setInputRef(el);
66
- }, _el$);
67
- effect((_p$) => {
68
- var _v$ = inputType(), _v$2 = props.name, _v$3 = props.form, _v$4 = props.autoComplete, _v$5 = props.isDisabled, _v$6 = usesNativeValidation() && props.isRequired ? true : void 0, _v$7 = usesNativeValidation() || void 0, _v$8 = hasValidationBehavior() ? void 0 : formattedMin() || void 0, _v$9 = hasValidationBehavior() ? void 0 : formattedMax() || void 0, _v$0 = {
69
- position: "absolute",
70
- width: "1px",
71
- height: "1px",
72
- padding: "0",
73
- margin: "-1px",
74
- overflow: "hidden",
75
- clip: "rect(0, 0, 0, 0)",
76
- "white-space": "nowrap",
77
- "border-width": "0"
78
- };
79
- _v$ !== _p$.e && setAttribute(_el$, "type", _p$.e = _v$);
80
- _v$2 !== _p$.t && setAttribute(_el$, "name", _p$.t = _v$2);
81
- _v$3 !== _p$.a && setAttribute(_el$, "form", _p$.a = _v$3);
82
- _v$4 !== _p$.o && setAttribute(_el$, "autocomplete", _p$.o = _v$4);
83
- _v$5 !== _p$.i && setProperty(_el$, "disabled", _p$.i = _v$5);
84
- _v$6 !== _p$.n && setProperty(_el$, "required", _p$.n = _v$6);
85
- _v$7 !== _p$.s && setProperty(_el$, "hidden", _p$.s = _v$7);
86
- _v$8 !== _p$.h && setAttribute(_el$, "min", _p$.h = _v$8);
87
- _v$9 !== _p$.r && setAttribute(_el$, "max", _p$.r = _v$9);
88
- _p$.d = style(_el$, _v$0, _p$.d);
89
- return _p$;
90
- }, {
91
- e: void 0,
92
- t: void 0,
93
- a: void 0,
94
- o: void 0,
95
- i: void 0,
96
- n: void 0,
97
- s: void 0,
98
- h: void 0,
99
- r: void 0,
100
- d: void 0
101
- });
102
- effect(() => setProperty(_el$, "value", formattedValue()));
103
- return _el$;
104
- })();
105
- }
106
- //#endregion
8
+ import { parseDate, parseDateTime, toCalendarDate, toCalendarDateTime, toLocalTimeZone } from "@internationalized/date";
107
9
  //#region src/DateRangePickerContext.tsx
108
10
  const DateRangePickerContext = createContext(null);
109
11
  function useDateRangePickerContext() {
@@ -119,7 +21,7 @@ function useDateRangePickerContext() {
119
21
  * Pre-wired headless date field component with segment-based editing.
120
22
  * Port of react-aria-components/src/DateField.tsx
121
23
  */
122
- var _tmpl$ = /*#__PURE__*/ template(`<div class="solidaria-DateField solidaria-DateField--placeholder"aria-hidden=true>`), _tmpl$2 = /*#__PURE__*/ template(`<div>`), _tmpl$3 = /*#__PURE__*/ template(`<span>`), _tmpl$4 = /*#__PURE__*/ template(`<p>`);
24
+ var _tmpl$ = /*#__PURE__*/ template(`<div class="solidaria-DateField solidaria-DateField--placeholder"aria-hidden=true>`), _tmpl$2 = /*#__PURE__*/ template(`<div>`), _tmpl$3 = /*#__PURE__*/ template(`<div><input tabindex=-1 form>`), _tmpl$4 = /*#__PURE__*/ template(`<input>`), _tmpl$5 = /*#__PURE__*/ template(`<span>`);
123
25
  const DateFieldContext = createContext(null);
124
26
  const DateFieldStateContext = createContext(null);
125
27
  function withFormValidationBehavior(props, formContext) {
@@ -194,8 +96,7 @@ function DateField(props) {
194
96
  * Internal DateField component that renders after client mount.
195
97
  */
196
98
  function DateFieldInner(props) {
197
- const formContext = props.__formContext ?? useContext(FormContext);
198
- const [local, stateProps, rest] = splitProps(withFormValidationBehavior(props, formContext), [
99
+ const [local, stateProps, rest] = splitProps(withFormValidationBehavior(props, props.__formContext ?? useContext(FormContext)), [
199
100
  "children",
200
101
  "class",
201
102
  "style",
@@ -225,11 +126,17 @@ function DateFieldInner(props) {
225
126
  "isDateUnavailable"
226
127
  ]);
227
128
  const [fieldRef, setFieldRef] = createSignal(null);
129
+ const [validationInputRef, setValidationInputRef] = createSignal(null);
228
130
  const state = createDateFieldState(stateProps);
229
131
  const fieldAria = createDateField(() => ({
230
132
  ...rest,
133
+ isDisabled: access(stateProps.isDisabled),
134
+ isReadOnly: access(stateProps.isReadOnly),
135
+ isRequired: access(stateProps.isRequired),
136
+ validationBehavior: stateProps.validationBehavior ?? "native",
231
137
  description: stateProps.description,
232
- errorMessage: stateProps.errorMessage
138
+ errorMessage: stateProps.errorMessage,
139
+ inputRef: () => validationInputRef() ?? void 0
233
140
  }), state, fieldRef);
234
141
  const renderValues = createMemo(() => ({
235
142
  isDisabled: state.isDisabled(),
@@ -242,7 +149,6 @@ function DateFieldInner(props) {
242
149
  style: local.style,
243
150
  defaultClassName: "solidaria-DateField"
244
151
  }, renderValues);
245
- const validationBehavior = () => stateProps.validationBehavior ?? formContext?.validationBehavior ?? "native";
246
152
  const textSlots = { slots: {
247
153
  get description() {
248
154
  return fieldAria.descriptionProps;
@@ -255,97 +161,158 @@ function DateFieldInner(props) {
255
161
  value: state,
256
162
  get children() {
257
163
  return createComponent(DateFieldContext.Provider, {
258
- get value() {
259
- return {
260
- state,
261
- aria: {
262
- labelProps: fieldAria.labelProps,
263
- inputProps: fieldAria.inputProps,
264
- descriptionProps: fieldAria.descriptionProps,
265
- errorMessageProps: fieldAria.errorMessageProps
164
+ value: {
165
+ state,
166
+ aria: {
167
+ get labelProps() {
168
+ return fieldAria.labelProps;
169
+ },
170
+ get inputProps() {
171
+ return fieldAria.fieldProps;
172
+ },
173
+ get hiddenInputProps() {
174
+ return mergeProps$2(fieldAria.inputProps, { ref: setValidationInputRef });
175
+ },
176
+ get descriptionProps() {
177
+ return fieldAria.descriptionProps;
178
+ },
179
+ get errorMessageProps() {
180
+ return fieldAria.errorMessageProps;
266
181
  }
267
- };
182
+ }
268
183
  },
269
184
  get children() {
270
185
  return [(() => {
271
186
  var _el$2 = getNextElement(_tmpl$2);
272
187
  use(setFieldRef, _el$2);
273
- spread(_el$2, mergeProps(() => fieldAria.fieldProps, {
274
- get ["class"]() {
275
- return renderProps.class();
276
- },
277
- get style() {
278
- return renderProps.style();
279
- },
280
- get ["data-disabled"]() {
281
- return dataAttr(state.isDisabled());
282
- },
283
- get ["data-readonly"]() {
284
- return dataAttr(state.isReadOnly());
285
- },
286
- get ["data-required"]() {
287
- return dataAttr(state.isRequired());
288
- },
289
- get ["data-invalid"]() {
290
- return dataAttr(state.isInvalid());
291
- }
292
- }), false, true);
293
188
  insert(_el$2, createComponent(Provider, {
294
189
  values: [[TextContext, textSlots]],
295
190
  get children() {
296
191
  return local.children;
297
192
  }
298
193
  }));
299
- runHydrationEvents();
194
+ effect((_p$) => {
195
+ var _v$ = renderProps.class(), _v$2 = renderProps.style(), _v$3 = dataAttr(state.isDisabled()), _v$4 = dataAttr(state.isReadOnly()), _v$5 = dataAttr(state.isRequired()), _v$6 = dataAttr(state.isInvalid());
196
+ _v$ !== _p$.e && className(_el$2, _p$.e = _v$);
197
+ _p$.t = style(_el$2, _v$2, _p$.t);
198
+ _v$3 !== _p$.a && setAttribute(_el$2, "data-disabled", _p$.a = _v$3);
199
+ _v$4 !== _p$.o && setAttribute(_el$2, "data-readonly", _p$.o = _v$4);
200
+ _v$5 !== _p$.i && setAttribute(_el$2, "data-required", _p$.i = _v$5);
201
+ _v$6 !== _p$.n && setAttribute(_el$2, "data-invalid", _p$.n = _v$6);
202
+ return _p$;
203
+ }, {
204
+ e: void 0,
205
+ t: void 0,
206
+ a: void 0,
207
+ o: void 0,
208
+ i: void 0,
209
+ n: void 0
210
+ });
300
211
  return _el$2;
301
- })(), createComponent(Show, {
302
- get when() {
212
+ })(), createComponent(RootHiddenDateInput, {
213
+ get autoComplete() {
214
+ return rest.autoComplete;
215
+ },
216
+ get name() {
303
217
  return rest.name;
304
218
  },
305
- get children() {
306
- return createComponent(HiddenDateInput, {
307
- get name() {
308
- return rest.name;
309
- },
310
- get form() {
311
- return rest.form;
312
- },
313
- get value() {
314
- return state.value();
315
- },
316
- get autoComplete() {
317
- return rest.autoComplete;
318
- },
319
- get isDisabled() {
320
- return state.isDisabled();
321
- },
322
- get isRequired() {
323
- return state.isRequired();
324
- },
325
- get validationBehavior() {
326
- return validationBehavior();
327
- },
328
- validationState: state,
329
- focus: () => {
330
- fieldRef()?.querySelector("[role=\"spinbutton\"]")?.focus();
331
- },
332
- get minValue() {
333
- return access(stateProps.minValue);
334
- },
335
- get maxValue() {
336
- return access(stateProps.maxValue);
337
- },
338
- get granularity() {
339
- return state.granularity;
340
- }
341
- });
342
- }
219
+ get isDisabled() {
220
+ return state.isDisabled();
221
+ },
222
+ state
343
223
  })];
344
224
  }
345
225
  });
346
226
  }
347
227
  });
348
228
  }
229
+ const HIDDEN_DATE_SEGMENTS = [
230
+ "day",
231
+ "month",
232
+ "year"
233
+ ];
234
+ const HIDDEN_TIME_SEGMENTS = [
235
+ "hour",
236
+ "minute",
237
+ "second"
238
+ ];
239
+ const HIDDEN_GRANULARITY_MAP = {
240
+ hour: 1,
241
+ minute: 2,
242
+ second: 3
243
+ };
244
+ /**
245
+ * The always-rendered hidden date input at the DateField root — a faithful port
246
+ * of react-aria-components' HiddenDateInput (private/HiddenDateInput.mjs). It is
247
+ * NOT a validation input: it is a clipped, aria-hidden, tabIndex={-1} native
248
+ * date input that mirrors the current value for browser autofill. `form=""`
249
+ * detaches it from form submission (the DateInput's <Input> submits), so it
250
+ * never double-counts in FormData. RAC renders it unconditionally, which is why
251
+ * it appears as the trailing tabindex="-1" element in the focus trail.
252
+ */
253
+ function RootHiddenDateInput(props) {
254
+ const { visuallyHiddenProps } = createVisuallyHidden(() => ({ style: {
255
+ position: "fixed",
256
+ top: "0",
257
+ left: "0"
258
+ } }));
259
+ const granularity = () => props.state.granularity ?? "day";
260
+ const inputStep = () => {
261
+ const g = granularity();
262
+ if (g === "second") return 1;
263
+ if (g === "hour") return 3600;
264
+ return 60;
265
+ };
266
+ const inputType = () => granularity() === "day" ? "date" : "datetime-local";
267
+ const dateValue = () => {
268
+ const value = props.state.value();
269
+ if (!value) return "";
270
+ if (granularity() === "day") return toCalendarDate(value).toString();
271
+ return toCalendarDateTime("timeZone" in value ? toLocalTimeZone(value) : value).toString();
272
+ };
273
+ const onChange = (event) => {
274
+ const targetString = (event.currentTarget.value ?? "").toString();
275
+ if (!targetString) return;
276
+ try {
277
+ const g = granularity();
278
+ const targetValue = g === "day" ? parseDate(targetString) : parseDateTime(targetString);
279
+ let timeSegments = HIDDEN_TIME_SEGMENTS;
280
+ if (HIDDEN_TIME_SEGMENTS.includes(g)) timeSegments = HIDDEN_TIME_SEGMENTS.slice(0, HIDDEN_GRANULARITY_MAP[g]);
281
+ const state = props.state;
282
+ if (typeof state.setSegment === "function") for (const type in targetValue) {
283
+ if (HIDDEN_DATE_SEGMENTS.includes(type)) state.setSegment(type, targetValue[type]);
284
+ if (timeSegments.includes(type)) state.setSegment(type, targetValue[type]);
285
+ }
286
+ state.setValue(targetValue);
287
+ } catch {}
288
+ };
289
+ return (() => {
290
+ var _el$3 = getNextElement(_tmpl$3), _el$4 = _el$3.firstChild;
291
+ spread(_el$3, mergeProps(() => visuallyHiddenProps(), {
292
+ "aria-hidden": "true",
293
+ "data-testid": "hidden-dateinput-container"
294
+ }), false, true);
295
+ _el$4.addEventListener("change", onChange);
296
+ effect((_p$) => {
297
+ var _v$7 = props.autoComplete, _v$8 = props.isDisabled, _v$9 = inputType(), _v$0 = props.name, _v$1 = inputStep();
298
+ _v$7 !== _p$.e && setAttribute(_el$4, "autocomplete", _p$.e = _v$7);
299
+ _v$8 !== _p$.t && setProperty(_el$4, "disabled", _p$.t = _v$8);
300
+ _v$9 !== _p$.a && setAttribute(_el$4, "type", _p$.a = _v$9);
301
+ _v$0 !== _p$.o && setAttribute(_el$4, "name", _p$.o = _v$0);
302
+ _v$1 !== _p$.i && setAttribute(_el$4, "step", _p$.i = _v$1);
303
+ return _p$;
304
+ }, {
305
+ e: void 0,
306
+ t: void 0,
307
+ a: void 0,
308
+ o: void 0,
309
+ i: void 0
310
+ });
311
+ effect(() => setProperty(_el$4, "value", dateValue()));
312
+ runHydrationEvents();
313
+ return _el$3;
314
+ })();
315
+ }
349
316
  /**
350
317
  * The input area containing date segments.
351
318
  */
@@ -363,6 +330,11 @@ function DateInput(props) {
363
330
  style: props.style,
364
331
  defaultClassName: "solidaria-DateInput"
365
332
  }, renderValues);
333
+ const inputDivProps = createMemo(() => mergeProps$2(aria.inputProps, {
334
+ onFocusIn: () => setIsFocused(true),
335
+ onFocusOut: () => setIsFocused(false),
336
+ style: renderProps.style()
337
+ }));
366
338
  createEffect(() => {
367
339
  const element = inputRef();
368
340
  const handler = props.onPointerDownCapture;
@@ -374,32 +346,45 @@ function DateInput(props) {
374
346
  return createComponent(DateFieldContext.Provider, {
375
347
  value: context,
376
348
  get children() {
377
- var _el$3 = getNextElement(_tmpl$2);
378
- use(setInputRef, _el$3);
379
- spread(_el$3, mergeProps(() => aria.inputProps, {
380
- get ["class"]() {
381
- return renderProps.class();
382
- },
383
- get style() {
384
- return renderProps.style();
385
- },
386
- get ["data-disabled"]() {
387
- return dataAttr(state.isDisabled());
388
- },
389
- get ["data-focused"]() {
390
- return dataAttr(isFocused());
349
+ return [(() => {
350
+ var _el$5 = getNextElement(_tmpl$2);
351
+ use(setInputRef, _el$5);
352
+ spread(_el$5, mergeProps(inputDivProps, {
353
+ get ["class"]() {
354
+ return renderProps.class();
355
+ },
356
+ get ["data-disabled"]() {
357
+ return dataAttr(state.isDisabled());
358
+ },
359
+ get ["data-focused"]() {
360
+ return dataAttr(isFocused());
361
+ }
362
+ }), false, true);
363
+ insert(_el$5, createComponent(Index, {
364
+ get each() {
365
+ return state.segments();
366
+ },
367
+ children: (segment) => {
368
+ const liveSegment = new Proxy({}, {
369
+ get: (_t, key) => segment()[key],
370
+ has: (_t, key) => key in segment()
371
+ });
372
+ return props.children?.(liveSegment);
373
+ }
374
+ }));
375
+ runHydrationEvents();
376
+ return _el$5;
377
+ })(), createComponent(Show, {
378
+ get when() {
379
+ return aria.hiddenInputProps;
391
380
  },
392
- "onFocusIn": () => setIsFocused(true),
393
- "onFocusOut": () => setIsFocused(false)
394
- }), false, true);
395
- insert(_el$3, createComponent(For, {
396
- get each() {
397
- return state.segments();
398
- },
399
- children: (segment) => props.children?.(segment)
400
- }));
401
- runHydrationEvents();
402
- return _el$3;
381
+ children: (hiddenInputProps) => (() => {
382
+ var _el$6 = getNextElement(_tmpl$4);
383
+ spread(_el$6, mergeProps(() => hiddenInputProps()), false, false);
384
+ runHydrationEvents();
385
+ return _el$6;
386
+ })()
387
+ })];
403
388
  }
404
389
  });
405
390
  }
@@ -409,13 +394,21 @@ function DateInput(props) {
409
394
  function DateSegment(props) {
410
395
  const { state } = useDateFieldContext();
411
396
  const [segmentRef, setSegmentRef] = createSignal(null);
412
- const segmentAria = createDateSegment({ segment: props.segment }, state, segmentRef);
397
+ const segmentAria = createDateSegment({ get segment() {
398
+ return props.segment;
399
+ } }, state, segmentRef);
400
+ const { isFocused, isFocusVisible, focusProps } = createFocusRing();
401
+ const { isHovered, hoverProps } = createHover(() => ({ isDisabled: state.isDisabled() || props.segment.type === "literal" }));
413
402
  const renderValues = createMemo(() => ({
414
- isFocused: segmentAria.isFocused,
415
- isEditable: segmentAria.isEditable,
416
- isPlaceholder: segmentAria.isPlaceholder,
403
+ isHovered: isHovered(),
404
+ isFocused: isFocused(),
405
+ isFocusVisible: isFocusVisible(),
406
+ isPlaceholder: props.segment.isPlaceholder,
407
+ isReadOnly: state.isReadOnly(),
408
+ isDisabled: state.isDisabled(),
409
+ isInvalid: state.isInvalid(),
417
410
  type: props.segment.type,
418
- text: segmentAria.text
411
+ text: props.segment.text
419
412
  }));
420
413
  const renderProps = useRenderProps({
421
414
  get children() {
@@ -427,73 +420,83 @@ function DateSegment(props) {
427
420
  }, renderValues);
428
421
  const getChildren = () => {
429
422
  if (typeof props.children === "function") return renderProps.renderChildren();
430
- return segmentAria.text;
423
+ return props.segment.text;
431
424
  };
425
+ const segmentElementProps = createMemo(() => mergeProps$2(segmentAria.segmentProps, focusProps, hoverProps, { style: renderProps.style() }));
432
426
  return (() => {
433
- var _el$4 = getNextElement(_tmpl$3);
434
- use(setSegmentRef, _el$4);
435
- spread(_el$4, mergeProps(() => segmentAria.segmentProps, {
427
+ var _el$7 = getNextElement(_tmpl$5);
428
+ use(setSegmentRef, _el$7);
429
+ spread(_el$7, mergeProps(segmentElementProps, {
436
430
  get ["class"]() {
437
431
  return renderProps.class();
438
432
  },
439
- get style() {
440
- return renderProps.style();
433
+ get ["data-placeholder"]() {
434
+ return props.segment.isPlaceholder || void 0;
441
435
  },
442
- get ["data-focused"]() {
443
- return dataAttr(segmentAria.isFocused);
436
+ get ["data-invalid"]() {
437
+ return state.isInvalid() || void 0;
444
438
  },
445
- get ["data-editable"]() {
446
- return dataAttr(segmentAria.isEditable);
439
+ get ["data-readonly"]() {
440
+ return state.isReadOnly() || void 0;
447
441
  },
448
- get ["data-placeholder"]() {
449
- return dataAttr(segmentAria.isPlaceholder);
442
+ get ["data-disabled"]() {
443
+ return state.isDisabled() || void 0;
450
444
  },
451
445
  get ["data-type"]() {
452
446
  return props.segment.type;
447
+ },
448
+ get ["data-hovered"]() {
449
+ return isHovered() || void 0;
450
+ },
451
+ get ["data-focused"]() {
452
+ return isFocused() || void 0;
453
+ },
454
+ get ["data-focus-visible"]() {
455
+ return isFocusVisible() || void 0;
453
456
  }
454
457
  }), false, true);
455
- insert(_el$4, getChildren);
458
+ insert(_el$7, getChildren);
456
459
  runHydrationEvents();
457
- return _el$4;
460
+ return _el$7;
458
461
  })();
459
462
  }
460
463
  function DateFieldLabel(props) {
461
464
  const { aria } = useDateFieldContext();
462
465
  return (() => {
463
- var _el$5 = getNextElement(_tmpl$3);
464
- spread(_el$5, mergeProps(() => aria.labelProps, { get ["class"]() {
466
+ var _el$8 = getNextElement(_tmpl$5);
467
+ spread(_el$8, mergeProps(() => aria.labelProps, { get ["class"]() {
465
468
  return props.class;
466
469
  } }), false, true);
467
- insert(_el$5, () => props.children);
470
+ insert(_el$8, () => props.children);
468
471
  runHydrationEvents();
469
- return _el$5;
472
+ return _el$8;
470
473
  })();
471
474
  }
472
475
  function DateFieldDescription(props) {
473
476
  const { aria } = useDateFieldContext();
474
477
  return (() => {
475
- var _el$6 = getNextElement(_tmpl$4);
476
- spread(_el$6, mergeProps(() => aria.descriptionProps, { get ["class"]() {
478
+ var _el$9 = getNextElement(_tmpl$5);
479
+ spread(_el$9, mergeProps(() => aria.descriptionProps, { get ["class"]() {
477
480
  return props.class;
478
481
  } }), false, true);
479
- insert(_el$6, () => props.children);
482
+ insert(_el$9, () => props.children);
480
483
  runHydrationEvents();
481
- return _el$6;
484
+ return _el$9;
482
485
  })();
483
486
  }
484
487
  function DateFieldErrorMessage(props) {
485
488
  const { aria } = useDateFieldContext();
486
489
  return (() => {
487
- var _el$7 = getNextElement(_tmpl$4);
488
- spread(_el$7, mergeProps(() => aria.errorMessageProps, { get ["class"]() {
490
+ var _el$0 = getNextElement(_tmpl$5);
491
+ spread(_el$0, mergeProps(() => aria.errorMessageProps, { get ["class"]() {
489
492
  return props.class;
490
493
  } }), false, true);
491
- insert(_el$7, () => props.children);
494
+ insert(_el$0, () => props.children);
492
495
  runHydrationEvents();
493
- return _el$7;
496
+ return _el$0;
494
497
  })();
495
498
  }
496
499
  //#endregion
497
- export { DateFieldLabel as a, DateSegment as c, useDateRangePickerContext as d, HiddenDateInput as f, DateFieldErrorMessage as i, useDateFieldContext as l, DateFieldContext as n, DateFieldStateContext as o, DateFieldDescription as r, DateInput as s, DateField as t, DateRangePickerContext as u };
500
+ export { DateFieldLabel as a, DateSegment as c, useDateRangePickerContext as d, DateFieldErrorMessage as i, useDateFieldContext as l, DateFieldContext as n, DateFieldStateContext as o, DateFieldDescription as r, DateInput as s, DateField as t, DateRangePickerContext as u };
498
501
 
499
502
  //# sourceMappingURL=DateField2.js.map