@mantine/schedule 9.5.2 → 9.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/cjs/_virtual/_rolldown/runtime.cjs +1 -1
  2. package/cjs/components/AgendaView/AgendaView.cjs +7 -6
  3. package/cjs/components/AgendaView/AgendaView.cjs.map +1 -1
  4. package/cjs/components/AgendaView/get-agenda-view-events.cjs.map +1 -1
  5. package/cjs/components/CurrentTimeIndicator/CurrentTimeIndicator.cjs +3 -2
  6. package/cjs/components/CurrentTimeIndicator/CurrentTimeIndicator.cjs.map +1 -1
  7. package/cjs/components/DayView/DayView.cjs +144 -78
  8. package/cjs/components/DayView/DayView.cjs.map +1 -1
  9. package/cjs/components/DayView/DayView.module.cjs +2 -1
  10. package/cjs/components/DayView/DayView.module.cjs.map +1 -1
  11. package/cjs/components/DayView/get-day-view-events/get-day-view-events.cjs.map +1 -1
  12. package/cjs/components/DragContext/DragContext.cjs.map +1 -1
  13. package/cjs/components/MobileMonthView/MobileMonthView.cjs +7 -6
  14. package/cjs/components/MobileMonthView/MobileMonthView.cjs.map +1 -1
  15. package/cjs/components/MobileMonthView/get-mobile-month-view-events.cjs.map +1 -1
  16. package/cjs/components/MonthView/MonthView.cjs +24 -34
  17. package/cjs/components/MonthView/MonthView.cjs.map +1 -1
  18. package/cjs/components/MonthView/MonthView.module.cjs.map +1 -1
  19. package/cjs/components/MonthView/get-month-view-events/find-available-row.cjs.map +1 -1
  20. package/cjs/components/MonthView/get-month-view-events/get-month-positioned-events.cjs +4 -2
  21. package/cjs/components/MonthView/get-month-view-events/get-month-positioned-events.cjs.map +1 -1
  22. package/cjs/components/MonthView/get-month-view-events/get-month-view-events.cjs.map +1 -1
  23. package/cjs/components/MonthView/get-month-view-events/get-weeks-in-range.cjs +3 -2
  24. package/cjs/components/MonthView/get-month-view-events/get-weeks-in-range.cjs.map +1 -1
  25. package/cjs/components/MonthView/get-renderable-month-event-segments.cjs +1 -1
  26. package/cjs/components/MonthView/get-renderable-month-event-segments.cjs.map +1 -1
  27. package/cjs/components/MoreEvents/MoreEvents.cjs.map +1 -1
  28. package/cjs/components/ResourcesDayView/ResourcesDayView.cjs +136 -52
  29. package/cjs/components/ResourcesDayView/ResourcesDayView.cjs.map +1 -1
  30. package/cjs/components/ResourcesDayView/ResourcesDayView.module.cjs +2 -1
  31. package/cjs/components/ResourcesDayView/ResourcesDayView.module.cjs.map +1 -1
  32. package/cjs/components/ResourcesDayView/ResourcesDayViewColumn.cjs.map +1 -1
  33. package/cjs/components/ResourcesDayView/get-resources-day-view-events/get-resources-day-view-events.cjs.map +1 -1
  34. package/cjs/components/ResourcesMonthView/ResourcesMonthView.cjs.map +1 -1
  35. package/cjs/components/ResourcesSchedule/ResourcesSchedule.cjs +3 -1
  36. package/cjs/components/ResourcesSchedule/ResourcesSchedule.cjs.map +1 -1
  37. package/cjs/components/ResourcesWeekView/ResourcesWeekView.cjs +150 -59
  38. package/cjs/components/ResourcesWeekView/ResourcesWeekView.cjs.map +1 -1
  39. package/cjs/components/ResourcesWeekView/ResourcesWeekView.module.cjs +2 -1
  40. package/cjs/components/ResourcesWeekView/ResourcesWeekView.module.cjs.map +1 -1
  41. package/cjs/components/ResourcesWeekView/ResourcesWeekViewRow.cjs.map +1 -1
  42. package/cjs/components/ResourcesWeekView/get-resources-week-view-events/get-resources-week-view-events.cjs +6 -3
  43. package/cjs/components/ResourcesWeekView/get-resources-week-view-events/get-resources-week-view-events.cjs.map +1 -1
  44. package/cjs/components/Schedule/Schedule.cjs +4 -1
  45. package/cjs/components/Schedule/Schedule.cjs.map +1 -1
  46. package/cjs/components/ScheduleBackgroundEvent/ScheduleBackgroundEvent.cjs +53 -0
  47. package/cjs/components/ScheduleBackgroundEvent/ScheduleBackgroundEvent.cjs.map +1 -0
  48. package/cjs/components/ScheduleEvent/ScheduleEvent.cjs.map +1 -1
  49. package/cjs/components/ScheduleHeader/HeaderControl/HeaderControl.cjs +15 -14
  50. package/cjs/components/ScheduleHeader/HeaderControl/HeaderControl.cjs.map +1 -1
  51. package/cjs/components/ScheduleHeader/MonthYearSelect/MonthYearSelect.cjs.map +1 -1
  52. package/cjs/components/ScheduleHeader/ScheduleHeader.cjs.map +1 -1
  53. package/cjs/components/ScheduleHeader/ScheduleHeaderBase.cjs.map +1 -1
  54. package/cjs/components/ScheduleHeader/ScheduleHeaderContext.cjs.map +1 -1
  55. package/cjs/components/ScheduleHeader/ViewSelect/ViewSelect.cjs.map +1 -1
  56. package/cjs/components/WeekView/WeekView.cjs +159 -82
  57. package/cjs/components/WeekView/WeekView.cjs.map +1 -1
  58. package/cjs/components/WeekView/WeekView.module.cjs +2 -1
  59. package/cjs/components/WeekView/WeekView.module.cjs.map +1 -1
  60. package/cjs/components/WeekView/WeekViewDay.cjs.map +1 -1
  61. package/cjs/components/WeekView/get-week-label/get-week-label.cjs.map +1 -1
  62. package/cjs/components/WeekView/get-week-view-events/calculate-all-day-event-offset.cjs.map +1 -1
  63. package/cjs/components/WeekView/get-week-view-events/calculate-all-day-event-width.cjs.map +1 -1
  64. package/cjs/components/WeekView/get-week-view-events/calculate-event-days.cjs.map +1 -1
  65. package/cjs/components/WeekView/get-week-view-events/get-event-end-date.cjs.map +1 -1
  66. package/cjs/components/WeekView/get-week-view-events/get-hanging-status.cjs.map +1 -1
  67. package/cjs/components/WeekView/get-week-view-events/get-week-positioned-events.cjs.map +1 -1
  68. package/cjs/components/YearView/YearView.cjs +7 -6
  69. package/cjs/components/YearView/YearView.cjs.map +1 -1
  70. package/cjs/components/YearView/YearViewMonth.cjs.map +1 -1
  71. package/cjs/components/YearView/get-visible-week-days.cjs.map +1 -1
  72. package/cjs/components/YearView/get-year-view-events/get-year-view-events.cjs.map +1 -1
  73. package/cjs/hooks/use-auto-scroll-on-drag.cjs.map +1 -1
  74. package/cjs/hooks/use-day-grid-event-resize.cjs.map +1 -1
  75. package/cjs/hooks/use-drag-drop-handlers.cjs +13 -2
  76. package/cjs/hooks/use-drag-drop-handlers.cjs.map +1 -1
  77. package/cjs/hooks/use-drag-state.cjs.map +1 -1
  78. package/cjs/hooks/use-event-resize.cjs +30 -15
  79. package/cjs/hooks/use-event-resize.cjs.map +1 -1
  80. package/cjs/hooks/use-horizontal-event-resize.cjs +30 -15
  81. package/cjs/hooks/use-horizontal-event-resize.cjs.map +1 -1
  82. package/cjs/hooks/use-slot-drag-select.cjs.map +1 -1
  83. package/cjs/index.cjs +2 -0
  84. package/cjs/utils/calculate-drop-time/calculate-drop-time.cjs +25 -4
  85. package/cjs/utils/calculate-drop-time/calculate-drop-time.cjs.map +1 -1
  86. package/cjs/utils/calculate-month-drop-date/calculate-month-drop-date.cjs.map +1 -1
  87. package/cjs/utils/calculate-month-resize-dates/calculate-month-resize-dates.cjs.map +1 -1
  88. package/cjs/utils/expand-recurring-events/expand-recurring-events.cjs.map +1 -1
  89. package/cjs/utils/format-date/format-date.cjs.map +1 -1
  90. package/cjs/utils/get-current-time-position/get-current-time-position.cjs.map +1 -1
  91. package/cjs/utils/get-day-position/get-day-position.cjs.map +1 -1
  92. package/cjs/utils/get-end-of-week/get-end-of-week.cjs.map +1 -1
  93. package/cjs/utils/get-month-days/get-month-days.cjs +4 -2
  94. package/cjs/utils/get-month-days/get-month-days.cjs.map +1 -1
  95. package/cjs/utils/get-month-range/get-month-range.cjs.map +1 -1
  96. package/cjs/utils/get-months-by-quarter/get-months-by-quarter.cjs.map +1 -1
  97. package/cjs/utils/get-months-list/get-months-list.cjs.map +1 -1
  98. package/cjs/utils/get-start-of-week/get-start-of-week.cjs.map +1 -1
  99. package/cjs/utils/get-week-days/get-week-days.cjs.map +1 -1
  100. package/cjs/utils/get-week-number/get-week-number.cjs +4 -1
  101. package/cjs/utils/get-week-number/get-week-number.cjs.map +1 -1
  102. package/cjs/utils/get-weekdays-names/get-weekdays-names.cjs.map +1 -1
  103. package/cjs/utils/is-after-min-date/is-after-min-date.cjs.map +1 -1
  104. package/cjs/utils/is-all-day-event/is-all-day-event.cjs.map +1 -1
  105. package/cjs/utils/is-before-max-date/is-before-max-date.cjs.map +1 -1
  106. package/cjs/utils/is-event-in-time-range/is-event-in-time-range.cjs.map +1 -1
  107. package/cjs/utils/is-events-overlap/is-events-overlap.cjs.map +1 -1
  108. package/cjs/utils/is-in-time-range/is-in-time-range.cjs.map +1 -1
  109. package/cjs/utils/is-multiday-event/is-multiday-event.cjs.map +1 -1
  110. package/cjs/utils/is-same-month/is-same-month.cjs.map +1 -1
  111. package/cjs/utils/is-within-week/is-within-week.cjs.map +1 -1
  112. package/cjs/utils/next-week/next-week.cjs.map +1 -1
  113. package/cjs/utils/previous-week/previous-week.cjs.map +1 -1
  114. package/cjs/utils/sort-events/sort-events.cjs.map +1 -1
  115. package/cjs/utils/to-date-string/to-date-string.cjs.map +1 -1
  116. package/cjs/utils/validate-event/validate-event.cjs.map +1 -1
  117. package/esm/components/AgendaView/AgendaView.mjs +7 -6
  118. package/esm/components/AgendaView/AgendaView.mjs.map +1 -1
  119. package/esm/components/CurrentTimeIndicator/CurrentTimeIndicator.mjs +4 -3
  120. package/esm/components/CurrentTimeIndicator/CurrentTimeIndicator.mjs.map +1 -1
  121. package/esm/components/DayView/DayView.mjs +145 -79
  122. package/esm/components/DayView/DayView.mjs.map +1 -1
  123. package/esm/components/DayView/DayView.module.mjs +2 -1
  124. package/esm/components/DayView/DayView.module.mjs.map +1 -1
  125. package/esm/components/MobileMonthView/MobileMonthView.mjs +7 -6
  126. package/esm/components/MobileMonthView/MobileMonthView.mjs.map +1 -1
  127. package/esm/components/MonthView/MonthView.mjs +25 -35
  128. package/esm/components/MonthView/MonthView.mjs.map +1 -1
  129. package/esm/components/MonthView/MonthView.module.mjs.map +1 -1
  130. package/esm/components/MonthView/get-month-view-events/get-month-positioned-events.mjs +4 -2
  131. package/esm/components/MonthView/get-month-view-events/get-month-positioned-events.mjs.map +1 -1
  132. package/esm/components/MonthView/get-month-view-events/get-weeks-in-range.mjs +3 -2
  133. package/esm/components/MonthView/get-month-view-events/get-weeks-in-range.mjs.map +1 -1
  134. package/esm/components/MonthView/get-renderable-month-event-segments.mjs +1 -1
  135. package/esm/components/MonthView/get-renderable-month-event-segments.mjs.map +1 -1
  136. package/esm/components/MoreEvents/MoreEvents.mjs.map +1 -1
  137. package/esm/components/ResourcesDayView/ResourcesDayView.mjs +138 -54
  138. package/esm/components/ResourcesDayView/ResourcesDayView.mjs.map +1 -1
  139. package/esm/components/ResourcesDayView/ResourcesDayView.module.mjs +2 -1
  140. package/esm/components/ResourcesDayView/ResourcesDayView.module.mjs.map +1 -1
  141. package/esm/components/ResourcesDayView/ResourcesDayViewColumn.mjs.map +1 -1
  142. package/esm/components/ResourcesMonthView/ResourcesMonthView.mjs.map +1 -1
  143. package/esm/components/ResourcesSchedule/ResourcesSchedule.mjs +3 -1
  144. package/esm/components/ResourcesSchedule/ResourcesSchedule.mjs.map +1 -1
  145. package/esm/components/ResourcesWeekView/ResourcesWeekView.mjs +152 -61
  146. package/esm/components/ResourcesWeekView/ResourcesWeekView.mjs.map +1 -1
  147. package/esm/components/ResourcesWeekView/ResourcesWeekView.module.mjs +2 -1
  148. package/esm/components/ResourcesWeekView/ResourcesWeekView.module.mjs.map +1 -1
  149. package/esm/components/ResourcesWeekView/ResourcesWeekViewRow.mjs.map +1 -1
  150. package/esm/components/ResourcesWeekView/get-resources-week-view-events/get-resources-week-view-events.mjs +6 -3
  151. package/esm/components/ResourcesWeekView/get-resources-week-view-events/get-resources-week-view-events.mjs.map +1 -1
  152. package/esm/components/Schedule/Schedule.mjs +4 -1
  153. package/esm/components/Schedule/Schedule.mjs.map +1 -1
  154. package/esm/components/ScheduleBackgroundEvent/ScheduleBackgroundEvent.mjs +53 -0
  155. package/esm/components/ScheduleBackgroundEvent/ScheduleBackgroundEvent.mjs.map +1 -0
  156. package/esm/components/ScheduleEvent/ScheduleEvent.mjs.map +1 -1
  157. package/esm/components/ScheduleHeader/HeaderControl/HeaderControl.mjs +15 -14
  158. package/esm/components/ScheduleHeader/HeaderControl/HeaderControl.mjs.map +1 -1
  159. package/esm/components/ScheduleHeader/MonthYearSelect/MonthYearSelect.mjs.map +1 -1
  160. package/esm/components/ScheduleHeader/ScheduleHeader.mjs.map +1 -1
  161. package/esm/components/ScheduleHeader/ScheduleHeaderBase.mjs.map +1 -1
  162. package/esm/components/ScheduleHeader/ViewSelect/ViewSelect.mjs.map +1 -1
  163. package/esm/components/WeekView/WeekView.mjs +160 -83
  164. package/esm/components/WeekView/WeekView.mjs.map +1 -1
  165. package/esm/components/WeekView/WeekView.module.mjs +2 -1
  166. package/esm/components/WeekView/WeekView.module.mjs.map +1 -1
  167. package/esm/components/WeekView/WeekViewDay.mjs.map +1 -1
  168. package/esm/components/YearView/YearView.mjs +7 -6
  169. package/esm/components/YearView/YearView.mjs.map +1 -1
  170. package/esm/components/YearView/YearViewMonth.mjs.map +1 -1
  171. package/esm/hooks/use-drag-drop-handlers.mjs +13 -2
  172. package/esm/hooks/use-drag-drop-handlers.mjs.map +1 -1
  173. package/esm/hooks/use-event-resize.mjs +30 -15
  174. package/esm/hooks/use-event-resize.mjs.map +1 -1
  175. package/esm/hooks/use-horizontal-event-resize.mjs +30 -15
  176. package/esm/hooks/use-horizontal-event-resize.mjs.map +1 -1
  177. package/esm/index.mjs +2 -1
  178. package/esm/utils/calculate-drop-time/calculate-drop-time.mjs +25 -4
  179. package/esm/utils/calculate-drop-time/calculate-drop-time.mjs.map +1 -1
  180. package/esm/utils/get-month-days/get-month-days.mjs +4 -2
  181. package/esm/utils/get-month-days/get-month-days.mjs.map +1 -1
  182. package/esm/utils/get-week-number/get-week-number.mjs +4 -1
  183. package/esm/utils/get-week-number/get-week-number.mjs.map +1 -1
  184. package/lib/components/DayView/DayView.d.ts +7 -1
  185. package/lib/components/MonthView/MonthView.d.ts +2 -0
  186. package/lib/components/ResourcesDayView/ResourcesDayView.d.ts +7 -1
  187. package/lib/components/ResourcesDayView/ResourcesDayViewColumn.d.ts +1 -1
  188. package/lib/components/ResourcesSchedule/ResourcesSchedule.d.ts +3 -1
  189. package/lib/components/ResourcesWeekView/ResourcesWeekView.d.ts +7 -1
  190. package/lib/components/ResourcesWeekView/ResourcesWeekViewRow.d.ts +1 -1
  191. package/lib/components/Schedule/Schedule.d.ts +3 -1
  192. package/lib/components/ScheduleBackgroundEvent/ScheduleBackgroundEvent.d.ts +19 -0
  193. package/lib/components/ScheduleBackgroundEvent/index.d.ts +2 -0
  194. package/lib/components/ScheduleHeader/HeaderControl/HeaderControl.d.ts +3 -3
  195. package/lib/components/ScheduleHeader/ScheduleHeaderBase.d.ts +1 -1
  196. package/lib/components/WeekView/WeekView.d.ts +7 -1
  197. package/lib/components/WeekView/WeekViewDay.d.ts +1 -1
  198. package/lib/components/YearView/YearViewMonth.d.ts +1 -1
  199. package/lib/hooks/use-drag-drop-handlers.d.ts +10 -1
  200. package/lib/hooks/use-event-resize.d.ts +2 -1
  201. package/lib/hooks/use-horizontal-event-resize.d.ts +2 -1
  202. package/lib/index.d.mts +1 -0
  203. package/lib/index.d.ts +1 -0
  204. package/lib/types.d.ts +1 -1
  205. package/lib/utils/calculate-drop-time/calculate-drop-time.d.ts +11 -1
  206. package/package.json +8 -5
  207. package/styles.css +160 -0
  208. package/styles.layer.css +160 -0
@@ -1 +1 @@
1
- {"version":3,"file":"to-date-string.cjs","names":[],"sources":["../../../src/utils/to-date-string/to-date-string.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { AnyDateValue, DateStringValue } from '../../types';\n\nexport function toDateString(date: AnyDateValue): DateStringValue {\n return dayjs(date).format('YYYY-MM-DD 00:00:00');\n}\n"],"mappings":";;;;;AAGA,SAAgB,aAAa,MAAqC;CAChE,QAAA,GAAA,MAAA,QAAA,CAAa,IAAI,CAAC,CAAC,OAAO,qBAAqB;AACjD"}
1
+ {"version":3,"file":"to-date-string.cjs","names":[],"sources":["../../../src/utils/to-date-string/to-date-string.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { AnyDateValue, DateStringValue } from '../../types';\n\nexport function toDateString(date: AnyDateValue): DateStringValue {\n return dayjs(date).format('YYYY-MM-DD 00:00:00');\n}\n"],"mappings":";;;;;AAGA,SAAgB,aAAa,MAAqC;CAChE,QAAA,GAAO,MAAA,QAAA,CAAM,IAAI,CAAC,CAAC,OAAO,qBAAqB;AACjD"}
@@ -1 +1 @@
1
- {"version":3,"file":"validate-event.cjs","names":[],"sources":["../../../src/utils/validate-event/validate-event.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { ScheduleEventData } from '../../types';\n\nexport function validateEvent(eventData: ScheduleEventData) {\n if (!dayjs(eventData.start).isValid()) {\n throw new Error(`[@mantine/schedule] Invalid start date for event id: ${eventData.id}`);\n }\n\n if (!dayjs(eventData.end).isValid()) {\n throw new Error(`[@mantine/schedule] Invalid end date for event id: ${eventData.id}`);\n }\n\n if (dayjs(eventData.end).isBefore(dayjs(eventData.start))) {\n throw new Error(\n `[@mantine/schedule] Event end date is before start date for event id: ${eventData.id}`\n );\n }\n\n return eventData;\n}\n"],"mappings":";;;;;AAGA,SAAgB,cAAc,WAA8B;CAC1D,IAAI,EAAA,GAAA,MAAA,QAAA,CAAO,UAAU,KAAK,CAAC,CAAC,QAAQ,GAClC,MAAM,IAAI,MAAM,wDAAwD,UAAU,IAAI;CAGxF,IAAI,EAAA,GAAA,MAAA,QAAA,CAAO,UAAU,GAAG,CAAC,CAAC,QAAQ,GAChC,MAAM,IAAI,MAAM,sDAAsD,UAAU,IAAI;CAGtF,KAAA,GAAA,MAAA,QAAA,CAAU,UAAU,GAAG,CAAC,CAAC,UAAA,GAAA,MAAA,QAAA,CAAe,UAAU,KAAK,CAAC,GACtD,MAAM,IAAI,MACR,yEAAyE,UAAU,IACrF;CAGF,OAAO;AACT"}
1
+ {"version":3,"file":"validate-event.cjs","names":[],"sources":["../../../src/utils/validate-event/validate-event.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { ScheduleEventData } from '../../types';\n\nexport function validateEvent(eventData: ScheduleEventData) {\n if (!dayjs(eventData.start).isValid()) {\n throw new Error(`[@mantine/schedule] Invalid start date for event id: ${eventData.id}`);\n }\n\n if (!dayjs(eventData.end).isValid()) {\n throw new Error(`[@mantine/schedule] Invalid end date for event id: ${eventData.id}`);\n }\n\n if (dayjs(eventData.end).isBefore(dayjs(eventData.start))) {\n throw new Error(\n `[@mantine/schedule] Event end date is before start date for event id: ${eventData.id}`\n );\n }\n\n return eventData;\n}\n"],"mappings":";;;;;AAGA,SAAgB,cAAc,WAA8B;CAC1D,IAAI,EAAA,GAAC,MAAA,QAAA,CAAM,UAAU,KAAK,CAAC,CAAC,QAAQ,GAClC,MAAM,IAAI,MAAM,wDAAwD,UAAU,IAAI;CAGxF,IAAI,EAAA,GAAC,MAAA,QAAA,CAAM,UAAU,GAAG,CAAC,CAAC,QAAQ,GAChC,MAAM,IAAI,MAAM,sDAAsD,UAAU,IAAI;CAGtF,KAAA,GAAI,MAAA,QAAA,CAAM,UAAU,GAAG,CAAC,CAAC,UAAA,GAAS,MAAA,QAAA,CAAM,UAAU,KAAK,CAAC,GACtD,MAAM,IAAI,MACR,yEAAyE,UAAU,IACrF;CAGF,OAAO;AACT"}
@@ -39,15 +39,16 @@ const AgendaView = factory((_props) => {
39
39
  varsResolver,
40
40
  rootSelector: "agendaView"
41
41
  });
42
+ const expandedEvents = expandRecurringEvents({
43
+ events,
44
+ rangeStart: dayjs(rangeStart).startOf("day").toDate(),
45
+ rangeEnd: dayjs(rangeEnd).endOf("day").toDate(),
46
+ expansionLimit: recurrenceExpansionLimit
47
+ });
42
48
  const groupedEvents = getAgendaViewEvents({
43
49
  rangeStart,
44
50
  rangeEnd,
45
- events: expandRecurringEvents({
46
- events,
47
- rangeStart: dayjs(rangeStart).startOf("day").toDate(),
48
- rangeEnd: dayjs(rangeEnd).endOf("day").toDate(),
49
- expansionLimit: recurrenceExpansionLimit
50
- })
51
+ events: expandedEvents
51
52
  });
52
53
  const sortedDates = Object.keys(groupedEvents).sort();
53
54
  const headerLabel = `${formatDate({
@@ -1 +1 @@
1
- {"version":3,"file":"AgendaView.mjs","names":["classes"],"sources":["../../../src/components/AgendaView/AgendaView.tsx"],"sourcesContent":["import dayjs from 'dayjs';\nimport React from 'react';\nimport {\n Box,\n BoxProps,\n createVarsResolver,\n ElementProps,\n factory,\n Factory,\n getRadius,\n getThemeColor,\n MantineRadius,\n StylesApiProps,\n Text,\n UnstyledButton,\n useMantineTheme,\n useProps,\n useStyles,\n} from '@mantine/core';\nimport { useDatesContext } from '@mantine/dates';\nimport { getLabel, ScheduleLabelsOverride } from '../../labels';\nimport { AnyDateValue, DateLabelFormat, ScheduleEventData, ScheduleMode } from '../../types';\nimport {\n expandRecurringEvents,\n formatDate,\n isAllDayEvent,\n isMultidayEvent,\n sortEvents,\n} from '../../utils';\nimport { RenderEvent } from '../ScheduleEvent/ScheduleEvent';\nimport { getAgendaViewEvents } from './get-agenda-view-events';\nimport classes from './AgendaView.module.css';\n\nexport type AgendaViewStylesNames =\n | 'agendaView'\n | 'agendaViewHeader'\n | 'agendaViewHeaderLabel'\n | 'agendaViewBody'\n | 'agendaViewDateGroup'\n | 'agendaViewDateHeader'\n | 'agendaViewEvent'\n | 'agendaViewEventBody'\n | 'agendaViewEventColor'\n | 'agendaViewEventTitle'\n | 'agendaViewEventTime'\n | 'agendaViewNoEvents';\n\nexport type AgendaViewCssVariables = {\n agendaView: '--agenda-view-radius';\n};\n\nexport interface AgendaViewProps\n extends BoxProps, StylesApiProps<AgendaViewFactory>, ElementProps<'div'> {\n __staticSelector?: string;\n\n /** Start of the date range to display events for */\n rangeStart: AnyDateValue;\n\n /** End of the date range to display events for */\n rangeEnd: AnyDateValue;\n\n /** Events to display */\n events?: ScheduleEventData[];\n\n /** Locale passed down to dayjs, overrides value defined on `DatesProvider` */\n locale?: string;\n\n /** Key of `theme.radius` or any valid CSS value to set `border-radius` @default theme.defaultRadius */\n radius?: MantineRadius;\n\n /** Labels override for i18n */\n labels?: ScheduleLabelsOverride;\n\n /** Interaction mode: 'default' allows all interactions, 'static' disables event interactions @default 'default' */\n mode?: ScheduleMode;\n\n /** Function to fully customize event rendering, receives all props that would be passed to the root element including children */\n renderEvent?: RenderEvent;\n\n /** Format for the date group headers @default 'dddd, MMMM D' */\n dateHeaderFormat?: DateLabelFormat;\n\n /** Format for the header label showing the date range @default 'MMMM D, YYYY' */\n headerFormat?: DateLabelFormat;\n\n /** Called when event is clicked */\n onEventClick?: (event: ScheduleEventData, e: React.MouseEvent<HTMLButtonElement>) => void;\n\n /** Max number of generated recurring instances per recurring series @default 2000 */\n recurrenceExpansionLimit?: number;\n}\n\nexport type AgendaViewFactory = Factory<{\n props: AgendaViewProps;\n ref: HTMLDivElement;\n stylesNames: AgendaViewStylesNames;\n vars: AgendaViewCssVariables;\n}>;\n\nconst defaultProps = {\n __staticSelector: 'AgendaView',\n mode: 'default',\n dateHeaderFormat: 'dddd, MMMM D',\n headerFormat: 'MMMM D, YYYY',\n} satisfies Partial<AgendaViewProps>;\n\nconst varsResolver = createVarsResolver<AgendaViewFactory>((_theme, { radius }) => ({\n agendaView: {\n '--agenda-view-radius': getRadius(radius),\n },\n}));\n\nexport const AgendaView = factory<AgendaViewFactory>((_props) => {\n const props = useProps('AgendaView', defaultProps, _props);\n const {\n classNames,\n className,\n style,\n styles,\n unstyled,\n vars,\n attributes,\n __staticSelector,\n rangeStart,\n rangeEnd,\n events,\n locale,\n radius,\n labels,\n mode,\n renderEvent,\n dateHeaderFormat,\n headerFormat,\n onEventClick,\n recurrenceExpansionLimit,\n ...others\n } = props;\n\n const ctx = useDatesContext();\n const theme = useMantineTheme();\n\n const getStyles = useStyles<AgendaViewFactory>({\n name: __staticSelector,\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n attributes,\n vars,\n varsResolver,\n rootSelector: 'agendaView',\n });\n\n const expandedEvents = expandRecurringEvents({\n events,\n rangeStart: dayjs(rangeStart).startOf('day').toDate(),\n rangeEnd: dayjs(rangeEnd).endOf('day').toDate(),\n expansionLimit: recurrenceExpansionLimit,\n });\n\n const groupedEvents = getAgendaViewEvents({\n rangeStart,\n rangeEnd,\n events: expandedEvents,\n });\n\n const sortedDates = Object.keys(groupedEvents).sort();\n\n const headerLabel = `${formatDate({\n locale: ctx.getLocale(locale),\n date: rangeStart,\n format: headerFormat,\n })} – ${formatDate({\n locale: ctx.getLocale(locale),\n date: rangeEnd,\n format: headerFormat,\n })}`;\n\n const dateGroups = sortedDates.map((dateStr) => {\n const dateEvents = sortEvents(groupedEvents[dateStr]);\n\n const eventNodes = dateEvents.map((event) => {\n const startTime = dayjs(event.start).format('HH:mm');\n const endTime = dayjs(event.end).format('HH:mm');\n const isAllDay = isMultidayEvent(event) || isAllDayEvent({ event, date: dateStr });\n\n const eventChildren = (\n <Box {...getStyles('agendaViewEventBody')}>\n <div\n {...getStyles('agendaViewEventColor', {\n style: { backgroundColor: getThemeColor(event.color, theme) },\n })}\n />\n <div>\n <Text {...getStyles('agendaViewEventTitle')}>{event.title}</Text>\n <Text {...getStyles('agendaViewEventTime')}>\n {isAllDay ? getLabel('allDay', labels) : `${startTime} – ${endTime}`}\n </Text>\n </div>\n </Box>\n );\n\n const rootProps: React.ComponentPropsWithoutRef<'button'> & { children: React.ReactNode } = {\n ...getStyles('agendaViewEvent'),\n onClick:\n mode === 'static'\n ? undefined\n : (e: React.MouseEvent<HTMLButtonElement>) => {\n onEventClick?.(event, e);\n },\n tabIndex: mode === 'static' ? -1 : 0,\n children: eventChildren,\n };\n\n if (typeof renderEvent === 'function') {\n return <React.Fragment key={event.id}>{renderEvent(event, rootProps)}</React.Fragment>;\n }\n\n return <UnstyledButton {...rootProps} key={event.id} />;\n });\n\n return (\n <div {...getStyles('agendaViewDateGroup')} key={dateStr}>\n <Text {...getStyles('agendaViewDateHeader')}>\n {formatDate({\n locale: ctx.getLocale(locale),\n date: dateStr,\n format: dateHeaderFormat,\n })}\n </Text>\n {eventNodes}\n </div>\n );\n });\n\n return (\n <Box {...getStyles('agendaView')} {...others}>\n <div {...getStyles('agendaViewHeader')}>\n <Text {...getStyles('agendaViewHeaderLabel')}>{headerLabel}</Text>\n </div>\n\n <Box {...getStyles('agendaViewBody')}>\n {dateGroups.length > 0 ? (\n dateGroups\n ) : (\n <Text {...getStyles('agendaViewNoEvents')}>{getLabel('noEvents', labels)}</Text>\n )}\n </Box>\n </Box>\n );\n});\n\nAgendaView.displayName = '@mantine/schedule/AgendaView';\nAgendaView.classes = classes;\nAgendaView.varsResolver = varsResolver;\n\nexport namespace AgendaView {\n export type Props = AgendaViewProps;\n export type Factory = AgendaViewFactory;\n export type StylesNames = AgendaViewStylesNames;\n export type CssVariables = AgendaViewCssVariables;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AgendaView.mjs","names":["classes"],"sources":["../../../src/components/AgendaView/AgendaView.tsx"],"sourcesContent":["import dayjs from 'dayjs';\nimport React from 'react';\nimport {\n Box,\n BoxProps,\n createVarsResolver,\n ElementProps,\n factory,\n Factory,\n getRadius,\n getThemeColor,\n MantineRadius,\n StylesApiProps,\n Text,\n UnstyledButton,\n useMantineTheme,\n useProps,\n useStyles,\n} from '@mantine/core';\nimport { useDatesContext } from '@mantine/dates';\nimport { getLabel, ScheduleLabelsOverride } from '../../labels';\nimport { AnyDateValue, DateLabelFormat, ScheduleEventData, ScheduleMode } from '../../types';\nimport {\n expandRecurringEvents,\n formatDate,\n isAllDayEvent,\n isMultidayEvent,\n sortEvents,\n} from '../../utils';\nimport { RenderEvent } from '../ScheduleEvent/ScheduleEvent';\nimport { getAgendaViewEvents } from './get-agenda-view-events';\nimport classes from './AgendaView.module.css';\n\nexport type AgendaViewStylesNames =\n | 'agendaView'\n | 'agendaViewHeader'\n | 'agendaViewHeaderLabel'\n | 'agendaViewBody'\n | 'agendaViewDateGroup'\n | 'agendaViewDateHeader'\n | 'agendaViewEvent'\n | 'agendaViewEventBody'\n | 'agendaViewEventColor'\n | 'agendaViewEventTitle'\n | 'agendaViewEventTime'\n | 'agendaViewNoEvents';\n\nexport type AgendaViewCssVariables = {\n agendaView: '--agenda-view-radius';\n};\n\nexport interface AgendaViewProps\n extends BoxProps, StylesApiProps<AgendaViewFactory>, ElementProps<'div'> {\n __staticSelector?: string;\n\n /** Start of the date range to display events for */\n rangeStart: AnyDateValue;\n\n /** End of the date range to display events for */\n rangeEnd: AnyDateValue;\n\n /** Events to display */\n events?: ScheduleEventData[];\n\n /** Locale passed down to dayjs, overrides value defined on `DatesProvider` */\n locale?: string;\n\n /** Key of `theme.radius` or any valid CSS value to set `border-radius` @default theme.defaultRadius */\n radius?: MantineRadius;\n\n /** Labels override for i18n */\n labels?: ScheduleLabelsOverride;\n\n /** Interaction mode: 'default' allows all interactions, 'static' disables event interactions @default 'default' */\n mode?: ScheduleMode;\n\n /** Function to fully customize event rendering, receives all props that would be passed to the root element including children */\n renderEvent?: RenderEvent;\n\n /** Format for the date group headers @default 'dddd, MMMM D' */\n dateHeaderFormat?: DateLabelFormat;\n\n /** Format for the header label showing the date range @default 'MMMM D, YYYY' */\n headerFormat?: DateLabelFormat;\n\n /** Called when event is clicked */\n onEventClick?: (event: ScheduleEventData, e: React.MouseEvent<HTMLButtonElement>) => void;\n\n /** Max number of generated recurring instances per recurring series @default 2000 */\n recurrenceExpansionLimit?: number;\n}\n\nexport type AgendaViewFactory = Factory<{\n props: AgendaViewProps;\n ref: HTMLDivElement;\n stylesNames: AgendaViewStylesNames;\n vars: AgendaViewCssVariables;\n}>;\n\nconst defaultProps = {\n __staticSelector: 'AgendaView',\n mode: 'default',\n dateHeaderFormat: 'dddd, MMMM D',\n headerFormat: 'MMMM D, YYYY',\n} satisfies Partial<AgendaViewProps>;\n\nconst varsResolver = createVarsResolver<AgendaViewFactory>((_theme, { radius }) => ({\n agendaView: {\n '--agenda-view-radius': getRadius(radius),\n },\n}));\n\nexport const AgendaView = factory<AgendaViewFactory>((_props) => {\n const props = useProps('AgendaView', defaultProps, _props);\n const {\n classNames,\n className,\n style,\n styles,\n unstyled,\n vars,\n attributes,\n __staticSelector,\n rangeStart,\n rangeEnd,\n events,\n locale,\n radius,\n labels,\n mode,\n renderEvent,\n dateHeaderFormat,\n headerFormat,\n onEventClick,\n recurrenceExpansionLimit,\n ...others\n } = props;\n\n const ctx = useDatesContext();\n const theme = useMantineTheme();\n\n const getStyles = useStyles<AgendaViewFactory>({\n name: __staticSelector,\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n attributes,\n vars,\n varsResolver,\n rootSelector: 'agendaView',\n });\n\n const expandedEvents = expandRecurringEvents({\n events,\n rangeStart: dayjs(rangeStart).startOf('day').toDate(),\n rangeEnd: dayjs(rangeEnd).endOf('day').toDate(),\n expansionLimit: recurrenceExpansionLimit,\n });\n\n const groupedEvents = getAgendaViewEvents({\n rangeStart,\n rangeEnd,\n events: expandedEvents,\n });\n\n const sortedDates = Object.keys(groupedEvents).sort();\n\n const headerLabel = `${formatDate({\n locale: ctx.getLocale(locale),\n date: rangeStart,\n format: headerFormat,\n })} – ${formatDate({\n locale: ctx.getLocale(locale),\n date: rangeEnd,\n format: headerFormat,\n })}`;\n\n const dateGroups = sortedDates.map((dateStr) => {\n const dateEvents = sortEvents(groupedEvents[dateStr]);\n\n const eventNodes = dateEvents.map((event) => {\n const startTime = dayjs(event.start).format('HH:mm');\n const endTime = dayjs(event.end).format('HH:mm');\n const isAllDay = isMultidayEvent(event) || isAllDayEvent({ event, date: dateStr });\n\n const eventChildren = (\n <Box {...getStyles('agendaViewEventBody')}>\n <div\n {...getStyles('agendaViewEventColor', {\n style: { backgroundColor: getThemeColor(event.color, theme) },\n })}\n />\n <div>\n <Text {...getStyles('agendaViewEventTitle')}>{event.title}</Text>\n <Text {...getStyles('agendaViewEventTime')}>\n {isAllDay ? getLabel('allDay', labels) : `${startTime} – ${endTime}`}\n </Text>\n </div>\n </Box>\n );\n\n const rootProps: React.ComponentPropsWithoutRef<'button'> & { children: React.ReactNode } = {\n ...getStyles('agendaViewEvent'),\n onClick:\n mode === 'static'\n ? undefined\n : (e: React.MouseEvent<HTMLButtonElement>) => {\n onEventClick?.(event, e);\n },\n tabIndex: mode === 'static' ? -1 : 0,\n children: eventChildren,\n };\n\n if (typeof renderEvent === 'function') {\n return <React.Fragment key={event.id}>{renderEvent(event, rootProps)}</React.Fragment>;\n }\n\n return <UnstyledButton {...rootProps} key={event.id} />;\n });\n\n return (\n <div {...getStyles('agendaViewDateGroup')} key={dateStr}>\n <Text {...getStyles('agendaViewDateHeader')}>\n {formatDate({\n locale: ctx.getLocale(locale),\n date: dateStr,\n format: dateHeaderFormat,\n })}\n </Text>\n {eventNodes}\n </div>\n );\n });\n\n return (\n <Box {...getStyles('agendaView')} {...others}>\n <div {...getStyles('agendaViewHeader')}>\n <Text {...getStyles('agendaViewHeaderLabel')}>{headerLabel}</Text>\n </div>\n\n <Box {...getStyles('agendaViewBody')}>\n {dateGroups.length > 0 ? (\n dateGroups\n ) : (\n <Text {...getStyles('agendaViewNoEvents')}>{getLabel('noEvents', labels)}</Text>\n )}\n </Box>\n </Box>\n );\n});\n\nAgendaView.displayName = '@mantine/schedule/AgendaView';\nAgendaView.classes = classes;\nAgendaView.varsResolver = varsResolver;\n\nexport namespace AgendaView {\n export type Props = AgendaViewProps;\n export type Factory = AgendaViewFactory;\n export type StylesNames = AgendaViewStylesNames;\n export type CssVariables = AgendaViewCssVariables;\n}\n"],"mappings":"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"}
@@ -5,7 +5,7 @@ import { isInTimeRange } from "../../utils/is-in-time-range/is-in-time-range.mjs
5
5
  import CurrentTimeIndicator_module_default from "./CurrentTimeIndicator.module.mjs";
6
6
  import dayjs from "dayjs";
7
7
  import { Box, createVarsResolver, factory, getThemeColor, useProps, useStyles } from "@mantine/core";
8
- import { useInterval } from "@mantine/hooks";
8
+ import { useInterval, useMounted } from "@mantine/hooks";
9
9
  import { useState } from "react";
10
10
  import { useDatesContext } from "@mantine/dates";
11
11
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -36,8 +36,9 @@ const CurrentTimeIndicator = factory((_props) => {
36
36
  rootSelector: "currentTimeIndicator"
37
37
  });
38
38
  const ctx = useDatesContext();
39
+ const mounted = useMounted();
39
40
  const [, setTick] = useState(0);
40
- useInterval(() => setTick((tick) => tick + 1), 1e3 * 60, { autoInvoke: true });
41
+ useInterval(() => setTick((tick) => tick + 1), 6e4, { autoInvoke: true });
41
42
  const now = getCurrentTime ? dayjs(getCurrentTime()) : dayjs();
42
43
  const offsetPercent = getCurrentTimePosition({
43
44
  startTime,
@@ -50,7 +51,7 @@ const CurrentTimeIndicator = factory((_props) => {
50
51
  date: now,
51
52
  format: currentTimeFormat
52
53
  }) : "";
53
- if (!isInTimeRange({
54
+ if (!mounted || !isInTimeRange({
54
55
  date: now,
55
56
  startTime,
56
57
  endTime
@@ -1 +1 @@
1
- {"version":3,"file":"CurrentTimeIndicator.mjs","names":["classes"],"sources":["../../../src/components/CurrentTimeIndicator/CurrentTimeIndicator.tsx"],"sourcesContent":["import dayjs from 'dayjs';\nimport { useState } from 'react';\nimport {\n Box,\n BoxProps,\n createVarsResolver,\n ElementProps,\n factory,\n Factory,\n getThemeColor,\n MantineColor,\n StylesApiProps,\n useProps,\n useStyles,\n} from '@mantine/core';\nimport { useDatesContext } from '@mantine/dates';\nimport { useInterval } from '@mantine/hooks';\nimport { AnyDateValue, DateLabelFormat } from '../../types';\nimport { formatDate, getCurrentTimePosition, isInTimeRange } from '../../utils';\nimport classes from './CurrentTimeIndicator.module.css';\n\nexport type CurrentTimeIndicatorStylesNames =\n | 'currentTimeIndicator'\n | 'currentTimeIndicatorLine'\n | 'currentTimeIndicatorThumb'\n | 'currentTimeIndicatorTimeBubble';\n\nexport type CurrentTimeIndicatorCssVariables = {\n currentTimeIndicator: '--indicator-color';\n};\n\nexport interface CurrentTimeIndicatorProps\n extends BoxProps, StylesApiProps<CurrentTimeIndicatorFactory>, ElementProps<'div'> {\n __staticSelector?: string;\n\n /** Key of `theme.colors` or any valid CSS color value @default 'red' */\n color?: MantineColor;\n\n /** Offset from the left side */\n startOffset?: string;\n\n /** Offset from the right side */\n endOffset?: string;\n\n /** Extra configurable offset from the top */\n topOffset?: string;\n\n /** Offset for the time bubble */\n timeBubbleStartOffset?: string;\n\n /** If set, displays a bubble with the current time @default @true */\n withTimeBubble?: boolean;\n\n /** If set, displays thumb next to the line @default true */\n withThumb?: boolean;\n\n /** Format of the time displayed in the time bubble @default 'HH:mm' */\n currentTimeFormat?: DateLabelFormat;\n\n /** Locale passed down to dayjs during formatting */\n locale?: string;\n\n /** Start time of the day */\n startTime?: string;\n\n /** End time of the day */\n endTime?: string;\n\n /** Number of minutes per time slot. Used to align the indicator to whole slots when `endTime` does not divide evenly. */\n intervalMinutes?: number;\n\n /** A function to get the current time, called on every tick. Can be used to display the indicator in a different timezone. @default () => dayjs() */\n getCurrentTime?: () => AnyDateValue;\n}\n\nexport type CurrentTimeIndicatorFactory = Factory<{\n props: CurrentTimeIndicatorProps;\n ref: HTMLDivElement;\n stylesNames: CurrentTimeIndicatorStylesNames;\n vars: CurrentTimeIndicatorCssVariables;\n}>;\n\nconst defaultProps = {\n __staticSelector: 'CurrentTimeIndicator',\n withTimeBubble: true,\n withThumb: true,\n currentTimeFormat: 'HH:mm',\n topOffset: '0rem',\n} satisfies Partial<CurrentTimeIndicatorProps>;\n\nconst varsResolver = createVarsResolver<CurrentTimeIndicatorFactory>((theme, { color }) => ({\n currentTimeIndicator: {\n '--indicator-color': color ? getThemeColor(color, theme) : undefined,\n },\n}));\n\nexport const CurrentTimeIndicator = factory<CurrentTimeIndicatorFactory>((_props) => {\n const props = useProps('CurrentTimeIndicator', defaultProps, _props);\n const {\n classNames,\n className,\n style,\n styles,\n unstyled,\n vars,\n attributes,\n startOffset,\n endOffset,\n color,\n withTimeBubble,\n withThumb,\n currentTimeFormat,\n locale,\n timeBubbleStartOffset,\n __staticSelector,\n topOffset,\n startTime,\n endTime,\n intervalMinutes,\n getCurrentTime,\n ...others\n } = props;\n\n const getStyles = useStyles<CurrentTimeIndicatorFactory>({\n name: __staticSelector,\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n vars,\n varsResolver,\n attributes,\n rootSelector: 'currentTimeIndicator',\n });\n\n const ctx = useDatesContext();\n const [, setTick] = useState(0);\n useInterval(() => setTick((tick) => tick + 1), 1000 * 60, {\n autoInvoke: true,\n });\n\n const now = getCurrentTime ? dayjs(getCurrentTime()) : dayjs();\n const offsetPercent = getCurrentTimePosition({ startTime, endTime, intervalMinutes, now });\n const formattedTime = withTimeBubble\n ? formatDate({ locale: ctx.getLocale(locale), date: now, format: currentTimeFormat })\n : '';\n\n if (!isInTimeRange({ date: now, startTime, endTime })) {\n return null;\n }\n\n return (\n <Box\n {...getStyles('currentTimeIndicator')}\n __vars={{\n '--top-offset': `calc(${offsetPercent}% + ${topOffset})`,\n '--start-offset': startOffset,\n '--end-offset': endOffset,\n '--time-bubble-start-offset': timeBubbleStartOffset,\n\n // Adjust time bubble width for formats including AM/PM\n '--time-bubble-width': formattedTime?.toString().toLowerCase().includes('m')\n ? '64px'\n : '46px',\n }}\n {...others}\n >\n {withTimeBubble && (\n <div {...getStyles('currentTimeIndicatorTimeBubble')}>{formattedTime}</div>\n )}\n\n {withThumb && <div {...getStyles('currentTimeIndicatorThumb')} />}\n\n <div {...getStyles('currentTimeIndicatorLine')} />\n </Box>\n );\n});\n\nCurrentTimeIndicator.displayName = '@mantine/schedule/CurrentTimeIndicator';\nCurrentTimeIndicator.classes = classes;\nCurrentTimeIndicator.varsResolver = varsResolver;\n"],"mappings":";;;;;;;;;;;;AAkFA,MAAM,eAAe;CACnB,kBAAkB;CAClB,gBAAgB;CAChB,WAAW;CACX,mBAAmB;CACnB,WAAW;AACb;AAEA,MAAM,eAAe,oBAAiD,OAAO,EAAE,aAAa,EAC1F,sBAAsB,EACpB,qBAAqB,QAAQ,cAAc,OAAO,KAAK,IAAI,KAAA,EAC7D,EACF,EAAE;AAEF,MAAa,uBAAuB,SAAsC,WAAW;CACnF,MAAM,QAAQ,SAAS,wBAAwB,cAAc,MAAM;CACnE,MAAM,EACJ,YACA,WACA,OACA,QACA,UACA,MACA,YACA,aACA,WACA,OACA,gBACA,WACA,mBACA,QACA,uBACA,kBACA,WACA,WACA,SACA,iBACA,gBACA,GAAG,WACD;CAEJ,MAAM,YAAY,UAAuC;EACvD,MAAM;EACN,SAAA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,cAAc;CAChB,CAAC;CAED,MAAM,MAAM,gBAAgB;CAC5B,MAAM,GAAG,WAAW,SAAS,CAAC;CAC9B,kBAAkB,SAAS,SAAS,OAAO,CAAC,GAAG,MAAO,IAAI,EACxD,YAAY,KACd,CAAC;CAED,MAAM,MAAM,iBAAiB,MAAM,eAAe,CAAC,IAAI,MAAM;CAC7D,MAAM,gBAAgB,uBAAuB;EAAE;EAAW;EAAS;EAAiB;CAAI,CAAC;CACzF,MAAM,gBAAgB,iBAClB,WAAW;EAAE,QAAQ,IAAI,UAAU,MAAM;EAAG,MAAM;EAAK,QAAQ;CAAkB,CAAC,IAClF;CAEJ,IAAI,CAAC,cAAc;EAAE,MAAM;EAAK;EAAW;CAAQ,CAAC,GAClD,OAAO;CAGT,OACE,qBAAC,KAAD;EACE,GAAI,UAAU,sBAAsB;EACpC,QAAQ;GACN,gBAAgB,QAAQ,cAAc,MAAM,UAAU;GACtD,kBAAkB;GAClB,gBAAgB;GAChB,8BAA8B;GAG9B,uBAAuB,eAAe,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,SAAS,GAAG,IACvE,SACA;EACN;EACA,GAAI;YAbN;GAeG,kBACC,oBAAC,OAAD;IAAK,GAAI,UAAU,gCAAgC;cAAI;GAAmB,CAAA;GAG3E,aAAa,oBAAC,OAAD,EAAK,GAAI,UAAU,2BAA2B,EAAI,CAAA;GAEhE,oBAAC,OAAD,EAAK,GAAI,UAAU,0BAA0B,EAAI,CAAA;EAC9C;;AAET,CAAC;AAED,qBAAqB,cAAc;AACnC,qBAAqB,UAAUA;AAC/B,qBAAqB,eAAe"}
1
+ {"version":3,"file":"CurrentTimeIndicator.mjs","names":["classes"],"sources":["../../../src/components/CurrentTimeIndicator/CurrentTimeIndicator.tsx"],"sourcesContent":["import dayjs from 'dayjs';\nimport { useState } from 'react';\nimport {\n Box,\n BoxProps,\n createVarsResolver,\n ElementProps,\n factory,\n Factory,\n getThemeColor,\n MantineColor,\n StylesApiProps,\n useProps,\n useStyles,\n} from '@mantine/core';\nimport { useDatesContext } from '@mantine/dates';\nimport { useInterval, useMounted } from '@mantine/hooks';\nimport { AnyDateValue, DateLabelFormat } from '../../types';\nimport { formatDate, getCurrentTimePosition, isInTimeRange } from '../../utils';\nimport classes from './CurrentTimeIndicator.module.css';\n\nexport type CurrentTimeIndicatorStylesNames =\n | 'currentTimeIndicator'\n | 'currentTimeIndicatorLine'\n | 'currentTimeIndicatorThumb'\n | 'currentTimeIndicatorTimeBubble';\n\nexport type CurrentTimeIndicatorCssVariables = {\n currentTimeIndicator: '--indicator-color';\n};\n\nexport interface CurrentTimeIndicatorProps\n extends BoxProps, StylesApiProps<CurrentTimeIndicatorFactory>, ElementProps<'div'> {\n __staticSelector?: string;\n\n /** Key of `theme.colors` or any valid CSS color value @default 'red' */\n color?: MantineColor;\n\n /** Offset from the left side */\n startOffset?: string;\n\n /** Offset from the right side */\n endOffset?: string;\n\n /** Extra configurable offset from the top */\n topOffset?: string;\n\n /** Offset for the time bubble */\n timeBubbleStartOffset?: string;\n\n /** If set, displays a bubble with the current time @default @true */\n withTimeBubble?: boolean;\n\n /** If set, displays thumb next to the line @default true */\n withThumb?: boolean;\n\n /** Format of the time displayed in the time bubble @default 'HH:mm' */\n currentTimeFormat?: DateLabelFormat;\n\n /** Locale passed down to dayjs during formatting */\n locale?: string;\n\n /** Start time of the day */\n startTime?: string;\n\n /** End time of the day */\n endTime?: string;\n\n /** Number of minutes per time slot. Used to align the indicator to whole slots when `endTime` does not divide evenly. */\n intervalMinutes?: number;\n\n /** A function to get the current time, called on every tick. Can be used to display the indicator in a different timezone. @default () => dayjs() */\n getCurrentTime?: () => AnyDateValue;\n}\n\nexport type CurrentTimeIndicatorFactory = Factory<{\n props: CurrentTimeIndicatorProps;\n ref: HTMLDivElement;\n stylesNames: CurrentTimeIndicatorStylesNames;\n vars: CurrentTimeIndicatorCssVariables;\n}>;\n\nconst defaultProps = {\n __staticSelector: 'CurrentTimeIndicator',\n withTimeBubble: true,\n withThumb: true,\n currentTimeFormat: 'HH:mm',\n topOffset: '0rem',\n} satisfies Partial<CurrentTimeIndicatorProps>;\n\nconst varsResolver = createVarsResolver<CurrentTimeIndicatorFactory>((theme, { color }) => ({\n currentTimeIndicator: {\n '--indicator-color': color ? getThemeColor(color, theme) : undefined,\n },\n}));\n\nexport const CurrentTimeIndicator = factory<CurrentTimeIndicatorFactory>((_props) => {\n const props = useProps('CurrentTimeIndicator', defaultProps, _props);\n const {\n classNames,\n className,\n style,\n styles,\n unstyled,\n vars,\n attributes,\n startOffset,\n endOffset,\n color,\n withTimeBubble,\n withThumb,\n currentTimeFormat,\n locale,\n timeBubbleStartOffset,\n __staticSelector,\n topOffset,\n startTime,\n endTime,\n intervalMinutes,\n getCurrentTime,\n ...others\n } = props;\n\n const getStyles = useStyles<CurrentTimeIndicatorFactory>({\n name: __staticSelector,\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n vars,\n varsResolver,\n attributes,\n rootSelector: 'currentTimeIndicator',\n });\n\n const ctx = useDatesContext();\n const mounted = useMounted();\n const [, setTick] = useState(0);\n useInterval(() => setTick((tick) => tick + 1), 1000 * 60, {\n autoInvoke: true,\n });\n\n const now = getCurrentTime ? dayjs(getCurrentTime()) : dayjs();\n const offsetPercent = getCurrentTimePosition({ startTime, endTime, intervalMinutes, now });\n const formattedTime = withTimeBubble\n ? formatDate({ locale: ctx.getLocale(locale), date: now, format: currentTimeFormat })\n : '';\n\n if (!mounted || !isInTimeRange({ date: now, startTime, endTime })) {\n return null;\n }\n\n return (\n <Box\n {...getStyles('currentTimeIndicator')}\n __vars={{\n '--top-offset': `calc(${offsetPercent}% + ${topOffset})`,\n '--start-offset': startOffset,\n '--end-offset': endOffset,\n '--time-bubble-start-offset': timeBubbleStartOffset,\n\n // Adjust time bubble width for formats including AM/PM\n '--time-bubble-width': formattedTime?.toString().toLowerCase().includes('m')\n ? '64px'\n : '46px',\n }}\n {...others}\n >\n {withTimeBubble && (\n <div {...getStyles('currentTimeIndicatorTimeBubble')}>{formattedTime}</div>\n )}\n\n {withThumb && <div {...getStyles('currentTimeIndicatorThumb')} />}\n\n <div {...getStyles('currentTimeIndicatorLine')} />\n </Box>\n );\n});\n\nCurrentTimeIndicator.displayName = '@mantine/schedule/CurrentTimeIndicator';\nCurrentTimeIndicator.classes = classes;\nCurrentTimeIndicator.varsResolver = varsResolver;\n"],"mappings":";;;;;;;;;;;;AAkFA,MAAM,eAAe;CACnB,kBAAkB;CAClB,gBAAgB;CAChB,WAAW;CACX,mBAAmB;CACnB,WAAW;AACb;AAEA,MAAM,eAAe,oBAAiD,OAAO,EAAE,aAAa,EAC1F,sBAAsB,EACpB,qBAAqB,QAAQ,cAAc,OAAO,KAAK,IAAI,KAAA,EAC7D,EACF,EAAE;AAEF,MAAa,uBAAuB,SAAsC,WAAW;CACnF,MAAM,QAAQ,SAAS,wBAAwB,cAAc,MAAM;CACnE,MAAM,EACJ,YACA,WACA,OACA,QACA,UACA,MACA,YACA,aACA,WACA,OACA,gBACA,WACA,mBACA,QACA,uBACA,kBACA,WACA,WACA,SACA,iBACA,gBACA,GAAG,WACD;CAEJ,MAAM,YAAY,UAAuC;EACvD,MAAM;EACN,SAAA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,cAAc;CAChB,CAAC;CAED,MAAM,MAAM,gBAAgB;CAC5B,MAAM,UAAU,WAAW;CAC3B,MAAM,GAAG,WAAW,SAAS,CAAC;CAC9B,kBAAkB,SAAS,SAAS,OAAO,CAAC,GAAG,KAAW,EACxD,YAAY,KACd,CAAC;CAED,MAAM,MAAM,iBAAiB,MAAM,eAAe,CAAC,IAAI,MAAM;CAC7D,MAAM,gBAAgB,uBAAuB;EAAE;EAAW;EAAS;EAAiB;CAAI,CAAC;CACzF,MAAM,gBAAgB,iBAClB,WAAW;EAAE,QAAQ,IAAI,UAAU,MAAM;EAAG,MAAM;EAAK,QAAQ;CAAkB,CAAC,IAClF;CAEJ,IAAI,CAAC,WAAW,CAAC,cAAc;EAAE,MAAM;EAAK;EAAW;CAAQ,CAAC,GAC9D,OAAO;CAGT,OACE,qBAAC,KAAD;EACE,GAAI,UAAU,sBAAsB;EACpC,QAAQ;GACN,gBAAgB,QAAQ,cAAc,MAAM,UAAU;GACtD,kBAAkB;GAClB,gBAAgB;GAChB,8BAA8B;GAG9B,uBAAuB,eAAe,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,SAAS,GAAG,IACvE,SACA;EACN;EACA,GAAI;EAbN,UAAA;GAeG,kBACC,oBAAC,OAAD;IAAK,GAAI,UAAU,gCAAgC;IAAI,UAAA;GAAmB,CAAA;GAG3E,aAAa,oBAAC,OAAD,EAAK,GAAI,UAAU,2BAA2B,EAAI,CAAA;GAEhE,oBAAC,OAAD,EAAK,GAAI,UAAU,0BAA0B,EAAI,CAAA;EAC9C;;AAET,CAAC;AAED,qBAAqB,cAAc;AACnC,qBAAqB,UAAUA;AAC/B,qBAAqB,eAAe"}
@@ -6,6 +6,7 @@ import { getDayTimeIntervals } from "../../utils/get-day-time-intervals/get-day-
6
6
  import { toDateString } from "../../utils/to-date-string/to-date-string.mjs";
7
7
  import { isAllDayEvent } from "../../utils/is-all-day-event/is-all-day-event.mjs";
8
8
  import { getVisibleEvents } from "../../utils/get-visible-events/get-visible-events.mjs";
9
+ import { getDayPosition } from "../../utils/get-day-position/get-day-position.mjs";
9
10
  import { getTimeAxisEventStyle } from "../../utils/get-time-axis-event-style/get-time-axis-event-style.mjs";
10
11
  import { calculateDropTime } from "../../utils/calculate-drop-time/calculate-drop-time.mjs";
11
12
  import { getBusinessHoursMod } from "../../utils/get-business-hours-mod/get-business-hours-mod.mjs";
@@ -19,11 +20,12 @@ import { CurrentTimeIndicator } from "../CurrentTimeIndicator/CurrentTimeIndicat
19
20
  import { DragContext } from "../DragContext/DragContext.mjs";
20
21
  import { ScheduleEvent } from "../ScheduleEvent/ScheduleEvent.mjs";
21
22
  import { MoreEvents } from "../MoreEvents/MoreEvents.mjs";
23
+ import { ScheduleBackgroundEvent } from "../ScheduleBackgroundEvent/ScheduleBackgroundEvent.mjs";
22
24
  import { ScheduleHeaderBase } from "../ScheduleHeader/ScheduleHeaderBase.mjs";
23
25
  import { getDayViewEvents } from "./get-day-view-events/get-day-view-events.mjs";
24
26
  import DayView_module_default from "./DayView.module.mjs";
25
27
  import dayjs from "dayjs";
26
- import { Box, ScrollArea, UnstyledButton, createVarsResolver, factory, getRadius, rem, useMantineTheme, useProps, useResolvedStylesApi, useStyles } from "@mantine/core";
28
+ import { Box, ScrollArea, UnstyledButton, createVarsResolver, factory, getRadius, rem, useProps, useResolvedStylesApi, useStyles } from "@mantine/core";
27
29
  import { useIsomorphicEffect, useMergedRef } from "@mantine/hooks";
28
30
  import { createElement, useCallback, useRef, useState } from "react";
29
31
  import { useDatesContext } from "@mantine/dates";
@@ -45,7 +47,8 @@ const defaultProps = {
45
47
  withEventsDragAndDrop: false,
46
48
  withDragSlotSelect: false,
47
49
  withEventResize: false,
48
- mode: "default"
50
+ mode: "default",
51
+ withInteractiveBackgroundEvents: false
49
52
  };
50
53
  const varsResolver = createVarsResolver((_theme, { radius, slotHeight, allDaySlotHeight }) => ({ dayView: {
51
54
  "--day-view-radius": radius !== void 0 ? getRadius(radius) : void 0,
@@ -54,7 +57,7 @@ const varsResolver = createVarsResolver((_theme, { radius, slotHeight, allDaySlo
54
57
  } }));
55
58
  const DayView = factory((_props) => {
56
59
  const props = useProps("DayView", defaultProps, _props);
57
- const { classNames, className, style, styles, unstyled, attributes, vars, __staticSelector, startTime, endTime, intervalMinutes, withSubHourGridLines, withAllDaySlot, date, locale, slotLabelFormat, headerFormat, getCurrentTime, withCurrentTimeIndicator, withCurrentTimeBubble, withHeader, radius, onDateChange, onViewChange, previousControlProps, nextControlProps, todayControlProps, viewSelectProps, slotHeight, allDaySlotHeight, scrollAreaProps, events, moreEventsProps, renderEventBody, renderEvent, labels, highlightBusinessHours, businessHours, withEventsDragAndDrop, onEventDrop, canDragEvent, onEventDragStart, onEventDragEnd, onTimeSlotClick, onAllDaySlotClick, onEventClick, withDragSlotSelect, onSlotDragEnd, mode, startScrollTime, onExternalEventDrop, withEventResize, onEventResize, canResizeEvent, recurrenceExpansionLimit, getTimeSlotProps, withAgenda, ...others } = props;
60
+ const { classNames, className, style, styles, unstyled, attributes, vars, __staticSelector, startTime, endTime, intervalMinutes, withSubHourGridLines, withAllDaySlot, date, locale, slotLabelFormat, headerFormat, getCurrentTime, withCurrentTimeIndicator, withCurrentTimeBubble, withHeader, radius, onDateChange, onViewChange, previousControlProps, nextControlProps, todayControlProps, viewSelectProps, slotHeight, allDaySlotHeight, scrollAreaProps, events, moreEventsProps, renderEventBody, renderEvent, labels, highlightBusinessHours, businessHours, withEventsDragAndDrop, onEventDrop, canDragEvent, eventDragInterval, onEventDragStart, onEventDragEnd, onTimeSlotClick, onAllDaySlotClick, onEventClick, withInteractiveBackgroundEvents, withDragSlotSelect, onSlotDragEnd, mode, startScrollTime, onExternalEventDrop, withEventResize, onEventResize, canResizeEvent, eventResizeInterval, recurrenceExpansionLimit, getTimeSlotProps, withAgenda, ...others } = props;
58
61
  const [agendaOpen, setAgendaOpen] = useState(false);
59
62
  const getStyles = useStyles({
60
63
  name: __staticSelector,
@@ -82,7 +85,6 @@ const DayView = factory((_props) => {
82
85
  __staticSelector,
83
86
  radius
84
87
  };
85
- const theme = useMantineTheme();
86
88
  const ctx = useDatesContext();
87
89
  const resolveNow = () => getCurrentTime ? dayjs(getCurrentTime()) : dayjs();
88
90
  const showCurrentTimeIndicator = withCurrentTimeIndicator ?? dayjs(date).isSame(resolveNow(), "day");
@@ -112,20 +114,43 @@ const DayView = factory((_props) => {
112
114
  top: slotRect.top - viewportRect.top
113
115
  });
114
116
  }, []);
117
+ const dragOffsetRef = useRef({
118
+ offset: 0,
119
+ size: 0
120
+ });
115
121
  const getSlotIndexFromDragPoint = useCallback((event) => {
116
122
  const slotIndex = slotsRef.current.findIndex((slotNode) => {
117
123
  if (!slotNode) return false;
118
124
  const rect = slotNode.getBoundingClientRect();
119
125
  return event.clientY >= rect.top && event.clientY <= rect.bottom;
120
126
  });
121
- if (slotIndex >= 0) return slotIndex;
127
+ if (slotIndex >= 0) {
128
+ const rect = slotsRef.current[slotIndex].getBoundingClientRect();
129
+ dragOffsetRef.current = {
130
+ offset: event.clientY - rect.top,
131
+ size: rect.height
132
+ };
133
+ return slotIndex;
134
+ }
122
135
  const firstSlot = slotsRef.current[0];
123
136
  const lastSlot = slotsRef.current[slotsRef.current.length - 1];
124
137
  if (!firstSlot || !lastSlot) return null;
125
138
  const firstRect = firstSlot.getBoundingClientRect();
126
139
  const lastRect = lastSlot.getBoundingClientRect();
127
- if (event.clientY < firstRect.top) return 0;
128
- if (event.clientY > lastRect.bottom) return slotsRef.current.length - 1;
140
+ if (event.clientY < firstRect.top) {
141
+ dragOffsetRef.current = {
142
+ offset: 0,
143
+ size: firstRect.height
144
+ };
145
+ return 0;
146
+ }
147
+ if (event.clientY > lastRect.bottom) {
148
+ dragOffsetRef.current = {
149
+ offset: lastRect.height,
150
+ size: lastRect.height
151
+ };
152
+ return slotsRef.current.length - 1;
153
+ }
129
154
  return null;
130
155
  }, []);
131
156
  const handleSlotKeyDown = (event, slotIndex) => {
@@ -146,13 +171,14 @@ const DayView = factory((_props) => {
146
171
  onSlotDragEnd(`${slotDate} ${slots[startIndex].startTime}`, `${slotDate} ${slots[endIndex].endTime}`);
147
172
  }
148
173
  });
174
+ const expandedEvents = expandRecurringEvents({
175
+ events,
176
+ rangeStart: dayjs(date).startOf("day").toDate(),
177
+ rangeEnd: dayjs(date).endOf("day").toDate(),
178
+ expansionLimit: recurrenceExpansionLimit
179
+ });
149
180
  const eventsData = getDayViewEvents({
150
- events: expandRecurringEvents({
151
- events,
152
- rangeStart: dayjs(date).startOf("day").toDate(),
153
- rangeEnd: dayjs(date).endOf("day").toDate(),
154
- expansionLimit: recurrenceExpansionLimit
155
- }),
181
+ events: expandedEvents,
156
182
  date,
157
183
  startTime,
158
184
  endTime,
@@ -161,12 +187,50 @@ const DayView = factory((_props) => {
161
187
  const handleExternalDrop = useCallback((e, slotIndex) => {
162
188
  if (!onExternalEventDrop) return;
163
189
  const slotDate = dayjs(date).format("YYYY-MM-DD");
164
- onExternalEventDrop(e.dataTransfer, `${slotDate} ${slots[slotIndex].startTime}`);
190
+ const slotTime = slots[slotIndex].startTime;
191
+ if (eventDragInterval == null) {
192
+ onExternalEventDrop(e.dataTransfer, `${slotDate} ${slotTime}`);
193
+ return;
194
+ }
195
+ const slotStart = `${slotDate} ${slotTime}`;
196
+ const { start } = calculateDropTime({
197
+ draggedEvent: {
198
+ start: slotStart,
199
+ end: slotStart
200
+ },
201
+ targetDate: date,
202
+ targetSlotTime: slotTime,
203
+ intervalMinutes,
204
+ dragIntervalMinutes: eventDragInterval,
205
+ slotOffset: dragOffsetRef.current.offset,
206
+ slotSize: dragOffsetRef.current.size,
207
+ startTime,
208
+ endTime
209
+ });
210
+ onExternalEventDrop(e.dataTransfer, dayjs(start).format("YYYY-MM-DD HH:mm:ss"));
165
211
  }, [
166
212
  onExternalEventDrop,
167
213
  date,
168
- slots
214
+ slots,
215
+ eventDragInterval,
216
+ intervalMinutes,
217
+ startTime,
218
+ endTime
169
219
  ]);
220
+ const getDropTimeForSlot = (slotIndex, draggedEvent) => {
221
+ const slotTime = slots[slotIndex].startTime;
222
+ return calculateDropTime({
223
+ draggedEvent,
224
+ targetDate: date,
225
+ targetSlotTime: slotTime,
226
+ intervalMinutes,
227
+ dragIntervalMinutes: eventDragInterval,
228
+ slotOffset: eventDragInterval == null ? void 0 : dragOffsetRef.current.offset,
229
+ slotSize: eventDragInterval == null ? void 0 : dragOffsetRef.current.size,
230
+ startTime,
231
+ endTime
232
+ });
233
+ };
170
234
  const dragDrop = useDragDropHandlers({
171
235
  enabled: withEventsDragAndDrop,
172
236
  mode,
@@ -174,23 +238,27 @@ const DayView = factory((_props) => {
174
238
  canDragEvent,
175
239
  onEventDragStart,
176
240
  onEventDragEnd,
177
- calculateDropTarget: (slotIndex, draggedEvent) => {
178
- const slotTime = slots[slotIndex].startTime;
179
- return calculateDropTime({
180
- draggedEvent,
181
- targetDate: date,
182
- targetSlotTime: slotTime,
183
- intervalMinutes
184
- });
185
- },
241
+ calculateDropTarget: getDropTimeForSlot,
186
242
  onExternalDrop: onExternalEventDrop ? handleExternalDrop : void 0
187
243
  });
244
+ const updateDragPreview = (slotIndex) => {
245
+ const draggedEvent = dragDrop.dragContextValue.draggedEvent;
246
+ if (eventDragInterval == null || !draggedEvent) return;
247
+ const { start, end } = getDropTimeForSlot(slotIndex, draggedEvent);
248
+ const newStart = dayjs(start).format("YYYY-MM-DD HH:mm:ss");
249
+ if (dragDrop.dragPreview?.start !== newStart) dragDrop.setDragPreview({
250
+ start: newStart,
251
+ end: dayjs(end).format("YYYY-MM-DD HH:mm:ss"),
252
+ target: slotIndex
253
+ });
254
+ };
188
255
  const eventResize = useEventResize({
189
256
  enabled: withEventResize,
190
257
  mode,
191
258
  startTime,
192
259
  endTime,
193
260
  intervalMinutes,
261
+ resizeIntervalMinutes: eventResizeInterval,
194
262
  onEventResize,
195
263
  canResizeEvent
196
264
  });
@@ -255,8 +323,9 @@ const DayView = factory((_props) => {
255
323
  ...stylesApiProps
256
324
  }, event.id));
257
325
  const dayGroup = dayjs(date).format("YYYY-MM-DD");
326
+ const suppressDropHighlight = eventDragInterval != null && dragDrop.dragContextValue.isDragging;
258
327
  const items = slots.map((slot, index) => {
259
- const isDropTarget = dragDrop.isDropTarget(index);
328
+ const isDropTarget = !suppressDropHighlight && dragDrop.isDropTarget(index);
260
329
  const isDragSelected = slotDragSelect.isSlotSelected(index, dayGroup);
261
330
  const slotStart = `${dayGroup} ${slot.startTime}`;
262
331
  const slotEnd = `${dayGroup} ${slot.endTime}`;
@@ -322,59 +391,34 @@ const DayView = factory((_props) => {
322
391
  }
323
392
  return acc;
324
393
  }, []);
325
- const backgroundAllDayEventNodes = eventsData.backgroundAllDayEvents.map((event) => {
326
- const colors = theme.variantColorResolver({
327
- color: event.color || theme.primaryColor,
328
- theme,
329
- variant: "light",
330
- autoContrast: true
331
- });
332
- const bgEventBody = typeof renderEventBody === "function" ? renderEventBody(event) : event.title;
333
- const bgEventProps = {
334
- key: `bg-allday-${event.id}`,
335
- ...getStyles("dayViewBackgroundEvent", { style: {
336
- top: 0,
337
- height: "100%",
338
- width: "100%"
339
- } }),
340
- __vars: {
341
- "--bg-event-bg": colors.background,
342
- "--bg-event-color": colors.color
343
- },
344
- children: bgEventBody
345
- };
346
- if (typeof renderEvent === "function") return renderEvent(event, bgEventProps);
347
- const { key: bgEventKey, ...restBgEventProps } = bgEventProps;
348
- return /* @__PURE__ */ jsx(Box, { ...restBgEventProps }, bgEventKey);
349
- });
350
- const backgroundTimedEventNodes = eventsData.backgroundTimedEvents.map((event) => {
351
- const colors = theme.variantColorResolver({
352
- color: event.color || theme.primaryColor,
353
- theme,
354
- variant: "light",
355
- autoContrast: true
356
- });
357
- const bgEventBody = typeof renderEventBody === "function" ? renderEventBody(event) : event.title;
358
- const bgEventProps = {
359
- key: event.id,
360
- ...getStyles("dayViewBackgroundEvent", { style: {
361
- ...getTimeAxisEventStyle({
362
- start: event.position.top,
363
- span: event.position.height,
364
- axis: "vertical"
365
- }),
366
- width: "100%"
367
- } }),
368
- __vars: {
369
- "--bg-event-bg": colors.background,
370
- "--bg-event-color": colors.color
371
- },
372
- children: bgEventBody
373
- };
374
- if (typeof renderEvent === "function") return renderEvent(event, bgEventProps);
375
- const { key: bgEventKey, ...restBgEventProps } = bgEventProps;
376
- return /* @__PURE__ */ jsx(Box, { ...restBgEventProps }, bgEventKey);
377
- });
394
+ const interactiveBackgroundEvents = withInteractiveBackgroundEvents && mode !== "static";
395
+ const backgroundAllDayEventNodes = eventsData.backgroundAllDayEvents.map((event) => /* @__PURE__ */ jsx(ScheduleBackgroundEvent, {
396
+ event,
397
+ renderEvent,
398
+ renderEventBody,
399
+ interactive: interactiveBackgroundEvents,
400
+ onEventClick,
401
+ ...getStyles("dayViewBackgroundEvent", { style: {
402
+ top: 0,
403
+ height: "100%",
404
+ width: "100%"
405
+ } })
406
+ }, `bg-allday-${event.id}`));
407
+ const backgroundTimedEventNodes = eventsData.backgroundTimedEvents.map((event) => /* @__PURE__ */ jsx(ScheduleBackgroundEvent, {
408
+ event,
409
+ renderEvent,
410
+ renderEventBody,
411
+ interactive: interactiveBackgroundEvents,
412
+ onEventClick,
413
+ ...getStyles("dayViewBackgroundEvent", { style: {
414
+ ...getTimeAxisEventStyle({
415
+ start: event.position.top,
416
+ span: event.position.height,
417
+ axis: "vertical"
418
+ }),
419
+ width: "100%"
420
+ } })
421
+ }, event.id));
378
422
  const content = /* @__PURE__ */ jsxs(Box, {
379
423
  ...getStyles("dayView"),
380
424
  mod: {
@@ -476,7 +520,10 @@ const DayView = factory((_props) => {
476
520
  ...getStyles("dayViewTimeSlots"),
477
521
  onDragOver: withDragHandlers ? (event) => {
478
522
  const slotIndex = getSlotIndexFromDragPoint(event);
479
- if (slotIndex !== null) dragDrop.handleDragOver(event, slotIndex);
523
+ if (slotIndex !== null) {
524
+ dragDrop.handleDragOver(event, slotIndex);
525
+ updateDragPreview(slotIndex);
526
+ }
480
527
  } : void 0,
481
528
  onDragLeave: withDragHandlers ? dragDrop.handleDragLeave : void 0,
482
529
  onDrop: withDragHandlers ? (event) => {
@@ -486,6 +533,25 @@ const DayView = factory((_props) => {
486
533
  children: [
487
534
  backgroundTimedEventNodes,
488
535
  eventsNodes,
536
+ dragDrop.dragPreview && dragDrop.dragContextValue.draggedEvent && /* @__PURE__ */ jsx(Box, { ...getStyles("dayViewDragPreview", { style: (() => {
537
+ const { top, height } = getDayPosition({
538
+ event: {
539
+ ...dragDrop.dragContextValue.draggedEvent,
540
+ start: dragDrop.dragPreview.start,
541
+ end: dragDrop.dragPreview.end
542
+ },
543
+ startTime,
544
+ endTime,
545
+ intervalMinutes
546
+ });
547
+ return {
548
+ position: "absolute",
549
+ insetInlineStart: 0,
550
+ insetInlineEnd: 0,
551
+ top: `${top}%`,
552
+ height: `${height}%`
553
+ };
554
+ })() }) }),
489
555
  showCurrentTimeIndicator && /* @__PURE__ */ jsx(CurrentTimeIndicator, {
490
556
  startOffset: "calc(var(--day-view-slot-labels-width) * -1)",
491
557
  endOffset: "0rem",