@bigbinary/neeto-atoms 1.0.38 → 1.0.39

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 (56) hide show
  1. package/dist/DatePicker-CJfkNORC.js +634 -0
  2. package/dist/DatePicker-CJfkNORC.js.map +1 -0
  3. package/dist/{TimePicker-BzlF3JWj.js → TimePicker-D4cwQB7b.js} +11 -7
  4. package/dist/TimePicker-D4cwQB7b.js.map +1 -0
  5. package/dist/{TimePickerPanel-CgEbjExH.js → TimePickerPanel-DN5mK2he.js} +18 -7
  6. package/dist/TimePickerPanel-DN5mK2he.js.map +1 -0
  7. package/dist/cjs/DatePicker-DaVdS--q.js +636 -0
  8. package/dist/cjs/DatePicker-DaVdS--q.js.map +1 -0
  9. package/dist/cjs/{TimePicker-Cwwa1DD8.js → TimePicker-DrHKSjhU.js} +11 -7
  10. package/dist/cjs/TimePicker-DrHKSjhU.js.map +1 -0
  11. package/dist/cjs/{TimePickerPanel-CAdLD7qW.js → TimePickerPanel-Df904uM-.js} +22 -10
  12. package/dist/cjs/TimePickerPanel-Df904uM-.js.map +1 -0
  13. package/dist/cjs/components/DatePicker.js +4 -3
  14. package/dist/cjs/components/DatePicker.js.map +1 -1
  15. package/dist/cjs/components/TimePicker.js +3 -2
  16. package/dist/cjs/components/TimePicker.js.map +1 -1
  17. package/dist/cjs/components/index.js +5 -4
  18. package/dist/cjs/components/index.js.map +1 -1
  19. package/dist/cjs/index.js +11 -247
  20. package/dist/cjs/index.js.map +1 -1
  21. package/dist/cjs/primitives/Calendar.js +8129 -10
  22. package/dist/cjs/primitives/Calendar.js.map +1 -1
  23. package/dist/cjs/primitives/index.js +1 -1
  24. package/dist/components/DatePicker/constants.d.ts +0 -1
  25. package/dist/components/DatePicker/types.d.ts +7 -5
  26. package/dist/components/DatePicker/utils.d.ts +16 -5
  27. package/dist/components/DatePicker.js +4 -3
  28. package/dist/components/DatePicker.js.map +1 -1
  29. package/dist/components/TimePicker/types.d.ts +3 -3
  30. package/dist/components/TimePicker/utils.d.ts +12 -1
  31. package/dist/components/TimePicker.js +3 -2
  32. package/dist/components/TimePicker.js.map +1 -1
  33. package/dist/components/index.js +5 -4
  34. package/dist/components/index.js.map +1 -1
  35. package/dist/index.d.ts +2 -1
  36. package/dist/index.js +9 -239
  37. package/dist/index.js.map +1 -1
  38. package/dist/primitives/Calendar.js +8112 -8
  39. package/dist/primitives/Calendar.js.map +1 -1
  40. package/dist/primitives/index.js +1 -1
  41. package/dist/utils/timezone.d.ts +7 -0
  42. package/package.json +2 -1
  43. package/dist/Calendar-CjOBwDbx.js +0 -8134
  44. package/dist/Calendar-CjOBwDbx.js.map +0 -1
  45. package/dist/DatePicker-IrQUHqdL.js +0 -3233
  46. package/dist/DatePicker-IrQUHqdL.js.map +0 -1
  47. package/dist/TimePicker-BzlF3JWj.js.map +0 -1
  48. package/dist/TimePickerPanel-CgEbjExH.js.map +0 -1
  49. package/dist/cjs/Calendar-02KiUZTT.js +0 -8175
  50. package/dist/cjs/Calendar-02KiUZTT.js.map +0 -1
  51. package/dist/cjs/DatePicker-DdTclP8E.js +0 -3235
  52. package/dist/cjs/DatePicker-DdTclP8E.js.map +0 -1
  53. package/dist/cjs/TimePicker-Cwwa1DD8.js.map +0 -1
  54. package/dist/cjs/TimePickerPanel-CAdLD7qW.js.map +0 -1
  55. package/dist/utils/dayjs/index.d.ts +0 -4
  56. package/dist/utils/dayjs/timezonePlugin.d.ts +0 -3
@@ -0,0 +1,634 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { forwardRef, useId, useRef, useState, useMemo, useCallback, useEffect, useLayoutEffect } from 'react';
3
+ import { Calendar as Calendar$1 } from './primitives/Calendar.js';
4
+ import { Popover, PopoverAnchor, PopoverContent } from './primitives/Popover.js';
5
+ import { Field, FieldLabel, FieldContent, FieldError, FieldDescription } from './primitives/Field.js';
6
+ import { c as cn } from './utils-BJnb9o5c.js';
7
+ import { dayjs } from '@bigbinary/neeto-commons-frontend/utils';
8
+ import { i as isFixedWidthFormat, c as buildRangeMaskTemplate, b as buildMaskTemplate, d as dateToTimeValue, T as TimePickerPanel, a as applyMask } from './TimePickerPanel-DN5mK2he.js';
9
+ import { Button } from './primitives/Button.js';
10
+ import { c as createLucideIcon } from './createLucideIcon-C8ycilSN.js';
11
+ import { X } from './x-_o2T3n6D.js';
12
+
13
+ /**
14
+ * @license lucide-react v0.577.0 - ISC
15
+ *
16
+ * This source code is licensed under the ISC license.
17
+ * See the LICENSE file in the root directory of this source tree.
18
+ */
19
+
20
+
21
+ const __iconNode = [
22
+ ["path", { d: "M8 2v4", key: "1cmpym" }],
23
+ ["path", { d: "M16 2v4", key: "4m81vk" }],
24
+ ["rect", { width: "18", height: "18", x: "3", y: "4", rx: "2", key: "1hopcy" }],
25
+ ["path", { d: "M3 10h18", key: "8toen8" }]
26
+ ];
27
+ const Calendar = createLucideIcon("calendar", __iconNode);
28
+
29
+ const DEFAULT_DATE_FORMAT = "dd/MM/yyyy";
30
+ const DEFAULT_TIME_FORMAT = "HH:mm:ss";
31
+ const SIZE_CONFIG = {
32
+ small: { trigger: "h-7 text-xs", icon: "size-3.5" },
33
+ medium: { trigger: "h-8 text-sm", icon: "size-4" },
34
+ large: { trigger: "h-10 text-sm", icon: "size-4" }
35
+ };
36
+
37
+ const dayjsParse = dayjs;
38
+ const toNativeDate = (value) => {
39
+ if (value == null) return null;
40
+ if (value instanceof Date) return value;
41
+ if (typeof value.toDate === "function") {
42
+ return value.toDate();
43
+ }
44
+ if (typeof value === "string") {
45
+ const parsed = new Date(value);
46
+ if (!isNaN(parsed.getTime())) return parsed;
47
+ }
48
+ return null;
49
+ };
50
+ const coerceDateValue = (value, type) => {
51
+ if (value == null) return null;
52
+ if (type === "range" && Array.isArray(value)) {
53
+ return [toNativeDate(value[0]), toNativeDate(value[1])];
54
+ }
55
+ return toNativeDate(value);
56
+ };
57
+ const normalizeToDayjsFormat = (fmt) => fmt.replace(/\byyyy\b/g, "YYYY").replace(/\byy\b/g, "YY").replace(/\bdd\b/g, "DD").replace(/\bd\b/g, "D");
58
+ const normalizeToDateFnsFormat = (fmt) => fmt.replace(/YYYY/g, "yyyy").replace(/YY/g, "yy").replace(/DD/g, "dd").replace(/\bD\b/g, "d");
59
+ const formatDate = (date, formatStr) => {
60
+ if (!date) return "";
61
+ try {
62
+ return dayjs(date).format(normalizeToDayjsFormat(formatStr));
63
+ } catch {
64
+ return "";
65
+ }
66
+ };
67
+ const parseDate = (str, formatStr) => {
68
+ if (!str) return null;
69
+ const dayjsFmt = normalizeToDayjsFormat(formatStr);
70
+ const parsed = dayjsParse(str, dayjsFmt);
71
+ if (parsed.isValid()) return parsed.toDate();
72
+ const fallbackFormats = [
73
+ "DD/MM/YYYY",
74
+ "MM/DD/YYYY",
75
+ "YYYY-MM-DD",
76
+ "DD-MM-YYYY",
77
+ "DD/MM/YYYY HH:mm:ss",
78
+ "DD/MM/YYYY HH:mm"
79
+ ];
80
+ for (const fmt of fallbackFormats) {
81
+ if (fmt === dayjsFmt) continue;
82
+ const attempt = dayjsParse(str, fmt);
83
+ if (attempt.isValid()) return attempt.toDate();
84
+ }
85
+ return null;
86
+ };
87
+ const applyTimeToDate = (date, time) => {
88
+ const result = new Date(date);
89
+ result.setHours(time.hours, time.minutes, time.seconds ?? 0, 0);
90
+ return result;
91
+ };
92
+ const applyTimezone = (date) => {
93
+ const dateStr = dayjs(date).format("YYYY-MM-DD HH:mm:ss");
94
+ return dayjs(dateStr).toDate();
95
+ };
96
+ const toDayjs = (date) => dayjs(date);
97
+ const getDisplayFormat = (dateFormat, timeFormat, showTime) => {
98
+ const fmt = showTime ? `${dateFormat} ${timeFormat}` : dateFormat;
99
+ return normalizeToDateFnsFormat(fmt);
100
+ };
101
+ const isDatePartComplete = (part, maskEnabled, singleDateLen) => maskEnabled ? part.length >= singleDateLen : part.length > 0;
102
+ const parseRangeText = (text, displayFormat, maskEnabled, singleDateLen) => {
103
+ const parts = text.split(" - ");
104
+ if (parts.length !== 2) return null;
105
+ if (!isDatePartComplete(parts[0], maskEnabled, singleDateLen) || !isDatePartComplete(parts[1], maskEnabled, singleDateLen))
106
+ return null;
107
+ const from = parseDate(parts[0], displayFormat);
108
+ const to = parseDate(parts[1], displayFormat);
109
+ return from && to ? [from, to] : null;
110
+ };
111
+
112
+ const TIMEZONE_OPTIONS = [
113
+ { label: "Local", value: "" },
114
+ { label: "UTC", value: "utc" }
115
+ ];
116
+ const TimezoneSelect = ({
117
+ value,
118
+ onChange,
119
+ className
120
+ }) => /* @__PURE__ */ jsxs("div", { className: cn("flex items-center gap-1.5 text-sm", className), children: [
121
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground text-xs", children: "Timezone" }),
122
+ /* @__PURE__ */ jsx(
123
+ "select",
124
+ {
125
+ value: value ?? "",
126
+ onChange: (e) => onChange(e.target.value || void 0),
127
+ className: cn(
128
+ "rounded-md border border-input bg-background px-2 py-0.5 text-xs",
129
+ "focus:outline-none focus:ring-1 focus:ring-ring"
130
+ ),
131
+ "aria-label": "Select timezone",
132
+ children: TIMEZONE_OPTIONS.map((opt) => /* @__PURE__ */ jsx("option", { value: opt.value, children: opt.label }, opt.value))
133
+ }
134
+ )
135
+ ] });
136
+ TimezoneSelect.displayName = "TimezoneSelect";
137
+
138
+ const DatePickerFooter = ({
139
+ showTime,
140
+ needConfirm,
141
+ timezone,
142
+ onTimezoneChange,
143
+ onNow,
144
+ onOk,
145
+ className
146
+ }) => {
147
+ const showOkButton = showTime || needConfirm;
148
+ return /* @__PURE__ */ jsxs(
149
+ "div",
150
+ {
151
+ className: cn(
152
+ "flex items-center border-t border-border px-3 py-2",
153
+ className
154
+ ),
155
+ children: [
156
+ /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: onNow, className: "text-xs", children: "Now" }),
157
+ /* @__PURE__ */ jsx("div", { className: "flex-1" }),
158
+ onTimezoneChange && /* @__PURE__ */ jsx(
159
+ TimezoneSelect,
160
+ {
161
+ value: timezone,
162
+ onChange: onTimezoneChange,
163
+ className: "me-2"
164
+ }
165
+ ),
166
+ showOkButton && /* @__PURE__ */ jsx(Button, { size: "sm", onClick: onOk, className: "text-xs", children: "OK" })
167
+ ]
168
+ }
169
+ );
170
+ };
171
+ DatePickerFooter.displayName = "DatePickerFooter";
172
+
173
+ const DatePicker = forwardRef(
174
+ ({
175
+ value,
176
+ defaultValue,
177
+ onChange,
178
+ type = "date",
179
+ dateFormat = DEFAULT_DATE_FORMAT,
180
+ timeFormat = DEFAULT_TIME_FORMAT,
181
+ showTime = false,
182
+ timePickerFormat = "24",
183
+ showSeconds = false,
184
+ minDate,
185
+ maxDate,
186
+ placeholder,
187
+ label,
188
+ error,
189
+ helpText,
190
+ size = "medium",
191
+ disabled = false,
192
+ allowClear = true,
193
+ required = false,
194
+ timezone,
195
+ onTimezoneChange,
196
+ onOk,
197
+ needConfirm = false,
198
+ onOpenChange,
199
+ className,
200
+ labelProps
201
+ }, ref) => {
202
+ const generatedId = useId();
203
+ const errorId = `error_${generatedId}`;
204
+ const helpTextId = `helpText_${generatedId}`;
205
+ const containerRef = useRef(null);
206
+ const inputRef = useRef(null);
207
+ const cursorPosRef = useRef(null);
208
+ const popoverContentId = useRef(
209
+ `datepicker-popover-${generatedId}`
210
+ ).current;
211
+ const [open, setOpen] = useState(false);
212
+ const [internalValue, setInternalValue] = useState(coerceDateValue(defaultValue, type) ?? null);
213
+ const currentValue = value !== void 0 ? coerceDateValue(value, type) : internalValue;
214
+ const [calendarMonth, setCalendarMonth] = useState(
215
+ (type === "date" ? value ?? defaultValue : null) ?? /* @__PURE__ */ new Date()
216
+ );
217
+ const [rangeSelectionStep, setRangeSelectionStep] = useState(
218
+ "from"
219
+ );
220
+ const [pendingDate, setPendingDate] = useState(null);
221
+ const [pendingTime, setPendingTime] = useState({
222
+ hours: 0,
223
+ minutes: 0,
224
+ seconds: 0
225
+ });
226
+ const displayFormat = getDisplayFormat(dateFormat, timeFormat, showTime);
227
+ const sizeConfig = SIZE_CONFIG[size];
228
+ const maskEnabled = isFixedWidthFormat(displayFormat);
229
+ const maskTemplate = useMemo(
230
+ () => maskEnabled ? type === "range" ? buildRangeMaskTemplate(displayFormat) : buildMaskTemplate(displayFormat) : null,
231
+ [displayFormat, type, maskEnabled]
232
+ );
233
+ const singlePlaceholder = showTime ? `${dateFormat.toUpperCase()} ${timeFormat}` : dateFormat.toUpperCase();
234
+ const defaultPlaceholder = type === "range" ? `${singlePlaceholder} - ${singlePlaceholder}` : singlePlaceholder;
235
+ const getDisplayText = useCallback(() => {
236
+ if (type === "range") {
237
+ const rangeValue = currentValue;
238
+ if (!rangeValue || !rangeValue[0] && !rangeValue[1]) return "";
239
+ const from = rangeValue[0] ? formatDate(rangeValue[0], displayFormat) : "";
240
+ const to = rangeValue[1] ? formatDate(rangeValue[1], displayFormat) : "";
241
+ return `${from} - ${to}`;
242
+ }
243
+ return formatDate(currentValue, displayFormat);
244
+ }, [currentValue, displayFormat, type]);
245
+ const [inputText, setInputText] = useState(() => getDisplayText());
246
+ useEffect(() => {
247
+ if (!open) setInputText(getDisplayText());
248
+ }, [getDisplayText, open]);
249
+ const closePopover = useCallback(() => {
250
+ setOpen(false);
251
+ onOpenChange?.(false);
252
+ setInputText(getDisplayText());
253
+ }, [onOpenChange, getDisplayText]);
254
+ const openPopover = useCallback(() => {
255
+ setOpen(true);
256
+ onOpenChange?.(true);
257
+ setRangeSelectionStep("from");
258
+ const dateVal = type === "date" ? currentValue : null;
259
+ if (dateVal) {
260
+ setCalendarMonth(dateVal);
261
+ setPendingDate(dateVal);
262
+ setPendingTime(dateToTimeValue(dateVal));
263
+ } else {
264
+ setPendingDate(null);
265
+ setPendingTime({ hours: 0, minutes: 0, seconds: 0 });
266
+ }
267
+ }, [type, currentValue, onOpenChange]);
268
+ useEffect(() => {
269
+ if (!open) return;
270
+ const handlePointerDown = (e) => {
271
+ const target = e.target;
272
+ if (containerRef.current?.contains(target)) return;
273
+ const popoverEl = document.getElementById(popoverContentId);
274
+ if (popoverEl?.contains(target)) return;
275
+ closePopover();
276
+ };
277
+ document.addEventListener("pointerdown", handlePointerDown);
278
+ return () => document.removeEventListener("pointerdown", handlePointerDown);
279
+ }, [open, closePopover]);
280
+ const commitValue = (date) => {
281
+ if (date === null) {
282
+ setInternalValue(null);
283
+ onChange?.(null, "");
284
+ setInputText("");
285
+ return;
286
+ }
287
+ if (Array.isArray(date)) {
288
+ const converted2 = [
289
+ applyTimezone(date[0]),
290
+ applyTimezone(date[1])
291
+ ];
292
+ setInternalValue(converted2);
293
+ const formatted2 = [
294
+ formatDate(converted2[0], displayFormat),
295
+ formatDate(converted2[1], displayFormat)
296
+ ];
297
+ onChange?.([toDayjs(converted2[0]), toDayjs(converted2[1])], formatted2);
298
+ setInputText(`${formatted2[0]} - ${formatted2[1]}`);
299
+ return;
300
+ }
301
+ const converted = applyTimezone(date);
302
+ setInternalValue(converted);
303
+ const formatted = formatDate(converted, displayFormat);
304
+ onChange?.(toDayjs(converted), formatted);
305
+ setInputText(formatted);
306
+ };
307
+ const handleDateSelect = (selected) => {
308
+ if (!selected) return;
309
+ setCalendarMonth(selected);
310
+ if (showTime || needConfirm) {
311
+ setPendingDate(selected);
312
+ } else {
313
+ commitValue(selected);
314
+ setOpen(false);
315
+ onOpenChange?.(false);
316
+ }
317
+ };
318
+ const handleRangeSelect = (range) => {
319
+ if (!range) return;
320
+ const from = range.from ?? null;
321
+ const to = range.to ?? null;
322
+ if (rangeSelectionStep === "from") {
323
+ setInternalValue([from, null]);
324
+ setRangeSelectionStep("to");
325
+ } else {
326
+ if (from && to) {
327
+ if (showTime || needConfirm) {
328
+ setPendingDate(from);
329
+ } else {
330
+ commitValue([from, to]);
331
+ setOpen(false);
332
+ onOpenChange?.(false);
333
+ }
334
+ } else if (from) {
335
+ setInternalValue([from, null]);
336
+ }
337
+ setRangeSelectionStep("from");
338
+ }
339
+ };
340
+ const handleTimeChange = (time) => {
341
+ setPendingTime(time);
342
+ };
343
+ const handleNow = () => {
344
+ const now = /* @__PURE__ */ new Date();
345
+ if (showTime || needConfirm) {
346
+ setPendingDate(now);
347
+ setPendingTime(dateToTimeValue(now));
348
+ } else {
349
+ commitValue(now);
350
+ setOpen(false);
351
+ onOpenChange?.(false);
352
+ }
353
+ };
354
+ const handleOk = () => {
355
+ if (pendingDate) {
356
+ const finalDate = showTime ? applyTimeToDate(pendingDate, pendingTime) : pendingDate;
357
+ commitValue(finalDate);
358
+ onOk?.(finalDate);
359
+ }
360
+ setOpen(false);
361
+ onOpenChange?.(false);
362
+ };
363
+ const handleClear = (e) => {
364
+ e.stopPropagation();
365
+ e.preventDefault();
366
+ commitValue(null);
367
+ };
368
+ useLayoutEffect(() => {
369
+ if (cursorPosRef.current !== null && inputRef.current && document.activeElement === inputRef.current) {
370
+ inputRef.current.setSelectionRange(
371
+ cursorPosRef.current,
372
+ cursorPosRef.current
373
+ );
374
+ cursorPosRef.current = null;
375
+ }
376
+ });
377
+ const singleDateLen = useMemo(
378
+ () => buildMaskTemplate(displayFormat).pattern.length,
379
+ [displayFormat]
380
+ );
381
+ const parseAndApplyRange = (text) => {
382
+ const parts = text.split(" - ");
383
+ if (!isDatePartComplete(parts[0] ?? "", maskEnabled, singleDateLen))
384
+ return;
385
+ const from = parseDate(parts[0], displayFormat);
386
+ if (from) setCalendarMonth(from);
387
+ const range = parseRangeText(
388
+ text,
389
+ displayFormat,
390
+ maskEnabled,
391
+ singleDateLen
392
+ );
393
+ if (range) commitValue(range);
394
+ };
395
+ const handleInputChange = (e) => {
396
+ let text = e.target.value;
397
+ if (maskTemplate) {
398
+ const masked = applyMask(
399
+ text,
400
+ maskTemplate,
401
+ inputText,
402
+ e.target.selectionStart
403
+ );
404
+ text = masked.text;
405
+ cursorPosRef.current = masked.cursorPosition;
406
+ }
407
+ setInputText(text);
408
+ if (type === "range") {
409
+ parseAndApplyRange(text);
410
+ return;
411
+ }
412
+ const isComplete = maskTemplate ? text.length >= maskTemplate.pattern.length : true;
413
+ if (!isComplete) return;
414
+ const parsed = parseDate(text, displayFormat);
415
+ if (!parsed) return;
416
+ setCalendarMonth(parsed);
417
+ if (showTime || needConfirm) {
418
+ setPendingDate(parsed);
419
+ setPendingTime(dateToTimeValue(parsed));
420
+ } else {
421
+ commitValue(parsed);
422
+ }
423
+ };
424
+ const handleInputKeyDown = (e) => {
425
+ if (e.key === "Escape") return closePopover();
426
+ if (e.key !== "Enter") return;
427
+ if (type === "range") {
428
+ const range = parseRangeText(
429
+ inputText,
430
+ displayFormat,
431
+ maskEnabled,
432
+ singleDateLen
433
+ );
434
+ if (range) commitValue(range);
435
+ } else {
436
+ const parsed = parseDate(inputText, displayFormat);
437
+ if (parsed) commitValue(parsed);
438
+ }
439
+ setOpen(false);
440
+ onOpenChange?.(false);
441
+ };
442
+ const handleInputFocus = () => {
443
+ if (!open) openPopover();
444
+ };
445
+ const hasField = !!(label || error || helpText);
446
+ const showFooter = showTime || needConfirm || !!onTimezoneChange;
447
+ const todayDayjs = dayjs(/* @__PURE__ */ new Date());
448
+ const todayDate = new Date(
449
+ todayDayjs.year(),
450
+ todayDayjs.month(),
451
+ todayDayjs.date()
452
+ );
453
+ const ariaDescribedBy = [error ? errorId : null, helpText ? helpTextId : null].filter(Boolean).join(" ") || void 0;
454
+ const calendarDisabled = useCallback(
455
+ (date) => {
456
+ if (minDate && date < new Date(minDate.setHours(0, 0, 0, 0)))
457
+ return true;
458
+ if (maxDate && date > new Date(maxDate.setHours(23, 59, 59, 999)))
459
+ return true;
460
+ return false;
461
+ },
462
+ [minDate, maxDate]
463
+ );
464
+ const calendarSelected = useCallback(() => {
465
+ if (showTime || needConfirm) return pendingDate ?? void 0;
466
+ return currentValue ?? void 0;
467
+ }, [showTime, needConfirm, pendingDate, currentValue]);
468
+ const triggerContent = /* @__PURE__ */ jsxs(Popover, { open, children: [
469
+ /* @__PURE__ */ jsx(PopoverAnchor, { asChild: true, children: /* @__PURE__ */ jsxs(
470
+ "div",
471
+ {
472
+ ref: containerRef,
473
+ className: cn(
474
+ "relative flex w-full items-center gap-2 rounded-md border border-input bg-background pe-8 ps-3",
475
+ "focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2",
476
+ disabled && "cursor-not-allowed opacity-50",
477
+ !!error && "border-destructive ring-destructive/20 ring-3",
478
+ sizeConfig.trigger,
479
+ !hasField && className
480
+ ),
481
+ children: [
482
+ /* @__PURE__ */ jsx(
483
+ Calendar,
484
+ {
485
+ className: cn("shrink-0 text-muted-foreground", sizeConfig.icon)
486
+ }
487
+ ),
488
+ /* @__PURE__ */ jsx(
489
+ "input",
490
+ {
491
+ ref: inputRef,
492
+ type: "text",
493
+ disabled,
494
+ "aria-label": label || "Pick a date",
495
+ "aria-describedby": ariaDescribedBy,
496
+ "aria-invalid": !!error || void 0,
497
+ placeholder: placeholder ?? defaultPlaceholder,
498
+ value: inputText,
499
+ onChange: handleInputChange,
500
+ onKeyDown: handleInputKeyDown,
501
+ onFocus: handleInputFocus,
502
+ className: cn(
503
+ "min-w-0 flex-1 bg-transparent outline-none placeholder:text-muted-foreground",
504
+ "disabled:cursor-not-allowed",
505
+ sizeConfig.trigger.split(" ").find((c) => c.startsWith("text-"))
506
+ )
507
+ }
508
+ ),
509
+ timezone && /* @__PURE__ */ jsx("span", { className: "shrink-0 rounded bg-muted px-1.5 py-0.5 text-xs text-muted-foreground", children: timezone.toUpperCase() }),
510
+ allowClear && /* @__PURE__ */ jsx(
511
+ "button",
512
+ {
513
+ type: "button",
514
+ onPointerDown: (e) => e.preventDefault(),
515
+ onClick: handleClear,
516
+ className: cn(
517
+ "absolute inset-y-0 end-2 flex items-center text-muted-foreground hover:text-foreground focus:outline-none",
518
+ !(inputText && !disabled) && "invisible"
519
+ ),
520
+ "aria-label": "Clear date",
521
+ tabIndex: -1,
522
+ children: /* @__PURE__ */ jsx(X, { className: sizeConfig.icon })
523
+ }
524
+ )
525
+ ]
526
+ }
527
+ ) }),
528
+ open && /* @__PURE__ */ jsxs(
529
+ PopoverContent,
530
+ {
531
+ id: popoverContentId,
532
+ className: "w-auto p-0",
533
+ align: "start",
534
+ onOpenAutoFocus: (e) => e.preventDefault(),
535
+ onCloseAutoFocus: (e) => e.preventDefault(),
536
+ onPointerDownOutside: (e) => e.preventDefault(),
537
+ onInteractOutside: (e) => e.preventDefault(),
538
+ children: [
539
+ /* @__PURE__ */ jsxs("div", { className: cn("flex", showTime && "flex-row"), children: [
540
+ type === "date" ? /* @__PURE__ */ jsx(
541
+ Calendar$1,
542
+ {
543
+ mode: "single",
544
+ captionLayout: "dropdown",
545
+ today: todayDate,
546
+ month: calendarMonth,
547
+ onMonthChange: setCalendarMonth,
548
+ selected: calendarSelected(),
549
+ onSelect: handleDateSelect,
550
+ disabled: calendarDisabled,
551
+ ...minDate && { fromDate: minDate },
552
+ ...maxDate && { toDate: maxDate }
553
+ }
554
+ ) : /* @__PURE__ */ jsx(
555
+ Calendar$1,
556
+ {
557
+ mode: "range",
558
+ numberOfMonths: 2,
559
+ captionLayout: "dropdown",
560
+ today: todayDate,
561
+ className: "[&_[data-outside][data-selected=true]]:!bg-transparent [&_[data-outside][data-selected=true]]:after:!bg-transparent [&_[data-outside]_button]:!bg-transparent [&_[data-outside]_button]:!text-muted-foreground",
562
+ month: calendarMonth,
563
+ onMonthChange: setCalendarMonth,
564
+ selected: currentValue ? {
565
+ from: currentValue[0] ?? void 0,
566
+ to: currentValue[1] ?? void 0
567
+ } : void 0,
568
+ onSelect: handleRangeSelect,
569
+ disabled: calendarDisabled,
570
+ ...minDate && { fromDate: minDate },
571
+ ...maxDate && { toDate: maxDate }
572
+ }
573
+ ),
574
+ showTime && /* @__PURE__ */ jsx("div", { className: "border-inline-start border-border", children: /* @__PURE__ */ jsx(
575
+ TimePickerPanel,
576
+ {
577
+ value: pendingTime,
578
+ onChange: handleTimeChange,
579
+ format: timePickerFormat,
580
+ showSeconds,
581
+ disabled
582
+ }
583
+ ) })
584
+ ] }),
585
+ showFooter && /* @__PURE__ */ jsx(
586
+ DatePickerFooter,
587
+ {
588
+ showTime,
589
+ needConfirm,
590
+ timezone,
591
+ onTimezoneChange,
592
+ onNow: handleNow,
593
+ onOk: handleOk
594
+ }
595
+ )
596
+ ]
597
+ }
598
+ )
599
+ ] });
600
+ if (!hasField) {
601
+ return /* @__PURE__ */ jsx("div", { ref, className, children: triggerContent });
602
+ }
603
+ return /* @__PURE__ */ jsxs(
604
+ Field,
605
+ {
606
+ ref,
607
+ "data-disabled": disabled || void 0,
608
+ "data-invalid": !!error || void 0,
609
+ className,
610
+ children: [
611
+ label && /* @__PURE__ */ jsxs(
612
+ FieldLabel,
613
+ {
614
+ ...labelProps,
615
+ children: [
616
+ label,
617
+ required && /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "text-destructive", children: "*" })
618
+ ]
619
+ }
620
+ ),
621
+ /* @__PURE__ */ jsxs(FieldContent, { children: [
622
+ triggerContent,
623
+ !!error && /* @__PURE__ */ jsx(FieldError, { id: errorId, children: error }),
624
+ helpText && /* @__PURE__ */ jsx(FieldDescription, { id: helpTextId, children: helpText })
625
+ ] })
626
+ ]
627
+ }
628
+ );
629
+ }
630
+ );
631
+ DatePicker.displayName = "DatePicker";
632
+
633
+ export { DatePicker as D };
634
+ //# sourceMappingURL=DatePicker-CJfkNORC.js.map