snack-datepicker 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +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"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,405 @@
1
+ import React, { useState, useCallback, useMemo } from 'react';
2
+ 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 { AnimatePresence, motion } from 'framer-motion';
5
+ import { clsx } from 'clsx';
6
+ import { twMerge } from 'tailwind-merge';
7
+ import { jsxs, jsx } from 'react/jsx-runtime';
8
+
9
+ // src/components/date-picker/DatePicker.tsx
10
+ function cn(...inputs) {
11
+ return twMerge(clsx(inputs));
12
+ }
13
+ var WEEK_DAYS_SUN = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"];
14
+ var WEEK_DAYS_MON = ["Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"];
15
+ var MonthGrid = ({
16
+ month,
17
+ mode,
18
+ selectedDate,
19
+ selectedRange,
20
+ hoverDate,
21
+ onDateClick,
22
+ onDateHover,
23
+ minDate,
24
+ maxDate,
25
+ disabledDates = [],
26
+ weekStart = 0,
27
+ renderDay,
28
+ showLabel = true
29
+ }) => {
30
+ const days = useMemo(() => {
31
+ return eachDayOfInterval({
32
+ start: startOfMonth(month),
33
+ end: endOfMonth(month)
34
+ });
35
+ }, [month]);
36
+ const weekDays = weekStart === 1 ? WEEK_DAYS_MON : WEEK_DAYS_SUN;
37
+ const startPad = useMemo(() => {
38
+ const dayOfWeek = days[0].getDay();
39
+ return weekStart === 1 ? dayOfWeek === 0 ? 6 : dayOfWeek - 1 : dayOfWeek;
40
+ }, [days, weekStart]);
41
+ const isDisabled = (date) => {
42
+ if (minDate && isBefore(date, minDate)) return true;
43
+ if (maxDate && isAfter(date, maxDate)) return true;
44
+ return disabledDates.some((d) => isSameDay(d, date));
45
+ };
46
+ return /* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-[252px]", children: [
47
+ showLabel && /* @__PURE__ */ jsx("div", { className: "text-center mb-3", children: /* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-dp-text", children: format(month, "MMMM yyyy") }) }),
48
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-7 mb-1.5", children: weekDays.map((d) => /* @__PURE__ */ jsx(
49
+ "span",
50
+ {
51
+ className: "text-[11px] font-semibold text-dp-text-muted text-center uppercase tracking-wider py-1",
52
+ children: d
53
+ },
54
+ d
55
+ )) }),
56
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-7", children: [
57
+ [...Array(startPad)].map((_, i) => /* @__PURE__ */ jsx("div", { className: "h-9 w-9" }, `pad-${i}`)),
58
+ days.map((day) => {
59
+ const disabled = isDisabled(day);
60
+ const isSelected = mode === "single" ? selectedDate && isSameDay(day, selectedDate) : selectedRange && (selectedRange.start && isSameDay(day, selectedRange.start) || selectedRange.end && isSameDay(day, selectedRange.end));
61
+ const isStart = mode === "range" && (selectedRange == null ? void 0 : selectedRange.start) && isSameDay(day, selectedRange.start);
62
+ const isEnd = mode === "range" && (selectedRange == null ? void 0 : selectedRange.end) && isSameDay(day, selectedRange.end);
63
+ let inRange = false;
64
+ if (mode === "range" && (selectedRange == null ? void 0 : selectedRange.start)) {
65
+ if (selectedRange.end) {
66
+ inRange = isWithinInterval(day, {
67
+ start: selectedRange.start,
68
+ end: selectedRange.end
69
+ });
70
+ } else if (hoverDate) {
71
+ const rangeStart = isBefore(hoverDate, selectedRange.start) ? hoverDate : selectedRange.start;
72
+ const rangeEnd = isBefore(hoverDate, selectedRange.start) ? selectedRange.start : hoverDate;
73
+ inRange = isWithinInterval(day, {
74
+ start: rangeStart,
75
+ end: rangeEnd
76
+ });
77
+ }
78
+ }
79
+ return /* @__PURE__ */ jsx(
80
+ "button",
81
+ {
82
+ type: "button",
83
+ disabled,
84
+ onClick: () => !disabled && onDateClick(day),
85
+ onMouseEnter: () => !disabled && onDateHover(day),
86
+ onMouseLeave: () => onDateHover(null),
87
+ "aria-label": format(day, "PPPP"),
88
+ "aria-selected": !!isSelected,
89
+ className: cn(
90
+ "relative h-9 w-9 text-sm flex items-center justify-center transition-all tabular-nums",
91
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1",
92
+ "active:scale-[0.96]",
93
+ // Default
94
+ !isSelected && !inRange && "text-dp-text hover:bg-dp-surface-hover rounded-lg",
95
+ // Selected (start/end/single)
96
+ isSelected && "bg-dp-surface-active text-dp-text-selected z-10 shadow-sm font-semibold",
97
+ // Single mode selected
98
+ mode === "single" && isSelected && "rounded-lg",
99
+ // Range endpoints
100
+ isStart && !isEnd && "rounded-l-lg rounded-r-none",
101
+ isEnd && !isStart && "rounded-r-lg rounded-l-none",
102
+ isStart && isEnd && "rounded-lg",
103
+ // In range but not selected
104
+ inRange && !isSelected && "bg-[hsl(var(--dp-range-tint)/0.08)] text-primary rounded-none",
105
+ // Disabled
106
+ disabled && "text-dp-text-muted/40 cursor-not-allowed hover:bg-transparent"
107
+ ),
108
+ children: renderDay ? renderDay(day) : format(day, "d")
109
+ },
110
+ day.toISOString()
111
+ );
112
+ })
113
+ ] })
114
+ ] });
115
+ };
116
+ var MonthGrid_default = React.memo(MonthGrid);
117
+ var MonthSelector = ({
118
+ currentMonth,
119
+ onSelect
120
+ }) => {
121
+ const current = getMonth(currentMonth);
122
+ return /* @__PURE__ */ jsx(
123
+ motion.div,
124
+ {
125
+ initial: { opacity: 0, y: 4 },
126
+ animate: { opacity: 1, y: 0 },
127
+ exit: { opacity: 0, y: -4 },
128
+ transition: { duration: 0.15, ease: [0.25, 0.1, 0.25, 1] },
129
+ className: "grid grid-cols-3 gap-2 w-full max-w-[320px] mx-auto",
130
+ children: Array.from({ length: 12 }).map((_, i) => /* @__PURE__ */ jsx(
131
+ "button",
132
+ {
133
+ type: "button",
134
+ onClick: () => onSelect(i),
135
+ className: cn(
136
+ "py-3 text-sm font-medium rounded-lg transition-all active:scale-[0.97]",
137
+ current === i ? "bg-dp-surface-active text-dp-text-selected shadow-sm" : "hover:bg-dp-surface-hover text-dp-text"
138
+ ),
139
+ children: format(new Date(2024, i, 1), "MMM")
140
+ },
141
+ i
142
+ ))
143
+ },
144
+ "month-selector"
145
+ );
146
+ };
147
+ var MonthSelector_default = MonthSelector;
148
+ var YearSelector = ({
149
+ currentYear,
150
+ onSelect,
151
+ minDate,
152
+ maxDate
153
+ }) => {
154
+ const years = Array.from({ length: 12 }, (_, i) => currentYear - 5 + i);
155
+ return /* @__PURE__ */ jsx(
156
+ motion.div,
157
+ {
158
+ initial: { opacity: 0, y: 4 },
159
+ animate: { opacity: 1, y: 0 },
160
+ exit: { opacity: 0, y: -4 },
161
+ transition: { duration: 0.15, ease: [0.25, 0.1, 0.25, 1] },
162
+ className: "grid grid-cols-3 gap-2 w-full max-w-[320px] mx-auto",
163
+ children: years.map((y) => {
164
+ const disabled = minDate && y < minDate.getFullYear() || maxDate && y > maxDate.getFullYear();
165
+ return /* @__PURE__ */ jsx(
166
+ "button",
167
+ {
168
+ type: "button",
169
+ disabled: !!disabled,
170
+ onClick: () => !disabled && onSelect(y),
171
+ className: cn(
172
+ "py-3 text-sm font-medium rounded-lg transition-all active:scale-[0.97]",
173
+ currentYear === y ? "bg-dp-surface-active text-dp-text-selected shadow-sm" : "hover:bg-dp-surface-hover text-dp-text",
174
+ disabled && "opacity-30 cursor-not-allowed"
175
+ ),
176
+ children: y
177
+ },
178
+ y
179
+ );
180
+ })
181
+ },
182
+ "year-selector"
183
+ );
184
+ };
185
+ var YearSelector_default = YearSelector;
186
+ var DatePicker = React.forwardRef(
187
+ ({
188
+ mode = "single",
189
+ value,
190
+ onChange,
191
+ onApply,
192
+ onReset,
193
+ minDate,
194
+ maxDate,
195
+ disabledDates,
196
+ weekStart = 0,
197
+ numberOfMonths = 2,
198
+ showFooter = true,
199
+ className,
200
+ renderDay,
201
+ presets
202
+ }, ref) => {
203
+ const [viewDate, setViewDate] = useState(() => {
204
+ if (mode === "single" && value instanceof Date) return value;
205
+ if (mode === "range" && value && "start" in value && value.start)
206
+ return value.start;
207
+ return /* @__PURE__ */ new Date();
208
+ });
209
+ const [viewMode, setViewMode] = useState("calendar");
210
+ const [hoverDate, setHoverDate] = useState(null);
211
+ const selectedRange = mode === "range" ? value != null ? value : null : null;
212
+ const selectedDate = mode === "single" ? value != null ? value : null : null;
213
+ const handleDateClick = useCallback(
214
+ (date) => {
215
+ if (mode === "single") {
216
+ onChange == null ? void 0 : onChange(date);
217
+ } else {
218
+ const range = selectedRange || { start: null, end: null };
219
+ if (!range.start || range.start && range.end) {
220
+ onChange == null ? void 0 : onChange({ start: date, end: null });
221
+ } else {
222
+ if (isBefore(date, range.start)) {
223
+ onChange == null ? void 0 : onChange({ start: date, end: range.start });
224
+ } else if (isSameDay(date, range.start)) {
225
+ onChange == null ? void 0 : onChange({ start: date, end: date });
226
+ } else {
227
+ onChange == null ? void 0 : onChange({ start: range.start, end: date });
228
+ }
229
+ }
230
+ }
231
+ },
232
+ [mode, selectedRange, onChange]
233
+ );
234
+ const handleKeyDown = useCallback((e) => {
235
+ if (e.key === "Escape") {
236
+ setViewMode("calendar");
237
+ }
238
+ }, []);
239
+ const handlePresetClick = useCallback(
240
+ (preset) => {
241
+ const range = preset.getValue();
242
+ onChange == null ? void 0 : onChange(range);
243
+ },
244
+ [onChange]
245
+ );
246
+ return /* @__PURE__ */ jsxs(
247
+ "div",
248
+ {
249
+ ref,
250
+ className: cn(
251
+ "inline-flex flex-col rounded-xl border border-dp-border bg-dp-surface select-none antialiased",
252
+ "shadow-[var(--dp-shadow)]",
253
+ className
254
+ ),
255
+ onKeyDown: handleKeyDown,
256
+ role: "application",
257
+ "aria-label": "Date picker",
258
+ children: [
259
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-4 py-3 border-b border-dp-border", children: [
260
+ /* @__PURE__ */ jsx(
261
+ "button",
262
+ {
263
+ type: "button",
264
+ onClick: () => setViewDate(subMonths(viewDate, 1)),
265
+ className: "p-1.5 rounded-md hover:bg-dp-surface-hover text-dp-text-muted hover:text-dp-text transition-colors",
266
+ "aria-label": "Previous month",
267
+ children: /* @__PURE__ */ jsx(ChevronLeft, { size: 16 })
268
+ }
269
+ ),
270
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
271
+ /* @__PURE__ */ jsx(
272
+ "button",
273
+ {
274
+ type: "button",
275
+ onClick: () => setViewMode(viewMode === "month" ? "calendar" : "month"),
276
+ className: cn(
277
+ "text-sm font-semibold px-2 py-1 rounded-md transition-colors",
278
+ viewMode === "month" ? "bg-dp-surface-hover text-dp-text" : "hover:bg-dp-surface-hover text-dp-text"
279
+ ),
280
+ children: format(viewDate, "MMMM")
281
+ }
282
+ ),
283
+ /* @__PURE__ */ jsx(
284
+ "button",
285
+ {
286
+ type: "button",
287
+ onClick: () => setViewMode(viewMode === "year" ? "calendar" : "year"),
288
+ className: cn(
289
+ "text-sm font-semibold px-2 py-1 rounded-md transition-colors",
290
+ viewMode === "year" ? "bg-dp-surface-hover text-dp-text" : "hover:bg-dp-surface-hover text-dp-text"
291
+ ),
292
+ children: format(viewDate, "yyyy")
293
+ }
294
+ )
295
+ ] }),
296
+ /* @__PURE__ */ jsx(
297
+ "button",
298
+ {
299
+ type: "button",
300
+ onClick: () => setViewDate(addMonths(viewDate, 1)),
301
+ className: "p-1.5 rounded-md hover:bg-dp-surface-hover text-dp-text-muted hover:text-dp-text transition-colors",
302
+ "aria-label": "Next month",
303
+ children: /* @__PURE__ */ jsx(ChevronRight, { size: 16 })
304
+ }
305
+ )
306
+ ] }),
307
+ /* @__PURE__ */ jsxs("div", { className: "flex", children: [
308
+ presets && presets.length > 0 && /* @__PURE__ */ jsx("div", { className: "border-r border-dp-border p-3 min-w-[140px] flex flex-col gap-0.5", children: presets.map((preset) => /* @__PURE__ */ jsx(
309
+ "button",
310
+ {
311
+ type: "button",
312
+ onClick: () => handlePresetClick(preset),
313
+ 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",
314
+ children: preset.label
315
+ },
316
+ preset.label
317
+ )) }),
318
+ /* @__PURE__ */ jsx("div", { className: "p-4 flex-1", children: /* @__PURE__ */ jsxs(AnimatePresence, { mode: "wait", children: [
319
+ viewMode === "calendar" && /* @__PURE__ */ jsx(
320
+ motion.div,
321
+ {
322
+ initial: { opacity: 0, y: 4 },
323
+ animate: { opacity: 1, y: 0 },
324
+ exit: { opacity: 0, y: -4 },
325
+ transition: { duration: 0.15, ease: [0.25, 0.1, 0.25, 1] },
326
+ className: "flex flex-col md:flex-row gap-6",
327
+ children: [...Array(numberOfMonths)].map((_, i) => /* @__PURE__ */ jsx(
328
+ MonthGrid_default,
329
+ {
330
+ month: addMonths(viewDate, i),
331
+ mode,
332
+ selectedDate,
333
+ selectedRange,
334
+ hoverDate,
335
+ onDateClick: handleDateClick,
336
+ onDateHover: setHoverDate,
337
+ minDate,
338
+ maxDate,
339
+ disabledDates,
340
+ weekStart,
341
+ renderDay,
342
+ showLabel: numberOfMonths > 1
343
+ },
344
+ i
345
+ ))
346
+ },
347
+ "calendar"
348
+ ),
349
+ viewMode === "month" && /* @__PURE__ */ jsx(
350
+ MonthSelector_default,
351
+ {
352
+ currentMonth: viewDate,
353
+ onSelect: (m) => {
354
+ setViewDate(setMonth(viewDate, m));
355
+ setViewMode("calendar");
356
+ }
357
+ }
358
+ ),
359
+ viewMode === "year" && /* @__PURE__ */ jsx(
360
+ YearSelector_default,
361
+ {
362
+ currentYear: getYear(viewDate),
363
+ onSelect: (y) => {
364
+ setViewDate(setYear(viewDate, y));
365
+ setViewMode("calendar");
366
+ },
367
+ minDate,
368
+ maxDate
369
+ }
370
+ )
371
+ ] }) })
372
+ ] }),
373
+ showFooter && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-4 py-3 bg-dp-footer border-t border-dp-border rounded-b-xl", children: [
374
+ /* @__PURE__ */ jsxs(
375
+ "button",
376
+ {
377
+ type: "button",
378
+ onClick: onReset,
379
+ className: "flex items-center gap-1.5 text-xs font-medium text-dp-text-muted hover:text-dp-text transition-colors",
380
+ children: [
381
+ /* @__PURE__ */ jsx(RotateCcw, { size: 13 }),
382
+ "Reset"
383
+ ]
384
+ }
385
+ ),
386
+ /* @__PURE__ */ jsx(
387
+ "button",
388
+ {
389
+ type: "button",
390
+ onClick: () => onApply == null ? void 0 : onApply(value),
391
+ 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]",
392
+ children: "Apply"
393
+ }
394
+ )
395
+ ] })
396
+ ]
397
+ }
398
+ );
399
+ }
400
+ );
401
+ DatePicker.displayName = "DatePicker";
402
+
403
+ export { DatePicker };
404
+ //# sourceMappingURL=index.mjs.map
405
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +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"]}