@flipdish/ui-library 0.21.0 → 0.22.0

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 (206) hide show
  1. package/dist/components/__internal__/statusIcon/statusIcon.types.d.ts +12 -0
  2. package/dist/components/__internal__/statusIcon/statusIcon.types.d.ts.map +1 -0
  3. package/dist/components/__internal__/statusIcon/statusIcon.utils.cjs +21 -0
  4. package/dist/components/__internal__/statusIcon/statusIcon.utils.cjs.map +1 -0
  5. package/dist/components/__internal__/statusIcon/statusIcon.utils.d.ts +5 -0
  6. package/dist/components/__internal__/statusIcon/statusIcon.utils.d.ts.map +1 -0
  7. package/dist/components/__internal__/statusIcon/statusIcon.utils.js +19 -0
  8. package/dist/components/__internal__/statusIcon/statusIcon.utils.js.map +1 -0
  9. package/dist/components/atoms/BackgroundPattern/components/grid-check.cjs +14 -7
  10. package/dist/components/atoms/BackgroundPattern/components/grid-check.cjs.map +1 -1
  11. package/dist/components/atoms/BackgroundPattern/components/grid-check.d.ts.map +1 -1
  12. package/dist/components/atoms/BackgroundPattern/components/grid-check.js +14 -7
  13. package/dist/components/atoms/BackgroundPattern/components/grid-check.js.map +1 -1
  14. package/dist/components/atoms/BackgroundPattern/index.d.ts.map +1 -1
  15. package/dist/components/molecules/Alert/index.cjs +3 -11
  16. package/dist/components/molecules/Alert/index.cjs.map +1 -1
  17. package/dist/components/molecules/Alert/index.d.ts +3 -2
  18. package/dist/components/molecules/Alert/index.d.ts.map +1 -1
  19. package/dist/components/molecules/Alert/index.js +3 -11
  20. package/dist/components/molecules/Alert/index.js.map +1 -1
  21. package/dist/components/molecules/Notification/index.cjs +3 -10
  22. package/dist/components/molecules/Notification/index.cjs.map +1 -1
  23. package/dist/components/molecules/Notification/index.d.ts +2 -1
  24. package/dist/components/molecules/Notification/index.d.ts.map +1 -1
  25. package/dist/components/molecules/Notification/index.js +3 -10
  26. package/dist/components/molecules/Notification/index.js.map +1 -1
  27. package/dist/components/molecules/Pagination/index.cjs +4 -4
  28. package/dist/components/molecules/Pagination/index.cjs.map +1 -1
  29. package/dist/components/molecules/Pagination/index.js +5 -5
  30. package/dist/components/molecules/Pagination/index.js.map +1 -1
  31. package/dist/components/organisms/Calendar/calendar.utils.cjs +41 -0
  32. package/dist/components/organisms/Calendar/calendar.utils.cjs.map +1 -1
  33. package/dist/components/organisms/Calendar/calendar.utils.d.ts +20 -0
  34. package/dist/components/organisms/Calendar/calendar.utils.d.ts.map +1 -1
  35. package/dist/components/organisms/Calendar/calendar.utils.js +37 -1
  36. package/dist/components/organisms/Calendar/calendar.utils.js.map +1 -1
  37. package/dist/components/organisms/Calendar/components/calendar-day-view.cjs +86 -0
  38. package/dist/components/organisms/Calendar/components/calendar-day-view.cjs.map +1 -0
  39. package/dist/components/organisms/Calendar/components/calendar-day-view.d.ts +20 -0
  40. package/dist/components/organisms/Calendar/components/calendar-day-view.d.ts.map +1 -0
  41. package/dist/components/organisms/Calendar/components/calendar-day-view.js +84 -0
  42. package/dist/components/organisms/Calendar/components/calendar-day-view.js.map +1 -0
  43. package/dist/components/organisms/Calendar/components/calendar-mobile-day-grid.cjs +21 -0
  44. package/dist/components/organisms/Calendar/components/calendar-mobile-day-grid.cjs.map +1 -0
  45. package/dist/components/organisms/Calendar/components/calendar-mobile-day-grid.d.ts +16 -0
  46. package/dist/components/organisms/Calendar/components/calendar-mobile-day-grid.d.ts.map +1 -0
  47. package/dist/components/organisms/Calendar/components/calendar-mobile-day-grid.js +19 -0
  48. package/dist/components/organisms/Calendar/components/calendar-mobile-day-grid.js.map +1 -0
  49. package/dist/components/organisms/Calendar/components/calendar-month-view.cjs +265 -0
  50. package/dist/components/organisms/Calendar/components/calendar-month-view.cjs.map +1 -0
  51. package/dist/components/organisms/Calendar/components/calendar-month-view.d.ts +18 -0
  52. package/dist/components/organisms/Calendar/components/calendar-month-view.d.ts.map +1 -0
  53. package/dist/components/organisms/Calendar/components/calendar-month-view.js +263 -0
  54. package/dist/components/organisms/Calendar/components/calendar-month-view.js.map +1 -0
  55. package/dist/components/organisms/Calendar/components/calendar-positioned-event.cjs +41 -0
  56. package/dist/components/organisms/Calendar/components/calendar-positioned-event.cjs.map +1 -0
  57. package/dist/components/organisms/Calendar/components/calendar-positioned-event.d.ts +15 -0
  58. package/dist/components/organisms/Calendar/components/calendar-positioned-event.d.ts.map +1 -0
  59. package/dist/components/organisms/Calendar/components/calendar-positioned-event.js +39 -0
  60. package/dist/components/organisms/Calendar/components/calendar-positioned-event.js.map +1 -0
  61. package/dist/components/organisms/Calendar/components/calendar-week-view-day.cjs +23 -0
  62. package/dist/components/organisms/Calendar/components/calendar-week-view-day.cjs.map +1 -0
  63. package/dist/components/organisms/Calendar/components/calendar-week-view-day.d.ts +15 -0
  64. package/dist/components/organisms/Calendar/components/calendar-week-view-day.d.ts.map +1 -0
  65. package/dist/components/organisms/Calendar/components/calendar-week-view-day.js +21 -0
  66. package/dist/components/organisms/Calendar/components/calendar-week-view-day.js.map +1 -0
  67. package/dist/components/organisms/Calendar/components/calendar-week-view.cjs +77 -0
  68. package/dist/components/organisms/Calendar/components/calendar-week-view.cjs.map +1 -0
  69. package/dist/components/organisms/Calendar/components/calendar-week-view.d.ts +20 -0
  70. package/dist/components/organisms/Calendar/components/calendar-week-view.d.ts.map +1 -0
  71. package/dist/components/organisms/Calendar/components/calendar-week-view.js +75 -0
  72. package/dist/components/organisms/Calendar/components/calendar-week-view.js.map +1 -0
  73. package/dist/components/organisms/Calendar/index.cjs +4 -504
  74. package/dist/components/organisms/Calendar/index.cjs.map +1 -1
  75. package/dist/components/organisms/Calendar/index.d.ts +1 -1
  76. package/dist/components/organisms/Calendar/index.d.ts.map +1 -1
  77. package/dist/components/organisms/Calendar/index.js +6 -506
  78. package/dist/components/organisms/Calendar/index.js.map +1 -1
  79. package/dist/components/organisms/Charts/components/activity-gauge.cjs +4 -0
  80. package/dist/components/organisms/Charts/components/activity-gauge.cjs.map +1 -1
  81. package/dist/components/organisms/Charts/components/activity-gauge.d.ts +4 -0
  82. package/dist/components/organisms/Charts/components/activity-gauge.d.ts.map +1 -1
  83. package/dist/components/organisms/Charts/components/activity-gauge.js +4 -0
  84. package/dist/components/organisms/Charts/components/activity-gauge.js.map +1 -1
  85. package/dist/components/organisms/Charts/components/bar-chart.cjs +1 -1
  86. package/dist/components/organisms/Charts/components/bar-chart.cjs.map +1 -1
  87. package/dist/components/organisms/Charts/components/bar-chart.d.ts +1 -2
  88. package/dist/components/organisms/Charts/components/bar-chart.d.ts.map +1 -1
  89. package/dist/components/organisms/Charts/components/bar-chart.js +2 -2
  90. package/dist/components/organisms/Charts/components/bar-chart.js.map +1 -1
  91. package/dist/components/organisms/Charts/components/charts-base.cjs +1 -2
  92. package/dist/components/organisms/Charts/components/charts-base.cjs.map +1 -1
  93. package/dist/components/organisms/Charts/components/charts-base.d.ts +13 -2
  94. package/dist/components/organisms/Charts/components/charts-base.d.ts.map +1 -1
  95. package/dist/components/organisms/Charts/components/charts-base.js +1 -2
  96. package/dist/components/organisms/Charts/components/charts-base.js.map +1 -1
  97. package/dist/components/organisms/Charts/components/line-chart.cjs +1 -1
  98. package/dist/components/organisms/Charts/components/line-chart.cjs.map +1 -1
  99. package/dist/components/organisms/Charts/components/line-chart.d.ts +1 -2
  100. package/dist/components/organisms/Charts/components/line-chart.d.ts.map +1 -1
  101. package/dist/components/organisms/Charts/components/line-chart.js +2 -2
  102. package/dist/components/organisms/Charts/components/line-chart.js.map +1 -1
  103. package/dist/components/organisms/Charts/components/pie-chart.cjs +5 -0
  104. package/dist/components/organisms/Charts/components/pie-chart.cjs.map +1 -1
  105. package/dist/components/organisms/Charts/components/pie-chart.d.ts +6 -2
  106. package/dist/components/organisms/Charts/components/pie-chart.d.ts.map +1 -1
  107. package/dist/components/organisms/Charts/components/pie-chart.js +5 -0
  108. package/dist/components/organisms/Charts/components/pie-chart.js.map +1 -1
  109. package/dist/components/organisms/Charts/components/radar-chart.cjs +3 -4
  110. package/dist/components/organisms/Charts/components/radar-chart.cjs.map +1 -1
  111. package/dist/components/organisms/Charts/components/radar-chart.d.ts.map +1 -1
  112. package/dist/components/organisms/Charts/components/radar-chart.js +3 -4
  113. package/dist/components/organisms/Charts/components/radar-chart.js.map +1 -1
  114. package/dist/components/organisms/DatePicker/components/range-calendar.cjs +1 -1
  115. package/dist/components/organisms/DatePicker/components/range-calendar.cjs.map +1 -1
  116. package/dist/components/organisms/DatePicker/components/range-calendar.js +2 -2
  117. package/dist/components/organisms/DatePicker/components/range-calendar.js.map +1 -1
  118. package/dist/components/organisms/GradientPicker/components/gradient-area.cjs +157 -0
  119. package/dist/components/organisms/GradientPicker/components/gradient-area.cjs.map +1 -0
  120. package/dist/components/organisms/GradientPicker/components/gradient-area.d.ts +17 -0
  121. package/dist/components/organisms/GradientPicker/components/gradient-area.d.ts.map +1 -0
  122. package/dist/components/organisms/GradientPicker/components/gradient-area.js +155 -0
  123. package/dist/components/organisms/GradientPicker/components/gradient-area.js.map +1 -0
  124. package/dist/components/organisms/GradientPicker/components/gradient-reverse-button.cjs +17 -0
  125. package/dist/components/organisms/GradientPicker/components/gradient-reverse-button.cjs.map +1 -0
  126. package/dist/components/organisms/GradientPicker/components/gradient-reverse-button.d.ts +3 -0
  127. package/dist/components/organisms/GradientPicker/components/gradient-reverse-button.d.ts.map +1 -0
  128. package/dist/components/organisms/GradientPicker/components/gradient-reverse-button.js +15 -0
  129. package/dist/components/organisms/GradientPicker/components/gradient-reverse-button.js.map +1 -0
  130. package/dist/components/organisms/GradientPicker/components/gradient-slider.cjs +71 -0
  131. package/dist/components/organisms/GradientPicker/components/gradient-slider.cjs.map +1 -0
  132. package/dist/components/organisms/GradientPicker/components/gradient-slider.d.ts +7 -0
  133. package/dist/components/organisms/GradientPicker/components/gradient-slider.d.ts.map +1 -0
  134. package/dist/components/organisms/GradientPicker/components/gradient-slider.js +69 -0
  135. package/dist/components/organisms/GradientPicker/components/gradient-slider.js.map +1 -0
  136. package/dist/components/organisms/GradientPicker/components/gradient-stop-list.cjs +18 -0
  137. package/dist/components/organisms/GradientPicker/components/gradient-stop-list.cjs.map +1 -0
  138. package/dist/components/organisms/GradientPicker/components/gradient-stop-list.d.ts +4 -0
  139. package/dist/components/organisms/GradientPicker/components/gradient-stop-list.d.ts.map +1 -0
  140. package/dist/components/organisms/GradientPicker/components/gradient-stop-list.js +16 -0
  141. package/dist/components/organisms/GradientPicker/components/gradient-stop-list.js.map +1 -0
  142. package/dist/components/organisms/GradientPicker/components/gradient-stop-row.cjs +49 -0
  143. package/dist/components/organisms/GradientPicker/components/gradient-stop-row.cjs.map +1 -0
  144. package/dist/components/organisms/GradientPicker/components/gradient-stop-row.d.ts +6 -0
  145. package/dist/components/organisms/GradientPicker/components/gradient-stop-row.d.ts.map +1 -0
  146. package/dist/components/organisms/GradientPicker/components/gradient-stop-row.js +47 -0
  147. package/dist/components/organisms/GradientPicker/components/gradient-stop-row.js.map +1 -0
  148. package/dist/components/organisms/GradientPicker/components/gradient-type-select.cjs +28 -0
  149. package/dist/components/organisms/GradientPicker/components/gradient-type-select.cjs.map +1 -0
  150. package/dist/components/organisms/GradientPicker/components/gradient-type-select.d.ts +3 -0
  151. package/dist/components/organisms/GradientPicker/components/gradient-type-select.d.ts.map +1 -0
  152. package/dist/components/organisms/GradientPicker/components/gradient-type-select.js +26 -0
  153. package/dist/components/organisms/GradientPicker/components/gradient-type-select.js.map +1 -0
  154. package/dist/components/organisms/GradientPicker/components/position-input.cjs +43 -0
  155. package/dist/components/organisms/GradientPicker/components/position-input.cjs.map +1 -0
  156. package/dist/components/organisms/GradientPicker/components/position-input.d.ts +6 -0
  157. package/dist/components/organisms/GradientPicker/components/position-input.d.ts.map +1 -0
  158. package/dist/components/organisms/GradientPicker/components/position-input.js +41 -0
  159. package/dist/components/organisms/GradientPicker/components/position-input.js.map +1 -0
  160. package/dist/components/organisms/GradientPicker/index.cjs +11 -327
  161. package/dist/components/organisms/GradientPicker/index.cjs.map +1 -1
  162. package/dist/components/organisms/GradientPicker/index.d.ts +7 -8
  163. package/dist/components/organisms/GradientPicker/index.d.ts.map +1 -1
  164. package/dist/components/organisms/GradientPicker/index.js +7 -323
  165. package/dist/components/organisms/GradientPicker/index.js.map +1 -1
  166. package/dist/components/organisms/HeaderNavigation/components/nav-account-card.cjs +1 -1
  167. package/dist/components/organisms/HeaderNavigation/components/nav-account-card.cjs.map +1 -1
  168. package/dist/components/organisms/HeaderNavigation/components/nav-account-card.js +2 -2
  169. package/dist/components/organisms/HeaderNavigation/components/nav-account-card.js.map +1 -1
  170. package/dist/components/organisms/HeaderNavigation/components/nav-button.cjs +1 -1
  171. package/dist/components/organisms/HeaderNavigation/components/nav-button.cjs.map +1 -1
  172. package/dist/components/organisms/HeaderNavigation/components/nav-button.d.ts.map +1 -1
  173. package/dist/components/organisms/HeaderNavigation/components/nav-button.js +1 -1
  174. package/dist/components/organisms/HeaderNavigation/components/nav-button.js.map +1 -1
  175. package/dist/components/organisms/SidebarNavigation/components/nav-account-card.cjs +1 -1
  176. package/dist/components/organisms/SidebarNavigation/components/nav-account-card.cjs.map +1 -1
  177. package/dist/components/organisms/SidebarNavigation/components/nav-account-card.js +2 -2
  178. package/dist/components/organisms/SidebarNavigation/components/nav-account-card.js.map +1 -1
  179. package/dist/components/organisms/SidebarNavigation/index.cjs +1 -1
  180. package/dist/components/organisms/SidebarNavigation/index.cjs.map +1 -1
  181. package/dist/components/organisms/SidebarNavigation/index.js +2 -2
  182. package/dist/components/organisms/SidebarNavigation/index.js.map +1 -1
  183. package/dist/components/organisms/VideoPlayer/hooks/useVideoPlayback.cjs +169 -0
  184. package/dist/components/organisms/VideoPlayer/hooks/useVideoPlayback.cjs.map +1 -0
  185. package/dist/components/organisms/VideoPlayer/hooks/useVideoPlayback.d.ts +34 -0
  186. package/dist/components/organisms/VideoPlayer/hooks/useVideoPlayback.d.ts.map +1 -0
  187. package/dist/components/organisms/VideoPlayer/hooks/useVideoPlayback.js +167 -0
  188. package/dist/components/organisms/VideoPlayer/hooks/useVideoPlayback.js.map +1 -0
  189. package/dist/components/organisms/VideoPlayer/hooks/useVideoVolume.cjs +75 -0
  190. package/dist/components/organisms/VideoPlayer/hooks/useVideoVolume.cjs.map +1 -0
  191. package/dist/components/organisms/VideoPlayer/hooks/useVideoVolume.d.ts +16 -0
  192. package/dist/components/organisms/VideoPlayer/hooks/useVideoVolume.d.ts.map +1 -0
  193. package/dist/components/organisms/VideoPlayer/hooks/useVideoVolume.js +73 -0
  194. package/dist/components/organisms/VideoPlayer/hooks/useVideoVolume.js.map +1 -0
  195. package/dist/components/organisms/VideoPlayer/index.cjs +9 -182
  196. package/dist/components/organisms/VideoPlayer/index.cjs.map +1 -1
  197. package/dist/components/organisms/VideoPlayer/index.d.ts.map +1 -1
  198. package/dist/components/organisms/VideoPlayer/index.js +10 -183
  199. package/dist/components/organisms/VideoPlayer/index.js.map +1 -1
  200. package/dist/hooks/useBreakpoints/index.cjs +4 -1
  201. package/dist/hooks/useBreakpoints/index.cjs.map +1 -1
  202. package/dist/hooks/useBreakpoints/index.d.ts +2 -0
  203. package/dist/hooks/useBreakpoints/index.d.ts.map +1 -1
  204. package/dist/hooks/useBreakpoints/index.js +4 -2
  205. package/dist/hooks/useBreakpoints/index.js.map +1 -1
  206. package/package.json +1 -1
@@ -0,0 +1,263 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { cx } from '@flipdish/ui-library/utilities/cx';
3
+ import { useTestIdPrefix, joinTestId, slugifyTestId } from '@flipdish/ui-library/utilities/testIdUtils';
4
+ import { startOfMonth, endOfMonth, startOfWeek, endOfWeek, today, toCalendarDate, isSameMonth, toZoned, isSameDay, isToday } from '@internationalized/date';
5
+ import { useMemo, useCallback } from 'react';
6
+ import { getDaysInVisibleMonthGrid, getEventsForDay, getStartOfDay, getEndOfDay } from '../calendar.utils.js';
7
+ import { CalendarColumnHeader } from './calendar-column-header.js';
8
+ import { CalendarMonthViewCell } from './calendar-month-view-cell.js';
9
+ import { CalendarMonthViewEvent } from './calendar-month-view-event.js';
10
+
11
+ const MonthView = ({ currentMonthDate, selectedDate, zonedEvents, locale, timeZone, setSelectedDate, fullDateFormatter, shortWeekdayFormatter, timeFormatter, // Needed for formatTime inside
12
+ className, }) => {
13
+ const prefix = useTestIdPrefix();
14
+ const eventTestId = (eventId) => (prefix ? joinTestId(prefix, `event-${slugifyTestId(eventId)}`) : undefined);
15
+ const monthStart = startOfMonth(currentMonthDate);
16
+ const monthEnd = endOfMonth(currentMonthDate);
17
+ const weekStart = startOfWeek(monthStart, locale);
18
+ const weekEnd = endOfWeek(monthEnd, locale);
19
+ const formatTimeForMonth = (dateTime) => timeFormatter.format(dateTime.toDate());
20
+ const days = useMemo(() => getDaysInVisibleMonthGrid(currentMonthDate, locale), [currentMonthDate, locale]);
21
+ const weekdays = useMemo(() => {
22
+ const firstDay = startOfWeek(today(timeZone), locale);
23
+ return Array.from({ length: 7 }).map((_, i) => shortWeekdayFormatter.format(firstDay.add({ days: i }).toDate(timeZone)));
24
+ }, [locale, timeZone, shortWeekdayFormatter]); // Dependencies are passed in
25
+ const visibleEvents = zonedEvents.filter((event) => {
26
+ const eventStartDay = toCalendarDate(event.start);
27
+ const eventEndDay = toCalendarDate(event.end);
28
+ return eventStartDay.compare(weekEnd) <= 0 && eventEndDay.compare(weekStart) >= 0;
29
+ });
30
+ const eventsByDay = useMemo(() => {
31
+ const map = new Map();
32
+ days.forEach((day) => {
33
+ const dateKey = day.toString();
34
+ const dayEvents = getEventsForDay(visibleEvents, day, timeZone);
35
+ map.set(dateKey, dayEvents);
36
+ });
37
+ return map;
38
+ }, [days, visibleEvents, timeZone]); // Dependencies: days array, visible events, timezone
39
+ const MAX_EVENTS_PER_CELL = 3;
40
+ const todayCalDate = today(timeZone);
41
+ const targetDateForFooter = selectedDate || (isSameMonth(currentMonthDate, todayCalDate) ? todayCalDate : null);
42
+ let eventsForFooter = [];
43
+ if (targetDateForFooter) {
44
+ const targetZoned = toZoned(targetDateForFooter, timeZone);
45
+ const targetZonedStart = getStartOfDay(targetZoned, timeZone);
46
+ const targetZonedEnd = getEndOfDay(targetZoned, timeZone);
47
+ eventsForFooter = zonedEvents
48
+ .filter((event) => {
49
+ const eventStartDay = toCalendarDate(event.start);
50
+ const eventEndDay = toCalendarDate(event.end);
51
+ return (isSameDay(eventStartDay, targetDateForFooter) ||
52
+ isSameDay(eventEndDay, targetDateForFooter) ||
53
+ (event.start.compare(targetZonedEnd) < 0 && event.end.compare(targetZonedStart) > 0));
54
+ })
55
+ .sort((a, b) => a.start.compare(b.start));
56
+ }
57
+ /**
58
+ * Calculates how many days an event should visually span from a given start date.
59
+ *
60
+ * Multi-day events are rendered as a single element that spans multiple cells.
61
+ * To avoid duplicate rendering:
62
+ * - Events render only on their start day
63
+ * - Multi-week events re-render at the start of each new week they span
64
+ *
65
+ * @returns Number of days to span, or null if event should not render on this day
66
+ */
67
+ const calculateEventSpan = useCallback((event, currentDate) => {
68
+ const eventStartDay = toCalendarDate(event.start);
69
+ const eventEndDay = toCalendarDate(event.end);
70
+ const startsOnThisDay = isSameDay(currentDate, eventStartDay);
71
+ if (!startsOnThisDay && eventStartDay.compare(currentDate) < 0) {
72
+ const currentDayIndex = days.findIndex((d) => isSameDay(d, currentDate));
73
+ const weekStartIndex = Math.floor(currentDayIndex / 7) * 7;
74
+ const weekStartDate = days[weekStartIndex];
75
+ if (!weekStartDate)
76
+ return null;
77
+ const isFirstDayOfWeek = isSameDay(currentDate, weekStartDate);
78
+ // Only render at week boundaries for multi-week events
79
+ if (!isFirstDayOfWeek) {
80
+ return null; // Already rendered earlier in this week
81
+ }
82
+ }
83
+ const currentDayIndex = days.findIndex((d) => isSameDay(d, currentDate));
84
+ const weekEndIndex = Math.floor(currentDayIndex / 7) * 7 + 6;
85
+ let spanDays = 1;
86
+ let checkDay = currentDate.add({ days: 1 });
87
+ let checkDayIndex = currentDayIndex + 1;
88
+ while (checkDayIndex <= weekEndIndex && checkDay.compare(eventEndDay) <= 0) {
89
+ spanDays++;
90
+ checkDay = checkDay.add({ days: 1 });
91
+ checkDayIndex++;
92
+ }
93
+ return spanDays;
94
+ }, [days]);
95
+ /**
96
+ * Creates an optimized layout for multi-day events using a row-packing algorithm.
97
+ *
98
+ * Key concepts:
99
+ * 1. Each event is assigned to a "row" (vertical position within a day cell)
100
+ * 2. Events spanning multiple days create invisible "placeholder" cells to reserve space
101
+ * 3. Row assignment uses a greedy algorithm to minimize wasted vertical space
102
+ * 4. Multi-week events can use different rows in each week for optimal packing
103
+ *
104
+ * Example: If Event A (Mon-Wed) is in row 0, Event B (Thu-Fri) can also use row 0
105
+ * because they don't overlap, preventing wasted space.
106
+ */
107
+ const eventRenderMap = useMemo(() => {
108
+ const renderMap = new Map();
109
+ // biome-ignore lint/suspicious/useIterableCallbackReturn: This is a side effect
110
+ days.forEach((day) => renderMap.set(day.toString(), []));
111
+ const eventRowAssignments = new Map(); // eventId -> row number
112
+ const rowOccupancyByDay = new Map(); // dateKey -> [row0: Set<eventId>, row1: Set<eventId>, ...]
113
+ // biome-ignore lint/suspicious/useIterableCallbackReturn: This is a side effect
114
+ days.forEach((day) => rowOccupancyByDay.set(day.toString(), []));
115
+ /** Whether a multi-week event re-starts its rendering at this week's first day. */
116
+ const isWeekBoundaryStart = (dayIndex, eventStartDay, currentDay) => {
117
+ const startsOnCurrentDay = isSameDay(currentDay, eventStartDay);
118
+ if (startsOnCurrentDay)
119
+ return false;
120
+ const weekStartIndex = Math.floor(dayIndex / 7) * 7;
121
+ const weekStartDate = days[weekStartIndex];
122
+ if (!weekStartDate)
123
+ return false;
124
+ return isSameDay(currentDay, weekStartDate);
125
+ };
126
+ /** First row index free across every day the event spans. */
127
+ const findAvailableRow = (startDayIndex, span) => {
128
+ let row = 0;
129
+ while (true) {
130
+ let isAvailable = true;
131
+ for (let offset = 0; offset < span; offset++) {
132
+ const dayIndex = startDayIndex + offset;
133
+ const day = days[dayIndex];
134
+ if (!day)
135
+ break;
136
+ const dayKey = day.toString();
137
+ const occupancy = rowOccupancyByDay.get(dayKey);
138
+ if ((occupancy?.[row]?.size ?? 0) > 0) {
139
+ isAvailable = false;
140
+ break;
141
+ }
142
+ }
143
+ if (isAvailable)
144
+ return row;
145
+ row++;
146
+ }
147
+ };
148
+ /** Marks `row` occupied for every day the event spans. */
149
+ const markRowAsOccupied = (startDayIndex, span, row, eventId) => {
150
+ for (let offset = 0; offset < span; offset++) {
151
+ const dayIndex = startDayIndex + offset;
152
+ const day = days[dayIndex];
153
+ if (!day)
154
+ break;
155
+ const dayKey = day.toString();
156
+ const occupancy = rowOccupancyByDay.get(dayKey);
157
+ if (!occupancy)
158
+ break;
159
+ let cell = occupancy[row];
160
+ if (!cell) {
161
+ cell = new Set();
162
+ occupancy[row] = cell;
163
+ }
164
+ cell.add(eventId);
165
+ }
166
+ };
167
+ days.forEach((day, dayIndex) => {
168
+ const dateKey = day.toString();
169
+ const eventsOnThisDay = eventsByDay.get(dateKey) || [];
170
+ eventsOnThisDay.forEach((event) => {
171
+ const span = calculateEventSpan(event, day);
172
+ if (span === null)
173
+ return; // Event doesn't render on this day
174
+ const eventStartDay = toCalendarDate(event.start);
175
+ const isNewWeekSegment = isWeekBoundaryStart(dayIndex, eventStartDay, day);
176
+ const hasExistingRow = eventRowAssignments.has(event.id);
177
+ // Reuse the event's row within a week; a new week segment gets a fresh row.
178
+ let row;
179
+ if (hasExistingRow && !isNewWeekSegment) {
180
+ // biome-ignore lint/style/noNonNullAssertion: guarded by hasExistingRow (eventRowAssignments.has(event.id)) above
181
+ row = eventRowAssignments.get(event.id);
182
+ }
183
+ else {
184
+ row = findAvailableRow(dayIndex, span);
185
+ eventRowAssignments.set(event.id, row);
186
+ }
187
+ markRowAsOccupied(dayIndex, span, row, event.id);
188
+ renderMap.get(dateKey)?.push({ event, span, isPlaceholder: false, row });
189
+ // Invisible placeholders keep later days' rows aligned under the spanning event.
190
+ for (let offset = 1; offset < span; offset++) {
191
+ const nextDayIndex = dayIndex + offset;
192
+ const nextDay = days[nextDayIndex];
193
+ if (!nextDay)
194
+ break;
195
+ const nextDayKey = nextDay.toString();
196
+ renderMap.get(nextDayKey)?.push({ event, span: 0, isPlaceholder: true, row });
197
+ }
198
+ });
199
+ });
200
+ // biome-ignore lint/suspicious/useIterableCallbackReturn: This is a side effect
201
+ renderMap.forEach((events) => events.sort((a, b) => a.row - b.row));
202
+ return renderMap;
203
+ }, [calculateEventSpan, days, eventsByDay]);
204
+ return (jsxs("div", { className: cx('flex flex-1 flex-col', className), children: [jsx("div", { className: "grid grid-cols-7", children: weekdays.map((weekday, index) => (
205
+ // biome-ignore lint/suspicious/noArrayIndexKey: This is a key for the column header
206
+ jsx(CalendarColumnHeader, { weekDay: weekday, className: "before:border-b" }, index))) }), jsx("div", { className: cx('grid flex-1 grid-cols-7',
207
+ // 6 rows for >35 days (6 weeks), 5 rows for >28 days (5 weeks), 4 rows for <=28 days (4 weeks)
208
+ days.length > 35 ? 'grid-rows-6' : days.length > 28 ? 'grid-rows-5' : 'grid-rows-4'), children: days.map((date, index) => {
209
+ const dateKey = date.toString();
210
+ const isCurrentMonthFlag = isSameMonth(date, currentMonthDate);
211
+ const isTodayFlag = isToday(date, timeZone);
212
+ const isSelectedFlag = selectedDate ? isSameDay(date, selectedDate) : false;
213
+ const isLastRow = days.length > 35 ? index >= 35 : days.length > 28 ? index >= 28 : index >= 21;
214
+ const isLastColumn = (index + 1) % 7 === 0;
215
+ const eventsToRender = eventRenderMap.get(dateKey) || [];
216
+ const dayEvents = eventsByDay.get(dateKey) || [];
217
+ const eventsToShow = eventsToRender.slice(0, MAX_EVENTS_PER_CELL);
218
+ const remainingEventsCount = Math.max(0, dayEvents.length - MAX_EVENTS_PER_CELL);
219
+ return (jsxs(CalendarMonthViewCell, { day: date.day, isDisabled: !isCurrentMonthFlag, state: isSelectedFlag ? 'selected' : isTodayFlag ? 'current' : 'default', className: cx(isLastRow && 'before:border-b-0', isLastColumn && 'before:border-r-0'), onClick: () => isCurrentMonthFlag && setSelectedDate(date), "data-testid": prefix ? joinTestId(prefix, `cell-${slugifyTestId(dateKey)}`) : undefined, children: [jsx("div", { className: "flex gap-1 max-md:pl-1 md:flex-col", children: eventsToShow.map(({ event, span, isPlaceholder }) => {
220
+ // If this is a placeholder, render an invisible element to take up space
221
+ if (isPlaceholder) {
222
+ return (jsx("div", { className: "pointer-events-none opacity-0", children: jsx(CalendarMonthViewEvent, { label: event.title, collapseOnMobile: true, color: event.color, withDot: event.dot }) }, `${event.id}-placeholder`));
223
+ }
224
+ // Regular event rendering
225
+ const eventStartDay = toCalendarDate(event.start);
226
+ const eventEndDay = toCalendarDate(event.end);
227
+ const startsToday = isSameDay(date, eventStartDay);
228
+ const endsToday = isSameDay(date, eventEndDay);
229
+ const continuesPrior = eventStartDay.compare(date) < 0;
230
+ const continuesAfter = eventEndDay.compare(date) > 0;
231
+ // Boundary checks compare times, not calendar days: an event starts "at day start"
232
+ // only when it begins at midnight, and ends "at day end" when it ends at midnight
233
+ // (exclusive-end convention) or at 23:59:59.999 (inclusive-end convention).
234
+ const eventStartsAtDayStart = event.start.compare(getStartOfDay(event.start, timeZone)) === 0;
235
+ const eventEndsAtDayEnd = event.end.compare(getStartOfDay(event.end, timeZone)) === 0 || event.end.compare(getEndOfDay(event.end, timeZone)) >= 0;
236
+ const isAllDayForCell = (continuesPrior && continuesAfter) ||
237
+ (startsToday && continuesAfter && eventStartsAtDayStart) ||
238
+ (continuesPrior && endsToday && eventEndsAtDayEnd) ||
239
+ (startsToday && endsToday && eventStartsAtDayStart && eventEndsAtDayEnd);
240
+ const supportingText = isAllDayForCell ? undefined : formatTimeForMonth(event.start);
241
+ // Apply custom width style for multi-day events
242
+ const spanStyle = span > 1
243
+ ? {
244
+ zIndex: 1,
245
+ width: `calc(${span * 100}% + ${(span - 1) * 16}px)`,
246
+ }
247
+ : undefined;
248
+ return (jsx("div", { style: spanStyle, className: cx(!isCurrentMonthFlag && 'opacity-50'), children: jsx(CalendarMonthViewEvent, { label: event.title, collapseOnMobile: true, supportingText: supportingText, color: event.color, withDot: event.dot, "data-testid": eventTestId(event.id) }) }, event.id));
249
+ }) }), remainingEventsCount > 0 && (jsx("div", { className: "truncate text-xs font-semibold text-utility-neutral-500 max-md:pl-1", children: `${remainingEventsCount} more...` }))] }, dateKey));
250
+ }) }), targetDateForFooter && (jsxs("div", { className: "border-t border-secondary px-4 py-5 md:hidden", children: [jsx("h3", { className: "text-sm font-semibold text-primary", children: fullDateFormatter.format(targetDateForFooter.toDate(timeZone)) }), eventsForFooter.length > 0 && (jsx("div", { className: "mt-4 flex flex-col gap-1.5", children: eventsForFooter.slice(0, 3).map((event) => {
251
+ // "All day" when the event covers the entire displayed day. Comparing against the
252
+ // footer's target day (not the event's own end day) handles exclusive-end events
253
+ // (end = next midnight) and multi-day events spanning this day.
254
+ const dayStart = getStartOfDay(targetDateForFooter, timeZone);
255
+ const dayEnd = getEndOfDay(targetDateForFooter, timeZone);
256
+ const isAllDay = event.start.compare(dayStart) <= 0 && event.end.compare(dayEnd) >= 0;
257
+ const supportingText = isAllDay ? 'All day' : formatTimeForMonth(event.start);
258
+ return (jsx(CalendarMonthViewEvent, { label: event.title, supportingText: supportingText, color: event.color, withDot: event.dot, "data-testid": eventTestId(event.id) }, `footer-${event.id}`));
259
+ }) })), eventsForFooter.length === 0 && jsx("p", { className: "mt-4 text-xs font-semibold text-quaternary", children: "No events for this day." }), eventsForFooter.length > 3 && jsx("p", { className: "mt-4 text-xs font-semibold text-quaternary", children: `${eventsForFooter.length - 3} more...` })] }))] }));
260
+ };
261
+
262
+ export { MonthView };
263
+ //# sourceMappingURL=calendar-month-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-month-view.js","sources":["../../../../../src/components/organisms/Calendar/components/calendar-month-view.tsx"],"sourcesContent":[null],"names":["_jsxs","_jsx","isDateToday"],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var testIdUtils = require('@flipdish/ui-library/utilities/testIdUtils');
5
+ var date = require('@internationalized/date');
6
+ var calendar_utils = require('../calendar.utils.cjs');
7
+ var calendarDwViewEvent = require('./calendar-dw-view-event.cjs');
8
+
9
+ const PositionedEvent = ({ event, dayStart, timeZone, slotHeight, overlapIndex, setSelectedDate, timeFormatter }) => {
10
+ const prefix = testIdUtils.useTestIdPrefix();
11
+ const eventTestId = prefix ? testIdUtils.joinTestId(prefix, `event-${testIdUtils.slugifyTestId(event.id)}`) : undefined;
12
+ const formatTime = (dateTime) => timeFormatter.format(dateTime.toDate());
13
+ const startZoned = event.start;
14
+ const endZoned = event.end;
15
+ // Clamp to the visible day so multi-day events size correctly within it.
16
+ const dayEnd = calendar_utils.getEndOfDay(dayStart, timeZone);
17
+ const clampedStart = startZoned.compare(dayStart) < 0 ? dayStart : startZoned;
18
+ const clampedEnd = endZoned.compare(dayEnd) > 0 ? dayEnd : endZoned;
19
+ const startMinutes = clampedStart.hour * 60 + clampedStart.minute;
20
+ const endMinutes = clampedEnd.hour * 60 + clampedEnd.minute;
21
+ const durationMinutes = Math.max(15, endMinutes - startMinutes);
22
+ const top = (startMinutes / 30) * slotHeight;
23
+ // Half a slot floor: events shorter than 15 min still get a clickable block.
24
+ const height = Math.max(slotHeight / 2, (durationMinutes / 30) * slotHeight);
25
+ // Overlap offset deliberately disabled (0) until a stacked-events design lands.
26
+ const horizontalOffset = 0;
27
+ const displayTime = durationMinutes > 30;
28
+ const supportingText = displayTime ? formatTime(startZoned) : undefined;
29
+ return (
30
+ // biome-ignore lint/a11y/noStaticElementInteractions: This is a static element that is used to position the event
31
+ // biome-ignore lint/a11y/useKeyWithClickEvents: This is a static element that is used to position the event
32
+ jsxRuntime.jsx("div", { className: "absolute w-full px-1.5 py-1.5", style: {
33
+ top: `${top}px`,
34
+ height: `${height}px`,
35
+ left: `${horizontalOffset}px`,
36
+ zIndex: overlapIndex,
37
+ }, onClick: () => setSelectedDate(date.toCalendarDate(startZoned)), children: jsxRuntime.jsx(calendarDwViewEvent.CalendarDwViewEvent, { label: event.title, supportingText: supportingText, color: event.color, withDot: event.dot, "data-testid": eventTestId }) }, event.id));
38
+ };
39
+
40
+ exports.PositionedEvent = PositionedEvent;
41
+ //# sourceMappingURL=calendar-positioned-event.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-positioned-event.cjs","sources":["../../../../../src/components/organisms/Calendar/components/calendar-positioned-event.tsx"],"sourcesContent":[null],"names":["useTestIdPrefix","joinTestId","slugifyTestId","getEndOfDay","_jsx","toCalendarDate","CalendarDwViewEvent"],"mappings":";;;;;;;;MAkBa,eAAe,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAwB,KAAI;AAC/I,IAAA,MAAM,MAAM,GAAGA,2BAAe,EAAE;IAChC,MAAM,WAAW,GAAG,MAAM,GAAGC,sBAAU,CAAC,MAAM,EAAE,CAAA,MAAA,EAASC,yBAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA,CAAE,CAAC,GAAG,SAAS;AAE/F,IAAA,MAAM,UAAU,GAAG,CAAC,QAAuB,KAAK,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;AAEvF,IAAA,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK;AAC9B,IAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG;;IAG1B,MAAM,MAAM,GAAGC,0BAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC;AAC9C,IAAA,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,QAAQ,GAAG,UAAU;AAC7E,IAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,QAAQ;IAEnE,MAAM,YAAY,GAAG,YAAY,CAAC,IAAI,GAAG,EAAE,GAAG,YAAY,CAAC,MAAM;IACjE,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,GAAG,EAAE,GAAG,UAAU,CAAC,MAAM;AAC3D,IAAA,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,GAAG,YAAY,CAAC;IAE/D,MAAM,GAAG,GAAG,CAAC,YAAY,GAAG,EAAE,IAAI,UAAU;;AAE5C,IAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC,eAAe,GAAG,EAAE,IAAI,UAAU,CAAC;;IAG5E,MAAM,gBAAgB,GAAG,CAAC;AAE1B,IAAA,MAAM,WAAW,GAAG,eAAe,GAAG,EAAE;AACxC,IAAA,MAAM,cAAc,GAAG,WAAW,GAAG,UAAU,CAAC,UAAU,CAAC,GAAG,SAAS;IAEvE;;;AAGE,IAAAC,cAAA,CAAA,KAAA,EAAA,EAEE,SAAS,EAAC,+BAA+B,EACzC,KAAK,EAAE;YACL,GAAG,EAAE,CAAA,EAAG,GAAG,CAAA,EAAA,CAAI;YACf,MAAM,EAAE,CAAA,EAAG,MAAM,CAAA,EAAA,CAAI;YACrB,IAAI,EAAE,CAAA,EAAG,gBAAgB,CAAA,EAAA,CAAI;AAC7B,YAAA,MAAM,EAAE,YAAY;SACrB,EACD,OAAO,EAAE,MAAM,eAAe,CAACC,mBAAc,CAAC,UAAU,CAAC,CAAC,EAAA,QAAA,EAE1DD,eAACE,uCAAmB,EAAA,EAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,EAAA,aAAA,EAAe,WAAW,EAAA,CAAI,EAAA,EAVxI,KAAK,CAAC,EAAE,CAWT;AAEV;;;;"}
@@ -0,0 +1,15 @@
1
+ import { type CalendarDate, type ZonedDateTime } from '@internationalized/date';
2
+ import type { DateFormatter } from '@react-aria/i18n';
3
+ import { type ZonedEvent } from '../calendar.utils';
4
+ interface PositionedEventProps {
5
+ event: ZonedEvent;
6
+ dayStart: ZonedDateTime;
7
+ timeZone: string;
8
+ slotHeight: number;
9
+ overlapIndex: number;
10
+ setSelectedDate: (date: CalendarDate) => void;
11
+ timeFormatter: DateFormatter;
12
+ }
13
+ export declare const PositionedEvent: ({ event, dayStart, timeZone, slotHeight, overlapIndex, setSelectedDate, timeFormatter }: PositionedEventProps) => import("react").JSX.Element;
14
+ export {};
15
+ //# sourceMappingURL=calendar-positioned-event.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-positioned-event.d.ts","sourceRoot":"","sources":["../../../../../src/components/organisms/Calendar/components/calendar-positioned-event.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,YAAY,EAAkB,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAChG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGjE,UAAU,oBAAoB;IAC5B,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,EAAE,aAAa,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IAC9C,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,eAAO,MAAM,eAAe,GAAI,yFAAyF,oBAAoB,gCA6C5I,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { useTestIdPrefix, joinTestId, slugifyTestId } from '@flipdish/ui-library/utilities/testIdUtils';
3
+ import { toCalendarDate } from '@internationalized/date';
4
+ import { getEndOfDay } from '../calendar.utils.js';
5
+ import { CalendarDwViewEvent } from './calendar-dw-view-event.js';
6
+
7
+ const PositionedEvent = ({ event, dayStart, timeZone, slotHeight, overlapIndex, setSelectedDate, timeFormatter }) => {
8
+ const prefix = useTestIdPrefix();
9
+ const eventTestId = prefix ? joinTestId(prefix, `event-${slugifyTestId(event.id)}`) : undefined;
10
+ const formatTime = (dateTime) => timeFormatter.format(dateTime.toDate());
11
+ const startZoned = event.start;
12
+ const endZoned = event.end;
13
+ // Clamp to the visible day so multi-day events size correctly within it.
14
+ const dayEnd = getEndOfDay(dayStart, timeZone);
15
+ const clampedStart = startZoned.compare(dayStart) < 0 ? dayStart : startZoned;
16
+ const clampedEnd = endZoned.compare(dayEnd) > 0 ? dayEnd : endZoned;
17
+ const startMinutes = clampedStart.hour * 60 + clampedStart.minute;
18
+ const endMinutes = clampedEnd.hour * 60 + clampedEnd.minute;
19
+ const durationMinutes = Math.max(15, endMinutes - startMinutes);
20
+ const top = (startMinutes / 30) * slotHeight;
21
+ // Half a slot floor: events shorter than 15 min still get a clickable block.
22
+ const height = Math.max(slotHeight / 2, (durationMinutes / 30) * slotHeight);
23
+ // Overlap offset deliberately disabled (0) until a stacked-events design lands.
24
+ const horizontalOffset = 0;
25
+ const displayTime = durationMinutes > 30;
26
+ const supportingText = displayTime ? formatTime(startZoned) : undefined;
27
+ return (
28
+ // biome-ignore lint/a11y/noStaticElementInteractions: This is a static element that is used to position the event
29
+ // biome-ignore lint/a11y/useKeyWithClickEvents: This is a static element that is used to position the event
30
+ jsx("div", { className: "absolute w-full px-1.5 py-1.5", style: {
31
+ top: `${top}px`,
32
+ height: `${height}px`,
33
+ left: `${horizontalOffset}px`,
34
+ zIndex: overlapIndex,
35
+ }, onClick: () => setSelectedDate(toCalendarDate(startZoned)), children: jsx(CalendarDwViewEvent, { label: event.title, supportingText: supportingText, color: event.color, withDot: event.dot, "data-testid": eventTestId }) }, event.id));
36
+ };
37
+
38
+ export { PositionedEvent };
39
+ //# sourceMappingURL=calendar-positioned-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-positioned-event.js","sources":["../../../../../src/components/organisms/Calendar/components/calendar-positioned-event.tsx"],"sourcesContent":[null],"names":["_jsx"],"mappings":";;;;;;MAkBa,eAAe,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAwB,KAAI;AAC/I,IAAA,MAAM,MAAM,GAAG,eAAe,EAAE;IAChC,MAAM,WAAW,GAAG,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,CAAA,MAAA,EAAS,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA,CAAE,CAAC,GAAG,SAAS;AAE/F,IAAA,MAAM,UAAU,GAAG,CAAC,QAAuB,KAAK,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;AAEvF,IAAA,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK;AAC9B,IAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG;;IAG1B,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC;AAC9C,IAAA,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,QAAQ,GAAG,UAAU;AAC7E,IAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,QAAQ;IAEnE,MAAM,YAAY,GAAG,YAAY,CAAC,IAAI,GAAG,EAAE,GAAG,YAAY,CAAC,MAAM;IACjE,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,GAAG,EAAE,GAAG,UAAU,CAAC,MAAM;AAC3D,IAAA,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,GAAG,YAAY,CAAC;IAE/D,MAAM,GAAG,GAAG,CAAC,YAAY,GAAG,EAAE,IAAI,UAAU;;AAE5C,IAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC,eAAe,GAAG,EAAE,IAAI,UAAU,CAAC;;IAG5E,MAAM,gBAAgB,GAAG,CAAC;AAE1B,IAAA,MAAM,WAAW,GAAG,eAAe,GAAG,EAAE;AACxC,IAAA,MAAM,cAAc,GAAG,WAAW,GAAG,UAAU,CAAC,UAAU,CAAC,GAAG,SAAS;IAEvE;;;AAGE,IAAAA,GAAA,CAAA,KAAA,EAAA,EAEE,SAAS,EAAC,+BAA+B,EACzC,KAAK,EAAE;YACL,GAAG,EAAE,CAAA,EAAG,GAAG,CAAA,EAAA,CAAI;YACf,MAAM,EAAE,CAAA,EAAG,MAAM,CAAA,EAAA,CAAI;YACrB,IAAI,EAAE,CAAA,EAAG,gBAAgB,CAAA,EAAA,CAAI;AAC7B,YAAA,MAAM,EAAE,YAAY;SACrB,EACD,OAAO,EAAE,MAAM,eAAe,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,EAAA,QAAA,EAE1DA,IAAC,mBAAmB,EAAA,EAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,EAAA,aAAA,EAAe,WAAW,EAAA,CAAI,EAAA,EAVxI,KAAK,CAAC,EAAE,CAWT;AAEV;;;;"}
@@ -0,0 +1,23 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var cx = require('@flipdish/ui-library/utilities/cx');
5
+ var React = require('react');
6
+ var calendar_utils = require('../calendar.utils.cjs');
7
+ var calendarDwViewCell = require('./calendar-dw-view-cell.cjs');
8
+ var calendarPositionedEvent = require('./calendar-positioned-event.cjs');
9
+
10
+ const WeekViewDay = ({ day, isLastDay, visibleEvents, timeZone, slotHeight, setSelectedDate, timeFormatter }) => {
11
+ const dateKey = day.toString();
12
+ const dayEvents = React.useMemo(() => calendar_utils.getEventsForDay(visibleEvents, day, timeZone), [visibleEvents, day, timeZone]);
13
+ const dayStart = React.useMemo(() => calendar_utils.getStartOfDay(day, timeZone), [day, timeZone]);
14
+ return (jsxRuntime.jsx("div", { className: "flex flex-col border-secondary", children: jsxRuntime.jsxs("div", { className: "relative flex-1 bg-primary", style: { minHeight: `${48 * slotHeight}px` }, children: [Array.from({ length: 48 }).map((_, slotIndex) => (jsxRuntime.jsx(calendarDwViewCell.CalendarDwViewCell
15
+ // biome-ignore lint/suspicious/noArrayIndexKey: fixed 48 half-hour slots — the index is a stable slot position
16
+ , { className: cx.cx('last:before:border-b-0', isLastDay && 'before:border-r-0') }, `slot-${dateKey}-${slotIndex}`))), dayEvents.map((event, index) => {
17
+ const overlapIndex = dayEvents.filter((e, i) => i < index && event.start.compare(e.end) < 0 && event.end.compare(e.start) > 0).length;
18
+ return (jsxRuntime.jsx(calendarPositionedEvent.PositionedEvent, { event: event, dayStart: dayStart, timeZone: timeZone, slotHeight: slotHeight, overlapIndex: overlapIndex, setSelectedDate: setSelectedDate, timeFormatter: timeFormatter }, event.id));
19
+ })] }) }));
20
+ };
21
+
22
+ exports.WeekViewDay = WeekViewDay;
23
+ //# sourceMappingURL=calendar-week-view-day.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-week-view-day.cjs","sources":["../../../../../src/components/organisms/Calendar/components/calendar-week-view-day.tsx"],"sourcesContent":[null],"names":["useMemo","getEventsForDay","getStartOfDay","_jsx","_jsxs","CalendarDwViewCell","cx","PositionedEvent"],"mappings":";;;;;;;;;MAoBa,WAAW,GAAG,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,EAAoB,KAAI;AACvI,IAAA,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,EAAE;IAC9B,MAAM,SAAS,GAAGA,aAAO,CAAC,MAAMC,8BAAe,CAAC,aAAa,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC9G,MAAM,QAAQ,GAAGD,aAAO,CAAC,MAAME,4BAAa,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAE7E,QACEC,wBAAK,SAAS,EAAC,gCAAgC,EAAA,QAAA,EAC7CC,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,4BAA4B,EAAC,KAAK,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,UAAU,CAAA,EAAA,CAAI,EAAE,aACrF,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,MAC3CD,cAAA,CAACE;;AAGC,kBAAA,EAAA,SAAS,EAAEC,KAAE,CAAC,wBAAwB,EAAE,SAAS,IAAI,mBAAmB,CAAC,EAAA,EADpE,CAAA,KAAA,EAAQ,OAAO,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAEnC,CACH,CAAC,EAED,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,KAAI;oBAC9B,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;AAErI,oBAAA,QACEH,cAAA,CAACI,uCAAe,EAAA,EAEd,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,YAAY,EAC1B,eAAe,EAAE,eAAe,EAChC,aAAa,EAAE,aAAa,EAAA,EAPvB,KAAK,CAAC,EAAE,CAQb;AAEN,gBAAA,CAAC,CAAC,CAAA,EAAA,CACE,EAAA,CACF;AAEV;;;;"}
@@ -0,0 +1,15 @@
1
+ import type { CalendarDate } from '@internationalized/date';
2
+ import type { DateFormatter } from '@react-aria/i18n';
3
+ import { type ZonedEvent } from '../calendar.utils';
4
+ interface WeekViewDayProps {
5
+ day: CalendarDate;
6
+ isLastDay: boolean;
7
+ visibleEvents: ZonedEvent[];
8
+ timeZone: string;
9
+ slotHeight: number;
10
+ setSelectedDate: (date: CalendarDate | null) => void;
11
+ timeFormatter: DateFormatter;
12
+ }
13
+ export declare const WeekViewDay: ({ day, isLastDay, visibleEvents, timeZone, slotHeight, setSelectedDate, timeFormatter }: WeekViewDayProps) => import("react").JSX.Element;
14
+ export {};
15
+ //# sourceMappingURL=calendar-week-view-day.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-week-view-day.d.ts","sourceRoot":"","sources":["../../../../../src/components/organisms/Calendar/components/calendar-week-view-day.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,OAAO,EAAkC,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAIpF,UAAU,gBAAgB;IACxB,GAAG,EAAE,YAAY,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,UAAU,EAAE,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,KAAK,IAAI,CAAC;IACrD,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,eAAO,MAAM,WAAW,GAAI,yFAAyF,gBAAgB,gCAmCpI,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { cx } from '@flipdish/ui-library/utilities/cx';
3
+ import { useMemo } from 'react';
4
+ import { getEventsForDay, getStartOfDay } from '../calendar.utils.js';
5
+ import { CalendarDwViewCell } from './calendar-dw-view-cell.js';
6
+ import { PositionedEvent } from './calendar-positioned-event.js';
7
+
8
+ const WeekViewDay = ({ day, isLastDay, visibleEvents, timeZone, slotHeight, setSelectedDate, timeFormatter }) => {
9
+ const dateKey = day.toString();
10
+ const dayEvents = useMemo(() => getEventsForDay(visibleEvents, day, timeZone), [visibleEvents, day, timeZone]);
11
+ const dayStart = useMemo(() => getStartOfDay(day, timeZone), [day, timeZone]);
12
+ return (jsx("div", { className: "flex flex-col border-secondary", children: jsxs("div", { className: "relative flex-1 bg-primary", style: { minHeight: `${48 * slotHeight}px` }, children: [Array.from({ length: 48 }).map((_, slotIndex) => (jsx(CalendarDwViewCell
13
+ // biome-ignore lint/suspicious/noArrayIndexKey: fixed 48 half-hour slots — the index is a stable slot position
14
+ , { className: cx('last:before:border-b-0', isLastDay && 'before:border-r-0') }, `slot-${dateKey}-${slotIndex}`))), dayEvents.map((event, index) => {
15
+ const overlapIndex = dayEvents.filter((e, i) => i < index && event.start.compare(e.end) < 0 && event.end.compare(e.start) > 0).length;
16
+ return (jsx(PositionedEvent, { event: event, dayStart: dayStart, timeZone: timeZone, slotHeight: slotHeight, overlapIndex: overlapIndex, setSelectedDate: setSelectedDate, timeFormatter: timeFormatter }, event.id));
17
+ })] }) }));
18
+ };
19
+
20
+ export { WeekViewDay };
21
+ //# sourceMappingURL=calendar-week-view-day.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-week-view-day.js","sources":["../../../../../src/components/organisms/Calendar/components/calendar-week-view-day.tsx"],"sourcesContent":[null],"names":["_jsx","_jsxs"],"mappings":";;;;;;;MAoBa,WAAW,GAAG,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,EAAoB,KAAI;AACvI,IAAA,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,EAAE;IAC9B,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,eAAe,CAAC,aAAa,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC9G,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAE7E,QACEA,aAAK,SAAS,EAAC,gCAAgC,EAAA,QAAA,EAC7CC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,4BAA4B,EAAC,KAAK,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,UAAU,CAAA,EAAA,CAAI,EAAE,aACrF,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,MAC3CD,GAAA,CAAC;;AAGC,kBAAA,EAAA,SAAS,EAAE,EAAE,CAAC,wBAAwB,EAAE,SAAS,IAAI,mBAAmB,CAAC,EAAA,EADpE,CAAA,KAAA,EAAQ,OAAO,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAEnC,CACH,CAAC,EAED,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,KAAI;oBAC9B,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;AAErI,oBAAA,QACEA,GAAA,CAAC,eAAe,EAAA,EAEd,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,YAAY,EAC1B,eAAe,EAAE,eAAe,EAChC,aAAa,EAAE,aAAa,EAAA,EAPvB,KAAK,CAAC,EAAE,CAQb;AAEN,gBAAA,CAAC,CAAC,CAAA,EAAA,CACE,EAAA,CACF;AAEV;;;;"}
@@ -0,0 +1,77 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var cx = require('@flipdish/ui-library/utilities/cx');
5
+ var date = require('@internationalized/date');
6
+ var React = require('react');
7
+ var calendar_utils = require('../calendar.utils.cjs');
8
+ var calendarColumnHeader = require('./calendar-column-header.cjs');
9
+ var calendarRowLabel = require('./calendar-row-label.cjs');
10
+ var calendarTimeMarker = require('./calendar-time-marker.cjs');
11
+ var calendarWeekViewDay = require('./calendar-week-view-day.cjs');
12
+
13
+ const WeekView = ({ currentMonthDate, selectedDate, zonedEvents, locale, timeZone, currentTime, setSelectedDate, shortWeekdayFormatter, timeFormatter, hourOnlyFormatter, className, view, }) => {
14
+ const currentWeekStart = date.startOfWeek(currentMonthDate, locale);
15
+ const currentWeekEnd = date.endOfWeek(currentMonthDate, locale);
16
+ const localCurrentTime = currentTime;
17
+ const scrollContainerRef = React.useRef(null);
18
+ const formatTime = (dateTime) => timeFormatter.format(dateTime.toDate());
19
+ const showTimeMarker = localCurrentTime.compare(date.toZoned(currentWeekStart, timeZone)) >= 0 &&
20
+ localCurrentTime.compare(date.toZoned(currentWeekEnd, timeZone).add({ days: 1 })) < 0;
21
+ const days = [];
22
+ let dayIterator = currentWeekStart;
23
+ while (dayIterator.compare(currentWeekEnd) <= 0) {
24
+ days.push(dayIterator);
25
+ dayIterator = dayIterator.add({ days: 1 });
26
+ }
27
+ const hours = Array.from({ length: 24 }, (_, i) => i);
28
+ let timeMarkerTop = 0;
29
+ if (showTimeMarker) {
30
+ const startOfVisibleDay = calendar_utils.getStartOfDay(localCurrentTime, timeZone);
31
+ const minutesFromTop = localCurrentTime.hour * 60 + localCurrentTime.minute - (startOfVisibleDay.hour * 60 + startOfVisibleDay.minute);
32
+ timeMarkerTop = (minutesFromTop / 30) * calendar_utils.SLOT_HEIGHT;
33
+ }
34
+ const visibleEvents = zonedEvents.filter((event) => {
35
+ const eventStartDay = date.toCalendarDate(event.start);
36
+ const eventEndDay = date.toCalendarDate(event.end);
37
+ return eventStartDay.compare(currentWeekEnd) <= 0 && eventEndDay.compare(currentWeekStart) >= 0;
38
+ });
39
+ const earliestEventTimeInWeek = React.useMemo(() => {
40
+ if (visibleEvents.length === 0) {
41
+ // No events: default the scroll target to 8 AM.
42
+ return date.toZoned(currentWeekStart, timeZone).set({ hour: 8 });
43
+ }
44
+ return visibleEvents.reduce((earliest, current) => {
45
+ return current.start.compare(earliest.start) < 0 ? current : earliest;
46
+ }).start;
47
+ }, [visibleEvents, currentWeekStart, timeZone]);
48
+ // biome-ignore lint/correctness/useExhaustiveDependencies: We need to include currentMonthDate in the dependency array to recalculate the earliest event time when the week changes
49
+ React.useLayoutEffect(() => {
50
+ if (view === 'week' && scrollContainerRef.current && earliestEventTimeInWeek) {
51
+ const startMinutes = earliestEventTimeInWeek.hour * 60 + earliestEventTimeInWeek.minute;
52
+ let targetScrollTop = Math.max(0, (startMinutes / 30) * calendar_utils.SLOT_HEIGHT);
53
+ // One slot of breathing room above the first event.
54
+ targetScrollTop = Math.max(0, targetScrollTop - calendar_utils.SLOT_HEIGHT);
55
+ if (scrollContainerRef.current) {
56
+ scrollContainerRef.current.scrollTop = targetScrollTop;
57
+ }
58
+ }
59
+ }, [view, earliestEventTimeInWeek, currentMonthDate]);
60
+ return (jsxRuntime.jsxs("div", { className: cx.cx('flex flex-1 flex-col overflow-auto', className), children: [jsxRuntime.jsx("div", { className: "sticky top-0 z-10 grid grid-cols-7 bg-primary pl-18 shadow-sm dark:border-b dark:border-secondary", children: days.map((day) => {
61
+ const isTodayFlag = date.isToday(day, timeZone);
62
+ const dayToHighlight = selectedDate && day.compare(currentWeekStart) >= 0 && day.compare(currentWeekEnd) <= 0 ? selectedDate : currentWeekStart;
63
+ const isSelectedFlag = date.isSameDay(day, dayToHighlight);
64
+ const weekDayShort = shortWeekdayFormatter.format(day.toDate(timeZone));
65
+ return (jsxRuntime.jsx(calendarColumnHeader.CalendarColumnHeader, { onClick: () => setSelectedDate(day), weekDay: weekDayShort, day: day.day, state: isSelectedFlag ? 'selected' : isTodayFlag ? 'current' : 'default', className: "cursor-pointer first:before:-left-px first:before:border-l" }, `mobile-header-${day.toString()}`));
66
+ }) }), jsxRuntime.jsxs("div", { ref: scrollContainerRef, tabIndex: 0, className: "relative flex flex-1 overflow-y-auto", children: [jsxRuntime.jsx("div", { className: "flex h-max w-18 flex-col border-r border-secondary", children: hours.map((hour) => {
67
+ const time = new date.CalendarDateTime(currentWeekStart.year, currentWeekStart.month, currentWeekStart.day, hour);
68
+ const timeString = hourOnlyFormatter.format(date.toZoned(time, timeZone).toDate());
69
+ return jsxRuntime.jsx(calendarRowLabel.CalendarRowLabel, { children: timeString }, `time-${hour}`);
70
+ }) }), jsxRuntime.jsx("div", { className: "grid flex-1 grid-cols-7", children: days.map((day, index) => {
71
+ const isLastDay = index === days.length - 1;
72
+ return (jsxRuntime.jsx(calendarWeekViewDay.WeekViewDay, { day: day, isLastDay: isLastDay, visibleEvents: visibleEvents, timeZone: timeZone, slotHeight: calendar_utils.SLOT_HEIGHT, setSelectedDate: setSelectedDate, timeFormatter: timeFormatter }, day.toString()));
73
+ }) }), showTimeMarker && jsxRuntime.jsx(calendarTimeMarker.CalendarTimeMarker, { style: { top: `${timeMarkerTop}px` }, children: formatTime(localCurrentTime) })] })] }));
74
+ };
75
+
76
+ exports.WeekView = WeekView;
77
+ //# sourceMappingURL=calendar-week-view.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-week-view.cjs","sources":["../../../../../src/components/organisms/Calendar/components/calendar-week-view.tsx"],"sourcesContent":[null],"names":["startOfWeek","endOfWeek","useRef","toZoned","getStartOfDay","SLOT_HEIGHT","toCalendarDate","useMemo","useLayoutEffect","_jsxs","cx","_jsx","isDateToday","isSameDay","CalendarColumnHeader","CalendarDateTime","CalendarRowLabel","WeekViewDay","CalendarTimeMarker"],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { type CalendarDate, type ZonedDateTime } from '@internationalized/date';
2
+ import type { DateFormatter } from '@react-aria/i18n';
3
+ import { type ZonedEvent } from '../calendar.utils';
4
+ interface WeekViewProps {
5
+ currentMonthDate: CalendarDate;
6
+ selectedDate: CalendarDate | null;
7
+ zonedEvents: ZonedEvent[];
8
+ locale: string;
9
+ timeZone: string;
10
+ currentTime: ZonedDateTime;
11
+ setSelectedDate: (date: CalendarDate | null) => void;
12
+ shortWeekdayFormatter: DateFormatter;
13
+ timeFormatter: DateFormatter;
14
+ hourOnlyFormatter: DateFormatter;
15
+ className?: string;
16
+ view?: string;
17
+ }
18
+ export declare const WeekView: ({ currentMonthDate, selectedDate, zonedEvents, locale, timeZone, currentTime, setSelectedDate, shortWeekdayFormatter, timeFormatter, hourOnlyFormatter, className, view, }: WeekViewProps) => import("react").JSX.Element;
19
+ export {};
20
+ //# sourceMappingURL=calendar-week-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-week-view.d.ts","sourceRoot":"","sources":["../../../../../src/components/organisms/Calendar/components/calendar-week-view.tsx"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,YAAY,EAQjB,KAAK,aAAa,EACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,OAAO,EAA8B,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAMhF,UAAU,aAAa;IACrB,gBAAgB,EAAE,YAAY,CAAC;IAC/B,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAClC,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,aAAa,CAAC;IAC3B,eAAe,EAAE,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,KAAK,IAAI,CAAC;IACrD,qBAAqB,EAAE,aAAa,CAAC;IACrC,aAAa,EAAE,aAAa,CAAC;IAC7B,iBAAiB,EAAE,aAAa,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,QAAQ,GAAI,4KAatB,aAAa,gCAuHf,CAAC"}