snack-datepicker 0.0.1 → 0.0.2
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.
- package/dist/index.d.cts +23 -1
- package/dist/index.d.ts +23 -1
- package/dist/index.js +171 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +152 -5
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.cts
CHANGED
|
@@ -28,4 +28,26 @@ interface DatePickerProps {
|
|
|
28
28
|
|
|
29
29
|
declare const DatePicker: React.ForwardRefExoticComponent<DatePickerProps & React.RefAttributes<HTMLDivElement>>;
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
interface DatePickerInputProps extends Omit<DatePickerProps, "showFooter" | "className"> {
|
|
32
|
+
/** Placeholder text when no date is selected */
|
|
33
|
+
placeholder?: string;
|
|
34
|
+
/** Date display format string (date-fns format) */
|
|
35
|
+
displayFormat?: string;
|
|
36
|
+
/** Width class for the input trigger */
|
|
37
|
+
triggerClassName?: string;
|
|
38
|
+
/** Class for the popover content */
|
|
39
|
+
popoverClassName?: string;
|
|
40
|
+
/** Class for the calendar inside the popover */
|
|
41
|
+
calendarClassName?: string;
|
|
42
|
+
/** Whether the input is disabled */
|
|
43
|
+
disabled?: boolean;
|
|
44
|
+
/** Whether to show a clear button */
|
|
45
|
+
clearable?: boolean;
|
|
46
|
+
/** Popover alignment */
|
|
47
|
+
align?: "start" | "center" | "end";
|
|
48
|
+
/** Label text above the input */
|
|
49
|
+
label?: string;
|
|
50
|
+
}
|
|
51
|
+
declare const DatePickerInput: React.FC<DatePickerInputProps>;
|
|
52
|
+
|
|
53
|
+
export { DatePicker, DatePickerInput, type DatePickerInputProps, type DatePickerMode, type DatePickerProps, type DateRange, type PresetRange, DatePicker as default };
|
package/dist/index.d.ts
CHANGED
|
@@ -28,4 +28,26 @@ interface DatePickerProps {
|
|
|
28
28
|
|
|
29
29
|
declare const DatePicker: React.ForwardRefExoticComponent<DatePickerProps & React.RefAttributes<HTMLDivElement>>;
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
interface DatePickerInputProps extends Omit<DatePickerProps, "showFooter" | "className"> {
|
|
32
|
+
/** Placeholder text when no date is selected */
|
|
33
|
+
placeholder?: string;
|
|
34
|
+
/** Date display format string (date-fns format) */
|
|
35
|
+
displayFormat?: string;
|
|
36
|
+
/** Width class for the input trigger */
|
|
37
|
+
triggerClassName?: string;
|
|
38
|
+
/** Class for the popover content */
|
|
39
|
+
popoverClassName?: string;
|
|
40
|
+
/** Class for the calendar inside the popover */
|
|
41
|
+
calendarClassName?: string;
|
|
42
|
+
/** Whether the input is disabled */
|
|
43
|
+
disabled?: boolean;
|
|
44
|
+
/** Whether to show a clear button */
|
|
45
|
+
clearable?: boolean;
|
|
46
|
+
/** Popover alignment */
|
|
47
|
+
align?: "start" | "center" | "end";
|
|
48
|
+
/** Label text above the input */
|
|
49
|
+
label?: string;
|
|
50
|
+
}
|
|
51
|
+
declare const DatePickerInput: React.FC<DatePickerInputProps>;
|
|
52
|
+
|
|
53
|
+
export { DatePicker, DatePickerInput, type DatePickerInputProps, type DatePickerMode, type DatePickerProps, type DateRange, type PresetRange, DatePicker as default };
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
3
5
|
var React = require('react');
|
|
4
6
|
var dateFns = require('date-fns');
|
|
5
7
|
var lucideReact = require('lucide-react');
|
|
@@ -7,10 +9,28 @@ var framerMotion = require('framer-motion');
|
|
|
7
9
|
var clsx = require('clsx');
|
|
8
10
|
var tailwindMerge = require('tailwind-merge');
|
|
9
11
|
var jsxRuntime = require('react/jsx-runtime');
|
|
12
|
+
var PopoverPrimitive = require('@radix-ui/react-popover');
|
|
10
13
|
|
|
11
|
-
function
|
|
14
|
+
function _interopNamespace(e) {
|
|
15
|
+
if (e && e.__esModule) return e;
|
|
16
|
+
var n = Object.create(null);
|
|
17
|
+
if (e) {
|
|
18
|
+
Object.keys(e).forEach(function (k) {
|
|
19
|
+
if (k !== 'default') {
|
|
20
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
21
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
22
|
+
enumerable: true,
|
|
23
|
+
get: function () { return e[k]; }
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
n.default = e;
|
|
29
|
+
return Object.freeze(n);
|
|
30
|
+
}
|
|
12
31
|
|
|
13
|
-
var
|
|
32
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
33
|
+
var PopoverPrimitive__namespace = /*#__PURE__*/_interopNamespace(PopoverPrimitive);
|
|
14
34
|
|
|
15
35
|
// src/components/date-picker/DatePicker.tsx
|
|
16
36
|
function cn(...inputs) {
|
|
@@ -119,7 +139,7 @@ var MonthGrid = ({
|
|
|
119
139
|
] })
|
|
120
140
|
] });
|
|
121
141
|
};
|
|
122
|
-
var MonthGrid_default =
|
|
142
|
+
var MonthGrid_default = React__namespace.default.memo(MonthGrid);
|
|
123
143
|
var MonthSelector = ({
|
|
124
144
|
currentMonth,
|
|
125
145
|
onSelect
|
|
@@ -189,7 +209,7 @@ var YearSelector = ({
|
|
|
189
209
|
);
|
|
190
210
|
};
|
|
191
211
|
var YearSelector_default = YearSelector;
|
|
192
|
-
var DatePicker =
|
|
212
|
+
var DatePicker = React__namespace.default.forwardRef(
|
|
193
213
|
({
|
|
194
214
|
mode = "single",
|
|
195
215
|
value,
|
|
@@ -405,7 +425,154 @@ var DatePicker = React__default.default.forwardRef(
|
|
|
405
425
|
}
|
|
406
426
|
);
|
|
407
427
|
DatePicker.displayName = "DatePicker";
|
|
428
|
+
var DatePicker_default = DatePicker;
|
|
429
|
+
var Popover = PopoverPrimitive__namespace.Root;
|
|
430
|
+
var PopoverTrigger = PopoverPrimitive__namespace.Trigger;
|
|
431
|
+
var PopoverContent = React__namespace.forwardRef(({ className, align = "center", sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(PopoverPrimitive__namespace.Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
432
|
+
PopoverPrimitive__namespace.Content,
|
|
433
|
+
{
|
|
434
|
+
ref,
|
|
435
|
+
align,
|
|
436
|
+
sideOffset,
|
|
437
|
+
className: cn(
|
|
438
|
+
"z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
|
|
439
|
+
className
|
|
440
|
+
),
|
|
441
|
+
...props
|
|
442
|
+
}
|
|
443
|
+
) }));
|
|
444
|
+
PopoverContent.displayName = PopoverPrimitive__namespace.Content.displayName;
|
|
445
|
+
var DatePickerInput = ({
|
|
446
|
+
mode = "single",
|
|
447
|
+
value,
|
|
448
|
+
onChange,
|
|
449
|
+
onApply,
|
|
450
|
+
onReset,
|
|
451
|
+
placeholder,
|
|
452
|
+
displayFormat = "MMM d, yyyy",
|
|
453
|
+
triggerClassName,
|
|
454
|
+
popoverClassName,
|
|
455
|
+
calendarClassName,
|
|
456
|
+
disabled = false,
|
|
457
|
+
clearable = true,
|
|
458
|
+
align = "start",
|
|
459
|
+
label,
|
|
460
|
+
numberOfMonths,
|
|
461
|
+
presets,
|
|
462
|
+
minDate,
|
|
463
|
+
maxDate,
|
|
464
|
+
disabledDates,
|
|
465
|
+
weekStart,
|
|
466
|
+
renderDay
|
|
467
|
+
}) => {
|
|
468
|
+
const [open, setOpen] = React.useState(false);
|
|
469
|
+
const defaultPlaceholder = mode === "range" ? "Select date range..." : "Select a date...";
|
|
470
|
+
const displayValue = (() => {
|
|
471
|
+
if (mode === "single" && value instanceof Date) {
|
|
472
|
+
return dateFns.format(value, displayFormat);
|
|
473
|
+
}
|
|
474
|
+
if (mode === "range" && value && "start" in value) {
|
|
475
|
+
const range = value;
|
|
476
|
+
if (range.start && range.end) {
|
|
477
|
+
return `${dateFns.format(range.start, displayFormat)} \u2013 ${dateFns.format(range.end, displayFormat)}`;
|
|
478
|
+
}
|
|
479
|
+
if (range.start) {
|
|
480
|
+
return `${dateFns.format(range.start, displayFormat)} \u2013 ...`;
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
return "";
|
|
484
|
+
})();
|
|
485
|
+
const handleApply = React.useCallback(
|
|
486
|
+
(val) => {
|
|
487
|
+
onApply == null ? void 0 : onApply(val);
|
|
488
|
+
setOpen(false);
|
|
489
|
+
},
|
|
490
|
+
[onApply]
|
|
491
|
+
);
|
|
492
|
+
const handleClear = React.useCallback(
|
|
493
|
+
(e) => {
|
|
494
|
+
e.stopPropagation();
|
|
495
|
+
onReset == null ? void 0 : onReset();
|
|
496
|
+
},
|
|
497
|
+
[onReset]
|
|
498
|
+
);
|
|
499
|
+
const handleChange = React.useCallback(
|
|
500
|
+
(val) => {
|
|
501
|
+
onChange == null ? void 0 : onChange(val);
|
|
502
|
+
if (mode === "single") {
|
|
503
|
+
setOpen(false);
|
|
504
|
+
}
|
|
505
|
+
},
|
|
506
|
+
[onChange, mode]
|
|
507
|
+
);
|
|
508
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1.5", children: [
|
|
509
|
+
label && /* @__PURE__ */ jsxRuntime.jsx("label", { className: "text-sm font-medium text-foreground", children: label }),
|
|
510
|
+
/* @__PURE__ */ jsxRuntime.jsxs(Popover, { open, onOpenChange: setOpen, children: [
|
|
511
|
+
/* @__PURE__ */ jsxRuntime.jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
512
|
+
"button",
|
|
513
|
+
{
|
|
514
|
+
type: "button",
|
|
515
|
+
disabled,
|
|
516
|
+
className: cn(
|
|
517
|
+
"inline-flex items-center gap-2 h-10 px-3 rounded-lg border border-input bg-background text-sm",
|
|
518
|
+
"ring-offset-background transition-colors",
|
|
519
|
+
"hover:bg-accent/5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
|
|
520
|
+
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
521
|
+
!displayValue && "text-muted-foreground",
|
|
522
|
+
displayValue && "text-foreground",
|
|
523
|
+
triggerClassName
|
|
524
|
+
),
|
|
525
|
+
children: [
|
|
526
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.CalendarIcon, { className: "h-4 w-4 shrink-0 text-muted-foreground" }),
|
|
527
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-1 text-left truncate", children: displayValue || placeholder || defaultPlaceholder }),
|
|
528
|
+
clearable && displayValue && /* @__PURE__ */ jsxRuntime.jsx(
|
|
529
|
+
"span",
|
|
530
|
+
{
|
|
531
|
+
role: "button",
|
|
532
|
+
tabIndex: 0,
|
|
533
|
+
onClick: handleClear,
|
|
534
|
+
onKeyDown: (e) => e.key === "Enter" && handleClear(e),
|
|
535
|
+
className: "shrink-0 p-0.5 rounded hover:bg-muted transition-colors",
|
|
536
|
+
"aria-label": "Clear selection",
|
|
537
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "h-3.5 w-3.5 text-muted-foreground" })
|
|
538
|
+
}
|
|
539
|
+
)
|
|
540
|
+
]
|
|
541
|
+
}
|
|
542
|
+
) }),
|
|
543
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
544
|
+
PopoverContent,
|
|
545
|
+
{
|
|
546
|
+
className: cn("w-auto p-0 pointer-events-auto", popoverClassName),
|
|
547
|
+
align,
|
|
548
|
+
sideOffset: 8,
|
|
549
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
550
|
+
DatePicker,
|
|
551
|
+
{
|
|
552
|
+
mode,
|
|
553
|
+
value,
|
|
554
|
+
onChange: handleChange,
|
|
555
|
+
onApply: mode === "range" ? handleApply : void 0,
|
|
556
|
+
onReset,
|
|
557
|
+
numberOfMonths: numberOfMonths != null ? numberOfMonths : mode === "range" ? 2 : 1,
|
|
558
|
+
showFooter: mode === "range",
|
|
559
|
+
presets,
|
|
560
|
+
minDate,
|
|
561
|
+
maxDate,
|
|
562
|
+
disabledDates,
|
|
563
|
+
weekStart,
|
|
564
|
+
renderDay,
|
|
565
|
+
className: cn("border-0 shadow-none", calendarClassName)
|
|
566
|
+
}
|
|
567
|
+
)
|
|
568
|
+
}
|
|
569
|
+
)
|
|
570
|
+
] })
|
|
571
|
+
] });
|
|
572
|
+
};
|
|
408
573
|
|
|
409
574
|
exports.DatePicker = DatePicker;
|
|
575
|
+
exports.DatePickerInput = DatePickerInput;
|
|
576
|
+
exports.default = DatePicker_default;
|
|
410
577
|
//# sourceMappingURL=index.js.map
|
|
411
578
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/utils.ts","../src/components/date-picker/MonthGrid.tsx","../src/components/date-picker/MonthSelector.tsx","../src/components/date-picker/YearSelector.tsx","../src/components/date-picker/DatePicker.tsx"],"names":["twMerge","clsx","useMemo","eachDayOfInterval","startOfMonth","endOfMonth","isBefore","isAfter","isSameDay","jsxs","jsx","format","isWithinInterval","React","getMonth","motion","useState","useCallback","subMonths","ChevronLeft","addMonths","ChevronRight","AnimatePresence","setMonth","getYear","setYear","RotateCcw"],"mappings":"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","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","import React, { useMemo } from \"react\";\r\nimport {\r\n format,\r\n startOfMonth,\r\n endOfMonth,\r\n eachDayOfInterval,\r\n isSameDay,\r\n isWithinInterval,\r\n isBefore,\r\n isAfter,\r\n} from \"date-fns\";\r\nimport type { DatePickerMode, DateRange } from \"./types\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\ninterface MonthGridProps {\r\n month: Date;\r\n mode: DatePickerMode;\r\n selectedDate: Date | null;\r\n selectedRange: DateRange | null;\r\n hoverDate: Date | null;\r\n onDateClick: (date: Date) => void;\r\n onDateHover: (date: Date | null) => void;\r\n minDate?: Date;\r\n maxDate?: Date;\r\n disabledDates?: Date[];\r\n weekStart?: 0 | 1;\r\n renderDay?: (date: Date) => React.ReactNode;\r\n showLabel?: boolean;\r\n}\r\n\r\nconst WEEK_DAYS_SUN = [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"];\r\nconst WEEK_DAYS_MON = [\"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\", \"Su\"];\r\n\r\nconst MonthGrid: React.FC<MonthGridProps> = ({\r\n month,\r\n mode,\r\n selectedDate,\r\n selectedRange,\r\n hoverDate,\r\n onDateClick,\r\n onDateHover,\r\n minDate,\r\n maxDate,\r\n disabledDates = [],\r\n weekStart = 0,\r\n renderDay,\r\n showLabel = true,\r\n}) => {\r\n const days = useMemo(() => {\r\n return eachDayOfInterval({\r\n start: startOfMonth(month),\r\n end: endOfMonth(month),\r\n });\r\n }, [month]);\r\n\r\n const weekDays = weekStart === 1 ? WEEK_DAYS_MON : WEEK_DAYS_SUN;\r\n\r\n const startPad = useMemo(() => {\r\n const dayOfWeek = days[0].getDay();\r\n return weekStart === 1 ? (dayOfWeek === 0 ? 6 : dayOfWeek - 1) : dayOfWeek;\r\n }, [days, weekStart]);\r\n\r\n const isDisabled = (date: Date) => {\r\n if (minDate && isBefore(date, minDate)) return true;\r\n if (maxDate && isAfter(date, maxDate)) return true;\r\n return disabledDates.some((d) => isSameDay(d, date));\r\n };\r\n\r\n return (\r\n <div className=\"flex-1 min-w-[252px]\">\r\n {showLabel && (\r\n <div className=\"text-center mb-3\">\r\n <span className=\"text-sm font-medium text-dp-text\">\r\n {format(month, \"MMMM yyyy\")}\r\n </span>\r\n </div>\r\n )}\r\n <div className=\"grid grid-cols-7 mb-1.5\">\r\n {weekDays.map((d) => (\r\n <span\r\n key={d}\r\n className=\"text-[11px] font-semibold text-dp-text-muted text-center uppercase tracking-wider py-1\"\r\n >\r\n {d}\r\n </span>\r\n ))}\r\n </div>\r\n <div className=\"grid grid-cols-7\">\r\n {[...Array(startPad)].map((_, i) => (\r\n <div key={`pad-${i}`} className=\"h-9 w-9\" />\r\n ))}\r\n {days.map((day) => {\r\n const disabled = isDisabled(day);\r\n const isSelected =\r\n mode === \"single\"\r\n ? selectedDate && isSameDay(day, selectedDate)\r\n : selectedRange &&\r\n ((selectedRange.start && isSameDay(day, selectedRange.start)) ||\r\n (selectedRange.end && isSameDay(day, selectedRange.end)));\r\n\r\n const isStart =\r\n mode === \"range\" &&\r\n selectedRange?.start &&\r\n isSameDay(day, selectedRange.start);\r\n const isEnd =\r\n mode === \"range\" &&\r\n selectedRange?.end &&\r\n isSameDay(day, selectedRange.end);\r\n\r\n let inRange = false;\r\n if (mode === \"range\" && selectedRange?.start) {\r\n if (selectedRange.end) {\r\n inRange = isWithinInterval(day, {\r\n start: selectedRange.start,\r\n end: selectedRange.end,\r\n });\r\n } else if (hoverDate) {\r\n const rangeStart = isBefore(hoverDate, selectedRange.start)\r\n ? hoverDate\r\n : selectedRange.start;\r\n const rangeEnd = isBefore(hoverDate, selectedRange.start)\r\n ? selectedRange.start\r\n : hoverDate;\r\n inRange = isWithinInterval(day, {\r\n start: rangeStart,\r\n end: rangeEnd,\r\n });\r\n }\r\n }\r\n\r\n return (\r\n <button\r\n key={day.toISOString()}\r\n type=\"button\"\r\n disabled={disabled}\r\n onClick={() => !disabled && onDateClick(day)}\r\n onMouseEnter={() => !disabled && onDateHover(day)}\r\n onMouseLeave={() => onDateHover(null)}\r\n aria-label={format(day, \"PPPP\")}\r\n aria-selected={!!isSelected}\r\n className={cn(\r\n \"relative h-9 w-9 text-sm flex items-center justify-center transition-all tabular-nums\",\r\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\",\r\n \"active:scale-[0.96]\",\r\n // Default\r\n !isSelected &&\r\n !inRange &&\r\n \"text-dp-text hover:bg-dp-surface-hover rounded-lg\",\r\n // Selected (start/end/single)\r\n isSelected &&\r\n \"bg-dp-surface-active text-dp-text-selected z-10 shadow-sm font-semibold\",\r\n // Single mode selected\r\n mode === \"single\" && isSelected && \"rounded-lg\",\r\n // Range endpoints\r\n isStart && !isEnd && \"rounded-l-lg rounded-r-none\",\r\n isEnd && !isStart && \"rounded-r-lg rounded-l-none\",\r\n isStart && isEnd && \"rounded-lg\",\r\n // In range but not selected\r\n inRange &&\r\n !isSelected &&\r\n \"bg-[hsl(var(--dp-range-tint)/0.08)] text-primary rounded-none\",\r\n // Disabled\r\n disabled &&\r\n \"text-dp-text-muted/40 cursor-not-allowed hover:bg-transparent\",\r\n )}\r\n >\r\n {renderDay ? renderDay(day) : format(day, \"d\")}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default React.memo(MonthGrid);\r\n","import React from \"react\";\r\nimport { format, getMonth } from \"date-fns\";\r\nimport { motion } from \"framer-motion\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\ninterface MonthSelectorProps {\r\n currentMonth: Date;\r\n onSelect: (month: number) => void;\r\n}\r\n\r\nconst MonthSelector: React.FC<MonthSelectorProps> = ({\r\n currentMonth,\r\n onSelect,\r\n}) => {\r\n const current = getMonth(currentMonth);\r\n\r\n return (\r\n <motion.div\r\n key=\"month-selector\"\r\n initial={{ opacity: 0, y: 4 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n exit={{ opacity: 0, y: -4 }}\r\n transition={{ duration: 0.15, ease: [0.25, 0.1, 0.25, 1] }}\r\n className=\"grid grid-cols-3 gap-2 w-full max-w-[320px] mx-auto\"\r\n >\r\n {Array.from({ length: 12 }).map((_, i) => (\r\n <button\r\n key={i}\r\n type=\"button\"\r\n onClick={() => onSelect(i)}\r\n className={cn(\r\n \"py-3 text-sm font-medium rounded-lg transition-all active:scale-[0.97]\",\r\n current === i\r\n ? \"bg-dp-surface-active text-dp-text-selected shadow-sm\"\r\n : \"hover:bg-dp-surface-hover text-dp-text\",\r\n )}\r\n >\r\n {format(new Date(2024, i, 1), \"MMM\")}\r\n </button>\r\n ))}\r\n </motion.div>\r\n );\r\n};\r\n\r\nexport default MonthSelector;\r\n","import React from \"react\";\r\nimport { motion } from \"framer-motion\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\ninterface YearSelectorProps {\r\n currentYear: number;\r\n onSelect: (year: number) => void;\r\n minDate?: Date;\r\n maxDate?: Date;\r\n}\r\n\r\nconst YearSelector: React.FC<YearSelectorProps> = ({\r\n currentYear,\r\n onSelect,\r\n minDate,\r\n maxDate,\r\n}) => {\r\n const years = Array.from({ length: 12 }, (_, i) => currentYear - 5 + i);\r\n\r\n return (\r\n <motion.div\r\n key=\"year-selector\"\r\n initial={{ opacity: 0, y: 4 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n exit={{ opacity: 0, y: -4 }}\r\n transition={{ duration: 0.15, ease: [0.25, 0.1, 0.25, 1] }}\r\n className=\"grid grid-cols-3 gap-2 w-full max-w-[320px] mx-auto\"\r\n >\r\n {years.map((y) => {\r\n const disabled =\r\n (minDate && y < minDate.getFullYear()) ||\r\n (maxDate && y > maxDate.getFullYear());\r\n return (\r\n <button\r\n key={y}\r\n type=\"button\"\r\n disabled={!!disabled}\r\n onClick={() => !disabled && onSelect(y)}\r\n className={cn(\r\n \"py-3 text-sm font-medium rounded-lg transition-all active:scale-[0.97]\",\r\n currentYear === y\r\n ? \"bg-dp-surface-active text-dp-text-selected shadow-sm\"\r\n : \"hover:bg-dp-surface-hover text-dp-text\",\r\n disabled && \"opacity-30 cursor-not-allowed\",\r\n )}\r\n >\r\n {y}\r\n </button>\r\n );\r\n })}\r\n </motion.div>\r\n );\r\n};\r\n\r\nexport default YearSelector;\r\n","import React, { useState, useCallback, useEffect } from \"react\";\r\nimport {\r\n format,\r\n addMonths,\r\n subMonths,\r\n setMonth,\r\n setYear,\r\n getYear,\r\n isBefore,\r\n isSameDay,\r\n} from \"date-fns\";\r\nimport { ChevronLeft, ChevronRight, RotateCcw } from \"lucide-react\";\r\nimport { AnimatePresence, motion } from \"framer-motion\";\r\nimport MonthGrid from \"./MonthGrid\";\r\nimport MonthSelector from \"./MonthSelector\";\r\nimport YearSelector from \"./YearSelector\";\r\nimport type { DatePickerProps, DateRange } from \"./types\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\ntype ViewMode = \"calendar\" | \"month\" | \"year\";\r\n\r\nexport const DatePicker = React.forwardRef<HTMLDivElement, DatePickerProps>(\r\n (\r\n {\r\n mode = \"single\",\r\n value,\r\n onChange,\r\n onApply,\r\n onReset,\r\n minDate,\r\n maxDate,\r\n disabledDates,\r\n weekStart = 0,\r\n numberOfMonths = 2,\r\n showFooter = true,\r\n className,\r\n renderDay,\r\n presets,\r\n },\r\n ref,\r\n ) => {\r\n const [viewDate, setViewDate] = useState(() => {\r\n if (mode === \"single\" && value instanceof Date) return value;\r\n if (mode === \"range\" && value && \"start\" in value && value.start)\r\n return value.start;\r\n return new Date();\r\n });\r\n const [viewMode, setViewMode] = useState<ViewMode>(\"calendar\");\r\n const [hoverDate, setHoverDate] = useState<Date | null>(null);\r\n\r\n const selectedRange =\r\n mode === \"range\" ? ((value as DateRange | undefined) ?? null) : null;\r\n const selectedDate =\r\n mode === \"single\" ? ((value as Date | undefined) ?? null) : null;\r\n\r\n const handleDateClick = useCallback(\r\n (date: Date) => {\r\n if (mode === \"single\") {\r\n onChange?.(date);\r\n } else {\r\n const range = selectedRange || { start: null, end: null };\r\n if (!range.start || (range.start && range.end)) {\r\n onChange?.({ start: date, end: null });\r\n } else {\r\n if (isBefore(date, range.start)) {\r\n onChange?.({ start: date, end: range.start });\r\n } else if (isSameDay(date, range.start)) {\r\n onChange?.({ start: date, end: date });\r\n } else {\r\n onChange?.({ start: range.start, end: date });\r\n }\r\n }\r\n }\r\n },\r\n [mode, selectedRange, onChange],\r\n );\r\n\r\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\r\n if (e.key === \"Escape\") {\r\n setViewMode(\"calendar\");\r\n }\r\n }, []);\r\n\r\n const handlePresetClick = useCallback(\r\n (preset: { getValue: () => DateRange }) => {\r\n const range = preset.getValue();\r\n onChange?.(range);\r\n },\r\n [onChange],\r\n );\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n \"inline-flex flex-col rounded-xl border border-dp-border bg-dp-surface select-none antialiased\",\r\n \"shadow-[var(--dp-shadow)]\",\r\n className,\r\n )}\r\n onKeyDown={handleKeyDown}\r\n role=\"application\"\r\n aria-label=\"Date picker\"\r\n >\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-dp-border\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setViewDate(subMonths(viewDate, 1))}\r\n className=\"p-1.5 rounded-md hover:bg-dp-surface-hover text-dp-text-muted hover:text-dp-text transition-colors\"\r\n aria-label=\"Previous month\"\r\n >\r\n <ChevronLeft size={16} />\r\n </button>\r\n\r\n <div className=\"flex items-center gap-1\">\r\n <button\r\n type=\"button\"\r\n onClick={() =>\r\n setViewMode(viewMode === \"month\" ? \"calendar\" : \"month\")\r\n }\r\n className={cn(\r\n \"text-sm font-semibold px-2 py-1 rounded-md transition-colors\",\r\n viewMode === \"month\"\r\n ? \"bg-dp-surface-hover text-dp-text\"\r\n : \"hover:bg-dp-surface-hover text-dp-text\",\r\n )}\r\n >\r\n {format(viewDate, \"MMMM\")}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() =>\r\n setViewMode(viewMode === \"year\" ? \"calendar\" : \"year\")\r\n }\r\n className={cn(\r\n \"text-sm font-semibold px-2 py-1 rounded-md transition-colors\",\r\n viewMode === \"year\"\r\n ? \"bg-dp-surface-hover text-dp-text\"\r\n : \"hover:bg-dp-surface-hover text-dp-text\",\r\n )}\r\n >\r\n {format(viewDate, \"yyyy\")}\r\n </button>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n onClick={() => setViewDate(addMonths(viewDate, 1))}\r\n className=\"p-1.5 rounded-md hover:bg-dp-surface-hover text-dp-text-muted hover:text-dp-text transition-colors\"\r\n aria-label=\"Next month\"\r\n >\r\n <ChevronRight size={16} />\r\n </button>\r\n </div>\r\n\r\n {/* Body */}\r\n <div className=\"flex\">\r\n {/* Presets sidebar */}\r\n {presets && presets.length > 0 && (\r\n <div className=\"border-r border-dp-border p-3 min-w-[140px] flex flex-col gap-0.5\">\r\n {presets.map((preset) => (\r\n <button\r\n key={preset.label}\r\n type=\"button\"\r\n onClick={() => handlePresetClick(preset)}\r\n className=\"text-left text-xs font-medium px-2.5 py-1.5 rounded-md text-dp-text-muted hover:text-dp-text hover:bg-dp-surface-hover transition-colors\"\r\n >\r\n {preset.label}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n\r\n <div className=\"p-4 flex-1\">\r\n <AnimatePresence mode=\"wait\">\r\n {viewMode === \"calendar\" && (\r\n <motion.div\r\n key=\"calendar\"\r\n initial={{ opacity: 0, y: 4 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n exit={{ opacity: 0, y: -4 }}\r\n transition={{ duration: 0.15, ease: [0.25, 0.1, 0.25, 1] }}\r\n className=\"flex flex-col md:flex-row gap-6\"\r\n >\r\n {[...Array(numberOfMonths)].map((_, i) => (\r\n <MonthGrid\r\n key={i}\r\n month={addMonths(viewDate, i)}\r\n mode={mode}\r\n selectedDate={selectedDate}\r\n selectedRange={selectedRange}\r\n hoverDate={hoverDate}\r\n onDateClick={handleDateClick}\r\n onDateHover={setHoverDate}\r\n minDate={minDate}\r\n maxDate={maxDate}\r\n disabledDates={disabledDates}\r\n weekStart={weekStart}\r\n renderDay={renderDay}\r\n showLabel={numberOfMonths > 1}\r\n />\r\n ))}\r\n </motion.div>\r\n )}\r\n\r\n {viewMode === \"month\" && (\r\n <MonthSelector\r\n currentMonth={viewDate}\r\n onSelect={(m) => {\r\n setViewDate(setMonth(viewDate, m));\r\n setViewMode(\"calendar\");\r\n }}\r\n />\r\n )}\r\n\r\n {viewMode === \"year\" && (\r\n <YearSelector\r\n currentYear={getYear(viewDate)}\r\n onSelect={(y) => {\r\n setViewDate(setYear(viewDate, y));\r\n setViewMode(\"calendar\");\r\n }}\r\n minDate={minDate}\r\n maxDate={maxDate}\r\n />\r\n )}\r\n </AnimatePresence>\r\n </div>\r\n </div>\r\n\r\n {/* Footer */}\r\n {showFooter && (\r\n <div className=\"flex items-center justify-between px-4 py-3 bg-dp-footer border-t border-dp-border rounded-b-xl\">\r\n <button\r\n type=\"button\"\r\n onClick={onReset}\r\n className=\"flex items-center gap-1.5 text-xs font-medium text-dp-text-muted hover:text-dp-text transition-colors\"\r\n >\r\n <RotateCcw size={13} />\r\n Reset\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => onApply?.(value)}\r\n className=\"px-5 py-1.5 bg-primary text-primary-foreground text-xs font-semibold rounded hover:opacity-90 shadow-sm transition-all active:scale-[0.98]\"\r\n >\r\n Apply\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n },\r\n);\r\n\r\nDatePicker.displayName = \"DatePicker\";\r\n\r\nexport default DatePicker;\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/utils.ts","../src/components/date-picker/MonthGrid.tsx","../src/components/date-picker/MonthSelector.tsx","../src/components/date-picker/YearSelector.tsx","../src/components/date-picker/DatePicker.tsx","../src/components/ui/popover.tsx","../src/components/date-picker/DatePickerInput.tsx"],"names":["twMerge","clsx","useMemo","eachDayOfInterval","startOfMonth","endOfMonth","isBefore","isAfter","isSameDay","jsxs","jsx","format","isWithinInterval","React","getMonth","motion","useState","useCallback","subMonths","ChevronLeft","addMonths","ChevronRight","AnimatePresence","setMonth","getYear","setYear","RotateCcw","PopoverPrimitive","React3","CalendarIcon","X"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAOA,qBAAA,CAAQC,SAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACyBA,IAAM,aAAA,GAAgB,CAAC,IAAA,EAAM,IAAA,EAAM,MAAM,IAAA,EAAM,IAAA,EAAM,MAAM,IAAI,CAAA;AAC/D,IAAM,aAAA,GAAgB,CAAC,IAAA,EAAM,IAAA,EAAM,MAAM,IAAA,EAAM,IAAA,EAAM,MAAM,IAAI,CAAA;AAE/D,IAAM,YAAsC,CAAC;AAAA,EAC3C,KAAA;AAAA,EACA,IAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,gBAAgB,EAAC;AAAA,EACjB,SAAA,GAAY,CAAA;AAAA,EACZ,SAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,KAAM;AACJ,EAAA,MAAM,IAAA,GAAOC,cAAQ,MAAM;AACzB,IAAA,OAAOC,yBAAA,CAAkB;AAAA,MACvB,KAAA,EAAOC,qBAAa,KAAK,CAAA;AAAA,MACzB,GAAA,EAAKC,mBAAW,KAAK;AAAA,KACtB,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,QAAA,GAAW,SAAA,KAAc,CAAA,GAAI,aAAA,GAAgB,aAAA;AAEnD,EAAA,MAAM,QAAA,GAAWH,cAAQ,MAAM;AAC7B,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,CAAC,CAAA,CAAE,MAAA,EAAO;AACjC,IAAA,OAAO,cAAc,CAAA,GAAK,SAAA,KAAc,CAAA,GAAI,CAAA,GAAI,YAAY,CAAA,GAAK,SAAA;AAAA,EACnE,CAAA,EAAG,CAAC,IAAA,EAAM,SAAS,CAAC,CAAA;AAEpB,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,KAAe;AACjC,IAAA,IAAI,OAAA,IAAWI,gBAAA,CAAS,IAAA,EAAM,OAAO,GAAG,OAAO,IAAA;AAC/C,IAAA,IAAI,OAAA,IAAWC,eAAA,CAAQ,IAAA,EAAM,OAAO,GAAG,OAAO,IAAA;AAC9C,IAAA,OAAO,cAAc,IAAA,CAAK,CAAC,MAAMC,iBAAA,CAAU,CAAA,EAAG,IAAI,CAAC,CAAA;AAAA,EACrD,CAAA;AAEA,EAAA,uBACEC,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACZ,QAAA,EAAA;AAAA,IAAA,SAAA,oBACCC,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACb,QAAA,kBAAAA,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAA,EACb,QAAA,EAAAC,cAAA,CAAO,KAAA,EAAO,WAAW,CAAA,EAC5B,CAAA,EACF,CAAA;AAAA,mCAED,KAAA,EAAA,EAAI,SAAA,EAAU,2BACZ,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,qBACbD,cAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QAEC,SAAA,EAAU,wFAAA;AAAA,QAET,QAAA,EAAA;AAAA,OAAA;AAAA,MAHI;AAAA,KAKR,CAAA,EACH,CAAA;AAAA,oBACAD,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,CAAC,GAAG,KAAA,CAAM,QAAQ,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,EAAG,CAAA,qBAC5BC,cAAA,CAAC,SAAqB,SAAA,EAAU,SAAA,EAAA,EAAtB,CAAA,IAAA,EAAO,CAAC,EAAwB,CAC3C,CAAA;AAAA,MACA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AACjB,QAAA,MAAM,QAAA,GAAW,WAAW,GAAG,CAAA;AAC/B,QAAA,MAAM,UAAA,GACJ,SAAS,QAAA,GACL,YAAA,IAAgBF,kBAAU,GAAA,EAAK,YAAY,IAC3C,aAAA,KACE,aAAA,CAAc,SAASA,iBAAA,CAAU,GAAA,EAAK,cAAc,KAAK,CAAA,IACxD,cAAc,GAAA,IAAOA,iBAAA,CAAU,GAAA,EAAK,aAAA,CAAc,GAAG,CAAA,CAAA;AAE9D,QAAA,MAAM,OAAA,GACJ,SAAS,OAAA,KACT,aAAA,IAAA,IAAA,GAAA,MAAA,GAAA,aAAA,CAAe,UACfA,iBAAA,CAAU,GAAA,EAAK,cAAc,KAAK,CAAA;AACpC,QAAA,MAAM,KAAA,GACJ,SAAS,OAAA,KACT,aAAA,IAAA,IAAA,GAAA,MAAA,GAAA,aAAA,CAAe,QACfA,iBAAA,CAAU,GAAA,EAAK,cAAc,GAAG,CAAA;AAElC,QAAA,IAAI,OAAA,GAAU,KAAA;AACd,QAAA,IAAI,IAAA,KAAS,OAAA,KAAW,aAAA,IAAA,IAAA,GAAA,MAAA,GAAA,aAAA,CAAe,KAAA,CAAA,EAAO;AAC5C,UAAA,IAAI,cAAc,GAAA,EAAK;AACrB,YAAA,OAAA,GAAUI,yBAAiB,GAAA,EAAK;AAAA,cAC9B,OAAO,aAAA,CAAc,KAAA;AAAA,cACrB,KAAK,aAAA,CAAc;AAAA,aACpB,CAAA;AAAA,UACH,WAAW,SAAA,EAAW;AACpB,YAAA,MAAM,aAAaN,gBAAA,CAAS,SAAA,EAAW,cAAc,KAAK,CAAA,GACtD,YACA,aAAA,CAAc,KAAA;AAClB,YAAA,MAAM,WAAWA,gBAAA,CAAS,SAAA,EAAW,cAAc,KAAK,CAAA,GACpD,cAAc,KAAA,GACd,SAAA;AACJ,YAAA,OAAA,GAAUM,yBAAiB,GAAA,EAAK;AAAA,cAC9B,KAAA,EAAO,UAAA;AAAA,cACP,GAAA,EAAK;AAAA,aACN,CAAA;AAAA,UACH;AAAA,QACF;AAEA,QAAA,uBACEF,cAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,QAAA;AAAA,YACL,QAAA;AAAA,YACA,OAAA,EAAS,MAAM,CAAC,QAAA,IAAY,YAAY,GAAG,CAAA;AAAA,YAC3C,YAAA,EAAc,MAAM,CAAC,QAAA,IAAY,YAAY,GAAG,CAAA;AAAA,YAChD,YAAA,EAAc,MAAM,WAAA,CAAY,IAAI,CAAA;AAAA,YACpC,YAAA,EAAYC,cAAA,CAAO,GAAA,EAAK,MAAM,CAAA;AAAA,YAC9B,eAAA,EAAe,CAAC,CAAC,UAAA;AAAA,YACjB,SAAA,EAAW,EAAA;AAAA,cACT,uFAAA;AAAA,cACA,qGAAA;AAAA,cACA,qBAAA;AAAA;AAAA,cAEA,CAAC,UAAA,IACC,CAAC,OAAA,IACD,mDAAA;AAAA;AAAA,cAEF,UAAA,IACE,yEAAA;AAAA;AAAA,cAEF,IAAA,KAAS,YAAY,UAAA,IAAc,YAAA;AAAA;AAAA,cAEnC,OAAA,IAAW,CAAC,KAAA,IAAS,6BAAA;AAAA,cACrB,KAAA,IAAS,CAAC,OAAA,IAAW,6BAAA;AAAA,cACrB,WAAW,KAAA,IAAS,YAAA;AAAA;AAAA,cAEpB,OAAA,IACE,CAAC,UAAA,IACD,+DAAA;AAAA;AAAA,cAEF,QAAA,IACE;AAAA,aACJ;AAAA,YAEC,sBAAY,SAAA,CAAU,GAAG,CAAA,GAAIA,cAAA,CAAO,KAAK,GAAG;AAAA,WAAA;AAAA,UAlCxC,IAAI,WAAA;AAAY,SAmCvB;AAAA,MAEJ,CAAC;AAAA,KAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ,CAAA;AAEA,IAAO,iBAAA,GAAQE,wBAAA,CAAM,IAAA,CAAK,SAAS,CAAA;ACrKnC,IAAM,gBAA8C,CAAC;AAAA,EACnD,YAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,OAAA,GAAUC,iBAAS,YAAY,CAAA;AAErC,EAAA,uBACEJ,cAAAA;AAAA,IAACK,mBAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MAEC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MAC5B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MAC5B,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,MAC1B,UAAA,EAAY,EAAE,QAAA,EAAU,IAAA,EAAM,IAAA,EAAM,CAAC,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,CAAC,CAAA,EAAE;AAAA,MACzD,SAAA,EAAU,qDAAA;AAAA,MAET,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,EAAA,EAAI,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBAClCL,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,MAAM,QAAA,CAAS,CAAC,CAAA;AAAA,UACzB,SAAA,EAAW,EAAA;AAAA,YACT,wEAAA;AAAA,YACA,OAAA,KAAY,IACR,sDAAA,GACA;AAAA,WACN;AAAA,UAEC,QAAA,EAAAC,eAAO,IAAI,IAAA,CAAK,MAAM,CAAA,EAAG,CAAC,GAAG,KAAK;AAAA,SAAA;AAAA,QAV9B;AAAA,OAYR;AAAA,KAAA;AAAA,IArBG;AAAA,GAsBN;AAEJ,CAAA;AAEA,IAAO,qBAAA,GAAQ,aAAA;ACjCf,IAAM,eAA4C,CAAC;AAAA,EACjD,WAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,EAAA,EAAG,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM,WAAA,GAAc,CAAA,GAAI,CAAC,CAAA;AAEtE,EAAA,uBACED,cAAAA;AAAA,IAACK,mBAAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MAEC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MAC5B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MAC5B,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,MAC1B,UAAA,EAAY,EAAE,QAAA,EAAU,IAAA,EAAM,IAAA,EAAM,CAAC,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,CAAC,CAAA,EAAE;AAAA,MACzD,SAAA,EAAU,qDAAA;AAAA,MAET,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM;AAChB,QAAA,MAAM,QAAA,GACH,WAAW,CAAA,GAAI,OAAA,CAAQ,aAAY,IACnC,OAAA,IAAW,CAAA,GAAI,OAAA,CAAQ,WAAA,EAAY;AACtC,QAAA,uBACEL,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,QAAA;AAAA,YACL,QAAA,EAAU,CAAC,CAAC,QAAA;AAAA,YACZ,OAAA,EAAS,MAAM,CAAC,QAAA,IAAY,SAAS,CAAC,CAAA;AAAA,YACtC,SAAA,EAAW,EAAA;AAAA,cACT,wEAAA;AAAA,cACA,WAAA,KAAgB,IACZ,sDAAA,GACA,wCAAA;AAAA,cACJ,QAAA,IAAY;AAAA,aACd;AAAA,YAEC,QAAA,EAAA;AAAA,WAAA;AAAA,UAZI;AAAA,SAaP;AAAA,MAEJ,CAAC;AAAA,KAAA;AAAA,IA5BG;AAAA,GA6BN;AAEJ,CAAA;AAEA,IAAO,oBAAA,GAAQ,YAAA;ACjCR,IAAM,aAAaG,wBAAAA,CAAM,UAAA;AAAA,EAC9B,CACE;AAAA,IACE,IAAA,GAAO,QAAA;AAAA,IACP,KAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,aAAA;AAAA,IACA,SAAA,GAAY,CAAA;AAAA,IACZ,cAAA,GAAiB,CAAA;AAAA,IACjB,UAAA,GAAa,IAAA;AAAA,IACb,SAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,KAEF,GAAA,KACG;AACH,IAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIG,eAAS,MAAM;AAC7C,MAAA,IAAI,IAAA,KAAS,QAAA,IAAY,KAAA,YAAiB,IAAA,EAAM,OAAO,KAAA;AACvD,MAAA,IAAI,IAAA,KAAS,OAAA,IAAW,KAAA,IAAS,OAAA,IAAW,SAAS,KAAA,CAAM,KAAA;AACzD,QAAA,OAAO,KAAA,CAAM,KAAA;AACf,MAAA,2BAAW,IAAA,EAAK;AAAA,IAClB,CAAC,CAAA;AACD,IAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAmB,UAAU,CAAA;AAC7D,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAsB,IAAI,CAAA;AAE5D,IAAA,MAAM,aAAA,GACJ,IAAA,KAAS,OAAA,GAAY,KAAA,IAAA,IAAA,GAAA,KAAA,GAAmC,IAAA,GAAQ,IAAA;AAClE,IAAA,MAAM,YAAA,GACJ,IAAA,KAAS,QAAA,GAAa,KAAA,IAAA,IAAA,GAAA,KAAA,GAA8B,IAAA,GAAQ,IAAA;AAE9D,IAAA,MAAM,eAAA,GAAkBC,iBAAA;AAAA,MACtB,CAAC,IAAA,KAAe;AACd,QAAA,IAAI,SAAS,QAAA,EAAU;AACrB,UAAA,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAW,IAAA,CAAA;AAAA,QACb,CAAA,MAAO;AACL,UAAA,MAAM,QAAQ,aAAA,IAAiB,EAAE,KAAA,EAAO,IAAA,EAAM,KAAK,IAAA,EAAK;AACxD,UAAA,IAAI,CAAC,KAAA,CAAM,KAAA,IAAU,KAAA,CAAM,KAAA,IAAS,MAAM,GAAA,EAAM;AAC9C,YAAA,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAW,EAAE,KAAA,EAAO,IAAA,EAAM,GAAA,EAAK,IAAA,EAAK,CAAA;AAAA,UACtC,CAAA,MAAO;AACL,YAAA,IAAIX,gBAAAA,CAAS,IAAA,EAAM,KAAA,CAAM,KAAK,CAAA,EAAG;AAC/B,cAAA,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAW,EAAE,KAAA,EAAO,IAAA,EAAM,GAAA,EAAK,MAAM,KAAA,EAAM,CAAA;AAAA,YAC7C,CAAA,MAAA,IAAWE,iBAAAA,CAAU,IAAA,EAAM,KAAA,CAAM,KAAK,CAAA,EAAG;AACvC,cAAA,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAW,EAAE,KAAA,EAAO,IAAA,EAAM,GAAA,EAAK,IAAA,EAAK,CAAA;AAAA,YACtC,CAAA,MAAO;AACL,cAAA,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAW,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,KAAK,IAAA,EAAK,CAAA;AAAA,YAC7C;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAA;AAAA,MACA,CAAC,IAAA,EAAM,aAAA,EAAe,QAAQ;AAAA,KAChC;AAEA,IAAA,MAAM,aAAA,GAAgBS,iBAAA,CAAY,CAAC,CAAA,KAA2B;AAC5D,MAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,QAAA,WAAA,CAAY,UAAU,CAAA;AAAA,MACxB;AAAA,IACF,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAM,iBAAA,GAAoBA,iBAAA;AAAA,MACxB,CAAC,MAAA,KAA0C;AACzC,QAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,EAAS;AAC9B,QAAA,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAW,KAAA,CAAA;AAAA,MACb,CAAA;AAAA,MACA,CAAC,QAAQ;AAAA,KACX;AAEA,IAAA,uBACER,eAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,+FAAA;AAAA,UACA,2BAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,SAAA,EAAW,aAAA;AAAA,QACX,IAAA,EAAK,aAAA;AAAA,QACL,YAAA,EAAW,aAAA;AAAA,QAGX,QAAA,EAAA;AAAA,0BAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uEAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,SAAS,MAAM,WAAA,CAAYQ,iBAAA,CAAU,QAAA,EAAU,CAAC,CAAC,CAAA;AAAA,gBACjD,SAAA,EAAU,oGAAA;AAAA,gBACV,YAAA,EAAW,gBAAA;AAAA,gBAEX,QAAA,kBAAAR,cAAAA,CAACS,uBAAA,EAAA,EAAY,IAAA,EAAM,EAAA,EAAI;AAAA;AAAA,aACzB;AAAA,4BAEAV,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,cAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,SAAS,MACP,WAAA,CAAY,QAAA,KAAa,OAAA,GAAU,aAAa,OAAO,CAAA;AAAA,kBAEzD,SAAA,EAAW,EAAA;AAAA,oBACT,8DAAA;AAAA,oBACA,QAAA,KAAa,UACT,kCAAA,GACA;AAAA,mBACN;AAAA,kBAEC,QAAA,EAAAC,cAAAA,CAAO,QAAA,EAAU,MAAM;AAAA;AAAA,eAC1B;AAAA,8BACAD,cAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,SAAS,MACP,WAAA,CAAY,QAAA,KAAa,MAAA,GAAS,aAAa,MAAM,CAAA;AAAA,kBAEvD,SAAA,EAAW,EAAA;AAAA,oBACT,8DAAA;AAAA,oBACA,QAAA,KAAa,SACT,kCAAA,GACA;AAAA,mBACN;AAAA,kBAEC,QAAA,EAAAC,cAAAA,CAAO,QAAA,EAAU,MAAM;AAAA;AAAA;AAC1B,aAAA,EACF,CAAA;AAAA,4BAEAD,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,SAAS,MAAM,WAAA,CAAYU,iBAAA,CAAU,QAAA,EAAU,CAAC,CAAC,CAAA;AAAA,gBACjD,SAAA,EAAU,oGAAA;AAAA,gBACV,YAAA,EAAW,YAAA;AAAA,gBAEX,QAAA,kBAAAV,cAAAA,CAACW,wBAAA,EAAA,EAAa,IAAA,EAAM,EAAA,EAAI;AAAA;AAAA;AAC1B,WAAA,EACF,CAAA;AAAA,0BAGAZ,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EAEZ,QAAA,EAAA;AAAA,YAAA,OAAA,IAAW,OAAA,CAAQ,MAAA,GAAS,CAAA,oBAC3BC,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mEAAA,EACZ,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACZA,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBAEC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,MAAM,iBAAA,CAAkB,MAAM,CAAA;AAAA,gBACvC,SAAA,EAAU,0IAAA;AAAA,gBAET,QAAA,EAAA,MAAA,CAAO;AAAA,eAAA;AAAA,cALH,MAAA,CAAO;AAAA,aAOf,CAAA,EACH,CAAA;AAAA,4BAGFA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cACb,QAAA,kBAAAD,eAAAA,CAACa,4BAAA,EAAA,EAAgB,IAAA,EAAK,MAAA,EACnB,QAAA,EAAA;AAAA,cAAA,QAAA,KAAa,8BACZZ,cAAAA;AAAA,gBAACK,mBAAAA,CAAO,GAAA;AAAA,gBAAP;AAAA,kBAEC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,kBAC5B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,kBAC5B,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,kBAC1B,UAAA,EAAY,EAAE,QAAA,EAAU,IAAA,EAAM,IAAA,EAAM,CAAC,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,CAAC,CAAA,EAAE;AAAA,kBACzD,SAAA,EAAU,iCAAA;AAAA,kBAET,QAAA,EAAA,CAAC,GAAG,KAAA,CAAM,cAAc,CAAC,EAAE,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBAClCL,cAAAA;AAAA,oBAAC,iBAAA;AAAA,oBAAA;AAAA,sBAEC,KAAA,EAAOU,iBAAA,CAAU,QAAA,EAAU,CAAC,CAAA;AAAA,sBAC5B,IAAA;AAAA,sBACA,YAAA;AAAA,sBACA,aAAA;AAAA,sBACA,SAAA;AAAA,sBACA,WAAA,EAAa,eAAA;AAAA,sBACb,WAAA,EAAa,YAAA;AAAA,sBACb,OAAA;AAAA,sBACA,OAAA;AAAA,sBACA,aAAA;AAAA,sBACA,SAAA;AAAA,sBACA,SAAA;AAAA,sBACA,WAAW,cAAA,GAAiB;AAAA,qBAAA;AAAA,oBAbvB;AAAA,mBAeR;AAAA,iBAAA;AAAA,gBAxBG;AAAA,eAyBN;AAAA,cAGD,QAAA,KAAa,2BACZV,cAAAA;AAAA,gBAAC,qBAAA;AAAA,gBAAA;AAAA,kBACC,YAAA,EAAc,QAAA;AAAA,kBACd,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,oBAAA,WAAA,CAAYa,gBAAA,CAAS,QAAA,EAAU,CAAC,CAAC,CAAA;AACjC,oBAAA,WAAA,CAAY,UAAU,CAAA;AAAA,kBACxB;AAAA;AAAA,eACF;AAAA,cAGD,QAAA,KAAa,0BACZb,cAAAA;AAAA,gBAAC,oBAAA;AAAA,gBAAA;AAAA,kBACC,WAAA,EAAac,gBAAQ,QAAQ,CAAA;AAAA,kBAC7B,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,oBAAA,WAAA,CAAYC,eAAA,CAAQ,QAAA,EAAU,CAAC,CAAC,CAAA;AAChC,oBAAA,WAAA,CAAY,UAAU,CAAA;AAAA,kBACxB,CAAA;AAAA,kBACA,OAAA;AAAA,kBACA;AAAA;AAAA;AACF,aAAA,EAEJ,CAAA,EACF;AAAA,WAAA,EACF,CAAA;AAAA,UAGC,UAAA,oBACChB,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iGAAA,EACb,QAAA,EAAA;AAAA,4BAAAA,eAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,OAAA;AAAA,gBACT,SAAA,EAAU,uGAAA;AAAA,gBAEV,QAAA,EAAA;AAAA,kCAAAC,cAAAA,CAACgB,qBAAA,EAAA,EAAU,IAAA,EAAM,EAAA,EAAI,CAAA;AAAA,kBAAE;AAAA;AAAA;AAAA,aAEzB;AAAA,4BACAhB,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,MAAM,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAU,KAAA,CAAA;AAAA,gBACzB,SAAA,EAAU,6IAAA;AAAA,gBACX,QAAA,EAAA;AAAA;AAAA;AAED,WAAA,EACF;AAAA;AAAA;AAAA,KAEJ;AAAA,EAEJ;AACF;AAEA,UAAA,CAAW,WAAA,GAAc,YAAA;AAEzB,IAAO,kBAAA,GAAQ;AC7Pf,IAAM,OAAA,GAA2BiB,2BAAA,CAAA,IAAA;AAEjC,IAAM,cAAA,GAAkCA,2BAAA,CAAA,OAAA;AAExC,IAAM,iBAAuBC,gBAAA,CAAA,UAAA,CAG3B,CAAC,EAAE,SAAA,EAAW,QAAQ,QAAA,EAAU,UAAA,GAAa,CAAA,EAAG,GAAG,OAAM,EAAG,GAAA,qBAC5DlB,cAAAA,CAAkBiB,2BAAA,CAAA,MAAA,EAAjB,EACC,QAAA,kBAAAjB,cAAAA;AAAA,EAAkBiB,2BAAA,CAAA,OAAA;AAAA,EAAjB;AAAA,IACC,GAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA,EAAW,EAAA;AAAA,MACT,4aAAA;AAAA,MACA;AAAA,KACF;AAAA,IACC,GAAG;AAAA;AACN,CAAA,EACF,CACD,CAAA;AACD,cAAA,CAAe,cAA+BA,2BAAA,CAAA,OAAA,CAAQ,WAAA;ACO/C,IAAM,kBAAkD,CAAC;AAAA,EAC9D,IAAA,GAAO,QAAA;AAAA,EACP,KAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA,GAAgB,aAAA;AAAA,EAChB,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA,iBAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,SAAA,GAAY,IAAA;AAAA,EACZ,KAAA,GAAQ,OAAA;AAAA,EACR,KAAA;AAAA,EACA,cAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIX,eAAS,KAAK,CAAA;AAEtC,EAAA,MAAM,kBAAA,GACJ,IAAA,KAAS,OAAA,GAAU,sBAAA,GAAyB,kBAAA;AAE9C,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,IAAI,IAAA,KAAS,QAAA,IAAY,KAAA,YAAiB,IAAA,EAAM;AAC9C,MAAA,OAAOL,cAAAA,CAAO,OAAO,aAAa,CAAA;AAAA,IACpC;AACA,IAAA,IAAI,IAAA,KAAS,OAAA,IAAW,KAAA,IAAS,OAAA,IAAW,KAAA,EAAO;AACjD,MAAA,MAAM,KAAA,GAAQ,KAAA;AACd,MAAA,IAAI,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,GAAA,EAAK;AAC5B,QAAA,OAAO,CAAA,EAAGA,cAAAA,CAAO,KAAA,CAAM,KAAA,EAAO,aAAa,CAAC,CAAA,QAAA,EAAMA,cAAAA,CAAO,KAAA,CAAM,GAAA,EAAK,aAAa,CAAC,CAAA,CAAA;AAAA,MACpF;AACA,MAAA,IAAI,MAAM,KAAA,EAAO;AACf,QAAA,OAAO,CAAA,EAAGA,cAAAA,CAAO,KAAA,CAAM,KAAA,EAAO,aAAa,CAAC,CAAA,WAAA,CAAA;AAAA,MAC9C;AAAA,IACF;AACA,IAAA,OAAO,EAAA;AAAA,EACT,CAAA,GAAG;AAEH,EAAA,MAAM,WAAA,GAAcM,iBAAAA;AAAA,IAClB,CAAC,GAAA,KAAsC;AACrC,MAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAU,GAAA,CAAA;AACV,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,WAAA,GAAcA,iBAAAA;AAAA,IAClB,CAAC,CAAA,KAAwB;AACvB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,EAAA;AAAA,IACF,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,YAAA,GAAeA,iBAAAA;AAAA,IACnB,CAAC,GAAA,KAA0B;AACzB,MAAA,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAW,GAAA,CAAA;AAEX,MAAA,IAAI,SAAS,QAAA,EAAU;AACrB,QAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,MACf;AAAA,IACF,CAAA;AAAA,IACA,CAAC,UAAU,IAAI;AAAA,GACjB;AAEA,EAAA,uBACER,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACZ,QAAA,EAAA;AAAA,IAAA,KAAA,oBACCC,cAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,uCAAuC,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBAEhED,eAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAY,cAAc,OAAA,EACjC,QAAA,EAAA;AAAA,sBAAAC,cAAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAO,IAAA,EACrB,QAAA,kBAAAD,eAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,QAAA;AAAA,UACA,SAAA,EAAW,EAAA;AAAA,YACT,+FAAA;AAAA,YACA,0CAAA;AAAA,YACA,uHAAA;AAAA,YACA,iDAAA;AAAA,YACA,CAAC,YAAA,IAAgB,uBAAA;AAAA,YACjB,YAAA,IAAgB,iBAAA;AAAA,YAChB;AAAA,WACF;AAAA,UAEA,QAAA,EAAA;AAAA,4BAAAC,cAAAA,CAACmB,wBAAA,EAAA,EAAa,SAAA,EAAU,wCAAA,EAAyC,CAAA;AAAA,4BACjEnB,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,2BAAA,EACb,QAAA,EAAA,YAAA,IAAgB,eAAe,kBAAA,EAClC,CAAA;AAAA,YACC,SAAA,IAAa,gCACZA,cAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,QAAA,EAAU,CAAA;AAAA,gBACV,OAAA,EAAS,WAAA;AAAA,gBACT,WAAW,CAAC,CAAA,KAAM,EAAE,GAAA,KAAQ,OAAA,IAAW,YAAY,CAAQ,CAAA;AAAA,gBAC3D,SAAA,EAAU,yDAAA;AAAA,gBACV,YAAA,EAAW,iBAAA;AAAA,gBAEX,QAAA,kBAAAA,cAAAA,CAACoB,aAAA,EAAA,EAAE,SAAA,EAAU,mCAAA,EAAoC;AAAA;AAAA;AACnD;AAAA;AAAA,OAEJ,EACF,CAAA;AAAA,sBACApB,cAAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,EAAA,CAAG,gCAAA,EAAkC,gBAAgB,CAAA;AAAA,UAChE,KAAA;AAAA,UACA,UAAA,EAAY,CAAA;AAAA,UAEZ,QAAA,kBAAAA,cAAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,IAAA;AAAA,cACA,KAAA;AAAA,cACA,QAAA,EAAU,YAAA;AAAA,cACV,OAAA,EAAS,IAAA,KAAS,OAAA,GAAU,WAAA,GAAc,MAAA;AAAA,cAC1C,OAAA;AAAA,cACA,cAAA,EAAgB,cAAA,IAAA,IAAA,GAAA,cAAA,GAAmB,IAAA,KAAS,OAAA,GAAU,CAAA,GAAI,CAAA;AAAA,cAC1D,YAAY,IAAA,KAAS,OAAA;AAAA,cACrB,OAAA;AAAA,cACA,OAAA;AAAA,cACA,OAAA;AAAA,cACA,aAAA;AAAA,cACA,SAAA;AAAA,cACA,SAAA;AAAA,cACA,SAAA,EAAW,EAAA,CAAG,sBAAA,EAAwB,iBAAiB;AAAA;AAAA;AACzD;AAAA;AACF,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","import React, { useMemo } from \"react\";\r\nimport {\r\n format,\r\n startOfMonth,\r\n endOfMonth,\r\n eachDayOfInterval,\r\n isSameDay,\r\n isWithinInterval,\r\n isBefore,\r\n isAfter,\r\n} from \"date-fns\";\r\nimport type { DatePickerMode, DateRange } from \"./types\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\ninterface MonthGridProps {\r\n month: Date;\r\n mode: DatePickerMode;\r\n selectedDate: Date | null;\r\n selectedRange: DateRange | null;\r\n hoverDate: Date | null;\r\n onDateClick: (date: Date) => void;\r\n onDateHover: (date: Date | null) => void;\r\n minDate?: Date;\r\n maxDate?: Date;\r\n disabledDates?: Date[];\r\n weekStart?: 0 | 1;\r\n renderDay?: (date: Date) => React.ReactNode;\r\n showLabel?: boolean;\r\n}\r\n\r\nconst WEEK_DAYS_SUN = [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"];\r\nconst WEEK_DAYS_MON = [\"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\", \"Su\"];\r\n\r\nconst MonthGrid: React.FC<MonthGridProps> = ({\r\n month,\r\n mode,\r\n selectedDate,\r\n selectedRange,\r\n hoverDate,\r\n onDateClick,\r\n onDateHover,\r\n minDate,\r\n maxDate,\r\n disabledDates = [],\r\n weekStart = 0,\r\n renderDay,\r\n showLabel = true,\r\n}) => {\r\n const days = useMemo(() => {\r\n return eachDayOfInterval({\r\n start: startOfMonth(month),\r\n end: endOfMonth(month),\r\n });\r\n }, [month]);\r\n\r\n const weekDays = weekStart === 1 ? WEEK_DAYS_MON : WEEK_DAYS_SUN;\r\n\r\n const startPad = useMemo(() => {\r\n const dayOfWeek = days[0].getDay();\r\n return weekStart === 1 ? (dayOfWeek === 0 ? 6 : dayOfWeek - 1) : dayOfWeek;\r\n }, [days, weekStart]);\r\n\r\n const isDisabled = (date: Date) => {\r\n if (minDate && isBefore(date, minDate)) return true;\r\n if (maxDate && isAfter(date, maxDate)) return true;\r\n return disabledDates.some((d) => isSameDay(d, date));\r\n };\r\n\r\n return (\r\n <div className=\"flex-1 min-w-[252px]\">\r\n {showLabel && (\r\n <div className=\"text-center mb-3\">\r\n <span className=\"text-sm font-medium text-dp-text\">\r\n {format(month, \"MMMM yyyy\")}\r\n </span>\r\n </div>\r\n )}\r\n <div className=\"grid grid-cols-7 mb-1.5\">\r\n {weekDays.map((d) => (\r\n <span\r\n key={d}\r\n className=\"text-[11px] font-semibold text-dp-text-muted text-center uppercase tracking-wider py-1\"\r\n >\r\n {d}\r\n </span>\r\n ))}\r\n </div>\r\n <div className=\"grid grid-cols-7\">\r\n {[...Array(startPad)].map((_, i) => (\r\n <div key={`pad-${i}`} className=\"h-9 w-9\" />\r\n ))}\r\n {days.map((day) => {\r\n const disabled = isDisabled(day);\r\n const isSelected =\r\n mode === \"single\"\r\n ? selectedDate && isSameDay(day, selectedDate)\r\n : selectedRange &&\r\n ((selectedRange.start && isSameDay(day, selectedRange.start)) ||\r\n (selectedRange.end && isSameDay(day, selectedRange.end)));\r\n\r\n const isStart =\r\n mode === \"range\" &&\r\n selectedRange?.start &&\r\n isSameDay(day, selectedRange.start);\r\n const isEnd =\r\n mode === \"range\" &&\r\n selectedRange?.end &&\r\n isSameDay(day, selectedRange.end);\r\n\r\n let inRange = false;\r\n if (mode === \"range\" && selectedRange?.start) {\r\n if (selectedRange.end) {\r\n inRange = isWithinInterval(day, {\r\n start: selectedRange.start,\r\n end: selectedRange.end,\r\n });\r\n } else if (hoverDate) {\r\n const rangeStart = isBefore(hoverDate, selectedRange.start)\r\n ? hoverDate\r\n : selectedRange.start;\r\n const rangeEnd = isBefore(hoverDate, selectedRange.start)\r\n ? selectedRange.start\r\n : hoverDate;\r\n inRange = isWithinInterval(day, {\r\n start: rangeStart,\r\n end: rangeEnd,\r\n });\r\n }\r\n }\r\n\r\n return (\r\n <button\r\n key={day.toISOString()}\r\n type=\"button\"\r\n disabled={disabled}\r\n onClick={() => !disabled && onDateClick(day)}\r\n onMouseEnter={() => !disabled && onDateHover(day)}\r\n onMouseLeave={() => onDateHover(null)}\r\n aria-label={format(day, \"PPPP\")}\r\n aria-selected={!!isSelected}\r\n className={cn(\r\n \"relative h-9 w-9 text-sm flex items-center justify-center transition-all tabular-nums\",\r\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\",\r\n \"active:scale-[0.96]\",\r\n // Default\r\n !isSelected &&\r\n !inRange &&\r\n \"text-dp-text hover:bg-dp-surface-hover rounded-lg\",\r\n // Selected (start/end/single)\r\n isSelected &&\r\n \"bg-dp-surface-active text-dp-text-selected z-10 shadow-sm font-semibold\",\r\n // Single mode selected\r\n mode === \"single\" && isSelected && \"rounded-lg\",\r\n // Range endpoints\r\n isStart && !isEnd && \"rounded-l-lg rounded-r-none\",\r\n isEnd && !isStart && \"rounded-r-lg rounded-l-none\",\r\n isStart && isEnd && \"rounded-lg\",\r\n // In range but not selected\r\n inRange &&\r\n !isSelected &&\r\n \"bg-[hsl(var(--dp-range-tint)/0.08)] text-primary rounded-none\",\r\n // Disabled\r\n disabled &&\r\n \"text-dp-text-muted/40 cursor-not-allowed hover:bg-transparent\",\r\n )}\r\n >\r\n {renderDay ? renderDay(day) : format(day, \"d\")}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default React.memo(MonthGrid);\r\n","import React from \"react\";\r\nimport { format, getMonth } from \"date-fns\";\r\nimport { motion } from \"framer-motion\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\ninterface MonthSelectorProps {\r\n currentMonth: Date;\r\n onSelect: (month: number) => void;\r\n}\r\n\r\nconst MonthSelector: React.FC<MonthSelectorProps> = ({\r\n currentMonth,\r\n onSelect,\r\n}) => {\r\n const current = getMonth(currentMonth);\r\n\r\n return (\r\n <motion.div\r\n key=\"month-selector\"\r\n initial={{ opacity: 0, y: 4 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n exit={{ opacity: 0, y: -4 }}\r\n transition={{ duration: 0.15, ease: [0.25, 0.1, 0.25, 1] }}\r\n className=\"grid grid-cols-3 gap-2 w-full max-w-[320px] mx-auto\"\r\n >\r\n {Array.from({ length: 12 }).map((_, i) => (\r\n <button\r\n key={i}\r\n type=\"button\"\r\n onClick={() => onSelect(i)}\r\n className={cn(\r\n \"py-3 text-sm font-medium rounded-lg transition-all active:scale-[0.97]\",\r\n current === i\r\n ? \"bg-dp-surface-active text-dp-text-selected shadow-sm\"\r\n : \"hover:bg-dp-surface-hover text-dp-text\",\r\n )}\r\n >\r\n {format(new Date(2024, i, 1), \"MMM\")}\r\n </button>\r\n ))}\r\n </motion.div>\r\n );\r\n};\r\n\r\nexport default MonthSelector;\r\n","import React from \"react\";\r\nimport { motion } from \"framer-motion\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\ninterface YearSelectorProps {\r\n currentYear: number;\r\n onSelect: (year: number) => void;\r\n minDate?: Date;\r\n maxDate?: Date;\r\n}\r\n\r\nconst YearSelector: React.FC<YearSelectorProps> = ({\r\n currentYear,\r\n onSelect,\r\n minDate,\r\n maxDate,\r\n}) => {\r\n const years = Array.from({ length: 12 }, (_, i) => currentYear - 5 + i);\r\n\r\n return (\r\n <motion.div\r\n key=\"year-selector\"\r\n initial={{ opacity: 0, y: 4 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n exit={{ opacity: 0, y: -4 }}\r\n transition={{ duration: 0.15, ease: [0.25, 0.1, 0.25, 1] }}\r\n className=\"grid grid-cols-3 gap-2 w-full max-w-[320px] mx-auto\"\r\n >\r\n {years.map((y) => {\r\n const disabled =\r\n (minDate && y < minDate.getFullYear()) ||\r\n (maxDate && y > maxDate.getFullYear());\r\n return (\r\n <button\r\n key={y}\r\n type=\"button\"\r\n disabled={!!disabled}\r\n onClick={() => !disabled && onSelect(y)}\r\n className={cn(\r\n \"py-3 text-sm font-medium rounded-lg transition-all active:scale-[0.97]\",\r\n currentYear === y\r\n ? \"bg-dp-surface-active text-dp-text-selected shadow-sm\"\r\n : \"hover:bg-dp-surface-hover text-dp-text\",\r\n disabled && \"opacity-30 cursor-not-allowed\",\r\n )}\r\n >\r\n {y}\r\n </button>\r\n );\r\n })}\r\n </motion.div>\r\n );\r\n};\r\n\r\nexport default YearSelector;\r\n","import React, { useState, useCallback, useEffect } from \"react\";\r\nimport {\r\n format,\r\n addMonths,\r\n subMonths,\r\n setMonth,\r\n setYear,\r\n getYear,\r\n isBefore,\r\n isSameDay,\r\n} from \"date-fns\";\r\nimport { ChevronLeft, ChevronRight, RotateCcw } from \"lucide-react\";\r\nimport { AnimatePresence, motion } from \"framer-motion\";\r\nimport MonthGrid from \"./MonthGrid\";\r\nimport MonthSelector from \"./MonthSelector\";\r\nimport YearSelector from \"./YearSelector\";\r\nimport type { DatePickerProps, DateRange } from \"./types\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\ntype ViewMode = \"calendar\" | \"month\" | \"year\";\r\n\r\nexport const DatePicker = React.forwardRef<HTMLDivElement, DatePickerProps>(\r\n (\r\n {\r\n mode = \"single\",\r\n value,\r\n onChange,\r\n onApply,\r\n onReset,\r\n minDate,\r\n maxDate,\r\n disabledDates,\r\n weekStart = 0,\r\n numberOfMonths = 2,\r\n showFooter = true,\r\n className,\r\n renderDay,\r\n presets,\r\n },\r\n ref,\r\n ) => {\r\n const [viewDate, setViewDate] = useState(() => {\r\n if (mode === \"single\" && value instanceof Date) return value;\r\n if (mode === \"range\" && value && \"start\" in value && value.start)\r\n return value.start;\r\n return new Date();\r\n });\r\n const [viewMode, setViewMode] = useState<ViewMode>(\"calendar\");\r\n const [hoverDate, setHoverDate] = useState<Date | null>(null);\r\n\r\n const selectedRange =\r\n mode === \"range\" ? ((value as DateRange | undefined) ?? null) : null;\r\n const selectedDate =\r\n mode === \"single\" ? ((value as Date | undefined) ?? null) : null;\r\n\r\n const handleDateClick = useCallback(\r\n (date: Date) => {\r\n if (mode === \"single\") {\r\n onChange?.(date);\r\n } else {\r\n const range = selectedRange || { start: null, end: null };\r\n if (!range.start || (range.start && range.end)) {\r\n onChange?.({ start: date, end: null });\r\n } else {\r\n if (isBefore(date, range.start)) {\r\n onChange?.({ start: date, end: range.start });\r\n } else if (isSameDay(date, range.start)) {\r\n onChange?.({ start: date, end: date });\r\n } else {\r\n onChange?.({ start: range.start, end: date });\r\n }\r\n }\r\n }\r\n },\r\n [mode, selectedRange, onChange],\r\n );\r\n\r\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\r\n if (e.key === \"Escape\") {\r\n setViewMode(\"calendar\");\r\n }\r\n }, []);\r\n\r\n const handlePresetClick = useCallback(\r\n (preset: { getValue: () => DateRange }) => {\r\n const range = preset.getValue();\r\n onChange?.(range);\r\n },\r\n [onChange],\r\n );\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n \"inline-flex flex-col rounded-xl border border-dp-border bg-dp-surface select-none antialiased\",\r\n \"shadow-[var(--dp-shadow)]\",\r\n className,\r\n )}\r\n onKeyDown={handleKeyDown}\r\n role=\"application\"\r\n aria-label=\"Date picker\"\r\n >\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-dp-border\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setViewDate(subMonths(viewDate, 1))}\r\n className=\"p-1.5 rounded-md hover:bg-dp-surface-hover text-dp-text-muted hover:text-dp-text transition-colors\"\r\n aria-label=\"Previous month\"\r\n >\r\n <ChevronLeft size={16} />\r\n </button>\r\n\r\n <div className=\"flex items-center gap-1\">\r\n <button\r\n type=\"button\"\r\n onClick={() =>\r\n setViewMode(viewMode === \"month\" ? \"calendar\" : \"month\")\r\n }\r\n className={cn(\r\n \"text-sm font-semibold px-2 py-1 rounded-md transition-colors\",\r\n viewMode === \"month\"\r\n ? \"bg-dp-surface-hover text-dp-text\"\r\n : \"hover:bg-dp-surface-hover text-dp-text\",\r\n )}\r\n >\r\n {format(viewDate, \"MMMM\")}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() =>\r\n setViewMode(viewMode === \"year\" ? \"calendar\" : \"year\")\r\n }\r\n className={cn(\r\n \"text-sm font-semibold px-2 py-1 rounded-md transition-colors\",\r\n viewMode === \"year\"\r\n ? \"bg-dp-surface-hover text-dp-text\"\r\n : \"hover:bg-dp-surface-hover text-dp-text\",\r\n )}\r\n >\r\n {format(viewDate, \"yyyy\")}\r\n </button>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n onClick={() => setViewDate(addMonths(viewDate, 1))}\r\n className=\"p-1.5 rounded-md hover:bg-dp-surface-hover text-dp-text-muted hover:text-dp-text transition-colors\"\r\n aria-label=\"Next month\"\r\n >\r\n <ChevronRight size={16} />\r\n </button>\r\n </div>\r\n\r\n {/* Body */}\r\n <div className=\"flex\">\r\n {/* Presets sidebar */}\r\n {presets && presets.length > 0 && (\r\n <div className=\"border-r border-dp-border p-3 min-w-[140px] flex flex-col gap-0.5\">\r\n {presets.map((preset) => (\r\n <button\r\n key={preset.label}\r\n type=\"button\"\r\n onClick={() => handlePresetClick(preset)}\r\n className=\"text-left text-xs font-medium px-2.5 py-1.5 rounded-md text-dp-text-muted hover:text-dp-text hover:bg-dp-surface-hover transition-colors\"\r\n >\r\n {preset.label}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n\r\n <div className=\"p-4 flex-1\">\r\n <AnimatePresence mode=\"wait\">\r\n {viewMode === \"calendar\" && (\r\n <motion.div\r\n key=\"calendar\"\r\n initial={{ opacity: 0, y: 4 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n exit={{ opacity: 0, y: -4 }}\r\n transition={{ duration: 0.15, ease: [0.25, 0.1, 0.25, 1] }}\r\n className=\"flex flex-col md:flex-row gap-6\"\r\n >\r\n {[...Array(numberOfMonths)].map((_, i) => (\r\n <MonthGrid\r\n key={i}\r\n month={addMonths(viewDate, i)}\r\n mode={mode}\r\n selectedDate={selectedDate}\r\n selectedRange={selectedRange}\r\n hoverDate={hoverDate}\r\n onDateClick={handleDateClick}\r\n onDateHover={setHoverDate}\r\n minDate={minDate}\r\n maxDate={maxDate}\r\n disabledDates={disabledDates}\r\n weekStart={weekStart}\r\n renderDay={renderDay}\r\n showLabel={numberOfMonths > 1}\r\n />\r\n ))}\r\n </motion.div>\r\n )}\r\n\r\n {viewMode === \"month\" && (\r\n <MonthSelector\r\n currentMonth={viewDate}\r\n onSelect={(m) => {\r\n setViewDate(setMonth(viewDate, m));\r\n setViewMode(\"calendar\");\r\n }}\r\n />\r\n )}\r\n\r\n {viewMode === \"year\" && (\r\n <YearSelector\r\n currentYear={getYear(viewDate)}\r\n onSelect={(y) => {\r\n setViewDate(setYear(viewDate, y));\r\n setViewMode(\"calendar\");\r\n }}\r\n minDate={minDate}\r\n maxDate={maxDate}\r\n />\r\n )}\r\n </AnimatePresence>\r\n </div>\r\n </div>\r\n\r\n {/* Footer */}\r\n {showFooter && (\r\n <div className=\"flex items-center justify-between px-4 py-3 bg-dp-footer border-t border-dp-border rounded-b-xl\">\r\n <button\r\n type=\"button\"\r\n onClick={onReset}\r\n className=\"flex items-center gap-1.5 text-xs font-medium text-dp-text-muted hover:text-dp-text transition-colors\"\r\n >\r\n <RotateCcw size={13} />\r\n Reset\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => onApply?.(value)}\r\n className=\"px-5 py-1.5 bg-primary text-primary-foreground text-xs font-semibold rounded hover:opacity-90 shadow-sm transition-all active:scale-[0.98]\"\r\n >\r\n Apply\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n },\r\n);\r\n\r\nDatePicker.displayName = \"DatePicker\";\r\n\r\nexport default DatePicker;\r\n","import * as React from \"react\";\r\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\nconst Popover = PopoverPrimitive.Root;\r\n\r\nconst PopoverTrigger = PopoverPrimitive.Trigger;\r\n\r\nconst PopoverContent = React.forwardRef<\r\n React.ElementRef<typeof PopoverPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\r\n>(({ className, align = \"center\", sideOffset = 4, ...props }, ref) => (\r\n <PopoverPrimitive.Portal>\r\n <PopoverPrimitive.Content\r\n ref={ref}\r\n align={align}\r\n sideOffset={sideOffset}\r\n className={cn(\r\n \"z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\r\n className,\r\n )}\r\n {...props}\r\n />\r\n </PopoverPrimitive.Portal>\r\n));\r\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\r\n\r\nexport { Popover, PopoverTrigger, PopoverContent };\r\n","import React, { useState, useCallback } from \"react\";\r\nimport { format } from \"date-fns\";\r\nimport { CalendarIcon, X } from \"lucide-react\";\r\nimport { Popover, PopoverContent, PopoverTrigger } from \"../ui/popover\";\r\nimport { DatePicker } from \"./DatePicker\";\r\nimport type { DatePickerProps, DateRange } from \"./types\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\nexport interface DatePickerInputProps extends Omit<\r\n DatePickerProps,\r\n \"showFooter\" | \"className\"\r\n> {\r\n /** Placeholder text when no date is selected */\r\n placeholder?: string;\r\n /** Date display format string (date-fns format) */\r\n displayFormat?: string;\r\n /** Width class for the input trigger */\r\n triggerClassName?: string;\r\n /** Class for the popover content */\r\n popoverClassName?: string;\r\n /** Class for the calendar inside the popover */\r\n calendarClassName?: string;\r\n /** Whether the input is disabled */\r\n disabled?: boolean;\r\n /** Whether to show a clear button */\r\n clearable?: boolean;\r\n /** Popover alignment */\r\n align?: \"start\" | \"center\" | \"end\";\r\n /** Label text above the input */\r\n label?: string;\r\n}\r\n\r\nexport const DatePickerInput: React.FC<DatePickerInputProps> = ({\r\n mode = \"single\",\r\n value,\r\n onChange,\r\n onApply,\r\n onReset,\r\n placeholder,\r\n displayFormat = \"MMM d, yyyy\",\r\n triggerClassName,\r\n popoverClassName,\r\n calendarClassName,\r\n disabled = false,\r\n clearable = true,\r\n align = \"start\",\r\n label,\r\n numberOfMonths,\r\n presets,\r\n minDate,\r\n maxDate,\r\n disabledDates,\r\n weekStart,\r\n renderDay,\r\n}) => {\r\n const [open, setOpen] = useState(false);\r\n\r\n const defaultPlaceholder =\r\n mode === \"range\" ? \"Select date range...\" : \"Select a date...\";\r\n\r\n const displayValue = (() => {\r\n if (mode === \"single\" && value instanceof Date) {\r\n return format(value, displayFormat);\r\n }\r\n if (mode === \"range\" && value && \"start\" in value) {\r\n const range = value as DateRange;\r\n if (range.start && range.end) {\r\n return `${format(range.start, displayFormat)} – ${format(range.end, displayFormat)}`;\r\n }\r\n if (range.start) {\r\n return `${format(range.start, displayFormat)} – ...`;\r\n }\r\n }\r\n return \"\";\r\n })();\r\n\r\n const handleApply = useCallback(\r\n (val: Date | DateRange | undefined) => {\r\n onApply?.(val);\r\n setOpen(false);\r\n },\r\n [onApply],\r\n );\r\n\r\n const handleClear = useCallback(\r\n (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n onReset?.();\r\n },\r\n [onReset],\r\n );\r\n\r\n const handleChange = useCallback(\r\n (val: Date | DateRange) => {\r\n onChange?.(val);\r\n // Auto-close on single date selection (no footer)\r\n if (mode === \"single\") {\r\n setOpen(false);\r\n }\r\n },\r\n [onChange, mode],\r\n );\r\n\r\n return (\r\n <div className=\"flex flex-col gap-1.5\">\r\n {label && (\r\n <label className=\"text-sm font-medium text-foreground\">{label}</label>\r\n )}\r\n <Popover open={open} onOpenChange={setOpen}>\r\n <PopoverTrigger asChild>\r\n <button\r\n type=\"button\"\r\n disabled={disabled}\r\n className={cn(\r\n \"inline-flex items-center gap-2 h-10 px-3 rounded-lg border border-input bg-background text-sm\",\r\n \"ring-offset-background transition-colors\",\r\n \"hover:bg-accent/5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\r\n \"disabled:cursor-not-allowed disabled:opacity-50\",\r\n !displayValue && \"text-muted-foreground\",\r\n displayValue && \"text-foreground\",\r\n triggerClassName,\r\n )}\r\n >\r\n <CalendarIcon className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\r\n <span className=\"flex-1 text-left truncate\">\r\n {displayValue || placeholder || defaultPlaceholder}\r\n </span>\r\n {clearable && displayValue && (\r\n <span\r\n role=\"button\"\r\n tabIndex={0}\r\n onClick={handleClear}\r\n onKeyDown={(e) => e.key === \"Enter\" && handleClear(e as any)}\r\n className=\"shrink-0 p-0.5 rounded hover:bg-muted transition-colors\"\r\n aria-label=\"Clear selection\"\r\n >\r\n <X className=\"h-3.5 w-3.5 text-muted-foreground\" />\r\n </span>\r\n )}\r\n </button>\r\n </PopoverTrigger>\r\n <PopoverContent\r\n className={cn(\"w-auto p-0 pointer-events-auto\", popoverClassName)}\r\n align={align}\r\n sideOffset={8}\r\n >\r\n <DatePicker\r\n mode={mode}\r\n value={value}\r\n onChange={handleChange}\r\n onApply={mode === \"range\" ? handleApply : undefined}\r\n onReset={onReset}\r\n numberOfMonths={numberOfMonths ?? (mode === \"range\" ? 2 : 1)}\r\n showFooter={mode === \"range\"}\r\n presets={presets}\r\n minDate={minDate}\r\n maxDate={maxDate}\r\n disabledDates={disabledDates}\r\n weekStart={weekStart}\r\n renderDay={renderDay}\r\n className={cn(\"border-0 shadow-none\", calendarClassName)}\r\n />\r\n </PopoverContent>\r\n </Popover>\r\n </div>\r\n );\r\n};\r\n\r\nexport default DatePickerInput;\r\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import React__default, { useState, useCallback, useMemo } from 'react';
|
|
2
3
|
import { isBefore, isSameDay, subMonths, format, addMonths, setMonth, setYear, getYear, eachDayOfInterval, endOfMonth, startOfMonth, isWithinInterval, getMonth, isAfter } from 'date-fns';
|
|
3
|
-
import { ChevronLeft, ChevronRight, RotateCcw } from 'lucide-react';
|
|
4
|
+
import { ChevronLeft, ChevronRight, RotateCcw, CalendarIcon, X } from 'lucide-react';
|
|
4
5
|
import { AnimatePresence, motion } from 'framer-motion';
|
|
5
6
|
import { clsx } from 'clsx';
|
|
6
7
|
import { twMerge } from 'tailwind-merge';
|
|
7
8
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
9
|
+
import * as PopoverPrimitive from '@radix-ui/react-popover';
|
|
8
10
|
|
|
9
11
|
// src/components/date-picker/DatePicker.tsx
|
|
10
12
|
function cn(...inputs) {
|
|
@@ -113,7 +115,7 @@ var MonthGrid = ({
|
|
|
113
115
|
] })
|
|
114
116
|
] });
|
|
115
117
|
};
|
|
116
|
-
var MonthGrid_default =
|
|
118
|
+
var MonthGrid_default = React__default.memo(MonthGrid);
|
|
117
119
|
var MonthSelector = ({
|
|
118
120
|
currentMonth,
|
|
119
121
|
onSelect
|
|
@@ -183,7 +185,7 @@ var YearSelector = ({
|
|
|
183
185
|
);
|
|
184
186
|
};
|
|
185
187
|
var YearSelector_default = YearSelector;
|
|
186
|
-
var DatePicker =
|
|
188
|
+
var DatePicker = React__default.forwardRef(
|
|
187
189
|
({
|
|
188
190
|
mode = "single",
|
|
189
191
|
value,
|
|
@@ -399,7 +401,152 @@ var DatePicker = React.forwardRef(
|
|
|
399
401
|
}
|
|
400
402
|
);
|
|
401
403
|
DatePicker.displayName = "DatePicker";
|
|
404
|
+
var DatePicker_default = DatePicker;
|
|
405
|
+
var Popover = PopoverPrimitive.Root;
|
|
406
|
+
var PopoverTrigger = PopoverPrimitive.Trigger;
|
|
407
|
+
var PopoverContent = React.forwardRef(({ className, align = "center", sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsx(
|
|
408
|
+
PopoverPrimitive.Content,
|
|
409
|
+
{
|
|
410
|
+
ref,
|
|
411
|
+
align,
|
|
412
|
+
sideOffset,
|
|
413
|
+
className: cn(
|
|
414
|
+
"z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
|
|
415
|
+
className
|
|
416
|
+
),
|
|
417
|
+
...props
|
|
418
|
+
}
|
|
419
|
+
) }));
|
|
420
|
+
PopoverContent.displayName = PopoverPrimitive.Content.displayName;
|
|
421
|
+
var DatePickerInput = ({
|
|
422
|
+
mode = "single",
|
|
423
|
+
value,
|
|
424
|
+
onChange,
|
|
425
|
+
onApply,
|
|
426
|
+
onReset,
|
|
427
|
+
placeholder,
|
|
428
|
+
displayFormat = "MMM d, yyyy",
|
|
429
|
+
triggerClassName,
|
|
430
|
+
popoverClassName,
|
|
431
|
+
calendarClassName,
|
|
432
|
+
disabled = false,
|
|
433
|
+
clearable = true,
|
|
434
|
+
align = "start",
|
|
435
|
+
label,
|
|
436
|
+
numberOfMonths,
|
|
437
|
+
presets,
|
|
438
|
+
minDate,
|
|
439
|
+
maxDate,
|
|
440
|
+
disabledDates,
|
|
441
|
+
weekStart,
|
|
442
|
+
renderDay
|
|
443
|
+
}) => {
|
|
444
|
+
const [open, setOpen] = useState(false);
|
|
445
|
+
const defaultPlaceholder = mode === "range" ? "Select date range..." : "Select a date...";
|
|
446
|
+
const displayValue = (() => {
|
|
447
|
+
if (mode === "single" && value instanceof Date) {
|
|
448
|
+
return format(value, displayFormat);
|
|
449
|
+
}
|
|
450
|
+
if (mode === "range" && value && "start" in value) {
|
|
451
|
+
const range = value;
|
|
452
|
+
if (range.start && range.end) {
|
|
453
|
+
return `${format(range.start, displayFormat)} \u2013 ${format(range.end, displayFormat)}`;
|
|
454
|
+
}
|
|
455
|
+
if (range.start) {
|
|
456
|
+
return `${format(range.start, displayFormat)} \u2013 ...`;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
return "";
|
|
460
|
+
})();
|
|
461
|
+
const handleApply = useCallback(
|
|
462
|
+
(val) => {
|
|
463
|
+
onApply == null ? void 0 : onApply(val);
|
|
464
|
+
setOpen(false);
|
|
465
|
+
},
|
|
466
|
+
[onApply]
|
|
467
|
+
);
|
|
468
|
+
const handleClear = useCallback(
|
|
469
|
+
(e) => {
|
|
470
|
+
e.stopPropagation();
|
|
471
|
+
onReset == null ? void 0 : onReset();
|
|
472
|
+
},
|
|
473
|
+
[onReset]
|
|
474
|
+
);
|
|
475
|
+
const handleChange = useCallback(
|
|
476
|
+
(val) => {
|
|
477
|
+
onChange == null ? void 0 : onChange(val);
|
|
478
|
+
if (mode === "single") {
|
|
479
|
+
setOpen(false);
|
|
480
|
+
}
|
|
481
|
+
},
|
|
482
|
+
[onChange, mode]
|
|
483
|
+
);
|
|
484
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5", children: [
|
|
485
|
+
label && /* @__PURE__ */ jsx("label", { className: "text-sm font-medium text-foreground", children: label }),
|
|
486
|
+
/* @__PURE__ */ jsxs(Popover, { open, onOpenChange: setOpen, children: [
|
|
487
|
+
/* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
|
|
488
|
+
"button",
|
|
489
|
+
{
|
|
490
|
+
type: "button",
|
|
491
|
+
disabled,
|
|
492
|
+
className: cn(
|
|
493
|
+
"inline-flex items-center gap-2 h-10 px-3 rounded-lg border border-input bg-background text-sm",
|
|
494
|
+
"ring-offset-background transition-colors",
|
|
495
|
+
"hover:bg-accent/5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
|
|
496
|
+
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
497
|
+
!displayValue && "text-muted-foreground",
|
|
498
|
+
displayValue && "text-foreground",
|
|
499
|
+
triggerClassName
|
|
500
|
+
),
|
|
501
|
+
children: [
|
|
502
|
+
/* @__PURE__ */ jsx(CalendarIcon, { className: "h-4 w-4 shrink-0 text-muted-foreground" }),
|
|
503
|
+
/* @__PURE__ */ jsx("span", { className: "flex-1 text-left truncate", children: displayValue || placeholder || defaultPlaceholder }),
|
|
504
|
+
clearable && displayValue && /* @__PURE__ */ jsx(
|
|
505
|
+
"span",
|
|
506
|
+
{
|
|
507
|
+
role: "button",
|
|
508
|
+
tabIndex: 0,
|
|
509
|
+
onClick: handleClear,
|
|
510
|
+
onKeyDown: (e) => e.key === "Enter" && handleClear(e),
|
|
511
|
+
className: "shrink-0 p-0.5 rounded hover:bg-muted transition-colors",
|
|
512
|
+
"aria-label": "Clear selection",
|
|
513
|
+
children: /* @__PURE__ */ jsx(X, { className: "h-3.5 w-3.5 text-muted-foreground" })
|
|
514
|
+
}
|
|
515
|
+
)
|
|
516
|
+
]
|
|
517
|
+
}
|
|
518
|
+
) }),
|
|
519
|
+
/* @__PURE__ */ jsx(
|
|
520
|
+
PopoverContent,
|
|
521
|
+
{
|
|
522
|
+
className: cn("w-auto p-0 pointer-events-auto", popoverClassName),
|
|
523
|
+
align,
|
|
524
|
+
sideOffset: 8,
|
|
525
|
+
children: /* @__PURE__ */ jsx(
|
|
526
|
+
DatePicker,
|
|
527
|
+
{
|
|
528
|
+
mode,
|
|
529
|
+
value,
|
|
530
|
+
onChange: handleChange,
|
|
531
|
+
onApply: mode === "range" ? handleApply : void 0,
|
|
532
|
+
onReset,
|
|
533
|
+
numberOfMonths: numberOfMonths != null ? numberOfMonths : mode === "range" ? 2 : 1,
|
|
534
|
+
showFooter: mode === "range",
|
|
535
|
+
presets,
|
|
536
|
+
minDate,
|
|
537
|
+
maxDate,
|
|
538
|
+
disabledDates,
|
|
539
|
+
weekStart,
|
|
540
|
+
renderDay,
|
|
541
|
+
className: cn("border-0 shadow-none", calendarClassName)
|
|
542
|
+
}
|
|
543
|
+
)
|
|
544
|
+
}
|
|
545
|
+
)
|
|
546
|
+
] })
|
|
547
|
+
] });
|
|
548
|
+
};
|
|
402
549
|
|
|
403
|
-
export { DatePicker };
|
|
550
|
+
export { DatePicker, DatePickerInput, DatePicker_default as default };
|
|
404
551
|
//# sourceMappingURL=index.mjs.map
|
|
405
552
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/utils.ts","../src/components/date-picker/MonthGrid.tsx","../src/components/date-picker/MonthSelector.tsx","../src/components/date-picker/YearSelector.tsx","../src/components/date-picker/DatePicker.tsx"],"names":["jsx","format","motion","React","isBefore","isSameDay","jsxs"],"mappings":"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","file":"index.mjs","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","import React, { useMemo } from \"react\";\r\nimport {\r\n format,\r\n startOfMonth,\r\n endOfMonth,\r\n eachDayOfInterval,\r\n isSameDay,\r\n isWithinInterval,\r\n isBefore,\r\n isAfter,\r\n} from \"date-fns\";\r\nimport type { DatePickerMode, DateRange } from \"./types\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\ninterface MonthGridProps {\r\n month: Date;\r\n mode: DatePickerMode;\r\n selectedDate: Date | null;\r\n selectedRange: DateRange | null;\r\n hoverDate: Date | null;\r\n onDateClick: (date: Date) => void;\r\n onDateHover: (date: Date | null) => void;\r\n minDate?: Date;\r\n maxDate?: Date;\r\n disabledDates?: Date[];\r\n weekStart?: 0 | 1;\r\n renderDay?: (date: Date) => React.ReactNode;\r\n showLabel?: boolean;\r\n}\r\n\r\nconst WEEK_DAYS_SUN = [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"];\r\nconst WEEK_DAYS_MON = [\"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\", \"Su\"];\r\n\r\nconst MonthGrid: React.FC<MonthGridProps> = ({\r\n month,\r\n mode,\r\n selectedDate,\r\n selectedRange,\r\n hoverDate,\r\n onDateClick,\r\n onDateHover,\r\n minDate,\r\n maxDate,\r\n disabledDates = [],\r\n weekStart = 0,\r\n renderDay,\r\n showLabel = true,\r\n}) => {\r\n const days = useMemo(() => {\r\n return eachDayOfInterval({\r\n start: startOfMonth(month),\r\n end: endOfMonth(month),\r\n });\r\n }, [month]);\r\n\r\n const weekDays = weekStart === 1 ? WEEK_DAYS_MON : WEEK_DAYS_SUN;\r\n\r\n const startPad = useMemo(() => {\r\n const dayOfWeek = days[0].getDay();\r\n return weekStart === 1 ? (dayOfWeek === 0 ? 6 : dayOfWeek - 1) : dayOfWeek;\r\n }, [days, weekStart]);\r\n\r\n const isDisabled = (date: Date) => {\r\n if (minDate && isBefore(date, minDate)) return true;\r\n if (maxDate && isAfter(date, maxDate)) return true;\r\n return disabledDates.some((d) => isSameDay(d, date));\r\n };\r\n\r\n return (\r\n <div className=\"flex-1 min-w-[252px]\">\r\n {showLabel && (\r\n <div className=\"text-center mb-3\">\r\n <span className=\"text-sm font-medium text-dp-text\">\r\n {format(month, \"MMMM yyyy\")}\r\n </span>\r\n </div>\r\n )}\r\n <div className=\"grid grid-cols-7 mb-1.5\">\r\n {weekDays.map((d) => (\r\n <span\r\n key={d}\r\n className=\"text-[11px] font-semibold text-dp-text-muted text-center uppercase tracking-wider py-1\"\r\n >\r\n {d}\r\n </span>\r\n ))}\r\n </div>\r\n <div className=\"grid grid-cols-7\">\r\n {[...Array(startPad)].map((_, i) => (\r\n <div key={`pad-${i}`} className=\"h-9 w-9\" />\r\n ))}\r\n {days.map((day) => {\r\n const disabled = isDisabled(day);\r\n const isSelected =\r\n mode === \"single\"\r\n ? selectedDate && isSameDay(day, selectedDate)\r\n : selectedRange &&\r\n ((selectedRange.start && isSameDay(day, selectedRange.start)) ||\r\n (selectedRange.end && isSameDay(day, selectedRange.end)));\r\n\r\n const isStart =\r\n mode === \"range\" &&\r\n selectedRange?.start &&\r\n isSameDay(day, selectedRange.start);\r\n const isEnd =\r\n mode === \"range\" &&\r\n selectedRange?.end &&\r\n isSameDay(day, selectedRange.end);\r\n\r\n let inRange = false;\r\n if (mode === \"range\" && selectedRange?.start) {\r\n if (selectedRange.end) {\r\n inRange = isWithinInterval(day, {\r\n start: selectedRange.start,\r\n end: selectedRange.end,\r\n });\r\n } else if (hoverDate) {\r\n const rangeStart = isBefore(hoverDate, selectedRange.start)\r\n ? hoverDate\r\n : selectedRange.start;\r\n const rangeEnd = isBefore(hoverDate, selectedRange.start)\r\n ? selectedRange.start\r\n : hoverDate;\r\n inRange = isWithinInterval(day, {\r\n start: rangeStart,\r\n end: rangeEnd,\r\n });\r\n }\r\n }\r\n\r\n return (\r\n <button\r\n key={day.toISOString()}\r\n type=\"button\"\r\n disabled={disabled}\r\n onClick={() => !disabled && onDateClick(day)}\r\n onMouseEnter={() => !disabled && onDateHover(day)}\r\n onMouseLeave={() => onDateHover(null)}\r\n aria-label={format(day, \"PPPP\")}\r\n aria-selected={!!isSelected}\r\n className={cn(\r\n \"relative h-9 w-9 text-sm flex items-center justify-center transition-all tabular-nums\",\r\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\",\r\n \"active:scale-[0.96]\",\r\n // Default\r\n !isSelected &&\r\n !inRange &&\r\n \"text-dp-text hover:bg-dp-surface-hover rounded-lg\",\r\n // Selected (start/end/single)\r\n isSelected &&\r\n \"bg-dp-surface-active text-dp-text-selected z-10 shadow-sm font-semibold\",\r\n // Single mode selected\r\n mode === \"single\" && isSelected && \"rounded-lg\",\r\n // Range endpoints\r\n isStart && !isEnd && \"rounded-l-lg rounded-r-none\",\r\n isEnd && !isStart && \"rounded-r-lg rounded-l-none\",\r\n isStart && isEnd && \"rounded-lg\",\r\n // In range but not selected\r\n inRange &&\r\n !isSelected &&\r\n \"bg-[hsl(var(--dp-range-tint)/0.08)] text-primary rounded-none\",\r\n // Disabled\r\n disabled &&\r\n \"text-dp-text-muted/40 cursor-not-allowed hover:bg-transparent\",\r\n )}\r\n >\r\n {renderDay ? renderDay(day) : format(day, \"d\")}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default React.memo(MonthGrid);\r\n","import React from \"react\";\r\nimport { format, getMonth } from \"date-fns\";\r\nimport { motion } from \"framer-motion\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\ninterface MonthSelectorProps {\r\n currentMonth: Date;\r\n onSelect: (month: number) => void;\r\n}\r\n\r\nconst MonthSelector: React.FC<MonthSelectorProps> = ({\r\n currentMonth,\r\n onSelect,\r\n}) => {\r\n const current = getMonth(currentMonth);\r\n\r\n return (\r\n <motion.div\r\n key=\"month-selector\"\r\n initial={{ opacity: 0, y: 4 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n exit={{ opacity: 0, y: -4 }}\r\n transition={{ duration: 0.15, ease: [0.25, 0.1, 0.25, 1] }}\r\n className=\"grid grid-cols-3 gap-2 w-full max-w-[320px] mx-auto\"\r\n >\r\n {Array.from({ length: 12 }).map((_, i) => (\r\n <button\r\n key={i}\r\n type=\"button\"\r\n onClick={() => onSelect(i)}\r\n className={cn(\r\n \"py-3 text-sm font-medium rounded-lg transition-all active:scale-[0.97]\",\r\n current === i\r\n ? \"bg-dp-surface-active text-dp-text-selected shadow-sm\"\r\n : \"hover:bg-dp-surface-hover text-dp-text\",\r\n )}\r\n >\r\n {format(new Date(2024, i, 1), \"MMM\")}\r\n </button>\r\n ))}\r\n </motion.div>\r\n );\r\n};\r\n\r\nexport default MonthSelector;\r\n","import React from \"react\";\r\nimport { motion } from \"framer-motion\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\ninterface YearSelectorProps {\r\n currentYear: number;\r\n onSelect: (year: number) => void;\r\n minDate?: Date;\r\n maxDate?: Date;\r\n}\r\n\r\nconst YearSelector: React.FC<YearSelectorProps> = ({\r\n currentYear,\r\n onSelect,\r\n minDate,\r\n maxDate,\r\n}) => {\r\n const years = Array.from({ length: 12 }, (_, i) => currentYear - 5 + i);\r\n\r\n return (\r\n <motion.div\r\n key=\"year-selector\"\r\n initial={{ opacity: 0, y: 4 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n exit={{ opacity: 0, y: -4 }}\r\n transition={{ duration: 0.15, ease: [0.25, 0.1, 0.25, 1] }}\r\n className=\"grid grid-cols-3 gap-2 w-full max-w-[320px] mx-auto\"\r\n >\r\n {years.map((y) => {\r\n const disabled =\r\n (minDate && y < minDate.getFullYear()) ||\r\n (maxDate && y > maxDate.getFullYear());\r\n return (\r\n <button\r\n key={y}\r\n type=\"button\"\r\n disabled={!!disabled}\r\n onClick={() => !disabled && onSelect(y)}\r\n className={cn(\r\n \"py-3 text-sm font-medium rounded-lg transition-all active:scale-[0.97]\",\r\n currentYear === y\r\n ? \"bg-dp-surface-active text-dp-text-selected shadow-sm\"\r\n : \"hover:bg-dp-surface-hover text-dp-text\",\r\n disabled && \"opacity-30 cursor-not-allowed\",\r\n )}\r\n >\r\n {y}\r\n </button>\r\n );\r\n })}\r\n </motion.div>\r\n );\r\n};\r\n\r\nexport default YearSelector;\r\n","import React, { useState, useCallback, useEffect } from \"react\";\r\nimport {\r\n format,\r\n addMonths,\r\n subMonths,\r\n setMonth,\r\n setYear,\r\n getYear,\r\n isBefore,\r\n isSameDay,\r\n} from \"date-fns\";\r\nimport { ChevronLeft, ChevronRight, RotateCcw } from \"lucide-react\";\r\nimport { AnimatePresence, motion } from \"framer-motion\";\r\nimport MonthGrid from \"./MonthGrid\";\r\nimport MonthSelector from \"./MonthSelector\";\r\nimport YearSelector from \"./YearSelector\";\r\nimport type { DatePickerProps, DateRange } from \"./types\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\ntype ViewMode = \"calendar\" | \"month\" | \"year\";\r\n\r\nexport const DatePicker = React.forwardRef<HTMLDivElement, DatePickerProps>(\r\n (\r\n {\r\n mode = \"single\",\r\n value,\r\n onChange,\r\n onApply,\r\n onReset,\r\n minDate,\r\n maxDate,\r\n disabledDates,\r\n weekStart = 0,\r\n numberOfMonths = 2,\r\n showFooter = true,\r\n className,\r\n renderDay,\r\n presets,\r\n },\r\n ref,\r\n ) => {\r\n const [viewDate, setViewDate] = useState(() => {\r\n if (mode === \"single\" && value instanceof Date) return value;\r\n if (mode === \"range\" && value && \"start\" in value && value.start)\r\n return value.start;\r\n return new Date();\r\n });\r\n const [viewMode, setViewMode] = useState<ViewMode>(\"calendar\");\r\n const [hoverDate, setHoverDate] = useState<Date | null>(null);\r\n\r\n const selectedRange =\r\n mode === \"range\" ? ((value as DateRange | undefined) ?? null) : null;\r\n const selectedDate =\r\n mode === \"single\" ? ((value as Date | undefined) ?? null) : null;\r\n\r\n const handleDateClick = useCallback(\r\n (date: Date) => {\r\n if (mode === \"single\") {\r\n onChange?.(date);\r\n } else {\r\n const range = selectedRange || { start: null, end: null };\r\n if (!range.start || (range.start && range.end)) {\r\n onChange?.({ start: date, end: null });\r\n } else {\r\n if (isBefore(date, range.start)) {\r\n onChange?.({ start: date, end: range.start });\r\n } else if (isSameDay(date, range.start)) {\r\n onChange?.({ start: date, end: date });\r\n } else {\r\n onChange?.({ start: range.start, end: date });\r\n }\r\n }\r\n }\r\n },\r\n [mode, selectedRange, onChange],\r\n );\r\n\r\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\r\n if (e.key === \"Escape\") {\r\n setViewMode(\"calendar\");\r\n }\r\n }, []);\r\n\r\n const handlePresetClick = useCallback(\r\n (preset: { getValue: () => DateRange }) => {\r\n const range = preset.getValue();\r\n onChange?.(range);\r\n },\r\n [onChange],\r\n );\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n \"inline-flex flex-col rounded-xl border border-dp-border bg-dp-surface select-none antialiased\",\r\n \"shadow-[var(--dp-shadow)]\",\r\n className,\r\n )}\r\n onKeyDown={handleKeyDown}\r\n role=\"application\"\r\n aria-label=\"Date picker\"\r\n >\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-dp-border\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setViewDate(subMonths(viewDate, 1))}\r\n className=\"p-1.5 rounded-md hover:bg-dp-surface-hover text-dp-text-muted hover:text-dp-text transition-colors\"\r\n aria-label=\"Previous month\"\r\n >\r\n <ChevronLeft size={16} />\r\n </button>\r\n\r\n <div className=\"flex items-center gap-1\">\r\n <button\r\n type=\"button\"\r\n onClick={() =>\r\n setViewMode(viewMode === \"month\" ? \"calendar\" : \"month\")\r\n }\r\n className={cn(\r\n \"text-sm font-semibold px-2 py-1 rounded-md transition-colors\",\r\n viewMode === \"month\"\r\n ? \"bg-dp-surface-hover text-dp-text\"\r\n : \"hover:bg-dp-surface-hover text-dp-text\",\r\n )}\r\n >\r\n {format(viewDate, \"MMMM\")}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() =>\r\n setViewMode(viewMode === \"year\" ? \"calendar\" : \"year\")\r\n }\r\n className={cn(\r\n \"text-sm font-semibold px-2 py-1 rounded-md transition-colors\",\r\n viewMode === \"year\"\r\n ? \"bg-dp-surface-hover text-dp-text\"\r\n : \"hover:bg-dp-surface-hover text-dp-text\",\r\n )}\r\n >\r\n {format(viewDate, \"yyyy\")}\r\n </button>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n onClick={() => setViewDate(addMonths(viewDate, 1))}\r\n className=\"p-1.5 rounded-md hover:bg-dp-surface-hover text-dp-text-muted hover:text-dp-text transition-colors\"\r\n aria-label=\"Next month\"\r\n >\r\n <ChevronRight size={16} />\r\n </button>\r\n </div>\r\n\r\n {/* Body */}\r\n <div className=\"flex\">\r\n {/* Presets sidebar */}\r\n {presets && presets.length > 0 && (\r\n <div className=\"border-r border-dp-border p-3 min-w-[140px] flex flex-col gap-0.5\">\r\n {presets.map((preset) => (\r\n <button\r\n key={preset.label}\r\n type=\"button\"\r\n onClick={() => handlePresetClick(preset)}\r\n className=\"text-left text-xs font-medium px-2.5 py-1.5 rounded-md text-dp-text-muted hover:text-dp-text hover:bg-dp-surface-hover transition-colors\"\r\n >\r\n {preset.label}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n\r\n <div className=\"p-4 flex-1\">\r\n <AnimatePresence mode=\"wait\">\r\n {viewMode === \"calendar\" && (\r\n <motion.div\r\n key=\"calendar\"\r\n initial={{ opacity: 0, y: 4 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n exit={{ opacity: 0, y: -4 }}\r\n transition={{ duration: 0.15, ease: [0.25, 0.1, 0.25, 1] }}\r\n className=\"flex flex-col md:flex-row gap-6\"\r\n >\r\n {[...Array(numberOfMonths)].map((_, i) => (\r\n <MonthGrid\r\n key={i}\r\n month={addMonths(viewDate, i)}\r\n mode={mode}\r\n selectedDate={selectedDate}\r\n selectedRange={selectedRange}\r\n hoverDate={hoverDate}\r\n onDateClick={handleDateClick}\r\n onDateHover={setHoverDate}\r\n minDate={minDate}\r\n maxDate={maxDate}\r\n disabledDates={disabledDates}\r\n weekStart={weekStart}\r\n renderDay={renderDay}\r\n showLabel={numberOfMonths > 1}\r\n />\r\n ))}\r\n </motion.div>\r\n )}\r\n\r\n {viewMode === \"month\" && (\r\n <MonthSelector\r\n currentMonth={viewDate}\r\n onSelect={(m) => {\r\n setViewDate(setMonth(viewDate, m));\r\n setViewMode(\"calendar\");\r\n }}\r\n />\r\n )}\r\n\r\n {viewMode === \"year\" && (\r\n <YearSelector\r\n currentYear={getYear(viewDate)}\r\n onSelect={(y) => {\r\n setViewDate(setYear(viewDate, y));\r\n setViewMode(\"calendar\");\r\n }}\r\n minDate={minDate}\r\n maxDate={maxDate}\r\n />\r\n )}\r\n </AnimatePresence>\r\n </div>\r\n </div>\r\n\r\n {/* Footer */}\r\n {showFooter && (\r\n <div className=\"flex items-center justify-between px-4 py-3 bg-dp-footer border-t border-dp-border rounded-b-xl\">\r\n <button\r\n type=\"button\"\r\n onClick={onReset}\r\n className=\"flex items-center gap-1.5 text-xs font-medium text-dp-text-muted hover:text-dp-text transition-colors\"\r\n >\r\n <RotateCcw size={13} />\r\n Reset\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => onApply?.(value)}\r\n className=\"px-5 py-1.5 bg-primary text-primary-foreground text-xs font-semibold rounded hover:opacity-90 shadow-sm transition-all active:scale-[0.98]\"\r\n >\r\n Apply\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n },\r\n);\r\n\r\nDatePicker.displayName = \"DatePicker\";\r\n\r\nexport default DatePicker;\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/utils.ts","../src/components/date-picker/MonthGrid.tsx","../src/components/date-picker/MonthSelector.tsx","../src/components/date-picker/YearSelector.tsx","../src/components/date-picker/DatePicker.tsx","../src/components/ui/popover.tsx","../src/components/date-picker/DatePickerInput.tsx"],"names":["React","jsx","format","motion","isBefore","isSameDay","jsxs","React3","useState","useCallback"],"mappings":"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","file":"index.mjs","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","import React, { useMemo } from \"react\";\r\nimport {\r\n format,\r\n startOfMonth,\r\n endOfMonth,\r\n eachDayOfInterval,\r\n isSameDay,\r\n isWithinInterval,\r\n isBefore,\r\n isAfter,\r\n} from \"date-fns\";\r\nimport type { DatePickerMode, DateRange } from \"./types\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\ninterface MonthGridProps {\r\n month: Date;\r\n mode: DatePickerMode;\r\n selectedDate: Date | null;\r\n selectedRange: DateRange | null;\r\n hoverDate: Date | null;\r\n onDateClick: (date: Date) => void;\r\n onDateHover: (date: Date | null) => void;\r\n minDate?: Date;\r\n maxDate?: Date;\r\n disabledDates?: Date[];\r\n weekStart?: 0 | 1;\r\n renderDay?: (date: Date) => React.ReactNode;\r\n showLabel?: boolean;\r\n}\r\n\r\nconst WEEK_DAYS_SUN = [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"];\r\nconst WEEK_DAYS_MON = [\"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\", \"Su\"];\r\n\r\nconst MonthGrid: React.FC<MonthGridProps> = ({\r\n month,\r\n mode,\r\n selectedDate,\r\n selectedRange,\r\n hoverDate,\r\n onDateClick,\r\n onDateHover,\r\n minDate,\r\n maxDate,\r\n disabledDates = [],\r\n weekStart = 0,\r\n renderDay,\r\n showLabel = true,\r\n}) => {\r\n const days = useMemo(() => {\r\n return eachDayOfInterval({\r\n start: startOfMonth(month),\r\n end: endOfMonth(month),\r\n });\r\n }, [month]);\r\n\r\n const weekDays = weekStart === 1 ? WEEK_DAYS_MON : WEEK_DAYS_SUN;\r\n\r\n const startPad = useMemo(() => {\r\n const dayOfWeek = days[0].getDay();\r\n return weekStart === 1 ? (dayOfWeek === 0 ? 6 : dayOfWeek - 1) : dayOfWeek;\r\n }, [days, weekStart]);\r\n\r\n const isDisabled = (date: Date) => {\r\n if (minDate && isBefore(date, minDate)) return true;\r\n if (maxDate && isAfter(date, maxDate)) return true;\r\n return disabledDates.some((d) => isSameDay(d, date));\r\n };\r\n\r\n return (\r\n <div className=\"flex-1 min-w-[252px]\">\r\n {showLabel && (\r\n <div className=\"text-center mb-3\">\r\n <span className=\"text-sm font-medium text-dp-text\">\r\n {format(month, \"MMMM yyyy\")}\r\n </span>\r\n </div>\r\n )}\r\n <div className=\"grid grid-cols-7 mb-1.5\">\r\n {weekDays.map((d) => (\r\n <span\r\n key={d}\r\n className=\"text-[11px] font-semibold text-dp-text-muted text-center uppercase tracking-wider py-1\"\r\n >\r\n {d}\r\n </span>\r\n ))}\r\n </div>\r\n <div className=\"grid grid-cols-7\">\r\n {[...Array(startPad)].map((_, i) => (\r\n <div key={`pad-${i}`} className=\"h-9 w-9\" />\r\n ))}\r\n {days.map((day) => {\r\n const disabled = isDisabled(day);\r\n const isSelected =\r\n mode === \"single\"\r\n ? selectedDate && isSameDay(day, selectedDate)\r\n : selectedRange &&\r\n ((selectedRange.start && isSameDay(day, selectedRange.start)) ||\r\n (selectedRange.end && isSameDay(day, selectedRange.end)));\r\n\r\n const isStart =\r\n mode === \"range\" &&\r\n selectedRange?.start &&\r\n isSameDay(day, selectedRange.start);\r\n const isEnd =\r\n mode === \"range\" &&\r\n selectedRange?.end &&\r\n isSameDay(day, selectedRange.end);\r\n\r\n let inRange = false;\r\n if (mode === \"range\" && selectedRange?.start) {\r\n if (selectedRange.end) {\r\n inRange = isWithinInterval(day, {\r\n start: selectedRange.start,\r\n end: selectedRange.end,\r\n });\r\n } else if (hoverDate) {\r\n const rangeStart = isBefore(hoverDate, selectedRange.start)\r\n ? hoverDate\r\n : selectedRange.start;\r\n const rangeEnd = isBefore(hoverDate, selectedRange.start)\r\n ? selectedRange.start\r\n : hoverDate;\r\n inRange = isWithinInterval(day, {\r\n start: rangeStart,\r\n end: rangeEnd,\r\n });\r\n }\r\n }\r\n\r\n return (\r\n <button\r\n key={day.toISOString()}\r\n type=\"button\"\r\n disabled={disabled}\r\n onClick={() => !disabled && onDateClick(day)}\r\n onMouseEnter={() => !disabled && onDateHover(day)}\r\n onMouseLeave={() => onDateHover(null)}\r\n aria-label={format(day, \"PPPP\")}\r\n aria-selected={!!isSelected}\r\n className={cn(\r\n \"relative h-9 w-9 text-sm flex items-center justify-center transition-all tabular-nums\",\r\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\",\r\n \"active:scale-[0.96]\",\r\n // Default\r\n !isSelected &&\r\n !inRange &&\r\n \"text-dp-text hover:bg-dp-surface-hover rounded-lg\",\r\n // Selected (start/end/single)\r\n isSelected &&\r\n \"bg-dp-surface-active text-dp-text-selected z-10 shadow-sm font-semibold\",\r\n // Single mode selected\r\n mode === \"single\" && isSelected && \"rounded-lg\",\r\n // Range endpoints\r\n isStart && !isEnd && \"rounded-l-lg rounded-r-none\",\r\n isEnd && !isStart && \"rounded-r-lg rounded-l-none\",\r\n isStart && isEnd && \"rounded-lg\",\r\n // In range but not selected\r\n inRange &&\r\n !isSelected &&\r\n \"bg-[hsl(var(--dp-range-tint)/0.08)] text-primary rounded-none\",\r\n // Disabled\r\n disabled &&\r\n \"text-dp-text-muted/40 cursor-not-allowed hover:bg-transparent\",\r\n )}\r\n >\r\n {renderDay ? renderDay(day) : format(day, \"d\")}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default React.memo(MonthGrid);\r\n","import React from \"react\";\r\nimport { format, getMonth } from \"date-fns\";\r\nimport { motion } from \"framer-motion\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\ninterface MonthSelectorProps {\r\n currentMonth: Date;\r\n onSelect: (month: number) => void;\r\n}\r\n\r\nconst MonthSelector: React.FC<MonthSelectorProps> = ({\r\n currentMonth,\r\n onSelect,\r\n}) => {\r\n const current = getMonth(currentMonth);\r\n\r\n return (\r\n <motion.div\r\n key=\"month-selector\"\r\n initial={{ opacity: 0, y: 4 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n exit={{ opacity: 0, y: -4 }}\r\n transition={{ duration: 0.15, ease: [0.25, 0.1, 0.25, 1] }}\r\n className=\"grid grid-cols-3 gap-2 w-full max-w-[320px] mx-auto\"\r\n >\r\n {Array.from({ length: 12 }).map((_, i) => (\r\n <button\r\n key={i}\r\n type=\"button\"\r\n onClick={() => onSelect(i)}\r\n className={cn(\r\n \"py-3 text-sm font-medium rounded-lg transition-all active:scale-[0.97]\",\r\n current === i\r\n ? \"bg-dp-surface-active text-dp-text-selected shadow-sm\"\r\n : \"hover:bg-dp-surface-hover text-dp-text\",\r\n )}\r\n >\r\n {format(new Date(2024, i, 1), \"MMM\")}\r\n </button>\r\n ))}\r\n </motion.div>\r\n );\r\n};\r\n\r\nexport default MonthSelector;\r\n","import React from \"react\";\r\nimport { motion } from \"framer-motion\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\ninterface YearSelectorProps {\r\n currentYear: number;\r\n onSelect: (year: number) => void;\r\n minDate?: Date;\r\n maxDate?: Date;\r\n}\r\n\r\nconst YearSelector: React.FC<YearSelectorProps> = ({\r\n currentYear,\r\n onSelect,\r\n minDate,\r\n maxDate,\r\n}) => {\r\n const years = Array.from({ length: 12 }, (_, i) => currentYear - 5 + i);\r\n\r\n return (\r\n <motion.div\r\n key=\"year-selector\"\r\n initial={{ opacity: 0, y: 4 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n exit={{ opacity: 0, y: -4 }}\r\n transition={{ duration: 0.15, ease: [0.25, 0.1, 0.25, 1] }}\r\n className=\"grid grid-cols-3 gap-2 w-full max-w-[320px] mx-auto\"\r\n >\r\n {years.map((y) => {\r\n const disabled =\r\n (minDate && y < minDate.getFullYear()) ||\r\n (maxDate && y > maxDate.getFullYear());\r\n return (\r\n <button\r\n key={y}\r\n type=\"button\"\r\n disabled={!!disabled}\r\n onClick={() => !disabled && onSelect(y)}\r\n className={cn(\r\n \"py-3 text-sm font-medium rounded-lg transition-all active:scale-[0.97]\",\r\n currentYear === y\r\n ? \"bg-dp-surface-active text-dp-text-selected shadow-sm\"\r\n : \"hover:bg-dp-surface-hover text-dp-text\",\r\n disabled && \"opacity-30 cursor-not-allowed\",\r\n )}\r\n >\r\n {y}\r\n </button>\r\n );\r\n })}\r\n </motion.div>\r\n );\r\n};\r\n\r\nexport default YearSelector;\r\n","import React, { useState, useCallback, useEffect } from \"react\";\r\nimport {\r\n format,\r\n addMonths,\r\n subMonths,\r\n setMonth,\r\n setYear,\r\n getYear,\r\n isBefore,\r\n isSameDay,\r\n} from \"date-fns\";\r\nimport { ChevronLeft, ChevronRight, RotateCcw } from \"lucide-react\";\r\nimport { AnimatePresence, motion } from \"framer-motion\";\r\nimport MonthGrid from \"./MonthGrid\";\r\nimport MonthSelector from \"./MonthSelector\";\r\nimport YearSelector from \"./YearSelector\";\r\nimport type { DatePickerProps, DateRange } from \"./types\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\ntype ViewMode = \"calendar\" | \"month\" | \"year\";\r\n\r\nexport const DatePicker = React.forwardRef<HTMLDivElement, DatePickerProps>(\r\n (\r\n {\r\n mode = \"single\",\r\n value,\r\n onChange,\r\n onApply,\r\n onReset,\r\n minDate,\r\n maxDate,\r\n disabledDates,\r\n weekStart = 0,\r\n numberOfMonths = 2,\r\n showFooter = true,\r\n className,\r\n renderDay,\r\n presets,\r\n },\r\n ref,\r\n ) => {\r\n const [viewDate, setViewDate] = useState(() => {\r\n if (mode === \"single\" && value instanceof Date) return value;\r\n if (mode === \"range\" && value && \"start\" in value && value.start)\r\n return value.start;\r\n return new Date();\r\n });\r\n const [viewMode, setViewMode] = useState<ViewMode>(\"calendar\");\r\n const [hoverDate, setHoverDate] = useState<Date | null>(null);\r\n\r\n const selectedRange =\r\n mode === \"range\" ? ((value as DateRange | undefined) ?? null) : null;\r\n const selectedDate =\r\n mode === \"single\" ? ((value as Date | undefined) ?? null) : null;\r\n\r\n const handleDateClick = useCallback(\r\n (date: Date) => {\r\n if (mode === \"single\") {\r\n onChange?.(date);\r\n } else {\r\n const range = selectedRange || { start: null, end: null };\r\n if (!range.start || (range.start && range.end)) {\r\n onChange?.({ start: date, end: null });\r\n } else {\r\n if (isBefore(date, range.start)) {\r\n onChange?.({ start: date, end: range.start });\r\n } else if (isSameDay(date, range.start)) {\r\n onChange?.({ start: date, end: date });\r\n } else {\r\n onChange?.({ start: range.start, end: date });\r\n }\r\n }\r\n }\r\n },\r\n [mode, selectedRange, onChange],\r\n );\r\n\r\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\r\n if (e.key === \"Escape\") {\r\n setViewMode(\"calendar\");\r\n }\r\n }, []);\r\n\r\n const handlePresetClick = useCallback(\r\n (preset: { getValue: () => DateRange }) => {\r\n const range = preset.getValue();\r\n onChange?.(range);\r\n },\r\n [onChange],\r\n );\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n \"inline-flex flex-col rounded-xl border border-dp-border bg-dp-surface select-none antialiased\",\r\n \"shadow-[var(--dp-shadow)]\",\r\n className,\r\n )}\r\n onKeyDown={handleKeyDown}\r\n role=\"application\"\r\n aria-label=\"Date picker\"\r\n >\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-dp-border\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setViewDate(subMonths(viewDate, 1))}\r\n className=\"p-1.5 rounded-md hover:bg-dp-surface-hover text-dp-text-muted hover:text-dp-text transition-colors\"\r\n aria-label=\"Previous month\"\r\n >\r\n <ChevronLeft size={16} />\r\n </button>\r\n\r\n <div className=\"flex items-center gap-1\">\r\n <button\r\n type=\"button\"\r\n onClick={() =>\r\n setViewMode(viewMode === \"month\" ? \"calendar\" : \"month\")\r\n }\r\n className={cn(\r\n \"text-sm font-semibold px-2 py-1 rounded-md transition-colors\",\r\n viewMode === \"month\"\r\n ? \"bg-dp-surface-hover text-dp-text\"\r\n : \"hover:bg-dp-surface-hover text-dp-text\",\r\n )}\r\n >\r\n {format(viewDate, \"MMMM\")}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() =>\r\n setViewMode(viewMode === \"year\" ? \"calendar\" : \"year\")\r\n }\r\n className={cn(\r\n \"text-sm font-semibold px-2 py-1 rounded-md transition-colors\",\r\n viewMode === \"year\"\r\n ? \"bg-dp-surface-hover text-dp-text\"\r\n : \"hover:bg-dp-surface-hover text-dp-text\",\r\n )}\r\n >\r\n {format(viewDate, \"yyyy\")}\r\n </button>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n onClick={() => setViewDate(addMonths(viewDate, 1))}\r\n className=\"p-1.5 rounded-md hover:bg-dp-surface-hover text-dp-text-muted hover:text-dp-text transition-colors\"\r\n aria-label=\"Next month\"\r\n >\r\n <ChevronRight size={16} />\r\n </button>\r\n </div>\r\n\r\n {/* Body */}\r\n <div className=\"flex\">\r\n {/* Presets sidebar */}\r\n {presets && presets.length > 0 && (\r\n <div className=\"border-r border-dp-border p-3 min-w-[140px] flex flex-col gap-0.5\">\r\n {presets.map((preset) => (\r\n <button\r\n key={preset.label}\r\n type=\"button\"\r\n onClick={() => handlePresetClick(preset)}\r\n className=\"text-left text-xs font-medium px-2.5 py-1.5 rounded-md text-dp-text-muted hover:text-dp-text hover:bg-dp-surface-hover transition-colors\"\r\n >\r\n {preset.label}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n\r\n <div className=\"p-4 flex-1\">\r\n <AnimatePresence mode=\"wait\">\r\n {viewMode === \"calendar\" && (\r\n <motion.div\r\n key=\"calendar\"\r\n initial={{ opacity: 0, y: 4 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n exit={{ opacity: 0, y: -4 }}\r\n transition={{ duration: 0.15, ease: [0.25, 0.1, 0.25, 1] }}\r\n className=\"flex flex-col md:flex-row gap-6\"\r\n >\r\n {[...Array(numberOfMonths)].map((_, i) => (\r\n <MonthGrid\r\n key={i}\r\n month={addMonths(viewDate, i)}\r\n mode={mode}\r\n selectedDate={selectedDate}\r\n selectedRange={selectedRange}\r\n hoverDate={hoverDate}\r\n onDateClick={handleDateClick}\r\n onDateHover={setHoverDate}\r\n minDate={minDate}\r\n maxDate={maxDate}\r\n disabledDates={disabledDates}\r\n weekStart={weekStart}\r\n renderDay={renderDay}\r\n showLabel={numberOfMonths > 1}\r\n />\r\n ))}\r\n </motion.div>\r\n )}\r\n\r\n {viewMode === \"month\" && (\r\n <MonthSelector\r\n currentMonth={viewDate}\r\n onSelect={(m) => {\r\n setViewDate(setMonth(viewDate, m));\r\n setViewMode(\"calendar\");\r\n }}\r\n />\r\n )}\r\n\r\n {viewMode === \"year\" && (\r\n <YearSelector\r\n currentYear={getYear(viewDate)}\r\n onSelect={(y) => {\r\n setViewDate(setYear(viewDate, y));\r\n setViewMode(\"calendar\");\r\n }}\r\n minDate={minDate}\r\n maxDate={maxDate}\r\n />\r\n )}\r\n </AnimatePresence>\r\n </div>\r\n </div>\r\n\r\n {/* Footer */}\r\n {showFooter && (\r\n <div className=\"flex items-center justify-between px-4 py-3 bg-dp-footer border-t border-dp-border rounded-b-xl\">\r\n <button\r\n type=\"button\"\r\n onClick={onReset}\r\n className=\"flex items-center gap-1.5 text-xs font-medium text-dp-text-muted hover:text-dp-text transition-colors\"\r\n >\r\n <RotateCcw size={13} />\r\n Reset\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => onApply?.(value)}\r\n className=\"px-5 py-1.5 bg-primary text-primary-foreground text-xs font-semibold rounded hover:opacity-90 shadow-sm transition-all active:scale-[0.98]\"\r\n >\r\n Apply\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n },\r\n);\r\n\r\nDatePicker.displayName = \"DatePicker\";\r\n\r\nexport default DatePicker;\r\n","import * as React from \"react\";\r\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\nconst Popover = PopoverPrimitive.Root;\r\n\r\nconst PopoverTrigger = PopoverPrimitive.Trigger;\r\n\r\nconst PopoverContent = React.forwardRef<\r\n React.ElementRef<typeof PopoverPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\r\n>(({ className, align = \"center\", sideOffset = 4, ...props }, ref) => (\r\n <PopoverPrimitive.Portal>\r\n <PopoverPrimitive.Content\r\n ref={ref}\r\n align={align}\r\n sideOffset={sideOffset}\r\n className={cn(\r\n \"z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\r\n className,\r\n )}\r\n {...props}\r\n />\r\n </PopoverPrimitive.Portal>\r\n));\r\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\r\n\r\nexport { Popover, PopoverTrigger, PopoverContent };\r\n","import React, { useState, useCallback } from \"react\";\r\nimport { format } from \"date-fns\";\r\nimport { CalendarIcon, X } from \"lucide-react\";\r\nimport { Popover, PopoverContent, PopoverTrigger } from \"../ui/popover\";\r\nimport { DatePicker } from \"./DatePicker\";\r\nimport type { DatePickerProps, DateRange } from \"./types\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\nexport interface DatePickerInputProps extends Omit<\r\n DatePickerProps,\r\n \"showFooter\" | \"className\"\r\n> {\r\n /** Placeholder text when no date is selected */\r\n placeholder?: string;\r\n /** Date display format string (date-fns format) */\r\n displayFormat?: string;\r\n /** Width class for the input trigger */\r\n triggerClassName?: string;\r\n /** Class for the popover content */\r\n popoverClassName?: string;\r\n /** Class for the calendar inside the popover */\r\n calendarClassName?: string;\r\n /** Whether the input is disabled */\r\n disabled?: boolean;\r\n /** Whether to show a clear button */\r\n clearable?: boolean;\r\n /** Popover alignment */\r\n align?: \"start\" | \"center\" | \"end\";\r\n /** Label text above the input */\r\n label?: string;\r\n}\r\n\r\nexport const DatePickerInput: React.FC<DatePickerInputProps> = ({\r\n mode = \"single\",\r\n value,\r\n onChange,\r\n onApply,\r\n onReset,\r\n placeholder,\r\n displayFormat = \"MMM d, yyyy\",\r\n triggerClassName,\r\n popoverClassName,\r\n calendarClassName,\r\n disabled = false,\r\n clearable = true,\r\n align = \"start\",\r\n label,\r\n numberOfMonths,\r\n presets,\r\n minDate,\r\n maxDate,\r\n disabledDates,\r\n weekStart,\r\n renderDay,\r\n}) => {\r\n const [open, setOpen] = useState(false);\r\n\r\n const defaultPlaceholder =\r\n mode === \"range\" ? \"Select date range...\" : \"Select a date...\";\r\n\r\n const displayValue = (() => {\r\n if (mode === \"single\" && value instanceof Date) {\r\n return format(value, displayFormat);\r\n }\r\n if (mode === \"range\" && value && \"start\" in value) {\r\n const range = value as DateRange;\r\n if (range.start && range.end) {\r\n return `${format(range.start, displayFormat)} – ${format(range.end, displayFormat)}`;\r\n }\r\n if (range.start) {\r\n return `${format(range.start, displayFormat)} – ...`;\r\n }\r\n }\r\n return \"\";\r\n })();\r\n\r\n const handleApply = useCallback(\r\n (val: Date | DateRange | undefined) => {\r\n onApply?.(val);\r\n setOpen(false);\r\n },\r\n [onApply],\r\n );\r\n\r\n const handleClear = useCallback(\r\n (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n onReset?.();\r\n },\r\n [onReset],\r\n );\r\n\r\n const handleChange = useCallback(\r\n (val: Date | DateRange) => {\r\n onChange?.(val);\r\n // Auto-close on single date selection (no footer)\r\n if (mode === \"single\") {\r\n setOpen(false);\r\n }\r\n },\r\n [onChange, mode],\r\n );\r\n\r\n return (\r\n <div className=\"flex flex-col gap-1.5\">\r\n {label && (\r\n <label className=\"text-sm font-medium text-foreground\">{label}</label>\r\n )}\r\n <Popover open={open} onOpenChange={setOpen}>\r\n <PopoverTrigger asChild>\r\n <button\r\n type=\"button\"\r\n disabled={disabled}\r\n className={cn(\r\n \"inline-flex items-center gap-2 h-10 px-3 rounded-lg border border-input bg-background text-sm\",\r\n \"ring-offset-background transition-colors\",\r\n \"hover:bg-accent/5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\r\n \"disabled:cursor-not-allowed disabled:opacity-50\",\r\n !displayValue && \"text-muted-foreground\",\r\n displayValue && \"text-foreground\",\r\n triggerClassName,\r\n )}\r\n >\r\n <CalendarIcon className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\r\n <span className=\"flex-1 text-left truncate\">\r\n {displayValue || placeholder || defaultPlaceholder}\r\n </span>\r\n {clearable && displayValue && (\r\n <span\r\n role=\"button\"\r\n tabIndex={0}\r\n onClick={handleClear}\r\n onKeyDown={(e) => e.key === \"Enter\" && handleClear(e as any)}\r\n className=\"shrink-0 p-0.5 rounded hover:bg-muted transition-colors\"\r\n aria-label=\"Clear selection\"\r\n >\r\n <X className=\"h-3.5 w-3.5 text-muted-foreground\" />\r\n </span>\r\n )}\r\n </button>\r\n </PopoverTrigger>\r\n <PopoverContent\r\n className={cn(\"w-auto p-0 pointer-events-auto\", popoverClassName)}\r\n align={align}\r\n sideOffset={8}\r\n >\r\n <DatePicker\r\n mode={mode}\r\n value={value}\r\n onChange={handleChange}\r\n onApply={mode === \"range\" ? handleApply : undefined}\r\n onReset={onReset}\r\n numberOfMonths={numberOfMonths ?? (mode === \"range\" ? 2 : 1)}\r\n showFooter={mode === \"range\"}\r\n presets={presets}\r\n minDate={minDate}\r\n maxDate={maxDate}\r\n disabledDates={disabledDates}\r\n weekStart={weekStart}\r\n renderDay={renderDay}\r\n className={cn(\"border-0 shadow-none\", calendarClassName)}\r\n />\r\n </PopoverContent>\r\n </Popover>\r\n </div>\r\n );\r\n};\r\n\r\nexport default DatePickerInput;\r\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "snack-datepicker",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.2",
|
|
4
4
|
"description": "A modern, lightweight and customizable React DatePicker and Date Range Picker with presets, multi-month view and flexible configuration.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|