@proyecto-viviana/solid-stately 0.1.5 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (217) hide show
  1. package/{src → dist}/autocomplete/createAutocompleteState.d.ts +0 -1
  2. package/{src → dist}/autocomplete/index.d.ts +0 -1
  3. package/{src → dist}/calendar/createCalendarState.d.ts +0 -1
  4. package/{src → dist}/calendar/createDateFieldState.d.ts +0 -1
  5. package/{src → dist}/calendar/createRangeCalendarState.d.ts +0 -1
  6. package/{src → dist}/calendar/createTimeFieldState.d.ts +0 -1
  7. package/{src → dist}/calendar/index.d.ts +0 -1
  8. package/{src → dist}/checkbox/createCheckboxGroupState.d.ts +0 -1
  9. package/{src → dist}/checkbox/index.d.ts +0 -1
  10. package/{src → dist}/collections/ListCollection.d.ts +0 -1
  11. package/{src → dist}/collections/createListState.d.ts +0 -1
  12. package/{src → dist}/collections/createMenuState.d.ts +0 -1
  13. package/{src → dist}/collections/createSelectionState.d.ts +0 -1
  14. package/{src → dist}/collections/index.d.ts +0 -1
  15. package/{src → dist}/collections/types.d.ts +0 -1
  16. package/{src → dist}/color/Color.d.ts +0 -1
  17. package/{src → dist}/color/createColorAreaState.d.ts +0 -1
  18. package/{src → dist}/color/createColorFieldState.d.ts +0 -1
  19. package/{src → dist}/color/createColorSliderState.d.ts +0 -1
  20. package/{src → dist}/color/createColorWheelState.d.ts +0 -1
  21. package/{src → dist}/color/index.d.ts +0 -1
  22. package/{src → dist}/color/types.d.ts +0 -1
  23. package/{src → dist}/combobox/createComboBoxState.d.ts +0 -1
  24. package/{src → dist}/combobox/index.d.ts +0 -1
  25. package/{src → dist}/disclosure/createDisclosureState.d.ts +0 -1
  26. package/{src → dist}/disclosure/index.d.ts +0 -1
  27. package/{src → dist}/dnd/createDragState.d.ts +0 -1
  28. package/{src → dist}/dnd/createDraggableCollectionState.d.ts +0 -1
  29. package/{src → dist}/dnd/createDropState.d.ts +0 -1
  30. package/{src → dist}/dnd/createDroppableCollectionState.d.ts +0 -1
  31. package/{src → dist}/dnd/index.d.ts +0 -1
  32. package/{src → dist}/dnd/types.d.ts +0 -1
  33. package/{src → dist}/form/createFormValidationState.d.ts +0 -1
  34. package/{src → dist}/form/index.d.ts +0 -1
  35. package/{src → dist}/grid/createGridState.d.ts +0 -1
  36. package/{src → dist}/grid/index.d.ts +0 -1
  37. package/{src → dist}/grid/types.d.ts +0 -1
  38. package/dist/index.d.ts +25 -3363
  39. package/dist/index.js +2 -2
  40. package/dist/index.js.map +7 -1
  41. package/{src → dist}/numberfield/createNumberFieldState.d.ts +0 -1
  42. package/{src → dist}/numberfield/index.d.ts +0 -1
  43. package/{src → dist}/overlays/createOverlayTriggerState.d.ts +0 -1
  44. package/{src → dist}/overlays/index.d.ts +0 -1
  45. package/{src → dist}/radio/createRadioGroupState.d.ts +0 -1
  46. package/{src → dist}/radio/index.d.ts +0 -1
  47. package/{src → dist}/searchfield/createSearchFieldState.d.ts +0 -1
  48. package/{src → dist}/searchfield/index.d.ts +0 -1
  49. package/{src → dist}/select/createSelectState.d.ts +0 -1
  50. package/{src → dist}/select/index.d.ts +0 -1
  51. package/{src → dist}/slider/createSliderState.d.ts +0 -1
  52. package/{src → dist}/slider/index.d.ts +0 -1
  53. package/{src → dist}/ssr/index.d.ts +0 -1
  54. package/{src → dist}/table/TableCollection.d.ts +0 -1
  55. package/{src → dist}/table/createTableState.d.ts +0 -1
  56. package/{src → dist}/table/index.d.ts +0 -1
  57. package/{src → dist}/table/types.d.ts +0 -1
  58. package/{src → dist}/tabs/createTabListState.d.ts +0 -1
  59. package/{src → dist}/tabs/index.d.ts +0 -1
  60. package/{src → dist}/textfield/createTextFieldState.d.ts +0 -1
  61. package/{src → dist}/textfield/index.d.ts +0 -1
  62. package/{src → dist}/toast/createToastState.d.ts +0 -1
  63. package/{src → dist}/toast/index.d.ts +0 -1
  64. package/{src → dist}/toggle/createToggleState.d.ts +0 -1
  65. package/{src → dist}/toggle/index.d.ts +0 -1
  66. package/{src → dist}/tooltip/createTooltipTriggerState.d.ts +0 -1
  67. package/{src → dist}/tooltip/index.d.ts +0 -1
  68. package/{src → dist}/tree/TreeCollection.d.ts +0 -1
  69. package/{src → dist}/tree/createTreeState.d.ts +0 -1
  70. package/{src → dist}/tree/index.d.ts +0 -1
  71. package/{src → dist}/tree/types.d.ts +0 -1
  72. package/{src → dist}/utils/reactivity.d.ts +0 -1
  73. package/package.json +5 -7
  74. package/src/autocomplete/createAutocompleteState.d.ts.map +0 -1
  75. package/src/autocomplete/createAutocompleteState.ts +0 -90
  76. package/src/autocomplete/index.d.ts.map +0 -1
  77. package/src/autocomplete/index.ts +0 -5
  78. package/src/calendar/createCalendarState.d.ts.map +0 -1
  79. package/src/calendar/createCalendarState.ts +0 -461
  80. package/src/calendar/createDateFieldState.d.ts.map +0 -1
  81. package/src/calendar/createDateFieldState.ts +0 -562
  82. package/src/calendar/createRangeCalendarState.d.ts.map +0 -1
  83. package/src/calendar/createRangeCalendarState.ts +0 -535
  84. package/src/calendar/createTimeFieldState.d.ts.map +0 -1
  85. package/src/calendar/createTimeFieldState.ts +0 -483
  86. package/src/calendar/index.d.ts.map +0 -1
  87. package/src/calendar/index.ts +0 -81
  88. package/src/checkbox/createCheckboxGroupState.d.ts.map +0 -1
  89. package/src/checkbox/createCheckboxGroupState.ts +0 -193
  90. package/src/checkbox/index.d.ts.map +0 -1
  91. package/src/checkbox/index.ts +0 -5
  92. package/src/collections/ListCollection.d.ts.map +0 -1
  93. package/src/collections/ListCollection.ts +0 -146
  94. package/src/collections/createListState.d.ts.map +0 -1
  95. package/src/collections/createListState.ts +0 -264
  96. package/src/collections/createMenuState.d.ts.map +0 -1
  97. package/src/collections/createMenuState.ts +0 -106
  98. package/src/collections/createSelectionState.d.ts.map +0 -1
  99. package/src/collections/createSelectionState.ts +0 -336
  100. package/src/collections/index.d.ts.map +0 -1
  101. package/src/collections/index.ts +0 -46
  102. package/src/collections/types.d.ts.map +0 -1
  103. package/src/collections/types.ts +0 -169
  104. package/src/color/Color.d.ts.map +0 -1
  105. package/src/color/Color.ts +0 -951
  106. package/src/color/createColorAreaState.d.ts.map +0 -1
  107. package/src/color/createColorAreaState.ts +0 -293
  108. package/src/color/createColorFieldState.d.ts.map +0 -1
  109. package/src/color/createColorFieldState.ts +0 -292
  110. package/src/color/createColorSliderState.d.ts.map +0 -1
  111. package/src/color/createColorSliderState.ts +0 -241
  112. package/src/color/createColorWheelState.d.ts.map +0 -1
  113. package/src/color/createColorWheelState.ts +0 -211
  114. package/src/color/index.d.ts.map +0 -1
  115. package/src/color/index.ts +0 -47
  116. package/src/color/types.d.ts.map +0 -1
  117. package/src/color/types.ts +0 -127
  118. package/src/combobox/createComboBoxState.d.ts.map +0 -1
  119. package/src/combobox/createComboBoxState.ts +0 -703
  120. package/src/combobox/index.d.ts.map +0 -1
  121. package/src/combobox/index.ts +0 -13
  122. package/src/disclosure/createDisclosureState.d.ts.map +0 -1
  123. package/src/disclosure/createDisclosureState.ts +0 -193
  124. package/src/disclosure/index.d.ts.map +0 -1
  125. package/src/disclosure/index.ts +0 -9
  126. package/src/dnd/createDragState.d.ts.map +0 -1
  127. package/src/dnd/createDragState.ts +0 -153
  128. package/src/dnd/createDraggableCollectionState.d.ts.map +0 -1
  129. package/src/dnd/createDraggableCollectionState.ts +0 -165
  130. package/src/dnd/createDropState.d.ts.map +0 -1
  131. package/src/dnd/createDropState.ts +0 -212
  132. package/src/dnd/createDroppableCollectionState.d.ts.map +0 -1
  133. package/src/dnd/createDroppableCollectionState.ts +0 -357
  134. package/src/dnd/index.d.ts.map +0 -1
  135. package/src/dnd/index.ts +0 -76
  136. package/src/dnd/types.d.ts.map +0 -1
  137. package/src/dnd/types.ts +0 -317
  138. package/src/form/createFormValidationState.d.ts.map +0 -1
  139. package/src/form/createFormValidationState.ts +0 -389
  140. package/src/form/index.d.ts.map +0 -1
  141. package/src/form/index.ts +0 -15
  142. package/src/grid/createGridState.d.ts.map +0 -1
  143. package/src/grid/createGridState.ts +0 -327
  144. package/src/grid/index.d.ts.map +0 -1
  145. package/src/grid/index.ts +0 -13
  146. package/src/grid/types.d.ts.map +0 -1
  147. package/src/grid/types.ts +0 -179
  148. package/src/index.d.ts +0 -26
  149. package/src/index.d.ts.map +0 -1
  150. package/src/index.ts +0 -383
  151. package/src/numberfield/createNumberFieldState.d.ts.map +0 -1
  152. package/src/numberfield/createNumberFieldState.ts +0 -383
  153. package/src/numberfield/index.d.ts.map +0 -1
  154. package/src/numberfield/index.ts +0 -5
  155. package/src/overlays/createOverlayTriggerState.d.ts.map +0 -1
  156. package/src/overlays/createOverlayTriggerState.ts +0 -67
  157. package/src/overlays/index.d.ts.map +0 -1
  158. package/src/overlays/index.ts +0 -5
  159. package/src/radio/createRadioGroupState.d.ts.map +0 -1
  160. package/src/radio/createRadioGroupState.ts +0 -201
  161. package/src/radio/index.d.ts.map +0 -1
  162. package/src/radio/index.ts +0 -6
  163. package/src/searchfield/createSearchFieldState.d.ts.map +0 -1
  164. package/src/searchfield/createSearchFieldState.ts +0 -62
  165. package/src/searchfield/index.d.ts.map +0 -1
  166. package/src/searchfield/index.ts +0 -5
  167. package/src/select/createSelectState.d.ts.map +0 -1
  168. package/src/select/createSelectState.ts +0 -181
  169. package/src/select/index.d.ts.map +0 -1
  170. package/src/select/index.ts +0 -5
  171. package/src/slider/createSliderState.d.ts.map +0 -1
  172. package/src/slider/createSliderState.ts +0 -211
  173. package/src/slider/index.d.ts.map +0 -1
  174. package/src/slider/index.ts +0 -6
  175. package/src/ssr/index.d.ts.map +0 -1
  176. package/src/ssr/index.ts +0 -41
  177. package/src/table/TableCollection.d.ts.map +0 -1
  178. package/src/table/TableCollection.ts +0 -388
  179. package/src/table/createTableState.d.ts.map +0 -1
  180. package/src/table/createTableState.ts +0 -127
  181. package/src/table/index.d.ts.map +0 -1
  182. package/src/table/index.ts +0 -18
  183. package/src/table/types.d.ts.map +0 -1
  184. package/src/table/types.ts +0 -150
  185. package/src/tabs/createTabListState.d.ts.map +0 -1
  186. package/src/tabs/createTabListState.ts +0 -240
  187. package/src/tabs/index.d.ts.map +0 -1
  188. package/src/tabs/index.ts +0 -7
  189. package/src/textfield/createTextFieldState.d.ts.map +0 -1
  190. package/src/textfield/createTextFieldState.ts +0 -75
  191. package/src/textfield/index.d.ts.map +0 -1
  192. package/src/textfield/index.ts +0 -5
  193. package/src/toast/createToastState.d.ts.map +0 -1
  194. package/src/toast/createToastState.ts +0 -316
  195. package/src/toast/index.d.ts.map +0 -1
  196. package/src/toast/index.ts +0 -11
  197. package/src/toggle/createToggleState.d.ts.map +0 -1
  198. package/src/toggle/createToggleState.ts +0 -94
  199. package/src/toggle/index.d.ts.map +0 -1
  200. package/src/toggle/index.ts +0 -5
  201. package/src/tooltip/createTooltipTriggerState.d.ts.map +0 -1
  202. package/src/tooltip/createTooltipTriggerState.ts +0 -183
  203. package/src/tooltip/index.d.ts.map +0 -1
  204. package/src/tooltip/index.ts +0 -6
  205. package/src/tree/TreeCollection.d.ts.map +0 -1
  206. package/src/tree/TreeCollection.ts +0 -175
  207. package/src/tree/createTreeState.d.ts.map +0 -1
  208. package/src/tree/createTreeState.ts +0 -392
  209. package/src/tree/index.d.ts.map +0 -1
  210. package/src/tree/index.ts +0 -13
  211. package/src/tree/types.d.ts.map +0 -1
  212. package/src/tree/types.ts +0 -174
  213. package/src/utils/index.d.ts +0 -2
  214. package/src/utils/index.d.ts.map +0 -1
  215. package/src/utils/reactivity.d.ts.map +0 -1
  216. package/src/utils/reactivity.ts +0 -36
  217. /package/{src/utils/index.ts → dist/utils/index.d.ts} +0 -0
@@ -1,562 +0,0 @@
1
- /**
2
- * DateFieldState for Solid-Stately
3
- *
4
- * Provides state management for date field components with segment-based editing.
5
- * Based on @react-stately/datepicker useDateFieldState
6
- */
7
-
8
- import { createSignal, createMemo, type Accessor } from 'solid-js';
9
- import {
10
- type CalendarDate,
11
- type CalendarDateTime,
12
- type ZonedDateTime,
13
- type DateValue,
14
- today,
15
- getLocalTimeZone,
16
- DateFormatter,
17
- toCalendarDate as intlToCalendarDate,
18
- toCalendarDateTime,
19
- } from '@internationalized/date';
20
- import { access, type MaybeAccessor } from '../utils';
21
- import type { ValidationState } from './createCalendarState';
22
-
23
- // ============================================
24
- // TYPES
25
- // ============================================
26
-
27
- export type DateSegmentType =
28
- | 'year'
29
- | 'month'
30
- | 'day'
31
- | 'hour'
32
- | 'minute'
33
- | 'second'
34
- | 'dayPeriod'
35
- | 'era'
36
- | 'timeZoneName'
37
- | 'literal';
38
-
39
- export interface DateSegment {
40
- /** The type of segment. */
41
- type: DateSegmentType;
42
- /** The text content of the segment. */
43
- text: string;
44
- /** The numeric value of the segment (if applicable). */
45
- value?: number;
46
- /** The minimum value for the segment. */
47
- minValue?: number;
48
- /** The maximum value for the segment. */
49
- maxValue?: number;
50
- /** Whether this segment is editable. */
51
- isEditable: boolean;
52
- /** Whether this segment is a placeholder. */
53
- isPlaceholder: boolean;
54
- /** A placeholder string for the segment. */
55
- placeholder: string;
56
- }
57
-
58
- export interface DateFieldStateProps<T extends DateValue = DateValue> {
59
- /** The current value (controlled). */
60
- value?: MaybeAccessor<T | null>;
61
- /** The default value (uncontrolled). */
62
- defaultValue?: T | null;
63
- /** Handler called when the value changes. */
64
- onChange?: (value: T | null) => void;
65
- /** The minimum allowed date. */
66
- minValue?: MaybeAccessor<DateValue | undefined>;
67
- /** The maximum allowed date. */
68
- maxValue?: MaybeAccessor<DateValue | undefined>;
69
- /** Whether the field is disabled. */
70
- isDisabled?: MaybeAccessor<boolean>;
71
- /** Whether the field is read-only. */
72
- isReadOnly?: MaybeAccessor<boolean>;
73
- /** Whether the field is required. */
74
- isRequired?: MaybeAccessor<boolean>;
75
- /** The locale to use for formatting. */
76
- locale?: string;
77
- /** The granularity of the date/time (day, hour, minute, second). */
78
- granularity?: 'day' | 'hour' | 'minute' | 'second';
79
- /** Whether to show the hour in 12 or 24 hour format. */
80
- hourCycle?: 12 | 24;
81
- /** Whether to hide the time zone. */
82
- hideTimeZone?: boolean;
83
- /** The placeholder date (determines segment structure). */
84
- placeholderValue?: DateValue;
85
- /** Validation state. */
86
- validationState?: MaybeAccessor<ValidationState | undefined>;
87
- /** Description text. */
88
- description?: string;
89
- /** Error message. */
90
- errorMessage?: string;
91
- /** Whether dates outside the min/max range are allowed. */
92
- allowsNonContiguousRanges?: boolean;
93
- /** Whether to create a date or datetime. */
94
- createCalendar?: (name: string) => unknown;
95
- }
96
-
97
- export interface DateFieldState<T extends DateValue = DateValue> {
98
- /** The current value. */
99
- value: Accessor<T | null>;
100
- /** The date value (may be partial during editing). */
101
- dateValue: Accessor<DateValue | null>;
102
- /** Sets the date value. */
103
- setValue: (value: T | null) => void;
104
- /** The segments that make up the date. */
105
- segments: Accessor<DateSegment[]>;
106
- /** The format string. */
107
- formatValue: (fieldOptions?: Intl.DateTimeFormatOptions) => string;
108
- /** Sets a segment value. */
109
- setSegment: (type: DateSegmentType, value: number) => void;
110
- /** Increments a segment. */
111
- incrementSegment: (type: DateSegmentType) => void;
112
- /** Decrements a segment. */
113
- decrementSegment: (type: DateSegmentType) => void;
114
- /** Clears a segment. */
115
- clearSegment: (type: DateSegmentType) => void;
116
- /** Confirms the value (after typing). */
117
- confirmPlaceholder: () => void;
118
- /** Whether the field is disabled. */
119
- isDisabled: Accessor<boolean>;
120
- /** Whether the field is read-only. */
121
- isReadOnly: Accessor<boolean>;
122
- /** Whether the field is required. */
123
- isRequired: Accessor<boolean>;
124
- /** The validation state. */
125
- validationState: Accessor<ValidationState | undefined>;
126
- /** The granularity. */
127
- granularity: 'day' | 'hour' | 'minute' | 'second';
128
- /** Whether the value is invalid. */
129
- isInvalid: Accessor<boolean>;
130
- /** The locale. */
131
- locale: string;
132
- /** The time zone. */
133
- timeZone: string;
134
- }
135
-
136
- // ============================================
137
- // IMPLEMENTATION
138
- // ============================================
139
-
140
- /**
141
- * Provides state management for a date field component.
142
- */
143
- export function createDateFieldState<T extends DateValue = CalendarDate>(
144
- props: DateFieldStateProps<T> = {}
145
- ): DateFieldState<T> {
146
- const timeZone = getLocalTimeZone();
147
- const locale = props.locale ?? 'en-US';
148
- const granularity = props.granularity ?? 'day';
149
-
150
- // State signals
151
- const [internalValue, setInternalValue] = createSignal<T | null>(
152
- props.defaultValue ?? null
153
- );
154
-
155
- // Track partial values during editing
156
- const [placeholderDate, setPlaceholderDate] = createSignal<Partial<DateParts>>({});
157
-
158
- // Controlled vs uncontrolled value
159
- const value = createMemo<T | null>(() => {
160
- const controlled = access(props.value);
161
- return controlled !== undefined ? controlled : internalValue();
162
- });
163
-
164
- // The effective date value
165
- const dateValue = createMemo<DateValue | null>(() => {
166
- const v = value();
167
- if (v) return v;
168
-
169
- // Build from placeholder parts
170
- const parts = placeholderDate();
171
- const placeholder = props.placeholderValue ?? today(timeZone);
172
-
173
- if (Object.keys(parts).length === 0) return null;
174
-
175
- // Create a date from the parts
176
- const year = parts.year ?? placeholder.year;
177
- const month = parts.month ?? placeholder.month;
178
- const day = parts.day ?? placeholder.day;
179
-
180
- if (granularity === 'day') {
181
- return intlToCalendarDate(placeholder).set({ year, month, day });
182
- }
183
-
184
- // For time granularities
185
- const hour = parts.hour ?? 0;
186
- const minute = parts.minute ?? 0;
187
- const second = parts.second ?? 0;
188
-
189
- return toCalendarDateTime(placeholder).set({
190
- year,
191
- month,
192
- day,
193
- hour,
194
- minute,
195
- second,
196
- }) as unknown as T;
197
- });
198
-
199
- // Derived states
200
- const isDisabled = createMemo(() => access(props.isDisabled) ?? false);
201
- const isReadOnly = createMemo(() => access(props.isReadOnly) ?? false);
202
- const isRequired = createMemo(() => access(props.isRequired) ?? false);
203
- const validationState = createMemo(() => access(props.validationState));
204
-
205
- // Check if value is invalid
206
- const isInvalid = createMemo(() => {
207
- const v = value();
208
- if (!v) return false;
209
-
210
- const minValue = access(props.minValue);
211
- const maxValue = access(props.maxValue);
212
-
213
- if (minValue && v.compare(minValue) < 0) return true;
214
- if (maxValue && v.compare(maxValue) > 0) return true;
215
-
216
- return validationState() === 'invalid';
217
- });
218
-
219
- // Generate segments based on granularity and locale
220
- const segments = createMemo<DateSegment[]>(() => {
221
- const v = value();
222
- const placeholder = props.placeholderValue ?? today(timeZone);
223
- const parts = placeholderDate();
224
-
225
- const segs: DateSegment[] = [];
226
-
227
- // Determine format options based on granularity
228
- const formatOptions: Intl.DateTimeFormatOptions = {
229
- year: 'numeric',
230
- month: '2-digit',
231
- day: '2-digit',
232
- };
233
-
234
- if (granularity !== 'day') {
235
- formatOptions.hour = '2-digit';
236
- formatOptions.minute = '2-digit';
237
- if (granularity === 'second') {
238
- formatOptions.second = '2-digit';
239
- }
240
- if (props.hourCycle) {
241
- formatOptions.hourCycle = props.hourCycle === 12 ? 'h12' : 'h23';
242
- }
243
- }
244
-
245
- const formatter = new DateFormatter(locale, formatOptions);
246
- const dateToFormat = v ?? placeholder;
247
- const formattedParts = formatter.formatToParts(dateToFormat.toDate(timeZone));
248
-
249
- for (const part of formattedParts) {
250
- const type = mapPartType(part.type);
251
-
252
- if (type === 'literal') {
253
- segs.push({
254
- type: 'literal',
255
- text: part.value,
256
- isEditable: false,
257
- isPlaceholder: false,
258
- placeholder: part.value,
259
- });
260
- } else if (type) {
261
- const segValue = getSegmentValue(v, type);
262
- const placeholderValue = getSegmentValue(placeholder, type);
263
- const partValue = parts[type as keyof DateParts];
264
- const hasValue = v !== null || partValue !== undefined;
265
-
266
- segs.push({
267
- type,
268
- text: hasValue ? part.value : getPlaceholderText(type),
269
- value: segValue ?? partValue,
270
- minValue: getMinValue(type),
271
- maxValue: getMaxValue(type, v ?? placeholder),
272
- isEditable: !isDisabled() && !isReadOnly(),
273
- isPlaceholder: !hasValue,
274
- placeholder: getPlaceholderText(type),
275
- });
276
- }
277
- }
278
-
279
- return segs;
280
- });
281
-
282
- // Set value with onChange callback
283
- const setValue = (newValue: T | null) => {
284
- if (isDisabled() || isReadOnly()) return;
285
-
286
- const controlled = access(props.value);
287
- if (controlled === undefined) {
288
- setInternalValue(() => newValue);
289
- }
290
-
291
- if (props.onChange) {
292
- props.onChange(newValue);
293
- }
294
-
295
- // Clear placeholder parts
296
- setPlaceholderDate({});
297
- };
298
-
299
- // Set a specific segment value
300
- const setSegment = (type: DateSegmentType, newValue: number) => {
301
- if (isDisabled() || isReadOnly()) return;
302
-
303
- const v = value();
304
-
305
- if (v) {
306
- // Update existing value
307
- const updated = updateDatePart(v, type, newValue);
308
- setValue(updated as T);
309
- } else {
310
- // Update placeholder parts
311
- setPlaceholderDate((prev) => ({
312
- ...prev,
313
- [type]: newValue,
314
- }));
315
- }
316
- };
317
-
318
- // Increment a segment
319
- const incrementSegment = (type: DateSegmentType) => {
320
- if (isDisabled() || isReadOnly()) return;
321
-
322
- const v = value();
323
- const current = v
324
- ? getSegmentValue(v, type)
325
- : placeholderDate()[type as keyof DateParts];
326
- const max = getMaxValue(type, v ?? props.placeholderValue ?? today(timeZone));
327
- const min = getMinValue(type);
328
-
329
- const newValue = current !== undefined ? current + 1 : min;
330
- setSegment(type, newValue > max ? min : newValue);
331
- };
332
-
333
- // Decrement a segment
334
- const decrementSegment = (type: DateSegmentType) => {
335
- if (isDisabled() || isReadOnly()) return;
336
-
337
- const v = value();
338
- const current = v
339
- ? getSegmentValue(v, type)
340
- : placeholderDate()[type as keyof DateParts];
341
- const max = getMaxValue(type, v ?? props.placeholderValue ?? today(timeZone));
342
- const min = getMinValue(type);
343
-
344
- const newValue = current !== undefined ? current - 1 : max;
345
- setSegment(type, newValue < min ? max : newValue);
346
- };
347
-
348
- // Clear a segment
349
- const clearSegment = (type: DateSegmentType) => {
350
- if (isDisabled() || isReadOnly()) return;
351
-
352
- const v = value();
353
- if (v) {
354
- // Clear entire value if any segment is cleared
355
- setValue(null);
356
- } else {
357
- setPlaceholderDate((prev) => {
358
- const next = { ...prev };
359
- delete next[type as keyof DateParts];
360
- return next;
361
- });
362
- }
363
- };
364
-
365
- // Confirm placeholder value
366
- const confirmPlaceholder = () => {
367
- const parts = placeholderDate();
368
- if (Object.keys(parts).length > 0) {
369
- const dv = dateValue();
370
- if (dv) {
371
- setValue(dv as T);
372
- }
373
- }
374
- };
375
-
376
- // Format the current value
377
- const formatValue = (fieldOptions?: Intl.DateTimeFormatOptions): string => {
378
- const v = value();
379
- if (!v) return '';
380
-
381
- const options: Intl.DateTimeFormatOptions = fieldOptions ?? {
382
- year: 'numeric',
383
- month: '2-digit',
384
- day: '2-digit',
385
- };
386
-
387
- if (granularity !== 'day') {
388
- options.hour = '2-digit';
389
- options.minute = '2-digit';
390
- if (granularity === 'second') {
391
- options.second = '2-digit';
392
- }
393
- }
394
-
395
- const formatter = new DateFormatter(locale, options);
396
- return formatter.format(v.toDate(timeZone));
397
- };
398
-
399
- return {
400
- value,
401
- dateValue,
402
- setValue,
403
- segments,
404
- formatValue,
405
- setSegment,
406
- incrementSegment,
407
- decrementSegment,
408
- clearSegment,
409
- confirmPlaceholder,
410
- isDisabled,
411
- isReadOnly,
412
- isRequired,
413
- validationState,
414
- granularity,
415
- isInvalid,
416
- locale,
417
- timeZone,
418
- };
419
- }
420
-
421
- // ============================================
422
- // HELPER TYPES & FUNCTIONS
423
- // ============================================
424
-
425
- interface DateParts {
426
- year?: number;
427
- month?: number;
428
- day?: number;
429
- hour?: number;
430
- minute?: number;
431
- second?: number;
432
- }
433
-
434
- function mapPartType(type: Intl.DateTimeFormatPartTypes): DateSegmentType | null {
435
- switch (type) {
436
- case 'year':
437
- return 'year';
438
- case 'month':
439
- return 'month';
440
- case 'day':
441
- return 'day';
442
- case 'hour':
443
- return 'hour';
444
- case 'minute':
445
- return 'minute';
446
- case 'second':
447
- return 'second';
448
- case 'dayPeriod':
449
- return 'dayPeriod';
450
- case 'era':
451
- return 'era';
452
- case 'timeZoneName':
453
- return 'timeZoneName';
454
- case 'literal':
455
- return 'literal';
456
- default:
457
- return null;
458
- }
459
- }
460
-
461
- function getSegmentValue(
462
- date: DateValue | null,
463
- type: DateSegmentType
464
- ): number | undefined {
465
- if (!date) return undefined;
466
-
467
- switch (type) {
468
- case 'year':
469
- return date.year;
470
- case 'month':
471
- return date.month;
472
- case 'day':
473
- return date.day;
474
- case 'hour':
475
- return 'hour' in date ? (date as CalendarDateTime).hour : undefined;
476
- case 'minute':
477
- return 'minute' in date ? (date as CalendarDateTime).minute : undefined;
478
- case 'second':
479
- return 'second' in date ? (date as CalendarDateTime).second : undefined;
480
- default:
481
- return undefined;
482
- }
483
- }
484
-
485
- function getMinValue(type: DateSegmentType): number {
486
- switch (type) {
487
- case 'year':
488
- return 1;
489
- case 'month':
490
- return 1;
491
- case 'day':
492
- return 1;
493
- case 'hour':
494
- return 0;
495
- case 'minute':
496
- return 0;
497
- case 'second':
498
- return 0;
499
- default:
500
- return 0;
501
- }
502
- }
503
-
504
- function getMaxValue(type: DateSegmentType, date: DateValue): number {
505
- switch (type) {
506
- case 'year':
507
- return 9999;
508
- case 'month':
509
- return 12;
510
- case 'day':
511
- // Get days in month
512
- return date.calendar.getDaysInMonth?.(date) ?? 31;
513
- case 'hour':
514
- return 23;
515
- case 'minute':
516
- return 59;
517
- case 'second':
518
- return 59;
519
- default:
520
- return 0;
521
- }
522
- }
523
-
524
- function getPlaceholderText(type: DateSegmentType): string {
525
- switch (type) {
526
- case 'year':
527
- return 'yyyy';
528
- case 'month':
529
- return 'mm';
530
- case 'day':
531
- return 'dd';
532
- case 'hour':
533
- return '––';
534
- case 'minute':
535
- return '––';
536
- case 'second':
537
- return '––';
538
- case 'dayPeriod':
539
- return 'AM';
540
- default:
541
- return '';
542
- }
543
- }
544
-
545
- function updateDatePart(date: DateValue, type: DateSegmentType, value: number): DateValue {
546
- switch (type) {
547
- case 'year':
548
- return (date as CalendarDate).set({ year: value });
549
- case 'month':
550
- return (date as CalendarDate).set({ month: value });
551
- case 'day':
552
- return (date as CalendarDate).set({ day: value });
553
- case 'hour':
554
- return (date as CalendarDateTime).set({ hour: value });
555
- case 'minute':
556
- return (date as CalendarDateTime).set({ minute: value });
557
- case 'second':
558
- return (date as CalendarDateTime).set({ second: value });
559
- default:
560
- return date;
561
- }
562
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"createRangeCalendarState.d.ts","sourceRoot":"","sources":["createRangeCalendarState.ts"],"names":[],"mappings":"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"}