@causw/core 0.0.25 → 0.0.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Avatar/Avatar.d.mts +2 -2
- package/dist/components/Avatar/Avatar.styles.d.mts +3 -3
- package/dist/components/BottomNavigation/BottomNavigation.d.cts +5 -5
- package/dist/components/BottomNavigation/BottomNavigation.d.mts +5 -5
- package/dist/components/BottomNavigation/BottomNavigation.styles.d.cts +3 -3
- package/dist/components/BottomSheet/BottomSheet.d.cts +6 -6
- package/dist/components/BottomSheet/BottomSheet.d.mts +6 -6
- package/dist/components/BottomSheet/BottomSheet.styles.d.cts +3 -3
- package/dist/components/BottomSheet/BottomSheet.styles.d.mts +3 -3
- package/dist/components/Box/Box.styles.d.cts +3 -3
- package/dist/components/Box/Box.styles.d.mts +3 -3
- package/dist/components/Button/Button.d.cts +2 -2
- package/dist/components/Button/Button.d.cts.map +1 -1
- package/dist/components/Button/Button.d.mts +2 -2
- package/dist/components/Button/Button.d.mts.map +1 -1
- package/dist/components/Button/Button.styles.d.mts +3 -3
- package/dist/components/CTAButton/CTAButton.d.cts +2 -2
- package/dist/components/CTAButton/CTAButton.d.mts +2 -2
- package/dist/components/CTAButton/CTAButton.d.mts.map +1 -1
- package/dist/components/CTAButton/CTAButton.styles.d.cts +3 -3
- package/dist/components/CTAButton/CTAButton.styles.d.mts +3 -3
- package/dist/components/Calendar/Calendar.cjs +98 -53
- package/dist/components/Calendar/Calendar.d.cts +6 -2
- package/dist/components/Calendar/Calendar.d.cts.map +1 -1
- package/dist/components/Calendar/Calendar.d.mts +6 -2
- package/dist/components/Calendar/Calendar.d.mts.map +1 -1
- package/dist/components/Calendar/Calendar.mjs +98 -53
- package/dist/components/Calendar/Calendar.mjs.map +1 -1
- package/dist/components/Calendar/Calendar.styles.cjs +4 -9
- package/dist/components/Calendar/Calendar.styles.d.cts +8 -5
- package/dist/components/Calendar/Calendar.styles.d.cts.map +1 -1
- package/dist/components/Calendar/Calendar.styles.d.mts +8 -5
- package/dist/components/Calendar/Calendar.styles.d.mts.map +1 -1
- package/dist/components/Calendar/Calendar.styles.mjs +4 -9
- package/dist/components/Calendar/Calendar.styles.mjs.map +1 -1
- package/dist/components/Checkbox/Checkbox.d.cts +4 -4
- package/dist/components/Checkbox/Checkbox.d.cts.map +1 -1
- package/dist/components/Checkbox/Checkbox.d.mts +4 -4
- package/dist/components/Checkbox/Checkbox.styles.d.cts +3 -3
- package/dist/components/Checkbox/Checkbox.styles.d.mts +3 -3
- package/dist/components/Chip/Chip.d.cts +2 -2
- package/dist/components/Chip/Chip.d.mts +2 -2
- package/dist/components/Chip/Chip.styles.d.cts +3 -3
- package/dist/components/Chip/Chip.styles.d.cts.map +1 -1
- package/dist/components/Chip/Chip.styles.d.mts +3 -3
- package/dist/components/DatePicker/DatePicker.d.cts +2 -2
- package/dist/components/DatePicker/DatePicker.d.mts +2 -2
- package/dist/components/DatePicker/DatePicker.styles.d.cts +3 -3
- package/dist/components/DatePicker/DatePicker.styles.d.cts.map +1 -1
- package/dist/components/DatePicker/DatePicker.styles.d.mts +3 -3
- package/dist/components/DatePicker/DatePicker.styles.d.mts.map +1 -1
- package/dist/components/Dialog/Dialog.d.mts +5 -5
- package/dist/components/Dialog/Dialog.styles.d.mts +3 -3
- package/dist/components/Dialog/Dialog.styles.d.mts.map +1 -1
- package/dist/components/Dropdown/Dropdown.d.mts +3 -3
- package/dist/components/Field/Field.d.mts +5 -5
- package/dist/components/Float/Float.styles.d.cts +3 -3
- package/dist/components/FloatingActionButton/FloatingActionButton.d.cts +2 -2
- package/dist/components/FloatingActionButton/FloatingActionButton.d.cts.map +1 -1
- package/dist/components/FloatingActionButton/FloatingActionButton.d.mts +2 -2
- package/dist/components/FloatingActionButton/FloatingActionButton.d.mts.map +1 -1
- package/dist/components/FloatingActionButton/FloatingActionButton.styles.d.cts +3 -3
- package/dist/components/FloatingActionButton/FloatingActionButton.styles.d.mts +3 -3
- package/dist/components/Grid/Grid.styles.d.cts +3 -3
- package/dist/components/Grid/Grid.styles.d.mts +3 -3
- package/dist/components/HStack/HStack.d.mts +2 -2
- package/dist/components/HStack/HStack.d.mts.map +1 -1
- package/dist/components/Modal/Modal.d.cts +7 -7
- package/dist/components/Modal/Modal.d.mts +7 -7
- package/dist/components/Modal/Modal.styles.d.mts +3 -3
- package/dist/components/Primitive/Primitive.d.cts +16 -16
- package/dist/components/Primitive/Primitive.d.mts +16 -16
- package/dist/components/PullToRefresh/PullToRefresh.d.cts +2 -2
- package/dist/components/PullToRefresh/PullToRefresh.d.mts +2 -2
- package/dist/components/Radio/Radio.d.cts +3 -3
- package/dist/components/Radio/Radio.d.cts.map +1 -1
- package/dist/components/Radio/Radio.d.mts +3 -3
- package/dist/components/RatioChart/RatioChart.d.mts +5 -5
- package/dist/components/RatioChart/RatioChartEditor.d.cts +2 -2
- package/dist/components/RatioChart/RatioChartEditor.d.mts +2 -2
- package/dist/components/Select/Select.d.mts +5 -5
- package/dist/components/Select/Select.styles.d.mts +3 -3
- package/dist/components/Select/Select.styles.d.mts.map +1 -1
- package/dist/components/Separator/Separator.styles.d.cts +3 -3
- package/dist/components/Separator/Separator.styles.d.mts +3 -3
- package/dist/components/Sidebar/Sidebar.d.cts +8 -8
- package/dist/components/Sidebar/Sidebar.d.mts +8 -8
- package/dist/components/Sidebar/Sidebar.styles.d.mts +3 -3
- package/dist/components/Skeleton/Skeleton.d.cts +2 -2
- package/dist/components/Skeleton/Skeleton.d.mts +2 -2
- package/dist/components/Skeleton/Skeleton.styles.d.cts +3 -3
- package/dist/components/Spacer/Spacer.styles.d.cts +3 -3
- package/dist/components/Spacer/Spacer.styles.d.cts.map +1 -1
- package/dist/components/Spacer/Spacer.styles.d.mts +3 -3
- package/dist/components/Spinner/Spinner.d.cts +2 -2
- package/dist/components/Spinner/Spinner.d.mts +2 -2
- package/dist/components/Stack/Stack.styles.d.cts +3 -3
- package/dist/components/Stack/Stack.styles.d.mts +3 -3
- package/dist/components/Stack/Stack.styles.d.mts.map +1 -1
- package/dist/components/Tab/Tab.d.cts +6 -6
- package/dist/components/Tab/Tab.d.mts +6 -6
- package/dist/components/Tab/Tab.styles.d.mts +3 -3
- package/dist/components/Text/Text.d.cts +1 -1
- package/dist/components/Text/Text.d.mts +1 -1
- package/dist/components/Text/Text.styles.d.cts +3 -3
- package/dist/components/Text/Text.styles.d.cts.map +1 -1
- package/dist/components/TextArea/TextArea.d.cts +4 -4
- package/dist/components/TextArea/TextArea.d.mts +4 -4
- package/dist/components/TextArea/TextArea.d.mts.map +1 -1
- package/dist/components/TextArea/TextArea.styles.d.cts +3 -3
- package/dist/components/TextArea/TextArea.styles.d.mts +3 -3
- package/dist/components/TextInput/TextInput.d.cts +2 -2
- package/dist/components/TextInput/TextInput.d.cts.map +1 -1
- package/dist/components/TextInput/TextInput.d.mts +2 -2
- package/dist/components/TextInput/TextInput.d.mts.map +1 -1
- package/dist/components/TextInput/TextInput.styles.d.mts +3 -3
- package/dist/components/Toast/Toast.d.cts +3 -3
- package/dist/components/Toast/Toast.d.mts +3 -3
- package/dist/components/Toast/Toast.styles.d.mts +3 -3
- package/dist/components/Toggle/Toggle.d.cts +4 -4
- package/dist/components/Toggle/Toggle.d.mts +4 -4
- package/dist/components/Toggle/Toggle.d.mts.map +1 -1
- package/dist/components/Toggle/Toggle.styles.d.cts +3 -3
- package/dist/components/Toggle/Toggle.styles.d.mts +3 -3
- package/dist/components/VStack/VStack.d.mts +2 -2
- package/dist/components/VStack/VStack.d.mts.map +1 -1
- package/package.json +1 -1
|
@@ -23,12 +23,14 @@ const getEventRange = (event) => {
|
|
|
23
23
|
end: event.endDate ? parseDateStr(event.endDate) : start
|
|
24
24
|
};
|
|
25
25
|
};
|
|
26
|
-
const Calendar = ({ className, events = [], defaultMonth = /* @__PURE__ */ new Date(), today = /* @__PURE__ */ new Date(), showToday = true, size, selectedStartDate, selectedEndDate, onDateClick, onEventClick, enableHover = false }) => {
|
|
27
|
-
const { wrapper, layoutContainer, header, navContainerLeft, navContainerRight, navButton, navIcon, caption, gridHeader, weekday, gridBody, cell, cellEmpty, eventList, eventItemHeight } = require_Calendar_styles.calendar({
|
|
26
|
+
const Calendar = ({ className, events = [], defaultMonth = /* @__PURE__ */ new Date(), today = /* @__PURE__ */ new Date(), showToday = true, size, selectedStartDate, selectedEndDate, onDateClick, onEventClick, onPrevMonth, onNextMonth, enableHover = false }) => {
|
|
27
|
+
const { wrapper, layoutContainer, header, navContainerLeft, navContainerRight, navButton, navIcon, caption, gridHeader, weekday, gridBody, cell, cellEmpty, eventList, eventItemHeight, moreBadge } = require_Calendar_styles.calendar({
|
|
28
28
|
size,
|
|
29
29
|
hoverEffect: enableHover
|
|
30
30
|
});
|
|
31
31
|
const [currentMonth, setCurrentMonth] = (0, react.useState)(defaultMonth);
|
|
32
|
+
const monthStart = (0, react.useMemo)(() => (0, date_fns.startOfMonth)(currentMonth), [currentMonth]);
|
|
33
|
+
const monthEnd = (0, react.useMemo)(() => (0, date_fns.endOfMonth)(currentMonth), [currentMonth]);
|
|
32
34
|
const totalDays = (0, date_fns.getDaysInMonth)(currentMonth);
|
|
33
35
|
const startDayIndex = (0, date_fns.getDay)((0, date_fns.startOfMonth)(currentMonth));
|
|
34
36
|
const weekDays = [
|
|
@@ -40,56 +42,88 @@ const Calendar = ({ className, events = [], defaultMonth = /* @__PURE__ */ new D
|
|
|
40
42
|
"금",
|
|
41
43
|
"토"
|
|
42
44
|
];
|
|
43
|
-
const handlePrevMonth = () =>
|
|
44
|
-
|
|
45
|
+
const handlePrevMonth = () => {
|
|
46
|
+
const newDate = (0, date_fns.subMonths)(currentMonth, 1);
|
|
47
|
+
setCurrentMonth(newDate);
|
|
48
|
+
onPrevMonth?.(newDate);
|
|
49
|
+
};
|
|
50
|
+
const handleNextMonth = () => {
|
|
51
|
+
const newDate = (0, date_fns.addMonths)(currentMonth, 1);
|
|
52
|
+
setCurrentMonth(newDate);
|
|
53
|
+
onNextMonth?.(newDate);
|
|
54
|
+
};
|
|
45
55
|
const eventsByDate = (0, react.useMemo)(() => {
|
|
46
56
|
const map = /* @__PURE__ */ new Map();
|
|
47
|
-
const mStart = (0, date_fns.
|
|
48
|
-
const mEnd = (0, date_fns.
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
57
|
+
const mStart = (0, date_fns.subDays)(monthStart, (0, date_fns.getDay)(monthStart));
|
|
58
|
+
const mEnd = (0, date_fns.addDays)(monthEnd, 6 - (0, date_fns.getDay)(monthEnd));
|
|
59
|
+
const weeks = [];
|
|
60
|
+
let curr = mStart;
|
|
61
|
+
while (curr <= mEnd) {
|
|
62
|
+
weeks.push({
|
|
63
|
+
start: curr,
|
|
64
|
+
end: (0, date_fns.addDays)(curr, 6)
|
|
65
|
+
});
|
|
66
|
+
curr = (0, date_fns.addDays)(curr, 7);
|
|
67
|
+
}
|
|
68
|
+
for (const week of weeks) {
|
|
69
|
+
const { start: wStart, end: wEnd } = week;
|
|
70
|
+
const weeklyEvents = events.filter((event) => {
|
|
71
|
+
const { start, end } = getEventRange(event);
|
|
72
|
+
return start <= wEnd && end >= wStart;
|
|
73
|
+
});
|
|
74
|
+
weeklyEvents.sort((a, b) => {
|
|
75
|
+
const aRange = getEventRange(a);
|
|
76
|
+
const bRange = getEventRange(b);
|
|
77
|
+
const aSegStart = aRange.start < wStart ? wStart : aRange.start;
|
|
78
|
+
const bSegStart = bRange.start < wStart ? wStart : bRange.start;
|
|
79
|
+
const startDiff = aSegStart.getTime() - bSegStart.getTime();
|
|
80
|
+
if (startDiff !== 0) return startDiff;
|
|
81
|
+
const aIsSingle = aRange.start.getTime() === aRange.end.getTime();
|
|
82
|
+
const bIsSingle = bRange.start.getTime() === bRange.end.getTime();
|
|
83
|
+
if (aIsSingle && !bIsSingle) return -1;
|
|
84
|
+
if (!aIsSingle && bIsSingle) return 1;
|
|
85
|
+
const aDur = (0, date_fns.differenceInCalendarDays)(aRange.end, aRange.start);
|
|
86
|
+
const bDur = (0, date_fns.differenceInCalendarDays)(bRange.end, bRange.start);
|
|
87
|
+
if (aDur !== bDur) return bDur - aDur;
|
|
88
|
+
return a.id.toString().localeCompare(b.id.toString());
|
|
89
|
+
});
|
|
90
|
+
for (const event of weeklyEvents) {
|
|
91
|
+
const { start, end } = getEventRange(event);
|
|
92
|
+
const segStart = start < wStart ? wStart : start;
|
|
93
|
+
const segEnd = end > wEnd ? wEnd : end;
|
|
94
|
+
let slot = 0;
|
|
95
|
+
let found = false;
|
|
96
|
+
while (!found) {
|
|
97
|
+
let isFree = true;
|
|
98
|
+
let tempD = new Date(segStart);
|
|
99
|
+
while (tempD <= segEnd) {
|
|
100
|
+
const dateKey = formatDateStr(tempD);
|
|
101
|
+
if ((map.get(dateKey) || [])[slot]) {
|
|
102
|
+
isFree = false;
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
tempD = (0, date_fns.addDays)(tempD, 1);
|
|
75
106
|
}
|
|
76
|
-
|
|
107
|
+
if (isFree) found = true;
|
|
108
|
+
else slot++;
|
|
109
|
+
}
|
|
110
|
+
let assignD = new Date(segStart);
|
|
111
|
+
while (assignD <= segEnd) {
|
|
112
|
+
const dateKey = formatDateStr(assignD);
|
|
113
|
+
const dailySlots = map.get(dateKey) || [];
|
|
114
|
+
while (dailySlots.length <= slot) dailySlots.push(null);
|
|
115
|
+
dailySlots[slot] = event;
|
|
116
|
+
map.set(dateKey, dailySlots);
|
|
117
|
+
assignD = (0, date_fns.addDays)(assignD, 1);
|
|
77
118
|
}
|
|
78
|
-
if (isFree) found = true;
|
|
79
|
-
else slot++;
|
|
80
|
-
}
|
|
81
|
-
let assignD = new Date(d);
|
|
82
|
-
while (assignD <= eventEndDate) {
|
|
83
|
-
const dateKey = formatDateStr(assignD);
|
|
84
|
-
const dailySlots = map.get(dateKey) || [];
|
|
85
|
-
while (dailySlots.length <= slot) dailySlots.push(null);
|
|
86
|
-
dailySlots[slot] = event;
|
|
87
|
-
map.set(dateKey, dailySlots);
|
|
88
|
-
assignD = (0, date_fns.addDays)(assignD, 1);
|
|
89
119
|
}
|
|
90
120
|
}
|
|
91
121
|
return map;
|
|
92
|
-
}, [
|
|
122
|
+
}, [
|
|
123
|
+
monthStart,
|
|
124
|
+
monthEnd,
|
|
125
|
+
events
|
|
126
|
+
]);
|
|
93
127
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Box.Box, {
|
|
94
128
|
className: wrapper({ className }),
|
|
95
129
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_Box.Box, {
|
|
@@ -143,7 +177,9 @@ const Calendar = ({ className, events = [], defaultMonth = /* @__PURE__ */ new D
|
|
|
143
177
|
const day = i + 1;
|
|
144
178
|
const currentDate = new Date(currentMonth.getFullYear(), currentMonth.getMonth(), day);
|
|
145
179
|
const dateKey = formatDateStr(currentDate);
|
|
146
|
-
const
|
|
180
|
+
const rawDaysEvents = eventsByDate.get(dateKey) || [];
|
|
181
|
+
const daysEvents = rawDaysEvents.slice(0, 4);
|
|
182
|
+
const extraCount = rawDaysEvents.slice(4).filter(Boolean).length;
|
|
147
183
|
const isToday = showToday && (0, date_fns.isSameDay)(currentDate, today);
|
|
148
184
|
const isStart = selectedStartDate && (0, date_fns.isSameDay)(currentDate, selectedStartDate);
|
|
149
185
|
const isEnd = selectedEndDate && (0, date_fns.isSameDay)(currentDate, selectedEndDate);
|
|
@@ -165,16 +201,18 @@ const Calendar = ({ className, events = [], defaultMonth = /* @__PURE__ */ new D
|
|
|
165
201
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
166
202
|
className: require_Calendar_styles.calendar({ selectionState }).dayNumber(),
|
|
167
203
|
children: day
|
|
168
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.
|
|
204
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_Flex.Flex, {
|
|
169
205
|
className: eventList(),
|
|
170
|
-
children: daysEvents.map((ev, idx) => {
|
|
206
|
+
children: [daysEvents.map((ev, idx) => {
|
|
171
207
|
if (!ev) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: eventItemHeight() }, `empty-${idx}`);
|
|
172
208
|
const { start, end } = getEventRange(ev);
|
|
173
209
|
const currentDayIndex = (0, date_fns.getDay)(currentDate);
|
|
174
210
|
const weekStart = (0, date_fns.subDays)(currentDate, currentDayIndex);
|
|
175
211
|
const weekEnd = (0, date_fns.addDays)(currentDate, 6 - currentDayIndex);
|
|
176
|
-
const
|
|
177
|
-
const
|
|
212
|
+
const boundedWeekStart = weekStart < monthStart ? monthStart : weekStart;
|
|
213
|
+
const boundedWeekEnd = weekEnd > monthEnd ? monthEnd : weekEnd;
|
|
214
|
+
const segmentStart = start < boundedWeekStart ? boundedWeekStart : start;
|
|
215
|
+
const segmentDuration = (0, date_fns.differenceInCalendarDays)(end > boundedWeekEnd ? boundedWeekEnd : end, segmentStart) + 1;
|
|
178
216
|
const indexInSegment = (0, date_fns.differenceInCalendarDays)(currentDate, segmentStart);
|
|
179
217
|
const startDateKey = formatDateStr(start);
|
|
180
218
|
const endDateKey = formatDateStr(end);
|
|
@@ -189,11 +227,11 @@ const Calendar = ({ className, events = [], defaultMonth = /* @__PURE__ */ new D
|
|
|
189
227
|
e.stopPropagation();
|
|
190
228
|
onEventClick?.(ev);
|
|
191
229
|
},
|
|
192
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: bgBar() }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
230
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: bgBar() }), indexInSegment === 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
193
231
|
className: textLayer(),
|
|
194
232
|
style: {
|
|
195
233
|
width: `calc(${segmentDuration} * 100%)`,
|
|
196
|
-
left:
|
|
234
|
+
left: 0
|
|
197
235
|
},
|
|
198
236
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
199
237
|
className: textSpan(),
|
|
@@ -201,7 +239,14 @@ const Calendar = ({ className, events = [], defaultMonth = /* @__PURE__ */ new D
|
|
|
201
239
|
})
|
|
202
240
|
})]
|
|
203
241
|
}, `${ev.id}-${idx}`);
|
|
204
|
-
})
|
|
242
|
+
}), extraCount > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
243
|
+
className: moreBadge(),
|
|
244
|
+
children: [
|
|
245
|
+
"+",
|
|
246
|
+
extraCount,
|
|
247
|
+
"개"
|
|
248
|
+
]
|
|
249
|
+
})]
|
|
205
250
|
})]
|
|
206
251
|
}, day);
|
|
207
252
|
})]
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CalendarVariants, EventBarStylesVariants } from "./Calendar.styles.cjs";
|
|
2
|
-
import * as
|
|
2
|
+
import * as react_jsx_runtime47 from "react/jsx-runtime";
|
|
3
3
|
|
|
4
4
|
//#region src/components/Calendar/Calendar.d.ts
|
|
5
5
|
type CalendarEvent = {
|
|
@@ -19,6 +19,8 @@ interface CalendarProps extends CalendarVariants {
|
|
|
19
19
|
selectedEndDate?: Date;
|
|
20
20
|
onDateClick?: (date: Date) => void;
|
|
21
21
|
onEventClick?: (event: CalendarEvent) => void;
|
|
22
|
+
onPrevMonth?: (date: Date) => void;
|
|
23
|
+
onNextMonth?: (date: Date) => void;
|
|
22
24
|
enableHover?: boolean;
|
|
23
25
|
}
|
|
24
26
|
declare const Calendar: {
|
|
@@ -33,8 +35,10 @@ declare const Calendar: {
|
|
|
33
35
|
selectedEndDate,
|
|
34
36
|
onDateClick,
|
|
35
37
|
onEventClick,
|
|
38
|
+
onPrevMonth,
|
|
39
|
+
onNextMonth,
|
|
36
40
|
enableHover
|
|
37
|
-
}: CalendarProps):
|
|
41
|
+
}: CalendarProps): react_jsx_runtime47.JSX.Element;
|
|
38
42
|
displayName: string;
|
|
39
43
|
};
|
|
40
44
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Calendar.d.cts","names":[],"sources":["../../../src/components/Calendar/Calendar.tsx"],"mappings":";;;;KA8BY,aAAA;EACV,EAAA;EACA,KAAA;EACA,SAAA;EACA,OAAA;EACA,IAAA,EAAM,WAAA,CAAY,sBAAA;AAAA;AAAA,UAGH,aAAA,SAAsB,gBAAA;EACrC,SAAA;EACA,MAAA,GAAS,aAAA;EACT,YAAA,GAAe,IAAA;EACf,KAAA,GAAQ,IAAA;EACR,SAAA;EACA,iBAAA,GAAoB,IAAA;EACpB,eAAA,GAAkB,IAAA;EAClB,WAAA,IAAe,IAAA,EAAM,IAAA;EACrB,YAAA,IAAgB,KAAA,EAAO,aAAA;EACvB,WAAA;AAAA;AAAA,cAeW,QAAA;EAAA
|
|
1
|
+
{"version":3,"file":"Calendar.d.cts","names":[],"sources":["../../../src/components/Calendar/Calendar.tsx"],"mappings":";;;;KA8BY,aAAA;EACV,EAAA;EACA,KAAA;EACA,SAAA;EACA,OAAA;EACA,IAAA,EAAM,WAAA,CAAY,sBAAA;AAAA;AAAA,UAGH,aAAA,SAAsB,gBAAA;EACrC,SAAA;EACA,MAAA,GAAS,aAAA;EACT,YAAA,GAAe,IAAA;EACf,KAAA,GAAQ,IAAA;EACR,SAAA;EACA,iBAAA,GAAoB,IAAA;EACpB,eAAA,GAAkB,IAAA;EAClB,WAAA,IAAe,IAAA,EAAM,IAAA;EACrB,YAAA,IAAgB,KAAA,EAAO,aAAA;EACvB,WAAA,IAAe,IAAA,EAAM,IAAA;EACrB,WAAA,IAAe,IAAA,EAAM,IAAA;EACrB,WAAA;AAAA;AAAA,cAeW,QAAA;EAAA;;;;;;;;;;;;;;KAcV,aAAA,GAAa,mBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CalendarVariants, EventBarStylesVariants } from "./Calendar.styles.mjs";
|
|
2
|
-
import * as
|
|
2
|
+
import * as react_jsx_runtime55 from "react/jsx-runtime";
|
|
3
3
|
|
|
4
4
|
//#region src/components/Calendar/Calendar.d.ts
|
|
5
5
|
type CalendarEvent = {
|
|
@@ -19,6 +19,8 @@ interface CalendarProps extends CalendarVariants {
|
|
|
19
19
|
selectedEndDate?: Date;
|
|
20
20
|
onDateClick?: (date: Date) => void;
|
|
21
21
|
onEventClick?: (event: CalendarEvent) => void;
|
|
22
|
+
onPrevMonth?: (date: Date) => void;
|
|
23
|
+
onNextMonth?: (date: Date) => void;
|
|
22
24
|
enableHover?: boolean;
|
|
23
25
|
}
|
|
24
26
|
declare const Calendar: {
|
|
@@ -33,8 +35,10 @@ declare const Calendar: {
|
|
|
33
35
|
selectedEndDate,
|
|
34
36
|
onDateClick,
|
|
35
37
|
onEventClick,
|
|
38
|
+
onPrevMonth,
|
|
39
|
+
onNextMonth,
|
|
36
40
|
enableHover
|
|
37
|
-
}: CalendarProps):
|
|
41
|
+
}: CalendarProps): react_jsx_runtime55.JSX.Element;
|
|
38
42
|
displayName: string;
|
|
39
43
|
};
|
|
40
44
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Calendar.d.mts","names":[],"sources":["../../../src/components/Calendar/Calendar.tsx"],"mappings":";;;;KA8BY,aAAA;EACV,EAAA;EACA,KAAA;EACA,SAAA;EACA,OAAA;EACA,IAAA,EAAM,WAAA,CAAY,sBAAA;AAAA;AAAA,UAGH,aAAA,SAAsB,gBAAA;EACrC,SAAA;EACA,MAAA,GAAS,aAAA;EACT,YAAA,GAAe,IAAA;EACf,KAAA,GAAQ,IAAA;EACR,SAAA;EACA,iBAAA,GAAoB,IAAA;EACpB,eAAA,GAAkB,IAAA;EAClB,WAAA,IAAe,IAAA,EAAM,IAAA;EACrB,YAAA,IAAgB,KAAA,EAAO,aAAA;EACvB,WAAA;AAAA;AAAA,cAeW,QAAA;EAAA
|
|
1
|
+
{"version":3,"file":"Calendar.d.mts","names":[],"sources":["../../../src/components/Calendar/Calendar.tsx"],"mappings":";;;;KA8BY,aAAA;EACV,EAAA;EACA,KAAA;EACA,SAAA;EACA,OAAA;EACA,IAAA,EAAM,WAAA,CAAY,sBAAA;AAAA;AAAA,UAGH,aAAA,SAAsB,gBAAA;EACrC,SAAA;EACA,MAAA,GAAS,aAAA;EACT,YAAA,GAAe,IAAA;EACf,KAAA,GAAQ,IAAA;EACR,SAAA;EACA,iBAAA,GAAoB,IAAA;EACpB,eAAA,GAAkB,IAAA;EAClB,WAAA,IAAe,IAAA,EAAM,IAAA;EACrB,YAAA,IAAgB,KAAA,EAAO,aAAA;EACvB,WAAA,IAAe,IAAA,EAAM,IAAA;EACrB,WAAA,IAAe,IAAA,EAAM,IAAA;EACrB,WAAA;AAAA;AAAA,cAeW,QAAA;EAAA;;;;;;;;;;;;;;KAcV,aAAA,GAAa,mBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -22,12 +22,14 @@ const getEventRange = (event) => {
|
|
|
22
22
|
end: event.endDate ? parseDateStr(event.endDate) : start
|
|
23
23
|
};
|
|
24
24
|
};
|
|
25
|
-
const Calendar = ({ className, events = [], defaultMonth = /* @__PURE__ */ new Date(), today = /* @__PURE__ */ new Date(), showToday = true, size, selectedStartDate, selectedEndDate, onDateClick, onEventClick, enableHover = false }) => {
|
|
26
|
-
const { wrapper, layoutContainer, header, navContainerLeft, navContainerRight, navButton, navIcon, caption, gridHeader, weekday, gridBody, cell, cellEmpty, eventList, eventItemHeight } = calendar({
|
|
25
|
+
const Calendar = ({ className, events = [], defaultMonth = /* @__PURE__ */ new Date(), today = /* @__PURE__ */ new Date(), showToday = true, size, selectedStartDate, selectedEndDate, onDateClick, onEventClick, onPrevMonth, onNextMonth, enableHover = false }) => {
|
|
26
|
+
const { wrapper, layoutContainer, header, navContainerLeft, navContainerRight, navButton, navIcon, caption, gridHeader, weekday, gridBody, cell, cellEmpty, eventList, eventItemHeight, moreBadge } = calendar({
|
|
27
27
|
size,
|
|
28
28
|
hoverEffect: enableHover
|
|
29
29
|
});
|
|
30
30
|
const [currentMonth, setCurrentMonth] = useState(defaultMonth);
|
|
31
|
+
const monthStart = useMemo(() => startOfMonth(currentMonth), [currentMonth]);
|
|
32
|
+
const monthEnd = useMemo(() => endOfMonth(currentMonth), [currentMonth]);
|
|
31
33
|
const totalDays = getDaysInMonth(currentMonth);
|
|
32
34
|
const startDayIndex = getDay(startOfMonth(currentMonth));
|
|
33
35
|
const weekDays = [
|
|
@@ -39,56 +41,88 @@ const Calendar = ({ className, events = [], defaultMonth = /* @__PURE__ */ new D
|
|
|
39
41
|
"금",
|
|
40
42
|
"토"
|
|
41
43
|
];
|
|
42
|
-
const handlePrevMonth = () =>
|
|
43
|
-
|
|
44
|
+
const handlePrevMonth = () => {
|
|
45
|
+
const newDate = subMonths(currentMonth, 1);
|
|
46
|
+
setCurrentMonth(newDate);
|
|
47
|
+
onPrevMonth?.(newDate);
|
|
48
|
+
};
|
|
49
|
+
const handleNextMonth = () => {
|
|
50
|
+
const newDate = addMonths(currentMonth, 1);
|
|
51
|
+
setCurrentMonth(newDate);
|
|
52
|
+
onNextMonth?.(newDate);
|
|
53
|
+
};
|
|
44
54
|
const eventsByDate = useMemo(() => {
|
|
45
55
|
const map = /* @__PURE__ */ new Map();
|
|
46
|
-
const mStart =
|
|
47
|
-
const mEnd =
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
56
|
+
const mStart = subDays(monthStart, getDay(monthStart));
|
|
57
|
+
const mEnd = addDays(monthEnd, 6 - getDay(monthEnd));
|
|
58
|
+
const weeks = [];
|
|
59
|
+
let curr = mStart;
|
|
60
|
+
while (curr <= mEnd) {
|
|
61
|
+
weeks.push({
|
|
62
|
+
start: curr,
|
|
63
|
+
end: addDays(curr, 6)
|
|
64
|
+
});
|
|
65
|
+
curr = addDays(curr, 7);
|
|
66
|
+
}
|
|
67
|
+
for (const week of weeks) {
|
|
68
|
+
const { start: wStart, end: wEnd } = week;
|
|
69
|
+
const weeklyEvents = events.filter((event) => {
|
|
70
|
+
const { start, end } = getEventRange(event);
|
|
71
|
+
return start <= wEnd && end >= wStart;
|
|
72
|
+
});
|
|
73
|
+
weeklyEvents.sort((a, b) => {
|
|
74
|
+
const aRange = getEventRange(a);
|
|
75
|
+
const bRange = getEventRange(b);
|
|
76
|
+
const aSegStart = aRange.start < wStart ? wStart : aRange.start;
|
|
77
|
+
const bSegStart = bRange.start < wStart ? wStart : bRange.start;
|
|
78
|
+
const startDiff = aSegStart.getTime() - bSegStart.getTime();
|
|
79
|
+
if (startDiff !== 0) return startDiff;
|
|
80
|
+
const aIsSingle = aRange.start.getTime() === aRange.end.getTime();
|
|
81
|
+
const bIsSingle = bRange.start.getTime() === bRange.end.getTime();
|
|
82
|
+
if (aIsSingle && !bIsSingle) return -1;
|
|
83
|
+
if (!aIsSingle && bIsSingle) return 1;
|
|
84
|
+
const aDur = differenceInCalendarDays(aRange.end, aRange.start);
|
|
85
|
+
const bDur = differenceInCalendarDays(bRange.end, bRange.start);
|
|
86
|
+
if (aDur !== bDur) return bDur - aDur;
|
|
87
|
+
return a.id.toString().localeCompare(b.id.toString());
|
|
88
|
+
});
|
|
89
|
+
for (const event of weeklyEvents) {
|
|
90
|
+
const { start, end } = getEventRange(event);
|
|
91
|
+
const segStart = start < wStart ? wStart : start;
|
|
92
|
+
const segEnd = end > wEnd ? wEnd : end;
|
|
93
|
+
let slot = 0;
|
|
94
|
+
let found = false;
|
|
95
|
+
while (!found) {
|
|
96
|
+
let isFree = true;
|
|
97
|
+
let tempD = new Date(segStart);
|
|
98
|
+
while (tempD <= segEnd) {
|
|
99
|
+
const dateKey = formatDateStr(tempD);
|
|
100
|
+
if ((map.get(dateKey) || [])[slot]) {
|
|
101
|
+
isFree = false;
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
tempD = addDays(tempD, 1);
|
|
74
105
|
}
|
|
75
|
-
|
|
106
|
+
if (isFree) found = true;
|
|
107
|
+
else slot++;
|
|
108
|
+
}
|
|
109
|
+
let assignD = new Date(segStart);
|
|
110
|
+
while (assignD <= segEnd) {
|
|
111
|
+
const dateKey = formatDateStr(assignD);
|
|
112
|
+
const dailySlots = map.get(dateKey) || [];
|
|
113
|
+
while (dailySlots.length <= slot) dailySlots.push(null);
|
|
114
|
+
dailySlots[slot] = event;
|
|
115
|
+
map.set(dateKey, dailySlots);
|
|
116
|
+
assignD = addDays(assignD, 1);
|
|
76
117
|
}
|
|
77
|
-
if (isFree) found = true;
|
|
78
|
-
else slot++;
|
|
79
|
-
}
|
|
80
|
-
let assignD = new Date(d);
|
|
81
|
-
while (assignD <= eventEndDate) {
|
|
82
|
-
const dateKey = formatDateStr(assignD);
|
|
83
|
-
const dailySlots = map.get(dateKey) || [];
|
|
84
|
-
while (dailySlots.length <= slot) dailySlots.push(null);
|
|
85
|
-
dailySlots[slot] = event;
|
|
86
|
-
map.set(dateKey, dailySlots);
|
|
87
|
-
assignD = addDays(assignD, 1);
|
|
88
118
|
}
|
|
89
119
|
}
|
|
90
120
|
return map;
|
|
91
|
-
}, [
|
|
121
|
+
}, [
|
|
122
|
+
monthStart,
|
|
123
|
+
monthEnd,
|
|
124
|
+
events
|
|
125
|
+
]);
|
|
92
126
|
return /* @__PURE__ */ jsx(Box, {
|
|
93
127
|
className: wrapper({ className }),
|
|
94
128
|
children: /* @__PURE__ */ jsxs(Box, {
|
|
@@ -142,7 +176,9 @@ const Calendar = ({ className, events = [], defaultMonth = /* @__PURE__ */ new D
|
|
|
142
176
|
const day = i + 1;
|
|
143
177
|
const currentDate = new Date(currentMonth.getFullYear(), currentMonth.getMonth(), day);
|
|
144
178
|
const dateKey = formatDateStr(currentDate);
|
|
145
|
-
const
|
|
179
|
+
const rawDaysEvents = eventsByDate.get(dateKey) || [];
|
|
180
|
+
const daysEvents = rawDaysEvents.slice(0, 4);
|
|
181
|
+
const extraCount = rawDaysEvents.slice(4).filter(Boolean).length;
|
|
146
182
|
const isToday = showToday && isSameDay(currentDate, today);
|
|
147
183
|
const isStart = selectedStartDate && isSameDay(currentDate, selectedStartDate);
|
|
148
184
|
const isEnd = selectedEndDate && isSameDay(currentDate, selectedEndDate);
|
|
@@ -164,16 +200,18 @@ const Calendar = ({ className, events = [], defaultMonth = /* @__PURE__ */ new D
|
|
|
164
200
|
children: [/* @__PURE__ */ jsx("span", {
|
|
165
201
|
className: calendar({ selectionState }).dayNumber(),
|
|
166
202
|
children: day
|
|
167
|
-
}), /* @__PURE__ */
|
|
203
|
+
}), /* @__PURE__ */ jsxs(Flex, {
|
|
168
204
|
className: eventList(),
|
|
169
|
-
children: daysEvents.map((ev, idx) => {
|
|
205
|
+
children: [daysEvents.map((ev, idx) => {
|
|
170
206
|
if (!ev) return /* @__PURE__ */ jsx("div", { className: eventItemHeight() }, `empty-${idx}`);
|
|
171
207
|
const { start, end } = getEventRange(ev);
|
|
172
208
|
const currentDayIndex = getDay(currentDate);
|
|
173
209
|
const weekStart = subDays(currentDate, currentDayIndex);
|
|
174
210
|
const weekEnd = addDays(currentDate, 6 - currentDayIndex);
|
|
175
|
-
const
|
|
176
|
-
const
|
|
211
|
+
const boundedWeekStart = weekStart < monthStart ? monthStart : weekStart;
|
|
212
|
+
const boundedWeekEnd = weekEnd > monthEnd ? monthEnd : weekEnd;
|
|
213
|
+
const segmentStart = start < boundedWeekStart ? boundedWeekStart : start;
|
|
214
|
+
const segmentDuration = differenceInCalendarDays(end > boundedWeekEnd ? boundedWeekEnd : end, segmentStart) + 1;
|
|
177
215
|
const indexInSegment = differenceInCalendarDays(currentDate, segmentStart);
|
|
178
216
|
const startDateKey = formatDateStr(start);
|
|
179
217
|
const endDateKey = formatDateStr(end);
|
|
@@ -188,11 +226,11 @@ const Calendar = ({ className, events = [], defaultMonth = /* @__PURE__ */ new D
|
|
|
188
226
|
e.stopPropagation();
|
|
189
227
|
onEventClick?.(ev);
|
|
190
228
|
},
|
|
191
|
-
children: [/* @__PURE__ */ jsx("div", { className: bgBar() }), /* @__PURE__ */ jsx("div", {
|
|
229
|
+
children: [/* @__PURE__ */ jsx("div", { className: bgBar() }), indexInSegment === 0 && /* @__PURE__ */ jsx("div", {
|
|
192
230
|
className: textLayer(),
|
|
193
231
|
style: {
|
|
194
232
|
width: `calc(${segmentDuration} * 100%)`,
|
|
195
|
-
left:
|
|
233
|
+
left: 0
|
|
196
234
|
},
|
|
197
235
|
children: /* @__PURE__ */ jsx("span", {
|
|
198
236
|
className: textSpan(),
|
|
@@ -200,7 +238,14 @@ const Calendar = ({ className, events = [], defaultMonth = /* @__PURE__ */ new D
|
|
|
200
238
|
})
|
|
201
239
|
})]
|
|
202
240
|
}, `${ev.id}-${idx}`);
|
|
203
|
-
})
|
|
241
|
+
}), extraCount > 0 && /* @__PURE__ */ jsxs("div", {
|
|
242
|
+
className: moreBadge(),
|
|
243
|
+
children: [
|
|
244
|
+
"+",
|
|
245
|
+
extraCount,
|
|
246
|
+
"개"
|
|
247
|
+
]
|
|
248
|
+
})]
|
|
204
249
|
})]
|
|
205
250
|
}, day);
|
|
206
251
|
})]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Calendar.mjs","names":[],"sources":["../../../src/components/Calendar/Calendar.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport {\n format,\n addMonths,\n subMonths,\n startOfMonth,\n endOfMonth,\n addDays,\n subDays,\n getDay,\n getDaysInMonth,\n isSameDay,\n isWithinInterval,\n differenceInCalendarDays,\n} from 'date-fns';\nimport { ko } from 'date-fns/locale';\n\nimport { Box } from '../Box';\nimport { Flex } from '../Flex';\nimport { Grid } from '../Grid';\nimport { ChevronLeft, ChevronRight } from '@causw/icons';\n\nimport {\n calendar,\n eventBarStyles,\n type EventBarStylesVariants,\n type CalendarVariants,\n} from './Calendar.styles';\nimport { mergeStyles } from '../../utils';\n\nexport type CalendarEvent = {\n id: string | number;\n title: string;\n startDate: string;\n endDate?: string;\n type: NonNullable<EventBarStylesVariants['type']>;\n};\n\nexport interface CalendarProps extends CalendarVariants {\n className?: string;\n events?: CalendarEvent[];\n defaultMonth?: Date;\n today?: Date;\n showToday?: boolean;\n selectedStartDate?: Date;\n selectedEndDate?: Date;\n onDateClick?: (date: Date) => void;\n onEventClick?: (event: CalendarEvent) => void;\n enableHover?: boolean;\n}\n\nconst parseDateStr = (dateStr: string) => {\n const [y, m, d] = dateStr.split('-').map(Number);\n return new Date(y, m - 1, d);\n};\nconst formatDateStr = (date: Date) => format(date, 'yyyy-MM-dd');\n\nconst getEventRange = (event: CalendarEvent) => {\n const start = parseDateStr(event.startDate);\n const end = event.endDate ? parseDateStr(event.endDate) : start;\n return { start, end };\n};\n\nexport const Calendar = ({\n className,\n events = [],\n defaultMonth = new Date(),\n today = new Date(),\n showToday = true,\n size,\n selectedStartDate,\n selectedEndDate,\n onDateClick,\n onEventClick,\n enableHover = false,\n}: CalendarProps) => {\n const {\n wrapper,\n layoutContainer,\n header,\n navContainerLeft,\n navContainerRight,\n navButton,\n navIcon,\n caption,\n gridHeader,\n weekday,\n gridBody,\n cell,\n cellEmpty,\n eventList,\n eventItemHeight,\n } = calendar({ size, hoverEffect: enableHover });\n\n const [currentMonth, setCurrentMonth] = useState(defaultMonth);\n const totalDays = getDaysInMonth(currentMonth);\n const startDayIndex = getDay(startOfMonth(currentMonth));\n const weekDays = ['일', '월', '화', '수', '목', '금', '토'];\n\n const handlePrevMonth = () => setCurrentMonth((prev) => subMonths(prev, 1));\n const handleNextMonth = () => setCurrentMonth((prev) => addMonths(prev, 1));\n\n const eventsByDate = useMemo(() => {\n const map = new Map<string, (CalendarEvent | null)[]>();\n const mStart = startOfMonth(currentMonth);\n const mEnd = endOfMonth(currentMonth);\n\n const relevantEvents = events.filter((event) => {\n const { start, end } = getEventRange(event);\n return start <= mEnd && end >= mStart;\n });\n\n relevantEvents.sort((a, b) => {\n const aRange = getEventRange(a);\n const bRange = getEventRange(b);\n const aDur = differenceInCalendarDays(aRange.end, aRange.start);\n const bDur = differenceInCalendarDays(bRange.end, bRange.start);\n if (bDur !== aDur) return bDur - aDur;\n return aRange.start.getTime() - bRange.start.getTime();\n });\n\n for (const event of relevantEvents) {\n const { start, end } = getEventRange(event);\n let d = start < mStart ? mStart : start;\n const eventEndDate = end > mEnd ? mEnd : end;\n\n let slot = 0;\n let found = false;\n while (!found) {\n let isFree = true;\n let tempD = new Date(d);\n while (tempD <= eventEndDate) {\n const dateKey = formatDateStr(tempD);\n const dailySlots = map.get(dateKey) || [];\n if (dailySlots[slot]) {\n isFree = false;\n break;\n }\n tempD = addDays(tempD, 1);\n }\n if (isFree) found = true;\n else slot++;\n }\n\n let assignD = new Date(d);\n while (assignD <= eventEndDate) {\n const dateKey = formatDateStr(assignD);\n const dailySlots = map.get(dateKey) || [];\n\n while (dailySlots.length <= slot) dailySlots.push(null);\n dailySlots[slot] = event;\n map.set(dateKey, dailySlots);\n assignD = addDays(assignD, 1);\n }\n }\n return map;\n }, [currentMonth, events]);\n\n return (\n <Box className={wrapper({ className })}>\n <Box className={layoutContainer()}>\n <Grid columns={7} className={header()}>\n <Flex className={navContainerLeft()}>\n <button\n onClick={handlePrevMonth}\n className={navButton()}\n type=\"button\"\n >\n <ChevronLeft className={navIcon()} />\n </button>\n </Flex>\n <Box className=\"col-span-5 flex items-center justify-center\">\n <span className={caption()}>\n {format(currentMonth, 'yyyy년 M월', { locale: ko })}\n </span>\n </Box>\n <Flex className={navContainerRight()}>\n <button\n onClick={handleNextMonth}\n className={navButton()}\n type=\"button\"\n >\n <ChevronRight className={navIcon()} />\n </button>\n </Flex>\n </Grid>\n\n <Grid columns={7} className={gridHeader()}>\n {weekDays.map((day) => (\n <Flex\n key={day}\n justify=\"center\"\n align=\"center\"\n className={weekday()}\n >\n {day}\n </Flex>\n ))}\n </Grid>\n\n <Grid columns={7} className={gridBody()}>\n {Array.from({ length: startDayIndex }).map((_, i) => (\n <Box key={`empty-${i}`} className={cellEmpty()} />\n ))}\n\n {Array.from({ length: totalDays }).map((_, i) => {\n const day = i + 1;\n const currentDate = new Date(\n currentMonth.getFullYear(),\n currentMonth.getMonth(),\n day,\n );\n const dateKey = formatDateStr(currentDate);\n\n const daysEvents = eventsByDate.get(dateKey) || [];\n\n const isToday = showToday && isSameDay(currentDate, today);\n const isStart =\n selectedStartDate && isSameDay(currentDate, selectedStartDate);\n const isEnd =\n selectedEndDate && isSameDay(currentDate, selectedEndDate);\n const isBetween =\n selectedStartDate &&\n selectedEndDate &&\n isWithinInterval(currentDate, {\n start: selectedStartDate,\n end: selectedEndDate,\n }) &&\n !isStart &&\n !isEnd;\n\n let selectionState:\n | 'none'\n | 'today'\n | 'selected'\n | 'range'\n | 'rangeStart'\n | 'rangeEnd' = 'none';\n if (isStart) selectionState = 'selected';\n else if (isEnd) selectionState = 'selected';\n else if (isBetween) selectionState = 'range';\n else if (isToday) selectionState = 'today';\n\n return (\n <Flex\n key={day}\n direction=\"column\"\n align=\"center\"\n justify=\"start\"\n className={cell()}\n onClick={() => onDateClick?.(currentDate)}\n >\n <span className={calendar({ selectionState }).dayNumber()}>\n {day}\n </span>\n <Flex className={eventList()}>\n {daysEvents.map((ev, idx) => {\n if (!ev) {\n return (\n <div\n key={`empty-${idx}`}\n className={eventItemHeight()}\n />\n );\n }\n\n const { start, end } = getEventRange(ev);\n const currentDayIndex = getDay(currentDate);\n const weekStart = subDays(currentDate, currentDayIndex);\n const weekEnd = addDays(currentDate, 6 - currentDayIndex);\n const segmentStart = start < weekStart ? weekStart : start;\n const segmentEnd = end > weekEnd ? weekEnd : end;\n const segmentDuration =\n differenceInCalendarDays(segmentEnd, segmentStart) + 1;\n const indexInSegment = differenceInCalendarDays(\n currentDate,\n segmentStart,\n );\n\n const startDateKey = formatDateStr(start);\n const endDateKey = formatDateStr(end);\n const isStartEvent = dateKey === startDateKey;\n const isEndEvent = dateKey === endDateKey;\n const isSingleDay = startDateKey === endDateKey;\n const blockPosition = isSingleDay\n ? 'single'\n : isStartEvent\n ? 'start'\n : isEndEvent\n ? 'end'\n : 'middle';\n const {\n wrapper: eventWrapper,\n bgBar,\n textLayer,\n textSpan,\n } = eventBarStyles({\n type: ev.type,\n position: blockPosition,\n });\n\n return (\n <div\n key={`${ev.id}-${idx}`}\n className={mergeStyles(\n eventWrapper(),\n eventItemHeight(),\n )}\n onClick={(e) => {\n e.stopPropagation();\n onEventClick?.(ev);\n }}\n >\n <div className={bgBar()} />\n\n <div\n className={textLayer()}\n style={{\n width: `calc(${segmentDuration} * 100%)`,\n left: `calc(-${indexInSegment} * 100%)`,\n }}\n >\n <span className={textSpan()}>{ev.title}</span>\n </div>\n </div>\n );\n })}\n </Flex>\n </Flex>\n );\n })}\n </Grid>\n </Box>\n </Box>\n );\n};\nCalendar.displayName = 'Calendar';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Calendar.mjs","names":[],"sources":["../../../src/components/Calendar/Calendar.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport {\n format,\n addMonths,\n subMonths,\n startOfMonth,\n endOfMonth,\n addDays,\n subDays,\n getDay,\n getDaysInMonth,\n isSameDay,\n isWithinInterval,\n differenceInCalendarDays,\n} from 'date-fns';\nimport { ko } from 'date-fns/locale';\n\nimport { Box } from '../Box';\nimport { Flex } from '../Flex';\nimport { Grid } from '../Grid';\nimport { ChevronLeft, ChevronRight } from '@causw/icons';\n\nimport {\n calendar,\n eventBarStyles,\n type EventBarStylesVariants,\n type CalendarVariants,\n} from './Calendar.styles';\nimport { mergeStyles } from '../../utils';\n\nexport type CalendarEvent = {\n id: string | number;\n title: string;\n startDate: string;\n endDate?: string;\n type: NonNullable<EventBarStylesVariants['type']>;\n};\n\nexport interface CalendarProps extends CalendarVariants {\n className?: string;\n events?: CalendarEvent[];\n defaultMonth?: Date;\n today?: Date;\n showToday?: boolean;\n selectedStartDate?: Date;\n selectedEndDate?: Date;\n onDateClick?: (date: Date) => void;\n onEventClick?: (event: CalendarEvent) => void;\n onPrevMonth?: (date: Date) => void;\n onNextMonth?: (date: Date) => void;\n enableHover?: boolean;\n}\n\nconst parseDateStr = (dateStr: string) => {\n const [y, m, d] = dateStr.split('-').map(Number);\n return new Date(y, m - 1, d);\n};\nconst formatDateStr = (date: Date) => format(date, 'yyyy-MM-dd');\n\nconst getEventRange = (event: CalendarEvent) => {\n const start = parseDateStr(event.startDate);\n const end = event.endDate ? parseDateStr(event.endDate) : start;\n return { start, end };\n};\n\nexport const Calendar = ({\n className,\n events = [],\n defaultMonth = new Date(),\n today = new Date(),\n showToday = true,\n size,\n selectedStartDate,\n selectedEndDate,\n onDateClick,\n onEventClick,\n onPrevMonth,\n onNextMonth,\n enableHover = false,\n}: CalendarProps) => {\n const {\n wrapper,\n layoutContainer,\n header,\n navContainerLeft,\n navContainerRight,\n navButton,\n navIcon,\n caption,\n gridHeader,\n weekday,\n gridBody,\n cell,\n cellEmpty,\n eventList,\n eventItemHeight,\n moreBadge,\n } = calendar({ size, hoverEffect: enableHover });\n\n const [currentMonth, setCurrentMonth] = useState(defaultMonth);\n\n const monthStart = useMemo(() => startOfMonth(currentMonth), [currentMonth]);\n const monthEnd = useMemo(() => endOfMonth(currentMonth), [currentMonth]);\n\n const totalDays = getDaysInMonth(currentMonth);\n const startDayIndex = getDay(startOfMonth(currentMonth));\n const weekDays = ['일', '월', '화', '수', '목', '금', '토'];\n\n const handlePrevMonth = () => {\n const newDate = subMonths(currentMonth, 1);\n setCurrentMonth(newDate);\n onPrevMonth?.(newDate);\n };\n const handleNextMonth = () => {\n const newDate = addMonths(currentMonth, 1);\n setCurrentMonth(newDate);\n onNextMonth?.(newDate);\n };\n const eventsByDate = useMemo(() => {\n const map = new Map<string, (CalendarEvent | null)[]>();\n const mStart = subDays(monthStart, getDay(monthStart));\n const mEnd = addDays(monthEnd, 6 - getDay(monthEnd));\n\n const weeks: { start: Date; end: Date }[] = [];\n let curr = mStart;\n while (curr <= mEnd) {\n weeks.push({ start: curr, end: addDays(curr, 6) });\n curr = addDays(curr, 7);\n }\n\n for (const week of weeks) {\n const { start: wStart, end: wEnd } = week;\n\n const weeklyEvents = events.filter((event) => {\n const { start, end } = getEventRange(event);\n return start <= wEnd && end >= wStart;\n });\n\n weeklyEvents.sort((a, b) => {\n const aRange = getEventRange(a);\n const bRange = getEventRange(b);\n\n const aSegStart = aRange.start < wStart ? wStart : aRange.start;\n const bSegStart = bRange.start < wStart ? wStart : bRange.start;\n const startDiff = aSegStart.getTime() - bSegStart.getTime();\n if (startDiff !== 0) return startDiff;\n\n const aIsSingle = aRange.start.getTime() === aRange.end.getTime();\n const bIsSingle = bRange.start.getTime() === bRange.end.getTime();\n if (aIsSingle && !bIsSingle) return -1;\n if (!aIsSingle && bIsSingle) return 1;\n\n const aDur = differenceInCalendarDays(aRange.end, aRange.start);\n const bDur = differenceInCalendarDays(bRange.end, bRange.start);\n if (aDur !== bDur) return bDur - aDur;\n\n return a.id.toString().localeCompare(b.id.toString());\n });\n\n for (const event of weeklyEvents) {\n const { start, end } = getEventRange(event);\n const segStart = start < wStart ? wStart : start;\n const segEnd = end > wEnd ? wEnd : end;\n\n let slot = 0;\n let found = false;\n while (!found) {\n let isFree = true;\n let tempD = new Date(segStart);\n while (tempD <= segEnd) {\n const dateKey = formatDateStr(tempD);\n const dailySlots = map.get(dateKey) || [];\n if (dailySlots[slot]) {\n isFree = false;\n break;\n }\n tempD = addDays(tempD, 1);\n }\n if (isFree) found = true;\n else slot++;\n }\n\n let assignD = new Date(segStart);\n while (assignD <= segEnd) {\n const dateKey = formatDateStr(assignD);\n const dailySlots = map.get(dateKey) || [];\n while (dailySlots.length <= slot) dailySlots.push(null);\n dailySlots[slot] = event;\n map.set(dateKey, dailySlots);\n assignD = addDays(assignD, 1);\n }\n }\n }\n return map;\n }, [monthStart, monthEnd, events]);\n return (\n <Box className={wrapper({ className })}>\n <Box className={layoutContainer()}>\n <Grid columns={7} className={header()}>\n <Flex className={navContainerLeft()}>\n <button\n onClick={handlePrevMonth}\n className={navButton()}\n type=\"button\"\n >\n <ChevronLeft className={navIcon()} />\n </button>\n </Flex>\n <Box className=\"col-span-5 flex items-center justify-center\">\n <span className={caption()}>\n {format(currentMonth, 'yyyy년 M월', { locale: ko })}\n </span>\n </Box>\n <Flex className={navContainerRight()}>\n <button\n onClick={handleNextMonth}\n className={navButton()}\n type=\"button\"\n >\n <ChevronRight className={navIcon()} />\n </button>\n </Flex>\n </Grid>\n\n <Grid columns={7} className={gridHeader()}>\n {weekDays.map((day) => (\n <Flex\n key={day}\n justify=\"center\"\n align=\"center\"\n className={weekday()}\n >\n {day}\n </Flex>\n ))}\n </Grid>\n\n <Grid columns={7} className={gridBody()}>\n {Array.from({ length: startDayIndex }).map((_, i) => (\n <Box key={`empty-${i}`} className={cellEmpty()} />\n ))}\n\n {Array.from({ length: totalDays }).map((_, i) => {\n const day = i + 1;\n const currentDate = new Date(\n currentMonth.getFullYear(),\n currentMonth.getMonth(),\n day,\n );\n const dateKey = formatDateStr(currentDate);\n\n const rawDaysEvents = eventsByDate.get(dateKey) || [];\n const daysEvents = rawDaysEvents.slice(0, 4);\n const extraCount = rawDaysEvents.slice(4).filter(Boolean).length;\n\n const isToday = showToday && isSameDay(currentDate, today);\n const isStart =\n selectedStartDate && isSameDay(currentDate, selectedStartDate);\n const isEnd =\n selectedEndDate && isSameDay(currentDate, selectedEndDate);\n const isBetween =\n selectedStartDate &&\n selectedEndDate &&\n isWithinInterval(currentDate, {\n start: selectedStartDate,\n end: selectedEndDate,\n }) &&\n !isStart &&\n !isEnd;\n\n let selectionState:\n | 'none'\n | 'today'\n | 'selected'\n | 'range'\n | 'rangeStart'\n | 'rangeEnd' = 'none';\n if (isStart) selectionState = 'selected';\n else if (isEnd) selectionState = 'selected';\n else if (isBetween) selectionState = 'range';\n else if (isToday) selectionState = 'today';\n\n return (\n <Flex\n key={day}\n direction=\"column\"\n align=\"center\"\n justify=\"start\"\n className={cell()}\n onClick={() => onDateClick?.(currentDate)}\n >\n <span className={calendar({ selectionState }).dayNumber()}>\n {day}\n </span>\n <Flex className={eventList()}>\n {daysEvents.map((ev, idx) => {\n if (!ev) {\n return (\n <div\n key={`empty-${idx}`}\n className={eventItemHeight()}\n />\n );\n }\n\n const { start, end } = getEventRange(ev);\n const currentDayIndex = getDay(currentDate);\n const weekStart = subDays(currentDate, currentDayIndex);\n const weekEnd = addDays(currentDate, 6 - currentDayIndex);\n\n const boundedWeekStart =\n weekStart < monthStart ? monthStart : weekStart;\n const boundedWeekEnd =\n weekEnd > monthEnd ? monthEnd : weekEnd;\n\n const segmentStart =\n start < boundedWeekStart ? boundedWeekStart : start;\n const segmentEnd =\n end > boundedWeekEnd ? boundedWeekEnd : end;\n\n const segmentDuration =\n differenceInCalendarDays(segmentEnd, segmentStart) + 1;\n const indexInSegment = differenceInCalendarDays(\n currentDate,\n segmentStart,\n );\n\n const startDateKey = formatDateStr(start);\n const endDateKey = formatDateStr(end);\n const isStartEvent = dateKey === startDateKey;\n const isEndEvent = dateKey === endDateKey;\n const isSingleDay = startDateKey === endDateKey;\n\n const blockPosition: 'single' | 'start' | 'end' | 'middle' =\n isSingleDay\n ? 'single'\n : isStartEvent\n ? 'start'\n : isEndEvent\n ? 'end'\n : 'middle';\n const {\n wrapper: eventWrapper,\n bgBar,\n textLayer,\n textSpan,\n } = eventBarStyles({\n type: ev.type,\n position: blockPosition,\n });\n\n return (\n <div\n key={`${ev.id}-${idx}`}\n className={mergeStyles(\n eventWrapper(),\n eventItemHeight(),\n )}\n onClick={(e) => {\n e.stopPropagation();\n onEventClick?.(ev);\n }}\n >\n <div className={bgBar()} />\n {indexInSegment === 0 && (\n <div\n className={textLayer()}\n style={{\n width: `calc(${segmentDuration} * 100%)`,\n left: 0,\n }}\n >\n <span className={textSpan()}>{ev.title}</span>\n </div>\n )}\n </div>\n );\n })}\n\n {extraCount > 0 && (\n <div className={moreBadge()}>+{extraCount}개</div>\n )}\n </Flex>\n </Flex>\n );\n })}\n </Grid>\n </Box>\n </Box>\n );\n};\nCalendar.displayName = 'Calendar';\n"],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@ const SPACING = {
|
|
|
11
11
|
const calendar = (0, tailwind_variants.tv)({
|
|
12
12
|
slots: {
|
|
13
13
|
wrapper: [
|
|
14
|
-
"bg-white rounded-[20px]
|
|
14
|
+
"bg-white rounded-[20px] border border-gray-100 flex flex-col items-center gap-2",
|
|
15
15
|
"w-full min-w-[328px] max-w-[804px]",
|
|
16
16
|
"py-4 px-2 md:py-10"
|
|
17
17
|
],
|
|
@@ -28,14 +28,9 @@ const calendar = (0, tailwind_variants.tv)({
|
|
|
28
28
|
cell: "relative group gap-1 min-h-[52px] md:min-h-[56px] cursor-pointer rounded-lg transition-colors",
|
|
29
29
|
cellEmpty: "min-h-[52px] md:min-h-[56px]",
|
|
30
30
|
dayNumber: "w-7 h-7 flex items-center justify-center rounded-full text-[15px] font-semibold leading-[1.6] tracking-[-0.02em] z-10 select-none transition-colors",
|
|
31
|
-
eventList: [
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
"[&::-webkit-scrollbar]:hidden",
|
|
35
|
-
"[-ms-overflow-style:none]",
|
|
36
|
-
"[scrollbar-width:none]"
|
|
37
|
-
],
|
|
38
|
-
eventItemHeight: "min-h-[20px] h-auto flex-shrink-0 cursor-pointer"
|
|
31
|
+
eventList: ["w-full flex flex-col gap-1"],
|
|
32
|
+
eventItemHeight: "min-h-[20px] h-auto flex-shrink-0 cursor-pointer",
|
|
33
|
+
moreBadge: "text-[11px] font-medium tracking-[-0.02em] leading-tight cursor-default text-gray-500 select-none flex items-center justify-center py-[2px] rounded w-[95%] mx-auto"
|
|
39
34
|
},
|
|
40
35
|
variants: {
|
|
41
36
|
size: {
|