@mantine/schedule 9.5.1 → 9.6.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 (222) hide show
  1. package/cjs/_virtual/_rolldown/runtime.cjs +1 -1
  2. package/cjs/components/AgendaView/AgendaView.cjs +7 -6
  3. package/cjs/components/AgendaView/AgendaView.cjs.map +1 -1
  4. package/cjs/components/AgendaView/get-agenda-view-events.cjs.map +1 -1
  5. package/cjs/components/CurrentTimeIndicator/CurrentTimeIndicator.cjs +3 -2
  6. package/cjs/components/CurrentTimeIndicator/CurrentTimeIndicator.cjs.map +1 -1
  7. package/cjs/components/DayView/DayView.cjs +144 -78
  8. package/cjs/components/DayView/DayView.cjs.map +1 -1
  9. package/cjs/components/DayView/DayView.module.cjs +2 -1
  10. package/cjs/components/DayView/DayView.module.cjs.map +1 -1
  11. package/cjs/components/DayView/get-day-view-events/get-day-view-events.cjs.map +1 -1
  12. package/cjs/components/DragContext/DragContext.cjs.map +1 -1
  13. package/cjs/components/MobileMonthView/MobileMonthView.cjs +7 -6
  14. package/cjs/components/MobileMonthView/MobileMonthView.cjs.map +1 -1
  15. package/cjs/components/MobileMonthView/get-mobile-month-view-events.cjs.map +1 -1
  16. package/cjs/components/MonthView/MonthView.cjs +24 -34
  17. package/cjs/components/MonthView/MonthView.cjs.map +1 -1
  18. package/cjs/components/MonthView/MonthView.module.cjs.map +1 -1
  19. package/cjs/components/MonthView/get-month-view-events/find-available-row.cjs.map +1 -1
  20. package/cjs/components/MonthView/get-month-view-events/get-month-positioned-events.cjs +4 -2
  21. package/cjs/components/MonthView/get-month-view-events/get-month-positioned-events.cjs.map +1 -1
  22. package/cjs/components/MonthView/get-month-view-events/get-month-view-events.cjs.map +1 -1
  23. package/cjs/components/MonthView/get-month-view-events/get-weeks-in-range.cjs +3 -2
  24. package/cjs/components/MonthView/get-month-view-events/get-weeks-in-range.cjs.map +1 -1
  25. package/cjs/components/MonthView/get-renderable-month-event-segments.cjs +1 -1
  26. package/cjs/components/MonthView/get-renderable-month-event-segments.cjs.map +1 -1
  27. package/cjs/components/MoreEvents/MoreEvents.cjs.map +1 -1
  28. package/cjs/components/ResourcesDayView/ResourcesDayView.cjs +136 -52
  29. package/cjs/components/ResourcesDayView/ResourcesDayView.cjs.map +1 -1
  30. package/cjs/components/ResourcesDayView/ResourcesDayView.module.cjs +2 -1
  31. package/cjs/components/ResourcesDayView/ResourcesDayView.module.cjs.map +1 -1
  32. package/cjs/components/ResourcesDayView/ResourcesDayViewColumn.cjs.map +1 -1
  33. package/cjs/components/ResourcesDayView/get-resources-day-view-events/get-resources-day-view-events.cjs.map +1 -1
  34. package/cjs/components/ResourcesMonthView/ResourcesMonthView.cjs.map +1 -1
  35. package/cjs/components/ResourcesSchedule/ResourcesSchedule.cjs +3 -1
  36. package/cjs/components/ResourcesSchedule/ResourcesSchedule.cjs.map +1 -1
  37. package/cjs/components/ResourcesWeekView/ResourcesWeekView.cjs +150 -59
  38. package/cjs/components/ResourcesWeekView/ResourcesWeekView.cjs.map +1 -1
  39. package/cjs/components/ResourcesWeekView/ResourcesWeekView.module.cjs +2 -1
  40. package/cjs/components/ResourcesWeekView/ResourcesWeekView.module.cjs.map +1 -1
  41. package/cjs/components/ResourcesWeekView/ResourcesWeekViewRow.cjs.map +1 -1
  42. package/cjs/components/ResourcesWeekView/get-resources-week-view-events/get-resources-week-view-events.cjs +6 -3
  43. package/cjs/components/ResourcesWeekView/get-resources-week-view-events/get-resources-week-view-events.cjs.map +1 -1
  44. package/cjs/components/Schedule/Schedule.cjs +4 -1
  45. package/cjs/components/Schedule/Schedule.cjs.map +1 -1
  46. package/cjs/components/ScheduleBackgroundEvent/ScheduleBackgroundEvent.cjs +53 -0
  47. package/cjs/components/ScheduleBackgroundEvent/ScheduleBackgroundEvent.cjs.map +1 -0
  48. package/cjs/components/ScheduleEvent/ScheduleEvent.cjs.map +1 -1
  49. package/cjs/components/ScheduleHeader/HeaderControl/HeaderControl.cjs +15 -14
  50. package/cjs/components/ScheduleHeader/HeaderControl/HeaderControl.cjs.map +1 -1
  51. package/cjs/components/ScheduleHeader/MonthYearSelect/MonthYearSelect.cjs.map +1 -1
  52. package/cjs/components/ScheduleHeader/ScheduleHeader.cjs.map +1 -1
  53. package/cjs/components/ScheduleHeader/ScheduleHeaderBase.cjs.map +1 -1
  54. package/cjs/components/ScheduleHeader/ScheduleHeaderContext.cjs.map +1 -1
  55. package/cjs/components/ScheduleHeader/ViewSelect/ViewSelect.cjs.map +1 -1
  56. package/cjs/components/WeekView/WeekView.cjs +159 -82
  57. package/cjs/components/WeekView/WeekView.cjs.map +1 -1
  58. package/cjs/components/WeekView/WeekView.module.cjs +2 -1
  59. package/cjs/components/WeekView/WeekView.module.cjs.map +1 -1
  60. package/cjs/components/WeekView/WeekViewDay.cjs.map +1 -1
  61. package/cjs/components/WeekView/get-week-label/get-week-label.cjs.map +1 -1
  62. package/cjs/components/WeekView/get-week-view-events/calculate-all-day-event-offset.cjs.map +1 -1
  63. package/cjs/components/WeekView/get-week-view-events/calculate-all-day-event-width.cjs.map +1 -1
  64. package/cjs/components/WeekView/get-week-view-events/calculate-event-days.cjs.map +1 -1
  65. package/cjs/components/WeekView/get-week-view-events/find-available-column.cjs +5 -10
  66. package/cjs/components/WeekView/get-week-view-events/find-available-column.cjs.map +1 -1
  67. package/cjs/components/WeekView/get-week-view-events/get-event-end-date.cjs.map +1 -1
  68. package/cjs/components/WeekView/get-week-view-events/get-hanging-status.cjs.map +1 -1
  69. package/cjs/components/WeekView/get-week-view-events/get-week-positioned-events.cjs +5 -3
  70. package/cjs/components/WeekView/get-week-view-events/get-week-positioned-events.cjs.map +1 -1
  71. package/cjs/components/YearView/YearView.cjs +7 -6
  72. package/cjs/components/YearView/YearView.cjs.map +1 -1
  73. package/cjs/components/YearView/YearViewMonth.cjs.map +1 -1
  74. package/cjs/components/YearView/get-visible-week-days.cjs.map +1 -1
  75. package/cjs/components/YearView/get-year-view-events/get-year-view-events.cjs.map +1 -1
  76. package/cjs/hooks/use-auto-scroll-on-drag.cjs.map +1 -1
  77. package/cjs/hooks/use-day-grid-event-resize.cjs.map +1 -1
  78. package/cjs/hooks/use-drag-drop-handlers.cjs +13 -2
  79. package/cjs/hooks/use-drag-drop-handlers.cjs.map +1 -1
  80. package/cjs/hooks/use-drag-state.cjs.map +1 -1
  81. package/cjs/hooks/use-event-resize.cjs +30 -15
  82. package/cjs/hooks/use-event-resize.cjs.map +1 -1
  83. package/cjs/hooks/use-horizontal-event-resize.cjs +30 -15
  84. package/cjs/hooks/use-horizontal-event-resize.cjs.map +1 -1
  85. package/cjs/hooks/use-slot-drag-select.cjs.map +1 -1
  86. package/cjs/index.cjs +2 -0
  87. package/cjs/utils/calculate-drop-time/calculate-drop-time.cjs +25 -4
  88. package/cjs/utils/calculate-drop-time/calculate-drop-time.cjs.map +1 -1
  89. package/cjs/utils/calculate-month-drop-date/calculate-month-drop-date.cjs.map +1 -1
  90. package/cjs/utils/calculate-month-resize-dates/calculate-month-resize-dates.cjs.map +1 -1
  91. package/cjs/utils/expand-recurring-events/expand-recurring-events.cjs +20 -8
  92. package/cjs/utils/expand-recurring-events/expand-recurring-events.cjs.map +1 -1
  93. package/cjs/utils/format-date/format-date.cjs.map +1 -1
  94. package/cjs/utils/get-current-time-position/get-current-time-position.cjs.map +1 -1
  95. package/cjs/utils/get-day-position/get-day-position.cjs.map +1 -1
  96. package/cjs/utils/get-end-of-week/get-end-of-week.cjs.map +1 -1
  97. package/cjs/utils/get-month-days/get-month-days.cjs +4 -2
  98. package/cjs/utils/get-month-days/get-month-days.cjs.map +1 -1
  99. package/cjs/utils/get-month-range/get-month-range.cjs.map +1 -1
  100. package/cjs/utils/get-months-by-quarter/get-months-by-quarter.cjs.map +1 -1
  101. package/cjs/utils/get-months-list/get-months-list.cjs.map +1 -1
  102. package/cjs/utils/get-start-of-week/get-start-of-week.cjs.map +1 -1
  103. package/cjs/utils/get-week-days/get-week-days.cjs.map +1 -1
  104. package/cjs/utils/get-week-number/get-week-number.cjs +4 -1
  105. package/cjs/utils/get-week-number/get-week-number.cjs.map +1 -1
  106. package/cjs/utils/get-weekdays-names/get-weekdays-names.cjs.map +1 -1
  107. package/cjs/utils/is-after-min-date/is-after-min-date.cjs.map +1 -1
  108. package/cjs/utils/is-all-day-event/is-all-day-event.cjs.map +1 -1
  109. package/cjs/utils/is-before-max-date/is-before-max-date.cjs.map +1 -1
  110. package/cjs/utils/is-event-in-time-range/is-event-in-time-range.cjs.map +1 -1
  111. package/cjs/utils/is-events-overlap/is-events-overlap.cjs +16 -4
  112. package/cjs/utils/is-events-overlap/is-events-overlap.cjs.map +1 -1
  113. package/cjs/utils/is-in-time-range/is-in-time-range.cjs.map +1 -1
  114. package/cjs/utils/is-multiday-event/is-multiday-event.cjs.map +1 -1
  115. package/cjs/utils/is-same-month/is-same-month.cjs.map +1 -1
  116. package/cjs/utils/is-within-week/is-within-week.cjs.map +1 -1
  117. package/cjs/utils/next-week/next-week.cjs.map +1 -1
  118. package/cjs/utils/previous-week/previous-week.cjs.map +1 -1
  119. package/cjs/utils/sort-events/sort-events.cjs.map +1 -1
  120. package/cjs/utils/to-date-string/to-date-string.cjs.map +1 -1
  121. package/cjs/utils/validate-event/validate-event.cjs.map +1 -1
  122. package/esm/components/AgendaView/AgendaView.mjs +7 -6
  123. package/esm/components/AgendaView/AgendaView.mjs.map +1 -1
  124. package/esm/components/CurrentTimeIndicator/CurrentTimeIndicator.mjs +4 -3
  125. package/esm/components/CurrentTimeIndicator/CurrentTimeIndicator.mjs.map +1 -1
  126. package/esm/components/DayView/DayView.mjs +145 -79
  127. package/esm/components/DayView/DayView.mjs.map +1 -1
  128. package/esm/components/DayView/DayView.module.mjs +2 -1
  129. package/esm/components/DayView/DayView.module.mjs.map +1 -1
  130. package/esm/components/MobileMonthView/MobileMonthView.mjs +7 -6
  131. package/esm/components/MobileMonthView/MobileMonthView.mjs.map +1 -1
  132. package/esm/components/MonthView/MonthView.mjs +25 -35
  133. package/esm/components/MonthView/MonthView.mjs.map +1 -1
  134. package/esm/components/MonthView/MonthView.module.mjs.map +1 -1
  135. package/esm/components/MonthView/get-month-view-events/get-month-positioned-events.mjs +4 -2
  136. package/esm/components/MonthView/get-month-view-events/get-month-positioned-events.mjs.map +1 -1
  137. package/esm/components/MonthView/get-month-view-events/get-weeks-in-range.mjs +3 -2
  138. package/esm/components/MonthView/get-month-view-events/get-weeks-in-range.mjs.map +1 -1
  139. package/esm/components/MonthView/get-renderable-month-event-segments.mjs +1 -1
  140. package/esm/components/MonthView/get-renderable-month-event-segments.mjs.map +1 -1
  141. package/esm/components/MoreEvents/MoreEvents.mjs.map +1 -1
  142. package/esm/components/ResourcesDayView/ResourcesDayView.mjs +138 -54
  143. package/esm/components/ResourcesDayView/ResourcesDayView.mjs.map +1 -1
  144. package/esm/components/ResourcesDayView/ResourcesDayView.module.mjs +2 -1
  145. package/esm/components/ResourcesDayView/ResourcesDayView.module.mjs.map +1 -1
  146. package/esm/components/ResourcesDayView/ResourcesDayViewColumn.mjs.map +1 -1
  147. package/esm/components/ResourcesMonthView/ResourcesMonthView.mjs.map +1 -1
  148. package/esm/components/ResourcesSchedule/ResourcesSchedule.mjs +3 -1
  149. package/esm/components/ResourcesSchedule/ResourcesSchedule.mjs.map +1 -1
  150. package/esm/components/ResourcesWeekView/ResourcesWeekView.mjs +152 -61
  151. package/esm/components/ResourcesWeekView/ResourcesWeekView.mjs.map +1 -1
  152. package/esm/components/ResourcesWeekView/ResourcesWeekView.module.mjs +2 -1
  153. package/esm/components/ResourcesWeekView/ResourcesWeekView.module.mjs.map +1 -1
  154. package/esm/components/ResourcesWeekView/ResourcesWeekViewRow.mjs.map +1 -1
  155. package/esm/components/ResourcesWeekView/get-resources-week-view-events/get-resources-week-view-events.mjs +6 -3
  156. package/esm/components/ResourcesWeekView/get-resources-week-view-events/get-resources-week-view-events.mjs.map +1 -1
  157. package/esm/components/Schedule/Schedule.mjs +4 -1
  158. package/esm/components/Schedule/Schedule.mjs.map +1 -1
  159. package/esm/components/ScheduleBackgroundEvent/ScheduleBackgroundEvent.mjs +53 -0
  160. package/esm/components/ScheduleBackgroundEvent/ScheduleBackgroundEvent.mjs.map +1 -0
  161. package/esm/components/ScheduleEvent/ScheduleEvent.mjs.map +1 -1
  162. package/esm/components/ScheduleHeader/HeaderControl/HeaderControl.mjs +15 -14
  163. package/esm/components/ScheduleHeader/HeaderControl/HeaderControl.mjs.map +1 -1
  164. package/esm/components/ScheduleHeader/MonthYearSelect/MonthYearSelect.mjs.map +1 -1
  165. package/esm/components/ScheduleHeader/ScheduleHeader.mjs.map +1 -1
  166. package/esm/components/ScheduleHeader/ScheduleHeaderBase.mjs.map +1 -1
  167. package/esm/components/ScheduleHeader/ViewSelect/ViewSelect.mjs.map +1 -1
  168. package/esm/components/WeekView/WeekView.mjs +160 -83
  169. package/esm/components/WeekView/WeekView.mjs.map +1 -1
  170. package/esm/components/WeekView/WeekView.module.mjs +2 -1
  171. package/esm/components/WeekView/WeekView.module.mjs.map +1 -1
  172. package/esm/components/WeekView/WeekViewDay.mjs.map +1 -1
  173. package/esm/components/WeekView/get-week-view-events/find-available-column.mjs +5 -10
  174. package/esm/components/WeekView/get-week-view-events/find-available-column.mjs.map +1 -1
  175. package/esm/components/WeekView/get-week-view-events/get-week-positioned-events.mjs +5 -3
  176. package/esm/components/WeekView/get-week-view-events/get-week-positioned-events.mjs.map +1 -1
  177. package/esm/components/YearView/YearView.mjs +7 -6
  178. package/esm/components/YearView/YearView.mjs.map +1 -1
  179. package/esm/components/YearView/YearViewMonth.mjs.map +1 -1
  180. package/esm/hooks/use-drag-drop-handlers.mjs +13 -2
  181. package/esm/hooks/use-drag-drop-handlers.mjs.map +1 -1
  182. package/esm/hooks/use-event-resize.mjs +30 -15
  183. package/esm/hooks/use-event-resize.mjs.map +1 -1
  184. package/esm/hooks/use-horizontal-event-resize.mjs +30 -15
  185. package/esm/hooks/use-horizontal-event-resize.mjs.map +1 -1
  186. package/esm/index.mjs +2 -1
  187. package/esm/utils/calculate-drop-time/calculate-drop-time.mjs +25 -4
  188. package/esm/utils/calculate-drop-time/calculate-drop-time.mjs.map +1 -1
  189. package/esm/utils/expand-recurring-events/expand-recurring-events.mjs +20 -8
  190. package/esm/utils/expand-recurring-events/expand-recurring-events.mjs.map +1 -1
  191. package/esm/utils/get-month-days/get-month-days.mjs +4 -2
  192. package/esm/utils/get-month-days/get-month-days.mjs.map +1 -1
  193. package/esm/utils/get-week-number/get-week-number.mjs +4 -1
  194. package/esm/utils/get-week-number/get-week-number.mjs.map +1 -1
  195. package/esm/utils/is-events-overlap/is-events-overlap.mjs +16 -4
  196. package/esm/utils/is-events-overlap/is-events-overlap.mjs.map +1 -1
  197. package/lib/components/DayView/DayView.d.ts +7 -1
  198. package/lib/components/MonthView/MonthView.d.ts +2 -0
  199. package/lib/components/ResourcesDayView/ResourcesDayView.d.ts +7 -1
  200. package/lib/components/ResourcesDayView/ResourcesDayViewColumn.d.ts +1 -1
  201. package/lib/components/ResourcesSchedule/ResourcesSchedule.d.ts +3 -1
  202. package/lib/components/ResourcesWeekView/ResourcesWeekView.d.ts +7 -1
  203. package/lib/components/ResourcesWeekView/ResourcesWeekViewRow.d.ts +1 -1
  204. package/lib/components/Schedule/Schedule.d.ts +3 -1
  205. package/lib/components/ScheduleBackgroundEvent/ScheduleBackgroundEvent.d.ts +19 -0
  206. package/lib/components/ScheduleBackgroundEvent/index.d.ts +2 -0
  207. package/lib/components/ScheduleHeader/HeaderControl/HeaderControl.d.ts +3 -3
  208. package/lib/components/ScheduleHeader/ScheduleHeaderBase.d.ts +1 -1
  209. package/lib/components/WeekView/WeekView.d.ts +7 -1
  210. package/lib/components/WeekView/WeekViewDay.d.ts +1 -1
  211. package/lib/components/WeekView/get-week-view-events/find-available-column.d.ts +7 -3
  212. package/lib/components/YearView/YearViewMonth.d.ts +1 -1
  213. package/lib/hooks/use-drag-drop-handlers.d.ts +10 -1
  214. package/lib/hooks/use-event-resize.d.ts +2 -1
  215. package/lib/hooks/use-horizontal-event-resize.d.ts +2 -1
  216. package/lib/index.d.mts +1 -0
  217. package/lib/index.d.ts +1 -0
  218. package/lib/types.d.ts +1 -1
  219. package/lib/utils/calculate-drop-time/calculate-drop-time.d.ts +11 -1
  220. package/package.json +8 -5
  221. package/styles.css +160 -0
  222. package/styles.layer.css +160 -0
@@ -7,7 +7,7 @@ let dayjs = require("dayjs");
7
7
  dayjs = require_runtime.__toESM(dayjs);
8
8
  let react = require("react");
9
9
  //#region packages/@mantine/schedule/src/hooks/use-horizontal-event-resize.ts
10
- function useHorizontalEventResize({ enabled = false, mode = "default", startTime, endTime, intervalMinutes, onEventResize, canResizeEvent }) {
10
+ function useHorizontalEventResize({ enabled = false, mode = "default", startTime, endTime, intervalMinutes, resizeIntervalMinutes, onEventResize, canResizeEvent }) {
11
11
  const [resizeState, setResizeState] = (0, react.useState)(null);
12
12
  const resizeRef = (0, react.useRef)(null);
13
13
  const justResizedRef = (0, react.useRef)(false);
@@ -17,13 +17,17 @@ function useHorizontalEventResize({ enabled = false, mode = "default", startTime
17
17
  const startMinutes = parsedStartTime.hours * 60 + parsedStartTime.minutes;
18
18
  const endMinutes = parsedEndTime.hours * 60 + parsedEndTime.minutes;
19
19
  const clampedInterval = require_clamp_interval_minutes.clampIntervalMinutes(intervalMinutes);
20
+ const clampedResizeInterval = require_clamp_interval_minutes.clampIntervalMinutes(resizeIntervalMinutes ?? intervalMinutes);
20
21
  const literalRange = endMinutes - startMinutes;
21
22
  const totalMinutes = Math.ceil(literalRange / clampedInterval) * clampedInterval;
22
- const minWidthPercent = clampedInterval / totalMinutes * 100;
23
23
  const clampAndSnap = (0, react.useCallback)((minutes) => {
24
- const snapped = Math.round(minutes / clampedInterval) * clampedInterval;
25
- return Math.max(0, Math.min(literalRange, snapped));
26
- }, [literalRange, clampedInterval]);
24
+ const snapped = Math.round((startMinutes + minutes) / clampedResizeInterval) * clampedResizeInterval;
25
+ return Math.max(0, Math.min(literalRange, snapped - startMinutes));
26
+ }, [
27
+ literalRange,
28
+ clampedResizeInterval,
29
+ startMinutes
30
+ ]);
27
31
  const percentToDateTime = (0, react.useCallback)((percent, eventDate) => {
28
32
  const minutes = percent / 100 * totalMinutes;
29
33
  const snappedMinutes = clampAndSnap(minutes);
@@ -36,10 +40,17 @@ function useHorizontalEventResize({ enabled = false, mode = "default", startTime
36
40
  startMinutes,
37
41
  clampAndSnap
38
42
  ]);
39
- const snapPercent = (0, react.useCallback)((percent) => {
40
- const minutes = percent / 100 * totalMinutes;
41
- return clampAndSnap(minutes) / totalMinutes * 100;
42
- }, [totalMinutes, clampAndSnap]);
43
+ const snapEdgeMinutes = (0, react.useCallback)((minutes, direction) => {
44
+ const absolute = startMinutes + minutes;
45
+ const snapped = direction === "up" ? Math.ceil(absolute / clampedResizeInterval) * clampedResizeInterval : Math.floor(absolute / clampedResizeInterval) * clampedResizeInterval;
46
+ return Math.max(0, Math.min(literalRange, snapped - startMinutes));
47
+ }, [
48
+ literalRange,
49
+ clampedResizeInterval,
50
+ startMinutes
51
+ ]);
52
+ const percentToMinutes = (0, react.useCallback)((percent) => percent / 100 * totalMinutes, [totalMinutes]);
53
+ const minutesToPercent = (0, react.useCallback)((minutes) => minutes / totalMinutes * 100, [totalMinutes]);
43
54
  const handleResizeStart = (0, react.useCallback)(({ event, edge, container, originalLeft, originalWidth, eventDate, dayIndex = 0, dayCount = 1, pointerEvent }) => {
44
55
  if (!enabled || mode === "static") return;
45
56
  pointerEvent.preventDefault();
@@ -80,14 +91,18 @@ function useHorizontalEventResize({ enabled = false, mode = "default", startTime
80
91
  dayIndex: state.dayIndex,
81
92
  dayCount: state.dayCount
82
93
  });
83
- const snappedPercent = snapPercent(rawPercent);
94
+ const draggedMinutes = clampAndSnap(percentToMinutes(rawPercent));
84
95
  let newLeft = state.originalLeft;
85
96
  let newWidth = state.originalWidth;
86
- if (state.edge === "end") newWidth = Math.max(minWidthPercent, snappedPercent - state.originalLeft);
87
- else {
88
- const originalRight = state.originalLeft + state.originalWidth;
89
- newLeft = Math.min(snappedPercent, originalRight - minWidthPercent);
90
- newWidth = originalRight - newLeft;
97
+ if (state.edge === "end") {
98
+ const leftMinutes = percentToMinutes(state.originalLeft);
99
+ const minEndMinutes = snapEdgeMinutes(leftMinutes + clampedResizeInterval, "up");
100
+ newWidth = Math.max(0, minutesToPercent(Math.max(draggedMinutes, minEndMinutes)) - state.originalLeft);
101
+ } else {
102
+ const rightMinutes = percentToMinutes(state.originalLeft + state.originalWidth);
103
+ const maxStartMinutes = snapEdgeMinutes(rightMinutes - clampedResizeInterval, "down");
104
+ newLeft = minutesToPercent(Math.min(draggedMinutes, maxStartMinutes));
105
+ newWidth = Math.max(0, state.originalLeft + state.originalWidth - newLeft);
91
106
  }
92
107
  resizeRef.current = {
93
108
  ...state,
@@ -1 +1 @@
1
- {"version":3,"file":"use-horizontal-event-resize.cjs","names":["parseTimeString","clampIntervalMinutes","getDayRelativePercent"],"sources":["../../src/hooks/use-horizontal-event-resize.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { useCallback, useEffect, useEffectEvent, useRef, useState } from 'react';\nimport { DateTimeStringValue, ScheduleEventData, ScheduleMode } from '../types';\nimport { clampIntervalMinutes } from '../utils/clamp-interval-minutes/clamp-interval-minutes';\nimport { getDayRelativePercent } from '../utils/get-day-relative-percent/get-day-relative-percent';\nimport { parseTimeString } from '../utils/parse-time-string/parse-time-string';\n\ntype ResizeEdge = 'start' | 'end';\n\ninterface ResizeState {\n eventId: string | number;\n event: ScheduleEventData;\n edge: ResizeEdge;\n container: HTMLElement;\n originalLeft: number;\n originalWidth: number;\n currentLeft: number;\n currentWidth: number;\n eventDate: string;\n originalStart: DateTimeStringValue;\n originalEnd: DateTimeStringValue;\n dayIndex: number;\n dayCount: number;\n}\n\nexport interface UseHorizontalEventResizeInput {\n enabled?: boolean;\n mode?: ScheduleMode;\n startTime: string;\n endTime: string;\n intervalMinutes: number;\n onEventResize?: (data: {\n eventId: string | number;\n newStart: DateTimeStringValue;\n newEnd: DateTimeStringValue;\n event: ScheduleEventData;\n }) => void;\n canResizeEvent?: (event: ScheduleEventData) => boolean;\n}\n\nexport function useHorizontalEventResize({\n enabled = false,\n mode = 'default',\n startTime,\n endTime,\n intervalMinutes,\n onEventResize,\n canResizeEvent,\n}: UseHorizontalEventResizeInput) {\n const [resizeState, setResizeState] = useState<ResizeState | null>(null);\n const resizeRef = useRef<ResizeState | null>(null);\n const justResizedRef = useRef(false);\n const stableOnEventResize = useEffectEvent(onEventResize || (() => {}));\n\n const parsedStartTime = parseTimeString(startTime);\n const parsedEndTime = parseTimeString(endTime);\n const startMinutes = parsedStartTime.hours * 60 + parsedStartTime.minutes;\n const endMinutes = parsedEndTime.hours * 60 + parsedEndTime.minutes;\n const clampedInterval = clampIntervalMinutes(intervalMinutes);\n const literalRange = endMinutes - startMinutes;\n const totalMinutes = Math.ceil(literalRange / clampedInterval) * clampedInterval;\n const minWidthPercent = (clampedInterval / totalMinutes) * 100;\n\n const clampAndSnap = useCallback(\n (minutes: number): number => {\n const snapped = Math.round(minutes / clampedInterval) * clampedInterval;\n return Math.max(0, Math.min(literalRange, snapped));\n },\n [literalRange, clampedInterval]\n );\n\n const percentToDateTime = useCallback(\n (percent: number, eventDate: string): DateTimeStringValue => {\n const minutes = (percent / 100) * totalMinutes;\n const snappedMinutes = clampAndSnap(minutes);\n const totalMins = startMinutes + snappedMinutes;\n const hours = Math.floor(totalMins / 60);\n const mins = totalMins % 60;\n return `${eventDate} ${String(hours).padStart(2, '0')}:${String(mins).padStart(2, '0')}:00`;\n },\n [totalMinutes, startMinutes, clampAndSnap]\n );\n\n const snapPercent = useCallback(\n (percent: number): number => {\n const minutes = (percent / 100) * totalMinutes;\n const snappedMinutes = clampAndSnap(minutes);\n return (snappedMinutes / totalMinutes) * 100;\n },\n [totalMinutes, clampAndSnap]\n );\n\n const handleResizeStart = useCallback(\n ({\n event,\n edge,\n container,\n originalLeft,\n originalWidth,\n eventDate,\n dayIndex = 0,\n dayCount = 1,\n pointerEvent,\n }: {\n event: ScheduleEventData;\n edge: ResizeEdge;\n container: HTMLElement;\n originalLeft: number;\n originalWidth: number;\n eventDate: string;\n dayIndex?: number;\n dayCount?: number;\n pointerEvent: React.PointerEvent;\n }) => {\n if (!enabled || mode === 'static') {\n return;\n }\n\n pointerEvent.preventDefault();\n pointerEvent.stopPropagation();\n\n const state: ResizeState = {\n eventId: event.id,\n event,\n edge,\n container,\n originalLeft,\n originalWidth,\n currentLeft: originalLeft,\n currentWidth: originalWidth,\n eventDate,\n originalStart: dayjs(event.start).format('YYYY-MM-DD HH:mm:ss'),\n originalEnd: dayjs(event.end).format('YYYY-MM-DD HH:mm:ss'),\n dayIndex,\n dayCount,\n };\n\n resizeRef.current = state;\n setResizeState(state);\n },\n [enabled, mode]\n );\n\n const isResizing = resizeState !== null;\n\n useEffect(() => {\n if (!isResizing) {\n return undefined;\n }\n\n const savedUserSelect = document.body.style.userSelect;\n const savedCursor = document.body.style.cursor;\n document.body.style.userSelect = 'none';\n document.body.style.cursor = 'ew-resize';\n\n const handlePointerMove = (e: PointerEvent) => {\n const state = resizeRef.current;\n if (!state) {\n return;\n }\n\n const containerRect = state.container.getBoundingClientRect();\n const rawPercent = getDayRelativePercent({\n clientX: e.clientX,\n containerLeft: containerRect.left,\n containerWidth: containerRect.width,\n dayIndex: state.dayIndex,\n dayCount: state.dayCount,\n });\n const snappedPercent = snapPercent(rawPercent);\n\n let newLeft = state.originalLeft;\n let newWidth = state.originalWidth;\n\n if (state.edge === 'end') {\n newWidth = Math.max(minWidthPercent, snappedPercent - state.originalLeft);\n } else {\n const originalRight = state.originalLeft + state.originalWidth;\n newLeft = Math.min(snappedPercent, originalRight - minWidthPercent);\n newWidth = originalRight - newLeft;\n }\n\n resizeRef.current = { ...state, currentLeft: newLeft, currentWidth: newWidth };\n setResizeState(resizeRef.current);\n };\n\n const handlePointerUp = () => {\n const state = resizeRef.current;\n if (state) {\n if (\n state.currentLeft !== state.originalLeft ||\n state.currentWidth !== state.originalWidth\n ) {\n let newStart: DateTimeStringValue;\n let newEnd: DateTimeStringValue;\n\n if (state.edge === 'start') {\n newStart = percentToDateTime(state.currentLeft, state.eventDate);\n newEnd = state.originalEnd;\n } else {\n newStart = state.originalStart;\n newEnd = percentToDateTime(state.currentLeft + state.currentWidth, state.eventDate);\n }\n\n stableOnEventResize({\n eventId: state.eventId,\n newStart,\n newEnd,\n event: state.event,\n });\n }\n }\n resizeRef.current = null;\n setResizeState(null);\n justResizedRef.current = true;\n requestAnimationFrame(() => {\n justResizedRef.current = false;\n });\n };\n\n document.addEventListener('pointermove', handlePointerMove);\n document.addEventListener('pointerup', handlePointerUp);\n\n return () => {\n document.body.style.userSelect = savedUserSelect;\n document.body.style.cursor = savedCursor;\n document.removeEventListener('pointermove', handlePointerMove);\n document.removeEventListener('pointerup', handlePointerUp);\n };\n }, [isResizing]);\n\n const getResizePosition = useCallback(\n (eventId: string | number) => {\n if (!resizeState || resizeState.eventId !== eventId) {\n return null;\n }\n return { left: resizeState.currentLeft, width: resizeState.currentWidth };\n },\n [resizeState]\n );\n\n const isResizableEvent = useCallback(\n (event: ScheduleEventData) => {\n if (!enabled || mode === 'static' || event.display === 'background') {\n return false;\n }\n return canResizeEvent ? canResizeEvent(event) : true;\n },\n [enabled, mode, canResizeEvent]\n );\n\n const wasResizing = useCallback(() => justResizedRef.current, []);\n\n return {\n handleResizeStart,\n isResizing,\n resizingEventId: resizeState?.eventId ?? null,\n resizingEdge: resizeState?.edge ?? null,\n getResizePosition,\n isResizableEvent,\n wasResizing,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"use-horizontal-event-resize.cjs","names":["useState","useRef","useEffectEvent","parseTimeString","clampIntervalMinutes","useCallback","getDayRelativePercent"],"sources":["../../src/hooks/use-horizontal-event-resize.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { useCallback, useEffect, useEffectEvent, useRef, useState } from 'react';\nimport { DateTimeStringValue, ScheduleEventData, ScheduleMode } from '../types';\nimport { clampIntervalMinutes } from '../utils/clamp-interval-minutes/clamp-interval-minutes';\nimport { getDayRelativePercent } from '../utils/get-day-relative-percent/get-day-relative-percent';\nimport { parseTimeString } from '../utils/parse-time-string/parse-time-string';\n\ntype ResizeEdge = 'start' | 'end';\n\ninterface ResizeState {\n eventId: string | number;\n event: ScheduleEventData;\n edge: ResizeEdge;\n container: HTMLElement;\n originalLeft: number;\n originalWidth: number;\n currentLeft: number;\n currentWidth: number;\n eventDate: string;\n originalStart: DateTimeStringValue;\n originalEnd: DateTimeStringValue;\n dayIndex: number;\n dayCount: number;\n}\n\nexport interface UseHorizontalEventResizeInput {\n enabled?: boolean;\n mode?: ScheduleMode;\n startTime: string;\n endTime: string;\n intervalMinutes: number;\n resizeIntervalMinutes?: number;\n onEventResize?: (data: {\n eventId: string | number;\n newStart: DateTimeStringValue;\n newEnd: DateTimeStringValue;\n event: ScheduleEventData;\n }) => void;\n canResizeEvent?: (event: ScheduleEventData) => boolean;\n}\n\nexport function useHorizontalEventResize({\n enabled = false,\n mode = 'default',\n startTime,\n endTime,\n intervalMinutes,\n resizeIntervalMinutes,\n onEventResize,\n canResizeEvent,\n}: UseHorizontalEventResizeInput) {\n const [resizeState, setResizeState] = useState<ResizeState | null>(null);\n const resizeRef = useRef<ResizeState | null>(null);\n const justResizedRef = useRef(false);\n const stableOnEventResize = useEffectEvent(onEventResize || (() => {}));\n\n const parsedStartTime = parseTimeString(startTime);\n const parsedEndTime = parseTimeString(endTime);\n const startMinutes = parsedStartTime.hours * 60 + parsedStartTime.minutes;\n const endMinutes = parsedEndTime.hours * 60 + parsedEndTime.minutes;\n const clampedInterval = clampIntervalMinutes(intervalMinutes);\n const clampedResizeInterval = clampIntervalMinutes(resizeIntervalMinutes ?? intervalMinutes);\n const literalRange = endMinutes - startMinutes;\n const totalMinutes = Math.ceil(literalRange / clampedInterval) * clampedInterval;\n\n // Snapped in absolute minutes from midnight so resized edges land on the same grid as\n // dragged events – see the matching comment in `use-event-resize`.\n const clampAndSnap = useCallback(\n (minutes: number): number => {\n const snapped =\n Math.round((startMinutes + minutes) / clampedResizeInterval) * clampedResizeInterval;\n return Math.max(0, Math.min(literalRange, snapped - startMinutes));\n },\n [literalRange, clampedResizeInterval, startMinutes]\n );\n\n const percentToDateTime = useCallback(\n (percent: number, eventDate: string): DateTimeStringValue => {\n const minutes = (percent / 100) * totalMinutes;\n const snappedMinutes = clampAndSnap(minutes);\n const totalMins = startMinutes + snappedMinutes;\n const hours = Math.floor(totalMins / 60);\n const mins = totalMins % 60;\n return `${eventDate} ${String(hours).padStart(2, '0')}:${String(mins).padStart(2, '0')}:00`;\n },\n [totalMinutes, startMinutes, clampAndSnap]\n );\n\n const snapEdgeMinutes = useCallback(\n (minutes: number, direction: 'up' | 'down'): number => {\n const absolute = startMinutes + minutes;\n const snapped =\n direction === 'up'\n ? Math.ceil(absolute / clampedResizeInterval) * clampedResizeInterval\n : Math.floor(absolute / clampedResizeInterval) * clampedResizeInterval;\n return Math.max(0, Math.min(literalRange, snapped - startMinutes));\n },\n [literalRange, clampedResizeInterval, startMinutes]\n );\n\n const percentToMinutes = useCallback(\n (percent: number): number => (percent / 100) * totalMinutes,\n [totalMinutes]\n );\n\n const minutesToPercent = useCallback(\n (minutes: number): number => (minutes / totalMinutes) * 100,\n [totalMinutes]\n );\n\n const handleResizeStart = useCallback(\n ({\n event,\n edge,\n container,\n originalLeft,\n originalWidth,\n eventDate,\n dayIndex = 0,\n dayCount = 1,\n pointerEvent,\n }: {\n event: ScheduleEventData;\n edge: ResizeEdge;\n container: HTMLElement;\n originalLeft: number;\n originalWidth: number;\n eventDate: string;\n dayIndex?: number;\n dayCount?: number;\n pointerEvent: React.PointerEvent;\n }) => {\n if (!enabled || mode === 'static') {\n return;\n }\n\n pointerEvent.preventDefault();\n pointerEvent.stopPropagation();\n\n const state: ResizeState = {\n eventId: event.id,\n event,\n edge,\n container,\n originalLeft,\n originalWidth,\n currentLeft: originalLeft,\n currentWidth: originalWidth,\n eventDate,\n originalStart: dayjs(event.start).format('YYYY-MM-DD HH:mm:ss'),\n originalEnd: dayjs(event.end).format('YYYY-MM-DD HH:mm:ss'),\n dayIndex,\n dayCount,\n };\n\n resizeRef.current = state;\n setResizeState(state);\n },\n [enabled, mode]\n );\n\n const isResizing = resizeState !== null;\n\n useEffect(() => {\n if (!isResizing) {\n return undefined;\n }\n\n const savedUserSelect = document.body.style.userSelect;\n const savedCursor = document.body.style.cursor;\n document.body.style.userSelect = 'none';\n document.body.style.cursor = 'ew-resize';\n\n const handlePointerMove = (e: PointerEvent) => {\n const state = resizeRef.current;\n if (!state) {\n return;\n }\n\n const containerRect = state.container.getBoundingClientRect();\n const rawPercent = getDayRelativePercent({\n clientX: e.clientX,\n containerLeft: containerRect.left,\n containerWidth: containerRect.width,\n dayIndex: state.dayIndex,\n dayCount: state.dayCount,\n });\n const draggedMinutes = clampAndSnap(percentToMinutes(rawPercent));\n\n let newLeft = state.originalLeft;\n let newWidth = state.originalWidth;\n\n if (state.edge === 'end') {\n const leftMinutes = percentToMinutes(state.originalLeft);\n const minEndMinutes = snapEdgeMinutes(leftMinutes + clampedResizeInterval, 'up');\n const endMinutes = Math.max(draggedMinutes, minEndMinutes);\n newWidth = Math.max(0, minutesToPercent(endMinutes) - state.originalLeft);\n } else {\n const rightMinutes = percentToMinutes(state.originalLeft + state.originalWidth);\n const maxStartMinutes = snapEdgeMinutes(rightMinutes - clampedResizeInterval, 'down');\n const startMinutesValue = Math.min(draggedMinutes, maxStartMinutes);\n newLeft = minutesToPercent(startMinutesValue);\n newWidth = Math.max(0, state.originalLeft + state.originalWidth - newLeft);\n }\n\n resizeRef.current = { ...state, currentLeft: newLeft, currentWidth: newWidth };\n setResizeState(resizeRef.current);\n };\n\n const handlePointerUp = () => {\n const state = resizeRef.current;\n if (state) {\n if (\n state.currentLeft !== state.originalLeft ||\n state.currentWidth !== state.originalWidth\n ) {\n let newStart: DateTimeStringValue;\n let newEnd: DateTimeStringValue;\n\n if (state.edge === 'start') {\n newStart = percentToDateTime(state.currentLeft, state.eventDate);\n newEnd = state.originalEnd;\n } else {\n newStart = state.originalStart;\n newEnd = percentToDateTime(state.currentLeft + state.currentWidth, state.eventDate);\n }\n\n stableOnEventResize({\n eventId: state.eventId,\n newStart,\n newEnd,\n event: state.event,\n });\n }\n }\n resizeRef.current = null;\n setResizeState(null);\n justResizedRef.current = true;\n requestAnimationFrame(() => {\n justResizedRef.current = false;\n });\n };\n\n document.addEventListener('pointermove', handlePointerMove);\n document.addEventListener('pointerup', handlePointerUp);\n\n return () => {\n document.body.style.userSelect = savedUserSelect;\n document.body.style.cursor = savedCursor;\n document.removeEventListener('pointermove', handlePointerMove);\n document.removeEventListener('pointerup', handlePointerUp);\n };\n }, [isResizing]);\n\n const getResizePosition = useCallback(\n (eventId: string | number) => {\n if (!resizeState || resizeState.eventId !== eventId) {\n return null;\n }\n return { left: resizeState.currentLeft, width: resizeState.currentWidth };\n },\n [resizeState]\n );\n\n const isResizableEvent = useCallback(\n (event: ScheduleEventData) => {\n if (!enabled || mode === 'static' || event.display === 'background') {\n return false;\n }\n return canResizeEvent ? canResizeEvent(event) : true;\n },\n [enabled, mode, canResizeEvent]\n );\n\n const wasResizing = useCallback(() => justResizedRef.current, []);\n\n return {\n handleResizeStart,\n isResizing,\n resizingEventId: resizeState?.eventId ?? null,\n resizingEdge: resizeState?.edge ?? null,\n getResizePosition,\n isResizableEvent,\n wasResizing,\n };\n}\n"],"mappings":";;;;;;;;;AAyCA,SAAgB,yBAAyB,EACvC,UAAU,OACV,OAAO,WACP,WACA,SACA,iBACA,uBACA,eACA,kBACgC;CAChC,MAAM,CAAC,aAAa,mBAAA,GAAkBA,MAAAA,SAAAA,CAA6B,IAAI;CACvE,MAAM,aAAA,GAAYC,MAAAA,OAAAA,CAA2B,IAAI;CACjD,MAAM,kBAAA,GAAiBA,MAAAA,OAAAA,CAAO,KAAK;CACnC,MAAM,uBAAA,GAAsBC,MAAAA,eAAAA,CAAe,wBAAwB,CAAC,EAAE;CAEtE,MAAM,kBAAkBC,0BAAAA,gBAAgB,SAAS;CACjD,MAAM,gBAAgBA,0BAAAA,gBAAgB,OAAO;CAC7C,MAAM,eAAe,gBAAgB,QAAQ,KAAK,gBAAgB;CAClE,MAAM,aAAa,cAAc,QAAQ,KAAK,cAAc;CAC5D,MAAM,kBAAkBC,+BAAAA,qBAAqB,eAAe;CAC5D,MAAM,wBAAwBA,+BAAAA,qBAAqB,yBAAyB,eAAe;CAC3F,MAAM,eAAe,aAAa;CAClC,MAAM,eAAe,KAAK,KAAK,eAAe,eAAe,IAAI;CAIjE,MAAM,gBAAA,GAAeC,MAAAA,YAAAA,EAClB,YAA4B;EAC3B,MAAM,UACJ,KAAK,OAAO,eAAe,WAAW,qBAAqB,IAAI;EACjE,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,cAAc,UAAU,YAAY,CAAC;CACnE,GACA;EAAC;EAAc;EAAuB;CAAY,CACpD;CAEA,MAAM,qBAAA,GAAoBA,MAAAA,YAAAA,EACvB,SAAiB,cAA2C;EAC3D,MAAM,UAAW,UAAU,MAAO;EAClC,MAAM,iBAAiB,aAAa,OAAO;EAC3C,MAAM,YAAY,eAAe;EACjC,MAAM,QAAQ,KAAK,MAAM,YAAY,EAAE;EACvC,MAAM,OAAO,YAAY;EACzB,OAAO,GAAG,UAAU,GAAG,OAAO,KAAK,CAAC,CAAC,SAAS,GAAG,GAAG,EAAE,GAAG,OAAO,IAAI,CAAC,CAAC,SAAS,GAAG,GAAG,EAAE;CACzF,GACA;EAAC;EAAc;EAAc;CAAY,CAC3C;CAEA,MAAM,mBAAA,GAAkBA,MAAAA,YAAAA,EACrB,SAAiB,cAAqC;EACrD,MAAM,WAAW,eAAe;EAChC,MAAM,UACJ,cAAc,OACV,KAAK,KAAK,WAAW,qBAAqB,IAAI,wBAC9C,KAAK,MAAM,WAAW,qBAAqB,IAAI;EACrD,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,cAAc,UAAU,YAAY,CAAC;CACnE,GACA;EAAC;EAAc;EAAuB;CAAY,CACpD;CAEA,MAAM,oBAAA,GAAmBA,MAAAA,YAAAA,EACtB,YAA6B,UAAU,MAAO,cAC/C,CAAC,YAAY,CACf;CAEA,MAAM,oBAAA,GAAmBA,MAAAA,YAAAA,EACtB,YAA6B,UAAU,eAAgB,KACxD,CAAC,YAAY,CACf;CAEA,MAAM,qBAAA,GAAoBA,MAAAA,YAAAA,EACvB,EACC,OACA,MACA,WACA,cACA,eACA,WACA,WAAW,GACX,WAAW,GACX,mBAWI;EACJ,IAAI,CAAC,WAAW,SAAS,UACvB;EAGF,aAAa,eAAe;EAC5B,aAAa,gBAAgB;EAE7B,MAAM,QAAqB;GACzB,SAAS,MAAM;GACf;GACA;GACA;GACA;GACA;GACA,aAAa;GACb,cAAc;GACd;GACA,gBAAA,GAAe,MAAA,QAAA,CAAM,MAAM,KAAK,CAAC,CAAC,OAAO,qBAAqB;GAC9D,cAAA,GAAa,MAAA,QAAA,CAAM,MAAM,GAAG,CAAC,CAAC,OAAO,qBAAqB;GAC1D;GACA;EACF;EAEA,UAAU,UAAU;EACpB,eAAe,KAAK;CACtB,GACA,CAAC,SAAS,IAAI,CAChB;CAEA,MAAM,aAAa,gBAAgB;CAEnC,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,IAAI,CAAC,YACH;EAGF,MAAM,kBAAkB,SAAS,KAAK,MAAM;EAC5C,MAAM,cAAc,SAAS,KAAK,MAAM;EACxC,SAAS,KAAK,MAAM,aAAa;EACjC,SAAS,KAAK,MAAM,SAAS;EAE7B,MAAM,qBAAqB,MAAoB;GAC7C,MAAM,QAAQ,UAAU;GACxB,IAAI,CAAC,OACH;GAGF,MAAM,gBAAgB,MAAM,UAAU,sBAAsB;GAC5D,MAAM,aAAaC,iCAAAA,sBAAsB;IACvC,SAAS,EAAE;IACX,eAAe,cAAc;IAC7B,gBAAgB,cAAc;IAC9B,UAAU,MAAM;IAChB,UAAU,MAAM;GAClB,CAAC;GACD,MAAM,iBAAiB,aAAa,iBAAiB,UAAU,CAAC;GAEhE,IAAI,UAAU,MAAM;GACpB,IAAI,WAAW,MAAM;GAErB,IAAI,MAAM,SAAS,OAAO;IACxB,MAAM,cAAc,iBAAiB,MAAM,YAAY;IACvD,MAAM,gBAAgB,gBAAgB,cAAc,uBAAuB,IAAI;IAE/E,WAAW,KAAK,IAAI,GAAG,iBADJ,KAAK,IAAI,gBAAgB,aACK,CAAC,IAAI,MAAM,YAAY;GAC1E,OAAO;IACL,MAAM,eAAe,iBAAiB,MAAM,eAAe,MAAM,aAAa;IAC9E,MAAM,kBAAkB,gBAAgB,eAAe,uBAAuB,MAAM;IAEpF,UAAU,iBADgB,KAAK,IAAI,gBAAgB,eACR,CAAC;IAC5C,WAAW,KAAK,IAAI,GAAG,MAAM,eAAe,MAAM,gBAAgB,OAAO;GAC3E;GAEA,UAAU,UAAU;IAAE,GAAG;IAAO,aAAa;IAAS,cAAc;GAAS;GAC7E,eAAe,UAAU,OAAO;EAClC;EAEA,MAAM,wBAAwB;GAC5B,MAAM,QAAQ,UAAU;GACxB,IAAI,OAEA;QAAA,MAAM,gBAAgB,MAAM,gBAC5B,MAAM,iBAAiB,MAAM,eAC7B;KACA,IAAI;KACJ,IAAI;KAEJ,IAAI,MAAM,SAAS,SAAS;MAC1B,WAAW,kBAAkB,MAAM,aAAa,MAAM,SAAS;MAC/D,SAAS,MAAM;KACjB,OAAO;MACL,WAAW,MAAM;MACjB,SAAS,kBAAkB,MAAM,cAAc,MAAM,cAAc,MAAM,SAAS;KACpF;KAEA,oBAAoB;MAClB,SAAS,MAAM;MACf;MACA;MACA,OAAO,MAAM;KACf,CAAC;IACH;;GAEF,UAAU,UAAU;GACpB,eAAe,IAAI;GACnB,eAAe,UAAU;GACzB,4BAA4B;IAC1B,eAAe,UAAU;GAC3B,CAAC;EACH;EAEA,SAAS,iBAAiB,eAAe,iBAAiB;EAC1D,SAAS,iBAAiB,aAAa,eAAe;EAEtD,aAAa;GACX,SAAS,KAAK,MAAM,aAAa;GACjC,SAAS,KAAK,MAAM,SAAS;GAC7B,SAAS,oBAAoB,eAAe,iBAAiB;GAC7D,SAAS,oBAAoB,aAAa,eAAe;EAC3D;CACF,GAAG,CAAC,UAAU,CAAC;CAEf,MAAM,qBAAA,GAAoBD,MAAAA,YAAAA,EACvB,YAA6B;EAC5B,IAAI,CAAC,eAAe,YAAY,YAAY,SAC1C,OAAO;EAET,OAAO;GAAE,MAAM,YAAY;GAAa,OAAO,YAAY;EAAa;CAC1E,GACA,CAAC,WAAW,CACd;CAEA,MAAM,oBAAA,GAAmBA,MAAAA,YAAAA,EACtB,UAA6B;EAC5B,IAAI,CAAC,WAAW,SAAS,YAAY,MAAM,YAAY,cACrD,OAAO;EAET,OAAO,iBAAiB,eAAe,KAAK,IAAI;CAClD,GACA;EAAC;EAAS;EAAM;CAAc,CAChC;CAEA,MAAM,eAAA,GAAcA,MAAAA,YAAAA,OAAkB,eAAe,SAAS,CAAC,CAAC;CAEhE,OAAO;EACL;EACA;EACA,iBAAiB,aAAa,WAAW;EACzC,cAAc,aAAa,QAAQ;EACnC;EACA;EACA;CACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-slot-drag-select.cjs","names":[],"sources":["../../src/hooks/use-slot-drag-select.ts"],"sourcesContent":["import { useCallback, useEffect, useEffectEvent, useRef, useState } from 'react';\n\ninterface DragState {\n group: string;\n startIndex: number;\n currentIndex: number;\n}\n\ninterface SelectedRange {\n group: string;\n start: number;\n end: number;\n}\n\ninterface UseSlotDragSelectInput {\n enabled?: boolean;\n onDragEnd?: (startIndex: number, endIndex: number, group: string) => void;\n}\n\nexport function useSlotDragSelect({ enabled = true, onDragEnd }: UseSlotDragSelectInput) {\n const [selectedRange, setSelectedRange] = useState<SelectedRange | null>(null);\n const dragRef = useRef<DragState | null>(null);\n const stableOnDragEnd = useEffectEvent(onDragEnd || (() => {}));\n\n const handleSlotPointerDown = useCallback(\n (_event: React.PointerEvent<HTMLButtonElement>, index: number, group: string) => {\n if (!enabled) {\n return;\n }\n dragRef.current = { group, startIndex: index, currentIndex: index };\n setSelectedRange({ group, start: index, end: index });\n },\n [enabled]\n );\n\n const isDragging = selectedRange !== null;\n\n useEffect(() => {\n if (!isDragging) {\n return undefined;\n }\n\n const savedUserSelect = document.body.style.userSelect;\n document.body.style.userSelect = 'none';\n\n const handlePointerMove = (e: PointerEvent) => {\n if (!dragRef.current) {\n return;\n }\n\n const elements = document.elementsFromPoint(e.clientX, e.clientY);\n for (const el of elements) {\n const indexAttr = (el as HTMLElement).getAttribute?.('data-drag-slot-index');\n const groupAttr = (el as HTMLElement).getAttribute?.('data-drag-slot-group');\n if (indexAttr != null && groupAttr != null) {\n if (groupAttr === dragRef.current.group) {\n const newIndex = Number(indexAttr);\n if (!isNaN(newIndex) && newIndex !== dragRef.current.currentIndex) {\n dragRef.current.currentIndex = newIndex;\n setSelectedRange({\n group: groupAttr,\n start: Math.min(dragRef.current.startIndex, newIndex),\n end: Math.max(dragRef.current.startIndex, newIndex),\n });\n }\n }\n break;\n }\n }\n };\n\n const handlePointerUp = () => {\n if (dragRef.current) {\n const { startIndex, currentIndex, group } = dragRef.current;\n if (startIndex !== currentIndex) {\n stableOnDragEnd(\n Math.min(startIndex, currentIndex),\n Math.max(startIndex, currentIndex),\n group\n );\n }\n }\n dragRef.current = null;\n setSelectedRange(null);\n };\n\n document.addEventListener('pointermove', handlePointerMove);\n document.addEventListener('pointerup', handlePointerUp);\n\n return () => {\n document.body.style.userSelect = savedUserSelect;\n document.removeEventListener('pointermove', handlePointerMove);\n document.removeEventListener('pointerup', handlePointerUp);\n };\n }, [isDragging]);\n\n const isSlotSelected = useCallback(\n (index: number, group: string): boolean => {\n if (!selectedRange || selectedRange.group !== group) {\n return false;\n }\n return index >= selectedRange.start && index <= selectedRange.end;\n },\n [selectedRange]\n );\n\n return {\n handleSlotPointerDown,\n isSlotSelected,\n isDragging,\n };\n}\n"],"mappings":";;;AAmBA,SAAgB,kBAAkB,EAAE,UAAU,MAAM,aAAqC;CACvF,MAAM,CAAC,eAAe,qBAAA,GAAA,MAAA,SAAA,CAAmD,IAAI;CAC7E,MAAM,WAAA,GAAA,MAAA,OAAA,CAAmC,IAAI;CAC7C,MAAM,mBAAA,GAAA,MAAA,eAAA,CAAiC,oBAAoB,CAAC,EAAE;CAE9D,MAAM,yBAAA,GAAA,MAAA,YAAA,EACH,QAA+C,OAAe,UAAkB;EAC/E,IAAI,CAAC,SACH;EAEF,QAAQ,UAAU;GAAE;GAAO,YAAY;GAAO,cAAc;EAAM;EAClE,iBAAiB;GAAE;GAAO,OAAO;GAAO,KAAK;EAAM,CAAC;CACtD,GACA,CAAC,OAAO,CACV;CAEA,MAAM,aAAa,kBAAkB;CAErC,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,IAAI,CAAC,YACH;EAGF,MAAM,kBAAkB,SAAS,KAAK,MAAM;EAC5C,SAAS,KAAK,MAAM,aAAa;EAEjC,MAAM,qBAAqB,MAAoB;GAC7C,IAAI,CAAC,QAAQ,SACX;GAGF,MAAM,WAAW,SAAS,kBAAkB,EAAE,SAAS,EAAE,OAAO;GAChE,KAAK,MAAM,MAAM,UAAU;IACzB,MAAM,YAAa,GAAmB,eAAe,sBAAsB;IAC3E,MAAM,YAAa,GAAmB,eAAe,sBAAsB;IAC3E,IAAI,aAAa,QAAQ,aAAa,MAAM;KAC1C,IAAI,cAAc,QAAQ,QAAQ,OAAO;MACvC,MAAM,WAAW,OAAO,SAAS;MACjC,IAAI,CAAC,MAAM,QAAQ,KAAK,aAAa,QAAQ,QAAQ,cAAc;OACjE,QAAQ,QAAQ,eAAe;OAC/B,iBAAiB;QACf,OAAO;QACP,OAAO,KAAK,IAAI,QAAQ,QAAQ,YAAY,QAAQ;QACpD,KAAK,KAAK,IAAI,QAAQ,QAAQ,YAAY,QAAQ;OACpD,CAAC;MACH;KACF;KACA;IACF;GACF;EACF;EAEA,MAAM,wBAAwB;GAC5B,IAAI,QAAQ,SAAS;IACnB,MAAM,EAAE,YAAY,cAAc,UAAU,QAAQ;IACpD,IAAI,eAAe,cACjB,gBACE,KAAK,IAAI,YAAY,YAAY,GACjC,KAAK,IAAI,YAAY,YAAY,GACjC,KACF;GAEJ;GACA,QAAQ,UAAU;GAClB,iBAAiB,IAAI;EACvB;EAEA,SAAS,iBAAiB,eAAe,iBAAiB;EAC1D,SAAS,iBAAiB,aAAa,eAAe;EAEtD,aAAa;GACX,SAAS,KAAK,MAAM,aAAa;GACjC,SAAS,oBAAoB,eAAe,iBAAiB;GAC7D,SAAS,oBAAoB,aAAa,eAAe;EAC3D;CACF,GAAG,CAAC,UAAU,CAAC;CAYf,OAAO;EACL;EACA,iBAAA,GAAA,MAAA,YAAA,EAXC,OAAe,UAA2B;GACzC,IAAI,CAAC,iBAAiB,cAAc,UAAU,OAC5C,OAAO;GAET,OAAO,SAAS,cAAc,SAAS,SAAS,cAAc;EAChE,GACA,CAAC,aAAa,CAKD;EACb;CACF;AACF"}
1
+ {"version":3,"file":"use-slot-drag-select.cjs","names":["useState","useRef","useEffectEvent","useCallback"],"sources":["../../src/hooks/use-slot-drag-select.ts"],"sourcesContent":["import { useCallback, useEffect, useEffectEvent, useRef, useState } from 'react';\n\ninterface DragState {\n group: string;\n startIndex: number;\n currentIndex: number;\n}\n\ninterface SelectedRange {\n group: string;\n start: number;\n end: number;\n}\n\ninterface UseSlotDragSelectInput {\n enabled?: boolean;\n onDragEnd?: (startIndex: number, endIndex: number, group: string) => void;\n}\n\nexport function useSlotDragSelect({ enabled = true, onDragEnd }: UseSlotDragSelectInput) {\n const [selectedRange, setSelectedRange] = useState<SelectedRange | null>(null);\n const dragRef = useRef<DragState | null>(null);\n const stableOnDragEnd = useEffectEvent(onDragEnd || (() => {}));\n\n const handleSlotPointerDown = useCallback(\n (_event: React.PointerEvent<HTMLButtonElement>, index: number, group: string) => {\n if (!enabled) {\n return;\n }\n dragRef.current = { group, startIndex: index, currentIndex: index };\n setSelectedRange({ group, start: index, end: index });\n },\n [enabled]\n );\n\n const isDragging = selectedRange !== null;\n\n useEffect(() => {\n if (!isDragging) {\n return undefined;\n }\n\n const savedUserSelect = document.body.style.userSelect;\n document.body.style.userSelect = 'none';\n\n const handlePointerMove = (e: PointerEvent) => {\n if (!dragRef.current) {\n return;\n }\n\n const elements = document.elementsFromPoint(e.clientX, e.clientY);\n for (const el of elements) {\n const indexAttr = (el as HTMLElement).getAttribute?.('data-drag-slot-index');\n const groupAttr = (el as HTMLElement).getAttribute?.('data-drag-slot-group');\n if (indexAttr != null && groupAttr != null) {\n if (groupAttr === dragRef.current.group) {\n const newIndex = Number(indexAttr);\n if (!isNaN(newIndex) && newIndex !== dragRef.current.currentIndex) {\n dragRef.current.currentIndex = newIndex;\n setSelectedRange({\n group: groupAttr,\n start: Math.min(dragRef.current.startIndex, newIndex),\n end: Math.max(dragRef.current.startIndex, newIndex),\n });\n }\n }\n break;\n }\n }\n };\n\n const handlePointerUp = () => {\n if (dragRef.current) {\n const { startIndex, currentIndex, group } = dragRef.current;\n if (startIndex !== currentIndex) {\n stableOnDragEnd(\n Math.min(startIndex, currentIndex),\n Math.max(startIndex, currentIndex),\n group\n );\n }\n }\n dragRef.current = null;\n setSelectedRange(null);\n };\n\n document.addEventListener('pointermove', handlePointerMove);\n document.addEventListener('pointerup', handlePointerUp);\n\n return () => {\n document.body.style.userSelect = savedUserSelect;\n document.removeEventListener('pointermove', handlePointerMove);\n document.removeEventListener('pointerup', handlePointerUp);\n };\n }, [isDragging]);\n\n const isSlotSelected = useCallback(\n (index: number, group: string): boolean => {\n if (!selectedRange || selectedRange.group !== group) {\n return false;\n }\n return index >= selectedRange.start && index <= selectedRange.end;\n },\n [selectedRange]\n );\n\n return {\n handleSlotPointerDown,\n isSlotSelected,\n isDragging,\n };\n}\n"],"mappings":";;;AAmBA,SAAgB,kBAAkB,EAAE,UAAU,MAAM,aAAqC;CACvF,MAAM,CAAC,eAAe,qBAAA,GAAoBA,MAAAA,SAAAA,CAA+B,IAAI;CAC7E,MAAM,WAAA,GAAUC,MAAAA,OAAAA,CAAyB,IAAI;CAC7C,MAAM,mBAAA,GAAkBC,MAAAA,eAAAA,CAAe,oBAAoB,CAAC,EAAE;CAE9D,MAAM,yBAAA,GAAwBC,MAAAA,YAAAA,EAC3B,QAA+C,OAAe,UAAkB;EAC/E,IAAI,CAAC,SACH;EAEF,QAAQ,UAAU;GAAE;GAAO,YAAY;GAAO,cAAc;EAAM;EAClE,iBAAiB;GAAE;GAAO,OAAO;GAAO,KAAK;EAAM,CAAC;CACtD,GACA,CAAC,OAAO,CACV;CAEA,MAAM,aAAa,kBAAkB;CAErC,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,IAAI,CAAC,YACH;EAGF,MAAM,kBAAkB,SAAS,KAAK,MAAM;EAC5C,SAAS,KAAK,MAAM,aAAa;EAEjC,MAAM,qBAAqB,MAAoB;GAC7C,IAAI,CAAC,QAAQ,SACX;GAGF,MAAM,WAAW,SAAS,kBAAkB,EAAE,SAAS,EAAE,OAAO;GAChE,KAAK,MAAM,MAAM,UAAU;IACzB,MAAM,YAAa,GAAmB,eAAe,sBAAsB;IAC3E,MAAM,YAAa,GAAmB,eAAe,sBAAsB;IAC3E,IAAI,aAAa,QAAQ,aAAa,MAAM;KAC1C,IAAI,cAAc,QAAQ,QAAQ,OAAO;MACvC,MAAM,WAAW,OAAO,SAAS;MACjC,IAAI,CAAC,MAAM,QAAQ,KAAK,aAAa,QAAQ,QAAQ,cAAc;OACjE,QAAQ,QAAQ,eAAe;OAC/B,iBAAiB;QACf,OAAO;QACP,OAAO,KAAK,IAAI,QAAQ,QAAQ,YAAY,QAAQ;QACpD,KAAK,KAAK,IAAI,QAAQ,QAAQ,YAAY,QAAQ;OACpD,CAAC;MACH;KACF;KACA;IACF;GACF;EACF;EAEA,MAAM,wBAAwB;GAC5B,IAAI,QAAQ,SAAS;IACnB,MAAM,EAAE,YAAY,cAAc,UAAU,QAAQ;IACpD,IAAI,eAAe,cACjB,gBACE,KAAK,IAAI,YAAY,YAAY,GACjC,KAAK,IAAI,YAAY,YAAY,GACjC,KACF;GAEJ;GACA,QAAQ,UAAU;GAClB,iBAAiB,IAAI;EACvB;EAEA,SAAS,iBAAiB,eAAe,iBAAiB;EAC1D,SAAS,iBAAiB,aAAa,eAAe;EAEtD,aAAa;GACX,SAAS,KAAK,MAAM,aAAa;GACjC,SAAS,oBAAoB,eAAe,iBAAiB;GAC7D,SAAS,oBAAoB,aAAa,eAAe;EAC3D;CACF,GAAG,CAAC,UAAU,CAAC;CAYf,OAAO;EACL;EACA,iBAAA,GAZqBA,MAAAA,YAAAA,EACpB,OAAe,UAA2B;GACzC,IAAI,CAAC,iBAAiB,cAAc,UAAU,OAC5C,OAAO;GAET,OAAO,SAAS,cAAc,SAAS,SAAS,cAAc;EAChE,GACA,CAAC,aAAa,CAKD;EACb;CACF;AACF"}
package/cjs/index.cjs CHANGED
@@ -47,6 +47,7 @@ const require_CurrentTimeIndicator = require("./components/CurrentTimeIndicator/
47
47
  const require_DragContext = require("./components/DragContext/DragContext.cjs");
48
48
  const require_ScheduleEvent = require("./components/ScheduleEvent/ScheduleEvent.cjs");
49
49
  const require_MoreEvents = require("./components/MoreEvents/MoreEvents.cjs");
50
+ const require_ScheduleBackgroundEvent = require("./components/ScheduleBackgroundEvent/ScheduleBackgroundEvent.cjs");
50
51
  const require_ScheduleHeader = require("./components/ScheduleHeader/ScheduleHeader.cjs");
51
52
  const require_DayView = require("./components/DayView/DayView.cjs");
52
53
  const require_MobileMonthView = require("./components/MobileMonthView/MobileMonthView.cjs");
@@ -71,6 +72,7 @@ exports.ResourcesMonthView = require_ResourcesMonthView.ResourcesMonthView;
71
72
  exports.ResourcesSchedule = require_ResourcesSchedule.ResourcesSchedule;
72
73
  exports.ResourcesWeekView = require_ResourcesWeekView.ResourcesWeekView;
73
74
  exports.Schedule = require_Schedule.Schedule;
75
+ exports.ScheduleBackgroundEvent = require_ScheduleBackgroundEvent.ScheduleBackgroundEvent;
74
76
  exports.ScheduleEvent = require_ScheduleEvent.ScheduleEvent;
75
77
  exports.ScheduleHeader = require_ScheduleHeader.ScheduleHeader;
76
78
  exports.WeekView = require_WeekView.WeekView;
@@ -1,16 +1,37 @@
1
1
  "use client";
2
2
  const require_runtime = require("../../_virtual/_rolldown/runtime.cjs");
3
+ const require_clamp_interval_minutes = require("../clamp-interval-minutes/clamp-interval-minutes.cjs");
3
4
  const require_parse_time_string = require("../parse-time-string/parse-time-string.cjs");
4
5
  let dayjs = require("dayjs");
5
6
  dayjs = require_runtime.__toESM(dayjs);
6
7
  //#region packages/@mantine/schedule/src/utils/calculate-drop-time/calculate-drop-time.ts
7
- function calculateDropTime({ draggedEvent, targetDate, targetSlotTime, mouseYOffset = 0, slotHeight = 64, intervalMinutes = 15 }) {
8
+ function calculateDropTime({ draggedEvent, targetDate, targetSlotTime, mouseYOffset = 0, slotHeight = 64, intervalMinutes = 15, slotOffset, slotSize, dragIntervalMinutes, startTime, endTime }) {
8
9
  const eventDuration = (0, dayjs.default)(draggedEvent.end).diff((0, dayjs.default)(draggedEvent.start), "millisecond");
9
10
  const parsedTime = require_parse_time_string.parseTimeString(targetSlotTime);
10
- const baseTargetTime = (0, dayjs.default)(targetDate).startOf("day").hour(parsedTime.hours).minute(parsedTime.minutes).second(0);
11
+ const targetDay = (0, dayjs.default)(targetDate).startOf("day");
12
+ const baseTargetTime = targetDay.hour(parsedTime.hours).minute(parsedTime.minutes).second(0);
11
13
  let finalTargetTime = baseTargetTime;
12
- if (mouseYOffset > 0 && slotHeight > 0) {
13
- const offsetRatio = mouseYOffset / slotHeight;
14
+ const offset = slotOffset ?? mouseYOffset;
15
+ const size = slotSize ?? slotHeight;
16
+ if (dragIntervalMinutes != null) {
17
+ const clampedDrag = require_clamp_interval_minutes.clampIntervalMinutes(dragIntervalMinutes);
18
+ const gridInterval = require_clamp_interval_minutes.clampIntervalMinutes(intervalMinutes);
19
+ const rawStartMinutes = parsedTime.hours * 60 + parsedTime.minutes + (size > 0 ? offset / size : 0) * gridInterval;
20
+ let snappedStartMinutes = Math.round(rawStartMinutes / clampedDrag) * clampedDrag;
21
+ const parsedEnd = endTime ? require_parse_time_string.parseTimeString(endTime) : null;
22
+ const parsedStart = startTime ? require_parse_time_string.parseTimeString(startTime) : null;
23
+ const maxStart = parsedEnd ? Math.floor((parsedEnd.hours * 60 + parsedEnd.minutes - 1) / clampedDrag) * clampedDrag : null;
24
+ const minStart = parsedStart ? Math.ceil((parsedStart.hours * 60 + parsedStart.minutes) / clampedDrag) * clampedDrag : null;
25
+ if (minStart !== null && maxStart !== null && minStart > maxStart) snappedStartMinutes = parsedStart.hours * 60 + parsedStart.minutes;
26
+ else {
27
+ if (maxStart !== null) snappedStartMinutes = Math.min(snappedStartMinutes, maxStart);
28
+ if (minStart !== null) snappedStartMinutes = Math.max(snappedStartMinutes, minStart);
29
+ }
30
+ const dayOffset = Math.floor(snappedStartMinutes / 1440);
31
+ const minutesInDay = snappedStartMinutes - dayOffset * 1440;
32
+ finalTargetTime = targetDay.add(dayOffset, "day").hour(Math.floor(minutesInDay / 60)).minute(minutesInDay % 60).second(0);
33
+ } else if (offset > 0 && size > 0) {
34
+ const offsetRatio = offset / size;
14
35
  const offsetMinutes = Math.round(offsetRatio * intervalMinutes);
15
36
  finalTargetTime = baseTargetTime.add(offsetMinutes, "minute");
16
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"calculate-drop-time.cjs","names":["parseTimeString"],"sources":["../../../src/utils/calculate-drop-time/calculate-drop-time.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { AnyDateValue, ScheduleEventData } from '../../types';\nimport { parseTimeString } from '../parse-time-string/parse-time-string';\n\nexport interface CalculateDropTimeInput {\n /** The event being dragged */\n draggedEvent: ScheduleEventData;\n\n /** Target date where event will be dropped */\n targetDate: AnyDateValue;\n\n /** Target time slot start time in HH:mm:ss format */\n targetSlotTime: string;\n\n /** Mouse Y position relative to the slot */\n mouseYOffset?: number;\n\n /** Height of one slot in pixels */\n slotHeight?: number;\n\n /** Minutes per slot */\n intervalMinutes?: number;\n}\n\nexport interface CalculateDropTimeResult {\n /** New start date/time for the event */\n start: Date;\n\n /** New end date/time for the event */\n end: Date;\n}\n\nexport function calculateDropTime({\n draggedEvent,\n targetDate,\n targetSlotTime,\n mouseYOffset = 0,\n slotHeight = 64,\n intervalMinutes = 15,\n}: CalculateDropTimeInput): CalculateDropTimeResult {\n const eventDuration = dayjs(draggedEvent.end).diff(dayjs(draggedEvent.start), 'millisecond');\n\n const parsedTime = parseTimeString(targetSlotTime);\n const targetDay = dayjs(targetDate).startOf('day');\n\n const baseTargetTime = targetDay.hour(parsedTime.hours).minute(parsedTime.minutes).second(0);\n\n let finalTargetTime = baseTargetTime;\n\n if (mouseYOffset > 0 && slotHeight > 0) {\n const offsetRatio = mouseYOffset / slotHeight;\n const offsetMinutes = Math.round(offsetRatio * intervalMinutes);\n finalTargetTime = baseTargetTime.add(offsetMinutes, 'minute');\n }\n\n const newStart = finalTargetTime.toDate();\n const newEnd = finalTargetTime.add(eventDuration, 'millisecond').toDate();\n\n return {\n start: newStart,\n end: newEnd,\n };\n}\n"],"mappings":";;;;;;AAgCA,SAAgB,kBAAkB,EAChC,cACA,YACA,gBACA,eAAe,GACf,aAAa,IACb,kBAAkB,MACgC;CAClD,MAAM,iBAAA,GAAA,MAAA,QAAA,CAAsB,aAAa,GAAG,CAAC,CAAC,MAAA,GAAA,MAAA,QAAA,CAAW,aAAa,KAAK,GAAG,aAAa;CAE3F,MAAM,aAAaA,0BAAAA,gBAAgB,cAAc;CAGjD,MAAM,kBAAA,GAAA,MAAA,QAAA,CAFkB,UAAU,CAAC,CAAC,QAAQ,KAEb,CAAC,CAAC,KAAK,WAAW,KAAK,CAAC,CAAC,OAAO,WAAW,OAAO,CAAC,CAAC,OAAO,CAAC;CAE3F,IAAI,kBAAkB;CAEtB,IAAI,eAAe,KAAK,aAAa,GAAG;EACtC,MAAM,cAAc,eAAe;EACnC,MAAM,gBAAgB,KAAK,MAAM,cAAc,eAAe;EAC9D,kBAAkB,eAAe,IAAI,eAAe,QAAQ;CAC9D;CAKA,OAAO;EACL,OAJe,gBAAgB,OAIjB;EACd,KAJa,gBAAgB,IAAI,eAAe,aAAa,CAAC,CAAC,OAIrD;CACZ;AACF"}
1
+ {"version":3,"file":"calculate-drop-time.cjs","names":["parseTimeString","clampIntervalMinutes"],"sources":["../../../src/utils/calculate-drop-time/calculate-drop-time.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { AnyDateValue, ScheduleEventData } from '../../types';\nimport { clampIntervalMinutes } from '../clamp-interval-minutes/clamp-interval-minutes';\nimport { parseTimeString } from '../parse-time-string/parse-time-string';\n\nexport interface CalculateDropTimeInput {\n /** The event being dragged */\n draggedEvent: ScheduleEventData;\n\n /** Target date where event will be dropped */\n targetDate: AnyDateValue;\n\n /** Target time slot start time in HH:mm:ss format */\n targetSlotTime: string;\n\n /** Mouse Y position relative to the slot */\n mouseYOffset?: number;\n\n /** Height of one slot in pixels */\n slotHeight?: number;\n\n /** Minutes per slot */\n intervalMinutes?: number;\n\n /** Pointer offset along the time axis within the target slot, in px. Axis-agnostic alias for `mouseYOffset`; when both are set, `slotOffset` wins. */\n slotOffset?: number;\n\n /** Size of the target slot along the time axis, in px. Axis-agnostic alias for `slotHeight`; when both are set, `slotSize` wins. */\n slotSize?: number;\n\n /** Snap step for the resulting start time, in minutes. When set, the start snaps to this interval (absolute, from the day boundary) instead of the slot start. */\n dragIntervalMinutes?: number;\n\n /** Start time boundary of the schedule in HH:mm:ss format. When set together with `dragIntervalMinutes`, the snapped start is clamped to stay within the displayed range (the event may still extend past `endTime`, matching how overflowing events are clipped). */\n startTime?: string;\n\n /** End time boundary of the schedule in HH:mm:ss format. When set together with `dragIntervalMinutes`, the snapped start is clamped to stay within the displayed range (the event may still extend past `endTime`, matching how overflowing events are clipped). */\n endTime?: string;\n}\n\nexport interface CalculateDropTimeResult {\n /** New start date/time for the event */\n start: Date;\n\n /** New end date/time for the event */\n end: Date;\n}\n\nexport function calculateDropTime({\n draggedEvent,\n targetDate,\n targetSlotTime,\n mouseYOffset = 0,\n slotHeight = 64,\n intervalMinutes = 15,\n slotOffset,\n slotSize,\n dragIntervalMinutes,\n startTime,\n endTime,\n}: CalculateDropTimeInput): CalculateDropTimeResult {\n const eventDuration = dayjs(draggedEvent.end).diff(dayjs(draggedEvent.start), 'millisecond');\n\n const parsedTime = parseTimeString(targetSlotTime);\n const targetDay = dayjs(targetDate).startOf('day');\n\n const baseTargetTime = targetDay.hour(parsedTime.hours).minute(parsedTime.minutes).second(0);\n\n let finalTargetTime = baseTargetTime;\n\n const offset = slotOffset ?? mouseYOffset;\n const size = slotSize ?? slotHeight;\n\n if (dragIntervalMinutes != null) {\n const clampedDrag = clampIntervalMinutes(dragIntervalMinutes);\n const gridInterval = clampIntervalMinutes(intervalMinutes);\n const slotStartMinutes = parsedTime.hours * 60 + parsedTime.minutes;\n const offsetRatio = size > 0 ? offset / size : 0;\n const rawStartMinutes = slotStartMinutes + offsetRatio * gridInterval;\n let snappedStartMinutes = Math.round(rawStartMinutes / clampedDrag) * clampedDrag;\n\n const parsedEnd = endTime ? parseTimeString(endTime) : null;\n const parsedStart = startTime ? parseTimeString(startTime) : null;\n const maxStart = parsedEnd\n ? Math.floor((parsedEnd.hours * 60 + parsedEnd.minutes - 1) / clampedDrag) * clampedDrag\n : null;\n const minStart = parsedStart\n ? Math.ceil((parsedStart.hours * 60 + parsedStart.minutes) / clampedDrag) * clampedDrag\n : null;\n\n if (minStart !== null && maxStart !== null && minStart > maxStart) {\n // The snap grid is coarser than the displayed range, so no snapped start falls\n // inside it – the start of the range is the only sensible drop target.\n snappedStartMinutes = parsedStart!.hours * 60 + parsedStart!.minutes;\n } else {\n if (maxStart !== null) {\n snappedStartMinutes = Math.min(snappedStartMinutes, maxStart);\n }\n if (minStart !== null) {\n snappedStartMinutes = Math.max(snappedStartMinutes, minStart);\n }\n }\n\n const dayOffset = Math.floor(snappedStartMinutes / 1440);\n const minutesInDay = snappedStartMinutes - dayOffset * 1440;\n\n // Built from wall clock fields rather than by adding minutes to the start of the day.\n // On a DST transition a day is 23 or 25 hours long, so `startOf('day').add(180, 'minute')`\n // lands on 04:00 (spring forward) or 01:00 (fall back) instead of the 03:00/02:00 slot the\n // user dropped on. Not covered by tests: the process timezone cannot be changed from\n // inside a test, so any assertion here would pass in every zone regardless.\n finalTargetTime = targetDay\n .add(dayOffset, 'day')\n .hour(Math.floor(minutesInDay / 60))\n .minute(minutesInDay % 60)\n .second(0);\n } else if (offset > 0 && size > 0) {\n const offsetRatio = offset / size;\n const offsetMinutes = Math.round(offsetRatio * intervalMinutes);\n finalTargetTime = baseTargetTime.add(offsetMinutes, 'minute');\n }\n\n const newStart = finalTargetTime.toDate();\n const newEnd = finalTargetTime.add(eventDuration, 'millisecond').toDate();\n\n return {\n start: newStart,\n end: newEnd,\n };\n}\n"],"mappings":";;;;;;;AAgDA,SAAgB,kBAAkB,EAChC,cACA,YACA,gBACA,eAAe,GACf,aAAa,IACb,kBAAkB,IAClB,YACA,UACA,qBACA,WACA,WACkD;CAClD,MAAM,iBAAA,GAAgB,MAAA,QAAA,CAAM,aAAa,GAAG,CAAC,CAAC,MAAA,GAAK,MAAA,QAAA,CAAM,aAAa,KAAK,GAAG,aAAa;CAE3F,MAAM,aAAaA,0BAAAA,gBAAgB,cAAc;CACjD,MAAM,aAAA,GAAY,MAAA,QAAA,CAAM,UAAU,CAAC,CAAC,QAAQ,KAAK;CAEjD,MAAM,iBAAiB,UAAU,KAAK,WAAW,KAAK,CAAC,CAAC,OAAO,WAAW,OAAO,CAAC,CAAC,OAAO,CAAC;CAE3F,IAAI,kBAAkB;CAEtB,MAAM,SAAS,cAAc;CAC7B,MAAM,OAAO,YAAY;CAEzB,IAAI,uBAAuB,MAAM;EAC/B,MAAM,cAAcC,+BAAAA,qBAAqB,mBAAmB;EAC5D,MAAM,eAAeA,+BAAAA,qBAAqB,eAAe;EAGzD,MAAM,kBAFmB,WAAW,QAAQ,KAAK,WAAW,WACxC,OAAO,IAAI,SAAS,OAAO,KACU;EACzD,IAAI,sBAAsB,KAAK,MAAM,kBAAkB,WAAW,IAAI;EAEtE,MAAM,YAAY,UAAUD,0BAAAA,gBAAgB,OAAO,IAAI;EACvD,MAAM,cAAc,YAAYA,0BAAAA,gBAAgB,SAAS,IAAI;EAC7D,MAAM,WAAW,YACb,KAAK,OAAO,UAAU,QAAQ,KAAK,UAAU,UAAU,KAAK,WAAW,IAAI,cAC3E;EACJ,MAAM,WAAW,cACb,KAAK,MAAM,YAAY,QAAQ,KAAK,YAAY,WAAW,WAAW,IAAI,cAC1E;EAEJ,IAAI,aAAa,QAAQ,aAAa,QAAQ,WAAW,UAGvD,sBAAsB,YAAa,QAAQ,KAAK,YAAa;OACxD;GACL,IAAI,aAAa,MACf,sBAAsB,KAAK,IAAI,qBAAqB,QAAQ;GAE9D,IAAI,aAAa,MACf,sBAAsB,KAAK,IAAI,qBAAqB,QAAQ;EAEhE;EAEA,MAAM,YAAY,KAAK,MAAM,sBAAsB,IAAI;EACvD,MAAM,eAAe,sBAAsB,YAAY;EAOvD,kBAAkB,UACf,IAAI,WAAW,KAAK,CAAC,CACrB,KAAK,KAAK,MAAM,eAAe,EAAE,CAAC,CAAC,CACnC,OAAO,eAAe,EAAE,CAAC,CACzB,OAAO,CAAC;CACb,OAAO,IAAI,SAAS,KAAK,OAAO,GAAG;EACjC,MAAM,cAAc,SAAS;EAC7B,MAAM,gBAAgB,KAAK,MAAM,cAAc,eAAe;EAC9D,kBAAkB,eAAe,IAAI,eAAe,QAAQ;CAC9D;CAKA,OAAO;EACL,OAJe,gBAAgB,OAIjB;EACd,KAJa,gBAAgB,IAAI,eAAe,aAAa,CAAC,CAAC,OAIrD;CACZ;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"calculate-month-drop-date.cjs","names":[],"sources":["../../../src/utils/calculate-month-drop-date/calculate-month-drop-date.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { DateStringValue, ScheduleEventData } from '../../types';\n\nexport interface CalculateMonthDropDateInput {\n /** The event being dragged */\n draggedEvent: ScheduleEventData;\n\n /** The target day where the event is being dropped */\n targetDay: DateStringValue;\n}\n\nexport interface CalculateMonthDropDateResult {\n /** New start date for the event */\n start: Date;\n\n /** New end date for the event */\n end: Date;\n}\n\nexport function calculateMonthDropDate({\n draggedEvent,\n targetDay,\n}: CalculateMonthDropDateInput): CalculateMonthDropDateResult {\n const eventDuration = dayjs(draggedEvent.end).diff(dayjs(draggedEvent.start), 'millisecond');\n\n const originalStartTime = dayjs(draggedEvent.start);\n const targetDayStart = dayjs(targetDay).startOf('day');\n\n const newStart = targetDayStart\n .hour(originalStartTime.hour())\n .minute(originalStartTime.minute())\n .second(originalStartTime.second())\n .millisecond(originalStartTime.millisecond());\n\n const newEnd = newStart.add(eventDuration, 'millisecond');\n\n return {\n start: newStart.toDate(),\n end: newEnd.toDate(),\n };\n}\n"],"mappings":";;;;;AAmBA,SAAgB,uBAAuB,EACrC,cACA,aAC4D;CAC5D,MAAM,iBAAA,GAAA,MAAA,QAAA,CAAsB,aAAa,GAAG,CAAC,CAAC,MAAA,GAAA,MAAA,QAAA,CAAW,aAAa,KAAK,GAAG,aAAa;CAE3F,MAAM,qBAAA,GAAA,MAAA,QAAA,CAA0B,aAAa,KAAK;CAGlD,MAAM,YAAA,GAAA,MAAA,QAAA,CAFuB,SAAS,CAAC,CAAC,QAAQ,KAElB,CAAC,CAC5B,KAAK,kBAAkB,KAAK,CAAC,CAAC,CAC9B,OAAO,kBAAkB,OAAO,CAAC,CAAC,CAClC,OAAO,kBAAkB,OAAO,CAAC,CAAC,CAClC,YAAY,kBAAkB,YAAY,CAAC;CAE9C,MAAM,SAAS,SAAS,IAAI,eAAe,aAAa;CAExD,OAAO;EACL,OAAO,SAAS,OAAO;EACvB,KAAK,OAAO,OAAO;CACrB;AACF"}
1
+ {"version":3,"file":"calculate-month-drop-date.cjs","names":[],"sources":["../../../src/utils/calculate-month-drop-date/calculate-month-drop-date.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { DateStringValue, ScheduleEventData } from '../../types';\n\nexport interface CalculateMonthDropDateInput {\n /** The event being dragged */\n draggedEvent: ScheduleEventData;\n\n /** The target day where the event is being dropped */\n targetDay: DateStringValue;\n}\n\nexport interface CalculateMonthDropDateResult {\n /** New start date for the event */\n start: Date;\n\n /** New end date for the event */\n end: Date;\n}\n\nexport function calculateMonthDropDate({\n draggedEvent,\n targetDay,\n}: CalculateMonthDropDateInput): CalculateMonthDropDateResult {\n const eventDuration = dayjs(draggedEvent.end).diff(dayjs(draggedEvent.start), 'millisecond');\n\n const originalStartTime = dayjs(draggedEvent.start);\n const targetDayStart = dayjs(targetDay).startOf('day');\n\n const newStart = targetDayStart\n .hour(originalStartTime.hour())\n .minute(originalStartTime.minute())\n .second(originalStartTime.second())\n .millisecond(originalStartTime.millisecond());\n\n const newEnd = newStart.add(eventDuration, 'millisecond');\n\n return {\n start: newStart.toDate(),\n end: newEnd.toDate(),\n };\n}\n"],"mappings":";;;;;AAmBA,SAAgB,uBAAuB,EACrC,cACA,aAC4D;CAC5D,MAAM,iBAAA,GAAgB,MAAA,QAAA,CAAM,aAAa,GAAG,CAAC,CAAC,MAAA,GAAK,MAAA,QAAA,CAAM,aAAa,KAAK,GAAG,aAAa;CAE3F,MAAM,qBAAA,GAAoB,MAAA,QAAA,CAAM,aAAa,KAAK;CAGlD,MAAM,YAAA,GAFiB,MAAA,QAAA,CAAM,SAAS,CAAC,CAAC,QAAQ,KAElB,CAAC,CAC5B,KAAK,kBAAkB,KAAK,CAAC,CAAC,CAC9B,OAAO,kBAAkB,OAAO,CAAC,CAAC,CAClC,OAAO,kBAAkB,OAAO,CAAC,CAAC,CAClC,YAAY,kBAAkB,YAAY,CAAC;CAE9C,MAAM,SAAS,SAAS,IAAI,eAAe,aAAa;CAExD,OAAO;EACL,OAAO,SAAS,OAAO;EACvB,KAAK,OAAO,OAAO;CACrB;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"calculate-month-resize-dates.cjs","names":[],"sources":["../../../src/utils/calculate-month-resize-dates/calculate-month-resize-dates.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { DateStringValue, DateTimeStringValue, ScheduleEventData } from '../../types';\n\nexport type MonthResizeEdge = 'start' | 'end';\n\nexport interface CalculateMonthResizeDatesInput {\n /** The event being resized */\n event: ScheduleEventData;\n\n /** Edge of the event that is being dragged */\n edge: MonthResizeEdge;\n\n /** The day on which the dragged edge was released */\n targetDay: DateStringValue;\n}\n\nexport interface CalculateMonthResizeDatesResult {\n /** New start date for the event */\n start: DateTimeStringValue;\n\n /** New end date for the event */\n end: DateTimeStringValue;\n}\n\nconst DATE_TIME_FORMAT = 'YYYY-MM-DD HH:mm:ss';\n\nfunction isExclusiveMidnight(value: dayjs.Dayjs): boolean {\n return value.hour() === 0 && value.minute() === 0 && value.second() === 0;\n}\n\nfunction withTimeOf(day: dayjs.Dayjs, source: dayjs.Dayjs): dayjs.Dayjs {\n return day\n .startOf('day')\n .hour(source.hour())\n .minute(source.minute())\n .second(source.second())\n .millisecond(source.millisecond());\n}\n\nexport function calculateMonthResizeDates({\n event,\n edge,\n targetDay,\n}: CalculateMonthResizeDatesInput): CalculateMonthResizeDatesResult {\n const originalStart = dayjs(event.start);\n const originalEnd = dayjs(event.end);\n const target = dayjs(targetDay).startOf('day');\n\n const startDay = originalStart.startOf('day');\n const endAtMidnight = isExclusiveMidnight(originalEnd);\n const endDay = endAtMidnight\n ? originalEnd.startOf('day').subtract(1, 'day')\n : originalEnd.startOf('day');\n\n if (edge === 'start') {\n const clampedDay = target.isAfter(endDay) ? endDay : target;\n let newStart = withTimeOf(clampedDay, originalStart);\n\n if (!newStart.isBefore(originalEnd)) {\n newStart = newStart.subtract(1, 'day');\n }\n\n return {\n start: newStart.format(DATE_TIME_FORMAT),\n end: originalEnd.format(DATE_TIME_FORMAT),\n };\n }\n\n const clampedDay = target.isBefore(startDay) ? startDay : target;\n let newEnd = endAtMidnight\n ? clampedDay.add(1, 'day').startOf('day')\n : withTimeOf(clampedDay, originalEnd);\n\n if (!newEnd.isAfter(originalStart)) {\n newEnd = newEnd.add(1, 'day');\n }\n\n return {\n start: originalStart.format(DATE_TIME_FORMAT),\n end: newEnd.format(DATE_TIME_FORMAT),\n };\n}\n"],"mappings":";;;;;AAwBA,MAAM,mBAAmB;AAEzB,SAAS,oBAAoB,OAA6B;CACxD,OAAO,MAAM,KAAK,MAAM,KAAK,MAAM,OAAO,MAAM,KAAK,MAAM,OAAO,MAAM;AAC1E;AAEA,SAAS,WAAW,KAAkB,QAAkC;CACtE,OAAO,IACJ,QAAQ,KAAK,CAAC,CACd,KAAK,OAAO,KAAK,CAAC,CAAC,CACnB,OAAO,OAAO,OAAO,CAAC,CAAC,CACvB,OAAO,OAAO,OAAO,CAAC,CAAC,CACvB,YAAY,OAAO,YAAY,CAAC;AACrC;AAEA,SAAgB,0BAA0B,EACxC,OACA,MACA,aACkE;CAClE,MAAM,iBAAA,GAAA,MAAA,QAAA,CAAsB,MAAM,KAAK;CACvC,MAAM,eAAA,GAAA,MAAA,QAAA,CAAoB,MAAM,GAAG;CACnC,MAAM,UAAA,GAAA,MAAA,QAAA,CAAe,SAAS,CAAC,CAAC,QAAQ,KAAK;CAE7C,MAAM,WAAW,cAAc,QAAQ,KAAK;CAC5C,MAAM,gBAAgB,oBAAoB,WAAW;CACrD,MAAM,SAAS,gBACX,YAAY,QAAQ,KAAK,CAAC,CAAC,SAAS,GAAG,KAAK,IAC5C,YAAY,QAAQ,KAAK;CAE7B,IAAI,SAAS,SAAS;EAEpB,IAAI,WAAW,WADI,OAAO,QAAQ,MAAM,IAAI,SAAS,QACf,aAAa;EAEnD,IAAI,CAAC,SAAS,SAAS,WAAW,GAChC,WAAW,SAAS,SAAS,GAAG,KAAK;EAGvC,OAAO;GACL,OAAO,SAAS,OAAO,gBAAgB;GACvC,KAAK,YAAY,OAAO,gBAAgB;EAC1C;CACF;CAEA,MAAM,aAAa,OAAO,SAAS,QAAQ,IAAI,WAAW;CAC1D,IAAI,SAAS,gBACT,WAAW,IAAI,GAAG,KAAK,CAAC,CAAC,QAAQ,KAAK,IACtC,WAAW,YAAY,WAAW;CAEtC,IAAI,CAAC,OAAO,QAAQ,aAAa,GAC/B,SAAS,OAAO,IAAI,GAAG,KAAK;CAG9B,OAAO;EACL,OAAO,cAAc,OAAO,gBAAgB;EAC5C,KAAK,OAAO,OAAO,gBAAgB;CACrC;AACF"}
1
+ {"version":3,"file":"calculate-month-resize-dates.cjs","names":[],"sources":["../../../src/utils/calculate-month-resize-dates/calculate-month-resize-dates.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { DateStringValue, DateTimeStringValue, ScheduleEventData } from '../../types';\n\nexport type MonthResizeEdge = 'start' | 'end';\n\nexport interface CalculateMonthResizeDatesInput {\n /** The event being resized */\n event: ScheduleEventData;\n\n /** Edge of the event that is being dragged */\n edge: MonthResizeEdge;\n\n /** The day on which the dragged edge was released */\n targetDay: DateStringValue;\n}\n\nexport interface CalculateMonthResizeDatesResult {\n /** New start date for the event */\n start: DateTimeStringValue;\n\n /** New end date for the event */\n end: DateTimeStringValue;\n}\n\nconst DATE_TIME_FORMAT = 'YYYY-MM-DD HH:mm:ss';\n\nfunction isExclusiveMidnight(value: dayjs.Dayjs): boolean {\n return value.hour() === 0 && value.minute() === 0 && value.second() === 0;\n}\n\nfunction withTimeOf(day: dayjs.Dayjs, source: dayjs.Dayjs): dayjs.Dayjs {\n return day\n .startOf('day')\n .hour(source.hour())\n .minute(source.minute())\n .second(source.second())\n .millisecond(source.millisecond());\n}\n\nexport function calculateMonthResizeDates({\n event,\n edge,\n targetDay,\n}: CalculateMonthResizeDatesInput): CalculateMonthResizeDatesResult {\n const originalStart = dayjs(event.start);\n const originalEnd = dayjs(event.end);\n const target = dayjs(targetDay).startOf('day');\n\n const startDay = originalStart.startOf('day');\n const endAtMidnight = isExclusiveMidnight(originalEnd);\n const endDay = endAtMidnight\n ? originalEnd.startOf('day').subtract(1, 'day')\n : originalEnd.startOf('day');\n\n if (edge === 'start') {\n const clampedDay = target.isAfter(endDay) ? endDay : target;\n let newStart = withTimeOf(clampedDay, originalStart);\n\n if (!newStart.isBefore(originalEnd)) {\n newStart = newStart.subtract(1, 'day');\n }\n\n return {\n start: newStart.format(DATE_TIME_FORMAT),\n end: originalEnd.format(DATE_TIME_FORMAT),\n };\n }\n\n const clampedDay = target.isBefore(startDay) ? startDay : target;\n let newEnd = endAtMidnight\n ? clampedDay.add(1, 'day').startOf('day')\n : withTimeOf(clampedDay, originalEnd);\n\n if (!newEnd.isAfter(originalStart)) {\n newEnd = newEnd.add(1, 'day');\n }\n\n return {\n start: originalStart.format(DATE_TIME_FORMAT),\n end: newEnd.format(DATE_TIME_FORMAT),\n };\n}\n"],"mappings":";;;;;AAwBA,MAAM,mBAAmB;AAEzB,SAAS,oBAAoB,OAA6B;CACxD,OAAO,MAAM,KAAK,MAAM,KAAK,MAAM,OAAO,MAAM,KAAK,MAAM,OAAO,MAAM;AAC1E;AAEA,SAAS,WAAW,KAAkB,QAAkC;CACtE,OAAO,IACJ,QAAQ,KAAK,CAAC,CACd,KAAK,OAAO,KAAK,CAAC,CAAC,CACnB,OAAO,OAAO,OAAO,CAAC,CAAC,CACvB,OAAO,OAAO,OAAO,CAAC,CAAC,CACvB,YAAY,OAAO,YAAY,CAAC;AACrC;AAEA,SAAgB,0BAA0B,EACxC,OACA,MACA,aACkE;CAClE,MAAM,iBAAA,GAAgB,MAAA,QAAA,CAAM,MAAM,KAAK;CACvC,MAAM,eAAA,GAAc,MAAA,QAAA,CAAM,MAAM,GAAG;CACnC,MAAM,UAAA,GAAS,MAAA,QAAA,CAAM,SAAS,CAAC,CAAC,QAAQ,KAAK;CAE7C,MAAM,WAAW,cAAc,QAAQ,KAAK;CAC5C,MAAM,gBAAgB,oBAAoB,WAAW;CACrD,MAAM,SAAS,gBACX,YAAY,QAAQ,KAAK,CAAC,CAAC,SAAS,GAAG,KAAK,IAC5C,YAAY,QAAQ,KAAK;CAE7B,IAAI,SAAS,SAAS;EAEpB,IAAI,WAAW,WADI,OAAO,QAAQ,MAAM,IAAI,SAAS,QACf,aAAa;EAEnD,IAAI,CAAC,SAAS,SAAS,WAAW,GAChC,WAAW,SAAS,SAAS,GAAG,KAAK;EAGvC,OAAO;GACL,OAAO,SAAS,OAAO,gBAAgB;GACvC,KAAK,YAAY,OAAO,gBAAgB;EAC1C;CACF;CAEA,MAAM,aAAa,OAAO,SAAS,QAAQ,IAAI,WAAW;CAC1D,IAAI,SAAS,gBACT,WAAW,IAAI,GAAG,KAAK,CAAC,CAAC,QAAQ,KAAK,IACtC,WAAW,YAAY,WAAW;CAEtC,IAAI,CAAC,OAAO,QAAQ,aAAa,GAC/B,SAAS,OAAO,IAAI,GAAG,KAAK;CAG9B,OAAO;EACL,OAAO,cAAc,OAAO,gBAAgB;EAC5C,KAAK,OAAO,OAAO,gBAAgB;CACrC;AACF"}
@@ -18,6 +18,18 @@ function getExdateSet(recurrence) {
18
18
  const values = recurrence.exdate.map((value) => (0, dayjs.default)(value)).filter((value) => value.isValid()).map((value) => value.format("YYYY-MM-DD HH:mm:ss"));
19
19
  return new Set(values);
20
20
  }
21
+ function toWallClockDate(value) {
22
+ return new Date(Date.UTC(value.year(), value.month(), value.date(), value.hour(), value.minute(), value.second(), value.millisecond()));
23
+ }
24
+ function fromWallClockDate(value) {
25
+ const result = new Date(2e3, 0, 1, 12);
26
+ result.setFullYear(value.getUTCFullYear(), value.getUTCMonth(), value.getUTCDate());
27
+ result.setHours(value.getUTCHours(), value.getUTCMinutes(), value.getUTCSeconds(), value.getUTCMilliseconds());
28
+ return (0, dayjs.default)(result);
29
+ }
30
+ function getWallClockDurationMs(start, end) {
31
+ return toWallClockDate(end).getTime() - toWallClockDate(start).getTime();
32
+ }
21
33
  function getRRuleString(rule) {
22
34
  const normalized = rule.trim();
23
35
  if (!normalized.includes("\n")) return normalized.startsWith("RRULE:") ? normalized.replace(/^RRULE:/, "") : normalized;
@@ -29,10 +41,10 @@ function getOccurrenceStartsInRange(event, rangeStart, rangeEnd, expansionLimit,
29
41
  if (!dtstart.isValid() || !event.recurrence) return [];
30
42
  try {
31
43
  const options = RRule.parseString(getRRuleString(event.recurrence.rrule));
32
- options.dtstart = dtstart.toDate();
44
+ options.dtstart = toWallClockDate(dtstart);
33
45
  const rule = new RRule(options);
34
- const searchStart = rangeStart.subtract(Math.max(0, durationMs), "millisecond").toDate();
35
- return rule.between(searchStart, rangeEnd.toDate(), true).slice(0, expansionLimit).map((value) => (0, dayjs.default)(value));
46
+ const searchStart = new Date(toWallClockDate(rangeStart).getTime() - Math.max(0, durationMs));
47
+ return rule.between(searchStart, toWallClockDate(rangeEnd), true).slice(0, expansionLimit);
36
48
  } catch {
37
49
  return [];
38
50
  }
@@ -43,8 +55,7 @@ function isEventInRange(event, rangeStart, rangeEnd) {
43
55
  if (!start.isValid() || !end.isValid()) return false;
44
56
  return overlapsRange(start, end, rangeStart, rangeEnd);
45
57
  }
46
- function createGeneratedInstance(event, occurrenceStart, durationMs) {
47
- const occurrenceEnd = occurrenceStart.add(durationMs, "millisecond");
58
+ function createGeneratedInstance(event, occurrenceStart, occurrenceEnd) {
48
59
  const recurrenceId = occurrenceStart.format("YYYY-MM-DD HH:mm:ss");
49
60
  const { recurrence, ...eventWithoutRecurrence } = event;
50
61
  return {
@@ -90,11 +101,12 @@ function expandRecurringEvents({ events, rangeStart, rangeEnd, expansionLimit =
90
101
  const eventStart = (0, dayjs.default)(event.recurrence?.dtstart || event.start);
91
102
  const eventEnd = (0, dayjs.default)(event.end);
92
103
  if (!eventStart.isValid() || !eventEnd.isValid()) continue;
93
- const durationMs = eventEnd.diff((0, dayjs.default)(event.start), "millisecond");
104
+ const durationMs = getWallClockDurationMs((0, dayjs.default)(event.start), eventEnd);
94
105
  if (durationMs < 0) continue;
95
106
  const exdate = getExdateSet(event.recurrence);
96
107
  const starts = getOccurrenceStartsInRange(event, start, end, expansionLimit, durationMs);
97
- for (const occurrenceStart of starts) {
108
+ for (const wallClockStart of starts) {
109
+ const occurrenceStart = fromWallClockDate(wallClockStart);
98
110
  const recurrenceId = occurrenceStart.format("YYYY-MM-DD HH:mm:ss");
99
111
  if (exdate.has(recurrenceId)) continue;
100
112
  const overrideKey = getRecurrenceKey(event.id, recurrenceId);
@@ -106,7 +118,7 @@ function expandRecurringEvents({ events, rangeStart, rangeEnd, expansionLimit =
106
118
  }
107
119
  continue;
108
120
  }
109
- const generated = createGeneratedInstance(event, occurrenceStart, durationMs);
121
+ const generated = createGeneratedInstance(event, occurrenceStart, fromWallClockDate(new Date(wallClockStart.getTime() + durationMs)));
110
122
  if (overlapsRange((0, dayjs.default)(generated.start), (0, dayjs.default)(generated.end), start, end)) output.push(require_validate_event.validateEvent(generated));
111
123
  }
112
124
  }
@@ -1 +1 @@
1
- {"version":3,"file":"expand-recurring-events.cjs","names":["rruleAll","validateEvent"],"sources":["../../../src/utils/expand-recurring-events/expand-recurring-events.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport * as rruleAll from 'rrule';\n\nconst RRule = (\n 'default' in rruleAll ? (rruleAll as any).default.RRule : rruleAll.RRule\n) as typeof rruleAll.RRule;\nimport { DateTimeStringValue, ScheduleEventData, ScheduleRecurrenceData } from '../../types';\nimport { validateEvent } from '../validate-event/validate-event';\n\ninterface ExpandRecurringEventsInput {\n events: ScheduleEventData[] | undefined;\n rangeStart: Date | string;\n rangeEnd: Date | string;\n expansionLimit?: number;\n}\n\nfunction getRecurrenceKey(recurringEventId: string | number, recurrenceId: DateTimeStringValue) {\n return `${recurringEventId}::${recurrenceId}`;\n}\n\nfunction overlapsRange(\n eventStart: dayjs.Dayjs,\n eventEnd: dayjs.Dayjs,\n rangeStart: dayjs.Dayjs,\n rangeEnd: dayjs.Dayjs\n) {\n return (\n (eventEnd.isAfter(rangeStart) || eventEnd.isSame(rangeStart)) &&\n (eventStart.isBefore(rangeEnd) || eventStart.isSame(rangeEnd))\n );\n}\n\nfunction getExdateSet(recurrence: ScheduleRecurrenceData | undefined) {\n if (!recurrence?.exdate) {\n return new Set<string>();\n }\n\n const values = recurrence.exdate\n .map((value) => dayjs(value))\n .filter((value) => value.isValid())\n .map((value) => value.format('YYYY-MM-DD HH:mm:ss'));\n\n return new Set(values);\n}\n\nfunction getRRuleString(rule: string) {\n const normalized = rule.trim();\n if (!normalized.includes('\\n')) {\n return normalized.startsWith('RRULE:') ? normalized.replace(/^RRULE:/, '') : normalized;\n }\n\n const rruleLine = normalized\n .split('\\n')\n .map((line) => line.trim())\n .find((line) => line.startsWith('RRULE:'));\n\n return rruleLine ? rruleLine.replace(/^RRULE:/, '') : normalized;\n}\n\nfunction getOccurrenceStartsInRange(\n event: ScheduleEventData,\n rangeStart: dayjs.Dayjs,\n rangeEnd: dayjs.Dayjs,\n expansionLimit: number,\n durationMs: number\n) {\n const dtstart = dayjs(event.recurrence?.dtstart || event.start);\n if (!dtstart.isValid() || !event.recurrence) {\n return [];\n }\n\n try {\n const options = RRule.parseString(getRRuleString(event.recurrence.rrule));\n options.dtstart = dtstart.toDate();\n const rule = new RRule(options);\n\n const searchStart = rangeStart.subtract(Math.max(0, durationMs), 'millisecond').toDate();\n const results = rule.between(searchStart, rangeEnd.toDate(), true);\n return results.slice(0, expansionLimit).map((value) => dayjs(value));\n } catch {\n return [];\n }\n}\n\nfunction isEventInRange(event: ScheduleEventData, rangeStart: dayjs.Dayjs, rangeEnd: dayjs.Dayjs) {\n const start = dayjs(event.start);\n const end = dayjs(event.end);\n\n if (!start.isValid() || !end.isValid()) {\n return false;\n }\n\n return overlapsRange(start, end, rangeStart, rangeEnd);\n}\n\nfunction createGeneratedInstance(\n event: ScheduleEventData,\n occurrenceStart: dayjs.Dayjs,\n durationMs: number\n): ScheduleEventData {\n const occurrenceEnd = occurrenceStart.add(durationMs, 'millisecond');\n const recurrenceId = occurrenceStart.format('YYYY-MM-DD HH:mm:ss');\n const { recurrence, ...eventWithoutRecurrence } = event;\n\n return {\n ...eventWithoutRecurrence,\n id: `${event.id}::${recurrenceId}`,\n start: occurrenceStart.format('YYYY-MM-DD HH:mm:ss'),\n end: occurrenceEnd.format('YYYY-MM-DD HH:mm:ss'),\n recurringEventId: event.id,\n recurrenceId,\n recurringInstance: {\n isRecurringInstance: true,\n recurringEventId: event.id,\n recurrenceId,\n originalStart: occurrenceStart.format('YYYY-MM-DD HH:mm:ss'),\n originalEnd: occurrenceEnd.format('YYYY-MM-DD HH:mm:ss'),\n },\n };\n}\n\nconst DEFAULT_EXPANSION_LIMIT = 2000;\n\nexport function expandRecurringEvents({\n events,\n rangeStart,\n rangeEnd,\n expansionLimit = DEFAULT_EXPANSION_LIMIT,\n}: ExpandRecurringEventsInput): ScheduleEventData[] {\n if (!events || events.length === 0) {\n return [];\n }\n\n const start = dayjs(rangeStart);\n const end = dayjs(rangeEnd);\n\n if (!start.isValid() || !end.isValid()) {\n return [];\n }\n\n const regularEvents: ScheduleEventData[] = [];\n const recurringEvents: ScheduleEventData[] = [];\n const overrides = new Map<string, ScheduleEventData>();\n\n for (const event of events) {\n if (event.recurringEventId && event.recurrenceId) {\n overrides.set(getRecurrenceKey(event.recurringEventId, event.recurrenceId), event);\n continue;\n }\n\n if (event.recurrence?.rrule) {\n recurringEvents.push(event);\n continue;\n }\n\n regularEvents.push(event);\n }\n\n const output: ScheduleEventData[] = [];\n const consumedOverrideIds = new Set<string | number>();\n\n for (const event of regularEvents) {\n if (isEventInRange(event, start, end)) {\n output.push(validateEvent(event));\n }\n }\n\n for (const event of recurringEvents) {\n const eventStart = dayjs(event.recurrence?.dtstart || event.start);\n const eventEnd = dayjs(event.end);\n\n if (!eventStart.isValid() || !eventEnd.isValid()) {\n continue;\n }\n\n const durationMs = eventEnd.diff(dayjs(event.start), 'millisecond');\n if (durationMs < 0) {\n continue;\n }\n\n const exdate = getExdateSet(event.recurrence);\n const starts = getOccurrenceStartsInRange(event, start, end, expansionLimit, durationMs);\n\n for (const occurrenceStart of starts) {\n const recurrenceId = occurrenceStart.format('YYYY-MM-DD HH:mm:ss');\n if (exdate.has(recurrenceId)) {\n continue;\n }\n\n const overrideKey = getRecurrenceKey(event.id, recurrenceId);\n const override = overrides.get(overrideKey);\n if (override) {\n if (isEventInRange(override, start, end)) {\n output.push(validateEvent(override));\n consumedOverrideIds.add(override.id);\n }\n continue;\n }\n\n const generated = createGeneratedInstance(event, occurrenceStart, durationMs);\n if (overlapsRange(dayjs(generated.start), dayjs(generated.end), start, end)) {\n output.push(validateEvent(generated));\n }\n }\n }\n\n for (const override of overrides.values()) {\n if (consumedOverrideIds.has(override.id)) {\n continue;\n }\n if (isEventInRange(override, start, end)) {\n output.push(validateEvent(override));\n }\n }\n\n return output;\n}\n\nexport { DEFAULT_EXPANSION_LIMIT };\n"],"mappings":"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"}
1
+ {"version":3,"file":"expand-recurring-events.cjs","names":["rruleAll","validateEvent"],"sources":["../../../src/utils/expand-recurring-events/expand-recurring-events.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport * as rruleAll from 'rrule';\n\nconst RRule = (\n 'default' in rruleAll ? (rruleAll as any).default.RRule : rruleAll.RRule\n) as typeof rruleAll.RRule;\nimport { DateTimeStringValue, ScheduleEventData, ScheduleRecurrenceData } from '../../types';\nimport { validateEvent } from '../validate-event/validate-event';\n\ninterface ExpandRecurringEventsInput {\n events: ScheduleEventData[] | undefined;\n rangeStart: Date | string;\n rangeEnd: Date | string;\n expansionLimit?: number;\n}\n\nfunction getRecurrenceKey(recurringEventId: string | number, recurrenceId: DateTimeStringValue) {\n return `${recurringEventId}::${recurrenceId}`;\n}\n\nfunction overlapsRange(\n eventStart: dayjs.Dayjs,\n eventEnd: dayjs.Dayjs,\n rangeStart: dayjs.Dayjs,\n rangeEnd: dayjs.Dayjs\n) {\n return (\n (eventEnd.isAfter(rangeStart) || eventEnd.isSame(rangeStart)) &&\n (eventStart.isBefore(rangeEnd) || eventStart.isSame(rangeEnd))\n );\n}\n\nfunction getExdateSet(recurrence: ScheduleRecurrenceData | undefined) {\n if (!recurrence?.exdate) {\n return new Set<string>();\n }\n\n const values = recurrence.exdate\n .map((value) => dayjs(value))\n .filter((value) => value.isValid())\n .map((value) => value.format('YYYY-MM-DD HH:mm:ss'));\n\n return new Set(values);\n}\n\nfunction toWallClockDate(value: dayjs.Dayjs) {\n return new Date(\n Date.UTC(\n value.year(),\n value.month(),\n value.date(),\n value.hour(),\n value.minute(),\n value.second(),\n value.millisecond()\n )\n );\n}\n\nfunction fromWallClockDate(value: Date) {\n const result = new Date(2000, 0, 1, 12);\n result.setFullYear(value.getUTCFullYear(), value.getUTCMonth(), value.getUTCDate());\n result.setHours(\n value.getUTCHours(),\n value.getUTCMinutes(),\n value.getUTCSeconds(),\n value.getUTCMilliseconds()\n );\n\n return dayjs(result);\n}\n\nfunction getWallClockDurationMs(start: dayjs.Dayjs, end: dayjs.Dayjs) {\n return toWallClockDate(end).getTime() - toWallClockDate(start).getTime();\n}\n\nfunction getRRuleString(rule: string) {\n const normalized = rule.trim();\n if (!normalized.includes('\\n')) {\n return normalized.startsWith('RRULE:') ? normalized.replace(/^RRULE:/, '') : normalized;\n }\n\n const rruleLine = normalized\n .split('\\n')\n .map((line) => line.trim())\n .find((line) => line.startsWith('RRULE:'));\n\n return rruleLine ? rruleLine.replace(/^RRULE:/, '') : normalized;\n}\n\nfunction getOccurrenceStartsInRange(\n event: ScheduleEventData,\n rangeStart: dayjs.Dayjs,\n rangeEnd: dayjs.Dayjs,\n expansionLimit: number,\n durationMs: number\n) {\n const dtstart = dayjs(event.recurrence?.dtstart || event.start);\n if (!dtstart.isValid() || !event.recurrence) {\n return [];\n }\n\n try {\n const options = RRule.parseString(getRRuleString(event.recurrence.rrule));\n options.dtstart = toWallClockDate(dtstart);\n const rule = new RRule(options);\n\n const searchStart = new Date(toWallClockDate(rangeStart).getTime() - Math.max(0, durationMs));\n const results = rule.between(searchStart, toWallClockDate(rangeEnd), true);\n return results.slice(0, expansionLimit);\n } catch {\n return [];\n }\n}\n\nfunction isEventInRange(event: ScheduleEventData, rangeStart: dayjs.Dayjs, rangeEnd: dayjs.Dayjs) {\n const start = dayjs(event.start);\n const end = dayjs(event.end);\n\n if (!start.isValid() || !end.isValid()) {\n return false;\n }\n\n return overlapsRange(start, end, rangeStart, rangeEnd);\n}\n\nfunction createGeneratedInstance(\n event: ScheduleEventData,\n occurrenceStart: dayjs.Dayjs,\n occurrenceEnd: dayjs.Dayjs\n): ScheduleEventData {\n const recurrenceId = occurrenceStart.format('YYYY-MM-DD HH:mm:ss');\n const { recurrence, ...eventWithoutRecurrence } = event;\n\n return {\n ...eventWithoutRecurrence,\n id: `${event.id}::${recurrenceId}`,\n start: occurrenceStart.format('YYYY-MM-DD HH:mm:ss'),\n end: occurrenceEnd.format('YYYY-MM-DD HH:mm:ss'),\n recurringEventId: event.id,\n recurrenceId,\n recurringInstance: {\n isRecurringInstance: true,\n recurringEventId: event.id,\n recurrenceId,\n originalStart: occurrenceStart.format('YYYY-MM-DD HH:mm:ss'),\n originalEnd: occurrenceEnd.format('YYYY-MM-DD HH:mm:ss'),\n },\n };\n}\n\nconst DEFAULT_EXPANSION_LIMIT = 2000;\n\nexport function expandRecurringEvents({\n events,\n rangeStart,\n rangeEnd,\n expansionLimit = DEFAULT_EXPANSION_LIMIT,\n}: ExpandRecurringEventsInput): ScheduleEventData[] {\n if (!events || events.length === 0) {\n return [];\n }\n\n const start = dayjs(rangeStart);\n const end = dayjs(rangeEnd);\n\n if (!start.isValid() || !end.isValid()) {\n return [];\n }\n\n const regularEvents: ScheduleEventData[] = [];\n const recurringEvents: ScheduleEventData[] = [];\n const overrides = new Map<string, ScheduleEventData>();\n\n for (const event of events) {\n if (event.recurringEventId && event.recurrenceId) {\n overrides.set(getRecurrenceKey(event.recurringEventId, event.recurrenceId), event);\n continue;\n }\n\n if (event.recurrence?.rrule) {\n recurringEvents.push(event);\n continue;\n }\n\n regularEvents.push(event);\n }\n\n const output: ScheduleEventData[] = [];\n const consumedOverrideIds = new Set<string | number>();\n\n for (const event of regularEvents) {\n if (isEventInRange(event, start, end)) {\n output.push(validateEvent(event));\n }\n }\n\n for (const event of recurringEvents) {\n const eventStart = dayjs(event.recurrence?.dtstart || event.start);\n const eventEnd = dayjs(event.end);\n\n if (!eventStart.isValid() || !eventEnd.isValid()) {\n continue;\n }\n\n const durationMs = getWallClockDurationMs(dayjs(event.start), eventEnd);\n if (durationMs < 0) {\n continue;\n }\n\n const exdate = getExdateSet(event.recurrence);\n const starts = getOccurrenceStartsInRange(event, start, end, expansionLimit, durationMs);\n\n for (const wallClockStart of starts) {\n const occurrenceStart = fromWallClockDate(wallClockStart);\n const recurrenceId = occurrenceStart.format('YYYY-MM-DD HH:mm:ss');\n if (exdate.has(recurrenceId)) {\n continue;\n }\n\n const overrideKey = getRecurrenceKey(event.id, recurrenceId);\n const override = overrides.get(overrideKey);\n if (override) {\n if (isEventInRange(override, start, end)) {\n output.push(validateEvent(override));\n consumedOverrideIds.add(override.id);\n }\n continue;\n }\n\n const occurrenceEnd = fromWallClockDate(new Date(wallClockStart.getTime() + durationMs));\n const generated = createGeneratedInstance(event, occurrenceStart, occurrenceEnd);\n if (overlapsRange(dayjs(generated.start), dayjs(generated.end), start, end)) {\n output.push(validateEvent(generated));\n }\n }\n }\n\n for (const override of overrides.values()) {\n if (consumedOverrideIds.has(override.id)) {\n continue;\n }\n if (isEventInRange(override, start, end)) {\n output.push(validateEvent(override));\n }\n }\n\n return output;\n}\n\nexport { DEFAULT_EXPANSION_LIMIT };\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"format-date.cjs","names":[],"sources":["../../../src/utils/format-date/format-date.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { DateLabelFormat } from '../../types';\n\nexport interface FormatDateInput {\n locale: string;\n date: string | Date | dayjs.Dayjs;\n format: DateLabelFormat;\n}\n\nexport function formatDate({ locale, date, format }: FormatDateInput) {\n if (typeof format === 'function') {\n return format(dayjs(date).format('YYYY-MM-DD HH:mm:ss'));\n }\n\n return dayjs(date).locale(locale).format(format);\n}\n"],"mappings":";;;;;AASA,SAAgB,WAAW,EAAE,QAAQ,MAAM,UAA2B;CACpE,IAAI,OAAO,WAAW,YACpB,OAAO,QAAA,GAAA,MAAA,QAAA,CAAa,IAAI,CAAC,CAAC,OAAO,qBAAqB,CAAC;CAGzD,QAAA,GAAA,MAAA,QAAA,CAAa,IAAI,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,OAAO,MAAM;AACjD"}
1
+ {"version":3,"file":"format-date.cjs","names":[],"sources":["../../../src/utils/format-date/format-date.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { DateLabelFormat } from '../../types';\n\nexport interface FormatDateInput {\n locale: string;\n date: string | Date | dayjs.Dayjs;\n format: DateLabelFormat;\n}\n\nexport function formatDate({ locale, date, format }: FormatDateInput) {\n if (typeof format === 'function') {\n return format(dayjs(date).format('YYYY-MM-DD HH:mm:ss'));\n }\n\n return dayjs(date).locale(locale).format(format);\n}\n"],"mappings":";;;;;AASA,SAAgB,WAAW,EAAE,QAAQ,MAAM,UAA2B;CACpE,IAAI,OAAO,WAAW,YACpB,OAAO,QAAA,GAAO,MAAA,QAAA,CAAM,IAAI,CAAC,CAAC,OAAO,qBAAqB,CAAC;CAGzD,QAAA,GAAO,MAAA,QAAA,CAAM,IAAI,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,OAAO,MAAM;AACjD"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-current-time-position.cjs","names":["clampIntervalMinutes"],"sources":["../../../src/utils/get-current-time-position/get-current-time-position.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { AnyDateValue } from '../../types';\nimport { clampIntervalMinutes } from '../clamp-interval-minutes/clamp-interval-minutes';\n\ninterface GetCurrentTimePositionInput {\n startTime?: string;\n endTime?: string;\n now?: AnyDateValue;\n\n /** Number of minutes per time slot. Used to align the indicator to whole slots when `endTime` does not divide evenly. */\n intervalMinutes?: number;\n}\n\nexport function getCurrentTimePosition(input?: GetCurrentTimePositionInput) {\n const now = dayjs(input?.now);\n\n if (!input?.startTime || !input?.endTime) {\n const startOf = now.startOf('date');\n const diffInMinutes = now.diff(startOf, 'minute');\n return (diffInMinutes / 1440) * 100;\n }\n\n const [startHour, startMinute, startSecond = 0] = input.startTime.split(':').map(Number);\n const [endHour, endMinute, endSecond = 0] = input.endTime.split(':').map(Number);\n\n const startOfDay = now.startOf('date');\n const startDateTime = startOfDay.hour(startHour).minute(startMinute).second(startSecond);\n const endDateTime = startOfDay.hour(endHour).minute(endMinute).second(endSecond);\n\n const literalSeconds = endDateTime.diff(startDateTime, 'second');\n const intervalSeconds =\n input.intervalMinutes !== undefined\n ? clampIntervalMinutes(input.intervalMinutes) * 60\n : undefined;\n const totalSeconds = intervalSeconds\n ? Math.ceil(literalSeconds / intervalSeconds) * intervalSeconds\n : literalSeconds;\n const currentSeconds = now.diff(startDateTime, 'second');\n\n return (currentSeconds / totalSeconds) * 100;\n}\n"],"mappings":";;;;;;AAaA,SAAgB,uBAAuB,OAAqC;CAC1E,MAAM,OAAA,GAAA,MAAA,QAAA,CAAY,OAAO,GAAG;CAE5B,IAAI,CAAC,OAAO,aAAa,CAAC,OAAO,SAAS;EACxC,MAAM,UAAU,IAAI,QAAQ,MAAM;EAElC,OADsB,IAAI,KAAK,SAAS,QACpB,IAAI,OAAQ;CAClC;CAEA,MAAM,CAAC,WAAW,aAAa,cAAc,KAAK,MAAM,UAAU,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM;CACvF,MAAM,CAAC,SAAS,WAAW,YAAY,KAAK,MAAM,QAAQ,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM;CAE/E,MAAM,aAAa,IAAI,QAAQ,MAAM;CACrC,MAAM,gBAAgB,WAAW,KAAK,SAAS,CAAC,CAAC,OAAO,WAAW,CAAC,CAAC,OAAO,WAAW;CAGvF,MAAM,iBAFc,WAAW,KAAK,OAAO,CAAC,CAAC,OAAO,SAAS,CAAC,CAAC,OAAO,SAErC,CAAC,CAAC,KAAK,eAAe,QAAQ;CAC/D,MAAM,kBACJ,MAAM,oBAAoB,KAAA,IACtBA,+BAAAA,qBAAqB,MAAM,eAAe,IAAI,KAC9C,KAAA;CACN,MAAM,eAAe,kBACjB,KAAK,KAAK,iBAAiB,eAAe,IAAI,kBAC9C;CAGJ,OAFuB,IAAI,KAAK,eAAe,QAE1B,IAAI,eAAgB;AAC3C"}
1
+ {"version":3,"file":"get-current-time-position.cjs","names":["clampIntervalMinutes"],"sources":["../../../src/utils/get-current-time-position/get-current-time-position.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { AnyDateValue } from '../../types';\nimport { clampIntervalMinutes } from '../clamp-interval-minutes/clamp-interval-minutes';\n\ninterface GetCurrentTimePositionInput {\n startTime?: string;\n endTime?: string;\n now?: AnyDateValue;\n\n /** Number of minutes per time slot. Used to align the indicator to whole slots when `endTime` does not divide evenly. */\n intervalMinutes?: number;\n}\n\nexport function getCurrentTimePosition(input?: GetCurrentTimePositionInput) {\n const now = dayjs(input?.now);\n\n if (!input?.startTime || !input?.endTime) {\n const startOf = now.startOf('date');\n const diffInMinutes = now.diff(startOf, 'minute');\n return (diffInMinutes / 1440) * 100;\n }\n\n const [startHour, startMinute, startSecond = 0] = input.startTime.split(':').map(Number);\n const [endHour, endMinute, endSecond = 0] = input.endTime.split(':').map(Number);\n\n const startOfDay = now.startOf('date');\n const startDateTime = startOfDay.hour(startHour).minute(startMinute).second(startSecond);\n const endDateTime = startOfDay.hour(endHour).minute(endMinute).second(endSecond);\n\n const literalSeconds = endDateTime.diff(startDateTime, 'second');\n const intervalSeconds =\n input.intervalMinutes !== undefined\n ? clampIntervalMinutes(input.intervalMinutes) * 60\n : undefined;\n const totalSeconds = intervalSeconds\n ? Math.ceil(literalSeconds / intervalSeconds) * intervalSeconds\n : literalSeconds;\n const currentSeconds = now.diff(startDateTime, 'second');\n\n return (currentSeconds / totalSeconds) * 100;\n}\n"],"mappings":";;;;;;AAaA,SAAgB,uBAAuB,OAAqC;CAC1E,MAAM,OAAA,GAAM,MAAA,QAAA,CAAM,OAAO,GAAG;CAE5B,IAAI,CAAC,OAAO,aAAa,CAAC,OAAO,SAAS;EACxC,MAAM,UAAU,IAAI,QAAQ,MAAM;EAElC,OADsB,IAAI,KAAK,SAAS,QACpB,IAAI,OAAQ;CAClC;CAEA,MAAM,CAAC,WAAW,aAAa,cAAc,KAAK,MAAM,UAAU,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM;CACvF,MAAM,CAAC,SAAS,WAAW,YAAY,KAAK,MAAM,QAAQ,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM;CAE/E,MAAM,aAAa,IAAI,QAAQ,MAAM;CACrC,MAAM,gBAAgB,WAAW,KAAK,SAAS,CAAC,CAAC,OAAO,WAAW,CAAC,CAAC,OAAO,WAAW;CAGvF,MAAM,iBAFc,WAAW,KAAK,OAAO,CAAC,CAAC,OAAO,SAAS,CAAC,CAAC,OAAO,SAErC,CAAC,CAAC,KAAK,eAAe,QAAQ;CAC/D,MAAM,kBACJ,MAAM,oBAAoB,KAAA,IACtBA,+BAAAA,qBAAqB,MAAM,eAAe,IAAI,KAC9C,KAAA;CACN,MAAM,eAAe,kBACjB,KAAK,KAAK,iBAAiB,eAAe,IAAI,kBAC9C;CAGJ,OAFuB,IAAI,KAAK,eAAe,QAE1B,IAAI,eAAgB;AAC3C"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-day-position.cjs","names":["parseTimeString","clampIntervalMinutes"],"sources":["../../../src/utils/get-day-position/get-day-position.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { ScheduleEventData } from '../../types';\nimport { clampIntervalMinutes } from '../clamp-interval-minutes/clamp-interval-minutes';\nimport { parseTimeString } from '../parse-time-string/parse-time-string';\n\ninterface GetDayPositionInput {\n /** Event data to calculate position for */\n event: ScheduleEventData;\n\n /** Start time boundary for the day in HH:mm:ss format, `00:00:00` by default */\n startTime?: string;\n\n /** End time boundary for the day in HH:mm:ss format, `23:59:59` by default */\n endTime?: string;\n\n /** Number of minutes per time slot, `60` by default. Used to align the canvas to whole slots when `endTime` does not divide evenly. */\n intervalMinutes?: number;\n}\n\n/** Calculates day position within given start and end time boundaries. Returns top and height in percentages. */\nexport function getDayPosition({\n event,\n startTime = '00:00:00',\n endTime = '23:59:59',\n intervalMinutes = 60,\n}: GetDayPositionInput) {\n const eventStart = dayjs(event.start);\n const eventEnd = dayjs(event.end);\n\n const parsedStartTime = parseTimeString(startTime);\n const parsedEndTime = parseTimeString(endTime);\n\n const startOfDay = eventStart.startOf('date');\n const boundaryStart = startOfDay\n .hour(parsedStartTime.hours)\n .minute(parsedStartTime.minutes)\n .second(parsedStartTime.seconds);\n const literalEnd = startOfDay\n .hour(parsedEndTime.hours)\n .minute(parsedEndTime.minutes)\n .second(parsedEndTime.seconds);\n\n const intervalSeconds = clampIntervalMinutes(intervalMinutes) * 60;\n const literalRangeSeconds = literalEnd.diff(boundaryStart, 'second');\n const totalSeconds = Math.ceil(literalRangeSeconds / intervalSeconds) * intervalSeconds;\n\n const clippedEventStart = eventStart.isBefore(boundaryStart) ? boundaryStart : eventStart;\n const eventStartSeconds = clippedEventStart.diff(boundaryStart, 'second');\n\n const clippedEventEnd = eventEnd.isAfter(literalEnd) ? literalEnd : eventEnd;\n const eventEndSeconds = clippedEventEnd.diff(boundaryStart, 'second');\n\n const startPercent = (eventStartSeconds / totalSeconds) * 100;\n const endPercent = (eventEndSeconds / totalSeconds) * 100;\n\n return {\n top: startPercent,\n height: endPercent - startPercent,\n };\n}\n"],"mappings":";;;;;;;;AAoBA,SAAgB,eAAe,EAC7B,OACA,YAAY,YACZ,UAAU,YACV,kBAAkB,MACI;CACtB,MAAM,cAAA,GAAA,MAAA,QAAA,CAAmB,MAAM,KAAK;CACpC,MAAM,YAAA,GAAA,MAAA,QAAA,CAAiB,MAAM,GAAG;CAEhC,MAAM,kBAAkBA,0BAAAA,gBAAgB,SAAS;CACjD,MAAM,gBAAgBA,0BAAAA,gBAAgB,OAAO;CAE7C,MAAM,aAAa,WAAW,QAAQ,MAAM;CAC5C,MAAM,gBAAgB,WACnB,KAAK,gBAAgB,KAAK,CAAC,CAC3B,OAAO,gBAAgB,OAAO,CAAC,CAC/B,OAAO,gBAAgB,OAAO;CACjC,MAAM,aAAa,WAChB,KAAK,cAAc,KAAK,CAAC,CACzB,OAAO,cAAc,OAAO,CAAC,CAC7B,OAAO,cAAc,OAAO;CAE/B,MAAM,kBAAkBC,+BAAAA,qBAAqB,eAAe,IAAI;CAChE,MAAM,sBAAsB,WAAW,KAAK,eAAe,QAAQ;CACnE,MAAM,eAAe,KAAK,KAAK,sBAAsB,eAAe,IAAI;CAGxE,MAAM,qBADoB,WAAW,SAAS,aAAa,IAAI,gBAAgB,WAAA,CACnC,KAAK,eAAe,QAAQ;CAGxE,MAAM,mBADkB,SAAS,QAAQ,UAAU,IAAI,aAAa,SAAA,CAC5B,KAAK,eAAe,QAAQ;CAEpE,MAAM,eAAgB,oBAAoB,eAAgB;CAG1D,OAAO;EACL,KAAK;EACL,QAJkB,kBAAkB,eAAgB,MAI/B;CACvB;AACF"}
1
+ {"version":3,"file":"get-day-position.cjs","names":["parseTimeString","clampIntervalMinutes"],"sources":["../../../src/utils/get-day-position/get-day-position.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { ScheduleEventData } from '../../types';\nimport { clampIntervalMinutes } from '../clamp-interval-minutes/clamp-interval-minutes';\nimport { parseTimeString } from '../parse-time-string/parse-time-string';\n\ninterface GetDayPositionInput {\n /** Event data to calculate position for */\n event: ScheduleEventData;\n\n /** Start time boundary for the day in HH:mm:ss format, `00:00:00` by default */\n startTime?: string;\n\n /** End time boundary for the day in HH:mm:ss format, `23:59:59` by default */\n endTime?: string;\n\n /** Number of minutes per time slot, `60` by default. Used to align the canvas to whole slots when `endTime` does not divide evenly. */\n intervalMinutes?: number;\n}\n\n/** Calculates day position within given start and end time boundaries. Returns top and height in percentages. */\nexport function getDayPosition({\n event,\n startTime = '00:00:00',\n endTime = '23:59:59',\n intervalMinutes = 60,\n}: GetDayPositionInput) {\n const eventStart = dayjs(event.start);\n const eventEnd = dayjs(event.end);\n\n const parsedStartTime = parseTimeString(startTime);\n const parsedEndTime = parseTimeString(endTime);\n\n const startOfDay = eventStart.startOf('date');\n const boundaryStart = startOfDay\n .hour(parsedStartTime.hours)\n .minute(parsedStartTime.minutes)\n .second(parsedStartTime.seconds);\n const literalEnd = startOfDay\n .hour(parsedEndTime.hours)\n .minute(parsedEndTime.minutes)\n .second(parsedEndTime.seconds);\n\n const intervalSeconds = clampIntervalMinutes(intervalMinutes) * 60;\n const literalRangeSeconds = literalEnd.diff(boundaryStart, 'second');\n const totalSeconds = Math.ceil(literalRangeSeconds / intervalSeconds) * intervalSeconds;\n\n const clippedEventStart = eventStart.isBefore(boundaryStart) ? boundaryStart : eventStart;\n const eventStartSeconds = clippedEventStart.diff(boundaryStart, 'second');\n\n const clippedEventEnd = eventEnd.isAfter(literalEnd) ? literalEnd : eventEnd;\n const eventEndSeconds = clippedEventEnd.diff(boundaryStart, 'second');\n\n const startPercent = (eventStartSeconds / totalSeconds) * 100;\n const endPercent = (eventEndSeconds / totalSeconds) * 100;\n\n return {\n top: startPercent,\n height: endPercent - startPercent,\n };\n}\n"],"mappings":";;;;;;;;AAoBA,SAAgB,eAAe,EAC7B,OACA,YAAY,YACZ,UAAU,YACV,kBAAkB,MACI;CACtB,MAAM,cAAA,GAAa,MAAA,QAAA,CAAM,MAAM,KAAK;CACpC,MAAM,YAAA,GAAW,MAAA,QAAA,CAAM,MAAM,GAAG;CAEhC,MAAM,kBAAkBA,0BAAAA,gBAAgB,SAAS;CACjD,MAAM,gBAAgBA,0BAAAA,gBAAgB,OAAO;CAE7C,MAAM,aAAa,WAAW,QAAQ,MAAM;CAC5C,MAAM,gBAAgB,WACnB,KAAK,gBAAgB,KAAK,CAAC,CAC3B,OAAO,gBAAgB,OAAO,CAAC,CAC/B,OAAO,gBAAgB,OAAO;CACjC,MAAM,aAAa,WAChB,KAAK,cAAc,KAAK,CAAC,CACzB,OAAO,cAAc,OAAO,CAAC,CAC7B,OAAO,cAAc,OAAO;CAE/B,MAAM,kBAAkBC,+BAAAA,qBAAqB,eAAe,IAAI;CAChE,MAAM,sBAAsB,WAAW,KAAK,eAAe,QAAQ;CACnE,MAAM,eAAe,KAAK,KAAK,sBAAsB,eAAe,IAAI;CAGxE,MAAM,qBADoB,WAAW,SAAS,aAAa,IAAI,gBAAgB,WAAA,CACnC,KAAK,eAAe,QAAQ;CAGxE,MAAM,mBADkB,SAAS,QAAQ,UAAU,IAAI,aAAa,SAAA,CAC5B,KAAK,eAAe,QAAQ;CAEpE,MAAM,eAAgB,oBAAoB,eAAgB;CAG1D,OAAO;EACL,KAAK;EACL,QAJkB,kBAAkB,eAAgB,MAI/B;CACvB;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-end-of-week.cjs","names":[],"sources":["../../../src/utils/get-end-of-week/get-end-of-week.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { AnyDateValue, DayOfWeek } from '../../types';\n\nexport function getEndOfWeek(date: AnyDateValue, firstDayOfWeek: DayOfWeek = 1) {\n let value = dayjs(date);\n\n if (!value.isValid()) {\n return value;\n }\n\n const lastDayOfWeek = firstDayOfWeek === 0 ? 6 : firstDayOfWeek - 1;\n while (value.day() !== lastDayOfWeek) {\n value = value.add(1, 'day');\n }\n\n return value.format('YYYY-MM-DD');\n}\n"],"mappings":";;;;;AAGA,SAAgB,aAAa,MAAoB,iBAA4B,GAAG;CAC9E,IAAI,SAAA,GAAA,MAAA,QAAA,CAAc,IAAI;CAEtB,IAAI,CAAC,MAAM,QAAQ,GACjB,OAAO;CAGT,MAAM,gBAAgB,mBAAmB,IAAI,IAAI,iBAAiB;CAClE,OAAO,MAAM,IAAI,MAAM,eACrB,QAAQ,MAAM,IAAI,GAAG,KAAK;CAG5B,OAAO,MAAM,OAAO,YAAY;AAClC"}
1
+ {"version":3,"file":"get-end-of-week.cjs","names":[],"sources":["../../../src/utils/get-end-of-week/get-end-of-week.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { AnyDateValue, DayOfWeek } from '../../types';\n\nexport function getEndOfWeek(date: AnyDateValue, firstDayOfWeek: DayOfWeek = 1) {\n let value = dayjs(date);\n\n if (!value.isValid()) {\n return value;\n }\n\n const lastDayOfWeek = firstDayOfWeek === 0 ? 6 : firstDayOfWeek - 1;\n while (value.day() !== lastDayOfWeek) {\n value = value.add(1, 'day');\n }\n\n return value.format('YYYY-MM-DD');\n}\n"],"mappings":";;;;;AAGA,SAAgB,aAAa,MAAoB,iBAA4B,GAAG;CAC9E,IAAI,SAAA,GAAQ,MAAA,QAAA,CAAM,IAAI;CAEtB,IAAI,CAAC,MAAM,QAAQ,GACjB,OAAO;CAGT,MAAM,gBAAgB,mBAAmB,IAAI,IAAI,iBAAiB;CAClE,OAAO,MAAM,IAAI,MAAM,eACrB,QAAQ,MAAM,IAAI,GAAG,KAAK;CAG5B,OAAO,MAAM,OAAO,YAAY;AAClC"}
@@ -6,9 +6,11 @@ let dayjs = require("dayjs");
6
6
  dayjs = require_runtime.__toESM(dayjs);
7
7
  //#region packages/@mantine/schedule/src/utils/get-month-days/get-month-days.ts
8
8
  function getMonthDays({ month, firstDayOfWeek = 1, consistentWeeks }) {
9
- const start = (0, dayjs.default)((0, dayjs.default)(month).subtract((0, dayjs.default)(month).date() - 1, "day").format("YYYY-MM-DD"));
9
+ const day = (0, dayjs.default)(month).subtract((0, dayjs.default)(month).date() - 1, "day");
10
+ const start = (0, dayjs.default)(day.format("YYYY-MM-DD"));
10
11
  const startOfMonth = start.format("YYYY-MM-DD");
11
- const endDate = require_get_end_of_week.getEndOfWeek(start.add(+start.daysInMonth() - 1, "day").format("YYYY-MM-DD"), firstDayOfWeek);
12
+ const endOfMonth = start.add(+start.daysInMonth() - 1, "day").format("YYYY-MM-DD");
13
+ const endDate = require_get_end_of_week.getEndOfWeek(endOfMonth, firstDayOfWeek);
12
14
  const weeks = [];
13
15
  let date = (0, dayjs.default)(require_get_start_of_week.getStartOfWeek({
14
16
  date: startOfMonth,
@@ -1 +1 @@
1
- {"version":3,"file":"get-month-days.cjs","names":["getEndOfWeek","getStartOfWeek"],"sources":["../../../src/utils/get-month-days/get-month-days.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { AnyDateValue, DateStringValue, DayOfWeek } from '../../types';\nimport { getEndOfWeek } from '../get-end-of-week/get-end-of-week';\nimport { getStartOfWeek } from '../get-start-of-week/get-start-of-week';\n\ninterface GetMonthDaysInput {\n month: AnyDateValue;\n firstDayOfWeek: DayOfWeek | undefined;\n consistentWeeks: boolean | undefined;\n}\n\nexport function getMonthDays({\n month,\n firstDayOfWeek = 1,\n consistentWeeks,\n}: GetMonthDaysInput): DateStringValue[][] {\n const day = dayjs(month).subtract(dayjs(month).date() - 1, 'day');\n const start = dayjs(day.format('YYYY-MM-DD'));\n const startOfMonth = start.format('YYYY-MM-DD');\n const endOfMonth = start.add(+start.daysInMonth() - 1, 'day').format('YYYY-MM-DD');\n const endDate = getEndOfWeek(endOfMonth, firstDayOfWeek);\n const weeks: DateStringValue[][] = [];\n\n let date = dayjs(getStartOfWeek({ date: startOfMonth, firstDayOfWeek }));\n\n while (dayjs(date).isBefore(endDate, 'day')) {\n const days: DateStringValue[] = [];\n\n for (let i = 0; i < 7; i += 1) {\n days.push(date.format('YYYY-MM-DD 00:00:00'));\n date = date.add(1, 'day');\n }\n\n weeks.push(days);\n }\n\n if (consistentWeeks && weeks.length < 6) {\n const lastWeek = weeks[weeks.length - 1];\n const lastDay = lastWeek[lastWeek.length - 1];\n let nextDay = dayjs(lastDay).add(1, 'day');\n\n while (weeks.length < 6) {\n const days: DateStringValue[] = [];\n\n for (let i = 0; i < 7; i += 1) {\n days.push(nextDay.format('YYYY-MM-DD 00:00:00'));\n nextDay = nextDay.add(1, 'day');\n }\n\n weeks.push(days);\n }\n }\n\n return weeks;\n}\n"],"mappings":";;;;;;;AAWA,SAAgB,aAAa,EAC3B,OACA,iBAAiB,GACjB,mBACyC;CAEzC,MAAM,SAAA,GAAA,MAAA,QAAA,EAAA,GAAA,MAAA,QAAA,CADY,KAAK,CAAC,CAAC,UAAA,GAAA,MAAA,QAAA,CAAe,KAAK,CAAC,CAAC,KAAK,IAAI,GAAG,KACrC,CAAC,CAAC,OAAO,YAAY,CAAC;CAC5C,MAAM,eAAe,MAAM,OAAO,YAAY;CAE9C,MAAM,UAAUA,wBAAAA,aADG,MAAM,IAAI,CAAC,MAAM,YAAY,IAAI,GAAG,KAAK,CAAC,CAAC,OAAO,YAC/B,GAAG,cAAc;CACvD,MAAM,QAA6B,CAAC;CAEpC,IAAI,QAAA,GAAA,MAAA,QAAA,CAAaC,0BAAAA,eAAe;EAAE,MAAM;EAAc;CAAe,CAAC,CAAC;CAEvE,QAAA,GAAA,MAAA,QAAA,CAAa,IAAI,CAAC,CAAC,SAAS,SAAS,KAAK,GAAG;EAC3C,MAAM,OAA0B,CAAC;EAEjC,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG;GAC7B,KAAK,KAAK,KAAK,OAAO,qBAAqB,CAAC;GAC5C,OAAO,KAAK,IAAI,GAAG,KAAK;EAC1B;EAEA,MAAM,KAAK,IAAI;CACjB;CAEA,IAAI,mBAAmB,MAAM,SAAS,GAAG;EACvC,MAAM,WAAW,MAAM,MAAM,SAAS;EACtC,MAAM,UAAU,SAAS,SAAS,SAAS;EAC3C,IAAI,WAAA,GAAA,MAAA,QAAA,CAAgB,OAAO,CAAC,CAAC,IAAI,GAAG,KAAK;EAEzC,OAAO,MAAM,SAAS,GAAG;GACvB,MAAM,OAA0B,CAAC;GAEjC,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG;IAC7B,KAAK,KAAK,QAAQ,OAAO,qBAAqB,CAAC;IAC/C,UAAU,QAAQ,IAAI,GAAG,KAAK;GAChC;GAEA,MAAM,KAAK,IAAI;EACjB;CACF;CAEA,OAAO;AACT"}
1
+ {"version":3,"file":"get-month-days.cjs","names":["getEndOfWeek","getStartOfWeek"],"sources":["../../../src/utils/get-month-days/get-month-days.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { AnyDateValue, DateStringValue, DayOfWeek } from '../../types';\nimport { getEndOfWeek } from '../get-end-of-week/get-end-of-week';\nimport { getStartOfWeek } from '../get-start-of-week/get-start-of-week';\n\ninterface GetMonthDaysInput {\n month: AnyDateValue;\n firstDayOfWeek: DayOfWeek | undefined;\n consistentWeeks: boolean | undefined;\n}\n\nexport function getMonthDays({\n month,\n firstDayOfWeek = 1,\n consistentWeeks,\n}: GetMonthDaysInput): DateStringValue[][] {\n const day = dayjs(month).subtract(dayjs(month).date() - 1, 'day');\n const start = dayjs(day.format('YYYY-MM-DD'));\n const startOfMonth = start.format('YYYY-MM-DD');\n const endOfMonth = start.add(+start.daysInMonth() - 1, 'day').format('YYYY-MM-DD');\n const endDate = getEndOfWeek(endOfMonth, firstDayOfWeek);\n const weeks: DateStringValue[][] = [];\n\n let date = dayjs(getStartOfWeek({ date: startOfMonth, firstDayOfWeek }));\n\n while (dayjs(date).isBefore(endDate, 'day')) {\n const days: DateStringValue[] = [];\n\n for (let i = 0; i < 7; i += 1) {\n days.push(date.format('YYYY-MM-DD 00:00:00'));\n date = date.add(1, 'day');\n }\n\n weeks.push(days);\n }\n\n if (consistentWeeks && weeks.length < 6) {\n const lastWeek = weeks[weeks.length - 1];\n const lastDay = lastWeek[lastWeek.length - 1];\n let nextDay = dayjs(lastDay).add(1, 'day');\n\n while (weeks.length < 6) {\n const days: DateStringValue[] = [];\n\n for (let i = 0; i < 7; i += 1) {\n days.push(nextDay.format('YYYY-MM-DD 00:00:00'));\n nextDay = nextDay.add(1, 'day');\n }\n\n weeks.push(days);\n }\n }\n\n return weeks;\n}\n"],"mappings":";;;;;;;AAWA,SAAgB,aAAa,EAC3B,OACA,iBAAiB,GACjB,mBACyC;CACzC,MAAM,OAAA,GAAM,MAAA,QAAA,CAAM,KAAK,CAAC,CAAC,UAAA,GAAS,MAAA,QAAA,CAAM,KAAK,CAAC,CAAC,KAAK,IAAI,GAAG,KAAK;CAChE,MAAM,SAAA,GAAQ,MAAA,QAAA,CAAM,IAAI,OAAO,YAAY,CAAC;CAC5C,MAAM,eAAe,MAAM,OAAO,YAAY;CAC9C,MAAM,aAAa,MAAM,IAAI,CAAC,MAAM,YAAY,IAAI,GAAG,KAAK,CAAC,CAAC,OAAO,YAAY;CACjF,MAAM,UAAUA,wBAAAA,aAAa,YAAY,cAAc;CACvD,MAAM,QAA6B,CAAC;CAEpC,IAAI,QAAA,GAAO,MAAA,QAAA,CAAMC,0BAAAA,eAAe;EAAE,MAAM;EAAc;CAAe,CAAC,CAAC;CAEvE,QAAA,GAAO,MAAA,QAAA,CAAM,IAAI,CAAC,CAAC,SAAS,SAAS,KAAK,GAAG;EAC3C,MAAM,OAA0B,CAAC;EAEjC,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG;GAC7B,KAAK,KAAK,KAAK,OAAO,qBAAqB,CAAC;GAC5C,OAAO,KAAK,IAAI,GAAG,KAAK;EAC1B;EAEA,MAAM,KAAK,IAAI;CACjB;CAEA,IAAI,mBAAmB,MAAM,SAAS,GAAG;EACvC,MAAM,WAAW,MAAM,MAAM,SAAS;EACtC,MAAM,UAAU,SAAS,SAAS,SAAS;EAC3C,IAAI,WAAA,GAAU,MAAA,QAAA,CAAM,OAAO,CAAC,CAAC,IAAI,GAAG,KAAK;EAEzC,OAAO,MAAM,SAAS,GAAG;GACvB,MAAM,OAA0B,CAAC;GAEjC,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG;IAC7B,KAAK,KAAK,QAAQ,OAAO,qBAAqB,CAAC;IAC/C,UAAU,QAAQ,IAAI,GAAG,KAAK;GAChC;GAEA,MAAM,KAAK,IAAI;EACjB;CACF;CAEA,OAAO;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-month-range.cjs","names":["toDateString","getMonthDays"],"sources":["../../../src/utils/get-month-range/get-month-range.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { AnyDateValue, DayOfWeek } from '../../types';\nimport { getMonthDays } from '../get-month-days/get-month-days';\nimport { toDateString } from '../to-date-string/to-date-string';\n\ninterface GetMonthRangeInput {\n month: AnyDateValue;\n withOutsideDays: boolean | undefined;\n consistentWeeks: boolean | undefined;\n firstDayOfWeek: DayOfWeek;\n}\n\n/** Returns start and end dates as displayed in MonthView */\nexport function getMonthRange({\n month,\n withOutsideDays,\n consistentWeeks,\n firstDayOfWeek,\n}: GetMonthRangeInput) {\n if (!withOutsideDays) {\n return {\n start: toDateString(dayjs(month).startOf('month')),\n end: toDateString(dayjs(month).endOf('month')),\n };\n }\n\n const days = getMonthDays({ month, firstDayOfWeek, consistentWeeks });\n\n return {\n start: days[0][0],\n end: days[days.length - 1][6],\n };\n}\n"],"mappings":";;;;;;;;AAaA,SAAgB,cAAc,EAC5B,OACA,iBACA,iBACA,kBACqB;CACrB,IAAI,CAAC,iBACH,OAAO;EACL,OAAOA,uBAAAA,cAAAA,GAAAA,MAAAA,QAAAA,CAAmB,KAAK,CAAC,CAAC,QAAQ,OAAO,CAAC;EACjD,KAAKA,uBAAAA,cAAAA,GAAAA,MAAAA,QAAAA,CAAmB,KAAK,CAAC,CAAC,MAAM,OAAO,CAAC;CAC/C;CAGF,MAAM,OAAOC,uBAAAA,aAAa;EAAE;EAAO;EAAgB;CAAgB,CAAC;CAEpE,OAAO;EACL,OAAO,KAAK,EAAE,CAAC;EACf,KAAK,KAAK,KAAK,SAAS,EAAE,CAAC;CAC7B;AACF"}
1
+ {"version":3,"file":"get-month-range.cjs","names":["toDateString","getMonthDays"],"sources":["../../../src/utils/get-month-range/get-month-range.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { AnyDateValue, DayOfWeek } from '../../types';\nimport { getMonthDays } from '../get-month-days/get-month-days';\nimport { toDateString } from '../to-date-string/to-date-string';\n\ninterface GetMonthRangeInput {\n month: AnyDateValue;\n withOutsideDays: boolean | undefined;\n consistentWeeks: boolean | undefined;\n firstDayOfWeek: DayOfWeek;\n}\n\n/** Returns start and end dates as displayed in MonthView */\nexport function getMonthRange({\n month,\n withOutsideDays,\n consistentWeeks,\n firstDayOfWeek,\n}: GetMonthRangeInput) {\n if (!withOutsideDays) {\n return {\n start: toDateString(dayjs(month).startOf('month')),\n end: toDateString(dayjs(month).endOf('month')),\n };\n }\n\n const days = getMonthDays({ month, firstDayOfWeek, consistentWeeks });\n\n return {\n start: days[0][0],\n end: days[days.length - 1][6],\n };\n}\n"],"mappings":";;;;;;;;AAaA,SAAgB,cAAc,EAC5B,OACA,iBACA,iBACA,kBACqB;CACrB,IAAI,CAAC,iBACH,OAAO;EACL,OAAOA,uBAAAA,cAAAA,GAAa,MAAA,QAAA,CAAM,KAAK,CAAC,CAAC,QAAQ,OAAO,CAAC;EACjD,KAAKA,uBAAAA,cAAAA,GAAa,MAAA,QAAA,CAAM,KAAK,CAAC,CAAC,MAAM,OAAO,CAAC;CAC/C;CAGF,MAAM,OAAOC,uBAAAA,aAAa;EAAE;EAAO;EAAgB;CAAgB,CAAC;CAEpE,OAAO;EACL,OAAO,KAAK,EAAE,CAAC;EACf,KAAK,KAAK,KAAK,SAAS,EAAE,CAAC;CAC7B;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-months-by-quarter.cjs","names":[],"sources":["../../../src/utils/get-months-by-quarter/get-months-by-quarter.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { AnyDateValue, DateStringValue } from '../../types';\n\nexport function getMonthsByQuarter(year: AnyDateValue) {\n const startOfYear = dayjs(year).startOf('year').toDate();\n\n const results: DateStringValue[][] = [[], [], [], []];\n let currentMonthIndex = 0;\n\n for (let i = 0; i < 4; i += 1) {\n for (let j = 0; j < 3; j += 1) {\n results[i].push(dayjs(startOfYear).add(currentMonthIndex, 'months').format('YYYY-MM-DD'));\n currentMonthIndex += 1;\n }\n }\n\n return results;\n}\n"],"mappings":";;;;;AAGA,SAAgB,mBAAmB,MAAoB;CACrD,MAAM,eAAA,GAAA,MAAA,QAAA,CAAoB,IAAI,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,OAAO;CAEvD,MAAM,UAA+B;EAAC,CAAC;EAAG,CAAC;EAAG,CAAC;EAAG,CAAC;CAAC;CACpD,IAAI,oBAAoB;CAExB,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,GAC1B,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG;EAC7B,QAAQ,EAAE,CAAC,MAAA,GAAA,MAAA,QAAA,CAAW,WAAW,CAAC,CAAC,IAAI,mBAAmB,QAAQ,CAAC,CAAC,OAAO,YAAY,CAAC;EACxF,qBAAqB;CACvB;CAGF,OAAO;AACT"}
1
+ {"version":3,"file":"get-months-by-quarter.cjs","names":[],"sources":["../../../src/utils/get-months-by-quarter/get-months-by-quarter.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { AnyDateValue, DateStringValue } from '../../types';\n\nexport function getMonthsByQuarter(year: AnyDateValue) {\n const startOfYear = dayjs(year).startOf('year').toDate();\n\n const results: DateStringValue[][] = [[], [], [], []];\n let currentMonthIndex = 0;\n\n for (let i = 0; i < 4; i += 1) {\n for (let j = 0; j < 3; j += 1) {\n results[i].push(dayjs(startOfYear).add(currentMonthIndex, 'months').format('YYYY-MM-DD'));\n currentMonthIndex += 1;\n }\n }\n\n return results;\n}\n"],"mappings":";;;;;AAGA,SAAgB,mBAAmB,MAAoB;CACrD,MAAM,eAAA,GAAc,MAAA,QAAA,CAAM,IAAI,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,OAAO;CAEvD,MAAM,UAA+B;EAAC,CAAC;EAAG,CAAC;EAAG,CAAC;EAAG,CAAC;CAAC;CACpD,IAAI,oBAAoB;CAExB,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,GAC1B,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG;EAC7B,QAAQ,EAAE,CAAC,MAAA,GAAK,MAAA,QAAA,CAAM,WAAW,CAAC,CAAC,IAAI,mBAAmB,QAAQ,CAAC,CAAC,OAAO,YAAY,CAAC;EACxF,qBAAqB;CACvB;CAGF,OAAO;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-months-list.cjs","names":["formatDate"],"sources":["../../../src/utils/get-months-list/get-months-list.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { DateLabelFormat } from '../../types';\nimport { formatDate } from '../format-date/format-date';\n\ninterface GetMonthsListInput {\n locale: string;\n format: DateLabelFormat;\n}\n\ninterface MonthData {\n month: number;\n name: string;\n}\n\nexport function getMonthsList({ locale, format }: GetMonthsListInput) {\n const months: MonthData[] = [];\n const date = dayjs().locale(locale).startOf('year');\n\n for (let i = 0; i < 12; i++) {\n months.push({ month: i, name: formatDate({ date: date.add(i, 'month'), format, locale }) });\n }\n\n return months;\n}\n"],"mappings":";;;;;;AAcA,SAAgB,cAAc,EAAE,QAAQ,UAA8B;CACpE,MAAM,SAAsB,CAAC;CAC7B,MAAM,QAAA,GAAA,MAAA,QAAA,CAAa,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,QAAQ,MAAM;CAElD,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KACtB,OAAO,KAAK;EAAE,OAAO;EAAG,MAAMA,oBAAAA,WAAW;GAAE,MAAM,KAAK,IAAI,GAAG,OAAO;GAAG;GAAQ;EAAO,CAAC;CAAE,CAAC;CAG5F,OAAO;AACT"}
1
+ {"version":3,"file":"get-months-list.cjs","names":["formatDate"],"sources":["../../../src/utils/get-months-list/get-months-list.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { DateLabelFormat } from '../../types';\nimport { formatDate } from '../format-date/format-date';\n\ninterface GetMonthsListInput {\n locale: string;\n format: DateLabelFormat;\n}\n\ninterface MonthData {\n month: number;\n name: string;\n}\n\nexport function getMonthsList({ locale, format }: GetMonthsListInput) {\n const months: MonthData[] = [];\n const date = dayjs().locale(locale).startOf('year');\n\n for (let i = 0; i < 12; i++) {\n months.push({ month: i, name: formatDate({ date: date.add(i, 'month'), format, locale }) });\n }\n\n return months;\n}\n"],"mappings":";;;;;;AAcA,SAAgB,cAAc,EAAE,QAAQ,UAA8B;CACpE,MAAM,SAAsB,CAAC;CAC7B,MAAM,QAAA,GAAO,MAAA,QAAA,CAAM,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,QAAQ,MAAM;CAElD,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KACtB,OAAO,KAAK;EAAE,OAAO;EAAG,MAAMA,oBAAAA,WAAW;GAAE,MAAM,KAAK,IAAI,GAAG,OAAO;GAAG;GAAQ;EAAO,CAAC;CAAE,CAAC;CAG5F,OAAO;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-start-of-week.cjs","names":[],"sources":["../../../src/utils/get-start-of-week/get-start-of-week.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { AnyDateValue, DayOfWeek } from '../../types';\n\ninterface GetStartOfWeekInput {\n date: AnyDateValue;\n firstDayOfWeek?: DayOfWeek;\n}\n\nexport function getStartOfWeek({ date, firstDayOfWeek = 1 }: GetStartOfWeekInput) {\n let value = dayjs(date);\n\n while (value.day() !== firstDayOfWeek) {\n value = value.subtract(1, 'day');\n }\n\n return value.format('YYYY-MM-DD');\n}\n"],"mappings":";;;;;AAQA,SAAgB,eAAe,EAAE,MAAM,iBAAiB,KAA0B;CAChF,IAAI,SAAA,GAAA,MAAA,QAAA,CAAc,IAAI;CAEtB,OAAO,MAAM,IAAI,MAAM,gBACrB,QAAQ,MAAM,SAAS,GAAG,KAAK;CAGjC,OAAO,MAAM,OAAO,YAAY;AAClC"}
1
+ {"version":3,"file":"get-start-of-week.cjs","names":[],"sources":["../../../src/utils/get-start-of-week/get-start-of-week.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { AnyDateValue, DayOfWeek } from '../../types';\n\ninterface GetStartOfWeekInput {\n date: AnyDateValue;\n firstDayOfWeek?: DayOfWeek;\n}\n\nexport function getStartOfWeek({ date, firstDayOfWeek = 1 }: GetStartOfWeekInput) {\n let value = dayjs(date);\n\n while (value.day() !== firstDayOfWeek) {\n value = value.subtract(1, 'day');\n }\n\n return value.format('YYYY-MM-DD');\n}\n"],"mappings":";;;;;AAQA,SAAgB,eAAe,EAAE,MAAM,iBAAiB,KAA0B;CAChF,IAAI,SAAA,GAAQ,MAAA,QAAA,CAAM,IAAI;CAEtB,OAAO,MAAM,IAAI,MAAM,gBACrB,QAAQ,MAAM,SAAS,GAAG,KAAK;CAGjC,OAAO,MAAM,OAAO,YAAY;AAClC"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-week-days.cjs","names":["getStartOfWeek","toDateString"],"sources":["../../../src/utils/get-week-days/get-week-days.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { AnyDateValue, DateStringValue, DayOfWeek } from '../../types';\nimport { getStartOfWeek } from '../get-start-of-week/get-start-of-week';\nimport { toDateString } from '../to-date-string/to-date-string';\n\nexport interface GetWeekDaysInput {\n /** Week to generate days for */\n week: AnyDateValue;\n\n /** Indices of weekend days, 0-6, where 0 is Sunday and 6 is Saturday. The default value is defined by `DatesProvider`. */\n weekendDays?: DayOfWeek[];\n\n /** If set to false, weekend days are hidden @default true */\n withWeekendDays?: boolean;\n\n /** Number 0-6, where 0 – Sunday and 6 – Saturday @default 1 */\n firstDayOfWeek?: DayOfWeek;\n}\n\n/** Returns a list of days in a given week */\nexport function getWeekDays({\n week,\n weekendDays,\n withWeekendDays = true,\n firstDayOfWeek = 1,\n}: GetWeekDaysInput): DateStringValue[] {\n const days: DateStringValue[] = [];\n\n let current = dayjs(getStartOfWeek({ date: week, firstDayOfWeek }));\n\n for (let i = 0; i < 7; i += 1) {\n const dayOfWeek = current.day();\n const isWeekend = weekendDays && weekendDays.includes(dayOfWeek as DayOfWeek);\n\n if (!isWeekend || withWeekendDays) {\n days.push(toDateString(current));\n }\n\n current = current.add(1, 'day');\n }\n\n return days;\n}\n"],"mappings":";;;;;;;;AAoBA,SAAgB,YAAY,EAC1B,MACA,aACA,kBAAkB,MAClB,iBAAiB,KACqB;CACtC,MAAM,OAA0B,CAAC;CAEjC,IAAI,WAAA,GAAA,MAAA,QAAA,CAAgBA,0BAAAA,eAAe;EAAE,MAAM;EAAM;CAAe,CAAC,CAAC;CAElE,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG;EAC7B,MAAM,YAAY,QAAQ,IAAI;EAG9B,IAAI,EAFc,eAAe,YAAY,SAAS,SAAsB,MAE1D,iBAChB,KAAK,KAAKC,uBAAAA,aAAa,OAAO,CAAC;EAGjC,UAAU,QAAQ,IAAI,GAAG,KAAK;CAChC;CAEA,OAAO;AACT"}
1
+ {"version":3,"file":"get-week-days.cjs","names":["getStartOfWeek","toDateString"],"sources":["../../../src/utils/get-week-days/get-week-days.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { AnyDateValue, DateStringValue, DayOfWeek } from '../../types';\nimport { getStartOfWeek } from '../get-start-of-week/get-start-of-week';\nimport { toDateString } from '../to-date-string/to-date-string';\n\nexport interface GetWeekDaysInput {\n /** Week to generate days for */\n week: AnyDateValue;\n\n /** Indices of weekend days, 0-6, where 0 is Sunday and 6 is Saturday. The default value is defined by `DatesProvider`. */\n weekendDays?: DayOfWeek[];\n\n /** If set to false, weekend days are hidden @default true */\n withWeekendDays?: boolean;\n\n /** Number 0-6, where 0 – Sunday and 6 – Saturday @default 1 */\n firstDayOfWeek?: DayOfWeek;\n}\n\n/** Returns a list of days in a given week */\nexport function getWeekDays({\n week,\n weekendDays,\n withWeekendDays = true,\n firstDayOfWeek = 1,\n}: GetWeekDaysInput): DateStringValue[] {\n const days: DateStringValue[] = [];\n\n let current = dayjs(getStartOfWeek({ date: week, firstDayOfWeek }));\n\n for (let i = 0; i < 7; i += 1) {\n const dayOfWeek = current.day();\n const isWeekend = weekendDays && weekendDays.includes(dayOfWeek as DayOfWeek);\n\n if (!isWeekend || withWeekendDays) {\n days.push(toDateString(current));\n }\n\n current = current.add(1, 'day');\n }\n\n return days;\n}\n"],"mappings":";;;;;;;;AAoBA,SAAgB,YAAY,EAC1B,MACA,aACA,kBAAkB,MAClB,iBAAiB,KACqB;CACtC,MAAM,OAA0B,CAAC;CAEjC,IAAI,WAAA,GAAU,MAAA,QAAA,CAAMA,0BAAAA,eAAe;EAAE,MAAM;EAAM;CAAe,CAAC,CAAC;CAElE,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG;EAC7B,MAAM,YAAY,QAAQ,IAAI;EAG9B,IAAI,EAFc,eAAe,YAAY,SAAS,SAAsB,MAE1D,iBAChB,KAAK,KAAKC,uBAAAA,aAAa,OAAO,CAAC;EAGjC,UAAU,QAAQ,IAAI,GAAG,KAAK;CAChC;CAEA,OAAO;AACT"}
@@ -7,7 +7,10 @@ dayjs_plugin_isoWeek_js = require_runtime.__toESM(dayjs_plugin_isoWeek_js);
7
7
  //#region packages/@mantine/schedule/src/utils/get-week-number/get-week-number.ts
8
8
  dayjs.default.extend(dayjs_plugin_isoWeek_js.default);
9
9
  function getWeekNumber(week) {
10
- if (Array.isArray(week)) return (0, dayjs.default)(week.find((date) => (0, dayjs.default)(date).day() === 1)).isoWeek();
10
+ if (Array.isArray(week)) {
11
+ const monday = week.find((date) => (0, dayjs.default)(date).day() === 1);
12
+ return (0, dayjs.default)(monday).isoWeek();
13
+ }
11
14
  return (0, dayjs.default)(week).isoWeek();
12
15
  }
13
16
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"get-week-number.cjs","names":["isoWeek"],"sources":["../../../src/utils/get-week-number/get-week-number.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport isoWeek from 'dayjs/plugin/isoWeek.js';\nimport { AnyDateValue } from '../../types';\n\ndayjs.extend(isoWeek);\n\nexport function getWeekNumber(week: AnyDateValue | AnyDateValue[]): number {\n if (Array.isArray(week)) {\n const monday = week.find((date) => dayjs(date).day() === 1);\n return dayjs(monday).isoWeek();\n }\n\n return dayjs(week).isoWeek();\n}\n"],"mappings":";;;;;;;AAIA,MAAA,QAAM,OAAOA,wBAAAA,OAAO;AAEpB,SAAgB,cAAc,MAA6C;CACzE,IAAI,MAAM,QAAQ,IAAI,GAEpB,QAAA,GAAA,MAAA,QAAA,CADe,KAAK,MAAM,UAAA,GAAA,MAAA,QAAA,CAAe,IAAI,CAAC,CAAC,IAAI,MAAM,CACvC,CAAC,CAAC,CAAC,QAAQ;CAG/B,QAAA,GAAA,MAAA,QAAA,CAAa,IAAI,CAAC,CAAC,QAAQ;AAC7B"}
1
+ {"version":3,"file":"get-week-number.cjs","names":["isoWeek"],"sources":["../../../src/utils/get-week-number/get-week-number.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport isoWeek from 'dayjs/plugin/isoWeek.js';\nimport { AnyDateValue } from '../../types';\n\ndayjs.extend(isoWeek);\n\nexport function getWeekNumber(week: AnyDateValue | AnyDateValue[]): number {\n if (Array.isArray(week)) {\n const monday = week.find((date) => dayjs(date).day() === 1);\n return dayjs(monday).isoWeek();\n }\n\n return dayjs(week).isoWeek();\n}\n"],"mappings":";;;;;;;AAIA,MAAA,QAAM,OAAOA,wBAAAA,OAAO;AAEpB,SAAgB,cAAc,MAA6C;CACzE,IAAI,MAAM,QAAQ,IAAI,GAAG;EACvB,MAAM,SAAS,KAAK,MAAM,UAAA,GAAS,MAAA,QAAA,CAAM,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC;EAC1D,QAAA,GAAO,MAAA,QAAA,CAAM,MAAM,CAAC,CAAC,QAAQ;CAC/B;CAEA,QAAA,GAAO,MAAA,QAAA,CAAM,IAAI,CAAC,CAAC,QAAQ;AAC7B"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-weekdays-names.cjs","names":["formatDate"],"sources":["../../../src/utils/get-weekdays-names/get-weekdays-names.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport type { DateLabelFormat, DayOfWeek } from '../../types';\nimport { formatDate } from '../format-date/format-date';\n\ninterface GetWeekdaysNamesInput {\n locale: string;\n format?: DateLabelFormat;\n firstDayOfWeek?: DayOfWeek;\n}\n\nexport function getWeekdaysNames({\n locale,\n format = 'dd',\n firstDayOfWeek = 1,\n}: GetWeekdaysNamesInput) {\n const baseDate = dayjs().day(firstDayOfWeek);\n const labels: React.ReactNode[] = [];\n\n for (let i = 0; i < 7; i += 1) {\n labels.push(formatDate({ locale, date: baseDate.add(i, 'days'), format }));\n }\n\n return labels;\n}\n"],"mappings":";;;;;;AAUA,SAAgB,iBAAiB,EAC/B,QACA,SAAS,MACT,iBAAiB,KACO;CACxB,MAAM,YAAA,GAAA,MAAA,QAAA,CAAiB,CAAC,CAAC,IAAI,cAAc;CAC3C,MAAM,SAA4B,CAAC;CAEnC,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,GAC1B,OAAO,KAAKA,oBAAAA,WAAW;EAAE;EAAQ,MAAM,SAAS,IAAI,GAAG,MAAM;EAAG;CAAO,CAAC,CAAC;CAG3E,OAAO;AACT"}
1
+ {"version":3,"file":"get-weekdays-names.cjs","names":["formatDate"],"sources":["../../../src/utils/get-weekdays-names/get-weekdays-names.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport type { DateLabelFormat, DayOfWeek } from '../../types';\nimport { formatDate } from '../format-date/format-date';\n\ninterface GetWeekdaysNamesInput {\n locale: string;\n format?: DateLabelFormat;\n firstDayOfWeek?: DayOfWeek;\n}\n\nexport function getWeekdaysNames({\n locale,\n format = 'dd',\n firstDayOfWeek = 1,\n}: GetWeekdaysNamesInput) {\n const baseDate = dayjs().day(firstDayOfWeek);\n const labels: React.ReactNode[] = [];\n\n for (let i = 0; i < 7; i += 1) {\n labels.push(formatDate({ locale, date: baseDate.add(i, 'days'), format }));\n }\n\n return labels;\n}\n"],"mappings":";;;;;;AAUA,SAAgB,iBAAiB,EAC/B,QACA,SAAS,MACT,iBAAiB,KACO;CACxB,MAAM,YAAA,GAAW,MAAA,QAAA,CAAM,CAAC,CAAC,IAAI,cAAc;CAC3C,MAAM,SAA4B,CAAC;CAEnC,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,GAC1B,OAAO,KAAKA,oBAAAA,WAAW;EAAE;EAAQ,MAAM,SAAS,IAAI,GAAG,MAAM;EAAG;CAAO,CAAC,CAAC;CAG3E,OAAO;AACT"}