@bigbinary/neeto-atoms 1.0.57 → 1.0.58

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.
@@ -11,6 +11,8 @@ var pureDayjs = require('dayjs');
11
11
  var customParseFormat = require('dayjs/plugin/customParseFormat');
12
12
  var utils = require('@bigbinary/neeto-commons-frontend/utils');
13
13
  var primitives_Button = require('./primitives/Button.js');
14
+ var chevronLeft = require('./chevron-left-BldoOh5p.js');
15
+ var chevronRight = require('./chevron-right-0jNdwX2Q.js');
14
16
  var createLucideIcon = require('./createLucideIcon-D0tRgV6l.js');
15
17
  var x = require('./x-Brw3FJst.js');
16
18
 
@@ -149,6 +151,43 @@ const parseRangeText = (text, displayFormat, maskEnabled, singleDateLen) => {
149
151
  const to = parseDate(parts[1], displayFormat);
150
152
  return from && to ? [from, to] : null;
151
153
  };
154
+ const startOfWeek = (date, weekStartsOn = 0) => {
155
+ const d = new Date(date);
156
+ const diff = (d.getDay() - weekStartsOn + 7) % 7;
157
+ d.setDate(d.getDate() - diff);
158
+ d.setHours(0, 0, 0, 0);
159
+ return d;
160
+ };
161
+ const weekDaysFrom = (start) => Array.from({ length: 7 }, (_, i) => {
162
+ const d = new Date(start);
163
+ d.setDate(start.getDate() + i);
164
+ return d;
165
+ });
166
+ const isMonthDisabled = (monthDate, minDate, maxDate) => {
167
+ const monthStart = new Date(monthDate.getFullYear(), monthDate.getMonth(), 1);
168
+ const monthEnd = new Date(
169
+ monthDate.getFullYear(),
170
+ monthDate.getMonth() + 1,
171
+ 0,
172
+ 23,
173
+ 59,
174
+ 59,
175
+ 999
176
+ );
177
+ if (maxDate && monthStart > maxDate) return true;
178
+ if (minDate && monthEnd < minDate) return true;
179
+ return false;
180
+ };
181
+ const isYearDisabled = (yearDate, minDate, maxDate) => {
182
+ const yearStart = new Date(yearDate.getFullYear(), 0, 1);
183
+ const yearEnd = new Date(yearDate.getFullYear(), 11, 31, 23, 59, 59, 999);
184
+ if (maxDate && yearStart > maxDate) return true;
185
+ if (minDate && yearEnd < minDate) return true;
186
+ return false;
187
+ };
188
+ const buildMonth = (year, month) => new Date(year, month, 1);
189
+ const isSameMonth = (a, b) => !!a && a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth();
190
+ const decadeStartFor = (year) => Math.floor(year / 10) * 10;
152
191
 
153
192
  const TIMEZONE_OPTIONS = [
154
193
  { label: "Local", value: "" },
@@ -211,6 +250,130 @@ const DatePickerFooter = ({
211
250
  };
212
251
  DatePickerFooter.displayName = "DatePickerFooter";
213
252
 
253
+ const MonthPicker = ({
254
+ value,
255
+ displayedYear,
256
+ onYearChange,
257
+ onSelect,
258
+ isDisabled,
259
+ locale
260
+ }) => {
261
+ const months = Array.from(
262
+ { length: 12 },
263
+ (_, m) => buildMonth(displayedYear, m)
264
+ );
265
+ const monthName = (date) => date.toLocaleString(locale, { month: "short" });
266
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-background flex w-[16rem] flex-col gap-3 p-2", children: [
267
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
268
+ /* @__PURE__ */ jsxRuntime.jsx(
269
+ primitives_Button.Button,
270
+ {
271
+ "aria-label": "Previous year",
272
+ size: "icon",
273
+ variant: "ghost",
274
+ onClick: () => onYearChange(displayedYear - 1),
275
+ children: /* @__PURE__ */ jsxRuntime.jsx(chevronLeft.ChevronLeft, { className: "size-4 rtl:rotate-180" })
276
+ }
277
+ ),
278
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-medium", children: displayedYear }),
279
+ /* @__PURE__ */ jsxRuntime.jsx(
280
+ primitives_Button.Button,
281
+ {
282
+ "aria-label": "Next year",
283
+ size: "icon",
284
+ variant: "ghost",
285
+ onClick: () => onYearChange(displayedYear + 1),
286
+ children: /* @__PURE__ */ jsxRuntime.jsx(chevronRight.ChevronRight, { className: "size-4 rtl:rotate-180" })
287
+ }
288
+ )
289
+ ] }),
290
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-3 gap-2", children: months.map((monthDate) => {
291
+ const disabled = isDisabled?.(monthDate) ?? false;
292
+ const selected = isSameMonth(value, monthDate);
293
+ return /* @__PURE__ */ jsxRuntime.jsx(
294
+ "button",
295
+ {
296
+ "aria-pressed": selected,
297
+ className: utils$1.cn(
298
+ "rounded-md py-2 text-sm transition-colors",
299
+ "hover:bg-muted disabled:cursor-not-allowed disabled:opacity-50",
300
+ selected && "bg-primary text-primary-foreground hover:bg-primary"
301
+ ),
302
+ disabled,
303
+ type: "button",
304
+ onClick: () => onSelect(monthDate),
305
+ children: monthName(monthDate)
306
+ },
307
+ monthDate.getMonth()
308
+ );
309
+ }) })
310
+ ] });
311
+ };
312
+
313
+ const YearPicker = ({
314
+ value,
315
+ displayedYear,
316
+ onYearChange,
317
+ onSelect,
318
+ isDisabled
319
+ }) => {
320
+ const decadeStart = decadeStartFor(displayedYear);
321
+ const years = Array.from({ length: 12 }, (_, i) => decadeStart - 1 + i);
322
+ const selectedYear = value?.getFullYear();
323
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-background flex w-[16rem] flex-col gap-3 p-2", children: [
324
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
325
+ /* @__PURE__ */ jsxRuntime.jsx(
326
+ primitives_Button.Button,
327
+ {
328
+ "aria-label": "Previous decade",
329
+ size: "icon",
330
+ variant: "ghost",
331
+ onClick: () => onYearChange(decadeStart - 10),
332
+ children: /* @__PURE__ */ jsxRuntime.jsx(chevronLeft.ChevronLeft, { className: "size-4 rtl:rotate-180" })
333
+ }
334
+ ),
335
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm font-medium", children: [
336
+ decadeStart,
337
+ "-",
338
+ decadeStart + 9
339
+ ] }),
340
+ /* @__PURE__ */ jsxRuntime.jsx(
341
+ primitives_Button.Button,
342
+ {
343
+ "aria-label": "Next decade",
344
+ size: "icon",
345
+ variant: "ghost",
346
+ onClick: () => onYearChange(decadeStart + 10),
347
+ children: /* @__PURE__ */ jsxRuntime.jsx(chevronRight.ChevronRight, { className: "size-4 rtl:rotate-180" })
348
+ }
349
+ )
350
+ ] }),
351
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-3 gap-2", children: years.map((year) => {
352
+ const yearDate = new Date(year, 0, 1);
353
+ const disabled = isDisabled?.(yearDate) ?? false;
354
+ const selected = selectedYear === year;
355
+ const outsideDecade = year < decadeStart || year > decadeStart + 9;
356
+ return /* @__PURE__ */ jsxRuntime.jsx(
357
+ "button",
358
+ {
359
+ "aria-pressed": selected,
360
+ className: utils$1.cn(
361
+ "rounded-md py-2 text-sm transition-colors",
362
+ "hover:bg-muted disabled:cursor-not-allowed disabled:opacity-50",
363
+ outsideDecade && "text-muted-foreground",
364
+ selected && "bg-primary text-primary-foreground hover:bg-primary"
365
+ ),
366
+ disabled,
367
+ type: "button",
368
+ onClick: () => onSelect(yearDate),
369
+ children: year
370
+ },
371
+ year
372
+ );
373
+ }) })
374
+ ] });
375
+ };
376
+
214
377
  const DatePicker = React.forwardRef(
215
378
  ({
216
379
  value,
@@ -225,6 +388,7 @@ const DatePicker = React.forwardRef(
225
388
  showSeconds = false,
226
389
  minDate,
227
390
  maxDate,
391
+ disabledDate,
228
392
  placeholder,
229
393
  label,
230
394
  error,
@@ -240,7 +404,12 @@ const DatePicker = React.forwardRef(
240
404
  open: openProp,
241
405
  onOpenChange,
242
406
  className,
243
- labelProps
407
+ labelProps,
408
+ picker = "date",
409
+ side = "bottom",
410
+ align = "start",
411
+ trigger,
412
+ weekStartsOn = 0
244
413
  }, ref) => {
245
414
  const generatedId = React.useId();
246
415
  const errorId = `error_${generatedId}`;
@@ -283,13 +452,14 @@ const DatePicker = React.forwardRef(
283
452
  );
284
453
  const calendarDisabled = React.useCallback(
285
454
  (date) => {
286
- if (minDate && date < new Date(minDate.setHours(0, 0, 0, 0)))
455
+ if (disabledDate?.(date)) return true;
456
+ if (minDate && date < new Date(new Date(minDate).setHours(0, 0, 0, 0)))
287
457
  return true;
288
- if (maxDate && date > new Date(maxDate.setHours(23, 59, 59, 999)))
458
+ if (maxDate && date > new Date(new Date(maxDate).setHours(23, 59, 59, 999)))
289
459
  return true;
290
460
  return false;
291
461
  },
292
- [minDate, maxDate]
462
+ [minDate, maxDate, disabledDate]
293
463
  );
294
464
  const getDisplayText = React.useCallback(() => {
295
465
  if (type !== "range") {
@@ -507,16 +677,49 @@ const DatePicker = React.forwardRef(
507
677
  if (!open) setInputText(getDisplayText());
508
678
  }, [getDisplayText, open]);
509
679
  TimePickerPanel.useCursorRestore([{ inputRef, cursorRef: cursorPosRef }]);
680
+ React.useEffect(() => {
681
+ if (!open || type !== "date") return;
682
+ const dateVal = currentValue;
683
+ if (dateVal instanceof Date) setCalendarMonth(dateVal);
684
+ }, [open]);
510
685
  const hasField = !!(label || error || helpText);
511
686
  const showFooter = showTime || needConfirm || !!onTimezoneChange;
512
687
  const todayDate = toBrowserLocalDate(/* @__PURE__ */ new Date());
688
+ const handleGridPickerSelect = (date) => {
689
+ commitValue(date);
690
+ setOpen(false);
691
+ };
692
+ const handleSingleDateSelectWithPicker = (selected) => {
693
+ if (!selected) return handleDateSelect(void 0);
694
+ handleDateSelect(
695
+ picker === "week" ? startOfWeek(selected, weekStartsOn) : selected
696
+ );
697
+ };
698
+ const weekHighlightProps = (() => {
699
+ if (picker !== "week" || type !== "date" || !currentValue) return {};
700
+ const weekStart = startOfWeek(currentValue, weekStartsOn);
701
+ const weekDays = weekDaysFrom(weekStart);
702
+ return {
703
+ modifiers: {
704
+ weekStart: [weekDays[0]],
705
+ weekMiddle: weekDays.slice(1, 6),
706
+ weekEnd: [weekDays[6]]
707
+ },
708
+ modifiersClassNames: {
709
+ weekStart: "!bg-primary !text-primary-foreground !rounded-e-none hover:!bg-primary",
710
+ weekMiddle: "!bg-primary !text-primary-foreground !rounded-none hover:!bg-primary",
711
+ weekEnd: "!bg-primary !text-primary-foreground !rounded-s-none hover:!bg-primary"
712
+ }
713
+ };
714
+ })();
715
+ const weekRowHoverClassName = picker === "week" ? "[&_button]:!transition-none [&:hover_button]:!bg-primary [&:hover_button]:!text-primary-foreground [&:hover_button]:!rounded-none [&:hover_button]:cursor-pointer" : void 0;
513
716
  const ariaDescribedBy = [error ? errorId : null, helpText ? helpTextId : null].filter(Boolean).join(" ") || void 0;
514
717
  const calendarSelected = () => {
515
718
  if (showTime || needConfirm) return pendingDate ?? void 0;
516
719
  return currentValue ?? void 0;
517
720
  };
518
- const triggerContent = /* @__PURE__ */ jsxRuntime.jsxs(primitives_Popover.Popover, { open, children: [
519
- /* @__PURE__ */ jsxRuntime.jsx(primitives_Popover.PopoverAnchor, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
721
+ const triggerContent = /* @__PURE__ */ jsxRuntime.jsxs(primitives_Popover.Popover, { open, onOpenChange: trigger ? setOpen : void 0, children: [
722
+ trigger ? /* @__PURE__ */ jsxRuntime.jsx(primitives_Popover.PopoverTrigger, { asChild: true, children: trigger }) : /* @__PURE__ */ jsxRuntime.jsx(primitives_Popover.PopoverAnchor, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
520
723
  "div",
521
724
  {
522
725
  ref: containerRef,
@@ -532,7 +735,10 @@ const DatePicker = React.forwardRef(
532
735
  /* @__PURE__ */ jsxRuntime.jsx(
533
736
  Calendar,
534
737
  {
535
- className: utils$1.cn("shrink-0 text-muted-foreground", sizeConfig.icon)
738
+ className: utils$1.cn(
739
+ "shrink-0 text-muted-foreground",
740
+ sizeConfig.icon
741
+ )
536
742
  }
537
743
  ),
538
744
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -583,14 +789,35 @@ const DatePicker = React.forwardRef(
583
789
  {
584
790
  id: popoverContentId,
585
791
  className: "w-auto p-0",
586
- align: "start",
792
+ align,
793
+ side,
587
794
  onOpenAutoFocus: (e) => e.preventDefault(),
588
795
  onCloseAutoFocus: (e) => e.preventDefault(),
589
796
  onPointerDownOutside: (e) => e.preventDefault(),
590
797
  onInteractOutside: (e) => e.preventDefault(),
591
798
  children: [
592
799
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: utils$1.cn("flex", showTime && "flex-row"), children: [
593
- type === "date" ? /* @__PURE__ */ jsxRuntime.jsx(
800
+ type === "date" && picker === "month" ? /* @__PURE__ */ jsxRuntime.jsx(
801
+ MonthPicker,
802
+ {
803
+ value: currentValue ?? null,
804
+ displayedYear: calendarMonth.getFullYear(),
805
+ onYearChange: (year) => setCalendarMonth(
806
+ new Date(year, calendarMonth.getMonth(), 1)
807
+ ),
808
+ onSelect: handleGridPickerSelect,
809
+ isDisabled: (date) => isMonthDisabled(date, minDate, maxDate)
810
+ }
811
+ ) : type === "date" && picker === "year" ? /* @__PURE__ */ jsxRuntime.jsx(
812
+ YearPicker,
813
+ {
814
+ value: currentValue ?? null,
815
+ displayedYear: calendarMonth.getFullYear(),
816
+ onYearChange: (year) => setCalendarMonth(new Date(year, 0, 1)),
817
+ onSelect: handleGridPickerSelect,
818
+ isDisabled: (date) => isYearDisabled(date, minDate, maxDate)
819
+ }
820
+ ) : type === "date" ? /* @__PURE__ */ jsxRuntime.jsx(
594
821
  primitives_Calendar.Calendar,
595
822
  {
596
823
  mode: "single",
@@ -599,8 +826,11 @@ const DatePicker = React.forwardRef(
599
826
  month: calendarMonth,
600
827
  onMonthChange: setCalendarMonth,
601
828
  selected: calendarSelected(),
602
- onSelect: handleDateSelect,
829
+ onSelect: handleSingleDateSelectWithPicker,
603
830
  disabled: calendarDisabled,
831
+ weekStartsOn,
832
+ classNames: weekRowHoverClassName ? { week: utils$1.cn("mt-2 flex w-full", weekRowHoverClassName) } : void 0,
833
+ ...weekHighlightProps,
604
834
  ...minDate && { fromDate: minDate },
605
835
  ...maxDate && { toDate: maxDate }
606
836
  }
@@ -611,6 +841,7 @@ const DatePicker = React.forwardRef(
611
841
  numberOfMonths: 2,
612
842
  captionLayout: "dropdown",
613
843
  today: todayDate,
844
+ weekStartsOn,
614
845
  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",
615
846
  month: calendarMonth,
616
847
  onMonthChange: setCalendarMonth,
@@ -684,4 +915,4 @@ const DatePicker = React.forwardRef(
684
915
  DatePicker.displayName = "DatePicker";
685
916
 
686
917
  exports.DatePicker = DatePicker;
687
- //# sourceMappingURL=DatePicker-Bg2LywGY.js.map
918
+ //# sourceMappingURL=DatePicker-BZd4rM2R.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatePicker-BZd4rM2R.js","sources":["../../node_modules/lucide-react/dist/esm/icons/calendar.js","../../src/components/DatePicker/constants.ts","../../src/components/DatePicker/utils.ts","../../src/components/DatePicker/TimezoneSelect.tsx","../../src/components/DatePicker/DatePickerFooter.tsx","../../src/components/DatePicker/MonthPicker.tsx","../../src/components/DatePicker/YearPicker.tsx","../../src/components/DatePicker/DatePicker.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M8 2v4\", key: \"1cmpym\" }],\n [\"path\", { d: \"M16 2v4\", key: \"4m81vk\" }],\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"4\", rx: \"2\", key: \"1hopcy\" }],\n [\"path\", { d: \"M3 10h18\", key: \"8toen8\" }]\n];\nconst Calendar = createLucideIcon(\"calendar\", __iconNode);\n\nexport { __iconNode, Calendar as default };\n//# sourceMappingURL=calendar.js.map\n","import type { TimeValue } from \"../TimePicker/types\";\n\nexport const DEFAULT_DATE_FORMAT = \"dd/MM/yyyy\";\nexport const DEFAULT_TIME_FORMAT = \"HH:mm:ss\";\n\nexport const INITIAL_TIME_VALUE: TimeValue = {\n hours: 0,\n minutes: 0,\n seconds: 0,\n};\n\nexport const SIZE_CONFIG = {\n small: {\n trigger: \"h-8 md:h-7\",\n input: \"text-base md:text-xs\",\n icon: \"size-3.5\",\n },\n medium: {\n trigger: \"h-8\",\n input: \"text-base md:text-sm\",\n icon: \"size-4\",\n },\n large: {\n trigger: \"h-10\",\n input: \"text-base md:text-sm\",\n icon: \"size-5\",\n },\n} as const;\n","import pureDayjs from \"dayjs\";\nimport type { Dayjs } from \"dayjs\";\nimport customParseFormat from \"dayjs/plugin/customParseFormat\";\nimport { dayjs } from \"@bigbinary/neeto-commons-frontend/utils\";\n\nimport type { TimeValue } from \"../TimePicker/types\";\n\npureDayjs.extend(customParseFormat);\n\n/**\n * Reverse timezone conversion: extract date/time values from a timezone-aware\n * dayjs and create a browser-local Date. This undoes applyTimezone so that\n * Calendar and input display the correct date after a controlled round-trip.\n */\nexport const toBrowserLocalDate = (date: Date): Date => {\n const d = dayjs(date);\n\n return new Date(\n d.year(),\n d.month(),\n d.date(),\n d.hour(),\n d.minute(),\n d.second()\n );\n};\n\nconst toNativeDate = (value: unknown): Date | null => {\n if (value == null) return null;\n if (value instanceof Date) return value;\n\n if (typeof (value as { toDate?: () => Date }).toDate === \"function\") {\n return toBrowserLocalDate((value as { toDate: () => Date }).toDate());\n }\n\n if (typeof value === \"string\") {\n const parsed = new Date(value);\n if (!isNaN(parsed.getTime())) return toBrowserLocalDate(parsed);\n }\n\n return null;\n};\n\nexport const coerceDateValue = (\n value: unknown,\n type: \"date\" | \"range\"\n): Date | [Date | null, Date | null] | null => {\n if (value == null) return null;\n if (type === \"range\" && Array.isArray(value)) {\n return [toNativeDate(value[0]), toNativeDate(value[1])];\n }\n\n return toNativeDate(value);\n};\n\nconst normalizeToDayjsFormat = (fmt: string): string =>\n fmt\n .replace(/\\byyyy\\b/g, \"YYYY\")\n .replace(/\\byy\\b/g, \"YY\")\n .replace(/\\bdd\\b/g, \"DD\")\n .replace(/\\bd\\b/g, \"D\");\n\nconst normalizeToDateFnsFormat = (fmt: string): string =>\n fmt\n .replace(/YYYY/g, \"yyyy\")\n .replace(/YY/g, \"yy\")\n .replace(/DD/g, \"dd\")\n .replace(/\\bD\\b/g, \"d\");\n\n/**\n * Format a date for display using browser-local time.\n * Calendar and input always show browser-local dates.\n */\nexport const formatDate = (date: Date | null, formatStr: string): string => {\n if (!date) return \"\";\n\n try {\n return pureDayjs(date).format(normalizeToDayjsFormat(formatStr));\n } catch {\n return \"\";\n }\n};\n\n/**\n * Parse a date string using browser-local pureDayjs (not timezone-aware).\n * The user types in browser-local time; timezone conversion happens\n * later in commitValue via applyTimezone.\n */\nexport const parseDate = (str: string, formatStr: string): Date | null => {\n if (!str) return null;\n\n const dayjsFmt = normalizeToDayjsFormat(formatStr);\n const parsed = pureDayjs(str, dayjsFmt);\n if (parsed.isValid()) return parsed.toDate();\n\n const fallbackFormats = [\n \"DD/MM/YYYY\",\n \"MM/DD/YYYY\",\n \"YYYY-MM-DD\",\n \"DD-MM-YYYY\",\n \"DD/MM/YYYY HH:mm:ss\",\n \"DD/MM/YYYY HH:mm\",\n ];\n\n for (const fmt of fallbackFormats) {\n if (fmt === dayjsFmt) continue;\n\n const attempt = pureDayjs(str, fmt);\n if (attempt.isValid()) return attempt.toDate();\n }\n\n return null;\n};\n\nexport const applyTimeToDate = (date: Date, time: TimeValue): Date => {\n const result = new Date(date);\n result.setHours(time.hours, time.minutes, time.seconds ?? 0, 0);\n\n return result;\n};\n\n/**\n * Reinterpret a native Date's browser-local time values in the user's configured timezone.\n * Formats in browser-local time (pureDayjs), then reparses through timezone-aware dayjs.\n * Matches neetoUI's getTimezoneAppliedDateTime behavior.\n */\nexport const applyTimezone = (date: Date): Date => {\n const dateStr = pureDayjs(date).format(\"YYYY-MM-DD HH:mm:ss\");\n\n return dayjs(dateStr).toDate();\n};\n\nexport const toDayjs = (date: Date): Dayjs => dayjs(date);\n\nexport const getDisplayFormat = (\n dateFormat: string,\n timeFormat: string,\n showTime: boolean\n): string => {\n const fmt = showTime ? `${dateFormat} ${timeFormat}` : dateFormat;\n\n return normalizeToDateFnsFormat(fmt);\n};\n\nexport const getDatePlaceholder = (\n dateFormat: string,\n timeFormat: string,\n showTime: boolean,\n type: \"date\" | \"range\"\n): string => {\n const single = showTime\n ? `${dateFormat.toUpperCase()} ${timeFormat}`\n : dateFormat.toUpperCase();\n\n return type === \"range\" ? `${single} - ${single}` : single;\n};\n\nexport const isDatePartComplete = (\n part: string,\n maskEnabled: boolean,\n singleDateLen: number\n): boolean => (maskEnabled ? part.length >= singleDateLen : part.length > 0);\n\nexport const parseRangeText = (\n text: string,\n displayFormat: string,\n maskEnabled: boolean,\n singleDateLen: number\n): [Date, Date] | null => {\n const parts = text.split(\" - \");\n if (parts.length !== 2) return null;\n\n if (\n !isDatePartComplete(parts[0], maskEnabled, singleDateLen) ||\n !isDatePartComplete(parts[1], maskEnabled, singleDateLen)\n )\n return null;\n\n const from = parseDate(parts[0], displayFormat);\n const to = parseDate(parts[1], displayFormat);\n\n return from && to ? [from, to] : null;\n};\n\nexport const startOfWeek = (date: Date, weekStartsOn = 0): Date => {\n const d = new Date(date);\n const diff = (d.getDay() - weekStartsOn + 7) % 7;\n d.setDate(d.getDate() - diff);\n d.setHours(0, 0, 0, 0);\n\n return d;\n};\n\nexport const weekDaysFrom = (start: Date): Date[] =>\n Array.from({ length: 7 }, (_, i) => {\n const d = new Date(start);\n d.setDate(start.getDate() + i);\n\n return d;\n });\n\nexport const isMonthDisabled = (\n monthDate: Date,\n minDate?: Date,\n maxDate?: Date\n): boolean => {\n const monthStart = new Date(monthDate.getFullYear(), monthDate.getMonth(), 1);\n const monthEnd = new Date(\n monthDate.getFullYear(),\n monthDate.getMonth() + 1,\n 0,\n 23,\n 59,\n 59,\n 999\n );\n if (maxDate && monthStart > maxDate) return true;\n if (minDate && monthEnd < minDate) return true;\n\n return false;\n};\n\nexport const isYearDisabled = (\n yearDate: Date,\n minDate?: Date,\n maxDate?: Date\n): boolean => {\n const yearStart = new Date(yearDate.getFullYear(), 0, 1);\n const yearEnd = new Date(yearDate.getFullYear(), 11, 31, 23, 59, 59, 999);\n if (maxDate && yearStart > maxDate) return true;\n if (minDate && yearEnd < minDate) return true;\n\n return false;\n};\n\nexport const buildMonth = (year: number, month: number): Date =>\n new Date(year, month, 1);\n\nexport const isSameMonth = (a: Date | null, b: Date): boolean =>\n !!a && a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth();\n\nexport const decadeStartFor = (year: number): number =>\n Math.floor(year / 10) * 10;\n","import React from \"react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\n\ninterface TimezoneSelectProps {\n value?: string;\n onChange: (tz: string | undefined) => void;\n className?: string;\n}\n\nconst TIMEZONE_OPTIONS = [\n { label: \"Local\", value: \"\" },\n { label: \"UTC\", value: \"utc\" },\n] as const;\n\nconst TimezoneSelect: React.FC<TimezoneSelectProps> = ({\n value,\n onChange,\n className,\n}) => (\n <div className={cn(\"flex items-center gap-1.5 text-sm\", className)}>\n <span className=\"text-muted-foreground text-xs\">Timezone</span>\n <select\n value={value ?? \"\"}\n onChange={e => onChange(e.target.value || undefined)}\n className={cn(\n \"rounded-md border border-input bg-background px-2 py-0.5 text-xs\",\n \"focus:outline-none focus:ring-1 focus:ring-ring\"\n )}\n aria-label=\"Select timezone\"\n >\n {TIMEZONE_OPTIONS.map(opt => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </div>\n);\n\nTimezoneSelect.displayName = \"TimezoneSelect\";\n\nexport { TimezoneSelect };\n","import React from \"react\";\n\nimport { Button } from \"src/primitives/Button\";\nimport { cn } from \"src/shadcn/lib/utils\";\n\nimport { TimezoneSelect } from \"./TimezoneSelect\";\n\ninterface DatePickerFooterProps {\n showTime?: boolean;\n needConfirm?: boolean;\n timezone?: string;\n onTimezoneChange?: (tz: string | undefined) => void;\n onNow: () => void;\n onOk: () => void;\n className?: string;\n}\n\nconst DatePickerFooter: React.FC<DatePickerFooterProps> = ({\n showTime,\n needConfirm,\n timezone,\n onTimezoneChange,\n onNow,\n onOk,\n className,\n}) => {\n const showOkButton = showTime || needConfirm;\n\n return (\n <div\n className={cn(\n \"flex items-center border-t border-border px-3 py-2\",\n className\n )}\n >\n <Button variant=\"ghost\" size=\"sm\" onClick={onNow} className=\"text-xs\">\n Now\n </Button>\n <div className=\"flex-1\" />\n {onTimezoneChange && (\n <TimezoneSelect\n value={timezone}\n onChange={onTimezoneChange}\n className=\"me-2\"\n />\n )}\n {showOkButton && (\n <Button size=\"sm\" onClick={onOk} className=\"text-xs\">\n OK\n </Button>\n )}\n </div>\n );\n};\n\nDatePickerFooter.displayName = \"DatePickerFooter\";\n\nexport { DatePickerFooter };\n","import { ChevronLeftIcon, ChevronRightIcon } from \"lucide-react\";\n\nimport { Button } from \"src/primitives/Button\";\nimport { cn } from \"src/shadcn/lib/utils\";\n\nimport { buildMonth, isSameMonth } from \"./utils\";\n\ninterface MonthPickerProps {\n /** Currently selected date (used to highlight the active month). */\n value: Date | null;\n /** Year currently shown in the grid. */\n displayedYear: number;\n /** Callback when the user navigates to a different year. */\n onYearChange: (year: number) => void;\n /** Callback when a month is picked. */\n onSelect: (date: Date) => void;\n /** Predicate to disable an entire month (any day in it returning true disables the month). */\n isDisabled?: (date: Date) => boolean;\n /** Locale code for month-name formatting. */\n locale?: string;\n}\n\nconst MonthPicker = ({\n value,\n displayedYear,\n onYearChange,\n onSelect,\n isDisabled,\n locale,\n}: MonthPickerProps) => {\n const months = Array.from({ length: 12 }, (_, m) =>\n buildMonth(displayedYear, m)\n );\n const monthName = (date: Date) =>\n date.toLocaleString(locale, { month: \"short\" });\n\n return (\n <div className=\"bg-background flex w-[16rem] flex-col gap-3 p-2\">\n <div className=\"flex items-center justify-between\">\n <Button\n aria-label=\"Previous year\"\n size=\"icon\"\n variant=\"ghost\"\n onClick={() => onYearChange(displayedYear - 1)}\n >\n <ChevronLeftIcon className=\"size-4 rtl:rotate-180\" />\n </Button>\n <span className=\"text-sm font-medium\">{displayedYear}</span>\n <Button\n aria-label=\"Next year\"\n size=\"icon\"\n variant=\"ghost\"\n onClick={() => onYearChange(displayedYear + 1)}\n >\n <ChevronRightIcon className=\"size-4 rtl:rotate-180\" />\n </Button>\n </div>\n <div className=\"grid grid-cols-3 gap-2\">\n {months.map(monthDate => {\n const disabled = isDisabled?.(monthDate) ?? false;\n const selected = isSameMonth(value, monthDate);\n\n return (\n <button\n aria-pressed={selected}\n className={cn(\n \"rounded-md py-2 text-sm transition-colors\",\n \"hover:bg-muted disabled:cursor-not-allowed disabled:opacity-50\",\n selected &&\n \"bg-primary text-primary-foreground hover:bg-primary\"\n )}\n disabled={disabled}\n key={monthDate.getMonth()}\n type=\"button\"\n onClick={() => onSelect(monthDate)}\n >\n {monthName(monthDate)}\n </button>\n );\n })}\n </div>\n </div>\n );\n};\n\nexport { MonthPicker };\n","import { ChevronLeftIcon, ChevronRightIcon } from \"lucide-react\";\n\nimport { Button } from \"src/primitives/Button\";\nimport { cn } from \"src/shadcn/lib/utils\";\n\nimport { decadeStartFor } from \"./utils\";\n\ninterface YearPickerProps {\n /** Currently selected date (used to highlight the active year). */\n value: Date | null;\n /** A year inside the decade currently shown in the grid. */\n displayedYear: number;\n /** Callback when the user navigates to a different decade (receives any year inside it). */\n onYearChange: (year: number) => void;\n /** Callback when a year is picked. */\n onSelect: (date: Date) => void;\n /** Predicate to disable an entire year (e.g. when out of min/max range). */\n isDisabled?: (date: Date) => boolean;\n}\n\nconst YearPicker = ({\n value,\n displayedYear,\n onYearChange,\n onSelect,\n isDisabled,\n}: YearPickerProps) => {\n const decadeStart = decadeStartFor(displayedYear);\n const years = Array.from({ length: 12 }, (_, i) => decadeStart - 1 + i);\n const selectedYear = value?.getFullYear();\n\n return (\n <div className=\"bg-background flex w-[16rem] flex-col gap-3 p-2\">\n <div className=\"flex items-center justify-between\">\n <Button\n aria-label=\"Previous decade\"\n size=\"icon\"\n variant=\"ghost\"\n onClick={() => onYearChange(decadeStart - 10)}\n >\n <ChevronLeftIcon className=\"size-4 rtl:rotate-180\" />\n </Button>\n <span className=\"text-sm font-medium\">\n {decadeStart}-{decadeStart + 9}\n </span>\n <Button\n aria-label=\"Next decade\"\n size=\"icon\"\n variant=\"ghost\"\n onClick={() => onYearChange(decadeStart + 10)}\n >\n <ChevronRightIcon className=\"size-4 rtl:rotate-180\" />\n </Button>\n </div>\n <div className=\"grid grid-cols-3 gap-2\">\n {years.map(year => {\n const yearDate = new Date(year, 0, 1);\n const disabled = isDisabled?.(yearDate) ?? false;\n const selected = selectedYear === year;\n const outsideDecade = year < decadeStart || year > decadeStart + 9;\n\n return (\n <button\n aria-pressed={selected}\n className={cn(\n \"rounded-md py-2 text-sm transition-colors\",\n \"hover:bg-muted disabled:cursor-not-allowed disabled:opacity-50\",\n outsideDecade && \"text-muted-foreground\",\n selected &&\n \"bg-primary text-primary-foreground hover:bg-primary\"\n )}\n disabled={disabled}\n key={year}\n type=\"button\"\n onClick={() => onSelect(yearDate)}\n >\n {year}\n </button>\n );\n })}\n </div>\n </div>\n );\n};\n\nexport { YearPicker };\n","import React, {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { CalendarIcon, X } from \"lucide-react\";\nimport { Calendar } from \"src/primitives/Calendar\";\nimport {\n Popover,\n PopoverAnchor,\n PopoverContent,\n PopoverTrigger,\n} from \"src/primitives/Popover\";\nimport {\n Field,\n FieldLabel,\n FieldContent,\n FieldDescription,\n FieldError,\n} from \"src/primitives/Field\";\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { useControlledOpen } from \"src/hooks/useControlledOpen\";\nimport { useCursorRestore } from \"src/hooks/useCursorRestore\";\nimport { useOutsideClickClose } from \"src/hooks/useOutsideClickClose\";\n\nimport type { DatePickerProps } from \"./types\";\nimport {\n DEFAULT_DATE_FORMAT,\n DEFAULT_TIME_FORMAT,\n INITIAL_TIME_VALUE,\n SIZE_CONFIG,\n} from \"./constants\";\nimport {\n applyTimeToDate,\n applyTimezone,\n toBrowserLocalDate,\n coerceDateValue,\n formatDate,\n getDatePlaceholder,\n getDisplayFormat,\n isDatePartComplete,\n isMonthDisabled,\n isYearDisabled,\n parseDate,\n parseRangeText,\n startOfWeek,\n toDayjs,\n weekDaysFrom,\n} from \"./utils\";\nimport {\n applyMask,\n buildMaskTemplate,\n buildRangeMaskTemplate,\n isFixedWidthFormat,\n} from \"src/utils/inputMask\";\nimport { DatePickerFooter } from \"./DatePickerFooter\";\nimport { MonthPicker } from \"./MonthPicker\";\nimport { YearPicker } from \"./YearPicker\";\nimport { TimePickerPanel } from \"../TimePicker/TimePickerPanel\";\nimport { dateToTimeValue } from \"../TimePicker/utils\";\n\nconst DatePicker = forwardRef<HTMLDivElement, DatePickerProps>(\n (\n {\n value,\n defaultValue,\n onChange,\n onBlur,\n type = \"date\",\n dateFormat = DEFAULT_DATE_FORMAT,\n timeFormat = DEFAULT_TIME_FORMAT,\n showTime = false,\n timePickerFormat = \"24\",\n showSeconds = false,\n minDate,\n maxDate,\n disabledDate,\n placeholder,\n label,\n error,\n helpText,\n size = \"medium\",\n disabled = false,\n allowClear = true,\n required = false,\n timezone,\n onTimezoneChange,\n onOk,\n needConfirm = false,\n open: openProp,\n onOpenChange,\n className,\n labelProps,\n picker = \"date\",\n side = \"bottom\",\n align = \"start\",\n trigger,\n weekStartsOn = 0,\n },\n ref\n ) => {\n const generatedId = useId();\n const errorId = `error_${generatedId}`;\n const helpTextId = `helpText_${generatedId}`;\n const containerRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const cursorPosRef = useRef<number | null>(null);\n\n const popoverContentId = useRef(\n `datepicker-popover-${generatedId}`\n ).current;\n\n const { open, setOpen } = useControlledOpen(openProp, onOpenChange);\n\n const [internalValue, setInternalValue] = useState(\n coerceDateValue(defaultValue, type) ?? null\n );\n\n const [calendarMonth, setCalendarMonth] = useState(\n (type === \"date\"\n ? ((value as Date | null) ?? (defaultValue as Date | null))\n : null) ?? new Date()\n );\n\n const [rangeSelectionStep, setRangeSelectionStep] = useState<\"from\" | \"to\">(\n \"from\"\n );\n\n const [pendingDate, setPendingDate] = useState<Date | null>(null);\n const [pendingTime, setPendingTime] = useState(INITIAL_TIME_VALUE);\n\n const currentValue =\n value !== undefined ? coerceDateValue(value, type) : internalValue;\n\n const displayFormat = getDisplayFormat(dateFormat, timeFormat, showTime);\n const sizeConfig = SIZE_CONFIG[size];\n const maskEnabled = isFixedWidthFormat(displayFormat);\n\n const defaultPlaceholder = getDatePlaceholder(\n dateFormat,\n timeFormat,\n showTime,\n type\n );\n\n const maskTemplate = useMemo(\n () =>\n maskEnabled\n ? type === \"range\"\n ? buildRangeMaskTemplate(displayFormat)\n : buildMaskTemplate(displayFormat)\n : null,\n [displayFormat, type, maskEnabled]\n );\n\n const singleDateLen = useMemo(\n () => buildMaskTemplate(displayFormat).pattern.length,\n [displayFormat]\n );\n\n const calendarDisabled = useCallback(\n (date: Date) => {\n if (disabledDate?.(date)) return true;\n if (minDate && date < new Date(new Date(minDate).setHours(0, 0, 0, 0)))\n return true;\n if (\n maxDate &&\n date > new Date(new Date(maxDate).setHours(23, 59, 59, 999))\n )\n return true;\n\n return false;\n },\n [minDate, maxDate, disabledDate]\n );\n\n const getDisplayText = useCallback(() => {\n if (type !== \"range\") {\n return formatDate(currentValue as Date | null, displayFormat);\n }\n\n const rangeValue = currentValue as [Date | null, Date | null] | null;\n if (!rangeValue || (!rangeValue[0] && !rangeValue[1])) return \"\";\n\n const from = rangeValue[0]\n ? formatDate(rangeValue[0], displayFormat)\n : \"\";\n const to = rangeValue[1] ? formatDate(rangeValue[1], displayFormat) : \"\";\n\n return `${from} - ${to}`;\n }, [currentValue, displayFormat, type]);\n\n const [inputText, setInputText] = useState(() => getDisplayText());\n\n const commitValue = (date: Date | [Date, Date] | null) => {\n if (date === null) {\n setInternalValue(null);\n onChange?.(null, \"\");\n setInputText(\"\");\n\n return;\n }\n\n // Store the unshifted date for Calendar display (uses browser-local timezone).\n // Only pass timezone-converted values to onChange.\n if (Array.isArray(date)) {\n setInternalValue(date);\n const converted: [Date, Date] = [\n applyTimezone(date[0]),\n applyTimezone(date[1]),\n ];\n const formatted: [string, string] = [\n formatDate(date[0], displayFormat),\n formatDate(date[1], displayFormat),\n ];\n onChange?.([toDayjs(converted[0]), toDayjs(converted[1])], formatted);\n setInputText(`${formatted[0]} - ${formatted[1]}`);\n\n return;\n }\n\n setInternalValue(date);\n const converted = applyTimezone(date);\n const formatted = formatDate(date, displayFormat);\n onChange?.(toDayjs(converted), formatted);\n setInputText(formatted);\n };\n\n const parseAndApplyRange = (text: string) => {\n const parts = text.split(\" - \");\n if (!isDatePartComplete(parts[0] ?? \"\", maskEnabled, singleDateLen))\n return;\n\n const from = parseDate(parts[0], displayFormat);\n if (from) setCalendarMonth(from);\n\n const range = parseRangeText(\n text,\n displayFormat,\n maskEnabled,\n singleDateLen\n );\n\n if (range) commitValue(range);\n };\n\n const commitPendingOnClose = useCallback(() => {\n const hasOkButton = showTime || needConfirm;\n if (!hasOkButton || !pendingDate) {\n setInputText(getDisplayText());\n\n return;\n }\n\n const finalDate = showTime\n ? applyTimeToDate(pendingDate, pendingTime)\n : pendingDate;\n\n const currentSingle =\n type === \"date\" ? (currentValue as Date | null) : null;\n\n const isSame =\n currentSingle && finalDate.getTime() === currentSingle.getTime();\n\n if (isSame) {\n setInputText(getDisplayText());\n\n return;\n }\n\n commitValue(finalDate);\n }, [\n showTime,\n needConfirm,\n pendingDate,\n pendingTime,\n type,\n currentValue,\n getDisplayText,\n onChange,\n ]);\n\n const closePopover = useCallback(() => {\n commitPendingOnClose();\n setOpen(false);\n }, [commitPendingOnClose, setOpen]);\n\n useOutsideClickClose({\n enabled: open,\n containerRef,\n popoverElementId: popoverContentId,\n onClose: closePopover,\n });\n\n const openPopover = () => {\n setOpen(true);\n setRangeSelectionStep(\"from\");\n\n const dateVal = type === \"date\" ? (currentValue as Date | null) : null;\n if (!dateVal) {\n setPendingDate(null);\n setPendingTime(INITIAL_TIME_VALUE);\n\n return;\n }\n\n setCalendarMonth(dateVal);\n setPendingDate(dateVal);\n setPendingTime(dateToTimeValue(dateVal));\n };\n\n const handleDateSelect = (selected: Date | undefined) => {\n if (!selected) return;\n\n setCalendarMonth(selected);\n\n if (showTime || needConfirm) {\n setPendingDate(selected);\n\n return;\n }\n\n commitValue(selected);\n setOpen(false);\n };\n\n const handleRangeSelect = (\n range: { from?: Date; to?: Date } | undefined\n ) => {\n if (!range) return;\n\n const from = range.from ?? null;\n const to = range.to ?? null;\n\n if (rangeSelectionStep === \"from\") {\n setInternalValue([from, null]);\n setRangeSelectionStep(\"to\");\n\n return;\n }\n\n setRangeSelectionStep(\"from\");\n\n if (from && to) {\n if (showTime || needConfirm) {\n setPendingDate(from);\n\n return;\n }\n\n commitValue([from, to]);\n setOpen(false);\n\n return;\n }\n\n if (from) setInternalValue([from, null]);\n };\n\n const handleNow = () => {\n const now = toBrowserLocalDate(new Date());\n\n if (showTime || needConfirm) {\n setPendingDate(now);\n setPendingTime(dateToTimeValue(now));\n\n return;\n }\n\n commitValue(now);\n setOpen(false);\n };\n\n const handleOk = () => {\n if (pendingDate) {\n const finalDate = showTime\n ? applyTimeToDate(pendingDate, pendingTime)\n : pendingDate;\n\n commitValue(finalDate);\n onOk?.(finalDate);\n }\n setOpen(false);\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n commitValue(null);\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n let text = e.target.value;\n\n if (maskTemplate) {\n const masked = applyMask(\n text,\n maskTemplate,\n inputText,\n e.target.selectionStart\n );\n\n text = masked.text;\n cursorPosRef.current = masked.cursorPosition;\n }\n\n setInputText(text);\n\n if (type === \"range\") {\n parseAndApplyRange(text);\n\n return;\n }\n\n const isComplete = maskTemplate\n ? text.length >= maskTemplate.pattern.length\n : true;\n\n if (!isComplete) return;\n\n const parsed = parseDate(text, displayFormat);\n if (!parsed) return;\n\n setCalendarMonth(parsed);\n\n if (showTime || needConfirm) {\n setPendingDate(parsed);\n setPendingTime(dateToTimeValue(parsed));\n\n return;\n }\n\n commitValue(parsed);\n };\n\n const handleInputKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Escape\") {\n setPendingDate(null);\n setPendingTime(INITIAL_TIME_VALUE);\n setInputText(getDisplayText());\n setOpen(false);\n\n return;\n }\n\n if (e.key !== \"Enter\") return;\n\n if (type === \"range\") {\n const range = parseRangeText(\n inputText,\n displayFormat,\n maskEnabled,\n singleDateLen\n );\n if (range) commitValue(range);\n } else {\n const parsed = parseDate(inputText, displayFormat);\n if (parsed) commitValue(parsed);\n }\n\n setOpen(false);\n };\n\n const handleInputBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n const next = e.relatedTarget as HTMLElement | null;\n if (next && containerRef.current?.contains(next)) return;\n\n const popoverEl = document.getElementById(popoverContentId);\n if (next && popoverEl?.contains(next)) return;\n\n onBlur?.(e);\n };\n\n useEffect(() => {\n if (!open) setInputText(getDisplayText());\n }, [getDisplayText, open]);\n\n useCursorRestore([{ inputRef, cursorRef: cursorPosRef }]);\n\n useEffect(() => {\n if (!open || type !== \"date\") return;\n\n const dateVal = currentValue as Date | null;\n if (dateVal instanceof Date) setCalendarMonth(dateVal);\n }, [open]);\n\n const hasField = !!(label || error || helpText);\n const showFooter = showTime || needConfirm || !!onTimezoneChange;\n const todayDate = toBrowserLocalDate(new Date());\n\n const handleGridPickerSelect = (date: Date) => {\n commitValue(date);\n setOpen(false);\n };\n\n const handleSingleDateSelectWithPicker = (selected: Date | undefined) => {\n if (!selected) return handleDateSelect(undefined);\n\n handleDateSelect(\n picker === \"week\" ? startOfWeek(selected, weekStartsOn) : selected\n );\n };\n\n const weekHighlightProps = (() => {\n if (picker !== \"week\" || type !== \"date\" || !currentValue) return {};\n\n const weekStart = startOfWeek(currentValue as Date, weekStartsOn);\n const weekDays = weekDaysFrom(weekStart);\n\n return {\n modifiers: {\n weekStart: [weekDays[0]],\n weekMiddle: weekDays.slice(1, 6),\n weekEnd: [weekDays[6]],\n },\n modifiersClassNames: {\n weekStart:\n \"!bg-primary !text-primary-foreground !rounded-e-none hover:!bg-primary\",\n weekMiddle:\n \"!bg-primary !text-primary-foreground !rounded-none hover:!bg-primary\",\n weekEnd:\n \"!bg-primary !text-primary-foreground !rounded-s-none hover:!bg-primary\",\n },\n };\n })();\n\n const weekRowHoverClassName =\n picker === \"week\"\n ? \"[&_button]:!transition-none [&:hover_button]:!bg-primary [&:hover_button]:!text-primary-foreground [&:hover_button]:!rounded-none [&:hover_button]:cursor-pointer\"\n : undefined;\n\n const ariaDescribedBy =\n [error ? errorId : null, helpText ? helpTextId : null]\n .filter(Boolean)\n .join(\" \") || undefined;\n\n const calendarSelected = () => {\n if (showTime || needConfirm) return pendingDate ?? undefined;\n\n return (currentValue as Date | undefined) ?? undefined;\n };\n\n const triggerContent = (\n <Popover open={open} onOpenChange={trigger ? setOpen : undefined}>\n {trigger ? (\n <PopoverTrigger asChild>{trigger}</PopoverTrigger>\n ) : (\n <PopoverAnchor asChild>\n <div\n ref={containerRef}\n className={cn(\n \"relative flex w-full items-center gap-2 rounded-md border border-input bg-background pe-8 ps-3\",\n \"focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2\",\n disabled && \"cursor-not-allowed opacity-50\",\n !!error && \"border-destructive ring-destructive/20 ring-3\",\n sizeConfig.trigger,\n !hasField && className\n )}\n >\n <CalendarIcon\n className={cn(\n \"shrink-0 text-muted-foreground\",\n sizeConfig.icon\n )}\n />\n <input\n ref={inputRef}\n type=\"text\"\n disabled={disabled}\n aria-label={label || \"Pick a date\"}\n aria-describedby={ariaDescribedBy}\n aria-invalid={!!error || undefined}\n placeholder={placeholder ?? defaultPlaceholder}\n value={inputText}\n onChange={handleInputChange}\n onKeyDown={handleInputKeyDown}\n onFocus={() => {\n if (!open) openPopover();\n }}\n onBlur={handleInputBlur}\n className={cn(\n \"min-w-0 flex-1 bg-transparent outline-none placeholder:text-muted-foreground\",\n \"disabled:cursor-not-allowed\",\n sizeConfig.input\n )}\n />\n {timezone && (\n <span className=\"shrink-0 rounded bg-muted px-1.5 py-0.5 text-xs text-muted-foreground\">\n {timezone.toUpperCase()}\n </span>\n )}\n {allowClear && (\n <button\n type=\"button\"\n onPointerDown={e => e.preventDefault()}\n onClick={handleClear}\n className={cn(\n \"absolute inset-y-0 end-2 flex items-center text-muted-foreground hover:text-foreground focus:outline-none\",\n !(inputText && !disabled) && \"invisible\"\n )}\n aria-label=\"Clear date\"\n tabIndex={-1}\n >\n <X className={sizeConfig.icon} />\n </button>\n )}\n </div>\n </PopoverAnchor>\n )}\n {open && (\n <PopoverContent\n id={popoverContentId}\n className=\"w-auto p-0\"\n align={align}\n side={side}\n onOpenAutoFocus={e => e.preventDefault()}\n onCloseAutoFocus={e => e.preventDefault()}\n onPointerDownOutside={e => e.preventDefault()}\n onInteractOutside={e => e.preventDefault()}\n >\n <div className={cn(\"flex\", showTime && \"flex-row\")}>\n {type === \"date\" && picker === \"month\" ? (\n <MonthPicker\n value={(currentValue as Date | null) ?? null}\n displayedYear={calendarMonth.getFullYear()}\n onYearChange={year =>\n setCalendarMonth(\n new Date(year, calendarMonth.getMonth(), 1)\n )\n }\n onSelect={handleGridPickerSelect}\n isDisabled={date => isMonthDisabled(date, minDate, maxDate)}\n />\n ) : type === \"date\" && picker === \"year\" ? (\n <YearPicker\n value={(currentValue as Date | null) ?? null}\n displayedYear={calendarMonth.getFullYear()}\n onYearChange={year => setCalendarMonth(new Date(year, 0, 1))}\n onSelect={handleGridPickerSelect}\n isDisabled={date => isYearDisabled(date, minDate, maxDate)}\n />\n ) : type === \"date\" ? (\n <Calendar\n mode=\"single\"\n captionLayout=\"dropdown\"\n today={todayDate}\n month={calendarMonth}\n onMonthChange={setCalendarMonth}\n selected={calendarSelected()}\n onSelect={handleSingleDateSelectWithPicker}\n disabled={calendarDisabled}\n weekStartsOn={weekStartsOn}\n classNames={\n weekRowHoverClassName\n ? { week: cn(\"mt-2 flex w-full\", weekRowHoverClassName) }\n : undefined\n }\n {...weekHighlightProps}\n {...(minDate && { fromDate: minDate })}\n {...(maxDate && { toDate: maxDate })}\n />\n ) : (\n <Calendar\n mode=\"range\"\n numberOfMonths={2}\n captionLayout=\"dropdown\"\n today={todayDate}\n weekStartsOn={weekStartsOn}\n 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\"\n month={calendarMonth}\n onMonthChange={setCalendarMonth}\n selected={\n currentValue\n ? {\n from:\n (currentValue as [Date | null, Date | null])[0] ??\n undefined,\n to:\n (currentValue as [Date | null, Date | null])[1] ??\n undefined,\n }\n : undefined\n }\n onSelect={handleRangeSelect}\n disabled={calendarDisabled}\n {...(minDate && { fromDate: minDate })}\n {...(maxDate && { toDate: maxDate })}\n />\n )}\n {showTime && (\n <div className=\"border-inline-start border-border\">\n <TimePickerPanel\n value={pendingTime}\n onChange={setPendingTime}\n format={timePickerFormat}\n showSeconds={showSeconds}\n disabled={disabled}\n />\n </div>\n )}\n </div>\n {showFooter && (\n <DatePickerFooter\n showTime={showTime}\n needConfirm={needConfirm}\n timezone={timezone}\n onTimezoneChange={onTimezoneChange}\n onNow={handleNow}\n onOk={handleOk}\n />\n )}\n </PopoverContent>\n )}\n </Popover>\n );\n\n if (!hasField) {\n return (\n <div ref={ref} className={className}>\n {triggerContent}\n </div>\n );\n }\n\n return (\n <Field\n ref={ref}\n data-disabled={disabled || undefined}\n data-invalid={!!error || undefined}\n className={className}\n >\n {label && (\n <FieldLabel\n {...(labelProps as React.ComponentProps<typeof FieldLabel>)}\n >\n {label}\n {required && (\n <span aria-hidden=\"true\" className=\"text-destructive\">\n *\n </span>\n )}\n </FieldLabel>\n )}\n <FieldContent>\n {triggerContent}\n {!!error && <FieldError id={errorId}>{error}</FieldError>}\n {helpText && (\n <FieldDescription id={helpTextId}>{helpText}</FieldDescription>\n )}\n </FieldContent>\n </Field>\n );\n }\n);\n\nDatePicker.displayName = \"DatePicker\";\n\nexport { DatePicker };\n"],"names":["createLucideIcon","pureDayjs","customParseFormat","dayjs","cn","jsx","jsxs","Button","ChevronLeftIcon","ChevronRightIcon","forwardRef","useId","useRef","useControlledOpen","useState","isFixedWidthFormat","useMemo","buildRangeMaskTemplate","buildMaskTemplate","useCallback","converted","formatted","useOutsideClickClose","dateToTimeValue","applyMask","useEffect","useCursorRestore","Popover","PopoverTrigger","PopoverAnchor","CalendarIcon","X","PopoverContent","Calendar","TimePickerPanel","Field","FieldLabel","FieldContent","FieldError","FieldDescription"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var DatePicker = require('../DatePicker-Bg2LywGY.js');
3
+ var DatePicker = require('../DatePicker-BZd4rM2R.js');
4
4
  require('react/jsx-runtime');
5
5
  require('react');
6
6
  require('../primitives/Calendar.js');
@@ -10,7 +10,7 @@ var Callout = require('../Callout-CYIrflF1.js');
10
10
  var Checkbox = require('../Checkbox-CxqWOvFN.js');
11
11
  var ColorPicker = require('../ColorPicker-rhCnblTv.js');
12
12
  var DataTable = require('../DataTable-CCIIXb4B.js');
13
- var DatePicker = require('../DatePicker-Bg2LywGY.js');
13
+ var DatePicker = require('../DatePicker-BZd4rM2R.js');
14
14
  var Dialog = require('../Dialog-CBSuKeu_.js');
15
15
  var Empty = require('../Empty-aQaWK0p4.js');
16
16
  var Input = require('../Input-BQh-GS_w.js');
package/dist/cjs/index.js CHANGED
@@ -14,7 +14,7 @@ var Callout = require('./Callout-CYIrflF1.js');
14
14
  var Checkbox = require('./Checkbox-CxqWOvFN.js');
15
15
  var ColorPicker = require('./ColorPicker-rhCnblTv.js');
16
16
  var DataTable = require('./DataTable-CCIIXb4B.js');
17
- var DatePicker = require('./DatePicker-Bg2LywGY.js');
17
+ var DatePicker = require('./DatePicker-BZd4rM2R.js');
18
18
  var Dialog = require('./Dialog-CBSuKeu_.js');
19
19
  var DirectionProvider = require('./DirectionProvider-BTtE4FcN.js');
20
20
  var Empty = require('./Empty-aQaWK0p4.js');
@@ -0,0 +1,16 @@
1
+ interface MonthPickerProps {
2
+ /** Currently selected date (used to highlight the active month). */
3
+ value: Date | null;
4
+ /** Year currently shown in the grid. */
5
+ displayedYear: number;
6
+ /** Callback when the user navigates to a different year. */
7
+ onYearChange: (year: number) => void;
8
+ /** Callback when a month is picked. */
9
+ onSelect: (date: Date) => void;
10
+ /** Predicate to disable an entire month (any day in it returning true disables the month). */
11
+ isDisabled?: (date: Date) => boolean;
12
+ /** Locale code for month-name formatting. */
13
+ locale?: string;
14
+ }
15
+ declare const MonthPicker: ({ value, displayedYear, onYearChange, onSelect, isDisabled, locale, }: MonthPickerProps) => import("react/jsx-runtime").JSX.Element;
16
+ export { MonthPicker };
@@ -0,0 +1,14 @@
1
+ interface YearPickerProps {
2
+ /** Currently selected date (used to highlight the active year). */
3
+ value: Date | null;
4
+ /** A year inside the decade currently shown in the grid. */
5
+ displayedYear: number;
6
+ /** Callback when the user navigates to a different decade (receives any year inside it). */
7
+ onYearChange: (year: number) => void;
8
+ /** Callback when a year is picked. */
9
+ onSelect: (date: Date) => void;
10
+ /** Predicate to disable an entire year (e.g. when out of min/max range). */
11
+ isDisabled?: (date: Date) => boolean;
12
+ }
13
+ declare const YearPicker: ({ value, displayedYear, onYearChange, onSelect, isDisabled, }: YearPickerProps) => import("react/jsx-runtime").JSX.Element;
14
+ export { YearPicker };
@@ -1,7 +1,11 @@
1
1
  import type { Dayjs } from "dayjs";
2
+ import type React from "react";
2
3
  import type { TimePickerFormat } from "../TimePicker/types";
3
4
  export type DateValue = Date | Dayjs;
4
5
  export type DatePickerType = "date" | "range";
6
+ export type DatePickerMode = "date" | "day" | "week" | "month" | "year";
7
+ export type PopoverSide = "top" | "right" | "bottom" | "left";
8
+ export type PopoverAlign = "start" | "center" | "end";
5
9
  export interface DatePickerProps {
6
10
  /** Current value. Date/Dayjs for single, [Date, Date] for range. */
7
11
  value?: DateValue | [DateValue | null, DateValue | null] | null;
@@ -27,6 +31,8 @@ export interface DatePickerProps {
27
31
  minDate?: Date;
28
32
  /** Maximum selectable date. */
29
33
  maxDate?: Date;
34
+ /** Predicate to disable arbitrary dates beyond minDate/maxDate. */
35
+ disabledDate?: (date: Date) => boolean;
30
36
  /** Placeholder text for the trigger input. */
31
37
  placeholder?: string;
32
38
  /** Label displayed above the picker. */
@@ -59,4 +65,14 @@ export interface DatePickerProps {
59
65
  className?: string;
60
66
  /** Props forwarded to the label element. */
61
67
  labelProps?: Record<string, unknown>;
68
+ /** Picker granularity. "date"/"day" shows day calendar; "week"/"month"/"year" show grid pickers. Only honored when type="date". */
69
+ picker?: DatePickerMode;
70
+ /** Side of the trigger to render the popover. */
71
+ side?: PopoverSide;
72
+ /** Alignment of the popover relative to the trigger. */
73
+ align?: PopoverAlign;
74
+ /** Custom trigger element. When provided, replaces the built-in input UI and the popover anchors to this element. */
75
+ trigger?: React.ReactNode;
76
+ /** First day of the week. 0 = Sunday (default), 1 = Monday, etc. */
77
+ weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;
62
78
  }
@@ -30,3 +30,10 @@ export declare const getDisplayFormat: (dateFormat: string, timeFormat: string,
30
30
  export declare const getDatePlaceholder: (dateFormat: string, timeFormat: string, showTime: boolean, type: "date" | "range") => string;
31
31
  export declare const isDatePartComplete: (part: string, maskEnabled: boolean, singleDateLen: number) => boolean;
32
32
  export declare const parseRangeText: (text: string, displayFormat: string, maskEnabled: boolean, singleDateLen: number) => [Date, Date] | null;
33
+ export declare const startOfWeek: (date: Date, weekStartsOn?: number) => Date;
34
+ export declare const weekDaysFrom: (start: Date) => Date[];
35
+ export declare const isMonthDisabled: (monthDate: Date, minDate?: Date, maxDate?: Date) => boolean;
36
+ export declare const isYearDisabled: (yearDate: Date, minDate?: Date, maxDate?: Date) => boolean;
37
+ export declare const buildMonth: (year: number, month: number) => Date;
38
+ export declare const isSameMonth: (a: Date | null, b: Date) => boolean;
39
+ export declare const decadeStartFor: (year: number) => number;
@@ -1,4 +1,4 @@
1
- export { D as DatePicker } from '../DatePicker-DGf2BiNq.js';
1
+ export { D as DatePicker } from '../DatePicker-kulToqfM.js';
2
2
  import 'react/jsx-runtime';
3
3
  import 'react';
4
4
  import '../primitives/Calendar.js';
@@ -8,7 +8,7 @@ export { C as Callout } from '../Callout-NVYmCwJL.js';
8
8
  export { C as Checkbox } from '../Checkbox-C_Rd2-8Z.js';
9
9
  export { C as ColorPicker } from '../ColorPicker-ClnRUq9y.js';
10
10
  export { D as DataTable, u as useColumnOrdering, a as useColumnPinning, b as useColumnVisibility, c as useTablePagination, d as useTableSelection, e as useTableSort } from '../DataTable-BTdSpJfs.js';
11
- export { D as DatePicker } from '../DatePicker-DGf2BiNq.js';
11
+ export { D as DatePicker } from '../DatePicker-kulToqfM.js';
12
12
  export { D as Dialog } from '../Dialog-BOcBeB8v.js';
13
13
  export { E as Empty } from '../Empty-Bfido_mq.js';
14
14
  export { I as Input } from '../Input-Bxs8n6xp.js';