@mantine/schedule 9.5.2 → 9.6.1

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 (240) 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 +153 -80
  8. package/cjs/components/DayView/DayView.cjs.map +1 -1
  9. package/cjs/components/DayView/DayView.module.cjs +1 -0
  10. package/cjs/components/DayView/DayView.module.cjs.map +1 -1
  11. package/cjs/components/DayView/get-day-view-events/get-day-positioned-events.cjs +12 -7
  12. package/cjs/components/DayView/get-day-view-events/get-day-positioned-events.cjs.map +1 -1
  13. package/cjs/components/DayView/get-day-view-events/get-day-view-events.cjs +3 -2
  14. package/cjs/components/DayView/get-day-view-events/get-day-view-events.cjs.map +1 -1
  15. package/cjs/components/DragContext/DragContext.cjs.map +1 -1
  16. package/cjs/components/MobileMonthView/MobileMonthView.cjs +7 -6
  17. package/cjs/components/MobileMonthView/MobileMonthView.cjs.map +1 -1
  18. package/cjs/components/MobileMonthView/get-mobile-month-view-events.cjs.map +1 -1
  19. package/cjs/components/MonthView/MonthView.cjs +24 -34
  20. package/cjs/components/MonthView/MonthView.cjs.map +1 -1
  21. package/cjs/components/MonthView/MonthView.module.cjs.map +1 -1
  22. package/cjs/components/MonthView/get-month-view-events/find-available-row.cjs.map +1 -1
  23. package/cjs/components/MonthView/get-month-view-events/get-month-positioned-events.cjs +4 -2
  24. package/cjs/components/MonthView/get-month-view-events/get-month-positioned-events.cjs.map +1 -1
  25. package/cjs/components/MonthView/get-month-view-events/get-month-view-events.cjs.map +1 -1
  26. package/cjs/components/MonthView/get-month-view-events/get-weeks-in-range.cjs +3 -2
  27. package/cjs/components/MonthView/get-month-view-events/get-weeks-in-range.cjs.map +1 -1
  28. package/cjs/components/MonthView/get-renderable-month-event-segments.cjs +1 -1
  29. package/cjs/components/MonthView/get-renderable-month-event-segments.cjs.map +1 -1
  30. package/cjs/components/MoreEvents/MoreEvents.cjs.map +1 -1
  31. package/cjs/components/ResourcesDayView/ResourcesDayView.cjs +137 -53
  32. package/cjs/components/ResourcesDayView/ResourcesDayView.cjs.map +1 -1
  33. package/cjs/components/ResourcesDayView/ResourcesDayView.module.cjs +2 -1
  34. package/cjs/components/ResourcesDayView/ResourcesDayView.module.cjs.map +1 -1
  35. package/cjs/components/ResourcesDayView/ResourcesDayViewColumn.cjs.map +1 -1
  36. package/cjs/components/ResourcesDayView/get-resources-day-view-events/get-resources-day-view-events.cjs.map +1 -1
  37. package/cjs/components/ResourcesMonthView/ResourcesMonthView.cjs.map +1 -1
  38. package/cjs/components/ResourcesSchedule/ResourcesSchedule.cjs +3 -1
  39. package/cjs/components/ResourcesSchedule/ResourcesSchedule.cjs.map +1 -1
  40. package/cjs/components/ResourcesWeekView/ResourcesWeekView.cjs +151 -60
  41. package/cjs/components/ResourcesWeekView/ResourcesWeekView.cjs.map +1 -1
  42. package/cjs/components/ResourcesWeekView/ResourcesWeekView.module.cjs +2 -1
  43. package/cjs/components/ResourcesWeekView/ResourcesWeekView.module.cjs.map +1 -1
  44. package/cjs/components/ResourcesWeekView/ResourcesWeekViewRow.cjs.map +1 -1
  45. package/cjs/components/ResourcesWeekView/get-resources-week-view-events/get-resources-week-view-events.cjs +6 -3
  46. package/cjs/components/ResourcesWeekView/get-resources-week-view-events/get-resources-week-view-events.cjs.map +1 -1
  47. package/cjs/components/Schedule/Schedule.cjs +4 -1
  48. package/cjs/components/Schedule/Schedule.cjs.map +1 -1
  49. package/cjs/components/ScheduleBackgroundEvent/ScheduleBackgroundEvent.cjs +53 -0
  50. package/cjs/components/ScheduleBackgroundEvent/ScheduleBackgroundEvent.cjs.map +1 -0
  51. package/cjs/components/ScheduleEvent/ScheduleEvent.cjs.map +1 -1
  52. package/cjs/components/ScheduleEvent/ScheduleEvent.module.cjs.map +1 -1
  53. package/cjs/components/ScheduleHeader/HeaderControl/HeaderControl.cjs +15 -14
  54. package/cjs/components/ScheduleHeader/HeaderControl/HeaderControl.cjs.map +1 -1
  55. package/cjs/components/ScheduleHeader/MonthYearSelect/MonthYearSelect.cjs.map +1 -1
  56. package/cjs/components/ScheduleHeader/ScheduleHeader.cjs.map +1 -1
  57. package/cjs/components/ScheduleHeader/ScheduleHeaderBase.cjs.map +1 -1
  58. package/cjs/components/ScheduleHeader/ScheduleHeaderContext.cjs.map +1 -1
  59. package/cjs/components/ScheduleHeader/ViewSelect/ViewSelect.cjs.map +1 -1
  60. package/cjs/components/WeekView/WeekView.cjs +168 -84
  61. package/cjs/components/WeekView/WeekView.cjs.map +1 -1
  62. package/cjs/components/WeekView/WeekView.module.cjs +1 -0
  63. package/cjs/components/WeekView/WeekView.module.cjs.map +1 -1
  64. package/cjs/components/WeekView/WeekViewDay.cjs.map +1 -1
  65. package/cjs/components/WeekView/get-week-label/get-week-label.cjs.map +1 -1
  66. package/cjs/components/WeekView/get-week-view-events/calculate-all-day-event-offset.cjs.map +1 -1
  67. package/cjs/components/WeekView/get-week-view-events/calculate-all-day-event-width.cjs.map +1 -1
  68. package/cjs/components/WeekView/get-week-view-events/calculate-event-days.cjs.map +1 -1
  69. package/cjs/components/WeekView/get-week-view-events/get-event-end-date.cjs.map +1 -1
  70. package/cjs/components/WeekView/get-week-view-events/get-hanging-status.cjs.map +1 -1
  71. package/cjs/components/WeekView/get-week-view-events/get-week-positioned-events.cjs +4 -2
  72. package/cjs/components/WeekView/get-week-view-events/get-week-positioned-events.cjs.map +1 -1
  73. package/cjs/components/YearView/YearView.cjs +7 -6
  74. package/cjs/components/YearView/YearView.cjs.map +1 -1
  75. package/cjs/components/YearView/YearViewMonth.cjs.map +1 -1
  76. package/cjs/components/YearView/get-visible-week-days.cjs.map +1 -1
  77. package/cjs/components/YearView/get-year-view-events/get-year-view-events.cjs.map +1 -1
  78. package/cjs/hooks/use-auto-scroll-on-drag.cjs.map +1 -1
  79. package/cjs/hooks/use-day-grid-event-resize.cjs.map +1 -1
  80. package/cjs/hooks/use-drag-drop-handlers.cjs +13 -2
  81. package/cjs/hooks/use-drag-drop-handlers.cjs.map +1 -1
  82. package/cjs/hooks/use-drag-state.cjs.map +1 -1
  83. package/cjs/hooks/use-event-resize.cjs +30 -15
  84. package/cjs/hooks/use-event-resize.cjs.map +1 -1
  85. package/cjs/hooks/use-horizontal-event-resize.cjs +30 -15
  86. package/cjs/hooks/use-horizontal-event-resize.cjs.map +1 -1
  87. package/cjs/hooks/use-slot-drag-select.cjs.map +1 -1
  88. package/cjs/index.cjs +6 -0
  89. package/cjs/utils/apply-cascade-layout/apply-cascade-layout.cjs +21 -0
  90. package/cjs/utils/apply-cascade-layout/apply-cascade-layout.cjs.map +1 -0
  91. package/cjs/utils/calculate-drop-time/calculate-drop-time.cjs +25 -4
  92. package/cjs/utils/calculate-drop-time/calculate-drop-time.cjs.map +1 -1
  93. package/cjs/utils/calculate-month-drop-date/calculate-month-drop-date.cjs.map +1 -1
  94. package/cjs/utils/calculate-month-resize-dates/calculate-month-resize-dates.cjs.map +1 -1
  95. package/cjs/utils/expand-recurring-events/expand-recurring-events.cjs.map +1 -1
  96. package/cjs/utils/format-date/format-date.cjs.map +1 -1
  97. package/cjs/utils/get-current-time-position/get-current-time-position.cjs.map +1 -1
  98. package/cjs/utils/get-day-position/get-day-position.cjs.map +1 -1
  99. package/cjs/utils/get-end-of-week/get-end-of-week.cjs.map +1 -1
  100. package/cjs/utils/get-month-days/get-month-days.cjs +4 -2
  101. package/cjs/utils/get-month-days/get-month-days.cjs.map +1 -1
  102. package/cjs/utils/get-month-range/get-month-range.cjs.map +1 -1
  103. package/cjs/utils/get-months-by-quarter/get-months-by-quarter.cjs.map +1 -1
  104. package/cjs/utils/get-months-list/get-months-list.cjs.map +1 -1
  105. package/cjs/{components/ResourcesDayView → utils}/get-overlap-clusters/get-overlap-clusters.cjs +2 -2
  106. package/cjs/utils/get-overlap-clusters/get-overlap-clusters.cjs.map +1 -0
  107. package/cjs/utils/get-start-of-week/get-start-of-week.cjs.map +1 -1
  108. package/cjs/utils/get-week-days/get-week-days.cjs.map +1 -1
  109. package/cjs/utils/get-week-number/get-week-number.cjs +4 -1
  110. package/cjs/utils/get-week-number/get-week-number.cjs.map +1 -1
  111. package/cjs/utils/get-weekdays-names/get-weekdays-names.cjs.map +1 -1
  112. package/cjs/utils/is-after-min-date/is-after-min-date.cjs.map +1 -1
  113. package/cjs/utils/is-all-day-event/is-all-day-event.cjs.map +1 -1
  114. package/cjs/utils/is-before-max-date/is-before-max-date.cjs.map +1 -1
  115. package/cjs/utils/is-event-in-time-range/is-event-in-time-range.cjs +2 -1
  116. package/cjs/utils/is-event-in-time-range/is-event-in-time-range.cjs.map +1 -1
  117. package/cjs/utils/is-events-overlap/is-events-overlap.cjs.map +1 -1
  118. package/cjs/utils/is-in-time-range/is-in-time-range.cjs.map +1 -1
  119. package/cjs/utils/is-multiday-event/is-multiday-event.cjs.map +1 -1
  120. package/cjs/utils/is-same-month/is-same-month.cjs.map +1 -1
  121. package/cjs/utils/is-within-week/is-within-week.cjs.map +1 -1
  122. package/cjs/utils/next-week/next-week.cjs.map +1 -1
  123. package/cjs/utils/previous-week/previous-week.cjs.map +1 -1
  124. package/cjs/utils/sort-events/sort-events.cjs.map +1 -1
  125. package/cjs/utils/to-date-string/to-date-string.cjs.map +1 -1
  126. package/cjs/utils/validate-event/validate-event.cjs.map +1 -1
  127. package/esm/components/AgendaView/AgendaView.mjs +7 -6
  128. package/esm/components/AgendaView/AgendaView.mjs.map +1 -1
  129. package/esm/components/CurrentTimeIndicator/CurrentTimeIndicator.mjs +4 -3
  130. package/esm/components/CurrentTimeIndicator/CurrentTimeIndicator.mjs.map +1 -1
  131. package/esm/components/DayView/DayView.mjs +154 -81
  132. package/esm/components/DayView/DayView.mjs.map +1 -1
  133. package/esm/components/DayView/DayView.module.mjs +1 -0
  134. package/esm/components/DayView/DayView.module.mjs.map +1 -1
  135. package/esm/components/DayView/get-day-view-events/get-day-positioned-events.mjs +12 -7
  136. package/esm/components/DayView/get-day-view-events/get-day-positioned-events.mjs.map +1 -1
  137. package/esm/components/DayView/get-day-view-events/get-day-view-events.mjs +3 -2
  138. package/esm/components/DayView/get-day-view-events/get-day-view-events.mjs.map +1 -1
  139. package/esm/components/MobileMonthView/MobileMonthView.mjs +7 -6
  140. package/esm/components/MobileMonthView/MobileMonthView.mjs.map +1 -1
  141. package/esm/components/MonthView/MonthView.mjs +25 -35
  142. package/esm/components/MonthView/MonthView.mjs.map +1 -1
  143. package/esm/components/MonthView/MonthView.module.mjs.map +1 -1
  144. package/esm/components/MonthView/get-month-view-events/get-month-positioned-events.mjs +4 -2
  145. package/esm/components/MonthView/get-month-view-events/get-month-positioned-events.mjs.map +1 -1
  146. package/esm/components/MonthView/get-month-view-events/get-weeks-in-range.mjs +3 -2
  147. package/esm/components/MonthView/get-month-view-events/get-weeks-in-range.mjs.map +1 -1
  148. package/esm/components/MonthView/get-renderable-month-event-segments.mjs +1 -1
  149. package/esm/components/MonthView/get-renderable-month-event-segments.mjs.map +1 -1
  150. package/esm/components/MoreEvents/MoreEvents.mjs.map +1 -1
  151. package/esm/components/ResourcesDayView/ResourcesDayView.mjs +139 -55
  152. package/esm/components/ResourcesDayView/ResourcesDayView.mjs.map +1 -1
  153. package/esm/components/ResourcesDayView/ResourcesDayView.module.mjs +2 -1
  154. package/esm/components/ResourcesDayView/ResourcesDayView.module.mjs.map +1 -1
  155. package/esm/components/ResourcesDayView/ResourcesDayViewColumn.mjs.map +1 -1
  156. package/esm/components/ResourcesMonthView/ResourcesMonthView.mjs.map +1 -1
  157. package/esm/components/ResourcesSchedule/ResourcesSchedule.mjs +3 -1
  158. package/esm/components/ResourcesSchedule/ResourcesSchedule.mjs.map +1 -1
  159. package/esm/components/ResourcesWeekView/ResourcesWeekView.mjs +153 -62
  160. package/esm/components/ResourcesWeekView/ResourcesWeekView.mjs.map +1 -1
  161. package/esm/components/ResourcesWeekView/ResourcesWeekView.module.mjs +2 -1
  162. package/esm/components/ResourcesWeekView/ResourcesWeekView.module.mjs.map +1 -1
  163. package/esm/components/ResourcesWeekView/ResourcesWeekViewRow.mjs.map +1 -1
  164. package/esm/components/ResourcesWeekView/get-resources-week-view-events/get-resources-week-view-events.mjs +6 -3
  165. package/esm/components/ResourcesWeekView/get-resources-week-view-events/get-resources-week-view-events.mjs.map +1 -1
  166. package/esm/components/Schedule/Schedule.mjs +4 -1
  167. package/esm/components/Schedule/Schedule.mjs.map +1 -1
  168. package/esm/components/ScheduleBackgroundEvent/ScheduleBackgroundEvent.mjs +53 -0
  169. package/esm/components/ScheduleBackgroundEvent/ScheduleBackgroundEvent.mjs.map +1 -0
  170. package/esm/components/ScheduleEvent/ScheduleEvent.mjs.map +1 -1
  171. package/esm/components/ScheduleEvent/ScheduleEvent.module.mjs.map +1 -1
  172. package/esm/components/ScheduleHeader/HeaderControl/HeaderControl.mjs +15 -14
  173. package/esm/components/ScheduleHeader/HeaderControl/HeaderControl.mjs.map +1 -1
  174. package/esm/components/ScheduleHeader/MonthYearSelect/MonthYearSelect.mjs.map +1 -1
  175. package/esm/components/ScheduleHeader/ScheduleHeader.mjs.map +1 -1
  176. package/esm/components/ScheduleHeader/ScheduleHeaderBase.mjs.map +1 -1
  177. package/esm/components/ScheduleHeader/ViewSelect/ViewSelect.mjs.map +1 -1
  178. package/esm/components/WeekView/WeekView.mjs +169 -85
  179. package/esm/components/WeekView/WeekView.mjs.map +1 -1
  180. package/esm/components/WeekView/WeekView.module.mjs +1 -0
  181. package/esm/components/WeekView/WeekView.module.mjs.map +1 -1
  182. package/esm/components/WeekView/WeekViewDay.mjs.map +1 -1
  183. package/esm/components/WeekView/get-week-view-events/get-week-positioned-events.mjs +4 -2
  184. package/esm/components/WeekView/get-week-view-events/get-week-positioned-events.mjs.map +1 -1
  185. package/esm/components/YearView/YearView.mjs +7 -6
  186. package/esm/components/YearView/YearView.mjs.map +1 -1
  187. package/esm/components/YearView/YearViewMonth.mjs.map +1 -1
  188. package/esm/hooks/use-drag-drop-handlers.mjs +13 -2
  189. package/esm/hooks/use-drag-drop-handlers.mjs.map +1 -1
  190. package/esm/hooks/use-event-resize.mjs +30 -15
  191. package/esm/hooks/use-event-resize.mjs.map +1 -1
  192. package/esm/hooks/use-horizontal-event-resize.mjs +30 -15
  193. package/esm/hooks/use-horizontal-event-resize.mjs.map +1 -1
  194. package/esm/index.mjs +4 -1
  195. package/esm/utils/apply-cascade-layout/apply-cascade-layout.mjs +21 -0
  196. package/esm/utils/apply-cascade-layout/apply-cascade-layout.mjs.map +1 -0
  197. package/esm/utils/calculate-drop-time/calculate-drop-time.mjs +25 -4
  198. package/esm/utils/calculate-drop-time/calculate-drop-time.mjs.map +1 -1
  199. package/esm/utils/get-month-days/get-month-days.mjs +4 -2
  200. package/esm/utils/get-month-days/get-month-days.mjs.map +1 -1
  201. package/esm/{components/ResourcesDayView → utils}/get-overlap-clusters/get-overlap-clusters.mjs +2 -2
  202. package/esm/utils/get-overlap-clusters/get-overlap-clusters.mjs.map +1 -0
  203. package/esm/utils/get-week-number/get-week-number.mjs +4 -1
  204. package/esm/utils/get-week-number/get-week-number.mjs.map +1 -1
  205. package/esm/utils/is-event-in-time-range/is-event-in-time-range.mjs +2 -1
  206. package/esm/utils/is-event-in-time-range/is-event-in-time-range.mjs.map +1 -1
  207. package/lib/components/DayView/DayView.d.ts +12 -2
  208. package/lib/components/DayView/get-day-view-events/get-day-positioned-events.d.ts +4 -2
  209. package/lib/components/DayView/get-day-view-events/get-day-view-events.d.ts +3 -2
  210. package/lib/components/MonthView/MonthView.d.ts +2 -0
  211. package/lib/components/ResourcesDayView/ResourcesDayView.d.ts +7 -1
  212. package/lib/components/ResourcesDayView/ResourcesDayViewColumn.d.ts +1 -1
  213. package/lib/components/ResourcesSchedule/ResourcesSchedule.d.ts +3 -1
  214. package/lib/components/ResourcesWeekView/ResourcesWeekView.d.ts +7 -1
  215. package/lib/components/ResourcesWeekView/ResourcesWeekViewRow.d.ts +1 -1
  216. package/lib/components/Schedule/Schedule.d.ts +3 -1
  217. package/lib/components/ScheduleBackgroundEvent/ScheduleBackgroundEvent.d.ts +19 -0
  218. package/lib/components/ScheduleBackgroundEvent/index.d.ts +2 -0
  219. package/lib/components/ScheduleHeader/HeaderControl/HeaderControl.d.ts +3 -3
  220. package/lib/components/ScheduleHeader/ScheduleHeaderBase.d.ts +1 -1
  221. package/lib/components/WeekView/WeekView.d.ts +12 -2
  222. package/lib/components/WeekView/WeekViewDay.d.ts +1 -1
  223. package/lib/components/WeekView/get-week-view-events/get-week-positioned-events.d.ts +4 -2
  224. package/lib/components/YearView/YearViewMonth.d.ts +1 -1
  225. package/lib/hooks/use-drag-drop-handlers.d.ts +10 -1
  226. package/lib/hooks/use-event-resize.d.ts +2 -1
  227. package/lib/hooks/use-horizontal-event-resize.d.ts +2 -1
  228. package/lib/index.d.mts +1 -0
  229. package/lib/index.d.ts +1 -0
  230. package/lib/types.d.ts +3 -1
  231. package/lib/utils/apply-cascade-layout/apply-cascade-layout.d.ts +6 -0
  232. package/lib/utils/calculate-drop-time/calculate-drop-time.d.ts +11 -1
  233. package/lib/utils/get-overlap-clusters/get-overlap-clusters.d.ts +2 -0
  234. package/lib/utils/index.d.ts +3 -0
  235. package/package.json +8 -5
  236. package/styles.css +221 -0
  237. package/styles.layer.css +221 -0
  238. package/cjs/components/ResourcesDayView/get-overlap-clusters/get-overlap-clusters.cjs.map +0 -1
  239. package/esm/components/ResourcesDayView/get-overlap-clusters/get-overlap-clusters.mjs.map +0 -1
  240. package/lib/components/ResourcesDayView/get-overlap-clusters/get-overlap-clusters.d.ts +0 -2
@@ -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
@@ -42,11 +42,14 @@ const require_handle_resources_grid_key_down = require("./utils/handle-resources
42
42
  const require_get_group_to_resource_id_map = require("./utils/get-group-to-resource-id-map/get-group-to-resource-id-map.cjs");
43
43
  const require_get_index_from_drag_point = require("./utils/get-index-from-drag-point/get-index-from-drag-point.cjs");
44
44
  const require_get_day_relative_percent = require("./utils/get-day-relative-percent/get-day-relative-percent.cjs");
45
+ const require_get_overlap_clusters = require("./utils/get-overlap-clusters/get-overlap-clusters.cjs");
46
+ const require_apply_cascade_layout = require("./utils/apply-cascade-layout/apply-cascade-layout.cjs");
45
47
  const require_AgendaView = require("./components/AgendaView/AgendaView.cjs");
46
48
  const require_CurrentTimeIndicator = require("./components/CurrentTimeIndicator/CurrentTimeIndicator.cjs");
47
49
  const require_DragContext = require("./components/DragContext/DragContext.cjs");
48
50
  const require_ScheduleEvent = require("./components/ScheduleEvent/ScheduleEvent.cjs");
49
51
  const require_MoreEvents = require("./components/MoreEvents/MoreEvents.cjs");
52
+ const require_ScheduleBackgroundEvent = require("./components/ScheduleBackgroundEvent/ScheduleBackgroundEvent.cjs");
50
53
  const require_ScheduleHeader = require("./components/ScheduleHeader/ScheduleHeader.cjs");
51
54
  const require_DayView = require("./components/DayView/DayView.cjs");
52
55
  const require_MobileMonthView = require("./components/MobileMonthView/MobileMonthView.cjs");
@@ -71,10 +74,12 @@ exports.ResourcesMonthView = require_ResourcesMonthView.ResourcesMonthView;
71
74
  exports.ResourcesSchedule = require_ResourcesSchedule.ResourcesSchedule;
72
75
  exports.ResourcesWeekView = require_ResourcesWeekView.ResourcesWeekView;
73
76
  exports.Schedule = require_Schedule.Schedule;
77
+ exports.ScheduleBackgroundEvent = require_ScheduleBackgroundEvent.ScheduleBackgroundEvent;
74
78
  exports.ScheduleEvent = require_ScheduleEvent.ScheduleEvent;
75
79
  exports.ScheduleHeader = require_ScheduleHeader.ScheduleHeader;
76
80
  exports.WeekView = require_WeekView.WeekView;
77
81
  exports.YearView = require_YearView.YearView;
82
+ exports.applyCascadeLayout = require_apply_cascade_layout.applyCascadeLayout;
78
83
  exports.calculateDropTime = require_calculate_drop_time.calculateDropTime;
79
84
  exports.calculateMonthDropDate = require_calculate_month_drop_date.calculateMonthDropDate;
80
85
  exports.clampIntervalMinutes = require_clamp_interval_minutes.clampIntervalMinutes;
@@ -94,6 +99,7 @@ exports.getMonthRange = require_get_month_range.getMonthRange;
94
99
  exports.getMonthsByQuarter = require_get_months_by_quarter.getMonthsByQuarter;
95
100
  exports.getMonthsList = require_get_months_list.getMonthsList;
96
101
  exports.getOrderedResources = require_get_ordered_resources.getOrderedResources;
102
+ exports.getOverlapClusters = require_get_overlap_clusters.getOverlapClusters;
97
103
  exports.getStartOfWeek = require_get_start_of_week.getStartOfWeek;
98
104
  exports.getTimeAxisEventStyle = require_get_time_axis_event_style.getTimeAxisEventStyle;
99
105
  exports.getVisibleEvents = require_get_visible_events.getVisibleEvents;
@@ -0,0 +1,21 @@
1
+ "use client";
2
+ const require_get_overlap_clusters = require("../get-overlap-clusters/get-overlap-clusters.cjs");
3
+ //#region packages/@mantine/schedule/src/utils/apply-cascade-layout/apply-cascade-layout.ts
4
+ /** Indent applied per column before the cluster runs out of room, in percent */
5
+ const BASE_STEP = 20;
6
+ function applyCascadeLayout(events) {
7
+ const timedEvents = events.filter((event) => !event.position.allDay);
8
+ for (const cluster of require_get_overlap_clusters.getOverlapClusters(timedEvents)) {
9
+ const columns = Math.max(...cluster.map((event) => event.position.column)) + 1;
10
+ const step = columns > 1 ? Math.min(BASE_STEP, 40 / (columns - 1)) : 0;
11
+ for (const event of cluster) {
12
+ event.position.overlaps = columns;
13
+ event.position.offset = event.position.column * step;
14
+ event.position.width = 100 - event.position.offset;
15
+ }
16
+ }
17
+ }
18
+ //#endregion
19
+ exports.applyCascadeLayout = applyCascadeLayout;
20
+
21
+ //# sourceMappingURL=apply-cascade-layout.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-cascade-layout.cjs","names":["getOverlapClusters"],"sources":["../../../src/utils/apply-cascade-layout/apply-cascade-layout.ts"],"sourcesContent":["import { DayEventPositionData, ScheduleEventData } from '../../types';\nimport { getOverlapClusters } from '../get-overlap-clusters/get-overlap-clusters';\n\n/** Indent applied per column before the cluster runs out of room, in percent */\nconst BASE_STEP = 20;\n\n/** Width the last event in a cluster is guaranteed to keep, in percent */\nconst MIN_TOP_WIDTH = 60;\n\n/** Minimal shape `applyCascadeLayout` needs, shared by day and week positioned events */\nexport type CascadePositionedEvent = ScheduleEventData & {\n position: Pick<DayEventPositionData, 'allDay' | 'column' | 'width' | 'offset' | 'overlaps'>;\n};\n\nexport function applyCascadeLayout<T extends CascadePositionedEvent>(events: T[]): void {\n const timedEvents = events.filter((event) => !event.position.allDay);\n\n for (const cluster of getOverlapClusters(timedEvents)) {\n const columns = Math.max(...cluster.map((event) => event.position.column)) + 1;\n const step = columns > 1 ? Math.min(BASE_STEP, (100 - MIN_TOP_WIDTH) / (columns - 1)) : 0;\n\n for (const event of cluster) {\n event.position.overlaps = columns;\n event.position.offset = event.position.column * step;\n event.position.width = 100 - event.position.offset;\n }\n }\n}\n"],"mappings":";;;;AAIA,MAAM,YAAY;AAUlB,SAAgB,mBAAqD,QAAmB;CACtF,MAAM,cAAc,OAAO,QAAQ,UAAU,CAAC,MAAM,SAAS,MAAM;CAEnE,KAAK,MAAM,WAAWA,6BAAAA,mBAAmB,WAAW,GAAG;EACrD,MAAM,UAAU,KAAK,IAAI,GAAG,QAAQ,KAAK,UAAU,MAAM,SAAS,MAAM,CAAC,IAAI;EAC7E,MAAM,OAAO,UAAU,IAAI,KAAK,IAAI,WAAY,MAAwB,UAAU,EAAE,IAAI;EAExF,KAAK,MAAM,SAAS,SAAS;GAC3B,MAAM,SAAS,WAAW;GAC1B,MAAM,SAAS,SAAS,MAAM,SAAS,SAAS;GAChD,MAAM,SAAS,QAAQ,MAAM,MAAM,SAAS;EAC9C;CACF;AACF"}
@@ -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"}
@@ -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 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
+ {"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,6 +1,6 @@
1
1
  "use client";
2
- const require_is_events_overlap = require("../../../utils/is-events-overlap/is-events-overlap.cjs");
3
- //#region packages/@mantine/schedule/src/components/ResourcesDayView/get-overlap-clusters/get-overlap-clusters.ts
2
+ const require_is_events_overlap = require("../is-events-overlap/is-events-overlap.cjs");
3
+ //#region packages/@mantine/schedule/src/utils/get-overlap-clusters/get-overlap-clusters.ts
4
4
  function getOverlapClusters(events) {
5
5
  const clusters = [];
6
6
  const assigned = /* @__PURE__ */ new Set();
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-overlap-clusters.cjs","names":["isEventsOverlap"],"sources":["../../../src/utils/get-overlap-clusters/get-overlap-clusters.ts"],"sourcesContent":["import { ScheduleEventData } from '../../types';\nimport { isEventsOverlap } from '../is-events-overlap/is-events-overlap';\n\nexport function getOverlapClusters<T extends ScheduleEventData>(events: T[]): T[][] {\n const clusters: T[][] = [];\n const assigned = new Set<number>();\n\n for (let i = 0; i < events.length; i++) {\n if (assigned.has(i)) {\n continue;\n }\n\n const cluster: T[] = [events[i]];\n assigned.add(i);\n\n let j = 0;\n while (j < cluster.length) {\n for (let k = 0; k < events.length; k++) {\n if (!assigned.has(k) && isEventsOverlap(cluster[j], events[k])) {\n cluster.push(events[k]);\n assigned.add(k);\n }\n }\n j++;\n }\n\n clusters.push(cluster);\n }\n\n return clusters;\n}\n"],"mappings":";;;AAGA,SAAgB,mBAAgD,QAAoB;CAClF,MAAM,WAAkB,CAAC;CACzB,MAAM,2BAAW,IAAI,IAAY;CAEjC,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;EACtC,IAAI,SAAS,IAAI,CAAC,GAChB;EAGF,MAAM,UAAe,CAAC,OAAO,EAAE;EAC/B,SAAS,IAAI,CAAC;EAEd,IAAI,IAAI;EACR,OAAO,IAAI,QAAQ,QAAQ;GACzB,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KACjC,IAAI,CAAC,SAAS,IAAI,CAAC,KAAKA,0BAAAA,gBAAgB,QAAQ,IAAI,OAAO,EAAE,GAAG;IAC9D,QAAQ,KAAK,OAAO,EAAE;IACtB,SAAS,IAAI,CAAC;GAChB;GAEF;EACF;EAEA,SAAS,KAAK,OAAO;CACvB;CAEA,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"}
@@ -1 +1 @@
1
- {"version":3,"file":"is-after-min-date.cjs","names":[],"sources":["../../../src/utils/is-after-min-date/is-after-min-date.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { AnyDateValue } from '../../types';\n\nexport function isAfterMinDate(date: AnyDateValue, minDate: AnyDateValue | undefined) {\n return minDate ? dayjs(date).isAfter(dayjs(minDate).subtract(1, 'day'), 'day') : true;\n}\n"],"mappings":";;;;;AAGA,SAAgB,eAAe,MAAoB,SAAmC;CACpF,OAAO,WAAA,GAAA,MAAA,QAAA,CAAgB,IAAI,CAAC,CAAC,SAAA,GAAA,MAAA,QAAA,CAAc,OAAO,CAAC,CAAC,SAAS,GAAG,KAAK,GAAG,KAAK,IAAI;AACnF"}
1
+ {"version":3,"file":"is-after-min-date.cjs","names":[],"sources":["../../../src/utils/is-after-min-date/is-after-min-date.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { AnyDateValue } from '../../types';\n\nexport function isAfterMinDate(date: AnyDateValue, minDate: AnyDateValue | undefined) {\n return minDate ? dayjs(date).isAfter(dayjs(minDate).subtract(1, 'day'), 'day') : true;\n}\n"],"mappings":";;;;;AAGA,SAAgB,eAAe,MAAoB,SAAmC;CACpF,OAAO,WAAA,GAAU,MAAA,QAAA,CAAM,IAAI,CAAC,CAAC,SAAA,GAAQ,MAAA,QAAA,CAAM,OAAO,CAAC,CAAC,SAAS,GAAG,KAAK,GAAG,KAAK,IAAI;AACnF"}
@@ -1 +1 @@
1
- {"version":3,"file":"is-all-day-event.cjs","names":[],"sources":["../../../src/utils/is-all-day-event/is-all-day-event.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { AnyDateValue, ScheduleEventData } from '../../types';\n\ninterface IsAllDayEventInput {\n event: ScheduleEventData;\n date: AnyDateValue;\n}\n\nexport function isAllDayEvent({ event, date }: IsAllDayEventInput) {\n const dayStart = dayjs(date).startOf('day');\n const nextDayStart = dayStart.add(1, 'day');\n const sameDayEnd = nextDayStart.subtract(1, 'second');\n const startTime = dayjs(event.start);\n const endTime = dayjs(event.end);\n\n return startTime.isSame(dayStart) && (endTime.isSame(nextDayStart) || endTime.isSame(sameDayEnd));\n}\n"],"mappings":";;;;;AAQA,SAAgB,cAAc,EAAE,OAAO,QAA4B;CACjE,MAAM,YAAA,GAAA,MAAA,QAAA,CAAiB,IAAI,CAAC,CAAC,QAAQ,KAAK;CAC1C,MAAM,eAAe,SAAS,IAAI,GAAG,KAAK;CAC1C,MAAM,aAAa,aAAa,SAAS,GAAG,QAAQ;CACpD,MAAM,aAAA,GAAA,MAAA,QAAA,CAAkB,MAAM,KAAK;CACnC,MAAM,WAAA,GAAA,MAAA,QAAA,CAAgB,MAAM,GAAG;CAE/B,OAAO,UAAU,OAAO,QAAQ,MAAM,QAAQ,OAAO,YAAY,KAAK,QAAQ,OAAO,UAAU;AACjG"}
1
+ {"version":3,"file":"is-all-day-event.cjs","names":[],"sources":["../../../src/utils/is-all-day-event/is-all-day-event.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { AnyDateValue, ScheduleEventData } from '../../types';\n\ninterface IsAllDayEventInput {\n event: ScheduleEventData;\n date: AnyDateValue;\n}\n\nexport function isAllDayEvent({ event, date }: IsAllDayEventInput) {\n const dayStart = dayjs(date).startOf('day');\n const nextDayStart = dayStart.add(1, 'day');\n const sameDayEnd = nextDayStart.subtract(1, 'second');\n const startTime = dayjs(event.start);\n const endTime = dayjs(event.end);\n\n return startTime.isSame(dayStart) && (endTime.isSame(nextDayStart) || endTime.isSame(sameDayEnd));\n}\n"],"mappings":";;;;;AAQA,SAAgB,cAAc,EAAE,OAAO,QAA4B;CACjE,MAAM,YAAA,GAAW,MAAA,QAAA,CAAM,IAAI,CAAC,CAAC,QAAQ,KAAK;CAC1C,MAAM,eAAe,SAAS,IAAI,GAAG,KAAK;CAC1C,MAAM,aAAa,aAAa,SAAS,GAAG,QAAQ;CACpD,MAAM,aAAA,GAAY,MAAA,QAAA,CAAM,MAAM,KAAK;CACnC,MAAM,WAAA,GAAU,MAAA,QAAA,CAAM,MAAM,GAAG;CAE/B,OAAO,UAAU,OAAO,QAAQ,MAAM,QAAQ,OAAO,YAAY,KAAK,QAAQ,OAAO,UAAU;AACjG"}
@@ -1 +1 @@
1
- {"version":3,"file":"is-before-max-date.cjs","names":[],"sources":["../../../src/utils/is-before-max-date/is-before-max-date.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { AnyDateValue } from '../../types';\n\nexport function isBeforeMaxDate(date: AnyDateValue, maxDate: AnyDateValue | undefined) {\n return maxDate ? dayjs(date).isBefore(dayjs(maxDate).add(1, 'day'), 'day') : true;\n}\n"],"mappings":";;;;;AAGA,SAAgB,gBAAgB,MAAoB,SAAmC;CACrF,OAAO,WAAA,GAAA,MAAA,QAAA,CAAgB,IAAI,CAAC,CAAC,UAAA,GAAA,MAAA,QAAA,CAAe,OAAO,CAAC,CAAC,IAAI,GAAG,KAAK,GAAG,KAAK,IAAI;AAC/E"}
1
+ {"version":3,"file":"is-before-max-date.cjs","names":[],"sources":["../../../src/utils/is-before-max-date/is-before-max-date.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { AnyDateValue } from '../../types';\n\nexport function isBeforeMaxDate(date: AnyDateValue, maxDate: AnyDateValue | undefined) {\n return maxDate ? dayjs(date).isBefore(dayjs(maxDate).add(1, 'day'), 'day') : true;\n}\n"],"mappings":";;;;;AAGA,SAAgB,gBAAgB,MAAoB,SAAmC;CACrF,OAAO,WAAA,GAAU,MAAA,QAAA,CAAM,IAAI,CAAC,CAAC,UAAA,GAAS,MAAA,QAAA,CAAM,OAAO,CAAC,CAAC,IAAI,GAAG,KAAK,GAAG,KAAK,IAAI;AAC/E"}
@@ -20,8 +20,9 @@ function isEventInTimeRange({ event, startTime, endTime }) {
20
20
  const timeWindowEndMinutes = endHour * 60 + endMinute;
21
21
  const eventStart = (0, dayjs.default)(event.start);
22
22
  const eventEnd = (0, dayjs.default)(event.end);
23
+ const endsAtNextDayStart = eventEnd.isSame(eventStart.startOf("day").add(1, "day"), "second");
23
24
  const eventStartMinutes = eventStart.hour() * 60 + eventStart.minute();
24
- return !(eventEnd.hour() * 60 + eventEnd.minute() <= timeWindowStartMinutes || eventStartMinutes >= timeWindowEndMinutes);
25
+ return !((endsAtNextDayStart ? 1440 : eventEnd.hour() * 60 + eventEnd.minute()) <= timeWindowStartMinutes || eventStartMinutes >= timeWindowEndMinutes);
25
26
  }
26
27
  //#endregion
27
28
  exports.isEventInTimeRange = isEventInTimeRange;
@@ -1 +1 @@
1
- {"version":3,"file":"is-event-in-time-range.cjs","names":["isMultidayEvent"],"sources":["../../../src/utils/is-event-in-time-range/is-event-in-time-range.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { ScheduleEventData } from '../../types';\nimport { isMultidayEvent } from '../is-multiday-event/is-multiday-event';\n\ninterface IsEventInTimeRangeInput {\n event: ScheduleEventData;\n startTime?: string;\n endTime?: string;\n}\n\nfunction spansFullDay(event: ScheduleEventData) {\n const start = dayjs(event.start);\n const end = dayjs(event.end);\n if (!start.isSame(start.startOf('day'))) {\n return false;\n }\n const nextDayStart = start.startOf('day').add(1, 'day');\n return end.isSame(nextDayStart) || end.isSame(nextDayStart.subtract(1, 'second'));\n}\n\nexport function isEventInTimeRange({ event, startTime, endTime }: IsEventInTimeRangeInput) {\n if (isMultidayEvent(event) || spansFullDay(event)) {\n return true;\n }\n\n if (!startTime || !endTime) {\n return true;\n }\n\n const [startHour, startMinute] = startTime.split(':').map(Number);\n const [endHour, endMinute] = endTime.split(':').map(Number);\n const timeWindowStartMinutes = startHour * 60 + startMinute;\n const timeWindowEndMinutes = endHour * 60 + endMinute;\n\n const eventStart = dayjs(event.start);\n const eventEnd = dayjs(event.end);\n const eventStartMinutes = eventStart.hour() * 60 + eventStart.minute();\n const eventEndMinutes = eventEnd.hour() * 60 + eventEnd.minute();\n\n return !(eventEndMinutes <= timeWindowStartMinutes || eventStartMinutes >= timeWindowEndMinutes);\n}\n"],"mappings":";;;;;;AAUA,SAAS,aAAa,OAA0B;CAC9C,MAAM,SAAA,GAAA,MAAA,QAAA,CAAc,MAAM,KAAK;CAC/B,MAAM,OAAA,GAAA,MAAA,QAAA,CAAY,MAAM,GAAG;CAC3B,IAAI,CAAC,MAAM,OAAO,MAAM,QAAQ,KAAK,CAAC,GACpC,OAAO;CAET,MAAM,eAAe,MAAM,QAAQ,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK;CACtD,OAAO,IAAI,OAAO,YAAY,KAAK,IAAI,OAAO,aAAa,SAAS,GAAG,QAAQ,CAAC;AAClF;AAEA,SAAgB,mBAAmB,EAAE,OAAO,WAAW,WAAoC;CACzF,IAAIA,0BAAAA,gBAAgB,KAAK,KAAK,aAAa,KAAK,GAC9C,OAAO;CAGT,IAAI,CAAC,aAAa,CAAC,SACjB,OAAO;CAGT,MAAM,CAAC,WAAW,eAAe,UAAU,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM;CAChE,MAAM,CAAC,SAAS,aAAa,QAAQ,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM;CAC1D,MAAM,yBAAyB,YAAY,KAAK;CAChD,MAAM,uBAAuB,UAAU,KAAK;CAE5C,MAAM,cAAA,GAAA,MAAA,QAAA,CAAmB,MAAM,KAAK;CACpC,MAAM,YAAA,GAAA,MAAA,QAAA,CAAiB,MAAM,GAAG;CAChC,MAAM,oBAAoB,WAAW,KAAK,IAAI,KAAK,WAAW,OAAO;CAGrE,OAAO,EAFiB,SAAS,KAAK,IAAI,KAAK,SAAS,OAAO,KAEnC,0BAA0B,qBAAqB;AAC7E"}
1
+ {"version":3,"file":"is-event-in-time-range.cjs","names":["isMultidayEvent"],"sources":["../../../src/utils/is-event-in-time-range/is-event-in-time-range.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { ScheduleEventData } from '../../types';\nimport { isMultidayEvent } from '../is-multiday-event/is-multiday-event';\n\ninterface IsEventInTimeRangeInput {\n event: ScheduleEventData;\n startTime?: string;\n endTime?: string;\n}\n\nfunction spansFullDay(event: ScheduleEventData) {\n const start = dayjs(event.start);\n const end = dayjs(event.end);\n if (!start.isSame(start.startOf('day'))) {\n return false;\n }\n const nextDayStart = start.startOf('day').add(1, 'day');\n return end.isSame(nextDayStart) || end.isSame(nextDayStart.subtract(1, 'second'));\n}\n\nexport function isEventInTimeRange({ event, startTime, endTime }: IsEventInTimeRangeInput) {\n if (isMultidayEvent(event) || spansFullDay(event)) {\n return true;\n }\n\n if (!startTime || !endTime) {\n return true;\n }\n\n const [startHour, startMinute] = startTime.split(':').map(Number);\n const [endHour, endMinute] = endTime.split(':').map(Number);\n const timeWindowStartMinutes = startHour * 60 + startMinute;\n const timeWindowEndMinutes = endHour * 60 + endMinute;\n\n const eventStart = dayjs(event.start);\n const eventEnd = dayjs(event.end);\n const endsAtNextDayStart = eventEnd.isSame(eventStart.startOf('day').add(1, 'day'), 'second');\n const eventStartMinutes = eventStart.hour() * 60 + eventStart.minute();\n const eventEndMinutes = endsAtNextDayStart ? 24 * 60 : eventEnd.hour() * 60 + eventEnd.minute();\n\n return !(eventEndMinutes <= timeWindowStartMinutes || eventStartMinutes >= timeWindowEndMinutes);\n}\n"],"mappings":";;;;;;AAUA,SAAS,aAAa,OAA0B;CAC9C,MAAM,SAAA,GAAQ,MAAA,QAAA,CAAM,MAAM,KAAK;CAC/B,MAAM,OAAA,GAAM,MAAA,QAAA,CAAM,MAAM,GAAG;CAC3B,IAAI,CAAC,MAAM,OAAO,MAAM,QAAQ,KAAK,CAAC,GACpC,OAAO;CAET,MAAM,eAAe,MAAM,QAAQ,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK;CACtD,OAAO,IAAI,OAAO,YAAY,KAAK,IAAI,OAAO,aAAa,SAAS,GAAG,QAAQ,CAAC;AAClF;AAEA,SAAgB,mBAAmB,EAAE,OAAO,WAAW,WAAoC;CACzF,IAAIA,0BAAAA,gBAAgB,KAAK,KAAK,aAAa,KAAK,GAC9C,OAAO;CAGT,IAAI,CAAC,aAAa,CAAC,SACjB,OAAO;CAGT,MAAM,CAAC,WAAW,eAAe,UAAU,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM;CAChE,MAAM,CAAC,SAAS,aAAa,QAAQ,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM;CAC1D,MAAM,yBAAyB,YAAY,KAAK;CAChD,MAAM,uBAAuB,UAAU,KAAK;CAE5C,MAAM,cAAA,GAAa,MAAA,QAAA,CAAM,MAAM,KAAK;CACpC,MAAM,YAAA,GAAW,MAAA,QAAA,CAAM,MAAM,GAAG;CAChC,MAAM,qBAAqB,SAAS,OAAO,WAAW,QAAQ,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,GAAG,QAAQ;CAC5F,MAAM,oBAAoB,WAAW,KAAK,IAAI,KAAK,WAAW,OAAO;CAGrE,OAAO,GAFiB,qBAAqB,OAAU,SAAS,KAAK,IAAI,KAAK,SAAS,OAAO,MAElE,0BAA0B,qBAAqB;AAC7E"}