snack-datepicker 0.0.2 → 0.0.3
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/README.md +9 -7
- package/dist/index.js +21 -21
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +21 -21
- package/dist/index.mjs.map +1 -1
- package/dist/style.css +37 -6
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -57,11 +57,13 @@ npm install react react-dom
|
|
|
57
57
|
### Basic
|
|
58
58
|
|
|
59
59
|
```tsx
|
|
60
|
-
import {
|
|
60
|
+
import { DatePickerInput } from "snack-datepicker";
|
|
61
61
|
import "snack-datepicker/dist/style.css";
|
|
62
62
|
|
|
63
63
|
function App() {
|
|
64
|
-
return
|
|
64
|
+
return (
|
|
65
|
+
<DatePickerInput mode="single" onChange={(date) => console.log(date)} />
|
|
66
|
+
);
|
|
65
67
|
}
|
|
66
68
|
|
|
67
69
|
export default App;
|
|
@@ -70,7 +72,7 @@ export default App;
|
|
|
70
72
|
### Date Range Example
|
|
71
73
|
|
|
72
74
|
```tsx
|
|
73
|
-
import {
|
|
75
|
+
import { DatePickerInput } from "snack-datepicker";
|
|
74
76
|
import { useState } from "react";
|
|
75
77
|
|
|
76
78
|
function App() {
|
|
@@ -80,7 +82,7 @@ function App() {
|
|
|
80
82
|
});
|
|
81
83
|
|
|
82
84
|
return (
|
|
83
|
-
<
|
|
85
|
+
<DatePickerInput
|
|
84
86
|
mode="range"
|
|
85
87
|
value={range}
|
|
86
88
|
onChange={(value) => setRange(value)}
|
|
@@ -93,7 +95,7 @@ function App() {
|
|
|
93
95
|
### Preset Range Example
|
|
94
96
|
|
|
95
97
|
```tsx
|
|
96
|
-
import {
|
|
98
|
+
import { DatePickerInput } from "snack-datepicker";
|
|
97
99
|
|
|
98
100
|
const presets = [
|
|
99
101
|
{
|
|
@@ -117,7 +119,7 @@ const presets = [
|
|
|
117
119
|
];
|
|
118
120
|
|
|
119
121
|
function App() {
|
|
120
|
-
return <
|
|
122
|
+
return <DatePickerInput mode="range" presets={presets} />;
|
|
121
123
|
}
|
|
122
124
|
```
|
|
123
125
|
|
|
@@ -155,7 +157,7 @@ export interface PresetRange {
|
|
|
155
157
|
getValue: () => DateRange;
|
|
156
158
|
}
|
|
157
159
|
|
|
158
|
-
export interface
|
|
160
|
+
export interface DatePickerInputProps {
|
|
159
161
|
mode?: DatePickerMode;
|
|
160
162
|
value?: Date | DateRange;
|
|
161
163
|
onChange?: (value: Date | DateRange) => void;
|
package/dist/index.js
CHANGED
|
@@ -70,11 +70,11 @@ var MonthGrid = ({
|
|
|
70
70
|
return disabledDates.some((d) => dateFns.isSameDay(d, date));
|
|
71
71
|
};
|
|
72
72
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 min-w-[252px]", children: [
|
|
73
|
-
showLabel && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-center mb-3", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-medium text-
|
|
73
|
+
showLabel && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-center mb-3", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-medium text-gray-900", children: dateFns.format(month, "MMMM yyyy") }) }),
|
|
74
74
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-7 mb-1.5", children: weekDays.map((d) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
75
75
|
"span",
|
|
76
76
|
{
|
|
77
|
-
className: "text-[11px] font-semibold text-
|
|
77
|
+
className: "text-[11px] font-semibold text-gray-400 text-center uppercase tracking-wider py-1",
|
|
78
78
|
children: d
|
|
79
79
|
},
|
|
80
80
|
d
|
|
@@ -114,12 +114,12 @@ var MonthGrid = ({
|
|
|
114
114
|
"aria-selected": !!isSelected,
|
|
115
115
|
className: cn(
|
|
116
116
|
"relative h-9 w-9 text-sm flex items-center justify-center transition-all tabular-nums",
|
|
117
|
-
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-
|
|
117
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-1",
|
|
118
118
|
"active:scale-[0.96]",
|
|
119
119
|
// Default
|
|
120
|
-
!isSelected && !inRange && "text-
|
|
120
|
+
!isSelected && !inRange && "text-gray-900 hover:bg-gray-100 rounded-lg",
|
|
121
121
|
// Selected (start/end/single)
|
|
122
|
-
isSelected && "bg-
|
|
122
|
+
isSelected && "bg-primary text-primary-foreground z-10 shadow-sm font-semibold",
|
|
123
123
|
// Single mode selected
|
|
124
124
|
mode === "single" && isSelected && "rounded-lg",
|
|
125
125
|
// Range endpoints
|
|
@@ -127,9 +127,9 @@ var MonthGrid = ({
|
|
|
127
127
|
isEnd && !isStart && "rounded-r-lg rounded-l-none",
|
|
128
128
|
isStart && isEnd && "rounded-lg",
|
|
129
129
|
// In range but not selected
|
|
130
|
-
inRange && !isSelected && "bg-
|
|
130
|
+
inRange && !isSelected && "bg-primary/10 text-primary rounded-none",
|
|
131
131
|
// Disabled
|
|
132
|
-
disabled && "text-
|
|
132
|
+
disabled && "text-primary/40 cursor-not-allowed hover:bg-transparent"
|
|
133
133
|
),
|
|
134
134
|
children: renderDay ? renderDay(day) : dateFns.format(day, "d")
|
|
135
135
|
},
|
|
@@ -160,7 +160,7 @@ var MonthSelector = ({
|
|
|
160
160
|
onClick: () => onSelect(i),
|
|
161
161
|
className: cn(
|
|
162
162
|
"py-3 text-sm font-medium rounded-lg transition-all active:scale-[0.97]",
|
|
163
|
-
current === i ? "bg-
|
|
163
|
+
current === i ? "bg-primary text-primary-foreground shadow-sm" : "hover:bg-gray-100 text-gray-900"
|
|
164
164
|
),
|
|
165
165
|
children: dateFns.format(new Date(2024, i, 1), "MMM")
|
|
166
166
|
},
|
|
@@ -196,7 +196,7 @@ var YearSelector = ({
|
|
|
196
196
|
onClick: () => !disabled && onSelect(y),
|
|
197
197
|
className: cn(
|
|
198
198
|
"py-3 text-sm font-medium rounded-lg transition-all active:scale-[0.97]",
|
|
199
|
-
currentYear === y ? "bg-
|
|
199
|
+
currentYear === y ? "bg-primary text-primary-foreground shadow-sm" : "hover:bg-gray-100 text-gray-900",
|
|
200
200
|
disabled && "opacity-30 cursor-not-allowed"
|
|
201
201
|
),
|
|
202
202
|
children: y
|
|
@@ -274,21 +274,21 @@ var DatePicker = React__namespace.default.forwardRef(
|
|
|
274
274
|
{
|
|
275
275
|
ref,
|
|
276
276
|
className: cn(
|
|
277
|
-
"inline-flex flex-col rounded-xl border border-
|
|
278
|
-
"shadow-
|
|
277
|
+
"inline-flex flex-col rounded-xl border border-gray-200 bg-white select-none antialiased",
|
|
278
|
+
"shadow-md",
|
|
279
279
|
className
|
|
280
280
|
),
|
|
281
281
|
onKeyDown: handleKeyDown,
|
|
282
282
|
role: "application",
|
|
283
283
|
"aria-label": "Date picker",
|
|
284
284
|
children: [
|
|
285
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between px-4 py-3 border-b border-
|
|
285
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between px-4 py-3 border-b border-gray-200", children: [
|
|
286
286
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
287
287
|
"button",
|
|
288
288
|
{
|
|
289
289
|
type: "button",
|
|
290
290
|
onClick: () => setViewDate(dateFns.subMonths(viewDate, 1)),
|
|
291
|
-
className: "p-1.5 rounded-md hover:bg-
|
|
291
|
+
className: "p-1.5 rounded-md hover:bg-gray-100 text-gray-400 hover:text-gray-900 transition-colors",
|
|
292
292
|
"aria-label": "Previous month",
|
|
293
293
|
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeft, { size: 16 })
|
|
294
294
|
}
|
|
@@ -301,7 +301,7 @@ var DatePicker = React__namespace.default.forwardRef(
|
|
|
301
301
|
onClick: () => setViewMode(viewMode === "month" ? "calendar" : "month"),
|
|
302
302
|
className: cn(
|
|
303
303
|
"text-sm font-semibold px-2 py-1 rounded-md transition-colors",
|
|
304
|
-
viewMode === "month" ? "bg-
|
|
304
|
+
viewMode === "month" ? "bg-gray-100 text-gray-900" : "hover:bg-gray-100 text-gray-900"
|
|
305
305
|
),
|
|
306
306
|
children: dateFns.format(viewDate, "MMMM")
|
|
307
307
|
}
|
|
@@ -313,7 +313,7 @@ var DatePicker = React__namespace.default.forwardRef(
|
|
|
313
313
|
onClick: () => setViewMode(viewMode === "year" ? "calendar" : "year"),
|
|
314
314
|
className: cn(
|
|
315
315
|
"text-sm font-semibold px-2 py-1 rounded-md transition-colors",
|
|
316
|
-
viewMode === "year" ? "bg-
|
|
316
|
+
viewMode === "year" ? "bg-gray-100 text-gray-900" : "hover:bg-gray-100 text-gray-900"
|
|
317
317
|
),
|
|
318
318
|
children: dateFns.format(viewDate, "yyyy")
|
|
319
319
|
}
|
|
@@ -324,19 +324,19 @@ var DatePicker = React__namespace.default.forwardRef(
|
|
|
324
324
|
{
|
|
325
325
|
type: "button",
|
|
326
326
|
onClick: () => setViewDate(dateFns.addMonths(viewDate, 1)),
|
|
327
|
-
className: "p-1.5 rounded-md hover:bg-
|
|
327
|
+
className: "p-1.5 rounded-md hover:bg-gray-100 text-gray-400 hover:text-gray-900 transition-colors",
|
|
328
328
|
"aria-label": "Next month",
|
|
329
329
|
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { size: 16 })
|
|
330
330
|
}
|
|
331
331
|
)
|
|
332
332
|
] }),
|
|
333
333
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex", children: [
|
|
334
|
-
presets && presets.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "border-r border-
|
|
334
|
+
presets && presets.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "border-r border-gray-200 p-3 min-w-[140px] flex flex-col gap-0.5", children: presets.map((preset) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
335
335
|
"button",
|
|
336
336
|
{
|
|
337
337
|
type: "button",
|
|
338
338
|
onClick: () => handlePresetClick(preset),
|
|
339
|
-
className: "text-left text-xs font-medium px-2.5 py-1.5 rounded-md text-
|
|
339
|
+
className: "text-left text-xs font-medium px-2.5 py-1.5 rounded-md text-gray-400 hover:text-gray-900 hover:bg-gray-100 transition-colors",
|
|
340
340
|
children: preset.label
|
|
341
341
|
},
|
|
342
342
|
preset.label
|
|
@@ -396,13 +396,13 @@ var DatePicker = React__namespace.default.forwardRef(
|
|
|
396
396
|
)
|
|
397
397
|
] }) })
|
|
398
398
|
] }),
|
|
399
|
-
showFooter && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between px-4 py-3 bg-
|
|
399
|
+
showFooter && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between px-4 py-3 bg-gray-50 border-t border-gray-200 rounded-b-xl", children: [
|
|
400
400
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
401
401
|
"button",
|
|
402
402
|
{
|
|
403
403
|
type: "button",
|
|
404
404
|
onClick: onReset,
|
|
405
|
-
className: "flex items-center gap-1.5 text-xs font-medium text-
|
|
405
|
+
className: "flex items-center gap-1.5 text-xs font-medium text-gray-400 hover:text-gray-900 transition-colors",
|
|
406
406
|
children: [
|
|
407
407
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.RotateCcw, { size: 13 }),
|
|
408
408
|
"Reset"
|
|
@@ -414,7 +414,7 @@ var DatePicker = React__namespace.default.forwardRef(
|
|
|
414
414
|
{
|
|
415
415
|
type: "button",
|
|
416
416
|
onClick: () => onApply == null ? void 0 : onApply(value),
|
|
417
|
-
className: "px-5 py-1.5 bg-primary text-primary-foreground text-xs font-semibold rounded
|
|
417
|
+
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]",
|
|
418
418
|
children: "Apply"
|
|
419
419
|
}
|
|
420
420
|
)
|
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","../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":"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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","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"]}
|
|
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":"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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-gray-900\">\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-gray-400 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-primary focus-visible:ring-offset-1\",\r\n \"active:scale-[0.96]\",\r\n // Default\r\n !isSelected &&\r\n !inRange &&\r\n \"text-gray-900 hover:bg-gray-100 rounded-lg\",\r\n // Selected (start/end/single)\r\n isSelected &&\r\n \"bg-primary text-primary-foreground 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-primary/10 text-primary rounded-none\",\r\n // Disabled\r\n disabled &&\r\n \"text-primary/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-primary text-primary-foreground shadow-sm\"\r\n : \"hover:bg-gray-100 text-gray-900\",\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-primary text-primary-foreground shadow-sm\"\r\n : \"hover:bg-gray-100 text-gray-900\",\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-gray-200 bg-white select-none antialiased\",\r\n \"shadow-md\",\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-gray-200\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setViewDate(subMonths(viewDate, 1))}\r\n className=\"p-1.5 rounded-md hover:bg-gray-100 text-gray-400 hover:text-gray-900 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-gray-100 text-gray-900\"\r\n : \"hover:bg-gray-100 text-gray-900\",\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-gray-100 text-gray-900\"\r\n : \"hover:bg-gray-100 text-gray-900\",\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-gray-100 text-gray-400 hover:text-gray-900 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-gray-200 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-gray-400 hover:text-gray-900 hover:bg-gray-100 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-gray-50 border-t border-gray-200 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-gray-400 hover:text-gray-900 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
|
@@ -46,11 +46,11 @@ var MonthGrid = ({
|
|
|
46
46
|
return disabledDates.some((d) => isSameDay(d, date));
|
|
47
47
|
};
|
|
48
48
|
return /* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-[252px]", children: [
|
|
49
|
-
showLabel && /* @__PURE__ */ jsx("div", { className: "text-center mb-3", children: /* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-
|
|
49
|
+
showLabel && /* @__PURE__ */ jsx("div", { className: "text-center mb-3", children: /* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-gray-900", children: format(month, "MMMM yyyy") }) }),
|
|
50
50
|
/* @__PURE__ */ jsx("div", { className: "grid grid-cols-7 mb-1.5", children: weekDays.map((d) => /* @__PURE__ */ jsx(
|
|
51
51
|
"span",
|
|
52
52
|
{
|
|
53
|
-
className: "text-[11px] font-semibold text-
|
|
53
|
+
className: "text-[11px] font-semibold text-gray-400 text-center uppercase tracking-wider py-1",
|
|
54
54
|
children: d
|
|
55
55
|
},
|
|
56
56
|
d
|
|
@@ -90,12 +90,12 @@ var MonthGrid = ({
|
|
|
90
90
|
"aria-selected": !!isSelected,
|
|
91
91
|
className: cn(
|
|
92
92
|
"relative h-9 w-9 text-sm flex items-center justify-center transition-all tabular-nums",
|
|
93
|
-
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-
|
|
93
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-1",
|
|
94
94
|
"active:scale-[0.96]",
|
|
95
95
|
// Default
|
|
96
|
-
!isSelected && !inRange && "text-
|
|
96
|
+
!isSelected && !inRange && "text-gray-900 hover:bg-gray-100 rounded-lg",
|
|
97
97
|
// Selected (start/end/single)
|
|
98
|
-
isSelected && "bg-
|
|
98
|
+
isSelected && "bg-primary text-primary-foreground z-10 shadow-sm font-semibold",
|
|
99
99
|
// Single mode selected
|
|
100
100
|
mode === "single" && isSelected && "rounded-lg",
|
|
101
101
|
// Range endpoints
|
|
@@ -103,9 +103,9 @@ var MonthGrid = ({
|
|
|
103
103
|
isEnd && !isStart && "rounded-r-lg rounded-l-none",
|
|
104
104
|
isStart && isEnd && "rounded-lg",
|
|
105
105
|
// In range but not selected
|
|
106
|
-
inRange && !isSelected && "bg-
|
|
106
|
+
inRange && !isSelected && "bg-primary/10 text-primary rounded-none",
|
|
107
107
|
// Disabled
|
|
108
|
-
disabled && "text-
|
|
108
|
+
disabled && "text-primary/40 cursor-not-allowed hover:bg-transparent"
|
|
109
109
|
),
|
|
110
110
|
children: renderDay ? renderDay(day) : format(day, "d")
|
|
111
111
|
},
|
|
@@ -136,7 +136,7 @@ var MonthSelector = ({
|
|
|
136
136
|
onClick: () => onSelect(i),
|
|
137
137
|
className: cn(
|
|
138
138
|
"py-3 text-sm font-medium rounded-lg transition-all active:scale-[0.97]",
|
|
139
|
-
current === i ? "bg-
|
|
139
|
+
current === i ? "bg-primary text-primary-foreground shadow-sm" : "hover:bg-gray-100 text-gray-900"
|
|
140
140
|
),
|
|
141
141
|
children: format(new Date(2024, i, 1), "MMM")
|
|
142
142
|
},
|
|
@@ -172,7 +172,7 @@ var YearSelector = ({
|
|
|
172
172
|
onClick: () => !disabled && onSelect(y),
|
|
173
173
|
className: cn(
|
|
174
174
|
"py-3 text-sm font-medium rounded-lg transition-all active:scale-[0.97]",
|
|
175
|
-
currentYear === y ? "bg-
|
|
175
|
+
currentYear === y ? "bg-primary text-primary-foreground shadow-sm" : "hover:bg-gray-100 text-gray-900",
|
|
176
176
|
disabled && "opacity-30 cursor-not-allowed"
|
|
177
177
|
),
|
|
178
178
|
children: y
|
|
@@ -250,21 +250,21 @@ var DatePicker = React__default.forwardRef(
|
|
|
250
250
|
{
|
|
251
251
|
ref,
|
|
252
252
|
className: cn(
|
|
253
|
-
"inline-flex flex-col rounded-xl border border-
|
|
254
|
-
"shadow-
|
|
253
|
+
"inline-flex flex-col rounded-xl border border-gray-200 bg-white select-none antialiased",
|
|
254
|
+
"shadow-md",
|
|
255
255
|
className
|
|
256
256
|
),
|
|
257
257
|
onKeyDown: handleKeyDown,
|
|
258
258
|
role: "application",
|
|
259
259
|
"aria-label": "Date picker",
|
|
260
260
|
children: [
|
|
261
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-4 py-3 border-b border-
|
|
261
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-4 py-3 border-b border-gray-200", children: [
|
|
262
262
|
/* @__PURE__ */ jsx(
|
|
263
263
|
"button",
|
|
264
264
|
{
|
|
265
265
|
type: "button",
|
|
266
266
|
onClick: () => setViewDate(subMonths(viewDate, 1)),
|
|
267
|
-
className: "p-1.5 rounded-md hover:bg-
|
|
267
|
+
className: "p-1.5 rounded-md hover:bg-gray-100 text-gray-400 hover:text-gray-900 transition-colors",
|
|
268
268
|
"aria-label": "Previous month",
|
|
269
269
|
children: /* @__PURE__ */ jsx(ChevronLeft, { size: 16 })
|
|
270
270
|
}
|
|
@@ -277,7 +277,7 @@ var DatePicker = React__default.forwardRef(
|
|
|
277
277
|
onClick: () => setViewMode(viewMode === "month" ? "calendar" : "month"),
|
|
278
278
|
className: cn(
|
|
279
279
|
"text-sm font-semibold px-2 py-1 rounded-md transition-colors",
|
|
280
|
-
viewMode === "month" ? "bg-
|
|
280
|
+
viewMode === "month" ? "bg-gray-100 text-gray-900" : "hover:bg-gray-100 text-gray-900"
|
|
281
281
|
),
|
|
282
282
|
children: format(viewDate, "MMMM")
|
|
283
283
|
}
|
|
@@ -289,7 +289,7 @@ var DatePicker = React__default.forwardRef(
|
|
|
289
289
|
onClick: () => setViewMode(viewMode === "year" ? "calendar" : "year"),
|
|
290
290
|
className: cn(
|
|
291
291
|
"text-sm font-semibold px-2 py-1 rounded-md transition-colors",
|
|
292
|
-
viewMode === "year" ? "bg-
|
|
292
|
+
viewMode === "year" ? "bg-gray-100 text-gray-900" : "hover:bg-gray-100 text-gray-900"
|
|
293
293
|
),
|
|
294
294
|
children: format(viewDate, "yyyy")
|
|
295
295
|
}
|
|
@@ -300,19 +300,19 @@ var DatePicker = React__default.forwardRef(
|
|
|
300
300
|
{
|
|
301
301
|
type: "button",
|
|
302
302
|
onClick: () => setViewDate(addMonths(viewDate, 1)),
|
|
303
|
-
className: "p-1.5 rounded-md hover:bg-
|
|
303
|
+
className: "p-1.5 rounded-md hover:bg-gray-100 text-gray-400 hover:text-gray-900 transition-colors",
|
|
304
304
|
"aria-label": "Next month",
|
|
305
305
|
children: /* @__PURE__ */ jsx(ChevronRight, { size: 16 })
|
|
306
306
|
}
|
|
307
307
|
)
|
|
308
308
|
] }),
|
|
309
309
|
/* @__PURE__ */ jsxs("div", { className: "flex", children: [
|
|
310
|
-
presets && presets.length > 0 && /* @__PURE__ */ jsx("div", { className: "border-r border-
|
|
310
|
+
presets && presets.length > 0 && /* @__PURE__ */ jsx("div", { className: "border-r border-gray-200 p-3 min-w-[140px] flex flex-col gap-0.5", children: presets.map((preset) => /* @__PURE__ */ jsx(
|
|
311
311
|
"button",
|
|
312
312
|
{
|
|
313
313
|
type: "button",
|
|
314
314
|
onClick: () => handlePresetClick(preset),
|
|
315
|
-
className: "text-left text-xs font-medium px-2.5 py-1.5 rounded-md text-
|
|
315
|
+
className: "text-left text-xs font-medium px-2.5 py-1.5 rounded-md text-gray-400 hover:text-gray-900 hover:bg-gray-100 transition-colors",
|
|
316
316
|
children: preset.label
|
|
317
317
|
},
|
|
318
318
|
preset.label
|
|
@@ -372,13 +372,13 @@ var DatePicker = React__default.forwardRef(
|
|
|
372
372
|
)
|
|
373
373
|
] }) })
|
|
374
374
|
] }),
|
|
375
|
-
showFooter && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-4 py-3 bg-
|
|
375
|
+
showFooter && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-4 py-3 bg-gray-50 border-t border-gray-200 rounded-b-xl", children: [
|
|
376
376
|
/* @__PURE__ */ jsxs(
|
|
377
377
|
"button",
|
|
378
378
|
{
|
|
379
379
|
type: "button",
|
|
380
380
|
onClick: onReset,
|
|
381
|
-
className: "flex items-center gap-1.5 text-xs font-medium text-
|
|
381
|
+
className: "flex items-center gap-1.5 text-xs font-medium text-gray-400 hover:text-gray-900 transition-colors",
|
|
382
382
|
children: [
|
|
383
383
|
/* @__PURE__ */ jsx(RotateCcw, { size: 13 }),
|
|
384
384
|
"Reset"
|
|
@@ -390,7 +390,7 @@ var DatePicker = React__default.forwardRef(
|
|
|
390
390
|
{
|
|
391
391
|
type: "button",
|
|
392
392
|
onClick: () => onApply == null ? void 0 : onApply(value),
|
|
393
|
-
className: "px-5 py-1.5 bg-primary text-primary-foreground text-xs font-semibold rounded
|
|
393
|
+
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]",
|
|
394
394
|
children: "Apply"
|
|
395
395
|
}
|
|
396
396
|
)
|
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","../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"]}
|
|
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-gray-900\">\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-gray-400 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-primary focus-visible:ring-offset-1\",\r\n \"active:scale-[0.96]\",\r\n // Default\r\n !isSelected &&\r\n !inRange &&\r\n \"text-gray-900 hover:bg-gray-100 rounded-lg\",\r\n // Selected (start/end/single)\r\n isSelected &&\r\n \"bg-primary text-primary-foreground 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-primary/10 text-primary rounded-none\",\r\n // Disabled\r\n disabled &&\r\n \"text-primary/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-primary text-primary-foreground shadow-sm\"\r\n : \"hover:bg-gray-100 text-gray-900\",\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-primary text-primary-foreground shadow-sm\"\r\n : \"hover:bg-gray-100 text-gray-900\",\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-gray-200 bg-white select-none antialiased\",\r\n \"shadow-md\",\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-gray-200\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setViewDate(subMonths(viewDate, 1))}\r\n className=\"p-1.5 rounded-md hover:bg-gray-100 text-gray-400 hover:text-gray-900 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-gray-100 text-gray-900\"\r\n : \"hover:bg-gray-100 text-gray-900\",\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-gray-100 text-gray-900\"\r\n : \"hover:bg-gray-100 text-gray-900\",\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-gray-100 text-gray-400 hover:text-gray-900 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-gray-200 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-gray-400 hover:text-gray-900 hover:bg-gray-100 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-gray-50 border-t border-gray-200 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-gray-400 hover:text-gray-900 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/style.css
CHANGED
|
@@ -4,6 +4,12 @@
|
|
|
4
4
|
"Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
|
|
5
5
|
--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
|
|
6
6
|
"Courier New", monospace;
|
|
7
|
+
--color-gray-50: oklch(98.5% 0.002 247.839);
|
|
8
|
+
--color-gray-100: oklch(96.7% 0.003 264.542);
|
|
9
|
+
--color-gray-200: oklch(92.8% 0.006 264.531);
|
|
10
|
+
--color-gray-400: oklch(70.7% 0.022 261.325);
|
|
11
|
+
--color-gray-900: oklch(21% 0.034 264.665);
|
|
12
|
+
--color-white: #fff;
|
|
7
13
|
--spacing: 0.25rem;
|
|
8
14
|
--text-xs: 0.75rem;
|
|
9
15
|
--text-xs--line-height: calc(1 / 0.75);
|
|
@@ -359,8 +365,17 @@ button, input:where([type="button"], [type="reset"], [type="submit"]), ::file-se
|
|
|
359
365
|
border-bottom-style: var(--tw-border-style);
|
|
360
366
|
border-bottom-width: 1px;
|
|
361
367
|
}
|
|
362
|
-
.
|
|
363
|
-
|
|
368
|
+
.border-gray-200 {
|
|
369
|
+
border-color: var(--color-gray-200);
|
|
370
|
+
}
|
|
371
|
+
.bg-gray-50 {
|
|
372
|
+
background-color: var(--color-gray-50);
|
|
373
|
+
}
|
|
374
|
+
.bg-gray-100 {
|
|
375
|
+
background-color: var(--color-gray-100);
|
|
376
|
+
}
|
|
377
|
+
.bg-white {
|
|
378
|
+
background-color: var(--color-white);
|
|
364
379
|
}
|
|
365
380
|
.p-0 {
|
|
366
381
|
padding: calc(var(--spacing) * 0);
|
|
@@ -430,6 +445,12 @@ button, input:where([type="button"], [type="reset"], [type="submit"]), ::file-se
|
|
|
430
445
|
--tw-tracking: var(--tracking-wider);
|
|
431
446
|
letter-spacing: var(--tracking-wider);
|
|
432
447
|
}
|
|
448
|
+
.text-gray-400 {
|
|
449
|
+
color: var(--color-gray-400);
|
|
450
|
+
}
|
|
451
|
+
.text-gray-900 {
|
|
452
|
+
color: var(--color-gray-900);
|
|
453
|
+
}
|
|
433
454
|
.uppercase {
|
|
434
455
|
text-transform: uppercase;
|
|
435
456
|
}
|
|
@@ -444,10 +465,6 @@ button, input:where([type="button"], [type="reset"], [type="submit"]), ::file-se
|
|
|
444
465
|
.opacity-30 {
|
|
445
466
|
opacity: 30%;
|
|
446
467
|
}
|
|
447
|
-
.shadow-\[var\(--dp-shadow\)\] {
|
|
448
|
-
--tw-shadow: var(--dp-shadow);
|
|
449
|
-
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
|
450
|
-
}
|
|
451
468
|
.shadow-md {
|
|
452
469
|
--tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
|
|
453
470
|
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
|
@@ -484,6 +501,13 @@ button, input:where([type="button"], [type="reset"], [type="submit"]), ::file-se
|
|
|
484
501
|
-moz-user-select: none;
|
|
485
502
|
user-select: none;
|
|
486
503
|
}
|
|
504
|
+
.hover\:bg-gray-100 {
|
|
505
|
+
&:hover {
|
|
506
|
+
@media (hover: hover) {
|
|
507
|
+
background-color: var(--color-gray-100);
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
}
|
|
487
511
|
.hover\:bg-transparent {
|
|
488
512
|
&:hover {
|
|
489
513
|
@media (hover: hover) {
|
|
@@ -491,6 +515,13 @@ button, input:where([type="button"], [type="reset"], [type="submit"]), ::file-se
|
|
|
491
515
|
}
|
|
492
516
|
}
|
|
493
517
|
}
|
|
518
|
+
.hover\:text-gray-900 {
|
|
519
|
+
&:hover {
|
|
520
|
+
@media (hover: hover) {
|
|
521
|
+
color: var(--color-gray-900);
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
}
|
|
494
525
|
.hover\:opacity-90 {
|
|
495
526
|
&:hover {
|
|
496
527
|
@media (hover: hover) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "snack-datepicker",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
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",
|