@proyecto-viviana/solidaria-components 0.2.9 → 0.3.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 (222) hide show
  1. package/README.md +39 -272
  2. package/dist/ActionBar.d.ts +21 -13
  3. package/dist/ActionBar.d.ts.map +1 -1
  4. package/dist/ActionGroup.d.ts +8 -8
  5. package/dist/ActionGroup.d.ts.map +1 -1
  6. package/dist/Alert.d.ts +5 -5
  7. package/dist/Alert.d.ts.map +1 -1
  8. package/dist/Autocomplete.d.ts +5 -5
  9. package/dist/Autocomplete.d.ts.map +1 -1
  10. package/dist/Breadcrumbs.d.ts +18 -7
  11. package/dist/Breadcrumbs.d.ts.map +1 -1
  12. package/dist/Button.d.ts +24 -5
  13. package/dist/Button.d.ts.map +1 -1
  14. package/dist/Calendar.d.ts +38 -7
  15. package/dist/Calendar.d.ts.map +1 -1
  16. package/dist/Checkbox.d.ts +32 -7
  17. package/dist/Checkbox.d.ts.map +1 -1
  18. package/dist/Collection.d.ts +19 -14
  19. package/dist/Collection.d.ts.map +1 -1
  20. package/dist/Color.d.ts +103 -14
  21. package/dist/Color.d.ts.map +1 -1
  22. package/dist/ColorEditor.d.ts +6 -6
  23. package/dist/ColorEditor.d.ts.map +1 -1
  24. package/dist/ComboBox.d.ts +85 -19
  25. package/dist/ComboBox.d.ts.map +1 -1
  26. package/dist/ContextualHelpTrigger.d.ts +2 -2
  27. package/dist/ContextualHelpTrigger.d.ts.map +1 -1
  28. package/dist/DateField.d.ts +8 -6
  29. package/dist/DateField.d.ts.map +1 -1
  30. package/dist/DatePicker.d.ts +53 -22
  31. package/dist/DatePicker.d.ts.map +1 -1
  32. package/dist/DateRangePickerContext.d.ts +30 -0
  33. package/dist/DateRangePickerContext.d.ts.map +1 -0
  34. package/dist/Dialog.d.ts +5 -5
  35. package/dist/Dialog.d.ts.map +1 -1
  36. package/dist/Disclosure.d.ts +23 -5
  37. package/dist/Disclosure.d.ts.map +1 -1
  38. package/dist/DragAndDrop.d.ts +6 -6
  39. package/dist/DragAndDrop.d.ts.map +1 -1
  40. package/dist/DragPreview.d.ts +2 -2
  41. package/dist/DragPreview.d.ts.map +1 -1
  42. package/dist/DropZone.d.ts +4 -4
  43. package/dist/DropZone.d.ts.map +1 -1
  44. package/dist/FieldError.d.ts +9 -5
  45. package/dist/FieldError.d.ts.map +1 -1
  46. package/dist/FileTrigger.d.ts +3 -3
  47. package/dist/FileTrigger.d.ts.map +1 -1
  48. package/dist/Focusable.d.ts +2 -2
  49. package/dist/Focusable.d.ts.map +1 -1
  50. package/dist/Form.d.ts +18 -4
  51. package/dist/Form.d.ts.map +1 -1
  52. package/dist/GridList.d.ts +32 -12
  53. package/dist/GridList.d.ts.map +1 -1
  54. package/dist/HiddenDateInput.d.ts +26 -0
  55. package/dist/HiddenDateInput.d.ts.map +1 -0
  56. package/dist/HiddenTimeInput.d.ts +25 -0
  57. package/dist/HiddenTimeInput.d.ts.map +1 -0
  58. package/dist/Icon.d.ts +5 -5
  59. package/dist/Icon.d.ts.map +1 -1
  60. package/dist/Keyboard.d.ts +1 -1
  61. package/dist/Landmark.d.ts +3 -3
  62. package/dist/Landmark.d.ts.map +1 -1
  63. package/dist/Link.d.ts +10 -4
  64. package/dist/Link.d.ts.map +1 -1
  65. package/dist/ListBox.d.ts +32 -12
  66. package/dist/ListBox.d.ts.map +1 -1
  67. package/dist/ListDropTargetDelegate.d.ts +6 -6
  68. package/dist/ListDropTargetDelegate.d.ts.map +1 -1
  69. package/dist/Menu.d.ts +65 -14
  70. package/dist/Menu.d.ts.map +1 -1
  71. package/dist/Meter.d.ts +3 -3
  72. package/dist/Meter.d.ts.map +1 -1
  73. package/dist/Modal.d.ts +5 -5
  74. package/dist/Modal.d.ts.map +1 -1
  75. package/dist/NumberField.d.ts +8 -12
  76. package/dist/NumberField.d.ts.map +1 -1
  77. package/dist/Popover.d.ts +28 -5
  78. package/dist/Popover.d.ts.map +1 -1
  79. package/dist/Pressable.d.ts +2 -2
  80. package/dist/Pressable.d.ts.map +1 -1
  81. package/dist/ProgressBar.d.ts +5 -3
  82. package/dist/ProgressBar.d.ts.map +1 -1
  83. package/dist/RadioGroup.d.ts +43 -9
  84. package/dist/RadioGroup.d.ts.map +1 -1
  85. package/dist/RangeCalendar.d.ts +34 -7
  86. package/dist/RangeCalendar.d.ts.map +1 -1
  87. package/dist/RouterProvider.d.ts +2 -2
  88. package/dist/RouterProvider.d.ts.map +1 -1
  89. package/dist/SearchField.d.ts +23 -20
  90. package/dist/SearchField.d.ts.map +1 -1
  91. package/dist/Select.d.ts +41 -11
  92. package/dist/Select.d.ts.map +1 -1
  93. package/dist/SelectionIndicator.d.ts +3 -3
  94. package/dist/SelectionIndicator.d.ts.map +1 -1
  95. package/dist/Separator.d.ts +9 -3
  96. package/dist/Separator.d.ts.map +1 -1
  97. package/dist/SharedElementTransition.d.ts +6 -4
  98. package/dist/SharedElementTransition.d.ts.map +1 -1
  99. package/dist/Slider.d.ts +12 -8
  100. package/dist/Slider.d.ts.map +1 -1
  101. package/dist/StepList.d.ts +90 -0
  102. package/dist/StepList.d.ts.map +1 -0
  103. package/dist/Switch.d.ts +11 -5
  104. package/dist/Switch.d.ts.map +1 -1
  105. package/dist/Table.d.ts +187 -23
  106. package/dist/Table.d.ts.map +1 -1
  107. package/dist/Tabs.d.ts +45 -9
  108. package/dist/Tabs.d.ts.map +1 -1
  109. package/dist/TagGroup.d.ts +12 -10
  110. package/dist/TagGroup.d.ts.map +1 -1
  111. package/dist/Text.d.ts +2 -2
  112. package/dist/TextField.d.ts +15 -11
  113. package/dist/TextField.d.ts.map +1 -1
  114. package/dist/TimeField.d.ts +6 -6
  115. package/dist/TimeField.d.ts.map +1 -1
  116. package/dist/Toast.d.ts +29 -14
  117. package/dist/Toast.d.ts.map +1 -1
  118. package/dist/ToggleButton.d.ts +11 -5
  119. package/dist/ToggleButton.d.ts.map +1 -1
  120. package/dist/ToggleButtonGroup.d.ts +7 -7
  121. package/dist/ToggleButtonGroup.d.ts.map +1 -1
  122. package/dist/Toolbar.d.ts +7 -3
  123. package/dist/Toolbar.d.ts.map +1 -1
  124. package/dist/Tooltip.d.ts +50 -8
  125. package/dist/Tooltip.d.ts.map +1 -1
  126. package/dist/Tree.d.ts +66 -17
  127. package/dist/Tree.d.ts.map +1 -1
  128. package/dist/Virtualizer.d.ts +12 -12
  129. package/dist/Virtualizer.d.ts.map +1 -1
  130. package/dist/VirtualizerLayouts.d.ts +2 -2
  131. package/dist/VirtualizerLayouts.d.ts.map +1 -1
  132. package/dist/VisuallyHidden.d.ts +1 -1
  133. package/dist/VisuallyHidden.d.ts.map +1 -1
  134. package/dist/contexts.d.ts +5 -1
  135. package/dist/contexts.d.ts.map +1 -1
  136. package/dist/index.d.ts +73 -71
  137. package/dist/index.d.ts.map +1 -1
  138. package/dist/index.js +23247 -18564
  139. package/dist/index.js.map +1 -1
  140. package/dist/index.jsx +18110 -0
  141. package/dist/index.jsx.map +1 -0
  142. package/dist/useDragAndDrop.d.ts +13 -13
  143. package/dist/useDragAndDrop.d.ts.map +1 -1
  144. package/dist/utils.d.ts +2 -2
  145. package/dist/utils.d.ts.map +1 -1
  146. package/dist/virtualizer/Layout.d.ts +1 -1
  147. package/dist/virtualizer/Layout.d.ts.map +1 -1
  148. package/package.json +31 -32
  149. package/src/ActionBar.tsx +75 -72
  150. package/src/ActionGroup.tsx +53 -61
  151. package/src/Alert.tsx +17 -42
  152. package/src/Autocomplete.tsx +39 -44
  153. package/src/Breadcrumbs.tsx +149 -80
  154. package/src/Button.tsx +267 -70
  155. package/src/Calendar.tsx +218 -138
  156. package/src/Checkbox.tsx +413 -121
  157. package/src/Collection.tsx +67 -58
  158. package/src/Color.tsx +803 -380
  159. package/src/ColorEditor.tsx +131 -149
  160. package/src/ComboBox.tsx +414 -249
  161. package/src/ContextualHelpTrigger.tsx +86 -74
  162. package/src/DateField.tsx +185 -91
  163. package/src/DatePicker.tsx +524 -213
  164. package/src/DateRangePickerContext.tsx +44 -0
  165. package/src/Dialog.tsx +156 -118
  166. package/src/Disclosure.tsx +127 -80
  167. package/src/DragAndDrop.tsx +60 -54
  168. package/src/DragPreview.tsx +13 -11
  169. package/src/DropZone.tsx +42 -22
  170. package/src/FieldError.tsx +45 -23
  171. package/src/FileTrigger.tsx +19 -19
  172. package/src/Focusable.tsx +21 -24
  173. package/src/Form.tsx +71 -16
  174. package/src/GridList.tsx +273 -197
  175. package/src/HiddenDateInput.tsx +153 -0
  176. package/src/HiddenTimeInput.tsx +133 -0
  177. package/src/Icon.tsx +22 -43
  178. package/src/Keyboard.tsx +3 -3
  179. package/src/Landmark.tsx +37 -63
  180. package/src/Link.tsx +125 -75
  181. package/src/ListBox.tsx +332 -233
  182. package/src/ListDropTargetDelegate.ts +81 -80
  183. package/src/Menu.tsx +1023 -274
  184. package/src/Meter.tsx +38 -56
  185. package/src/Modal.tsx +243 -175
  186. package/src/NumberField.tsx +139 -143
  187. package/src/Popover.tsx +386 -233
  188. package/src/Pressable.tsx +21 -21
  189. package/src/ProgressBar.tsx +48 -57
  190. package/src/RadioGroup.tsx +524 -122
  191. package/src/RangeCalendar.tsx +157 -90
  192. package/src/RouterProvider.tsx +30 -47
  193. package/src/SearchField.tsx +362 -143
  194. package/src/Select.tsx +656 -233
  195. package/src/SelectionIndicator.tsx +18 -15
  196. package/src/Separator.tsx +47 -49
  197. package/src/SharedElementTransition.tsx +103 -97
  198. package/src/Slider.tsx +138 -98
  199. package/src/StepList.tsx +272 -0
  200. package/src/Switch.tsx +93 -46
  201. package/src/Table.tsx +1308 -342
  202. package/src/Tabs.tsx +324 -103
  203. package/src/TagGroup.tsx +139 -126
  204. package/src/Text.tsx +3 -3
  205. package/src/TextField.tsx +389 -79
  206. package/src/TimeField.tsx +136 -76
  207. package/src/Toast.tsx +209 -157
  208. package/src/ToggleButton.tsx +47 -37
  209. package/src/ToggleButtonGroup.tsx +39 -34
  210. package/src/Toolbar.tsx +54 -69
  211. package/src/Tooltip.tsx +387 -119
  212. package/src/Tree.tsx +651 -368
  213. package/src/Virtualizer.tsx +208 -180
  214. package/src/VirtualizerLayouts.ts +45 -30
  215. package/src/VisuallyHidden.tsx +19 -19
  216. package/src/contexts.ts +29 -37
  217. package/src/index.ts +110 -195
  218. package/src/useDragAndDrop.ts +87 -71
  219. package/src/utils.tsx +40 -55
  220. package/src/virtualizer/Layout.ts +14 -22
  221. package/dist/index.ssr.js +0 -16996
  222. package/dist/index.ssr.js.map +0 -1
package/src/DateField.tsx CHANGED
@@ -8,26 +8,29 @@
8
8
  import {
9
9
  type JSX,
10
10
  createContext,
11
+ createEffect,
11
12
  createMemo,
12
13
  createSignal,
14
+ onCleanup,
13
15
  splitProps,
14
16
  useContext,
15
17
  For,
16
18
  Show,
17
- } from 'solid-js';
19
+ } from "solid-js";
18
20
  import {
19
21
  createDateField,
20
22
  createDateSegment,
21
23
  type AriaDateFieldProps,
22
- } from '@proyecto-viviana/solidaria';
24
+ } from "@proyecto-viviana/solidaria";
23
25
  import {
24
26
  createDateFieldState,
27
+ access,
25
28
  type DateFieldState,
26
29
  type DateFieldStateProps,
27
30
  type DateSegment as DateSegmentType,
28
31
  type CalendarDate,
29
32
  type DateValue,
30
- } from '@proyecto-viviana/solid-stately';
33
+ } from "@proyecto-viviana/solid-stately";
31
34
  import {
32
35
  type RenderChildren,
33
36
  type ClassNameOrFunction,
@@ -36,11 +39,13 @@ import {
36
39
  useRenderProps,
37
40
  dataAttr,
38
41
  useIsHydrated,
39
- } from './utils';
40
-
41
- // ============================================
42
- // TYPES
43
- // ============================================
42
+ } from "./utils";
43
+ import { HiddenDateInput } from "./HiddenDateInput";
44
+ import { FormContext, type FormProps } from "./Form";
45
+ import {
46
+ DateRangePickerContext,
47
+ type DateRangePickerFieldContextValue,
48
+ } from "./DateRangePickerContext";
44
49
 
45
50
  export interface DateFieldRenderProps {
46
51
  /** Whether the field is disabled. */
@@ -54,8 +59,9 @@ export interface DateFieldRenderProps {
54
59
  }
55
60
 
56
61
  export interface DateFieldProps<T extends DateValue = DateValue>
57
- extends Omit<AriaDateFieldProps, 'id' | 'isDisabled' | 'isReadOnly' | 'isRequired'>,
58
- Omit<DateFieldStateProps<T>, 'locale'>,
62
+ extends
63
+ Omit<AriaDateFieldProps, "id" | "isDisabled" | "isReadOnly" | "isRequired">,
64
+ Omit<DateFieldStateProps<T>, "locale">,
59
65
  SlotProps {
60
66
  /** The children of the component. */
61
67
  children?: JSX.Element | ((segment: DateSegmentType) => JSX.Element);
@@ -81,6 +87,8 @@ export interface DateInputProps extends SlotProps {
81
87
  class?: ClassNameOrFunction<DateInputRenderProps>;
82
88
  /** The inline style for the element. */
83
89
  style?: StyleOrFunction<DateInputRenderProps>;
90
+ /** Handler called during the pointer down capture phase. */
91
+ onPointerDownCapture?: JSX.EventHandler<HTMLDivElement, PointerEvent>;
84
92
  }
85
93
 
86
94
  export interface DateSegmentRenderProps {
@@ -91,7 +99,7 @@ export interface DateSegmentRenderProps {
91
99
  /** Whether the segment is a placeholder. */
92
100
  isPlaceholder: boolean;
93
101
  /** The segment type. */
94
- type: DateSegmentType['type'];
102
+ type: DateSegmentType["type"];
95
103
  /** The text to display. */
96
104
  text: string;
97
105
  }
@@ -107,10 +115,6 @@ export interface DateSegmentProps extends SlotProps {
107
115
  style?: StyleOrFunction<DateSegmentRenderProps>;
108
116
  }
109
117
 
110
- // ============================================
111
- // CONTEXT
112
- // ============================================
113
-
114
118
  export interface DateFieldContextValue {
115
119
  state: DateFieldState<DateValue>;
116
120
  aria: {
@@ -124,17 +128,79 @@ export interface DateFieldContextValue {
124
128
  export const DateFieldContext = createContext<DateFieldContextValue | null>(null);
125
129
  export const DateFieldStateContext = createContext<DateFieldState<DateValue> | null>(null);
126
130
 
131
+ function withFormValidationBehavior<P extends object>(props: P, formContext: FormProps | null): P {
132
+ if (!formContext?.validationBehavior) {
133
+ return props;
134
+ }
135
+
136
+ return new Proxy(props, {
137
+ get(target, property, receiver) {
138
+ const localValue = Reflect.get(target, property, receiver);
139
+ if (property === "validationBehavior" && localValue === undefined) {
140
+ return formContext.validationBehavior;
141
+ }
142
+
143
+ return localValue;
144
+ },
145
+ has(target, property) {
146
+ return (
147
+ Reflect.has(target, property) ||
148
+ (property === "validationBehavior" && formContext.validationBehavior !== undefined)
149
+ );
150
+ },
151
+ ownKeys(target) {
152
+ const keys = new Set(Reflect.ownKeys(target));
153
+ if (formContext.validationBehavior !== undefined) {
154
+ keys.add("validationBehavior");
155
+ }
156
+
157
+ return Array.from(keys);
158
+ },
159
+ getOwnPropertyDescriptor(target, property) {
160
+ const descriptor = Reflect.getOwnPropertyDescriptor(target, property);
161
+ if (descriptor) {
162
+ return descriptor;
163
+ }
164
+
165
+ if (property === "validationBehavior" && formContext.validationBehavior !== undefined) {
166
+ return {
167
+ enumerable: true,
168
+ configurable: true,
169
+ get: () => formContext.validationBehavior,
170
+ };
171
+ }
172
+
173
+ return undefined;
174
+ },
175
+ });
176
+ }
177
+
127
178
  export function useDateFieldContext(): DateFieldContextValue {
128
179
  const context = useContext(DateFieldContext);
129
180
  if (!context) {
130
- throw new Error('DateField components must be used within a DateField');
181
+ throw new Error("DateField components must be used within a DateField");
131
182
  }
132
183
  return context;
133
184
  }
134
185
 
135
- // ============================================
136
- // DATE FIELD COMPONENT
137
- // ============================================
186
+ function useDateInputContext(
187
+ slot?: string,
188
+ ): DateFieldContextValue | DateRangePickerFieldContextValue {
189
+ const dateFieldContext = useContext(DateFieldContext);
190
+ if (dateFieldContext) {
191
+ return dateFieldContext;
192
+ }
193
+
194
+ const dateRangePickerContext = useContext(DateRangePickerContext);
195
+ if (dateRangePickerContext && slot === "start") {
196
+ return dateRangePickerContext.startFieldContext;
197
+ }
198
+ if (dateRangePickerContext && slot === "end") {
199
+ return dateRangePickerContext.endFieldContext;
200
+ }
201
+
202
+ throw new Error("DateInput components must be used within a DateField or DateRangePicker slot");
203
+ }
138
204
 
139
205
  /**
140
206
  * A date field allows users to enter and edit date values using a keyboard.
@@ -150,56 +216,68 @@ export function useDateFieldContext(): DateFieldContextValue {
150
216
  * ```
151
217
  */
152
218
  export function DateField<T extends DateValue = CalendarDate>(
153
- props: DateFieldProps<T>
219
+ props: DateFieldProps<T>,
154
220
  ): JSX.Element {
155
221
  // Use hydration-safe pattern for client-only rendering
156
222
  const isHydrated = useIsHydrated();
223
+ const formContext = useContext(FormContext);
157
224
 
158
225
  return (
159
226
  <Show
160
227
  when={isHydrated()}
161
- fallback={<div class="solidaria-DateField solidaria-DateField--placeholder" aria-hidden="true" />}
228
+ fallback={
229
+ <div class="solidaria-DateField solidaria-DateField--placeholder" aria-hidden="true" />
230
+ }
162
231
  >
163
- <DateFieldInner {...props} />
232
+ <DateFieldInner {...props} __formContext={formContext} />
164
233
  </Show>
165
234
  );
166
235
  }
167
236
 
237
+ type DateFieldInnerProps<T extends DateValue = DateValue> = DateFieldProps<T> & {
238
+ __formContext?: FormProps | null;
239
+ };
240
+
168
241
  /**
169
242
  * Internal DateField component that renders after client mount.
170
243
  */
171
244
  function DateFieldInner<T extends DateValue = CalendarDate>(
172
- props: DateFieldProps<T>
245
+ props: DateFieldInnerProps<T>,
173
246
  ): JSX.Element {
247
+ const formContext = props.__formContext ?? useContext(FormContext);
248
+ const mergedProps = withFormValidationBehavior(props, formContext);
174
249
  const [local, stateProps, rest] = splitProps(
175
- props,
176
- ['children', 'class', 'style', 'slot'],
250
+ mergedProps,
251
+ ["children", "class", "style", "slot", "__formContext"],
177
252
  [
178
- 'value',
179
- 'defaultValue',
180
- 'onChange',
181
- 'minValue',
182
- 'maxValue',
183
- 'isDisabled',
184
- 'isReadOnly',
185
- 'isRequired',
186
- 'locale',
187
- 'granularity',
188
- 'hourCycle',
189
- 'hideTimeZone',
190
- 'placeholderValue',
191
- 'validationState',
192
- 'description',
193
- 'errorMessage',
194
- ]
253
+ "value",
254
+ "defaultValue",
255
+ "onChange",
256
+ "minValue",
257
+ "maxValue",
258
+ "isInvalid",
259
+ "isDisabled",
260
+ "isReadOnly",
261
+ "isRequired",
262
+ "locale",
263
+ "granularity",
264
+ "hourCycle",
265
+ "hideTimeZone",
266
+ "placeholderValue",
267
+ "shouldForceLeadingZeros",
268
+ "validationState",
269
+ "validationBehavior",
270
+ "validate",
271
+ "description",
272
+ "errorMessage",
273
+ "isDateUnavailable",
274
+ ],
195
275
  );
196
276
 
197
277
  const [fieldRef, setFieldRef] = createSignal<HTMLDivElement | null>(null);
198
278
 
199
- // Create date field state
200
279
  const state = createDateFieldState(stateProps);
201
280
 
202
- // Create date field ARIA props
203
281
  const fieldAria = createDateField(
204
282
  () => ({
205
283
  ...(rest as Record<string, unknown>),
@@ -207,10 +285,9 @@ function DateFieldInner<T extends DateValue = CalendarDate>(
207
285
  errorMessage: stateProps.errorMessage,
208
286
  }),
209
287
  state as unknown as DateFieldState<DateValue>,
210
- fieldRef
288
+ fieldRef,
211
289
  );
212
290
 
213
- // Render props values
214
291
  const renderValues = createMemo<DateFieldRenderProps>(() => ({
215
292
  isDisabled: state.isDisabled(),
216
293
  isReadOnly: state.isReadOnly(),
@@ -218,16 +295,20 @@ function DateFieldInner<T extends DateValue = CalendarDate>(
218
295
  isInvalid: state.isInvalid(),
219
296
  }));
220
297
 
221
- // Resolve render props
222
298
  const renderProps = useRenderProps(
223
299
  {
224
300
  class: local.class,
225
301
  style: local.style,
226
- defaultClassName: 'solidaria-DateField',
302
+ defaultClassName: "solidaria-DateField",
227
303
  },
228
- renderValues
304
+ renderValues,
229
305
  );
230
306
 
307
+ const validationBehavior = () =>
308
+ (stateProps as { validationBehavior?: "aria" | "native" }).validationBehavior ??
309
+ formContext?.validationBehavior ??
310
+ "native";
311
+
231
312
  return (
232
313
  <DateFieldStateContext.Provider value={state as unknown as DateFieldState<DateValue>}>
233
314
  <DateFieldContext.Provider
@@ -251,77 +332,92 @@ function DateFieldInner<T extends DateValue = CalendarDate>(
251
332
  data-required={dataAttr(state.isRequired())}
252
333
  data-invalid={dataAttr(state.isInvalid())}
253
334
  >
254
- {props.children as JSX.Element}
335
+ {local.children as JSX.Element}
255
336
  </div>
337
+ <Show when={(rest as Record<string, unknown>).name}>
338
+ <HiddenDateInput
339
+ name={(rest as Record<string, unknown>).name as string | undefined}
340
+ form={(rest as Record<string, unknown>).form as string | undefined}
341
+ value={state.value()}
342
+ autoComplete={(rest as Record<string, unknown>).autoComplete as string | undefined}
343
+ isDisabled={state.isDisabled()}
344
+ isRequired={state.isRequired()}
345
+ validationBehavior={validationBehavior()}
346
+ validationState={state}
347
+ focus={() => {
348
+ fieldRef()?.querySelector<HTMLElement>('[role="spinbutton"]')?.focus();
349
+ }}
350
+ minValue={access(stateProps.minValue) as DateValue | undefined}
351
+ maxValue={access(stateProps.maxValue) as DateValue | undefined}
352
+ granularity={state.granularity}
353
+ />
354
+ </Show>
256
355
  </DateFieldContext.Provider>
257
356
  </DateFieldStateContext.Provider>
258
357
  );
259
358
  }
260
359
 
261
- // ============================================
262
- // DATE INPUT COMPONENT
263
- // ============================================
264
-
265
360
  /**
266
361
  * The input area containing date segments.
267
362
  */
268
363
  export function DateInput(props: DateInputProps): JSX.Element {
269
- const context = useDateFieldContext();
364
+ const context = useDateInputContext(props.slot);
270
365
  const { state, aria } = context;
271
366
  const [isFocused, setIsFocused] = createSignal(false);
367
+ const [inputRef, setInputRef] = createSignal<HTMLDivElement | null>(null);
272
368
 
273
- // Render props values
274
369
  const renderValues = createMemo<DateInputRenderProps>(() => ({
275
370
  isDisabled: state.isDisabled(),
276
371
  isFocused: isFocused(),
277
372
  }));
278
373
 
279
- // Resolve render props
280
374
  const renderProps = useRenderProps(
281
375
  {
282
376
  class: props.class,
283
377
  style: props.style,
284
- defaultClassName: 'solidaria-DateInput',
378
+ defaultClassName: "solidaria-DateInput",
285
379
  },
286
- renderValues
380
+ renderValues,
287
381
  );
288
382
 
383
+ createEffect(() => {
384
+ const element = inputRef();
385
+ const handler = props.onPointerDownCapture;
386
+ if (!element || !handler) return;
387
+
388
+ const listener = (event: PointerEvent) =>
389
+ (handler as unknown as (event: PointerEvent) => void)(event);
390
+ element.addEventListener("pointerdown", listener, { capture: true });
391
+ onCleanup(() => element.removeEventListener("pointerdown", listener, { capture: true }));
392
+ });
393
+
289
394
  return (
290
- <div
291
- {...aria.inputProps}
292
- class={renderProps.class()}
293
- style={renderProps.style()}
294
- data-disabled={dataAttr(state.isDisabled())}
295
- data-focused={dataAttr(isFocused())}
296
- onFocusIn={() => setIsFocused(true)}
297
- onFocusOut={() => setIsFocused(false)}
298
- >
299
- <For each={state.segments()}>
300
- {(segment) => props.children?.(segment)}
301
- </For>
302
- </div>
395
+ <DateFieldContext.Provider value={context as DateFieldContextValue}>
396
+ <div
397
+ ref={setInputRef}
398
+ {...aria.inputProps}
399
+ class={renderProps.class()}
400
+ style={renderProps.style()}
401
+ data-disabled={dataAttr(state.isDisabled())}
402
+ data-focused={dataAttr(isFocused())}
403
+ onFocusIn={() => setIsFocused(true)}
404
+ onFocusOut={() => setIsFocused(false)}
405
+ >
406
+ <For each={state.segments()}>{(segment) => props.children?.(segment)}</For>
407
+ </div>
408
+ </DateFieldContext.Provider>
303
409
  );
304
410
  }
305
411
 
306
- // ============================================
307
- // DATE SEGMENT COMPONENT
308
- // ============================================
309
-
310
412
  /**
311
413
  * A segment of a date field (year, month, day, etc.).
312
414
  */
313
415
  export function DateSegment(props: DateSegmentProps): JSX.Element {
314
416
  const { state } = useDateFieldContext();
315
- const [segmentRef, setSegmentRef] = createSignal<HTMLDivElement | null>(null);
417
+ const [segmentRef, setSegmentRef] = createSignal<HTMLElement | null>(null);
316
418
 
317
- // Create segment ARIA props
318
- const segmentAria = createDateSegment(
319
- { segment: props.segment },
320
- state,
321
- segmentRef
322
- );
419
+ const segmentAria = createDateSegment({ segment: props.segment }, state, segmentRef);
323
420
 
324
- // Render props values
325
421
  const renderValues = createMemo<DateSegmentRenderProps>(() => ({
326
422
  isFocused: segmentAria.isFocused,
327
423
  isEditable: segmentAria.isEditable,
@@ -330,27 +426,26 @@ export function DateSegment(props: DateSegmentProps): JSX.Element {
330
426
  text: segmentAria.text,
331
427
  }));
332
428
 
333
- // Resolve render props
334
429
  const renderProps = useRenderProps(
335
430
  {
336
431
  children: props.children,
337
432
  class: props.class,
338
433
  style: props.style,
339
- defaultClassName: 'solidaria-DateSegment',
434
+ defaultClassName: "solidaria-DateSegment",
340
435
  },
341
- renderValues
436
+ renderValues,
342
437
  );
343
438
 
344
439
  // Determine children content - avoid Show for SSR hydration compatibility
345
440
  const getChildren = () => {
346
- if (typeof props.children === 'function') {
441
+ if (typeof props.children === "function") {
347
442
  return renderProps.renderChildren();
348
443
  }
349
444
  return segmentAria.text;
350
445
  };
351
446
 
352
447
  return (
353
- <div
448
+ <span
354
449
  ref={setSegmentRef}
355
450
  {...segmentAria.segmentProps}
356
451
  class={renderProps.class()}
@@ -361,7 +456,7 @@ export function DateSegment(props: DateSegmentProps): JSX.Element {
361
456
  data-type={props.segment.type}
362
457
  >
363
458
  {getChildren()}
364
- </div>
459
+ </span>
365
460
  );
366
461
  }
367
462
 
@@ -407,5 +502,4 @@ export function DateFieldErrorMessage(props: DateFieldErrorMessageProps): JSX.El
407
502
  );
408
503
  }
409
504
 
410
- // Re-export types
411
505
  export type { DateFieldState, DateSegmentType };