@impulse-ui-native/datetime 2.0.1 → 2.1.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 (92) hide show
  1. package/LICENSE +21 -0
  2. package/dist/components/common/calendar-day.d.mts +16 -0
  3. package/dist/components/common/calendar-day.js +56 -0
  4. package/dist/components/common/calendar-day.js.map +1 -0
  5. package/dist/components/common/calendar.d.mts +14 -0
  6. package/dist/components/common/calendar.js +58 -0
  7. package/dist/components/common/calendar.js.map +1 -0
  8. package/dist/components/common/date-control.d.mts +14 -0
  9. package/dist/components/common/date-control.js +57 -0
  10. package/dist/components/common/date-control.js.map +1 -0
  11. package/dist/components/common/datetime-picker-flyout-actions.d.mts +15 -0
  12. package/dist/components/common/datetime-picker-flyout-actions.js +26 -0
  13. package/dist/components/common/datetime-picker-flyout-actions.js.map +1 -0
  14. package/dist/components/common/quick-date-options.d.mts +13 -0
  15. package/dist/components/common/quick-date-options.js +33 -0
  16. package/dist/components/common/quick-date-options.js.map +1 -0
  17. package/dist/components/common/visible-date-select.d.mts +11 -0
  18. package/dist/components/common/visible-date-select.js +70 -0
  19. package/dist/components/common/visible-date-select.js.map +1 -0
  20. package/dist/components/date/date-picker.d.mts +10 -0
  21. package/dist/components/date/date-picker.flyout.d.mts +12 -0
  22. package/dist/components/date/date-picker.flyout.js +58 -0
  23. package/dist/components/date/date-picker.flyout.js.map +1 -0
  24. package/dist/components/date/date-picker.js +61 -0
  25. package/dist/components/date/date-picker.js.map +1 -0
  26. package/dist/components/date/date-range-picker.d.mts +10 -0
  27. package/dist/components/date/date-range-picker.js +63 -0
  28. package/dist/components/date/date-range-picker.js.map +1 -0
  29. package/dist/components/datetime/datetime-picker.d.mts +10 -0
  30. package/dist/components/datetime/datetime-picker.flyout.d.mts +13 -0
  31. package/dist/components/datetime/datetime-picker.flyout.js +80 -0
  32. package/dist/components/datetime/datetime-picker.flyout.js.map +1 -0
  33. package/dist/components/datetime/datetime-picker.js +63 -0
  34. package/dist/components/datetime/datetime-picker.js.map +1 -0
  35. package/dist/components/datetime/datetime-range-picker.d.mts +10 -0
  36. package/dist/components/datetime/datetime-range-picker.flyout.d.mts +14 -0
  37. package/dist/components/datetime/datetime-range-picker.flyout.js +114 -0
  38. package/dist/components/datetime/datetime-range-picker.flyout.js.map +1 -0
  39. package/dist/components/datetime/datetime-range-picker.js +69 -0
  40. package/dist/components/datetime/datetime-range-picker.js.map +1 -0
  41. package/dist/components/index.d.mts +12 -0
  42. package/dist/components/index.js +13 -0
  43. package/dist/components/index.js.map +1 -0
  44. package/dist/components/time/picker-column.d.mts +15 -0
  45. package/dist/components/time/picker-column.js +177 -0
  46. package/dist/components/time/picker-column.js.map +1 -0
  47. package/dist/components/time/time-picker.d.mts +14 -0
  48. package/dist/components/time/time-picker.flyout.d.mts +13 -0
  49. package/dist/components/time/time-picker.flyout.js +153 -0
  50. package/dist/components/time/time-picker.flyout.js.map +1 -0
  51. package/dist/components/time/time-picker.js +111 -0
  52. package/dist/components/time/time-picker.js.map +1 -0
  53. package/dist/constants/index.d.mts +1 -0
  54. package/dist/constants/index.js +2 -0
  55. package/dist/constants/index.js.map +1 -0
  56. package/dist/constants/picker.constants.d.mts +11 -0
  57. package/dist/constants/picker.constants.js +17 -0
  58. package/dist/constants/picker.constants.js.map +1 -0
  59. package/dist/hooks/index.d.mts +6 -0
  60. package/dist/hooks/index.js +7 -0
  61. package/dist/hooks/index.js.map +1 -0
  62. package/dist/hooks/use-datetime-picker.hook.d.mts +32 -0
  63. package/dist/hooks/use-datetime-picker.hook.js +112 -0
  64. package/dist/hooks/use-datetime-picker.hook.js.map +1 -0
  65. package/dist/hooks/use-datetime-range-picker.hook.d.mts +34 -0
  66. package/dist/hooks/use-datetime-range-picker.hook.js +161 -0
  67. package/dist/hooks/use-datetime-range-picker.hook.js.map +1 -0
  68. package/dist/index.d.mts +14 -116
  69. package/dist/index.js +3 -1741
  70. package/dist/index.js.map +1 -1
  71. package/dist/types/common.types.d.mts +42 -0
  72. package/dist/types/common.types.js +1 -0
  73. package/dist/types/common.types.js.map +1 -0
  74. package/dist/types/datetime-picker.types.d.mts +12 -0
  75. package/dist/types/datetime-picker.types.js +1 -0
  76. package/dist/types/datetime-picker.types.js.map +1 -0
  77. package/dist/types/datetime-range-picker.types.d.mts +12 -0
  78. package/dist/types/datetime-range-picker.types.js +1 -0
  79. package/dist/types/datetime-range-picker.types.js.map +1 -0
  80. package/dist/types/index.d.mts +5 -0
  81. package/dist/types/index.js +4 -0
  82. package/dist/types/index.js.map +1 -0
  83. package/dist/utils/calendar-day.utils.d.mts +32 -0
  84. package/dist/utils/calendar-day.utils.js +120 -0
  85. package/dist/utils/calendar-day.utils.js.map +1 -0
  86. package/dist/utils/datetime.utils.d.mts +22 -0
  87. package/dist/utils/datetime.utils.js +165 -0
  88. package/dist/utils/datetime.utils.js.map +1 -0
  89. package/dist/utils/index.d.mts +5 -0
  90. package/dist/utils/index.js +3 -0
  91. package/dist/utils/index.js.map +1 -0
  92. package/package.json +14 -13
package/dist/index.js CHANGED
@@ -1,1742 +1,4 @@
1
- // src/components/date/date-picker.tsx
2
- import { memo as memo8 } from "react";
3
- import { Control as Control2 } from "@impulse-ui-native/primitives";
4
-
5
- // src/hooks/use-datetime-picker.hook.ts
6
- import { useCallback, useEffect, useId, useState } from "react";
7
- import { useControllableState, useIsOpen } from "@impulse-ui-native/core";
8
-
9
- // src/utils/datetime.utils.ts
10
- function getMonthNames(locale = "en-US", format = "long") {
11
- return Array.from(
12
- { length: 12 },
13
- (_, monthIndex) => new Intl.DateTimeFormat(locale, {
14
- month: format
15
- }).format(new Date(2026, monthIndex, 1))
16
- );
17
- }
18
- function getDayNames(locale = "en-US", format = "long") {
19
- const formatter = new Intl.DateTimeFormat(locale, {
20
- weekday: format
21
- });
22
- const monday = new Date(2024, 0, 1);
23
- return Array.from({ length: 7 }, (_, index) => {
24
- const date = new Date(monday);
25
- date.setDate(monday.getDate() + index);
26
- return formatter.format(date);
27
- });
28
- }
29
- function getYears() {
30
- const start = (/* @__PURE__ */ new Date()).getFullYear();
31
- let current = start;
32
- const years = [];
33
- while (current >= start - 150) {
34
- years.push(current--);
35
- }
36
- return years;
37
- }
38
- function getMonthCalendarMatrix(year, month) {
39
- const firstDayOfMonth = new Date(year, month, 1);
40
- const lastDayOfMonth = new Date(year, month + 1, 0);
41
- const firstDayWeekday = firstDayOfMonth.getDay();
42
- const mondayOffset = firstDayWeekday === 0 ? -6 : 1 - firstDayWeekday;
43
- const gridStartDate = new Date(firstDayOfMonth);
44
- gridStartDate.setDate(firstDayOfMonth.getDate() + mondayOffset);
45
- const lastDayWeekday = lastDayOfMonth.getDay();
46
- const sundayOffset = lastDayWeekday === 0 ? 0 : 7 - lastDayWeekday;
47
- const gridEndDate = new Date(lastDayOfMonth);
48
- gridEndDate.setDate(lastDayOfMonth.getDate() + sundayOffset);
49
- const weeks = [];
50
- const currentDate = new Date(gridStartDate);
51
- while (currentDate <= gridEndDate) {
52
- const week = [];
53
- for (let dayIndex = 0; dayIndex < 7; dayIndex += 1) {
54
- week.push(new Date(currentDate));
55
- currentDate.setDate(currentDate.getDate() + 1);
56
- }
57
- weeks.push(week);
58
- }
59
- return weeks;
60
- }
61
- function createInfiniteRange(max, repeats) {
62
- const half = Math.floor(max / 2);
63
- const base = Array.from({ length: max }, (_, i) => i);
64
- return [
65
- ...base.slice(half),
66
- ...Array(repeats).fill(base).flat(),
67
- ...base.slice(0, half)
68
- ];
69
- }
70
- function getInfiniteRangeInitialIndex(max, targetValue, repeats) {
71
- const half = Math.floor(max / 2);
72
- const middleSetIndex = Math.floor(repeats / 2);
73
- return half + middleSetIndex * max + targetValue;
74
- }
75
- function getClosestIndexByValue(data, value, currentIndex) {
76
- let closestIndex = -1;
77
- let closestDistance = Number.MAX_SAFE_INTEGER;
78
- for (let index = 0; index < data.length; index += 1) {
79
- if (data[index] !== value) {
80
- continue;
81
- }
82
- const distance = Math.abs(index - currentIndex);
83
- if (distance < closestDistance) {
84
- closestDistance = distance;
85
- closestIndex = index;
86
- }
87
- }
88
- return closestIndex;
89
- }
90
- function formatTimepickerValue(value) {
91
- const hours = String(value.hours).padStart(2, "0");
92
- const minutes = String(value.minutes).padStart(2, "0");
93
- const seconds = String(value.seconds).padStart(2, "0");
94
- return `${hours}:${minutes}:${seconds}`;
95
- }
96
- function applyTime(date, time) {
97
- const nextDate = new Date(date);
98
- nextDate.setHours(time?.hours ?? 0);
99
- nextDate.setMinutes(time?.minutes ?? 0);
100
- nextDate.setSeconds(time?.seconds ?? 0);
101
- nextDate.setMilliseconds(0);
102
- return nextDate;
103
- }
104
- function getInitialVisibleDate(value, defaultValue) {
105
- return value?.start ?? value?.end ?? defaultValue?.start ?? defaultValue?.end ?? /* @__PURE__ */ new Date();
106
- }
107
- function normalizeRange(range) {
108
- if (!range?.start && !range?.end) {
109
- return null;
110
- }
111
- if (range.start && range.end && range.start > range.end) {
112
- return {
113
- start: range.end,
114
- end: range.start
115
- };
116
- }
117
- return range;
118
- }
119
- function endOfDay(date) {
120
- const nextDate = new Date(date);
121
- nextDate.setHours(23);
122
- nextDate.setMinutes(59);
123
- nextDate.setSeconds(59);
124
- nextDate.setMilliseconds(999);
125
- return nextDate;
126
- }
127
- function addDays(date, days) {
128
- const nextDate = new Date(date);
129
- nextDate.setDate(nextDate.getDate() + days);
130
- return nextDate;
131
- }
132
- function startOfWeek(date) {
133
- const nextDate = startOfDay(date);
134
- const day = nextDate.getDay();
135
- const diff = day === 0 ? -6 : 1 - day;
136
- nextDate.setDate(nextDate.getDate() + diff);
137
- return nextDate;
138
- }
139
- function endOfWeek(date) {
140
- const nextDate = startOfWeek(date);
141
- nextDate.setDate(nextDate.getDate() + 6);
142
- nextDate.setHours(23);
143
- nextDate.setMinutes(59);
144
- nextDate.setSeconds(59);
145
- nextDate.setMilliseconds(999);
146
- return nextDate;
147
- }
148
- function startOfDay(date) {
149
- const nextDate = new Date(date);
150
- nextDate.setHours(0);
151
- nextDate.setMinutes(0);
152
- nextDate.setSeconds(0);
153
- nextDate.setMilliseconds(0);
154
- return nextDate;
155
- }
156
-
157
- // src/utils/calendar-day.utils.ts
158
- function isTimeRange(value) {
159
- return typeof value === "object" && value !== null && !(value instanceof Date) && ("start" in value || "end" in value);
160
- }
161
- function isSameDay(left, right) {
162
- return left.getFullYear() === right.getFullYear() && left.getMonth() === right.getMonth() && left.getDate() === right.getDate();
163
- }
164
- function isDateInMonth(date, monthDate) {
165
- return date.getFullYear() === monthDate.getFullYear() && date.getMonth() === monthDate.getMonth();
166
- }
167
- function isBeforeDay(left, right) {
168
- return startOfDay(left).getTime() < startOfDay(right).getTime();
169
- }
170
- function isAfterDay(left, right) {
171
- return startOfDay(left).getTime() > startOfDay(right).getTime();
172
- }
173
- function isRangeStart(date, rangeStart) {
174
- if (!rangeStart) {
175
- return false;
176
- }
177
- return isSameDay(date, rangeStart);
178
- }
179
- function isRangeEnd(date, rangeEnd) {
180
- if (!rangeEnd) {
181
- return false;
182
- }
183
- return isSameDay(date, rangeEnd);
184
- }
185
- function isInRange(date, rangeStart, rangeEnd) {
186
- if (!rangeStart || !rangeEnd) {
187
- return false;
188
- }
189
- const currentTime = startOfDay(date).getTime();
190
- const startTime = startOfDay(rangeStart).getTime();
191
- const endTime = startOfDay(rangeEnd).getTime();
192
- return currentTime > startTime && currentTime < endTime;
193
- }
194
- function isSelected(date, selected, rangeStart, rangeEnd) {
195
- if (selected && isSameDay(date, selected)) {
196
- return true;
197
- }
198
- if (rangeStart && isSameDay(date, rangeStart)) {
199
- return true;
200
- }
201
- if (rangeEnd && isSameDay(date, rangeEnd)) {
202
- return true;
203
- }
204
- return false;
205
- }
206
- function getCalendarDayState({
207
- date,
208
- visible,
209
- value
210
- }) {
211
- const selected = value instanceof Date ? value : void 0;
212
- const range = isTimeRange(value) ? value : void 0;
213
- const rangeStart = range?.start;
214
- const rangeEnd = range?.end;
215
- return {
216
- isSelected: isSelected(date, selected, rangeStart, rangeEnd),
217
- isRangeStart: isRangeStart(date, rangeStart),
218
- isInRange: isInRange(date, rangeStart, rangeEnd),
219
- isRangeEnd: isRangeEnd(date, rangeEnd),
220
- isCurrentMonth: isDateInMonth(date, visible)
221
- };
222
- }
223
- function createCalendarRange(date, previousRange) {
224
- if (!previousRange?.start || previousRange?.end) {
225
- return {
226
- start: date
227
- };
228
- }
229
- if (isSameDay(date, previousRange.start)) {
230
- return void 0;
231
- }
232
- if (isBeforeDay(date, previousRange.start)) {
233
- return {
234
- start: date,
235
- end: previousRange.start
236
- };
237
- }
238
- return {
239
- start: previousRange.start,
240
- end: date
241
- };
242
- }
243
- function getQuickOptionKey(value) {
244
- if ("start" in value && "end" in value) {
245
- return `${value.start?.toISOString()}-${value.end?.toISOString()}`;
246
- }
247
- if (value instanceof Date) {
248
- return value.toISOString();
249
- }
250
- }
251
- function isDateRange(value) {
252
- return typeof value === "object" && value !== null && !(value instanceof Date) && ("start" in value || "end" in value);
253
- }
254
- function getDateKey(date) {
255
- const year = date.getFullYear();
256
- const month = String(date.getMonth() + 1).padStart(2, "0");
257
- const day = String(date.getDate()).padStart(2, "0");
258
- return `${year}-${month}-${day}`;
259
- }
260
-
261
- // src/hooks/use-datetime-picker.hook.ts
262
- function useDatetimePicker({
263
- value,
264
- defaultValue,
265
- onChange
266
- }) {
267
- const [visible, setVisible] = useState(
268
- value ?? defaultValue ?? /* @__PURE__ */ new Date()
269
- );
270
- const [tempDate, setTempDate] = useState(
271
- value ?? defaultValue ?? null
272
- );
273
- const [selected, setSelected] = useControllableState({
274
- prop: value,
275
- defaultProp: defaultValue ?? null,
276
- onChange
277
- });
278
- const id = useId();
279
- const { isOpen, isClosed, open, close } = useIsOpen();
280
- const onPressOpen = useCallback(() => {
281
- setTempDate(selected);
282
- open();
283
- }, [open, selected]);
284
- const syncState = useCallback(() => {
285
- setTempDate(selected);
286
- if (selected) {
287
- setVisible(selected);
288
- }
289
- }, [selected]);
290
- const onPressApply = useCallback(() => {
291
- setSelected(tempDate);
292
- close();
293
- }, [close, tempDate]);
294
- const onPressCancel = useCallback(() => {
295
- close();
296
- }, [close]);
297
- const onPressCalendarDay = useCallback((date) => {
298
- setTempDate((prev) => {
299
- if (!prev) {
300
- return date;
301
- }
302
- if (isSameDay(date, prev)) {
303
- return null;
304
- }
305
- const nextDate = new Date(date);
306
- nextDate.setHours(prev.getHours());
307
- nextDate.setMinutes(prev.getMinutes());
308
- nextDate.setSeconds(prev.getSeconds());
309
- nextDate.setMilliseconds(prev.getMilliseconds());
310
- return nextDate;
311
- });
312
- }, []);
313
- const onChangeTime = useCallback(
314
- (time) => {
315
- setTempDate((prev) => {
316
- const nextDate = new Date(prev ?? visible);
317
- nextDate.setHours(time?.hours ?? 0);
318
- nextDate.setMinutes(time?.minutes ?? 0);
319
- nextDate.setSeconds(time?.seconds ?? 0);
320
- nextDate.setMilliseconds(0);
321
- return nextDate;
322
- });
323
- },
324
- [visible]
325
- );
326
- const onPressClear = useCallback(() => {
327
- setTempDate(null);
328
- }, []);
329
- const onPressQuickDateOption = useCallback(
330
- (optionValue) => {
331
- if (!(optionValue instanceof Date)) {
332
- return;
333
- }
334
- setTempDate(optionValue);
335
- if (!isDateInMonth(optionValue, visible)) {
336
- setVisible(optionValue);
337
- }
338
- },
339
- [visible]
340
- );
341
- useEffect(() => {
342
- if (!isOpen && isClosed) {
343
- setTempDate(selected);
344
- }
345
- }, [isOpen, selected, isClosed]);
346
- return {
347
- id,
348
- isOpen,
349
- visible,
350
- tempDate,
351
- selected,
352
- setVisible,
353
- setTempDate,
354
- setSelected,
355
- open,
356
- close,
357
- onPressOpen,
358
- onPressApply,
359
- onPressCancel,
360
- onPressCalendarDay,
361
- onChangeTime,
362
- onPressClear,
363
- onPressQuickDateOption,
364
- syncState
365
- };
366
- }
367
-
368
- // src/hooks/use-datetime-range-picker.hook.ts
369
- import { useCallback as useCallback2, useEffect as useEffect2, useId as useId2, useState as useState2 } from "react";
370
- import { useControllableState as useControllableState2, useIsOpen as useIsOpen2 } from "@impulse-ui-native/core";
371
- function useDatetimeRangePicker({
372
- value,
373
- defaultValue,
374
- onChange
375
- }) {
376
- const [visible, setVisible] = useState2(
377
- getInitialVisibleDate(value, defaultValue)
378
- );
379
- const [tempRange, setTempRange] = useState2(
380
- value ?? defaultValue ?? null
381
- );
382
- const [selected, setSelected] = useControllableState2({
383
- prop: value,
384
- defaultProp: defaultValue ?? null,
385
- onChange
386
- });
387
- const id = useId2();
388
- const { isOpen, isClosed, open, close } = useIsOpen2();
389
- const onPressOpen = useCallback2(() => {
390
- setTempRange(selected);
391
- open();
392
- }, [open, selected]);
393
- const syncState = useCallback2(() => {
394
- setTempRange(selected);
395
- const nextVisible = selected?.start ?? selected?.end;
396
- if (nextVisible) {
397
- setVisible(nextVisible);
398
- }
399
- }, [selected]);
400
- const onPressApply = useCallback2(() => {
401
- setSelected(normalizeRange(tempRange));
402
- close();
403
- }, [close, tempRange]);
404
- const onPressCancel = useCallback2(() => {
405
- close();
406
- }, [close]);
407
- const onPressCalendarDay = useCallback2((date) => {
408
- setTempRange((prev) => {
409
- const startDate = startOfDay(date);
410
- const endDate = endOfDay(date);
411
- if (!prev?.start || prev.end) {
412
- return {
413
- start: startDate
414
- };
415
- }
416
- if (isSameDay(startDate, prev.start)) {
417
- return null;
418
- }
419
- if (startDate < prev.start) {
420
- return {
421
- start: startDate,
422
- end: endOfDay(prev.start)
423
- };
424
- }
425
- return {
426
- start: prev.start,
427
- end: endDate
428
- };
429
- });
430
- }, []);
431
- const onChangeStartTime = useCallback2(
432
- (time) => {
433
- setTempRange((prev) => {
434
- const fallbackDate = prev?.start ?? visible;
435
- return normalizeRange({
436
- start: applyTime(fallbackDate, time),
437
- end: prev?.end
438
- });
439
- });
440
- },
441
- [visible]
442
- );
443
- const onChangeEndTime = useCallback2(
444
- (time) => {
445
- setTempRange((prev) => {
446
- const fallbackDate = prev?.end ?? prev?.start ?? visible;
447
- return normalizeRange({
448
- start: prev?.start,
449
- end: applyTime(fallbackDate, time)
450
- });
451
- });
452
- },
453
- [visible]
454
- );
455
- const onChangeTime = useCallback2(
456
- (side, time) => {
457
- if (side === "start") {
458
- onChangeStartTime(time);
459
- return;
460
- }
461
- onChangeEndTime(time);
462
- },
463
- [onChangeEndTime, onChangeStartTime]
464
- );
465
- const onPressClear = useCallback2(() => {
466
- setTempRange(null);
467
- }, []);
468
- const onPressQuickDateOption = useCallback2(
469
- (optionValue) => {
470
- if (optionValue instanceof Date) {
471
- const nextDate = startOfDay(optionValue);
472
- setTempRange({
473
- start: nextDate
474
- });
475
- if (!isDateInMonth(nextDate, visible)) {
476
- setVisible(nextDate);
477
- }
478
- return;
479
- }
480
- const nextRange = normalizeRange(optionValue);
481
- setTempRange(nextRange);
482
- const nextVisible = nextRange?.start ?? nextRange?.end;
483
- if (nextVisible && !isDateInMonth(nextVisible, visible)) {
484
- setVisible(nextVisible);
485
- }
486
- },
487
- [visible]
488
- );
489
- useEffect2(() => {
490
- if (!isOpen && isClosed) {
491
- setTempRange(selected);
492
- }
493
- }, [isOpen, selected, isClosed]);
494
- return {
495
- id,
496
- isOpen,
497
- visible,
498
- tempRange,
499
- selected,
500
- setVisible,
501
- setTempRange,
502
- setSelected,
503
- open,
504
- close,
505
- onPressOpen,
506
- onPressApply,
507
- onPressCancel,
508
- onPressCalendarDay,
509
- onChangeTime,
510
- onChangeStartTime,
511
- onChangeEndTime,
512
- onPressClear,
513
- onPressQuickDateOption,
514
- syncState
515
- };
516
- }
517
-
518
- // src/components/common/date-control.tsx
519
- import { memo } from "react";
520
- import { CalendarDotsIcon } from "@impulse-ui-native/icon";
521
- import { Control, Pressable } from "@impulse-ui-native/primitives";
522
- import { jsx, jsxs } from "react/jsx-runtime";
523
- var DateControl = memo(function DateControl2(props) {
524
- const {
525
- size = "medium",
526
- variant = "outlined",
527
- label,
528
- error,
529
- disabled,
530
- PrefixIcon = CalendarDotsIcon,
531
- Prefix,
532
- onPressPrefix: onPrefixPress,
533
- SuffixIcon,
534
- Suffix,
535
- onPressSuffix: onSuffixPress,
536
- onPress,
537
- children
538
- } = props;
539
- return /* @__PURE__ */ jsx(
540
- Control.Provider,
541
- {
542
- size,
543
- variant,
544
- error,
545
- disabled,
546
- children: /* @__PURE__ */ jsxs(Control.Root, { children: [
547
- /* @__PURE__ */ jsx(Control.Label, { children: label }),
548
- /* @__PURE__ */ jsx(Pressable, { onPress, children: /* @__PURE__ */ jsxs(Control.Container, { children: [
549
- /* @__PURE__ */ jsx(
550
- Control.Addon,
551
- {
552
- icon: PrefixIcon,
553
- Content: Prefix,
554
- onPress: onPrefixPress
555
- }
556
- ),
557
- children,
558
- /* @__PURE__ */ jsx(
559
- Control.Addon,
560
- {
561
- icon: SuffixIcon,
562
- Content: Suffix,
563
- onPress: onSuffixPress
564
- }
565
- )
566
- ] }) }),
567
- /* @__PURE__ */ jsx(Control.Error, {})
568
- ] })
569
- }
570
- );
571
- });
572
-
573
- // src/components/date/date-picker.flyout.tsx
574
- import { memo as memo7 } from "react";
575
- import { Flyout } from "@impulse-ui-native/flyout";
576
- import { Portal } from "@impulse-ui-native/portal";
577
- import { View as View5 } from "@impulse-ui-native/primitives";
578
- import { useComponentsTokens as useComponentsTokens5 } from "@impulse-ui-native/theme";
579
-
580
- // src/components/common/calendar.tsx
581
- import { memo as memo3, useMemo } from "react";
582
- import { Typography as Typography2, View as View2 } from "@impulse-ui-native/primitives";
583
- import { useComponentsTokens } from "@impulse-ui-native/theme";
584
-
585
- // src/components/common/calendar-day.tsx
586
- import { memo as memo2, useCallback as useCallback3 } from "react";
587
- import { StyleSheet } from "react-native";
588
- import { Pressable as Pressable2, Typography, View } from "@impulse-ui-native/primitives";
589
- import { useThemedStyles } from "@impulse-ui-native/theme";
590
- import { jsx as jsx2 } from "react/jsx-runtime";
591
- var CalendarDay = memo2(function CalendarDay2(props) {
592
- const styles2 = useThemedStyles(themedStyles, props, [
593
- props.isSelected,
594
- props.isRangeStart,
595
- props.isInRange,
596
- props.isRangeEnd,
597
- props.isCurrentMonth
598
- ]);
599
- const handleOnPress = useCallback3(
600
- () => props.onPress?.(props.date),
601
- [props.date, props.onPress]
602
- );
603
- return /* @__PURE__ */ jsx2(Pressable2, { style: styles2.pressableStyles, onPress: handleOnPress, children: /* @__PURE__ */ jsx2(View, { style: styles2.container, children: /* @__PURE__ */ jsx2(Typography.Body, { style: styles2.text, numeric: true, children: props.date.getDate() }) }) });
604
- });
605
- function themedStyles(theme, props) {
606
- const dayTokens = theme.components.datetimePicker.day;
607
- let color = dayTokens.color;
608
- let backgroundColor = "transparent";
609
- if (!props.isCurrentMonth) {
610
- color = dayTokens.outsideMonthColor;
611
- }
612
- if (props.isInRange) {
613
- backgroundColor = dayTokens.rangeBackgroundColor;
614
- color = dayTokens.rangeColor;
615
- }
616
- if (props.isSelected || props.isRangeStart || props.isRangeEnd) {
617
- backgroundColor = dayTokens.selectedBackgroundColor;
618
- color = dayTokens.selectedColor;
619
- }
620
- return StyleSheet.create({
621
- pressableStyles: {
622
- justifyContent: "center",
623
- alignItems: "center"
624
- },
625
- container: {
626
- borderRadius: dayTokens.borderRadius,
627
- width: dayTokens.size,
628
- height: dayTokens.size,
629
- justifyContent: "center",
630
- alignItems: "center",
631
- backgroundColor
632
- },
633
- text: {
634
- color
635
- }
636
- });
637
- }
638
-
639
- // src/components/common/calendar.tsx
640
- import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
641
- var Calendar = memo3(function Calendar2(props) {
642
- const { visible, value, onPress } = props;
643
- const tokens = useComponentsTokens();
644
- const calendarTokens = tokens.datetimePicker.calendar;
645
- const visibleMonth = visible.getMonth();
646
- const visibleYear = visible.getFullYear();
647
- const days = useMemo(() => {
648
- return getDayNames();
649
- }, []);
650
- const calendar = useMemo(() => {
651
- return getMonthCalendarMatrix(visibleYear, visibleMonth);
652
- }, [visibleYear, visibleMonth]);
653
- return /* @__PURE__ */ jsxs2(View2, { children: [
654
- /* @__PURE__ */ jsx3(
655
- View2,
656
- {
657
- flexDirection: "row",
658
- marginBottom: calendarTokens.dayNamesMarginBottom,
659
- children: days.map((day) => /* @__PURE__ */ jsx3(Typography2.Body, { flex: 1, textAlign: "center", children: day[0] }, day))
660
- }
661
- ),
662
- /* @__PURE__ */ jsx3(View2, { gap: calendarTokens.weeksGap, children: calendar.map((dates, index) => /* @__PURE__ */ jsx3(View2, { flexDirection: "row", justifyContent: "space-around", children: dates.map((date) => {
663
- const state = getCalendarDayState({
664
- date,
665
- visible,
666
- value
667
- });
668
- return /* @__PURE__ */ jsx3(
669
- CalendarDay,
670
- {
671
- date,
672
- isSelected: state.isSelected,
673
- isInRange: state.isInRange,
674
- isRangeStart: state.isRangeStart,
675
- isRangeEnd: state.isRangeEnd,
676
- isCurrentMonth: state.isCurrentMonth,
677
- onPress
678
- },
679
- getDateKey(date)
680
- );
681
- }) }, index)) })
682
- ] });
683
- });
684
-
685
- // src/components/common/datetime-picker-flyout-actions.tsx
686
- import { memo as memo4 } from "react";
687
- import {
688
- Button,
689
- Pressable as Pressable3,
690
- Typography as Typography3,
691
- View as View3
692
- } from "@impulse-ui-native/primitives";
693
- import { useComponentsTokens as useComponentsTokens2 } from "@impulse-ui-native/theme";
694
- import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
695
- var DatetimePickerFlyoutActions = memo4(
696
- function DatetimePickerFlyoutActions2(props) {
697
- const tokens = useComponentsTokens2();
698
- const flyoutActionsTokens = tokens.datetimePicker.flyoutActions;
699
- return /* @__PURE__ */ jsxs3(View3, { gap: flyoutActionsTokens.gap, children: [
700
- props.canClear ? /* @__PURE__ */ jsx4(View3, { alignItems: "center", children: /* @__PURE__ */ jsx4(Pressable3, { onPress: props.onPressClear, children: /* @__PURE__ */ jsx4(Typography3.BodyLarge, { color: flyoutActionsTokens.clearColor, children: "Clear" }) }) }) : null,
701
- /* @__PURE__ */ jsxs3(View3, { flexDirection: "row", gap: flyoutActionsTokens.buttonsGap, children: [
702
- /* @__PURE__ */ jsx4(View3, { flex: 1, children: /* @__PURE__ */ jsx4(Button, { onPress: props.onPressCancel, variant: "outlined", children: "Cancel" }) }),
703
- /* @__PURE__ */ jsx4(View3, { flex: 1, children: /* @__PURE__ */ jsx4(Button, { onPress: props.onPressApply, children: "Apply" }) })
704
- ] })
705
- ] });
706
- }
707
- );
708
-
709
- // src/components/common/quick-date-options.tsx
710
- import { memo as memo5, useMemo as useMemo2 } from "react";
711
- import { ScrollView } from "react-native";
712
- import { Tag } from "@impulse-ui-native/primitives";
713
- import { useComponentsTokens as useComponentsTokens3 } from "@impulse-ui-native/theme";
714
- import { jsx as jsx5 } from "react/jsx-runtime";
715
- var QuickDateOptions = memo5(function QuickDateOptions2(props) {
716
- const tokens = useComponentsTokens3();
717
- const style = useMemo2(
718
- () => ({ gap: tokens.datetimePicker.quickDateOptions.gap }),
719
- [tokens.datetimePicker.quickDateOptions]
720
- );
721
- return /* @__PURE__ */ jsx5(
722
- ScrollView,
723
- {
724
- horizontal: true,
725
- contentContainerStyle: style,
726
- showsHorizontalScrollIndicator: false,
727
- children: props.options.map((option, index) => /* @__PURE__ */ jsx5(
728
- Tag,
729
- {
730
- label: option.label,
731
- onPress: () => props.onPress?.(option.value)
732
- },
733
- getQuickOptionKey(option.value) ?? index
734
- ))
735
- }
736
- );
737
- });
738
-
739
- // src/components/common/visible-date-select.tsx
740
- import { memo as memo6, useCallback as useCallback4, useMemo as useMemo3 } from "react";
741
- import { CalendarDotsIcon as CalendarDotsIcon2 } from "@impulse-ui-native/icon";
742
- import { View as View4 } from "@impulse-ui-native/primitives";
743
- import { Select } from "@impulse-ui-native/select";
744
- import { useComponentsTokens as useComponentsTokens4 } from "@impulse-ui-native/theme";
745
- import { jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
746
- var VisibleDateSelect = memo6(function VisibleDateSelect2(props) {
747
- const tokens = useComponentsTokens4();
748
- const monthOptions = useMemo3(() => {
749
- return getMonthNames().map((month, index) => ({
750
- label: month,
751
- value: index
752
- }));
753
- }, []);
754
- const yearOptions = useMemo3(() => {
755
- return getYears().map((year) => ({
756
- label: String(year),
757
- value: year
758
- }));
759
- }, []);
760
- const onChangeVisibleMonth = useCallback4(
761
- (month) => {
762
- if (month !== void 0 && month !== props.value.getMonth()) {
763
- const newDate = new Date(props.value);
764
- newDate.setMonth(month);
765
- props.onChange(newDate);
766
- }
767
- },
768
- [props.value, props.onChange]
769
- );
770
- const onChangeVisibleYear = useCallback4(
771
- (year) => {
772
- if (year !== void 0 && year !== props.value.getFullYear()) {
773
- const newDate = new Date(props.value);
774
- newDate.setFullYear(year);
775
- props.onChange(newDate);
776
- }
777
- },
778
- [props.value, props.onChange]
779
- );
780
- return /* @__PURE__ */ jsxs4(View4, { flexDirection: "row", gap: tokens.datetimePicker.visibleDateSelect.gap, children: [
781
- /* @__PURE__ */ jsx6(View4, { flex: 1, children: /* @__PURE__ */ jsx6(
782
- Select,
783
- {
784
- options: monthOptions,
785
- value: props.value.getMonth(),
786
- defaultValue: props.defaultValue?.getMonth() ?? props.value.getMonth(),
787
- PrefixIcon: CalendarDotsIcon2,
788
- onChange: onChangeVisibleMonth,
789
- placeholder: "Month"
790
- }
791
- ) }),
792
- /* @__PURE__ */ jsx6(View4, { flex: 1, children: /* @__PURE__ */ jsx6(
793
- Select,
794
- {
795
- options: yearOptions,
796
- value: props.value.getFullYear(),
797
- defaultValue: props.defaultValue?.getFullYear() ?? props.value.getFullYear(),
798
- PrefixIcon: CalendarDotsIcon2,
799
- onChange: onChangeVisibleYear,
800
- placeholder: "Year"
801
- }
802
- ) })
803
- ] });
804
- });
805
-
806
- // src/components/date/date-picker.flyout.tsx
807
- import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
808
- var DatePickerFlyout = memo7(function DatePickerFlyout2(props) {
809
- const {
810
- visible,
811
- value,
812
- clearable,
813
- quickDateOptions,
814
- onPressQuickDateOption,
815
- onChangeVisible,
816
- onPressCalendarDay,
817
- onPressClear,
818
- onPressCancel,
819
- onPressApply,
820
- ...rest
821
- } = props;
822
- const tokens = useComponentsTokens5();
823
- const datePickerTokens = tokens.datetimePicker.datePickerFlyout;
824
- return /* @__PURE__ */ jsx7(Portal, { children: /* @__PURE__ */ jsx7(Flyout, { ...rest, children: /* @__PURE__ */ jsxs5(View5, { gap: datePickerTokens.gap, children: [
825
- /* @__PURE__ */ jsx7(VisibleDateSelect, { value: visible, onChange: onChangeVisible }),
826
- /* @__PURE__ */ jsx7(
827
- Calendar,
828
- {
829
- value,
830
- visible,
831
- onPress: onPressCalendarDay
832
- }
833
- ),
834
- quickDateOptions && quickDateOptions.length > 0 ? /* @__PURE__ */ jsx7(
835
- QuickDateOptions,
836
- {
837
- options: quickDateOptions,
838
- onPress: onPressQuickDateOption
839
- }
840
- ) : null,
841
- /* @__PURE__ */ jsx7(
842
- DatetimePickerFlyoutActions,
843
- {
844
- canClear: Boolean(value && clearable),
845
- onPressApply,
846
- onPressCancel,
847
- onPressClear
848
- }
849
- )
850
- ] }) }) });
851
- });
852
-
853
- // src/components/date/date-picker.tsx
854
- import { jsx as jsx8, jsxs as jsxs6 } from "react/jsx-runtime";
855
- var DatePicker = memo8(function DatePicker2(props) {
856
- const {
857
- value,
858
- defaultValue,
859
- clearable,
860
- onChange,
861
- placeholder,
862
- quickDateOptions,
863
- ...rest
864
- } = props;
865
- const {
866
- id,
867
- isOpen,
868
- visible,
869
- tempDate,
870
- selected,
871
- setVisible,
872
- close,
873
- onPressOpen,
874
- onPressApply,
875
- onPressCancel,
876
- onPressCalendarDay,
877
- onPressClear,
878
- onPressQuickDateOption,
879
- syncState
880
- } = useDatetimePicker({ value, defaultValue, onChange });
881
- return /* @__PURE__ */ jsxs6(DateControl, { ...rest, onPress: onPressOpen, children: [
882
- selected === null ? /* @__PURE__ */ jsx8(Control2.Placeholder, { children: placeholder }) : null,
883
- selected !== null ? /* @__PURE__ */ jsx8(Control2.Value, { children: selected.toDateString() }) : null,
884
- /* @__PURE__ */ jsx8(
885
- DatePickerFlyout,
886
- {
887
- id,
888
- open: isOpen,
889
- title: "Date",
890
- visible,
891
- value: tempDate,
892
- clearable,
893
- quickDateOptions,
894
- onClose: close,
895
- onCloseFinished: syncState,
896
- onPressQuickDateOption,
897
- onChangeVisible: setVisible,
898
- onPressCalendarDay,
899
- onPressApply,
900
- onPressCancel,
901
- onPressClear
902
- }
903
- )
904
- ] });
905
- });
906
-
907
- // src/components/date/date-range-picker.tsx
908
- import { memo as memo9 } from "react";
909
- import { Control as Control3 } from "@impulse-ui-native/primitives";
910
- import { jsx as jsx9, jsxs as jsxs7 } from "react/jsx-runtime";
911
- var DateRangePicker = memo9(function DateRangePicker2(props) {
912
- const {
913
- value,
914
- defaultValue,
915
- onChange,
916
- placeholder,
917
- quickDateOptions,
918
- ...rest
919
- } = props;
920
- const {
921
- id,
922
- isOpen,
923
- visible,
924
- tempRange,
925
- selected,
926
- setVisible,
927
- close,
928
- onPressOpen,
929
- onPressApply,
930
- onPressCancel,
931
- onPressCalendarDay,
932
- onPressClear,
933
- onPressQuickDateOption,
934
- syncState
935
- } = useDatetimeRangePicker({ value, defaultValue, onChange });
936
- return /* @__PURE__ */ jsxs7(DateControl, { ...rest, onPress: onPressOpen, children: [
937
- selected === null ? /* @__PURE__ */ jsx9(Control3.Placeholder, { children: placeholder }) : null,
938
- selected !== null ? /* @__PURE__ */ jsxs7(Control3.Value, { children: [
939
- selected.start?.toDateString(),
940
- " - ",
941
- selected.end?.toDateString()
942
- ] }) : null,
943
- /* @__PURE__ */ jsx9(
944
- DatePickerFlyout,
945
- {
946
- id,
947
- title: "Datetime",
948
- open: isOpen,
949
- visible,
950
- value: tempRange,
951
- quickDateOptions,
952
- onClose: close,
953
- onCloseFinished: syncState,
954
- onPressQuickDateOption,
955
- onChangeVisible: setVisible,
956
- onPressCalendarDay,
957
- onPressApply,
958
- onPressCancel,
959
- onPressClear
960
- }
961
- )
962
- ] });
963
- });
964
-
965
- // src/components/datetime/datetime-picker.tsx
966
- import { memo as memo14 } from "react";
967
- import { Control as Control5 } from "@impulse-ui-native/primitives";
968
-
969
- // src/components/datetime/datetime-picker.flyout.tsx
970
- import { memo as memo13, useMemo as useMemo6 } from "react";
971
- import { Flyout as Flyout3 } from "@impulse-ui-native/flyout";
972
- import { Portal as Portal3 } from "@impulse-ui-native/portal";
973
- import { View as View8 } from "@impulse-ui-native/primitives";
974
- import { useComponentsTokens as useComponentsTokens8 } from "@impulse-ui-native/theme";
975
-
976
- // src/components/time/time-picker.tsx
977
- import { memo as memo12, useCallback as useCallback7, useEffect as useEffect4, useId as useId3, useState as useState3 } from "react";
978
- import { useControllableState as useControllableState3, useIsOpen as useIsOpen3 } from "@impulse-ui-native/core";
979
- import { ClockIcon } from "@impulse-ui-native/icon";
980
- import { Control as Control4, Pressable as Pressable5 } from "@impulse-ui-native/primitives";
981
-
982
- // src/components/time/time-picker.flyout.tsx
983
- import { memo as memo11, useCallback as useCallback6, useMemo as useMemo5 } from "react";
984
- import { Flyout as Flyout2 } from "@impulse-ui-native/flyout";
985
- import { Portal as Portal2 } from "@impulse-ui-native/portal";
986
- import { View as View7 } from "@impulse-ui-native/primitives";
987
- import { useComponentsTokens as useComponentsTokens7 } from "@impulse-ui-native/theme";
988
-
989
- // src/components/time/picker-column.tsx
990
- import { memo as memo10, useCallback as useCallback5, useEffect as useEffect3, useMemo as useMemo4, useRef } from "react";
991
- import {
992
- FlatList,
993
- StyleSheet as StyleSheet2
994
- } from "react-native";
995
- import { Pressable as Pressable4, Typography as Typography4, View as View6 } from "@impulse-ui-native/primitives";
996
- import {
997
- useComponentsTokens as useComponentsTokens6
998
- } from "@impulse-ui-native/theme";
999
- import { jsx as jsx10, jsxs as jsxs8 } from "react/jsx-runtime";
1000
- var PickerColumn = memo10(function PickerColumn2(props) {
1001
- const { data, label, value, initialScrollIndex = 0, onChange } = props;
1002
- const tokens = useComponentsTokens6();
1003
- const columnTokens = tokens.timePicker.column;
1004
- const listRef = useRef(null);
1005
- const currentIndexRef = useRef(initialScrollIndex);
1006
- const pressableStyle = useMemo4(
1007
- () => [
1008
- styles.pressableStyle,
1009
- {
1010
- width: columnTokens.listWidth,
1011
- height: columnTokens.itemHeight
1012
- }
1013
- ],
1014
- [columnTokens.listWidth, columnTokens.itemHeight]
1015
- );
1016
- const contentContainerStyle = useMemo4(
1017
- () => [
1018
- styles.contentContainerStyle,
1019
- {
1020
- paddingVertical: columnTokens.verticalPadding
1021
- }
1022
- ],
1023
- [columnTokens.verticalPadding]
1024
- );
1025
- const keyExtractor = useCallback5((item, index) => {
1026
- return `${item}-${index}`;
1027
- }, []);
1028
- const getItemLayout = useCallback5(
1029
- (_, index) => {
1030
- return {
1031
- length: columnTokens.itemHeight,
1032
- offset: columnTokens.itemHeight * index,
1033
- index
1034
- };
1035
- },
1036
- [columnTokens.itemHeight]
1037
- );
1038
- const scrollToIndex = useCallback5((index, animated) => {
1039
- currentIndexRef.current = index;
1040
- listRef.current?.scrollToIndex({
1041
- index,
1042
- animated
1043
- });
1044
- }, []);
1045
- const renderItem = useCallback5(
1046
- ({ item }) => {
1047
- const selected = item === value;
1048
- const fontWeight = selected ? columnTokens.selectedFontWeight : columnTokens.fontWeight;
1049
- return /* @__PURE__ */ jsx10(Pressable4, { style: pressableStyle, children: /* @__PURE__ */ jsx10(
1050
- Typography4.Master,
1051
- {
1052
- fontSize: columnTokens.fontSize,
1053
- color: selected ? columnTokens.selectedColor : columnTokens.color,
1054
- textAlign: "center",
1055
- numberOfLines: 1,
1056
- fontWeight,
1057
- numeric: true,
1058
- children: String(item).padStart(2, "0")
1059
- }
1060
- ) });
1061
- },
1062
- [
1063
- columnTokens.color,
1064
- columnTokens.fontSize,
1065
- columnTokens.fontWeight,
1066
- columnTokens.selectedColor,
1067
- columnTokens.selectedFontWeight,
1068
- pressableStyle,
1069
- value
1070
- ]
1071
- );
1072
- const onMomentumScrollEnd = useCallback5(
1073
- (event) => {
1074
- const offset = event.nativeEvent.contentOffset.y;
1075
- const index = Math.round(offset / columnTokens.itemHeight);
1076
- const newValue = data[index];
1077
- if (newValue === value) {
1078
- return;
1079
- }
1080
- currentIndexRef.current = index;
1081
- if (newValue !== void 0) {
1082
- onChange?.(newValue);
1083
- }
1084
- },
1085
- [columnTokens.itemHeight, data, onChange, value]
1086
- );
1087
- const onScrollToIndexFailed = useCallback5(() => {
1088
- requestAnimationFrame(() => {
1089
- listRef.current?.scrollToOffset({
1090
- offset: initialScrollIndex * columnTokens.itemHeight,
1091
- animated: false
1092
- });
1093
- });
1094
- }, [columnTokens.itemHeight, initialScrollIndex]);
1095
- useEffect3(() => {
1096
- if (value === void 0) {
1097
- return;
1098
- }
1099
- const closestIndex = getClosestIndexByValue(
1100
- data,
1101
- value,
1102
- currentIndexRef.current
1103
- );
1104
- if (closestIndex === -1 || closestIndex === currentIndexRef.current) {
1105
- return;
1106
- }
1107
- scrollToIndex(closestIndex, true);
1108
- }, [data, scrollToIndex, value]);
1109
- return /* @__PURE__ */ jsxs8(
1110
- View6,
1111
- {
1112
- width: columnTokens.width,
1113
- height: columnTokens.height,
1114
- flexDirection: "row",
1115
- justifyContent: "center",
1116
- gap: columnTokens.gap,
1117
- children: [
1118
- /* @__PURE__ */ jsx10(
1119
- View6,
1120
- {
1121
- width: columnTokens.listWidth,
1122
- height: columnTokens.height,
1123
- overflow: "hidden",
1124
- children: /* @__PURE__ */ jsx10(
1125
- FlatList,
1126
- {
1127
- ref: listRef,
1128
- data,
1129
- renderItem,
1130
- keyExtractor,
1131
- getItemLayout,
1132
- snapToInterval: columnTokens.itemHeight,
1133
- snapToAlignment: "start",
1134
- decelerationRate: "fast",
1135
- initialScrollIndex,
1136
- showsVerticalScrollIndicator: false,
1137
- contentContainerStyle,
1138
- onMomentumScrollEnd,
1139
- onScrollToIndexFailed,
1140
- removeClippedSubviews: true,
1141
- windowSize: 3,
1142
- initialNumToRender: 7,
1143
- maxToRenderPerBatch: 7,
1144
- updateCellsBatchingPeriod: 50,
1145
- scrollEventThrottle: 16
1146
- }
1147
- )
1148
- }
1149
- ),
1150
- /* @__PURE__ */ jsx10(Typography4.Body, { alignSelf: "center", children: label })
1151
- ]
1152
- }
1153
- );
1154
- });
1155
- var styles = StyleSheet2.create({
1156
- pressableStyle: {
1157
- alignItems: "center",
1158
- justifyContent: "center"
1159
- },
1160
- contentContainerStyle: {}
1161
- });
1162
-
1163
- // src/components/time/time-picker.flyout.tsx
1164
- import { jsx as jsx11, jsxs as jsxs9 } from "react/jsx-runtime";
1165
- var DefaultTimePickerValue = {
1166
- hours: 0,
1167
- minutes: 0,
1168
- seconds: 0
1169
- };
1170
- var TimePickerFlyout = memo11(function TimePickerFlyout2(props) {
1171
- const {
1172
- value,
1173
- onChange,
1174
- onPressApply,
1175
- onPressCancel,
1176
- onPressClear,
1177
- clearable,
1178
- ...rest
1179
- } = props;
1180
- const tokens = useComponentsTokens7();
1181
- const timePickerTokens = tokens.timePicker;
1182
- const selectedHours = value?.hours ?? DefaultTimePickerValue.hours;
1183
- const selectedMinutes = value?.minutes ?? DefaultTimePickerValue.minutes;
1184
- const selectedSeconds = value?.seconds ?? DefaultTimePickerValue.seconds;
1185
- const hours = useMemo5(() => {
1186
- return createInfiniteRange(24, 4);
1187
- }, []);
1188
- const minutes = useMemo5(() => {
1189
- return createInfiniteRange(60, 4);
1190
- }, []);
1191
- const seconds = useMemo5(() => {
1192
- return createInfiniteRange(60, 4);
1193
- }, []);
1194
- const hoursInitialIndex = useMemo5(() => {
1195
- return getInfiniteRangeInitialIndex(24, selectedHours, 4);
1196
- }, [selectedHours]);
1197
- const minutesInitialIndex = useMemo5(() => {
1198
- return getInfiniteRangeInitialIndex(60, selectedMinutes, 4);
1199
- }, [selectedMinutes]);
1200
- const secondsInitialIndex = useMemo5(() => {
1201
- return getInfiniteRangeInitialIndex(60, selectedSeconds, 4);
1202
- }, [selectedSeconds]);
1203
- const handleHoursChange = useCallback6(
1204
- (hours2) => {
1205
- onChange({
1206
- hours: hours2,
1207
- minutes: selectedMinutes,
1208
- seconds: selectedSeconds
1209
- });
1210
- },
1211
- [onChange, selectedMinutes, selectedSeconds]
1212
- );
1213
- const handleMinutesChange = useCallback6(
1214
- (minutes2) => {
1215
- onChange({
1216
- hours: selectedHours,
1217
- minutes: minutes2,
1218
- seconds: selectedSeconds
1219
- });
1220
- },
1221
- [onChange, selectedHours, selectedSeconds]
1222
- );
1223
- const handleSecondsChange = useCallback6(
1224
- (seconds2) => {
1225
- onChange({
1226
- hours: selectedHours,
1227
- minutes: selectedMinutes,
1228
- seconds: seconds2
1229
- });
1230
- },
1231
- [onChange, selectedHours, selectedMinutes]
1232
- );
1233
- return /* @__PURE__ */ jsx11(Portal2, { children: /* @__PURE__ */ jsx11(Flyout2, { ...rest, children: /* @__PURE__ */ jsxs9(View7, { gap: timePickerTokens.flyout.gap, children: [
1234
- /* @__PURE__ */ jsxs9(
1235
- View7,
1236
- {
1237
- height: timePickerTokens.columns.height,
1238
- gap: timePickerTokens.columns.gap,
1239
- flexDirection: "row",
1240
- alignItems: "center",
1241
- justifyContent: "center",
1242
- children: [
1243
- /* @__PURE__ */ jsx11(
1244
- View7,
1245
- {
1246
- pointerEvents: "none",
1247
- position: "absolute",
1248
- height: timePickerTokens.columns.indicatorHeight,
1249
- width: timePickerTokens.columns.indicatorWidth,
1250
- borderRadius: timePickerTokens.columns.indicatorBorderRadius,
1251
- backgroundColor: timePickerTokens.columns.indicatorBackgroundColor,
1252
- top: timePickerTokens.columns.indicatorTop
1253
- }
1254
- ),
1255
- /* @__PURE__ */ jsx11(
1256
- PickerColumn,
1257
- {
1258
- data: hours,
1259
- label: "h",
1260
- format: "24h",
1261
- type: "hour",
1262
- value: selectedHours,
1263
- initialScrollIndex: hoursInitialIndex,
1264
- onChange: handleHoursChange
1265
- }
1266
- ),
1267
- /* @__PURE__ */ jsx11(
1268
- PickerColumn,
1269
- {
1270
- data: minutes,
1271
- label: "m",
1272
- format: "24h",
1273
- type: "minute",
1274
- value: selectedMinutes,
1275
- initialScrollIndex: minutesInitialIndex,
1276
- onChange: handleMinutesChange
1277
- }
1278
- ),
1279
- /* @__PURE__ */ jsx11(
1280
- PickerColumn,
1281
- {
1282
- data: seconds,
1283
- label: "s",
1284
- format: "24h",
1285
- type: "second",
1286
- value: selectedSeconds,
1287
- initialScrollIndex: secondsInitialIndex,
1288
- onChange: handleSecondsChange
1289
- }
1290
- )
1291
- ]
1292
- }
1293
- ),
1294
- /* @__PURE__ */ jsx11(
1295
- DatetimePickerFlyoutActions,
1296
- {
1297
- canClear: Boolean(value && clearable),
1298
- onPressApply,
1299
- onPressCancel,
1300
- onPressClear
1301
- }
1302
- )
1303
- ] }) }) });
1304
- });
1305
-
1306
- // src/components/time/time-picker.tsx
1307
- import { jsx as jsx12, jsxs as jsxs10 } from "react/jsx-runtime";
1308
- var TimePicker = memo12(function TimePicker2(props) {
1309
- const {
1310
- value,
1311
- defaultValue,
1312
- placeholder,
1313
- clearable = true,
1314
- size = "medium",
1315
- onChange,
1316
- variant = "outlined",
1317
- label,
1318
- error,
1319
- disabled,
1320
- PrefixIcon = ClockIcon,
1321
- Prefix,
1322
- onPressPrefix: onPrefixPress,
1323
- SuffixIcon,
1324
- Suffix,
1325
- onPressSuffix: onSuffixPress
1326
- } = props;
1327
- const id = useId3();
1328
- const { isOpen, isClosed, finishClose, open, close } = useIsOpen3();
1329
- const [selected, setSelected] = useControllableState3({
1330
- prop: value,
1331
- defaultProp: defaultValue ?? null,
1332
- onChange
1333
- });
1334
- const [tempTime, setTempTime] = useState3(selected);
1335
- const onPressOpen = useCallback7(() => {
1336
- setTempTime(selected);
1337
- open();
1338
- }, [open, selected]);
1339
- const onPressApply = useCallback7(() => {
1340
- setSelected(tempTime);
1341
- close();
1342
- }, [tempTime, close]);
1343
- const onPressClear = useCallback7(() => {
1344
- setTempTime(null);
1345
- }, []);
1346
- const syncState = useCallback7(() => {
1347
- setTempTime(selected);
1348
- }, [selected]);
1349
- const onCloseFinished = useCallback7(() => {
1350
- syncState();
1351
- finishClose();
1352
- }, [syncState, finishClose]);
1353
- useEffect4(() => {
1354
- if (!isOpen && isClosed) {
1355
- setTempTime(selected);
1356
- }
1357
- }, [isOpen, selected, isClosed]);
1358
- return /* @__PURE__ */ jsx12(
1359
- Control4.Provider,
1360
- {
1361
- size,
1362
- variant,
1363
- error,
1364
- disabled,
1365
- children: /* @__PURE__ */ jsxs10(Control4.Root, { children: [
1366
- /* @__PURE__ */ jsx12(Control4.Label, { children: label }),
1367
- /* @__PURE__ */ jsx12(Pressable5, { onPress: onPressOpen, children: /* @__PURE__ */ jsxs10(Control4.Container, { children: [
1368
- /* @__PURE__ */ jsx12(
1369
- Control4.Addon,
1370
- {
1371
- icon: PrefixIcon,
1372
- Content: Prefix,
1373
- onPress: onPrefixPress
1374
- }
1375
- ),
1376
- selected === null && placeholder ? /* @__PURE__ */ jsx12(Control4.Placeholder, { children: placeholder }) : null,
1377
- selected !== null ? /* @__PURE__ */ jsx12(Control4.Value, { children: formatTimepickerValue(selected) }) : null,
1378
- /* @__PURE__ */ jsx12(
1379
- TimePickerFlyout,
1380
- {
1381
- id,
1382
- title: "Time",
1383
- open: isOpen,
1384
- value: tempTime,
1385
- clearable,
1386
- onClose: close,
1387
- onCloseFinished,
1388
- onChange: setTempTime,
1389
- onPressApply,
1390
- onPressClear,
1391
- onPressCancel: close
1392
- }
1393
- ),
1394
- /* @__PURE__ */ jsx12(
1395
- Control4.Addon,
1396
- {
1397
- icon: SuffixIcon,
1398
- Content: Suffix,
1399
- onPress: onSuffixPress
1400
- }
1401
- )
1402
- ] }) }),
1403
- /* @__PURE__ */ jsx12(Control4.Error, {})
1404
- ] })
1405
- }
1406
- );
1407
- });
1408
-
1409
- // src/components/datetime/datetime-picker.flyout.tsx
1410
- import { jsx as jsx13, jsxs as jsxs11 } from "react/jsx-runtime";
1411
- var DatetimePickerFlyout = memo13(function DateRangePickerFlyout(props) {
1412
- const {
1413
- visible,
1414
- value,
1415
- clearable,
1416
- quickDateOptions,
1417
- onPressQuickDateOption,
1418
- onChangeVisible,
1419
- onPressCalendarDay,
1420
- onChangeTime,
1421
- onPressClear,
1422
- onPressCancel,
1423
- onPressApply,
1424
- ...rest
1425
- } = props;
1426
- const tokens = useComponentsTokens8();
1427
- const datetimePickerTokens = tokens.datetimePicker.datetimePickerFlyout;
1428
- const timeValue = useMemo6(() => {
1429
- if (value) {
1430
- return {
1431
- hours: value.getHours(),
1432
- minutes: value.getMinutes(),
1433
- seconds: value.getSeconds()
1434
- };
1435
- }
1436
- return null;
1437
- }, [value]);
1438
- return /* @__PURE__ */ jsx13(Portal3, { children: /* @__PURE__ */ jsx13(Flyout3, { ...rest, children: /* @__PURE__ */ jsxs11(View8, { gap: datetimePickerTokens.gap, children: [
1439
- /* @__PURE__ */ jsx13(VisibleDateSelect, { value: visible, onChange: onChangeVisible }),
1440
- /* @__PURE__ */ jsx13(
1441
- Calendar,
1442
- {
1443
- value,
1444
- visible,
1445
- onPress: onPressCalendarDay
1446
- }
1447
- ),
1448
- /* @__PURE__ */ jsx13(
1449
- TimePicker,
1450
- {
1451
- value: timeValue,
1452
- clearable: false,
1453
- defaultValue: timeValue,
1454
- onChange: onChangeTime,
1455
- placeholder: "00:00:00"
1456
- }
1457
- ),
1458
- quickDateOptions && quickDateOptions.length > 0 ? /* @__PURE__ */ jsx13(
1459
- QuickDateOptions,
1460
- {
1461
- options: quickDateOptions,
1462
- onPress: onPressQuickDateOption
1463
- }
1464
- ) : null,
1465
- /* @__PURE__ */ jsx13(
1466
- DatetimePickerFlyoutActions,
1467
- {
1468
- canClear: Boolean(value && clearable),
1469
- onPressApply,
1470
- onPressCancel,
1471
- onPressClear
1472
- }
1473
- )
1474
- ] }) }) });
1475
- });
1476
-
1477
- // src/components/datetime/datetime-picker.tsx
1478
- import { jsx as jsx14, jsxs as jsxs12 } from "react/jsx-runtime";
1479
- var DatetimePicker = memo14(function DatetimePicker2(props) {
1480
- const {
1481
- value,
1482
- defaultValue,
1483
- clearable = true,
1484
- onChange,
1485
- placeholder,
1486
- quickDateOptions,
1487
- ...rest
1488
- } = props;
1489
- const {
1490
- id,
1491
- isOpen,
1492
- visible,
1493
- tempDate,
1494
- selected,
1495
- setVisible,
1496
- close,
1497
- onPressOpen,
1498
- onPressApply,
1499
- onPressCancel,
1500
- onPressCalendarDay,
1501
- onChangeTime,
1502
- onPressClear,
1503
- onPressQuickDateOption,
1504
- syncState
1505
- } = useDatetimePicker({ value, defaultValue, onChange });
1506
- return /* @__PURE__ */ jsxs12(DateControl, { ...rest, onPress: onPressOpen, children: [
1507
- selected === null ? /* @__PURE__ */ jsx14(Control5.Placeholder, { children: placeholder }) : null,
1508
- selected !== null ? /* @__PURE__ */ jsx14(Control5.Value, { children: selected.toLocaleString() }) : null,
1509
- /* @__PURE__ */ jsx14(
1510
- DatetimePickerFlyout,
1511
- {
1512
- id,
1513
- open: isOpen,
1514
- title: "Date",
1515
- visible,
1516
- value: tempDate,
1517
- clearable,
1518
- quickDateOptions,
1519
- onClose: close,
1520
- onCloseFinished: syncState,
1521
- onPressQuickDateOption,
1522
- onChangeVisible: setVisible,
1523
- onPressCalendarDay,
1524
- onChangeTime,
1525
- onPressApply,
1526
- onPressCancel,
1527
- onPressClear
1528
- }
1529
- )
1530
- ] });
1531
- });
1532
-
1533
- // src/components/datetime/datetime-range-picker.tsx
1534
- import { memo as memo16 } from "react";
1535
- import { Control as Control6 } from "@impulse-ui-native/primitives";
1536
-
1537
- // src/components/datetime/datetime-range-picker.flyout.tsx
1538
- import { memo as memo15, useMemo as useMemo7 } from "react";
1539
- import { Flyout as Flyout4 } from "@impulse-ui-native/flyout";
1540
- import { Portal as Portal4 } from "@impulse-ui-native/portal";
1541
- import { View as View9 } from "@impulse-ui-native/primitives";
1542
- import { useComponentsTokens as useComponentsTokens9 } from "@impulse-ui-native/theme";
1543
- import { jsx as jsx15, jsxs as jsxs13 } from "react/jsx-runtime";
1544
- var DatetimeRangePickerFlyout = memo15(
1545
- function DatetimeRangePickerFlyout2(props) {
1546
- const {
1547
- visible,
1548
- value,
1549
- clearable,
1550
- quickDateOptions,
1551
- onPressQuickDateOption,
1552
- onChangeVisible,
1553
- onPressCalendarDay,
1554
- onChangeStartTime,
1555
- onChangeEndTime,
1556
- onPressClear,
1557
- onPressCancel,
1558
- onPressApply,
1559
- ...rest
1560
- } = props;
1561
- const tokens = useComponentsTokens9();
1562
- const datetimeRangePickerTokens = tokens.datetimePicker.datetimeRangePickerFlyout;
1563
- const timeStartValue = useMemo7(() => {
1564
- if (value?.start) {
1565
- return {
1566
- hours: value.start.getHours(),
1567
- minutes: value.start.getMinutes(),
1568
- seconds: value.start.getSeconds()
1569
- };
1570
- }
1571
- return null;
1572
- }, [value?.start]);
1573
- const timeEndValue = useMemo7(() => {
1574
- if (value?.end) {
1575
- return {
1576
- hours: value.end.getHours(),
1577
- minutes: value.end.getMinutes(),
1578
- seconds: value.end.getSeconds()
1579
- };
1580
- }
1581
- return null;
1582
- }, [value?.end]);
1583
- return /* @__PURE__ */ jsx15(Portal4, { children: /* @__PURE__ */ jsx15(Flyout4, { ...rest, children: /* @__PURE__ */ jsxs13(View9, { gap: datetimeRangePickerTokens.gap, children: [
1584
- /* @__PURE__ */ jsx15(VisibleDateSelect, { value: visible, onChange: onChangeVisible }),
1585
- /* @__PURE__ */ jsx15(
1586
- Calendar,
1587
- {
1588
- value,
1589
- visible,
1590
- onPress: onPressCalendarDay
1591
- }
1592
- ),
1593
- /* @__PURE__ */ jsxs13(
1594
- View9,
1595
- {
1596
- flexDirection: "row",
1597
- gap: datetimeRangePickerTokens.timeInputsGap,
1598
- children: [
1599
- /* @__PURE__ */ jsx15(View9, { flex: 1, children: /* @__PURE__ */ jsx15(
1600
- TimePicker,
1601
- {
1602
- value: timeStartValue,
1603
- defaultValue: timeStartValue,
1604
- clearable: false,
1605
- onChange: onChangeStartTime,
1606
- label: "Start time",
1607
- placeholder: "00:00:00"
1608
- }
1609
- ) }),
1610
- /* @__PURE__ */ jsx15(View9, { flex: 1, children: /* @__PURE__ */ jsx15(
1611
- TimePicker,
1612
- {
1613
- value: timeEndValue,
1614
- defaultValue: timeEndValue,
1615
- clearable: false,
1616
- onChange: onChangeEndTime,
1617
- label: "End time",
1618
- placeholder: "00:00:00"
1619
- }
1620
- ) })
1621
- ]
1622
- }
1623
- ),
1624
- quickDateOptions && quickDateOptions.length > 0 ? /* @__PURE__ */ jsx15(
1625
- QuickDateOptions,
1626
- {
1627
- options: quickDateOptions,
1628
- onPress: onPressQuickDateOption
1629
- }
1630
- ) : null,
1631
- /* @__PURE__ */ jsx15(
1632
- DatetimePickerFlyoutActions,
1633
- {
1634
- canClear: Boolean(value && clearable),
1635
- onPressApply,
1636
- onPressCancel,
1637
- onPressClear
1638
- }
1639
- )
1640
- ] }) }) });
1641
- }
1642
- );
1643
-
1644
- // src/components/datetime/datetime-range-picker.tsx
1645
- import { jsx as jsx16, jsxs as jsxs14 } from "react/jsx-runtime";
1646
- var DatetimeRangePicker = memo16(function DatetimeRangePicker2(props) {
1647
- const {
1648
- value,
1649
- defaultValue,
1650
- clearable = true,
1651
- onChange,
1652
- placeholder,
1653
- quickDateOptions,
1654
- ...rest
1655
- } = props;
1656
- const {
1657
- id,
1658
- isOpen,
1659
- visible,
1660
- tempRange,
1661
- selected,
1662
- setVisible,
1663
- close,
1664
- onPressOpen,
1665
- onPressApply,
1666
- onPressCancel,
1667
- onPressCalendarDay,
1668
- onChangeStartTime,
1669
- onChangeEndTime,
1670
- onPressClear,
1671
- onPressQuickDateOption,
1672
- syncState
1673
- } = useDatetimeRangePicker({ value, defaultValue, onChange });
1674
- return /* @__PURE__ */ jsxs14(DateControl, { ...rest, onPress: onPressOpen, children: [
1675
- selected === null ? /* @__PURE__ */ jsx16(Control6.Placeholder, { children: placeholder }) : null,
1676
- selected !== null ? /* @__PURE__ */ jsxs14(Control6.Value, { children: [
1677
- selected.start?.toLocaleString(),
1678
- " - ",
1679
- selected.end?.toLocaleString()
1680
- ] }) : null,
1681
- /* @__PURE__ */ jsx16(
1682
- DatetimeRangePickerFlyout,
1683
- {
1684
- id,
1685
- open: isOpen,
1686
- title: "Date",
1687
- visible,
1688
- value: tempRange,
1689
- clearable,
1690
- quickDateOptions,
1691
- onClose: close,
1692
- onCloseFinished: syncState,
1693
- onPressQuickDateOption,
1694
- onChangeVisible: setVisible,
1695
- onPressCalendarDay,
1696
- onChangeStartTime,
1697
- onChangeEndTime,
1698
- onPressApply,
1699
- onPressCancel,
1700
- onPressClear
1701
- }
1702
- )
1703
- ] });
1704
- });
1705
- export {
1706
- DatePicker,
1707
- DateRangePicker,
1708
- DatetimePicker,
1709
- DatetimeRangePicker,
1710
- TimePicker,
1711
- addDays,
1712
- applyTime,
1713
- createCalendarRange,
1714
- createInfiniteRange,
1715
- endOfDay,
1716
- endOfWeek,
1717
- formatTimepickerValue,
1718
- getCalendarDayState,
1719
- getClosestIndexByValue,
1720
- getDateKey,
1721
- getDayNames,
1722
- getInfiniteRangeInitialIndex,
1723
- getInitialVisibleDate,
1724
- getMonthCalendarMatrix,
1725
- getMonthNames,
1726
- getQuickOptionKey,
1727
- getYears,
1728
- isAfterDay,
1729
- isBeforeDay,
1730
- isDateInMonth,
1731
- isDateRange,
1732
- isInRange,
1733
- isRangeEnd,
1734
- isRangeStart,
1735
- isSameDay,
1736
- isSelected,
1737
- isTimeRange,
1738
- normalizeRange,
1739
- startOfDay,
1740
- startOfWeek
1741
- };
1
+ export * from "./components";
2
+ export * from "./types";
3
+ export * from "./utils";
1742
4
  //# sourceMappingURL=index.js.map