@causw/core 0.0.24 → 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.
Files changed (128) hide show
  1. package/dist/components/Avatar/Avatar.d.cts +2 -2
  2. package/dist/components/Avatar/Avatar.d.mts +2 -2
  3. package/dist/components/Avatar/Avatar.styles.d.cts +3 -3
  4. package/dist/components/Avatar/Avatar.styles.d.mts +3 -3
  5. package/dist/components/BottomNavigation/BottomNavigation.d.cts +5 -5
  6. package/dist/components/BottomNavigation/BottomNavigation.d.mts +5 -5
  7. package/dist/components/BottomNavigation/BottomNavigation.styles.d.cts +3 -3
  8. package/dist/components/BottomSheet/BottomSheet.d.cts +6 -6
  9. package/dist/components/BottomSheet/BottomSheet.d.mts +6 -6
  10. package/dist/components/BottomSheet/BottomSheet.styles.d.cts +3 -3
  11. package/dist/components/BottomSheet/BottomSheet.styles.d.mts +3 -3
  12. package/dist/components/Box/Box.styles.d.cts +3 -3
  13. package/dist/components/Button/Button.d.cts +2 -2
  14. package/dist/components/Button/Button.d.cts.map +1 -1
  15. package/dist/components/Button/Button.d.mts +2 -2
  16. package/dist/components/Button/Button.styles.d.cts +3 -3
  17. package/dist/components/Button/Button.styles.d.mts +3 -3
  18. package/dist/components/CTAButton/CTAButton.d.cts +2 -2
  19. package/dist/components/CTAButton/CTAButton.d.cts.map +1 -1
  20. package/dist/components/CTAButton/CTAButton.d.mts +2 -2
  21. package/dist/components/CTAButton/CTAButton.styles.d.cts +3 -3
  22. package/dist/components/CTAButton/CTAButton.styles.d.mts +3 -3
  23. package/dist/components/Calendar/Calendar.cjs +98 -53
  24. package/dist/components/Calendar/Calendar.d.cts +6 -2
  25. package/dist/components/Calendar/Calendar.d.cts.map +1 -1
  26. package/dist/components/Calendar/Calendar.d.mts +6 -2
  27. package/dist/components/Calendar/Calendar.d.mts.map +1 -1
  28. package/dist/components/Calendar/Calendar.mjs +98 -53
  29. package/dist/components/Calendar/Calendar.mjs.map +1 -1
  30. package/dist/components/Calendar/Calendar.styles.cjs +4 -9
  31. package/dist/components/Calendar/Calendar.styles.d.cts +8 -5
  32. package/dist/components/Calendar/Calendar.styles.d.cts.map +1 -1
  33. package/dist/components/Calendar/Calendar.styles.d.mts +8 -5
  34. package/dist/components/Calendar/Calendar.styles.d.mts.map +1 -1
  35. package/dist/components/Calendar/Calendar.styles.mjs +4 -9
  36. package/dist/components/Calendar/Calendar.styles.mjs.map +1 -1
  37. package/dist/components/Checkbox/Checkbox.d.cts +4 -4
  38. package/dist/components/Checkbox/Checkbox.d.cts.map +1 -1
  39. package/dist/components/Checkbox/Checkbox.styles.d.cts +3 -3
  40. package/dist/components/Chip/Chip.d.cts +2 -2
  41. package/dist/components/Chip/Chip.d.mts +2 -2
  42. package/dist/components/Chip/Chip.styles.d.cts +3 -3
  43. package/dist/components/Chip/Chip.styles.d.cts.map +1 -1
  44. package/dist/components/Chip/Chip.styles.d.mts +3 -3
  45. package/dist/components/DatePicker/DatePicker.d.cts +2 -2
  46. package/dist/components/DatePicker/DatePicker.d.mts +2 -2
  47. package/dist/components/DatePicker/DatePicker.styles.d.cts +3 -3
  48. package/dist/components/DatePicker/DatePicker.styles.d.mts +3 -3
  49. package/dist/components/DatePicker/DatePicker.styles.d.mts.map +1 -1
  50. package/dist/components/Dialog/Dialog.d.cts +13 -13
  51. package/dist/components/Dialog/Dialog.d.mts +5 -5
  52. package/dist/components/Dialog/Dialog.styles.d.cts +3 -3
  53. package/dist/components/Dropdown/Dropdown.d.cts +3 -3
  54. package/dist/components/Dropdown/Dropdown.d.mts +3 -3
  55. package/dist/components/Dropdown/Dropdown.styles.d.cts +3 -3
  56. package/dist/components/Dropdown/Dropdown.styles.d.cts.map +1 -1
  57. package/dist/components/Dropdown/Dropdown.styles.d.mts +3 -3
  58. package/dist/components/Field/Field.d.cts +5 -5
  59. package/dist/components/Field/Field.d.mts +5 -5
  60. package/dist/components/Float/Float.styles.d.cts +3 -3
  61. package/dist/components/FloatingActionButton/FloatingActionButton.d.cts +2 -2
  62. package/dist/components/FloatingActionButton/FloatingActionButton.d.mts +2 -2
  63. package/dist/components/FloatingActionButton/FloatingActionButton.styles.d.mts +3 -3
  64. package/dist/components/Grid/Grid.styles.d.cts +3 -3
  65. package/dist/components/HStack/HStack.d.cts +2 -2
  66. package/dist/components/HStack/HStack.d.mts +2 -2
  67. package/dist/components/Modal/Modal.d.cts +7 -7
  68. package/dist/components/Modal/Modal.d.mts +10 -10
  69. package/dist/components/Modal/Modal.styles.d.cts +3 -3
  70. package/dist/components/Modal/Modal.styles.d.mts +3 -3
  71. package/dist/components/Primitive/Primitive.d.cts +16 -16
  72. package/dist/components/Primitive/Primitive.d.mts +16 -16
  73. package/dist/components/PullToRefresh/PullToRefresh.d.cts +2 -2
  74. package/dist/components/PullToRefresh/PullToRefresh.d.mts +2 -2
  75. package/dist/components/PullToRefresh/PullToRefresh.styles.d.cts +3 -3
  76. package/dist/components/PullToRefresh/PullToRefresh.styles.d.mts +3 -3
  77. package/dist/components/Radio/Radio.d.cts +3 -3
  78. package/dist/components/Radio/Radio.d.cts.map +1 -1
  79. package/dist/components/RatioChart/RatioChart.d.cts +5 -5
  80. package/dist/components/RatioChart/RatioChart.d.mts +5 -5
  81. package/dist/components/RatioChart/RatioChartEditor.d.cts +2 -2
  82. package/dist/components/RatioChart/RatioChartEditor.d.mts +2 -2
  83. package/dist/components/Select/Select.d.mts +5 -5
  84. package/dist/components/Select/Select.styles.d.cts +3 -3
  85. package/dist/components/Select/Select.styles.d.mts +3 -3
  86. package/dist/components/Select/Select.styles.d.mts.map +1 -1
  87. package/dist/components/Separator/Separator.styles.d.cts +3 -3
  88. package/dist/components/Separator/Separator.styles.d.mts +3 -3
  89. package/dist/components/Sidebar/Sidebar.d.cts +8 -8
  90. package/dist/components/Sidebar/Sidebar.d.mts +8 -8
  91. package/dist/components/Sidebar/Sidebar.styles.d.cts +3 -3
  92. package/dist/components/Sidebar/Sidebar.styles.d.mts +3 -3
  93. package/dist/components/Skeleton/Skeleton.d.cts +2 -2
  94. package/dist/components/Skeleton/Skeleton.styles.d.cts +3 -3
  95. package/dist/components/Spacer/Spacer.styles.d.cts +3 -3
  96. package/dist/components/Spacer/Spacer.styles.d.mts +3 -3
  97. package/dist/components/Spacer/Spacer.styles.d.mts.map +1 -1
  98. package/dist/components/Spinner/Spinner.d.cts +2 -2
  99. package/dist/components/Spinner/Spinner.d.mts +2 -2
  100. package/dist/components/Spinner/Spinner.styles.d.cts +3 -3
  101. package/dist/components/Spinner/Spinner.styles.d.mts +3 -3
  102. package/dist/components/Stack/Stack.styles.d.cts +3 -3
  103. package/dist/components/Stack/Stack.styles.d.mts +3 -3
  104. package/dist/components/Stack/Stack.styles.d.mts.map +1 -1
  105. package/dist/components/Tab/Tab.d.cts +6 -6
  106. package/dist/components/Tab/Tab.d.mts +6 -6
  107. package/dist/components/Tab/Tab.styles.d.cts +3 -3
  108. package/dist/components/Tab/Tab.styles.d.mts +3 -3
  109. package/dist/components/Text/Text.d.cts +1 -1
  110. package/dist/components/Text/Text.d.mts +1 -1
  111. package/dist/components/Text/Text.styles.d.cts +3 -3
  112. package/dist/components/TextArea/TextArea.d.cts +4 -4
  113. package/dist/components/TextArea/TextArea.d.cts.map +1 -1
  114. package/dist/components/TextArea/TextArea.d.mts +4 -4
  115. package/dist/components/TextArea/TextArea.styles.d.cts +3 -3
  116. package/dist/components/TextInput/TextInput.d.cts +2 -2
  117. package/dist/components/TextInput/TextInput.styles.d.cts +3 -3
  118. package/dist/components/Toast/Toast.d.cts +5 -5
  119. package/dist/components/Toast/Toast.d.cts.map +1 -1
  120. package/dist/components/Toast/Toast.d.mts +5 -5
  121. package/dist/components/Toast/Toast.styles.d.cts +3 -3
  122. package/dist/components/Toast/Toast.styles.d.mts +3 -3
  123. package/dist/components/Toggle/Toggle.d.cts +4 -4
  124. package/dist/components/Toggle/Toggle.d.cts.map +1 -1
  125. package/dist/components/Toggle/Toggle.styles.d.cts +3 -3
  126. package/dist/components/VStack/VStack.d.cts +2 -2
  127. package/dist/components/VStack/VStack.d.mts +2 -2
  128. package/package.json +3 -3
@@ -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 = () => setCurrentMonth((prev) => (0, date_fns.subMonths)(prev, 1));
44
- const handleNextMonth = () => setCurrentMonth((prev) => (0, date_fns.addMonths)(prev, 1));
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.startOfMonth)(currentMonth);
48
- const mEnd = (0, date_fns.endOfMonth)(currentMonth);
49
- const relevantEvents = events.filter((event) => {
50
- const { start, end } = getEventRange(event);
51
- return start <= mEnd && end >= mStart;
52
- });
53
- relevantEvents.sort((a, b) => {
54
- const aRange = getEventRange(a);
55
- const bRange = getEventRange(b);
56
- const aDur = (0, date_fns.differenceInCalendarDays)(aRange.end, aRange.start);
57
- const bDur = (0, date_fns.differenceInCalendarDays)(bRange.end, bRange.start);
58
- if (bDur !== aDur) return bDur - aDur;
59
- return aRange.start.getTime() - bRange.start.getTime();
60
- });
61
- for (const event of relevantEvents) {
62
- const { start, end } = getEventRange(event);
63
- let d = start < mStart ? mStart : start;
64
- const eventEndDate = end > mEnd ? mEnd : end;
65
- let slot = 0;
66
- let found = false;
67
- while (!found) {
68
- let isFree = true;
69
- let tempD = new Date(d);
70
- while (tempD <= eventEndDate) {
71
- const dateKey = formatDateStr(tempD);
72
- if ((map.get(dateKey) || [])[slot]) {
73
- isFree = false;
74
- break;
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
- tempD = (0, date_fns.addDays)(tempD, 1);
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
- }, [currentMonth, events]);
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 daysEvents = eventsByDate.get(dateKey) || [];
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.jsx)(require_Flex.Flex, {
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 segmentStart = start < weekStart ? weekStart : start;
177
- const segmentDuration = (0, date_fns.differenceInCalendarDays)(end > weekEnd ? weekEnd : end, segmentStart) + 1;
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: `calc(-${indexInSegment} * 100%)`
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 react_jsx_runtime76 from "react/jsx-runtime";
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): react_jsx_runtime76.JSX.Element;
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;;;;;;;;;;;;KAYV,aAAA,GAAa,mBAAA,CAAA,GAAA,CAAA,OAAA"}
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 react_jsx_runtime81 from "react/jsx-runtime";
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): react_jsx_runtime81.JSX.Element;
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;;;;;;;;;;;;KAYV,aAAA,GAAa,mBAAA,CAAA,GAAA,CAAA,OAAA"}
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 = () => setCurrentMonth((prev) => subMonths(prev, 1));
43
- const handleNextMonth = () => setCurrentMonth((prev) => addMonths(prev, 1));
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 = startOfMonth(currentMonth);
47
- const mEnd = endOfMonth(currentMonth);
48
- const relevantEvents = events.filter((event) => {
49
- const { start, end } = getEventRange(event);
50
- return start <= mEnd && end >= mStart;
51
- });
52
- relevantEvents.sort((a, b) => {
53
- const aRange = getEventRange(a);
54
- const bRange = getEventRange(b);
55
- const aDur = differenceInCalendarDays(aRange.end, aRange.start);
56
- const bDur = differenceInCalendarDays(bRange.end, bRange.start);
57
- if (bDur !== aDur) return bDur - aDur;
58
- return aRange.start.getTime() - bRange.start.getTime();
59
- });
60
- for (const event of relevantEvents) {
61
- const { start, end } = getEventRange(event);
62
- let d = start < mStart ? mStart : start;
63
- const eventEndDate = end > mEnd ? mEnd : end;
64
- let slot = 0;
65
- let found = false;
66
- while (!found) {
67
- let isFree = true;
68
- let tempD = new Date(d);
69
- while (tempD <= eventEndDate) {
70
- const dateKey = formatDateStr(tempD);
71
- if ((map.get(dateKey) || [])[slot]) {
72
- isFree = false;
73
- break;
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
- tempD = addDays(tempD, 1);
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
- }, [currentMonth, events]);
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 daysEvents = eventsByDate.get(dateKey) || [];
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__ */ jsx(Flex, {
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 segmentStart = start < weekStart ? weekStart : start;
176
- const segmentDuration = differenceInCalendarDays(end > weekEnd ? weekEnd : end, segmentStart) + 1;
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: `calc(-${indexInSegment} * 100%)`
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] shadow-sm border border-gray-100 flex flex-col items-center gap-2",
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
- "w-full flex flex-col gap-1",
33
- "max-h-[88px] overflow-y-auto",
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: {