@mantine/schedule 9.1.1 → 9.2.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 (209) hide show
  1. package/cjs/components/CurrentTimeIndicator/CurrentTimeIndicator.cjs.map +1 -1
  2. package/cjs/components/DayView/DayView.cjs +2 -1
  3. package/cjs/components/DayView/DayView.cjs.map +1 -1
  4. package/cjs/components/DayView/get-day-view-events/get-day-positioned-events.cjs +3 -2
  5. package/cjs/components/DayView/get-day-view-events/get-day-positioned-events.cjs.map +1 -1
  6. package/cjs/components/DayView/get-day-view-events/get-day-view-events.cjs +4 -2
  7. package/cjs/components/DayView/get-day-view-events/get-day-view-events.cjs.map +1 -1
  8. package/cjs/components/DragContext/DragContext.cjs.map +1 -1
  9. package/cjs/components/MobileMonthView/MobileMonthView.cjs.map +1 -1
  10. package/cjs/components/MobileMonthView/get-mobile-month-view-events.cjs.map +1 -1
  11. package/cjs/components/MonthView/MonthView.cjs +19 -9
  12. package/cjs/components/MonthView/MonthView.cjs.map +1 -1
  13. package/cjs/components/MonthView/get-month-view-events/add-event-to-day-groups.cjs.map +1 -1
  14. package/cjs/components/MonthView/get-month-view-events/calculate-event-position-in-week.cjs.map +1 -1
  15. package/cjs/components/MonthView/get-month-view-events/find-available-row.cjs.map +1 -1
  16. package/cjs/components/MonthView/get-month-view-events/get-month-positioned-events.cjs.map +1 -1
  17. package/cjs/components/MonthView/get-month-view-events/get-month-view-events.cjs.map +1 -1
  18. package/cjs/components/MonthView/get-month-view-events/get-weeks-in-range.cjs.map +1 -1
  19. package/cjs/components/MonthView/get-renderable-month-event-segments.cjs +121 -0
  20. package/cjs/components/MonthView/get-renderable-month-event-segments.cjs.map +1 -0
  21. package/cjs/components/MonthView/handle-month-view-key-down.cjs.map +1 -1
  22. package/cjs/components/MoreEvents/MoreEvents.cjs.map +1 -1
  23. package/cjs/components/Schedule/Schedule.cjs.map +1 -1
  24. package/cjs/components/ScheduleEvent/ScheduleEvent.cjs.map +1 -1
  25. package/cjs/components/ScheduleEvent/ScheduleEvent.module.cjs.map +1 -1
  26. package/cjs/components/ScheduleHeader/HeaderControl/HeaderControl.cjs.map +1 -1
  27. package/cjs/components/ScheduleHeader/MonthYearSelect/MonthYearSelect.cjs.map +1 -1
  28. package/cjs/components/ScheduleHeader/ScheduleHeader.cjs.map +1 -1
  29. package/cjs/components/ScheduleHeader/ScheduleHeaderBase.cjs.map +1 -1
  30. package/cjs/components/ScheduleHeader/ScheduleHeaderContext.cjs.map +1 -1
  31. package/cjs/components/ScheduleHeader/ViewSelect/ViewSelect.cjs.map +1 -1
  32. package/cjs/components/WeekView/WeekView.cjs +1 -0
  33. package/cjs/components/WeekView/WeekView.cjs.map +1 -1
  34. package/cjs/components/WeekView/WeekViewDay.cjs +5 -2
  35. package/cjs/components/WeekView/WeekViewDay.cjs.map +1 -1
  36. package/cjs/components/WeekView/get-week-label/get-week-label.cjs.map +1 -1
  37. package/cjs/components/WeekView/get-week-view-events/assign-event-rows.cjs.map +1 -1
  38. package/cjs/components/WeekView/get-week-view-events/calculate-all-day-event-offset.cjs.map +1 -1
  39. package/cjs/components/WeekView/get-week-view-events/calculate-all-day-event-width.cjs.map +1 -1
  40. package/cjs/components/WeekView/get-week-view-events/calculate-event-days.cjs.map +1 -1
  41. package/cjs/components/WeekView/get-week-view-events/calculate-regular-event-overlaps.cjs.map +1 -1
  42. package/cjs/components/WeekView/get-week-view-events/filter-week-view-events.cjs.map +1 -1
  43. package/cjs/components/WeekView/get-week-view-events/find-available-column.cjs.map +1 -1
  44. package/cjs/components/WeekView/get-week-view-events/get-event-end-date.cjs.map +1 -1
  45. package/cjs/components/WeekView/get-week-view-events/get-hanging-status.cjs.map +1 -1
  46. package/cjs/components/WeekView/get-week-view-events/get-week-positioned-events.cjs +5 -3
  47. package/cjs/components/WeekView/get-week-view-events/get-week-positioned-events.cjs.map +1 -1
  48. package/cjs/components/WeekView/get-week-view-events/get-week-view-events.cjs.map +1 -1
  49. package/cjs/components/WeekView/handle-week-view-key-down.cjs.map +1 -1
  50. package/cjs/components/YearView/YearView.cjs.map +1 -1
  51. package/cjs/components/YearView/YearViewMonth.cjs.map +1 -1
  52. package/cjs/components/YearView/get-year-view-events/get-year-view-events.cjs.map +1 -1
  53. package/cjs/components/YearView/handle-year-view-key-down.cjs.map +1 -1
  54. package/cjs/hooks/use-auto-scroll-on-drag.cjs.map +1 -1
  55. package/cjs/hooks/use-drag-drop-handlers.cjs.map +1 -1
  56. package/cjs/hooks/use-drag-state.cjs.map +1 -1
  57. package/cjs/hooks/use-event-resize.cjs +9 -5
  58. package/cjs/hooks/use-event-resize.cjs.map +1 -1
  59. package/cjs/hooks/use-slot-drag-select.cjs.map +1 -1
  60. package/cjs/labels.cjs.map +1 -1
  61. package/cjs/utils/calculate-drop-time/calculate-drop-time.cjs.map +1 -1
  62. package/cjs/utils/calculate-month-drop-date/calculate-month-drop-date.cjs.map +1 -1
  63. package/cjs/utils/clamp-interval-minutes/clamp-interval-minutes.cjs.map +1 -1
  64. package/cjs/utils/expand-recurring-events/expand-recurring-events.cjs.map +1 -1
  65. package/cjs/utils/format-date/format-date.cjs.map +1 -1
  66. package/cjs/utils/get-business-hours-mod/get-business-hours-mod.cjs +20 -3
  67. package/cjs/utils/get-business-hours-mod/get-business-hours-mod.cjs.map +1 -1
  68. package/cjs/utils/get-current-time-position/get-current-time-position.cjs.map +1 -1
  69. package/cjs/utils/get-day-position/get-day-position.cjs +11 -8
  70. package/cjs/utils/get-day-position/get-day-position.cjs.map +1 -1
  71. package/cjs/utils/get-day-time-intervals/get-day-time-intervals.cjs.map +1 -1
  72. package/cjs/utils/get-end-of-week/get-end-of-week.cjs.map +1 -1
  73. package/cjs/utils/get-month-days/get-month-days.cjs.map +1 -1
  74. package/cjs/utils/get-month-range/get-month-range.cjs.map +1 -1
  75. package/cjs/utils/get-months-by-quarter/get-months-by-quarter.cjs.map +1 -1
  76. package/cjs/utils/get-months-list/get-months-list.cjs.map +1 -1
  77. package/cjs/utils/get-start-of-week/get-start-of-week.cjs.map +1 -1
  78. package/cjs/utils/get-visible-events/get-visible-events.cjs.map +1 -1
  79. package/cjs/utils/get-week-days/get-week-days.cjs.map +1 -1
  80. package/cjs/utils/get-week-number/get-week-number.cjs.map +1 -1
  81. package/cjs/utils/get-weekdays-names/get-weekdays-names.cjs.map +1 -1
  82. package/cjs/utils/get-years-list/get-years-list.cjs.map +1 -1
  83. package/cjs/utils/is-after-min-date/is-after-min-date.cjs.map +1 -1
  84. package/cjs/utils/is-all-day-event/is-all-day-event.cjs.map +1 -1
  85. package/cjs/utils/is-before-max-date/is-before-max-date.cjs.map +1 -1
  86. package/cjs/utils/is-event-in-time-range/is-event-in-time-range.cjs.map +1 -1
  87. package/cjs/utils/is-events-overlap/is-events-overlap.cjs.map +1 -1
  88. package/cjs/utils/is-in-time-range/is-in-time-range.cjs.map +1 -1
  89. package/cjs/utils/is-multiday-event/is-multiday-event.cjs.map +1 -1
  90. package/cjs/utils/is-same-month/is-same-month.cjs.map +1 -1
  91. package/cjs/utils/is-within-week/is-within-week.cjs.map +1 -1
  92. package/cjs/utils/next-week/next-week.cjs.map +1 -1
  93. package/cjs/utils/parse-time-string/parse-time-string.cjs.map +1 -1
  94. package/cjs/utils/previous-week/previous-week.cjs.map +1 -1
  95. package/cjs/utils/sort-events/sort-events.cjs.map +1 -1
  96. package/cjs/utils/to-date-string/to-date-string.cjs.map +1 -1
  97. package/cjs/utils/to-time-string/to-time-string.cjs.map +1 -1
  98. package/cjs/utils/validate-event/validate-event.cjs.map +1 -1
  99. package/esm/components/CurrentTimeIndicator/CurrentTimeIndicator.mjs.map +1 -1
  100. package/esm/components/DayView/DayView.mjs +2 -1
  101. package/esm/components/DayView/DayView.mjs.map +1 -1
  102. package/esm/components/DayView/get-day-view-events/get-day-positioned-events.mjs +3 -2
  103. package/esm/components/DayView/get-day-view-events/get-day-positioned-events.mjs.map +1 -1
  104. package/esm/components/DayView/get-day-view-events/get-day-view-events.mjs +4 -2
  105. package/esm/components/DayView/get-day-view-events/get-day-view-events.mjs.map +1 -1
  106. package/esm/components/DragContext/DragContext.mjs.map +1 -1
  107. package/esm/components/MobileMonthView/MobileMonthView.mjs.map +1 -1
  108. package/esm/components/MobileMonthView/get-mobile-month-view-events.mjs.map +1 -1
  109. package/esm/components/MonthView/MonthView.mjs +19 -9
  110. package/esm/components/MonthView/MonthView.mjs.map +1 -1
  111. package/esm/components/MonthView/get-month-view-events/add-event-to-day-groups.mjs.map +1 -1
  112. package/esm/components/MonthView/get-month-view-events/calculate-event-position-in-week.mjs.map +1 -1
  113. package/esm/components/MonthView/get-month-view-events/find-available-row.mjs.map +1 -1
  114. package/esm/components/MonthView/get-month-view-events/get-month-positioned-events.mjs.map +1 -1
  115. package/esm/components/MonthView/get-month-view-events/get-month-view-events.mjs.map +1 -1
  116. package/esm/components/MonthView/get-month-view-events/get-weeks-in-range.mjs.map +1 -1
  117. package/esm/components/MonthView/get-renderable-month-event-segments.mjs +121 -0
  118. package/esm/components/MonthView/get-renderable-month-event-segments.mjs.map +1 -0
  119. package/esm/components/MonthView/handle-month-view-key-down.mjs.map +1 -1
  120. package/esm/components/MoreEvents/MoreEvents.mjs.map +1 -1
  121. package/esm/components/Schedule/Schedule.mjs.map +1 -1
  122. package/esm/components/ScheduleEvent/ScheduleEvent.mjs.map +1 -1
  123. package/esm/components/ScheduleEvent/ScheduleEvent.module.mjs.map +1 -1
  124. package/esm/components/ScheduleHeader/HeaderControl/HeaderControl.mjs.map +1 -1
  125. package/esm/components/ScheduleHeader/MonthYearSelect/MonthYearSelect.mjs.map +1 -1
  126. package/esm/components/ScheduleHeader/ScheduleHeader.mjs.map +1 -1
  127. package/esm/components/ScheduleHeader/ScheduleHeaderBase.mjs.map +1 -1
  128. package/esm/components/ScheduleHeader/ScheduleHeaderContext.mjs.map +1 -1
  129. package/esm/components/ScheduleHeader/ViewSelect/ViewSelect.mjs.map +1 -1
  130. package/esm/components/WeekView/WeekView.mjs +1 -0
  131. package/esm/components/WeekView/WeekView.mjs.map +1 -1
  132. package/esm/components/WeekView/WeekViewDay.mjs +5 -2
  133. package/esm/components/WeekView/WeekViewDay.mjs.map +1 -1
  134. package/esm/components/WeekView/get-week-label/get-week-label.mjs.map +1 -1
  135. package/esm/components/WeekView/get-week-view-events/assign-event-rows.mjs.map +1 -1
  136. package/esm/components/WeekView/get-week-view-events/calculate-all-day-event-offset.mjs.map +1 -1
  137. package/esm/components/WeekView/get-week-view-events/calculate-all-day-event-width.mjs.map +1 -1
  138. package/esm/components/WeekView/get-week-view-events/calculate-event-days.mjs.map +1 -1
  139. package/esm/components/WeekView/get-week-view-events/calculate-regular-event-overlaps.mjs.map +1 -1
  140. package/esm/components/WeekView/get-week-view-events/filter-week-view-events.mjs.map +1 -1
  141. package/esm/components/WeekView/get-week-view-events/find-available-column.mjs.map +1 -1
  142. package/esm/components/WeekView/get-week-view-events/get-event-end-date.mjs.map +1 -1
  143. package/esm/components/WeekView/get-week-view-events/get-hanging-status.mjs.map +1 -1
  144. package/esm/components/WeekView/get-week-view-events/get-week-positioned-events.mjs +5 -3
  145. package/esm/components/WeekView/get-week-view-events/get-week-positioned-events.mjs.map +1 -1
  146. package/esm/components/WeekView/get-week-view-events/get-week-view-events.mjs.map +1 -1
  147. package/esm/components/WeekView/handle-week-view-key-down.mjs.map +1 -1
  148. package/esm/components/YearView/YearView.mjs.map +1 -1
  149. package/esm/components/YearView/YearViewMonth.mjs.map +1 -1
  150. package/esm/components/YearView/get-year-view-events/get-year-view-events.mjs.map +1 -1
  151. package/esm/components/YearView/handle-year-view-key-down.mjs.map +1 -1
  152. package/esm/hooks/use-auto-scroll-on-drag.mjs.map +1 -1
  153. package/esm/hooks/use-drag-drop-handlers.mjs.map +1 -1
  154. package/esm/hooks/use-drag-state.mjs.map +1 -1
  155. package/esm/hooks/use-event-resize.mjs +9 -5
  156. package/esm/hooks/use-event-resize.mjs.map +1 -1
  157. package/esm/hooks/use-slot-drag-select.mjs.map +1 -1
  158. package/esm/labels.mjs.map +1 -1
  159. package/esm/utils/calculate-drop-time/calculate-drop-time.mjs.map +1 -1
  160. package/esm/utils/calculate-month-drop-date/calculate-month-drop-date.mjs.map +1 -1
  161. package/esm/utils/clamp-interval-minutes/clamp-interval-minutes.mjs.map +1 -1
  162. package/esm/utils/expand-recurring-events/expand-recurring-events.mjs.map +1 -1
  163. package/esm/utils/format-date/format-date.mjs.map +1 -1
  164. package/esm/utils/get-business-hours-mod/get-business-hours-mod.mjs +20 -3
  165. package/esm/utils/get-business-hours-mod/get-business-hours-mod.mjs.map +1 -1
  166. package/esm/utils/get-current-time-position/get-current-time-position.mjs.map +1 -1
  167. package/esm/utils/get-day-position/get-day-position.mjs +11 -8
  168. package/esm/utils/get-day-position/get-day-position.mjs.map +1 -1
  169. package/esm/utils/get-day-time-intervals/get-day-time-intervals.mjs.map +1 -1
  170. package/esm/utils/get-end-of-week/get-end-of-week.mjs.map +1 -1
  171. package/esm/utils/get-month-days/get-month-days.mjs.map +1 -1
  172. package/esm/utils/get-month-range/get-month-range.mjs.map +1 -1
  173. package/esm/utils/get-months-by-quarter/get-months-by-quarter.mjs.map +1 -1
  174. package/esm/utils/get-months-list/get-months-list.mjs.map +1 -1
  175. package/esm/utils/get-start-of-week/get-start-of-week.mjs.map +1 -1
  176. package/esm/utils/get-visible-events/get-visible-events.mjs.map +1 -1
  177. package/esm/utils/get-week-days/get-week-days.mjs.map +1 -1
  178. package/esm/utils/get-week-number/get-week-number.mjs.map +1 -1
  179. package/esm/utils/get-weekdays-names/get-weekdays-names.mjs.map +1 -1
  180. package/esm/utils/get-years-list/get-years-list.mjs.map +1 -1
  181. package/esm/utils/is-after-min-date/is-after-min-date.mjs.map +1 -1
  182. package/esm/utils/is-all-day-event/is-all-day-event.mjs.map +1 -1
  183. package/esm/utils/is-before-max-date/is-before-max-date.mjs.map +1 -1
  184. package/esm/utils/is-event-in-time-range/is-event-in-time-range.mjs.map +1 -1
  185. package/esm/utils/is-events-overlap/is-events-overlap.mjs.map +1 -1
  186. package/esm/utils/is-in-time-range/is-in-time-range.mjs.map +1 -1
  187. package/esm/utils/is-multiday-event/is-multiday-event.mjs.map +1 -1
  188. package/esm/utils/is-same-month/is-same-month.mjs.map +1 -1
  189. package/esm/utils/is-within-week/is-within-week.mjs.map +1 -1
  190. package/esm/utils/next-week/next-week.mjs.map +1 -1
  191. package/esm/utils/parse-time-string/parse-time-string.mjs.map +1 -1
  192. package/esm/utils/previous-week/previous-week.mjs.map +1 -1
  193. package/esm/utils/sort-events/sort-events.mjs.map +1 -1
  194. package/esm/utils/to-date-string/to-date-string.mjs.map +1 -1
  195. package/esm/utils/to-time-string/to-time-string.mjs.map +1 -1
  196. package/esm/utils/validate-event/validate-event.mjs.map +1 -1
  197. package/lib/components/DayView/get-day-view-events/get-day-positioned-events.d.ts +3 -1
  198. package/lib/components/DayView/get-day-view-events/get-day-view-events.d.ts +2 -1
  199. package/lib/components/MonthView/get-renderable-month-event-segments.d.ts +16 -0
  200. package/lib/components/Schedule/Schedule.d.ts +1 -1
  201. package/lib/components/WeekView/WeekView.d.ts +3 -2
  202. package/lib/components/WeekView/WeekViewDay.d.ts +3 -3
  203. package/lib/components/WeekView/get-week-view-events/get-week-positioned-events.d.ts +3 -1
  204. package/lib/utils/get-business-hours-mod/get-business-hours-mod.d.ts +12 -3
  205. package/lib/utils/get-day-position/get-day-position.d.ts +3 -1
  206. package/lib/utils/index.d.ts +1 -1
  207. package/package.json +4 -4
  208. package/styles.css +25 -0
  209. package/styles.layer.css +25 -0
@@ -1 +1 @@
1
- {"version":3,"file":"use-drag-drop-handlers.cjs","names":["useDragState"],"sources":["../../src/hooks/use-drag-drop-handlers.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { useCallback, useEffectEvent, useState } from 'react';\nimport { DragContextValue } from '../components/DragContext/DragContext';\nimport { DateTimeStringValue, ScheduleEventData, ScheduleMode } from '../types';\nimport { useDragState } from './use-drag-state';\n\nexport interface UseDragDropHandlersOptions<T = any> {\n /** Whether drag and drop is enabled */\n enabled: boolean;\n\n /** Schedule interaction mode */\n mode: ScheduleMode;\n\n /** Called when event is dropped at new location */\n onEventDrop?: (data: {\n eventId: string | number;\n newStart: DateTimeStringValue;\n newEnd: DateTimeStringValue;\n event: ScheduleEventData;\n }) => void;\n\n /** Function to determine if event can be dragged */\n canDragEvent?: (event: ScheduleEventData) => boolean;\n\n /** Called when any event drag starts */\n onEventDragStart?: (event: ScheduleEventData) => void;\n\n /** Called when any event drag ends */\n onEventDragEnd?: () => void;\n\n /**\n * Function to calculate drop target dates from drop location.\n * Receives the target location and the dragged event.\n */\n calculateDropTarget: (target: T, draggedEvent: ScheduleEventData) => { start: Date; end: Date };\n\n /** Called when an external item is dropped onto the schedule */\n onExternalDrop?: (e: React.DragEvent, target: T) => void;\n}\n\nexport interface DragDropHandlers<T = any> {\n /** Context value for DragContext.Provider */\n dragContextValue: DragContextValue;\n\n /** Current drop target */\n dropTarget: T | null;\n\n /** Handle drag start event */\n handleDragStart: (event: ScheduleEventData) => void;\n\n /** Handle drag end event */\n handleDragEnd: () => void;\n\n /** Handle drag over event */\n handleDragOver: (e: React.DragEvent, target: T) => void;\n\n /** Handle drag leave event */\n handleDragLeave: () => void;\n\n /** Handle drop event */\n handleDrop: (e: React.DragEvent, target: T) => void;\n\n /** Check if event is draggable */\n isDraggableEvent: (event: ScheduleEventData) => boolean;\n\n /** Check if target is the current drop target */\n isDropTarget: (target: T) => boolean;\n}\n\n/**\n * Hook that provides unified drag-drop handlers for Schedule views.\n * Handles drag state management and event drops across Day, Week, and Month views.\n *\n * @template T - Type of the drop target (e.g., slot index, day string, etc.)\n */\nexport function useDragDropHandlers<T = any>(\n options: UseDragDropHandlersOptions<T>\n): DragDropHandlers<T> {\n const {\n enabled,\n mode,\n onEventDrop,\n canDragEvent,\n onEventDragStart,\n onEventDragEnd,\n calculateDropTarget,\n onExternalDrop,\n } = options;\n\n const stableOnEventDrop = useEffectEvent(onEventDrop || (() => {}));\n const stableOnEventDragStart = useEffectEvent(onEventDragStart || (() => {}));\n const stableOnEventDragEnd = useEffectEvent(onEventDragEnd || (() => {}));\n const stableOnExternalDrop = useEffectEvent(onExternalDrop || (() => {}));\n\n const dragState = useDragState();\n const [dropTarget, setDropTarget] = useState<T | null>(null);\n\n const handleDragEnd = useCallback(() => {\n dragState.endDrag();\n setDropTarget(null);\n stableOnEventDragEnd();\n }, [dragState]);\n\n const handleDragStart = useCallback(\n (event: ScheduleEventData) => {\n if (!enabled || mode === 'static') {\n return;\n }\n dragState.startDrag(event);\n stableOnEventDragStart(event);\n },\n [enabled, mode, dragState]\n );\n\n const handleDragOver = useCallback(\n (event: React.DragEvent, target: T) => {\n if (mode === 'static') {\n return;\n }\n\n let isInternalDrag = dragState.state.isDragging;\n\n if (isInternalDrag && !event.dataTransfer.types.includes('application/json')) {\n handleDragEnd();\n isInternalDrag = false;\n }\n\n if (isInternalDrag && !enabled) {\n return;\n }\n\n if (!isInternalDrag && !onExternalDrop) {\n return;\n }\n\n event.preventDefault();\n event.dataTransfer.dropEffect = isInternalDrag ? 'move' : 'copy';\n setDropTarget(target);\n },\n [enabled, mode, dragState.state.isDragging, onExternalDrop, handleDragEnd]\n );\n\n const handleDragLeave = useCallback(() => {\n setDropTarget(null);\n }, []);\n\n const handleDrop = useCallback(\n (event: React.DragEvent, target: T) => {\n event.preventDefault();\n\n const isInternalDrag =\n dragState.state.isDragging && event.dataTransfer.types.includes('application/json');\n\n if (isInternalDrag && enabled && dragState.state.draggedEvent && onEventDrop) {\n const { start, end } = calculateDropTarget(target, dragState.state.draggedEvent);\n stableOnEventDrop({\n eventId: dragState.state.draggedEventId!,\n newStart: dayjs(start).format('YYYY-MM-DD HH:mm:ss'),\n newEnd: dayjs(end).format('YYYY-MM-DD HH:mm:ss'),\n event: dragState.state.draggedEvent,\n });\n handleDragEnd();\n return;\n }\n\n if (!isInternalDrag && onExternalDrop) {\n if (dragState.state.isDragging) {\n handleDragEnd();\n }\n stableOnExternalDrop(event, target);\n setDropTarget(null);\n return;\n }\n\n setDropTarget(null);\n },\n [\n enabled,\n dragState.state,\n onEventDrop,\n onExternalDrop,\n calculateDropTarget,\n handleDragEnd,\n stableOnEventDrop,\n stableOnExternalDrop,\n ]\n );\n\n const isDraggableEvent = useCallback(\n (event: ScheduleEventData) => {\n return (\n enabled &&\n mode !== 'static' &&\n event.display !== 'background' &&\n (canDragEvent ? canDragEvent(event) : true)\n );\n },\n [enabled, mode, canDragEvent]\n );\n\n const isDropTarget = useCallback(\n (target: T) => {\n // Handle complex target comparison (for WeekView with day + slotIndex)\n if (dropTarget && typeof dropTarget === 'object' && typeof target === 'object') {\n return JSON.stringify(dropTarget) === JSON.stringify(target);\n }\n return dropTarget === target;\n },\n [dropTarget]\n );\n\n const dragContextValue: DragContextValue = {\n isDragging: dragState.state.isDragging,\n draggedEventId: dragState.state.draggedEventId,\n draggedEvent: dragState.state.draggedEvent,\n dropTarget: dragState.state.dropTarget,\n onDragStart: handleDragStart,\n onDragEnd: handleDragEnd,\n setDropTarget: dragState.setDropTarget,\n };\n\n return {\n dragContextValue,\n dropTarget,\n handleDragStart,\n handleDragEnd,\n handleDragOver,\n handleDragLeave,\n handleDrop,\n isDraggableEvent,\n isDropTarget,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"use-drag-drop-handlers.cjs","names":["useDragState"],"sources":["../../src/hooks/use-drag-drop-handlers.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { useCallback, useEffectEvent, useState } from 'react';\nimport { DragContextValue } from '../components/DragContext/DragContext';\nimport { DateTimeStringValue, ScheduleEventData, ScheduleMode } from '../types';\nimport { useDragState } from './use-drag-state';\n\nexport interface UseDragDropHandlersOptions<T = any> {\n /** Whether drag and drop is enabled */\n enabled: boolean;\n\n /** Schedule interaction mode */\n mode: ScheduleMode;\n\n /** Called when event is dropped at new location */\n onEventDrop?: (data: {\n eventId: string | number;\n newStart: DateTimeStringValue;\n newEnd: DateTimeStringValue;\n event: ScheduleEventData;\n }) => void;\n\n /** Function to determine if event can be dragged */\n canDragEvent?: (event: ScheduleEventData) => boolean;\n\n /** Called when any event drag starts */\n onEventDragStart?: (event: ScheduleEventData) => void;\n\n /** Called when any event drag ends */\n onEventDragEnd?: () => void;\n\n /**\n * Function to calculate drop target dates from drop location.\n * Receives the target location and the dragged event.\n */\n calculateDropTarget: (target: T, draggedEvent: ScheduleEventData) => { start: Date; end: Date };\n\n /** Called when an external item is dropped onto the schedule */\n onExternalDrop?: (e: React.DragEvent, target: T) => void;\n}\n\nexport interface DragDropHandlers<T = any> {\n /** Context value for DragContext.Provider */\n dragContextValue: DragContextValue;\n\n /** Current drop target */\n dropTarget: T | null;\n\n /** Handle drag start event */\n handleDragStart: (event: ScheduleEventData) => void;\n\n /** Handle drag end event */\n handleDragEnd: () => void;\n\n /** Handle drag over event */\n handleDragOver: (e: React.DragEvent, target: T) => void;\n\n /** Handle drag leave event */\n handleDragLeave: () => void;\n\n /** Handle drop event */\n handleDrop: (e: React.DragEvent, target: T) => void;\n\n /** Check if event is draggable */\n isDraggableEvent: (event: ScheduleEventData) => boolean;\n\n /** Check if target is the current drop target */\n isDropTarget: (target: T) => boolean;\n}\n\n/**\n * Hook that provides unified drag-drop handlers for Schedule views.\n * Handles drag state management and event drops across Day, Week, and Month views.\n *\n * @template T - Type of the drop target (e.g., slot index, day string, etc.)\n */\nexport function useDragDropHandlers<T = any>(\n options: UseDragDropHandlersOptions<T>\n): DragDropHandlers<T> {\n const {\n enabled,\n mode,\n onEventDrop,\n canDragEvent,\n onEventDragStart,\n onEventDragEnd,\n calculateDropTarget,\n onExternalDrop,\n } = options;\n\n const stableOnEventDrop = useEffectEvent(onEventDrop || (() => {}));\n const stableOnEventDragStart = useEffectEvent(onEventDragStart || (() => {}));\n const stableOnEventDragEnd = useEffectEvent(onEventDragEnd || (() => {}));\n const stableOnExternalDrop = useEffectEvent(onExternalDrop || (() => {}));\n\n const dragState = useDragState();\n const [dropTarget, setDropTarget] = useState<T | null>(null);\n\n const handleDragEnd = useCallback(() => {\n dragState.endDrag();\n setDropTarget(null);\n stableOnEventDragEnd();\n }, [dragState]);\n\n const handleDragStart = useCallback(\n (event: ScheduleEventData) => {\n if (!enabled || mode === 'static') {\n return;\n }\n dragState.startDrag(event);\n stableOnEventDragStart(event);\n },\n [enabled, mode, dragState]\n );\n\n const handleDragOver = useCallback(\n (event: React.DragEvent, target: T) => {\n if (mode === 'static') {\n return;\n }\n\n let isInternalDrag = dragState.state.isDragging;\n\n if (isInternalDrag && !event.dataTransfer.types.includes('application/json')) {\n handleDragEnd();\n isInternalDrag = false;\n }\n\n if (isInternalDrag && !enabled) {\n return;\n }\n\n if (!isInternalDrag && !onExternalDrop) {\n return;\n }\n\n event.preventDefault();\n event.dataTransfer.dropEffect = isInternalDrag ? 'move' : 'copy';\n setDropTarget(target);\n },\n [enabled, mode, dragState.state.isDragging, onExternalDrop, handleDragEnd]\n );\n\n const handleDragLeave = useCallback(() => {\n setDropTarget(null);\n }, []);\n\n const handleDrop = useCallback(\n (event: React.DragEvent, target: T) => {\n event.preventDefault();\n\n const isInternalDrag =\n dragState.state.isDragging && event.dataTransfer.types.includes('application/json');\n\n if (isInternalDrag && enabled && dragState.state.draggedEvent && onEventDrop) {\n const { start, end } = calculateDropTarget(target, dragState.state.draggedEvent);\n stableOnEventDrop({\n eventId: dragState.state.draggedEventId!,\n newStart: dayjs(start).format('YYYY-MM-DD HH:mm:ss'),\n newEnd: dayjs(end).format('YYYY-MM-DD HH:mm:ss'),\n event: dragState.state.draggedEvent,\n });\n handleDragEnd();\n return;\n }\n\n if (!isInternalDrag && onExternalDrop) {\n if (dragState.state.isDragging) {\n handleDragEnd();\n }\n stableOnExternalDrop(event, target);\n setDropTarget(null);\n return;\n }\n\n setDropTarget(null);\n },\n [\n enabled,\n dragState.state,\n onEventDrop,\n onExternalDrop,\n calculateDropTarget,\n handleDragEnd,\n stableOnEventDrop,\n stableOnExternalDrop,\n ]\n );\n\n const isDraggableEvent = useCallback(\n (event: ScheduleEventData) => {\n return (\n enabled &&\n mode !== 'static' &&\n event.display !== 'background' &&\n (canDragEvent ? canDragEvent(event) : true)\n );\n },\n [enabled, mode, canDragEvent]\n );\n\n const isDropTarget = useCallback(\n (target: T) => {\n // Handle complex target comparison (for WeekView with day + slotIndex)\n if (dropTarget && typeof dropTarget === 'object' && typeof target === 'object') {\n return JSON.stringify(dropTarget) === JSON.stringify(target);\n }\n return dropTarget === target;\n },\n [dropTarget]\n );\n\n const dragContextValue: DragContextValue = {\n isDragging: dragState.state.isDragging,\n draggedEventId: dragState.state.draggedEventId,\n draggedEvent: dragState.state.draggedEvent,\n dropTarget: dragState.state.dropTarget,\n onDragStart: handleDragStart,\n onDragEnd: handleDragEnd,\n setDropTarget: dragState.setDropTarget,\n };\n\n return {\n dragContextValue,\n dropTarget,\n handleDragStart,\n handleDragEnd,\n handleDragOver,\n handleDragLeave,\n handleDrop,\n isDraggableEvent,\n isDropTarget,\n };\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-drag-state.cjs","names":[],"sources":["../../src/hooks/use-drag-state.ts"],"sourcesContent":["import { useCallback, useState } from 'react';\nimport { DateStringValue, ScheduleEventData } from '../types';\n\nexport interface DropTarget {\n /** Target date in YYYY-MM-DD format */\n date: DateStringValue;\n\n /** Target time in HH:mm:ss format (for DayView/WeekView) */\n time?: string;\n\n /** Target slot index (for DayView/WeekView) */\n slotIndex?: number;\n}\n\nexport interface DragState {\n /** Whether an event is currently being dragged */\n isDragging: boolean;\n\n /** ID of the event being dragged */\n draggedEventId: string | number | null;\n\n /** The event being dragged */\n draggedEvent: ScheduleEventData | null;\n\n /** Current drop target information */\n dropTarget: DropTarget | null;\n}\n\nexport interface UseDragStateReturn {\n /** Current drag state */\n state: DragState;\n\n /** Start dragging an event */\n startDrag: (event: ScheduleEventData) => void;\n\n /** End dragging */\n endDrag: () => void;\n\n /** Set the current drop target */\n setDropTarget: (target: DropTarget | null) => void;\n\n /** Clear the drop target */\n clearDropTarget: () => void;\n}\n\nconst initialState: DragState = {\n isDragging: false,\n draggedEventId: null,\n draggedEvent: null,\n dropTarget: null,\n};\n\nexport function useDragState(): UseDragStateReturn {\n const [state, setState] = useState<DragState>(initialState);\n\n const startDrag = useCallback((event: ScheduleEventData) => {\n setState({\n isDragging: true,\n draggedEventId: event.id,\n draggedEvent: event,\n dropTarget: null,\n });\n }, []);\n\n const endDrag = useCallback(() => {\n setState(initialState);\n }, []);\n\n const setDropTarget = useCallback((target: DropTarget | null) => {\n setState((prev) => ({\n ...prev,\n dropTarget: target,\n }));\n }, []);\n\n const clearDropTarget = useCallback(() => {\n setState((prev) => ({\n ...prev,\n dropTarget: null,\n }));\n }, []);\n\n return {\n state,\n startDrag,\n endDrag,\n setDropTarget,\n clearDropTarget,\n };\n}\n"],"mappings":";;;;AA6CA,MAAM,eAA0B;CAC9B,YAAY;CACZ,gBAAgB;CAChB,cAAc;CACd,YAAY;CACb;AAED,SAAgB,eAAmC;CACjD,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,UAAgC,aAAa;AA6B3D,QAAO;EACL;EACA,YAAA,GAAA,MAAA,cA7B6B,UAA6B;AAC1D,YAAS;IACP,YAAY;IACZ,gBAAgB,MAAM;IACtB,cAAc;IACd,YAAY;IACb,CAAC;KACD,EAAE,CAAC;EAuBJ,UAAA,GAAA,MAAA,mBArBgC;AAChC,YAAS,aAAa;KACrB,EAAE,CAAC;EAoBJ,gBAAA,GAAA,MAAA,cAlBiC,WAA8B;AAC/D,aAAU,UAAU;IAClB,GAAG;IACH,YAAY;IACb,EAAE;KACF,EAAE,CAAC;EAcJ,kBAAA,GAAA,MAAA,mBAZwC;AACxC,aAAU,UAAU;IAClB,GAAG;IACH,YAAY;IACb,EAAE;KACF,EAAE,CAAC;EAQL"}
1
+ {"version":3,"file":"use-drag-state.cjs","names":[],"sources":["../../src/hooks/use-drag-state.ts"],"sourcesContent":["import { useCallback, useState } from 'react';\nimport { DateStringValue, ScheduleEventData } from '../types';\n\nexport interface DropTarget {\n /** Target date in YYYY-MM-DD format */\n date: DateStringValue;\n\n /** Target time in HH:mm:ss format (for DayView/WeekView) */\n time?: string;\n\n /** Target slot index (for DayView/WeekView) */\n slotIndex?: number;\n}\n\nexport interface DragState {\n /** Whether an event is currently being dragged */\n isDragging: boolean;\n\n /** ID of the event being dragged */\n draggedEventId: string | number | null;\n\n /** The event being dragged */\n draggedEvent: ScheduleEventData | null;\n\n /** Current drop target information */\n dropTarget: DropTarget | null;\n}\n\nexport interface UseDragStateReturn {\n /** Current drag state */\n state: DragState;\n\n /** Start dragging an event */\n startDrag: (event: ScheduleEventData) => void;\n\n /** End dragging */\n endDrag: () => void;\n\n /** Set the current drop target */\n setDropTarget: (target: DropTarget | null) => void;\n\n /** Clear the drop target */\n clearDropTarget: () => void;\n}\n\nconst initialState: DragState = {\n isDragging: false,\n draggedEventId: null,\n draggedEvent: null,\n dropTarget: null,\n};\n\nexport function useDragState(): UseDragStateReturn {\n const [state, setState] = useState<DragState>(initialState);\n\n const startDrag = useCallback((event: ScheduleEventData) => {\n setState({\n isDragging: true,\n draggedEventId: event.id,\n draggedEvent: event,\n dropTarget: null,\n });\n }, []);\n\n const endDrag = useCallback(() => {\n setState(initialState);\n }, []);\n\n const setDropTarget = useCallback((target: DropTarget | null) => {\n setState((prev) => ({\n ...prev,\n dropTarget: target,\n }));\n }, []);\n\n const clearDropTarget = useCallback(() => {\n setState((prev) => ({\n ...prev,\n dropTarget: null,\n }));\n }, []);\n\n return {\n state,\n startDrag,\n endDrag,\n setDropTarget,\n clearDropTarget,\n };\n}\n"],"mappings":";;;;AA6CA,MAAM,eAA0B;CAC9B,YAAY;CACZ,gBAAgB;CAChB,cAAc;CACd,YAAY;AACd;AAEA,SAAgB,eAAmC;CACjD,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,UAAgC,YAAY;CA6B1D,OAAO;EACL;EACA,YAAA,GAAA,MAAA,cA7B6B,UAA6B;GAC1D,SAAS;IACP,YAAY;IACZ,gBAAgB,MAAM;IACtB,cAAc;IACd,YAAY;GACd,CAAC;EACH,GAAG,CAAC,CAsBM;EACR,UAAA,GAAA,MAAA,mBArBgC;GAChC,SAAS,YAAY;EACvB,GAAG,CAAC,CAmBI;EACN,gBAAA,GAAA,MAAA,cAlBiC,WAA8B;GAC/D,UAAU,UAAU;IAClB,GAAG;IACH,YAAY;GACd,EAAE;EACJ,GAAG,CAAC,CAaU;EACZ,kBAAA,GAAA,MAAA,mBAZwC;GACxC,UAAU,UAAU;IAClB,GAAG;IACH,YAAY;GACd,EAAE;EACJ,GAAG,CAAC,CAOY;CAChB;AACF"}
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
  const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
3
+ const require_clamp_interval_minutes = require("../utils/clamp-interval-minutes/clamp-interval-minutes.cjs");
3
4
  const require_parse_time_string = require("../utils/parse-time-string/parse-time-string.cjs");
4
5
  let dayjs = require("dayjs");
5
6
  dayjs = require_runtime.__toESM(dayjs);
@@ -13,12 +14,15 @@ function useEventResize({ enabled = false, mode = "default", startTime, endTime,
13
14
  const parsedStartTime = require_parse_time_string.parseTimeString(startTime);
14
15
  const parsedEndTime = require_parse_time_string.parseTimeString(endTime);
15
16
  const startMinutes = parsedStartTime.hours * 60 + parsedStartTime.minutes;
16
- const totalMinutes = parsedEndTime.hours * 60 + parsedEndTime.minutes - startMinutes;
17
- const minHeightPercent = intervalMinutes / totalMinutes * 100;
17
+ const endMinutes = parsedEndTime.hours * 60 + parsedEndTime.minutes;
18
+ const clampedInterval = require_clamp_interval_minutes.clampIntervalMinutes(intervalMinutes);
19
+ const literalRange = endMinutes - startMinutes;
20
+ const totalMinutes = Math.ceil(literalRange / clampedInterval) * clampedInterval;
21
+ const minHeightPercent = clampedInterval / totalMinutes * 100;
18
22
  const clampAndSnap = (0, react.useCallback)((minutes) => {
19
- const snapped = Math.round(minutes / intervalMinutes) * intervalMinutes;
20
- return Math.max(0, Math.min(totalMinutes, snapped));
21
- }, [totalMinutes, intervalMinutes]);
23
+ const snapped = Math.round(minutes / clampedInterval) * clampedInterval;
24
+ return Math.max(0, Math.min(literalRange, snapped));
25
+ }, [literalRange, clampedInterval]);
22
26
  const percentToDateTime = (0, react.useCallback)((percent, eventDate) => {
23
27
  const totalMins = startMinutes + clampAndSnap(percent / 100 * totalMinutes);
24
28
  const hours = Math.floor(totalMins / 60);
@@ -1 +1 @@
1
- {"version":3,"file":"use-event-resize.cjs","names":["parseTimeString"],"sources":["../../src/hooks/use-event-resize.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { useCallback, useEffect, useEffectEvent, useRef, useState } from 'react';\nimport { DateTimeStringValue, ScheduleEventData, ScheduleMode } from '../types';\nimport { parseTimeString } from '../utils/parse-time-string/parse-time-string';\n\ntype ResizeEdge = 'top' | 'bottom';\n\ninterface ResizeState {\n eventId: string | number;\n event: ScheduleEventData;\n edge: ResizeEdge;\n container: HTMLElement;\n originalTop: number;\n originalHeight: number;\n currentTop: number;\n currentHeight: number;\n eventDate: string;\n originalStart: DateTimeStringValue;\n originalEnd: DateTimeStringValue;\n}\n\nexport interface UseEventResizeInput {\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 useEventResize({\n enabled = false,\n mode = 'default',\n startTime,\n endTime,\n intervalMinutes,\n onEventResize,\n canResizeEvent,\n}: UseEventResizeInput) {\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 totalMinutes = endMinutes - startMinutes;\n const minHeightPercent = (intervalMinutes / totalMinutes) * 100;\n\n const clampAndSnap = useCallback(\n (minutes: number): number => {\n const snapped = Math.round(minutes / intervalMinutes) * intervalMinutes;\n return Math.max(0, Math.min(totalMinutes, snapped));\n },\n [totalMinutes, intervalMinutes]\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 originalTop,\n originalHeight,\n eventDate,\n pointerEvent,\n }: {\n event: ScheduleEventData;\n edge: ResizeEdge;\n container: HTMLElement;\n originalTop: number;\n originalHeight: number;\n eventDate: string;\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 originalTop,\n originalHeight,\n currentTop: originalTop,\n currentHeight: originalHeight,\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 };\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 document.body.style.userSelect = 'none';\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 relativeY = e.clientY - containerRect.top;\n const rawPercent = Math.max(0, Math.min(100, (relativeY / containerRect.height) * 100));\n const snappedPercent = snapPercent(rawPercent);\n\n let newTop = state.originalTop;\n let newHeight = state.originalHeight;\n\n if (state.edge === 'bottom') {\n newHeight = Math.max(minHeightPercent, snappedPercent - state.originalTop);\n } else {\n const originalBottom = state.originalTop + state.originalHeight;\n newTop = Math.min(snappedPercent, originalBottom - minHeightPercent);\n newHeight = originalBottom - newTop;\n }\n\n resizeRef.current = { ...state, currentTop: newTop, currentHeight: newHeight };\n setResizeState(resizeRef.current);\n };\n\n const handlePointerUp = () => {\n const state = resizeRef.current;\n if (state) {\n if (\n state.currentTop !== state.originalTop ||\n state.currentHeight !== state.originalHeight\n ) {\n let newStart: DateTimeStringValue;\n let newEnd: DateTimeStringValue;\n\n if (state.edge === 'top') {\n newStart = percentToDateTime(state.currentTop, state.eventDate);\n newEnd = state.originalEnd;\n } else {\n newStart = state.originalStart;\n newEnd = percentToDateTime(state.currentTop + state.currentHeight, 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.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 { top: resizeState.currentTop, height: resizeState.currentHeight };\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 getResizePosition,\n isResizableEvent,\n wasResizing,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"use-event-resize.cjs","names":["parseTimeString","clampIntervalMinutes"],"sources":["../../src/hooks/use-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 { parseTimeString } from '../utils/parse-time-string/parse-time-string';\n\ntype ResizeEdge = 'top' | 'bottom';\n\ninterface ResizeState {\n eventId: string | number;\n event: ScheduleEventData;\n edge: ResizeEdge;\n container: HTMLElement;\n originalTop: number;\n originalHeight: number;\n currentTop: number;\n currentHeight: number;\n eventDate: string;\n originalStart: DateTimeStringValue;\n originalEnd: DateTimeStringValue;\n}\n\nexport interface UseEventResizeInput {\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 useEventResize({\n enabled = false,\n mode = 'default',\n startTime,\n endTime,\n intervalMinutes,\n onEventResize,\n canResizeEvent,\n}: UseEventResizeInput) {\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 minHeightPercent = (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 originalTop,\n originalHeight,\n eventDate,\n pointerEvent,\n }: {\n event: ScheduleEventData;\n edge: ResizeEdge;\n container: HTMLElement;\n originalTop: number;\n originalHeight: number;\n eventDate: string;\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 originalTop,\n originalHeight,\n currentTop: originalTop,\n currentHeight: originalHeight,\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 };\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 document.body.style.userSelect = 'none';\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 relativeY = e.clientY - containerRect.top;\n const rawPercent = Math.max(0, Math.min(100, (relativeY / containerRect.height) * 100));\n const snappedPercent = snapPercent(rawPercent);\n\n let newTop = state.originalTop;\n let newHeight = state.originalHeight;\n\n if (state.edge === 'bottom') {\n newHeight = Math.max(minHeightPercent, snappedPercent - state.originalTop);\n } else {\n const originalBottom = state.originalTop + state.originalHeight;\n newTop = Math.min(snappedPercent, originalBottom - minHeightPercent);\n newHeight = originalBottom - newTop;\n }\n\n resizeRef.current = { ...state, currentTop: newTop, currentHeight: newHeight };\n setResizeState(resizeRef.current);\n };\n\n const handlePointerUp = () => {\n const state = resizeRef.current;\n if (state) {\n if (\n state.currentTop !== state.originalTop ||\n state.currentHeight !== state.originalHeight\n ) {\n let newStart: DateTimeStringValue;\n let newEnd: DateTimeStringValue;\n\n if (state.edge === 'top') {\n newStart = percentToDateTime(state.currentTop, state.eventDate);\n newEnd = state.originalEnd;\n } else {\n newStart = state.originalStart;\n newEnd = percentToDateTime(state.currentTop + state.currentHeight, 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.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 { top: resizeState.currentTop, height: resizeState.currentHeight };\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 getResizePosition,\n isResizableEvent,\n wasResizing,\n };\n}\n"],"mappings":"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"}
@@ -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,UAAmD,KAAK;CAC9E,MAAM,WAAA,GAAA,MAAA,QAAmC,KAAK;CAC9C,MAAM,mBAAA,GAAA,MAAA,gBAAiC,oBAAoB,IAAI;CAE/D,MAAM,yBAAA,GAAA,MAAA,cACH,QAA+C,OAAe,UAAkB;AAC/E,MAAI,CAAC,QACH;AAEF,UAAQ,UAAU;GAAE;GAAO,YAAY;GAAO,cAAc;GAAO;AACnE,mBAAiB;GAAE;GAAO,OAAO;GAAO,KAAK;GAAO,CAAC;IAEvD,CAAC,QAAQ,CACV;CAED,MAAM,aAAa,kBAAkB;AAErC,EAAA,GAAA,MAAA,iBAAgB;AACd,MAAI,CAAC,WACH;EAGF,MAAM,kBAAkB,SAAS,KAAK,MAAM;AAC5C,WAAS,KAAK,MAAM,aAAa;EAEjC,MAAM,qBAAqB,MAAoB;AAC7C,OAAI,CAAC,QAAQ,QACX;GAGF,MAAM,WAAW,SAAS,kBAAkB,EAAE,SAAS,EAAE,QAAQ;AACjE,QAAK,MAAM,MAAM,UAAU;IACzB,MAAM,YAAa,GAAmB,eAAe,uBAAuB;IAC5E,MAAM,YAAa,GAAmB,eAAe,uBAAuB;AAC5E,QAAI,aAAa,QAAQ,aAAa,MAAM;AAC1C,SAAI,cAAc,QAAQ,QAAQ,OAAO;MACvC,MAAM,WAAW,OAAO,UAAU;AAClC,UAAI,CAAC,MAAM,SAAS,IAAI,aAAa,QAAQ,QAAQ,cAAc;AACjE,eAAQ,QAAQ,eAAe;AAC/B,wBAAiB;QACf,OAAO;QACP,OAAO,KAAK,IAAI,QAAQ,QAAQ,YAAY,SAAS;QACrD,KAAK,KAAK,IAAI,QAAQ,QAAQ,YAAY,SAAS;QACpD,CAAC;;;AAGN;;;;EAKN,MAAM,wBAAwB;AAC5B,OAAI,QAAQ,SAAS;IACnB,MAAM,EAAE,YAAY,cAAc,UAAU,QAAQ;AACpD,QAAI,eAAe,aACjB,iBACE,KAAK,IAAI,YAAY,aAAa,EAClC,KAAK,IAAI,YAAY,aAAa,EAClC,MACD;;AAGL,WAAQ,UAAU;AAClB,oBAAiB,KAAK;;AAGxB,WAAS,iBAAiB,eAAe,kBAAkB;AAC3D,WAAS,iBAAiB,aAAa,gBAAgB;AAEvD,eAAa;AACX,YAAS,KAAK,MAAM,aAAa;AACjC,YAAS,oBAAoB,eAAe,kBAAkB;AAC9D,YAAS,oBAAoB,aAAa,gBAAgB;;IAE3D,CAAC,WAAW,CAAC;AAYhB,QAAO;EACL;EACA,iBAAA,GAAA,MAAA,cAXC,OAAe,UAA2B;AACzC,OAAI,CAAC,iBAAiB,cAAc,UAAU,MAC5C,QAAO;AAET,UAAO,SAAS,cAAc,SAAS,SAAS,cAAc;KAEhE,CAAC,cAAc,CAChB;EAKC;EACD"}
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,UAAmD,IAAI;CAC7E,MAAM,WAAA,GAAA,MAAA,QAAmC,IAAI;CAC7C,MAAM,mBAAA,GAAA,MAAA,gBAAiC,oBAAoB,CAAC,EAAE;CAE9D,MAAM,yBAAA,GAAA,MAAA,cACH,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,iBAAgB;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,cAXC,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 +1 @@
1
- {"version":3,"file":"labels.cjs","names":[],"sources":["../src/labels.ts"],"sourcesContent":["export interface ScheduleLabels {\n day: string;\n week: string;\n month: string;\n year: string;\n allDay: string;\n weekday: string;\n timeSlot: string;\n today: string;\n next: string;\n previous: string;\n more: string;\n selectMonth: string;\n selectYear: string;\n switchToDayView: string;\n switchToWeekView: string;\n switchToMonthView: string;\n switchToYearView: string;\n viewSelectLabel: string;\n noEvents: string;\n moreLabel: (hiddenEventsCount: number) => string;\n}\n\nexport const DEFAULT_SCHEDULE_LABELS: ScheduleLabels = {\n today: 'Today',\n next: 'Next',\n previous: 'Previous',\n more: 'More',\n day: 'Day',\n week: 'Week',\n month: 'Month',\n year: 'Year',\n allDay: 'All day',\n weekday: 'Weekday',\n timeSlot: 'Time slot',\n selectMonth: 'Select month',\n selectYear: 'Select year',\n switchToDayView: 'Switch to day view',\n switchToWeekView: 'Switch to week view',\n switchToMonthView: 'Switch to month view',\n switchToYearView: 'Switch to year view',\n viewSelectLabel: 'Calendar view',\n noEvents: 'No events',\n moreLabel: (hiddenEventsCount: number) => `+${hiddenEventsCount} more`,\n};\n\nexport type ScheduleLabelsOverride = Partial<ScheduleLabels>;\n\nexport function getLabel<K extends keyof ScheduleLabels>(\n key: K,\n override?: ScheduleLabelsOverride\n): ScheduleLabels[K] {\n if (override) {\n return { ...DEFAULT_SCHEDULE_LABELS, ...override }[key];\n }\n\n return DEFAULT_SCHEDULE_LABELS[key];\n}\n"],"mappings":";;AAuBA,MAAa,0BAA0C;CACrD,OAAO;CACP,MAAM;CACN,UAAU;CACV,MAAM;CACN,KAAK;CACL,MAAM;CACN,OAAO;CACP,MAAM;CACN,QAAQ;CACR,SAAS;CACT,UAAU;CACV,aAAa;CACb,YAAY;CACZ,iBAAiB;CACjB,kBAAkB;CAClB,mBAAmB;CACnB,kBAAkB;CAClB,iBAAiB;CACjB,UAAU;CACV,YAAY,sBAA8B,IAAI,kBAAkB;CACjE;AAID,SAAgB,SACd,KACA,UACmB;AACnB,KAAI,SACF,QAAO;EAAE,GAAG;EAAyB,GAAG;EAAU,CAAC;AAGrD,QAAO,wBAAwB"}
1
+ {"version":3,"file":"labels.cjs","names":[],"sources":["../src/labels.ts"],"sourcesContent":["export interface ScheduleLabels {\n day: string;\n week: string;\n month: string;\n year: string;\n allDay: string;\n weekday: string;\n timeSlot: string;\n today: string;\n next: string;\n previous: string;\n more: string;\n selectMonth: string;\n selectYear: string;\n switchToDayView: string;\n switchToWeekView: string;\n switchToMonthView: string;\n switchToYearView: string;\n viewSelectLabel: string;\n noEvents: string;\n moreLabel: (hiddenEventsCount: number) => string;\n}\n\nexport const DEFAULT_SCHEDULE_LABELS: ScheduleLabels = {\n today: 'Today',\n next: 'Next',\n previous: 'Previous',\n more: 'More',\n day: 'Day',\n week: 'Week',\n month: 'Month',\n year: 'Year',\n allDay: 'All day',\n weekday: 'Weekday',\n timeSlot: 'Time slot',\n selectMonth: 'Select month',\n selectYear: 'Select year',\n switchToDayView: 'Switch to day view',\n switchToWeekView: 'Switch to week view',\n switchToMonthView: 'Switch to month view',\n switchToYearView: 'Switch to year view',\n viewSelectLabel: 'Calendar view',\n noEvents: 'No events',\n moreLabel: (hiddenEventsCount: number) => `+${hiddenEventsCount} more`,\n};\n\nexport type ScheduleLabelsOverride = Partial<ScheduleLabels>;\n\nexport function getLabel<K extends keyof ScheduleLabels>(\n key: K,\n override?: ScheduleLabelsOverride\n): ScheduleLabels[K] {\n if (override) {\n return { ...DEFAULT_SCHEDULE_LABELS, ...override }[key];\n }\n\n return DEFAULT_SCHEDULE_LABELS[key];\n}\n"],"mappings":";;AAuBA,MAAa,0BAA0C;CACrD,OAAO;CACP,MAAM;CACN,UAAU;CACV,MAAM;CACN,KAAK;CACL,MAAM;CACN,OAAO;CACP,MAAM;CACN,QAAQ;CACR,SAAS;CACT,UAAU;CACV,aAAa;CACb,YAAY;CACZ,iBAAiB;CACjB,kBAAkB;CAClB,mBAAmB;CACnB,kBAAkB;CAClB,iBAAiB;CACjB,UAAU;CACV,YAAY,sBAA8B,IAAI,kBAAkB;AAClE;AAIA,SAAgB,SACd,KACA,UACmB;CACnB,IAAI,UACF,OAAO;EAAE,GAAG;EAAyB,GAAG;CAAS,EAAE;CAGrD,OAAO,wBAAwB;AACjC"}
@@ -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,SAAsB,aAAa,IAAI,CAAC,MAAA,GAAA,MAAA,SAAW,aAAa,MAAM,EAAE,cAAc;CAE5F,MAAM,aAAaA,0BAAAA,gBAAgB,eAAe;CAGlD,MAAM,kBAAA,GAAA,MAAA,SAFkB,WAAW,CAAC,QAAQ,MAAM,CAEjB,KAAK,WAAW,MAAM,CAAC,OAAO,WAAW,QAAQ,CAAC,OAAO,EAAE;CAE5F,IAAI,kBAAkB;AAEtB,KAAI,eAAe,KAAK,aAAa,GAAG;EACtC,MAAM,cAAc,eAAe;EACnC,MAAM,gBAAgB,KAAK,MAAM,cAAc,gBAAgB;AAC/D,oBAAkB,eAAe,IAAI,eAAe,SAAS;;AAM/D,QAAO;EACL,OAJe,gBAAgB,QAAQ;EAKvC,KAJa,gBAAgB,IAAI,eAAe,cAAc,CAAC,QAAQ;EAKxE"}
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,SAAsB,aAAa,GAAG,EAAE,MAAA,GAAA,MAAA,SAAW,aAAa,KAAK,GAAG,aAAa;CAE3F,MAAM,aAAaA,0BAAAA,gBAAgB,cAAc;CAGjD,MAAM,kBAAA,GAAA,MAAA,SAFkB,UAAU,EAAE,QAAQ,KAEb,EAAE,KAAK,WAAW,KAAK,EAAE,OAAO,WAAW,OAAO,EAAE,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,EAAE,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,SAAsB,aAAa,IAAI,CAAC,MAAA,GAAA,MAAA,SAAW,aAAa,MAAM,EAAE,cAAc;CAE5F,MAAM,qBAAA,GAAA,MAAA,SAA0B,aAAa,MAAM;CAGnD,MAAM,YAAA,GAAA,MAAA,SAFuB,UAAU,CAAC,QAAQ,MAAM,CAGnD,KAAK,kBAAkB,MAAM,CAAC,CAC9B,OAAO,kBAAkB,QAAQ,CAAC,CAClC,OAAO,kBAAkB,QAAQ,CAAC,CAClC,YAAY,kBAAkB,aAAa,CAAC;CAE/C,MAAM,SAAS,SAAS,IAAI,eAAe,cAAc;AAEzD,QAAO;EACL,OAAO,SAAS,QAAQ;EACxB,KAAK,OAAO,QAAQ;EACrB"}
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,SAAsB,aAAa,GAAG,EAAE,MAAA,GAAA,MAAA,SAAW,aAAa,KAAK,GAAG,aAAa;CAE3F,MAAM,qBAAA,GAAA,MAAA,SAA0B,aAAa,KAAK;CAGlD,MAAM,YAAA,GAAA,MAAA,SAFuB,SAAS,EAAE,QAAQ,KAElB,EAC3B,KAAK,kBAAkB,KAAK,CAAC,EAC7B,OAAO,kBAAkB,OAAO,CAAC,EACjC,OAAO,kBAAkB,OAAO,CAAC,EACjC,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":"clamp-interval-minutes.cjs","names":[],"sources":["../../../src/utils/clamp-interval-minutes/clamp-interval-minutes.ts"],"sourcesContent":["/** Clamp interval minutes to valid values (1-60) and ensure it divides evenly into 60 */\nexport function clampIntervalMinutes(intervalMinutes: number): number {\n let clamped = Math.round(Math.max(1, Math.min(60, intervalMinutes)));\n clamped = 60 % clamped === 0 ? clamped : 60;\n return clamped;\n}\n"],"mappings":";;;AACA,SAAgB,qBAAqB,iBAAiC;CACpE,IAAI,UAAU,KAAK,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,gBAAgB,CAAC,CAAC;AACpE,WAAU,KAAK,YAAY,IAAI,UAAU;AACzC,QAAO"}
1
+ {"version":3,"file":"clamp-interval-minutes.cjs","names":[],"sources":["../../../src/utils/clamp-interval-minutes/clamp-interval-minutes.ts"],"sourcesContent":["/** Clamp interval minutes to valid values (1-60) and ensure it divides evenly into 60 */\nexport function clampIntervalMinutes(intervalMinutes: number): number {\n let clamped = Math.round(Math.max(1, Math.min(60, intervalMinutes)));\n clamped = 60 % clamped === 0 ? clamped : 60;\n return clamped;\n}\n"],"mappings":";;;AACA,SAAgB,qBAAqB,iBAAiC;CACpE,IAAI,UAAU,KAAK,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,eAAe,CAAC,CAAC;CACnE,UAAU,KAAK,YAAY,IAAI,UAAU;CACzC,OAAO;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"expand-recurring-events.cjs","names":["rruleAll","validateEvent"],"sources":["../../../src/utils/expand-recurring-events/expand-recurring-events.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport * as rruleAll from 'rrule';\n\nconst RRule = (\n 'default' in rruleAll ? (rruleAll as any).default.RRule : rruleAll.RRule\n) as typeof rruleAll.RRule;\nimport { DateTimeStringValue, ScheduleEventData, ScheduleRecurrenceData } from '../../types';\nimport { validateEvent } from '../validate-event/validate-event';\n\ninterface ExpandRecurringEventsInput {\n events: ScheduleEventData[] | undefined;\n rangeStart: Date | string;\n rangeEnd: Date | string;\n expansionLimit?: number;\n}\n\nfunction getRecurrenceKey(recurringEventId: string | number, recurrenceId: DateTimeStringValue) {\n return `${recurringEventId}::${recurrenceId}`;\n}\n\nfunction overlapsRange(\n eventStart: dayjs.Dayjs,\n eventEnd: dayjs.Dayjs,\n rangeStart: dayjs.Dayjs,\n rangeEnd: dayjs.Dayjs\n) {\n return (\n (eventEnd.isAfter(rangeStart) || eventEnd.isSame(rangeStart)) &&\n (eventStart.isBefore(rangeEnd) || eventStart.isSame(rangeEnd))\n );\n}\n\nfunction getExdateSet(recurrence: ScheduleRecurrenceData | undefined) {\n if (!recurrence?.exdate) {\n return new Set<string>();\n }\n\n const values = recurrence.exdate\n .map((value) => dayjs(value))\n .filter((value) => value.isValid())\n .map((value) => value.format('YYYY-MM-DD HH:mm:ss'));\n\n return new Set(values);\n}\n\nfunction getRRuleString(rule: string) {\n const normalized = rule.trim();\n if (!normalized.includes('\\n')) {\n return normalized.startsWith('RRULE:') ? normalized.replace(/^RRULE:/, '') : normalized;\n }\n\n const rruleLine = normalized\n .split('\\n')\n .map((line) => line.trim())\n .find((line) => line.startsWith('RRULE:'));\n\n return rruleLine ? rruleLine.replace(/^RRULE:/, '') : normalized;\n}\n\nfunction getOccurrenceStartsInRange(\n event: ScheduleEventData,\n rangeStart: dayjs.Dayjs,\n rangeEnd: dayjs.Dayjs,\n expansionLimit: number,\n durationMs: number\n) {\n const dtstart = dayjs(event.recurrence?.dtstart || event.start);\n if (!dtstart.isValid() || !event.recurrence) {\n return [];\n }\n\n try {\n const options = RRule.parseString(getRRuleString(event.recurrence.rrule));\n options.dtstart = dtstart.toDate();\n const rule = new RRule(options);\n\n const searchStart = rangeStart.subtract(Math.max(0, durationMs), 'millisecond').toDate();\n const results = rule.between(searchStart, rangeEnd.toDate(), true);\n return results.slice(0, expansionLimit).map((value) => dayjs(value));\n } catch {\n return [];\n }\n}\n\nfunction isEventInRange(event: ScheduleEventData, rangeStart: dayjs.Dayjs, rangeEnd: dayjs.Dayjs) {\n const start = dayjs(event.start);\n const end = dayjs(event.end);\n\n if (!start.isValid() || !end.isValid()) {\n return false;\n }\n\n return overlapsRange(start, end, rangeStart, rangeEnd);\n}\n\nfunction createGeneratedInstance(\n event: ScheduleEventData,\n occurrenceStart: dayjs.Dayjs,\n durationMs: number\n): ScheduleEventData {\n const occurrenceEnd = occurrenceStart.add(durationMs, 'millisecond');\n const recurrenceId = occurrenceStart.format('YYYY-MM-DD HH:mm:ss');\n const { recurrence, ...eventWithoutRecurrence } = event;\n\n return {\n ...eventWithoutRecurrence,\n id: `${event.id}::${recurrenceId}`,\n start: occurrenceStart.format('YYYY-MM-DD HH:mm:ss'),\n end: occurrenceEnd.format('YYYY-MM-DD HH:mm:ss'),\n recurringEventId: event.id,\n recurrenceId,\n recurringInstance: {\n isRecurringInstance: true,\n recurringEventId: event.id,\n recurrenceId,\n originalStart: occurrenceStart.format('YYYY-MM-DD HH:mm:ss'),\n originalEnd: occurrenceEnd.format('YYYY-MM-DD HH:mm:ss'),\n },\n };\n}\n\nconst DEFAULT_EXPANSION_LIMIT = 2000;\n\nexport function expandRecurringEvents({\n events,\n rangeStart,\n rangeEnd,\n expansionLimit = DEFAULT_EXPANSION_LIMIT,\n}: ExpandRecurringEventsInput): ScheduleEventData[] {\n if (!events || events.length === 0) {\n return [];\n }\n\n const start = dayjs(rangeStart);\n const end = dayjs(rangeEnd);\n\n if (!start.isValid() || !end.isValid()) {\n return [];\n }\n\n const regularEvents: ScheduleEventData[] = [];\n const recurringEvents: ScheduleEventData[] = [];\n const overrides = new Map<string, ScheduleEventData>();\n\n for (const event of events) {\n if (event.recurringEventId && event.recurrenceId) {\n overrides.set(getRecurrenceKey(event.recurringEventId, event.recurrenceId), event);\n continue;\n }\n\n if (event.recurrence?.rrule) {\n recurringEvents.push(event);\n continue;\n }\n\n regularEvents.push(event);\n }\n\n const output: ScheduleEventData[] = [];\n const consumedOverrideIds = new Set<string | number>();\n\n for (const event of regularEvents) {\n if (isEventInRange(event, start, end)) {\n output.push(validateEvent(event));\n }\n }\n\n for (const event of recurringEvents) {\n const eventStart = dayjs(event.recurrence?.dtstart || event.start);\n const eventEnd = dayjs(event.end);\n\n if (!eventStart.isValid() || !eventEnd.isValid()) {\n continue;\n }\n\n const durationMs = eventEnd.diff(dayjs(event.start), 'millisecond');\n if (durationMs < 0) {\n continue;\n }\n\n const exdate = getExdateSet(event.recurrence);\n const starts = getOccurrenceStartsInRange(event, start, end, expansionLimit, durationMs);\n\n for (const occurrenceStart of starts) {\n const recurrenceId = occurrenceStart.format('YYYY-MM-DD HH:mm:ss');\n if (exdate.has(recurrenceId)) {\n continue;\n }\n\n const overrideKey = getRecurrenceKey(event.id, recurrenceId);\n const override = overrides.get(overrideKey);\n if (override) {\n if (isEventInRange(override, start, end)) {\n output.push(validateEvent(override));\n consumedOverrideIds.add(override.id);\n }\n continue;\n }\n\n const generated = createGeneratedInstance(event, occurrenceStart, durationMs);\n if (overlapsRange(dayjs(generated.start), dayjs(generated.end), start, end)) {\n output.push(validateEvent(generated));\n }\n }\n }\n\n for (const override of overrides.values()) {\n if (consumedOverrideIds.has(override.id)) {\n continue;\n }\n if (isEventInRange(override, start, end)) {\n output.push(validateEvent(override));\n }\n }\n\n return output;\n}\n\nexport { DEFAULT_EXPANSION_LIMIT };\n"],"mappings":";;;;;;;;AAGA,MAAM,QACJ,aAAaA,QAAYA,MAAiB,QAAQ,QAAQA,MAAS;AAYrE,SAAS,iBAAiB,kBAAmC,cAAmC;AAC9F,QAAO,GAAG,iBAAiB,IAAI;;AAGjC,SAAS,cACP,YACA,UACA,YACA,UACA;AACA,SACG,SAAS,QAAQ,WAAW,IAAI,SAAS,OAAO,WAAW,MAC3D,WAAW,SAAS,SAAS,IAAI,WAAW,OAAO,SAAS;;AAIjE,SAAS,aAAa,YAAgD;AACpE,KAAI,CAAC,YAAY,OACf,wBAAO,IAAI,KAAa;CAG1B,MAAM,SAAS,WAAW,OACvB,KAAK,WAAA,GAAA,MAAA,SAAgB,MAAM,CAAC,CAC5B,QAAQ,UAAU,MAAM,SAAS,CAAC,CAClC,KAAK,UAAU,MAAM,OAAO,sBAAsB,CAAC;AAEtD,QAAO,IAAI,IAAI,OAAO;;AAGxB,SAAS,eAAe,MAAc;CACpC,MAAM,aAAa,KAAK,MAAM;AAC9B,KAAI,CAAC,WAAW,SAAS,KAAK,CAC5B,QAAO,WAAW,WAAW,SAAS,GAAG,WAAW,QAAQ,WAAW,GAAG,GAAG;CAG/E,MAAM,YAAY,WACf,MAAM,KAAK,CACX,KAAK,SAAS,KAAK,MAAM,CAAC,CAC1B,MAAM,SAAS,KAAK,WAAW,SAAS,CAAC;AAE5C,QAAO,YAAY,UAAU,QAAQ,WAAW,GAAG,GAAG;;AAGxD,SAAS,2BACP,OACA,YACA,UACA,gBACA,YACA;CACA,MAAM,WAAA,GAAA,MAAA,SAAgB,MAAM,YAAY,WAAW,MAAM,MAAM;AAC/D,KAAI,CAAC,QAAQ,SAAS,IAAI,CAAC,MAAM,WAC/B,QAAO,EAAE;AAGX,KAAI;EACF,MAAM,UAAU,MAAM,YAAY,eAAe,MAAM,WAAW,MAAM,CAAC;AACzE,UAAQ,UAAU,QAAQ,QAAQ;EAClC,MAAM,OAAO,IAAI,MAAM,QAAQ;EAE/B,MAAM,cAAc,WAAW,SAAS,KAAK,IAAI,GAAG,WAAW,EAAE,cAAc,CAAC,QAAQ;AAExF,SADgB,KAAK,QAAQ,aAAa,SAAS,QAAQ,EAAE,KAAK,CACnD,MAAM,GAAG,eAAe,CAAC,KAAK,WAAA,GAAA,MAAA,SAAgB,MAAM,CAAC;SAC9D;AACN,SAAO,EAAE;;;AAIb,SAAS,eAAe,OAA0B,YAAyB,UAAuB;CAChG,MAAM,SAAA,GAAA,MAAA,SAAc,MAAM,MAAM;CAChC,MAAM,OAAA,GAAA,MAAA,SAAY,MAAM,IAAI;AAE5B,KAAI,CAAC,MAAM,SAAS,IAAI,CAAC,IAAI,SAAS,CACpC,QAAO;AAGT,QAAO,cAAc,OAAO,KAAK,YAAY,SAAS;;AAGxD,SAAS,wBACP,OACA,iBACA,YACmB;CACnB,MAAM,gBAAgB,gBAAgB,IAAI,YAAY,cAAc;CACpE,MAAM,eAAe,gBAAgB,OAAO,sBAAsB;CAClE,MAAM,EAAE,YAAY,GAAG,2BAA2B;AAElD,QAAO;EACL,GAAG;EACH,IAAI,GAAG,MAAM,GAAG,IAAI;EACpB,OAAO,gBAAgB,OAAO,sBAAsB;EACpD,KAAK,cAAc,OAAO,sBAAsB;EAChD,kBAAkB,MAAM;EACxB;EACA,mBAAmB;GACjB,qBAAqB;GACrB,kBAAkB,MAAM;GACxB;GACA,eAAe,gBAAgB,OAAO,sBAAsB;GAC5D,aAAa,cAAc,OAAO,sBAAsB;GACzD;EACF;;AAGH,MAAM,0BAA0B;AAEhC,SAAgB,sBAAsB,EACpC,QACA,YACA,UACA,iBAAiB,2BACiC;AAClD,KAAI,CAAC,UAAU,OAAO,WAAW,EAC/B,QAAO,EAAE;CAGX,MAAM,SAAA,GAAA,MAAA,SAAc,WAAW;CAC/B,MAAM,OAAA,GAAA,MAAA,SAAY,SAAS;AAE3B,KAAI,CAAC,MAAM,SAAS,IAAI,CAAC,IAAI,SAAS,CACpC,QAAO,EAAE;CAGX,MAAM,gBAAqC,EAAE;CAC7C,MAAM,kBAAuC,EAAE;CAC/C,MAAM,4BAAY,IAAI,KAAgC;AAEtD,MAAK,MAAM,SAAS,QAAQ;AAC1B,MAAI,MAAM,oBAAoB,MAAM,cAAc;AAChD,aAAU,IAAI,iBAAiB,MAAM,kBAAkB,MAAM,aAAa,EAAE,MAAM;AAClF;;AAGF,MAAI,MAAM,YAAY,OAAO;AAC3B,mBAAgB,KAAK,MAAM;AAC3B;;AAGF,gBAAc,KAAK,MAAM;;CAG3B,MAAM,SAA8B,EAAE;CACtC,MAAM,sCAAsB,IAAI,KAAsB;AAEtD,MAAK,MAAM,SAAS,cAClB,KAAI,eAAe,OAAO,OAAO,IAAI,CACnC,QAAO,KAAKC,uBAAAA,cAAc,MAAM,CAAC;AAIrC,MAAK,MAAM,SAAS,iBAAiB;EACnC,MAAM,cAAA,GAAA,MAAA,SAAmB,MAAM,YAAY,WAAW,MAAM,MAAM;EAClE,MAAM,YAAA,GAAA,MAAA,SAAiB,MAAM,IAAI;AAEjC,MAAI,CAAC,WAAW,SAAS,IAAI,CAAC,SAAS,SAAS,CAC9C;EAGF,MAAM,aAAa,SAAS,MAAA,GAAA,MAAA,SAAW,MAAM,MAAM,EAAE,cAAc;AACnE,MAAI,aAAa,EACf;EAGF,MAAM,SAAS,aAAa,MAAM,WAAW;EAC7C,MAAM,SAAS,2BAA2B,OAAO,OAAO,KAAK,gBAAgB,WAAW;AAExF,OAAK,MAAM,mBAAmB,QAAQ;GACpC,MAAM,eAAe,gBAAgB,OAAO,sBAAsB;AAClE,OAAI,OAAO,IAAI,aAAa,CAC1B;GAGF,MAAM,cAAc,iBAAiB,MAAM,IAAI,aAAa;GAC5D,MAAM,WAAW,UAAU,IAAI,YAAY;AAC3C,OAAI,UAAU;AACZ,QAAI,eAAe,UAAU,OAAO,IAAI,EAAE;AACxC,YAAO,KAAKA,uBAAAA,cAAc,SAAS,CAAC;AACpC,yBAAoB,IAAI,SAAS,GAAG;;AAEtC;;GAGF,MAAM,YAAY,wBAAwB,OAAO,iBAAiB,WAAW;AAC7E,OAAI,eAAA,GAAA,MAAA,SAAoB,UAAU,MAAM,GAAA,GAAA,MAAA,SAAQ,UAAU,IAAI,EAAE,OAAO,IAAI,CACzE,QAAO,KAAKA,uBAAAA,cAAc,UAAU,CAAC;;;AAK3C,MAAK,MAAM,YAAY,UAAU,QAAQ,EAAE;AACzC,MAAI,oBAAoB,IAAI,SAAS,GAAG,CACtC;AAEF,MAAI,eAAe,UAAU,OAAO,IAAI,CACtC,QAAO,KAAKA,uBAAAA,cAAc,SAAS,CAAC;;AAIxC,QAAO"}
1
+ {"version":3,"file":"expand-recurring-events.cjs","names":["rruleAll","validateEvent"],"sources":["../../../src/utils/expand-recurring-events/expand-recurring-events.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport * as rruleAll from 'rrule';\n\nconst RRule = (\n 'default' in rruleAll ? (rruleAll as any).default.RRule : rruleAll.RRule\n) as typeof rruleAll.RRule;\nimport { DateTimeStringValue, ScheduleEventData, ScheduleRecurrenceData } from '../../types';\nimport { validateEvent } from '../validate-event/validate-event';\n\ninterface ExpandRecurringEventsInput {\n events: ScheduleEventData[] | undefined;\n rangeStart: Date | string;\n rangeEnd: Date | string;\n expansionLimit?: number;\n}\n\nfunction getRecurrenceKey(recurringEventId: string | number, recurrenceId: DateTimeStringValue) {\n return `${recurringEventId}::${recurrenceId}`;\n}\n\nfunction overlapsRange(\n eventStart: dayjs.Dayjs,\n eventEnd: dayjs.Dayjs,\n rangeStart: dayjs.Dayjs,\n rangeEnd: dayjs.Dayjs\n) {\n return (\n (eventEnd.isAfter(rangeStart) || eventEnd.isSame(rangeStart)) &&\n (eventStart.isBefore(rangeEnd) || eventStart.isSame(rangeEnd))\n );\n}\n\nfunction getExdateSet(recurrence: ScheduleRecurrenceData | undefined) {\n if (!recurrence?.exdate) {\n return new Set<string>();\n }\n\n const values = recurrence.exdate\n .map((value) => dayjs(value))\n .filter((value) => value.isValid())\n .map((value) => value.format('YYYY-MM-DD HH:mm:ss'));\n\n return new Set(values);\n}\n\nfunction getRRuleString(rule: string) {\n const normalized = rule.trim();\n if (!normalized.includes('\\n')) {\n return normalized.startsWith('RRULE:') ? normalized.replace(/^RRULE:/, '') : normalized;\n }\n\n const rruleLine = normalized\n .split('\\n')\n .map((line) => line.trim())\n .find((line) => line.startsWith('RRULE:'));\n\n return rruleLine ? rruleLine.replace(/^RRULE:/, '') : normalized;\n}\n\nfunction getOccurrenceStartsInRange(\n event: ScheduleEventData,\n rangeStart: dayjs.Dayjs,\n rangeEnd: dayjs.Dayjs,\n expansionLimit: number,\n durationMs: number\n) {\n const dtstart = dayjs(event.recurrence?.dtstart || event.start);\n if (!dtstart.isValid() || !event.recurrence) {\n return [];\n }\n\n try {\n const options = RRule.parseString(getRRuleString(event.recurrence.rrule));\n options.dtstart = dtstart.toDate();\n const rule = new RRule(options);\n\n const searchStart = rangeStart.subtract(Math.max(0, durationMs), 'millisecond').toDate();\n const results = rule.between(searchStart, rangeEnd.toDate(), true);\n return results.slice(0, expansionLimit).map((value) => dayjs(value));\n } catch {\n return [];\n }\n}\n\nfunction isEventInRange(event: ScheduleEventData, rangeStart: dayjs.Dayjs, rangeEnd: dayjs.Dayjs) {\n const start = dayjs(event.start);\n const end = dayjs(event.end);\n\n if (!start.isValid() || !end.isValid()) {\n return false;\n }\n\n return overlapsRange(start, end, rangeStart, rangeEnd);\n}\n\nfunction createGeneratedInstance(\n event: ScheduleEventData,\n occurrenceStart: dayjs.Dayjs,\n durationMs: number\n): ScheduleEventData {\n const occurrenceEnd = occurrenceStart.add(durationMs, 'millisecond');\n const recurrenceId = occurrenceStart.format('YYYY-MM-DD HH:mm:ss');\n const { recurrence, ...eventWithoutRecurrence } = event;\n\n return {\n ...eventWithoutRecurrence,\n id: `${event.id}::${recurrenceId}`,\n start: occurrenceStart.format('YYYY-MM-DD HH:mm:ss'),\n end: occurrenceEnd.format('YYYY-MM-DD HH:mm:ss'),\n recurringEventId: event.id,\n recurrenceId,\n recurringInstance: {\n isRecurringInstance: true,\n recurringEventId: event.id,\n recurrenceId,\n originalStart: occurrenceStart.format('YYYY-MM-DD HH:mm:ss'),\n originalEnd: occurrenceEnd.format('YYYY-MM-DD HH:mm:ss'),\n },\n };\n}\n\nconst DEFAULT_EXPANSION_LIMIT = 2000;\n\nexport function expandRecurringEvents({\n events,\n rangeStart,\n rangeEnd,\n expansionLimit = DEFAULT_EXPANSION_LIMIT,\n}: ExpandRecurringEventsInput): ScheduleEventData[] {\n if (!events || events.length === 0) {\n return [];\n }\n\n const start = dayjs(rangeStart);\n const end = dayjs(rangeEnd);\n\n if (!start.isValid() || !end.isValid()) {\n return [];\n }\n\n const regularEvents: ScheduleEventData[] = [];\n const recurringEvents: ScheduleEventData[] = [];\n const overrides = new Map<string, ScheduleEventData>();\n\n for (const event of events) {\n if (event.recurringEventId && event.recurrenceId) {\n overrides.set(getRecurrenceKey(event.recurringEventId, event.recurrenceId), event);\n continue;\n }\n\n if (event.recurrence?.rrule) {\n recurringEvents.push(event);\n continue;\n }\n\n regularEvents.push(event);\n }\n\n const output: ScheduleEventData[] = [];\n const consumedOverrideIds = new Set<string | number>();\n\n for (const event of regularEvents) {\n if (isEventInRange(event, start, end)) {\n output.push(validateEvent(event));\n }\n }\n\n for (const event of recurringEvents) {\n const eventStart = dayjs(event.recurrence?.dtstart || event.start);\n const eventEnd = dayjs(event.end);\n\n if (!eventStart.isValid() || !eventEnd.isValid()) {\n continue;\n }\n\n const durationMs = eventEnd.diff(dayjs(event.start), 'millisecond');\n if (durationMs < 0) {\n continue;\n }\n\n const exdate = getExdateSet(event.recurrence);\n const starts = getOccurrenceStartsInRange(event, start, end, expansionLimit, durationMs);\n\n for (const occurrenceStart of starts) {\n const recurrenceId = occurrenceStart.format('YYYY-MM-DD HH:mm:ss');\n if (exdate.has(recurrenceId)) {\n continue;\n }\n\n const overrideKey = getRecurrenceKey(event.id, recurrenceId);\n const override = overrides.get(overrideKey);\n if (override) {\n if (isEventInRange(override, start, end)) {\n output.push(validateEvent(override));\n consumedOverrideIds.add(override.id);\n }\n continue;\n }\n\n const generated = createGeneratedInstance(event, occurrenceStart, durationMs);\n if (overlapsRange(dayjs(generated.start), dayjs(generated.end), start, end)) {\n output.push(validateEvent(generated));\n }\n }\n }\n\n for (const override of overrides.values()) {\n if (consumedOverrideIds.has(override.id)) {\n continue;\n }\n if (isEventInRange(override, start, end)) {\n output.push(validateEvent(override));\n }\n }\n\n return output;\n}\n\nexport { DEFAULT_EXPANSION_LIMIT };\n"],"mappings":";;;;;;;;AAGA,MAAM,QACJ,aAAaA,QAAYA,MAAiB,QAAQ,QAAQA,MAAS;AAYrE,SAAS,iBAAiB,kBAAmC,cAAmC;CAC9F,OAAO,GAAG,iBAAiB,IAAI;AACjC;AAEA,SAAS,cACP,YACA,UACA,YACA,UACA;CACA,QACG,SAAS,QAAQ,UAAU,KAAK,SAAS,OAAO,UAAU,OAC1D,WAAW,SAAS,QAAQ,KAAK,WAAW,OAAO,QAAQ;AAEhE;AAEA,SAAS,aAAa,YAAgD;CACpE,IAAI,CAAC,YAAY,QACf,uBAAO,IAAI,IAAY;CAGzB,MAAM,SAAS,WAAW,OACvB,KAAK,WAAA,GAAA,MAAA,SAAgB,KAAK,CAAC,EAC3B,QAAQ,UAAU,MAAM,QAAQ,CAAC,EACjC,KAAK,UAAU,MAAM,OAAO,qBAAqB,CAAC;CAErD,OAAO,IAAI,IAAI,MAAM;AACvB;AAEA,SAAS,eAAe,MAAc;CACpC,MAAM,aAAa,KAAK,KAAK;CAC7B,IAAI,CAAC,WAAW,SAAS,IAAI,GAC3B,OAAO,WAAW,WAAW,QAAQ,IAAI,WAAW,QAAQ,WAAW,EAAE,IAAI;CAG/E,MAAM,YAAY,WACf,MAAM,IAAI,EACV,KAAK,SAAS,KAAK,KAAK,CAAC,EACzB,MAAM,SAAS,KAAK,WAAW,QAAQ,CAAC;CAE3C,OAAO,YAAY,UAAU,QAAQ,WAAW,EAAE,IAAI;AACxD;AAEA,SAAS,2BACP,OACA,YACA,UACA,gBACA,YACA;CACA,MAAM,WAAA,GAAA,MAAA,SAAgB,MAAM,YAAY,WAAW,MAAM,KAAK;CAC9D,IAAI,CAAC,QAAQ,QAAQ,KAAK,CAAC,MAAM,YAC/B,OAAO,CAAC;CAGV,IAAI;EACF,MAAM,UAAU,MAAM,YAAY,eAAe,MAAM,WAAW,KAAK,CAAC;EACxE,QAAQ,UAAU,QAAQ,OAAO;EACjC,MAAM,OAAO,IAAI,MAAM,OAAO;EAE9B,MAAM,cAAc,WAAW,SAAS,KAAK,IAAI,GAAG,UAAU,GAAG,aAAa,EAAE,OAAO;EAEvF,OADgB,KAAK,QAAQ,aAAa,SAAS,OAAO,GAAG,IAChD,EAAE,MAAM,GAAG,cAAc,EAAE,KAAK,WAAA,GAAA,MAAA,SAAgB,KAAK,CAAC;CACrE,QAAQ;EACN,OAAO,CAAC;CACV;AACF;AAEA,SAAS,eAAe,OAA0B,YAAyB,UAAuB;CAChG,MAAM,SAAA,GAAA,MAAA,SAAc,MAAM,KAAK;CAC/B,MAAM,OAAA,GAAA,MAAA,SAAY,MAAM,GAAG;CAE3B,IAAI,CAAC,MAAM,QAAQ,KAAK,CAAC,IAAI,QAAQ,GACnC,OAAO;CAGT,OAAO,cAAc,OAAO,KAAK,YAAY,QAAQ;AACvD;AAEA,SAAS,wBACP,OACA,iBACA,YACmB;CACnB,MAAM,gBAAgB,gBAAgB,IAAI,YAAY,aAAa;CACnE,MAAM,eAAe,gBAAgB,OAAO,qBAAqB;CACjE,MAAM,EAAE,YAAY,GAAG,2BAA2B;CAElD,OAAO;EACL,GAAG;EACH,IAAI,GAAG,MAAM,GAAG,IAAI;EACpB,OAAO,gBAAgB,OAAO,qBAAqB;EACnD,KAAK,cAAc,OAAO,qBAAqB;EAC/C,kBAAkB,MAAM;EACxB;EACA,mBAAmB;GACjB,qBAAqB;GACrB,kBAAkB,MAAM;GACxB;GACA,eAAe,gBAAgB,OAAO,qBAAqB;GAC3D,aAAa,cAAc,OAAO,qBAAqB;EACzD;CACF;AACF;AAEA,MAAM,0BAA0B;AAEhC,SAAgB,sBAAsB,EACpC,QACA,YACA,UACA,iBAAiB,2BACiC;CAClD,IAAI,CAAC,UAAU,OAAO,WAAW,GAC/B,OAAO,CAAC;CAGV,MAAM,SAAA,GAAA,MAAA,SAAc,UAAU;CAC9B,MAAM,OAAA,GAAA,MAAA,SAAY,QAAQ;CAE1B,IAAI,CAAC,MAAM,QAAQ,KAAK,CAAC,IAAI,QAAQ,GACnC,OAAO,CAAC;CAGV,MAAM,gBAAqC,CAAC;CAC5C,MAAM,kBAAuC,CAAC;CAC9C,MAAM,4BAAY,IAAI,IAA+B;CAErD,KAAK,MAAM,SAAS,QAAQ;EAC1B,IAAI,MAAM,oBAAoB,MAAM,cAAc;GAChD,UAAU,IAAI,iBAAiB,MAAM,kBAAkB,MAAM,YAAY,GAAG,KAAK;GACjF;EACF;EAEA,IAAI,MAAM,YAAY,OAAO;GAC3B,gBAAgB,KAAK,KAAK;GAC1B;EACF;EAEA,cAAc,KAAK,KAAK;CAC1B;CAEA,MAAM,SAA8B,CAAC;CACrC,MAAM,sCAAsB,IAAI,IAAqB;CAErD,KAAK,MAAM,SAAS,eAClB,IAAI,eAAe,OAAO,OAAO,GAAG,GAClC,OAAO,KAAKC,uBAAAA,cAAc,KAAK,CAAC;CAIpC,KAAK,MAAM,SAAS,iBAAiB;EACnC,MAAM,cAAA,GAAA,MAAA,SAAmB,MAAM,YAAY,WAAW,MAAM,KAAK;EACjE,MAAM,YAAA,GAAA,MAAA,SAAiB,MAAM,GAAG;EAEhC,IAAI,CAAC,WAAW,QAAQ,KAAK,CAAC,SAAS,QAAQ,GAC7C;EAGF,MAAM,aAAa,SAAS,MAAA,GAAA,MAAA,SAAW,MAAM,KAAK,GAAG,aAAa;EAClE,IAAI,aAAa,GACf;EAGF,MAAM,SAAS,aAAa,MAAM,UAAU;EAC5C,MAAM,SAAS,2BAA2B,OAAO,OAAO,KAAK,gBAAgB,UAAU;EAEvF,KAAK,MAAM,mBAAmB,QAAQ;GACpC,MAAM,eAAe,gBAAgB,OAAO,qBAAqB;GACjE,IAAI,OAAO,IAAI,YAAY,GACzB;GAGF,MAAM,cAAc,iBAAiB,MAAM,IAAI,YAAY;GAC3D,MAAM,WAAW,UAAU,IAAI,WAAW;GAC1C,IAAI,UAAU;IACZ,IAAI,eAAe,UAAU,OAAO,GAAG,GAAG;KACxC,OAAO,KAAKA,uBAAAA,cAAc,QAAQ,CAAC;KACnC,oBAAoB,IAAI,SAAS,EAAE;IACrC;IACA;GACF;GAEA,MAAM,YAAY,wBAAwB,OAAO,iBAAiB,UAAU;GAC5E,IAAI,eAAA,GAAA,MAAA,SAAoB,UAAU,KAAK,IAAA,GAAA,MAAA,SAAS,UAAU,GAAG,GAAG,OAAO,GAAG,GACxE,OAAO,KAAKA,uBAAAA,cAAc,SAAS,CAAC;EAExC;CACF;CAEA,KAAK,MAAM,YAAY,UAAU,OAAO,GAAG;EACzC,IAAI,oBAAoB,IAAI,SAAS,EAAE,GACrC;EAEF,IAAI,eAAe,UAAU,OAAO,GAAG,GACrC,OAAO,KAAKA,uBAAAA,cAAc,QAAQ,CAAC;CAEvC;CAEA,OAAO;AACT"}
@@ -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;AACpE,KAAI,OAAO,WAAW,WACpB,QAAO,QAAA,GAAA,MAAA,SAAa,KAAK,CAAC,OAAO,sBAAsB,CAAC;AAG1D,SAAA,GAAA,MAAA,SAAa,KAAK,CAAC,OAAO,OAAO,CAAC,OAAO,OAAO"}
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,SAAa,IAAI,EAAE,OAAO,qBAAqB,CAAC;CAGzD,QAAA,GAAA,MAAA,SAAa,IAAI,EAAE,OAAO,MAAM,EAAE,OAAO,MAAM;AACjD"}
@@ -1,18 +1,35 @@
1
1
  "use client";
2
2
  //#region packages/@mantine/schedule/src/utils/get-business-hours-mod/get-business-hours-mod.ts
3
+ function isBusinessHoursRange(value) {
4
+ return Array.isArray(value) && value.length === 2 && typeof value[0] === "string" && typeof value[1] === "string";
5
+ }
3
6
  /**
4
7
  * Determines if a given time is within business hours and returns modifier object
5
8
  * @param time - Time string in HH:mm:ss format
6
- * @param businessHours - Tuple of [start, end] times in HH:mm:ss format
9
+ * @param businessHours - Tuple of [start, end] times in HH:mm:ss format, or per-day record keyed by day of the week
7
10
  * @param highlightBusinessHours - Whether to highlight business hours
11
+ * @param dayOfWeek - Day of the week (0 – Sunday, 6 – Saturday), used to resolve per-day business hours
8
12
  * @returns Modifier object for styling business/non-business hours
9
13
  */
10
- function getBusinessHoursMod({ time, businessHours, highlightBusinessHours }) {
14
+ function getBusinessHoursMod({ time, businessHours, highlightBusinessHours, dayOfWeek }) {
11
15
  if (!highlightBusinessHours || !businessHours) return {
12
16
  "business-hours": false,
13
17
  "non-business-hours": false
14
18
  };
15
- const [start, end] = businessHours;
19
+ let range;
20
+ if (isBusinessHoursRange(businessHours)) range = businessHours;
21
+ else {
22
+ if (dayOfWeek === void 0) return {
23
+ "business-hours": false,
24
+ "non-business-hours": false
25
+ };
26
+ range = businessHours[dayOfWeek] ?? null;
27
+ }
28
+ if (!range) return {
29
+ "business-hours": false,
30
+ "non-business-hours": true
31
+ };
32
+ const [start, end] = range;
16
33
  const isInBusinessHours = time >= start && time < end;
17
34
  return {
18
35
  "business-hours": isInBusinessHours,
@@ -1 +1 @@
1
- {"version":3,"file":"get-business-hours-mod.cjs","names":[],"sources":["../../../src/utils/get-business-hours-mod/get-business-hours-mod.ts"],"sourcesContent":["export interface GetBusinessHoursModInput {\n time: string;\n businessHours?: [string, string];\n highlightBusinessHours?: boolean;\n}\n\nexport interface BusinessHoursMod {\n 'business-hours': boolean;\n 'non-business-hours': boolean;\n}\n\n/**\n * Determines if a given time is within business hours and returns modifier object\n * @param time - Time string in HH:mm:ss format\n * @param businessHours - Tuple of [start, end] times in HH:mm:ss format\n * @param highlightBusinessHours - Whether to highlight business hours\n * @returns Modifier object for styling business/non-business hours\n */\nexport function getBusinessHoursMod({\n time,\n businessHours,\n highlightBusinessHours,\n}: GetBusinessHoursModInput): BusinessHoursMod {\n if (!highlightBusinessHours || !businessHours) {\n return {\n 'business-hours': false,\n 'non-business-hours': false,\n };\n }\n\n const [start, end] = businessHours;\n const isInBusinessHours = time >= start && time < end;\n\n return {\n 'business-hours': isInBusinessHours,\n 'non-business-hours': !isInBusinessHours,\n };\n}\n"],"mappings":";;;;;;;;;AAkBA,SAAgB,oBAAoB,EAClC,MACA,eACA,0BAC6C;AAC7C,KAAI,CAAC,0BAA0B,CAAC,cAC9B,QAAO;EACL,kBAAkB;EAClB,sBAAsB;EACvB;CAGH,MAAM,CAAC,OAAO,OAAO;CACrB,MAAM,oBAAoB,QAAQ,SAAS,OAAO;AAElD,QAAO;EACL,kBAAkB;EAClB,sBAAsB,CAAC;EACxB"}
1
+ {"version":3,"file":"get-business-hours-mod.cjs","names":[],"sources":["../../../src/utils/get-business-hours-mod/get-business-hours-mod.ts"],"sourcesContent":["import { DayOfWeek } from '../../types';\n\n/** Business hours range in `HH:mm:ss` format */\nexport type BusinessHoursRange = [string, string];\n\n/** Per-day business hours map keyed by day of the week (0 – Sunday, 6 – Saturday). `null` marks a day as fully outside business hours. */\nexport type BusinessHoursPerDay = Partial<Record<DayOfWeek, BusinessHoursRange | null>>;\n\n/** Business hours value – tuple applies to every day, record configures business hours per day */\nexport type BusinessHoursValue = BusinessHoursRange | BusinessHoursPerDay;\n\nexport interface GetBusinessHoursModInput {\n time: string;\n businessHours?: BusinessHoursValue;\n highlightBusinessHours?: boolean;\n dayOfWeek?: DayOfWeek;\n}\n\nexport interface BusinessHoursMod {\n 'business-hours': boolean;\n 'non-business-hours': boolean;\n}\n\nfunction isBusinessHoursRange(value: BusinessHoursValue): value is BusinessHoursRange {\n return (\n Array.isArray(value) &&\n value.length === 2 &&\n typeof value[0] === 'string' &&\n typeof value[1] === 'string'\n );\n}\n\n/**\n * Determines if a given time is within business hours and returns modifier object\n * @param time - Time string in HH:mm:ss format\n * @param businessHours - Tuple of [start, end] times in HH:mm:ss format, or per-day record keyed by day of the week\n * @param highlightBusinessHours - Whether to highlight business hours\n * @param dayOfWeek - Day of the week (0 – Sunday, 6 – Saturday), used to resolve per-day business hours\n * @returns Modifier object for styling business/non-business hours\n */\nexport function getBusinessHoursMod({\n time,\n businessHours,\n highlightBusinessHours,\n dayOfWeek,\n}: GetBusinessHoursModInput): BusinessHoursMod {\n if (!highlightBusinessHours || !businessHours) {\n return {\n 'business-hours': false,\n 'non-business-hours': false,\n };\n }\n\n let range: [string, string] | null;\n if (isBusinessHoursRange(businessHours)) {\n range = businessHours;\n } else {\n if (dayOfWeek === undefined) {\n return {\n 'business-hours': false,\n 'non-business-hours': false,\n };\n }\n range = businessHours[dayOfWeek] ?? null;\n }\n\n if (!range) {\n return {\n 'business-hours': false,\n 'non-business-hours': true,\n };\n }\n\n const [start, end] = range;\n const isInBusinessHours = time >= start && time < end;\n\n return {\n 'business-hours': isInBusinessHours,\n 'non-business-hours': !isInBusinessHours,\n };\n}\n"],"mappings":";;AAuBA,SAAS,qBAAqB,OAAwD;CACpF,OACE,MAAM,QAAQ,KAAK,KACnB,MAAM,WAAW,KACjB,OAAO,MAAM,OAAO,YACpB,OAAO,MAAM,OAAO;AAExB;;;;;;;;;AAUA,SAAgB,oBAAoB,EAClC,MACA,eACA,wBACA,aAC6C;CAC7C,IAAI,CAAC,0BAA0B,CAAC,eAC9B,OAAO;EACL,kBAAkB;EAClB,sBAAsB;CACxB;CAGF,IAAI;CACJ,IAAI,qBAAqB,aAAa,GACpC,QAAQ;MACH;EACL,IAAI,cAAc,KAAA,GAChB,OAAO;GACL,kBAAkB;GAClB,sBAAsB;EACxB;EAEF,QAAQ,cAAc,cAAc;CACtC;CAEA,IAAI,CAAC,OACH,OAAO;EACL,kBAAkB;EAClB,sBAAsB;CACxB;CAGF,MAAM,CAAC,OAAO,OAAO;CACrB,MAAM,oBAAoB,QAAQ,SAAS,OAAO;CAElD,OAAO;EACL,kBAAkB;EAClB,sBAAsB,CAAC;CACzB;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-current-time-position.cjs","names":[],"sources":["../../../src/utils/get-current-time-position/get-current-time-position.ts"],"sourcesContent":["import dayjs from 'dayjs';\n\ninterface GetCurrentTimePositionInput {\n startTime?: string;\n endTime?: string;\n}\n\nexport function getCurrentTimePosition(input?: GetCurrentTimePositionInput) {\n const now = dayjs();\n\n if (!input?.startTime || !input?.endTime) {\n const startOf = dayjs().startOf('date');\n const diffInMinutes = now.diff(startOf, 'minute');\n return (diffInMinutes / 1440) * 100;\n }\n\n const [startHour, startMinute] = input.startTime.split(':').map(Number);\n const [endHour, endMinute] = input.endTime.split(':').map(Number);\n\n const startOfDay = now.startOf('date');\n const startDateTime = startOfDay.hour(startHour).minute(startMinute).second(0);\n const endDateTime = startOfDay.hour(endHour).minute(endMinute).second(0);\n\n const totalMinutes = endDateTime.diff(startDateTime, 'minute');\n const currentMinutes = now.diff(startDateTime, 'minute');\n\n return (currentMinutes / totalMinutes) * 100;\n}\n"],"mappings":";;;;;AAOA,SAAgB,uBAAuB,OAAqC;CAC1E,MAAM,OAAA,GAAA,MAAA,UAAa;AAEnB,KAAI,CAAC,OAAO,aAAa,CAAC,OAAO,SAAS;EACxC,MAAM,WAAA,GAAA,MAAA,UAAiB,CAAC,QAAQ,OAAO;AAEvC,SADsB,IAAI,KAAK,SAAS,SAAS,GACzB,OAAQ;;CAGlC,MAAM,CAAC,WAAW,eAAe,MAAM,UAAU,MAAM,IAAI,CAAC,IAAI,OAAO;CACvE,MAAM,CAAC,SAAS,aAAa,MAAM,QAAQ,MAAM,IAAI,CAAC,IAAI,OAAO;CAEjE,MAAM,aAAa,IAAI,QAAQ,OAAO;CACtC,MAAM,gBAAgB,WAAW,KAAK,UAAU,CAAC,OAAO,YAAY,CAAC,OAAO,EAAE;CAG9E,MAAM,eAFc,WAAW,KAAK,QAAQ,CAAC,OAAO,UAAU,CAAC,OAAO,EAAE,CAEvC,KAAK,eAAe,SAAS;AAG9D,QAFuB,IAAI,KAAK,eAAe,SAAS,GAE/B,eAAgB"}
1
+ {"version":3,"file":"get-current-time-position.cjs","names":[],"sources":["../../../src/utils/get-current-time-position/get-current-time-position.ts"],"sourcesContent":["import dayjs from 'dayjs';\n\ninterface GetCurrentTimePositionInput {\n startTime?: string;\n endTime?: string;\n}\n\nexport function getCurrentTimePosition(input?: GetCurrentTimePositionInput) {\n const now = dayjs();\n\n if (!input?.startTime || !input?.endTime) {\n const startOf = dayjs().startOf('date');\n const diffInMinutes = now.diff(startOf, 'minute');\n return (diffInMinutes / 1440) * 100;\n }\n\n const [startHour, startMinute] = input.startTime.split(':').map(Number);\n const [endHour, endMinute] = input.endTime.split(':').map(Number);\n\n const startOfDay = now.startOf('date');\n const startDateTime = startOfDay.hour(startHour).minute(startMinute).second(0);\n const endDateTime = startOfDay.hour(endHour).minute(endMinute).second(0);\n\n const totalMinutes = endDateTime.diff(startDateTime, 'minute');\n const currentMinutes = now.diff(startDateTime, 'minute');\n\n return (currentMinutes / totalMinutes) * 100;\n}\n"],"mappings":";;;;;AAOA,SAAgB,uBAAuB,OAAqC;CAC1E,MAAM,OAAA,GAAA,MAAA,SAAY;CAElB,IAAI,CAAC,OAAO,aAAa,CAAC,OAAO,SAAS;EACxC,MAAM,WAAA,GAAA,MAAA,SAAgB,EAAE,QAAQ,MAAM;EAEtC,OADsB,IAAI,KAAK,SAAS,QACpB,IAAI,OAAQ;CAClC;CAEA,MAAM,CAAC,WAAW,eAAe,MAAM,UAAU,MAAM,GAAG,EAAE,IAAI,MAAM;CACtE,MAAM,CAAC,SAAS,aAAa,MAAM,QAAQ,MAAM,GAAG,EAAE,IAAI,MAAM;CAEhE,MAAM,aAAa,IAAI,QAAQ,MAAM;CACrC,MAAM,gBAAgB,WAAW,KAAK,SAAS,EAAE,OAAO,WAAW,EAAE,OAAO,CAAC;CAG7E,MAAM,eAFc,WAAW,KAAK,OAAO,EAAE,OAAO,SAAS,EAAE,OAAO,CAEvC,EAAE,KAAK,eAAe,QAAQ;CAG7D,OAFuB,IAAI,KAAK,eAAe,QAE1B,IAAI,eAAgB;AAC3C"}
@@ -1,25 +1,28 @@
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/get-day-position/get-day-position.ts
7
8
  /** Calculates day position within given start and end time boundaries. Returns top and height in percentages. */
8
- function getDayPosition({ event, startTime = "00:00:00", endTime = "23:59:59" }) {
9
+ function getDayPosition({ event, startTime = "00:00:00", endTime = "23:59:59", intervalMinutes = 60 }) {
9
10
  const eventStart = (0, dayjs.default)(event.start);
10
11
  const eventEnd = (0, dayjs.default)(event.end);
11
12
  const parsedStartTime = require_parse_time_string.parseTimeString(startTime);
12
13
  const parsedEndTime = require_parse_time_string.parseTimeString(endTime);
13
14
  const startOfDay = eventStart.startOf("date");
14
- const boundaryStart = startOfDay.hour(parsedStartTime.hours).minute(parsedStartTime.minutes).second(0);
15
- const boundaryEnd = startOfDay.hour(parsedEndTime.hours).minute(parsedEndTime.minutes).second(0);
16
- const totalMinutes = boundaryEnd.diff(boundaryStart, "minute");
17
- const eventStartMinutes = (eventStart.isBefore(boundaryStart) ? boundaryStart : eventStart).diff(boundaryStart, "minute");
18
- const eventEndMinutes = (eventEnd.isAfter(boundaryEnd) ? boundaryEnd : eventEnd).diff(boundaryStart, "minute");
19
- const startPercent = eventStartMinutes / totalMinutes * 100;
15
+ const boundaryStart = startOfDay.hour(parsedStartTime.hours).minute(parsedStartTime.minutes).second(parsedStartTime.seconds);
16
+ const literalEnd = startOfDay.hour(parsedEndTime.hours).minute(parsedEndTime.minutes).second(parsedEndTime.seconds);
17
+ const intervalSeconds = require_clamp_interval_minutes.clampIntervalMinutes(intervalMinutes) * 60;
18
+ const literalRangeSeconds = literalEnd.diff(boundaryStart, "second");
19
+ const totalSeconds = Math.ceil(literalRangeSeconds / intervalSeconds) * intervalSeconds;
20
+ const eventStartSeconds = (eventStart.isBefore(boundaryStart) ? boundaryStart : eventStart).diff(boundaryStart, "second");
21
+ const eventEndSeconds = (eventEnd.isAfter(literalEnd) ? literalEnd : eventEnd).diff(boundaryStart, "second");
22
+ const startPercent = eventStartSeconds / totalSeconds * 100;
20
23
  return {
21
24
  top: startPercent,
22
- height: eventEndMinutes / totalMinutes * 100 - startPercent
25
+ height: eventEndSeconds / totalSeconds * 100 - startPercent
23
26
  };
24
27
  }
25
28
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"get-day-position.cjs","names":["parseTimeString"],"sources":["../../../src/utils/get-day-position/get-day-position.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { ScheduleEventData } from '../../types';\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\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}: 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(0);\n const boundaryEnd = startOfDay.hour(parsedEndTime.hours).minute(parsedEndTime.minutes).second(0);\n const totalMinutes = boundaryEnd.diff(boundaryStart, 'minute');\n\n const clippedEventStart = eventStart.isBefore(boundaryStart) ? boundaryStart : eventStart;\n const eventStartMinutes = clippedEventStart.diff(boundaryStart, 'minute');\n\n const clippedEventEnd = eventEnd.isAfter(boundaryEnd) ? boundaryEnd : eventEnd;\n const eventEndMinutes = clippedEventEnd.diff(boundaryStart, 'minute');\n\n const startPercent = (eventStartMinutes / totalMinutes) * 100;\n const endPercent = (eventEndMinutes / totalMinutes) * 100;\n\n return {\n top: startPercent,\n height: endPercent - startPercent,\n };\n}\n"],"mappings":";;;;;;;AAgBA,SAAgB,eAAe,EAC7B,OACA,YAAY,YACZ,UAAU,cACY;CACtB,MAAM,cAAA,GAAA,MAAA,SAAmB,MAAM,MAAM;CACrC,MAAM,YAAA,GAAA,MAAA,SAAiB,MAAM,IAAI;CAEjC,MAAM,kBAAkBA,0BAAAA,gBAAgB,UAAU;CAClD,MAAM,gBAAgBA,0BAAAA,gBAAgB,QAAQ;CAE9C,MAAM,aAAa,WAAW,QAAQ,OAAO;CAC7C,MAAM,gBAAgB,WACnB,KAAK,gBAAgB,MAAM,CAC3B,OAAO,gBAAgB,QAAQ,CAC/B,OAAO,EAAE;CACZ,MAAM,cAAc,WAAW,KAAK,cAAc,MAAM,CAAC,OAAO,cAAc,QAAQ,CAAC,OAAO,EAAE;CAChG,MAAM,eAAe,YAAY,KAAK,eAAe,SAAS;CAG9D,MAAM,qBADoB,WAAW,SAAS,cAAc,GAAG,gBAAgB,YACnC,KAAK,eAAe,SAAS;CAGzE,MAAM,mBADkB,SAAS,QAAQ,YAAY,GAAG,cAAc,UAC9B,KAAK,eAAe,SAAS;CAErE,MAAM,eAAgB,oBAAoB,eAAgB;AAG1D,QAAO;EACL,KAAK;EACL,QAJkB,kBAAkB,eAAgB,MAI/B;EACtB"}
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,SAAmB,MAAM,KAAK;CACpC,MAAM,YAAA,GAAA,MAAA,SAAiB,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,EAC1B,OAAO,gBAAgB,OAAO,EAC9B,OAAO,gBAAgB,OAAO;CACjC,MAAM,aAAa,WAChB,KAAK,cAAc,KAAK,EACxB,OAAO,cAAc,OAAO,EAC5B,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,YACnC,KAAK,eAAe,QAAQ;CAGxE,MAAM,mBADkB,SAAS,QAAQ,UAAU,IAAI,aAAa,UAC5B,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-day-time-intervals.cjs","names":["clampIntervalMinutes","parseTimeString","toTimeString"],"sources":["../../../src/utils/get-day-time-intervals/get-day-time-intervals.ts"],"sourcesContent":["import { clampIntervalMinutes } from '../clamp-interval-minutes/clamp-interval-minutes';\nimport { parseTimeString } from '../parse-time-string/parse-time-string';\nimport { toTimeString } from '../to-time-string/to-time-string';\n\nexport interface DayTimeInterval {\n /** Start time of the interval in HH:mm:ss format */\n startTime: string;\n\n /** End time of the interval in HH:mm:ss format */\n endTime: string;\n\n /** Duration of the interval in seconds */\n duration: number;\n\n /** Indicates if the interval starts at the beginning of an hour */\n isHourStart: boolean;\n}\n\nexport interface GetDayTimeIntervalsInput {\n /** Start time in HH:mm:ss format */\n startTime: string;\n\n /** End time in HH:mm:ss format, end of the day by default */\n endTime?: string;\n\n /** Interval in minutes, 60 by default */\n intervalMinutes?: number;\n}\n\nexport function getDayTimeIntervals({\n startTime,\n endTime,\n intervalMinutes: _intervalMinutes = 60,\n}: GetDayTimeIntervalsInput): DayTimeInterval[] {\n const intervalMinutes = clampIntervalMinutes(_intervalMinutes);\n\n const start = parseTimeString(startTime);\n const end = endTime ? parseTimeString(endTime) : { hours: 23, minutes: 59, seconds: 59 };\n\n const startSeconds = start.hours * 3600 + start.minutes * 60 + start.seconds;\n const endSeconds = end.hours * 3600 + end.minutes * 60 + end.seconds;\n const intervalSeconds = intervalMinutes * 60;\n\n const intervals: DayTimeInterval[] = [];\n let currentSeconds = startSeconds;\n\n while (currentSeconds < endSeconds) {\n const intervalStartSeconds = currentSeconds;\n let intervalEndSeconds = currentSeconds + intervalSeconds;\n\n if (intervalEndSeconds > endSeconds) {\n intervalEndSeconds = endSeconds;\n }\n\n const startHours = Math.floor(intervalStartSeconds / 3600);\n const startMinutes = Math.floor((intervalStartSeconds % 3600) / 60);\n const startSecs = intervalStartSeconds % 60;\n\n const endHours = Math.floor(intervalEndSeconds / 3600);\n const endMinutes = Math.floor((intervalEndSeconds % 3600) / 60);\n const endSecs = intervalEndSeconds % 60;\n\n const durationSeconds = intervalEndSeconds - intervalStartSeconds;\n const isHourStart = startMinutes === 0 && startSecs === 0;\n\n intervals.push({\n startTime: toTimeString({ hours: startHours, minutes: startMinutes, seconds: startSecs }),\n endTime: toTimeString({ hours: endHours, minutes: endMinutes, seconds: endSecs }),\n duration: durationSeconds,\n isHourStart,\n });\n\n currentSeconds = intervalEndSeconds;\n }\n\n return intervals;\n}\n"],"mappings":";;;;;AA6BA,SAAgB,oBAAoB,EAClC,WACA,SACA,iBAAiB,mBAAmB,MACU;CAC9C,MAAM,kBAAkBA,+BAAAA,qBAAqB,iBAAiB;CAE9D,MAAM,QAAQC,0BAAAA,gBAAgB,UAAU;CACxC,MAAM,MAAM,UAAUA,0BAAAA,gBAAgB,QAAQ,GAAG;EAAE,OAAO;EAAI,SAAS;EAAI,SAAS;EAAI;CAExF,MAAM,eAAe,MAAM,QAAQ,OAAO,MAAM,UAAU,KAAK,MAAM;CACrE,MAAM,aAAa,IAAI,QAAQ,OAAO,IAAI,UAAU,KAAK,IAAI;CAC7D,MAAM,kBAAkB,kBAAkB;CAE1C,MAAM,YAA+B,EAAE;CACvC,IAAI,iBAAiB;AAErB,QAAO,iBAAiB,YAAY;EAClC,MAAM,uBAAuB;EAC7B,IAAI,qBAAqB,iBAAiB;AAE1C,MAAI,qBAAqB,WACvB,sBAAqB;EAGvB,MAAM,aAAa,KAAK,MAAM,uBAAuB,KAAK;EAC1D,MAAM,eAAe,KAAK,MAAO,uBAAuB,OAAQ,GAAG;EACnE,MAAM,YAAY,uBAAuB;EAEzC,MAAM,WAAW,KAAK,MAAM,qBAAqB,KAAK;EACtD,MAAM,aAAa,KAAK,MAAO,qBAAqB,OAAQ,GAAG;EAC/D,MAAM,UAAU,qBAAqB;EAErC,MAAM,kBAAkB,qBAAqB;EAC7C,MAAM,cAAc,iBAAiB,KAAK,cAAc;AAExD,YAAU,KAAK;GACb,WAAWC,uBAAAA,aAAa;IAAE,OAAO;IAAY,SAAS;IAAc,SAAS;IAAW,CAAC;GACzF,SAASA,uBAAAA,aAAa;IAAE,OAAO;IAAU,SAAS;IAAY,SAAS;IAAS,CAAC;GACjF,UAAU;GACV;GACD,CAAC;AAEF,mBAAiB;;AAGnB,QAAO"}
1
+ {"version":3,"file":"get-day-time-intervals.cjs","names":["clampIntervalMinutes","parseTimeString","toTimeString"],"sources":["../../../src/utils/get-day-time-intervals/get-day-time-intervals.ts"],"sourcesContent":["import { clampIntervalMinutes } from '../clamp-interval-minutes/clamp-interval-minutes';\nimport { parseTimeString } from '../parse-time-string/parse-time-string';\nimport { toTimeString } from '../to-time-string/to-time-string';\n\nexport interface DayTimeInterval {\n /** Start time of the interval in HH:mm:ss format */\n startTime: string;\n\n /** End time of the interval in HH:mm:ss format */\n endTime: string;\n\n /** Duration of the interval in seconds */\n duration: number;\n\n /** Indicates if the interval starts at the beginning of an hour */\n isHourStart: boolean;\n}\n\nexport interface GetDayTimeIntervalsInput {\n /** Start time in HH:mm:ss format */\n startTime: string;\n\n /** End time in HH:mm:ss format, end of the day by default */\n endTime?: string;\n\n /** Interval in minutes, 60 by default */\n intervalMinutes?: number;\n}\n\nexport function getDayTimeIntervals({\n startTime,\n endTime,\n intervalMinutes: _intervalMinutes = 60,\n}: GetDayTimeIntervalsInput): DayTimeInterval[] {\n const intervalMinutes = clampIntervalMinutes(_intervalMinutes);\n\n const start = parseTimeString(startTime);\n const end = endTime ? parseTimeString(endTime) : { hours: 23, minutes: 59, seconds: 59 };\n\n const startSeconds = start.hours * 3600 + start.minutes * 60 + start.seconds;\n const endSeconds = end.hours * 3600 + end.minutes * 60 + end.seconds;\n const intervalSeconds = intervalMinutes * 60;\n\n const intervals: DayTimeInterval[] = [];\n let currentSeconds = startSeconds;\n\n while (currentSeconds < endSeconds) {\n const intervalStartSeconds = currentSeconds;\n let intervalEndSeconds = currentSeconds + intervalSeconds;\n\n if (intervalEndSeconds > endSeconds) {\n intervalEndSeconds = endSeconds;\n }\n\n const startHours = Math.floor(intervalStartSeconds / 3600);\n const startMinutes = Math.floor((intervalStartSeconds % 3600) / 60);\n const startSecs = intervalStartSeconds % 60;\n\n const endHours = Math.floor(intervalEndSeconds / 3600);\n const endMinutes = Math.floor((intervalEndSeconds % 3600) / 60);\n const endSecs = intervalEndSeconds % 60;\n\n const durationSeconds = intervalEndSeconds - intervalStartSeconds;\n const isHourStart = startMinutes === 0 && startSecs === 0;\n\n intervals.push({\n startTime: toTimeString({ hours: startHours, minutes: startMinutes, seconds: startSecs }),\n endTime: toTimeString({ hours: endHours, minutes: endMinutes, seconds: endSecs }),\n duration: durationSeconds,\n isHourStart,\n });\n\n currentSeconds = intervalEndSeconds;\n }\n\n return intervals;\n}\n"],"mappings":";;;;;AA6BA,SAAgB,oBAAoB,EAClC,WACA,SACA,iBAAiB,mBAAmB,MACU;CAC9C,MAAM,kBAAkBA,+BAAAA,qBAAqB,gBAAgB;CAE7D,MAAM,QAAQC,0BAAAA,gBAAgB,SAAS;CACvC,MAAM,MAAM,UAAUA,0BAAAA,gBAAgB,OAAO,IAAI;EAAE,OAAO;EAAI,SAAS;EAAI,SAAS;CAAG;CAEvF,MAAM,eAAe,MAAM,QAAQ,OAAO,MAAM,UAAU,KAAK,MAAM;CACrE,MAAM,aAAa,IAAI,QAAQ,OAAO,IAAI,UAAU,KAAK,IAAI;CAC7D,MAAM,kBAAkB,kBAAkB;CAE1C,MAAM,YAA+B,CAAC;CACtC,IAAI,iBAAiB;CAErB,OAAO,iBAAiB,YAAY;EAClC,MAAM,uBAAuB;EAC7B,IAAI,qBAAqB,iBAAiB;EAE1C,IAAI,qBAAqB,YACvB,qBAAqB;EAGvB,MAAM,aAAa,KAAK,MAAM,uBAAuB,IAAI;EACzD,MAAM,eAAe,KAAK,MAAO,uBAAuB,OAAQ,EAAE;EAClE,MAAM,YAAY,uBAAuB;EAEzC,MAAM,WAAW,KAAK,MAAM,qBAAqB,IAAI;EACrD,MAAM,aAAa,KAAK,MAAO,qBAAqB,OAAQ,EAAE;EAC9D,MAAM,UAAU,qBAAqB;EAErC,MAAM,kBAAkB,qBAAqB;EAC7C,MAAM,cAAc,iBAAiB,KAAK,cAAc;EAExD,UAAU,KAAK;GACb,WAAWC,uBAAAA,aAAa;IAAE,OAAO;IAAY,SAAS;IAAc,SAAS;GAAU,CAAC;GACxF,SAASA,uBAAAA,aAAa;IAAE,OAAO;IAAU,SAAS;IAAY,SAAS;GAAQ,CAAC;GAChF,UAAU;GACV;EACF,CAAC;EAED,iBAAiB;CACnB;CAEA,OAAO;AACT"}
@@ -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,SAAc,KAAK;AAEvB,KAAI,CAAC,MAAM,SAAS,CAClB,QAAO;CAGT,MAAM,gBAAgB,mBAAmB,IAAI,IAAI,iBAAiB;AAClE,QAAO,MAAM,KAAK,KAAK,cACrB,SAAQ,MAAM,IAAI,GAAG,MAAM;AAG7B,QAAO,MAAM,OAAO,aAAa"}
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,SAAc,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 +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,UAAA,GAAA,MAAA,SADY,MAAM,CAAC,UAAA,GAAA,MAAA,SAAe,MAAM,CAAC,MAAM,GAAG,GAAG,MAAM,CACzC,OAAO,aAAa,CAAC;CAC7C,MAAM,eAAe,MAAM,OAAO,aAAa;CAE/C,MAAM,UAAUA,wBAAAA,aADG,MAAM,IAAI,CAAC,MAAM,aAAa,GAAG,GAAG,MAAM,CAAC,OAAO,aAAa,EACzC,eAAe;CACxD,MAAM,QAA6B,EAAE;CAErC,IAAI,QAAA,GAAA,MAAA,SAAaC,0BAAAA,eAAe;EAAE,MAAM;EAAc;EAAgB,CAAC,CAAC;AAExE,SAAA,GAAA,MAAA,SAAa,KAAK,CAAC,SAAS,SAAS,MAAM,EAAE;EAC3C,MAAM,OAA0B,EAAE;AAElC,OAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG;AAC7B,QAAK,KAAK,KAAK,OAAO,sBAAsB,CAAC;AAC7C,UAAO,KAAK,IAAI,GAAG,MAAM;;AAG3B,QAAM,KAAK,KAAK;;AAGlB,KAAI,mBAAmB,MAAM,SAAS,GAAG;EACvC,MAAM,WAAW,MAAM,MAAM,SAAS;EACtC,MAAM,UAAU,SAAS,SAAS,SAAS;EAC3C,IAAI,WAAA,GAAA,MAAA,SAAgB,QAAQ,CAAC,IAAI,GAAG,MAAM;AAE1C,SAAO,MAAM,SAAS,GAAG;GACvB,MAAM,OAA0B,EAAE;AAElC,QAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG;AAC7B,SAAK,KAAK,QAAQ,OAAO,sBAAsB,CAAC;AAChD,cAAU,QAAQ,IAAI,GAAG,MAAM;;AAGjC,SAAM,KAAK,KAAK;;;AAIpB,QAAO"}
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,UAAA,GAAA,MAAA,SADY,KAAK,EAAE,UAAA,GAAA,MAAA,SAAe,KAAK,EAAE,KAAK,IAAI,GAAG,KACrC,EAAE,OAAO,YAAY,CAAC;CAC5C,MAAM,eAAe,MAAM,OAAO,YAAY;CAE9C,MAAM,UAAUA,wBAAAA,aADG,MAAM,IAAI,CAAC,MAAM,YAAY,IAAI,GAAG,KAAK,EAAE,OAAO,YAC/B,GAAG,cAAc;CACvD,MAAM,QAA6B,CAAC;CAEpC,IAAI,QAAA,GAAA,MAAA,SAAaC,0BAAAA,eAAe;EAAE,MAAM;EAAc;CAAe,CAAC,CAAC;CAEvE,QAAA,GAAA,MAAA,SAAa,IAAI,EAAE,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,SAAgB,OAAO,EAAE,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;AACrB,KAAI,CAAC,gBACH,QAAO;EACL,OAAOA,uBAAAA,cAAAA,GAAAA,MAAAA,SAAmB,MAAM,CAAC,QAAQ,QAAQ,CAAC;EAClD,KAAKA,uBAAAA,cAAAA,GAAAA,MAAAA,SAAmB,MAAM,CAAC,MAAM,QAAQ,CAAC;EAC/C;CAGH,MAAM,OAAOC,uBAAAA,aAAa;EAAE;EAAO;EAAgB;EAAiB,CAAC;AAErE,QAAO;EACL,OAAO,KAAK,GAAG;EACf,KAAK,KAAK,KAAK,SAAS,GAAG;EAC5B"}
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,SAAmB,KAAK,EAAE,QAAQ,OAAO,CAAC;EACjD,KAAKA,uBAAAA,cAAAA,GAAAA,MAAAA,SAAmB,KAAK,EAAE,MAAM,OAAO,CAAC;CAC/C;CAGF,MAAM,OAAOC,uBAAAA,aAAa;EAAE;EAAO;EAAgB;CAAgB,CAAC;CAEpE,OAAO;EACL,OAAO,KAAK,GAAG;EACf,KAAK,KAAK,KAAK,SAAS,GAAG;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,SAAoB,KAAK,CAAC,QAAQ,OAAO,CAAC,QAAQ;CAExD,MAAM,UAA+B;EAAC,EAAE;EAAE,EAAE;EAAE,EAAE;EAAE,EAAE;EAAC;CACrD,IAAI,oBAAoB;AAExB,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,EAC1B,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG;AAC7B,UAAQ,GAAG,MAAA,GAAA,MAAA,SAAW,YAAY,CAAC,IAAI,mBAAmB,SAAS,CAAC,OAAO,aAAa,CAAC;AACzF,uBAAqB;;AAIzB,QAAO"}
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,SAAoB,IAAI,EAAE,QAAQ,MAAM,EAAE,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,GAAG,MAAA,GAAA,MAAA,SAAW,WAAW,EAAE,IAAI,mBAAmB,QAAQ,EAAE,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,EAAE;CAC9B,MAAM,QAAA,GAAA,MAAA,UAAc,CAAC,OAAO,OAAO,CAAC,QAAQ,OAAO;AAEnD,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,IACtB,QAAO,KAAK;EAAE,OAAO;EAAG,MAAMA,oBAAAA,WAAW;GAAE,MAAM,KAAK,IAAI,GAAG,QAAQ;GAAE;GAAQ;GAAQ,CAAC;EAAE,CAAC;AAG7F,QAAO"}
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,SAAa,EAAE,OAAO,MAAM,EAAE,QAAQ,MAAM;CAElD,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KACtB,OAAO,KAAK;EAAE,OAAO;EAAG,MAAMA,oBAAAA,WAAW;GAAE,MAAM,KAAK,IAAI,GAAG,OAAO;GAAG;GAAQ;EAAO,CAAC;CAAE,CAAC;CAG5F,OAAO;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-start-of-week.cjs","names":[],"sources":["../../../src/utils/get-start-of-week/get-start-of-week.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { AnyDateValue, DayOfWeek } from '../../types';\n\ninterface GetStartOfWeekInput {\n date: AnyDateValue;\n firstDayOfWeek?: DayOfWeek;\n}\n\nexport function getStartOfWeek({ date, firstDayOfWeek = 1 }: GetStartOfWeekInput) {\n let value = dayjs(date);\n\n while (value.day() !== firstDayOfWeek) {\n value = value.subtract(1, 'day');\n }\n\n return value.format('YYYY-MM-DD');\n}\n"],"mappings":";;;;;AAQA,SAAgB,eAAe,EAAE,MAAM,iBAAiB,KAA0B;CAChF,IAAI,SAAA,GAAA,MAAA,SAAc,KAAK;AAEvB,QAAO,MAAM,KAAK,KAAK,eACrB,SAAQ,MAAM,SAAS,GAAG,MAAM;AAGlC,QAAO,MAAM,OAAO,aAAa"}
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,SAAc,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-visible-events.cjs","names":[],"sources":["../../../src/utils/get-visible-events/get-visible-events.ts"],"sourcesContent":["interface GetVisibleEventsInput {\n maxEvents: number;\n totalEvents: number;\n}\n\nexport function getVisibleEvents({ maxEvents, totalEvents }: GetVisibleEventsInput) {\n if (totalEvents <= maxEvents) {\n return {\n visibleEventsCount: totalEvents,\n hiddenEventsCount: 0,\n };\n }\n\n return {\n visibleEventsCount: maxEvents - 1,\n hiddenEventsCount: totalEvents - (maxEvents - 1),\n };\n}\n"],"mappings":";;AAKA,SAAgB,iBAAiB,EAAE,WAAW,eAAsC;AAClF,KAAI,eAAe,UACjB,QAAO;EACL,oBAAoB;EACpB,mBAAmB;EACpB;AAGH,QAAO;EACL,oBAAoB,YAAY;EAChC,mBAAmB,eAAe,YAAY;EAC/C"}
1
+ {"version":3,"file":"get-visible-events.cjs","names":[],"sources":["../../../src/utils/get-visible-events/get-visible-events.ts"],"sourcesContent":["interface GetVisibleEventsInput {\n maxEvents: number;\n totalEvents: number;\n}\n\nexport function getVisibleEvents({ maxEvents, totalEvents }: GetVisibleEventsInput) {\n if (totalEvents <= maxEvents) {\n return {\n visibleEventsCount: totalEvents,\n hiddenEventsCount: 0,\n };\n }\n\n return {\n visibleEventsCount: maxEvents - 1,\n hiddenEventsCount: totalEvents - (maxEvents - 1),\n };\n}\n"],"mappings":";;AAKA,SAAgB,iBAAiB,EAAE,WAAW,eAAsC;CAClF,IAAI,eAAe,WACjB,OAAO;EACL,oBAAoB;EACpB,mBAAmB;CACrB;CAGF,OAAO;EACL,oBAAoB,YAAY;EAChC,mBAAmB,eAAe,YAAY;CAChD;AACF"}
@@ -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,EAAE;CAElC,IAAI,WAAA,GAAA,MAAA,SAAgBA,0BAAAA,eAAe;EAAE,MAAM;EAAM;EAAgB,CAAC,CAAC;AAEnE,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG;EAC7B,MAAM,YAAY,QAAQ,KAAK;AAG/B,MAAI,EAFc,eAAe,YAAY,SAAS,UAAuB,KAE3D,gBAChB,MAAK,KAAKC,uBAAAA,aAAa,QAAQ,CAAC;AAGlC,YAAU,QAAQ,IAAI,GAAG,MAAM;;AAGjC,QAAO"}
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,SAAgBA,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 +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,QAAQ;AAErB,SAAgB,cAAc,MAA6C;AACzE,KAAI,MAAM,QAAQ,KAAK,CAErB,SAAA,GAAA,MAAA,SADe,KAAK,MAAM,UAAA,GAAA,MAAA,SAAe,KAAK,CAAC,KAAK,KAAK,EAAE,CACvC,CAAC,SAAS;AAGhC,SAAA,GAAA,MAAA,SAAa,KAAK,CAAC,SAAS"}
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,SADe,KAAK,MAAM,UAAA,GAAA,MAAA,SAAe,IAAI,EAAE,IAAI,MAAM,CACvC,CAAC,EAAE,QAAQ;CAG/B,QAAA,GAAA,MAAA,SAAa,IAAI,EAAE,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,UAAkB,CAAC,IAAI,eAAe;CAC5C,MAAM,SAA4B,EAAE;AAEpC,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,EAC1B,QAAO,KAAKA,oBAAAA,WAAW;EAAE;EAAQ,MAAM,SAAS,IAAI,GAAG,OAAO;EAAE;EAAQ,CAAC,CAAC;AAG5E,QAAO"}
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,SAAiB,EAAE,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":"get-years-list.cjs","names":[],"sources":["../../../src/utils/get-years-list/get-years-list.ts"],"sourcesContent":["interface GetYearsListInput {\n startYear: number;\n endYear: number;\n}\n\nexport function getYearsList({ startYear, endYear }: GetYearsListInput) {\n const years: number[] = [];\n\n for (let year = startYear; year <= endYear; year++) {\n years.push(year);\n }\n\n return years;\n}\n"],"mappings":";;AAKA,SAAgB,aAAa,EAAE,WAAW,WAA8B;CACtE,MAAM,QAAkB,EAAE;AAE1B,MAAK,IAAI,OAAO,WAAW,QAAQ,SAAS,OAC1C,OAAM,KAAK,KAAK;AAGlB,QAAO"}
1
+ {"version":3,"file":"get-years-list.cjs","names":[],"sources":["../../../src/utils/get-years-list/get-years-list.ts"],"sourcesContent":["interface GetYearsListInput {\n startYear: number;\n endYear: number;\n}\n\nexport function getYearsList({ startYear, endYear }: GetYearsListInput) {\n const years: number[] = [];\n\n for (let year = startYear; year <= endYear; year++) {\n years.push(year);\n }\n\n return years;\n}\n"],"mappings":";;AAKA,SAAgB,aAAa,EAAE,WAAW,WAA8B;CACtE,MAAM,QAAkB,CAAC;CAEzB,KAAK,IAAI,OAAO,WAAW,QAAQ,SAAS,QAC1C,MAAM,KAAK,IAAI;CAGjB,OAAO;AACT"}