@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":"WeekView.mjs","names":["classes"],"sources":["../../../src/components/WeekView/WeekView.tsx"],"sourcesContent":["import dayjs from 'dayjs';\nimport { useCallback, useMemo, useRef, useState } from 'react';\nimport {\n Box,\n BoxProps,\n createVarsResolver,\n DataAttributes,\n ElementProps,\n factory,\n Factory,\n getRadius,\n MantineRadius,\n rem,\n ScrollArea,\n ScrollAreaAutosizeProps,\n StylesApiProps,\n UnstyledButton,\n useMantineTheme,\n useProps,\n useResolvedStylesApi,\n useStyles,\n} from '@mantine/core';\nimport { useDatesContext } from '@mantine/dates';\nimport { useIsomorphicEffect, useMergedRef } from '@mantine/hooks';\nimport { useAutoScrollOnDrag } from '../../hooks/use-auto-scroll-on-drag';\nimport { useDragDropHandlers } from '../../hooks/use-drag-drop-handlers';\nimport { useEventResize } from '../../hooks/use-event-resize';\nimport { useSlotDragSelect } from '../../hooks/use-slot-drag-select';\nimport { getLabel, ScheduleLabelsOverride } from '../../labels';\nimport {\n AnyDateValue,\n DateLabelFormat,\n DateStringValue,\n DateTimeStringValue,\n DayOfWeek,\n ScheduleEventData,\n ScheduleMode,\n ScheduleViewLevel,\n} from '../../types';\nimport {\n BusinessHoursValue,\n calculateDropTime,\n expandRecurringEvents,\n formatDate,\n getBusinessHoursMod,\n getDayTimeIntervals,\n getTimeAxisEventStyle,\n getWeekDays,\n getWeekNumber,\n isAllDayEvent,\n nextWeek,\n previousWeek,\n toDateString,\n} from '../../utils';\nimport { AgendaView, AgendaViewStylesNames } from '../AgendaView/AgendaView';\nimport {\n CurrentTimeIndicator,\n CurrentTimeIndicatorStylesNames,\n} from '../CurrentTimeIndicator/CurrentTimeIndicator';\nimport { DragContext, DragContextValue } from '../DragContext/DragContext';\nimport { RenderEvent, RenderEventBody, ScheduleEvent } from '../ScheduleEvent/ScheduleEvent';\nimport { CombinedScheduleHeaderStylesNames } from '../ScheduleHeader/ScheduleHeader';\nimport { ScheduleHeaderBase } from '../ScheduleHeader/ScheduleHeaderBase';\nimport { ViewSelectProps } from '../ScheduleHeader/ViewSelect/ViewSelect';\nimport { getWeekLabel } from './get-week-label/get-week-label';\nimport { getWeekViewEvents } from './get-week-view-events/get-week-view-events';\nimport { handleWeekViewKeyDown, WeekViewControlsRef } from './handle-week-view-key-down';\nimport { WeekViewDay } from './WeekViewDay';\nimport classes from './WeekView.module.css';\n\nexport type WeekViewStylesNames =\n | 'weekView'\n | 'weekViewRoot'\n | 'weekViewHeader'\n | 'weekViewInner'\n | 'weekViewAllDaySlotsEvents'\n | 'weekViewAllDaySlots'\n | 'weekViewAllDaySlotsList'\n | 'weekViewAllDaySlot'\n | 'weekViewAllDaySlotsLabel'\n | 'weekViewScrollArea'\n | 'weekViewCorner'\n | 'weekViewSlotLabels'\n | 'weekViewSlotLabel'\n | 'weekViewDayLabel'\n | 'weekViewDayWeekday'\n | 'weekViewDay'\n | 'weekViewDayNumber'\n | 'weekViewDaySlot'\n | 'weekViewDaySlots'\n | 'weekViewWeekLabel'\n | 'weekViewWeekNumber'\n | 'weekViewBackgroundEvent'\n | CurrentTimeIndicatorStylesNames\n | CombinedScheduleHeaderStylesNames\n | AgendaViewStylesNames;\n\nexport type WeekViewCssVariables = {\n weekView: '--week-view-radius' | '--week-view-slot-height' | '--week-view-all-day-slots-height';\n};\n\nexport interface WeekViewProps\n extends BoxProps, StylesApiProps<WeekViewFactory>, ElementProps<'div'> {\n __staticSelector?: string;\n\n /** Week to display, Date object or date string in `YYYY-MM-DD` format */\n date: Date | string;\n\n /** Called with the new date value when a date is selected */\n onDateChange?: (value: DateStringValue) => void;\n\n /** Start time for the day view, in `HH:mm:ss` format @default 00:00:00 */\n startTime?: string;\n\n /** End time for the day view, in `HH:mm:ss` format @default 23:59:59 */\n endTime?: string;\n\n /** Number of minutes for each interval in the day view. Must divide evenly into an hour (e.g. `15`, `30`) or be a whole number of hours (e.g. `120`, `240`) @default 60 */\n intervalMinutes?: number;\n\n /** If set, grid lines are displayed for intervals smaller than one hour, for example 15 and 30 minutes intervals @default true */\n withSubHourGridLines?: boolean;\n\n /** Dayjs format for slot labels or a callback function that returns formatted value @default HH:mm */\n slotLabelFormat?: DateLabelFormat;\n\n /** Number 0-6, where 0 – Sunday and 6 – Saturday. @default 1 – Monday */\n firstDayOfWeek?: DayOfWeek;\n\n /** `dayjs` format for weekdays names. @default 'ddd' */\n weekdayFormat?: DateLabelFormat;\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 /** If set to true, highlights today in the weekday row @default false */\n highlightToday?: boolean;\n\n /** Key of `theme.radius` or any valid CSS value to set `border-radius` @default theme.defaultRadius */\n radius?: MantineRadius;\n\n /** Props passed down to the `ScrollArea.Autosize` component */\n scrollAreaProps?: ScrollAreaAutosizeProps & DataAttributes;\n\n /** Locale passed down to dayjs, overrides value defined on `DatesProvider` */\n locale?: string;\n\n /** If set, the week number is displayed at the top left corner @default true */\n withWeekNumber?: boolean;\n\n /** If set, displays a line indicating the current time @default true */\n withCurrentTimeIndicator?: boolean;\n\n /** If set, the time indicator displays the current time in the bubble @default true */\n withCurrentTimeBubble?: boolean;\n\n /** If set, displays the current time indicator on the same day of week even when viewing a different week @default false */\n forceCurrentTimeIndicator?: boolean;\n\n /** A function to get the current time, called on every tick. Can be used to display the current time indicator in a different timezone. @default () => dayjs() */\n getCurrentTime?: () => AnyDateValue;\n\n /** If set, displays all-day slots at the top of the view @default true */\n withAllDaySlots?: boolean;\n\n /** If set, the header is displayed @default true */\n withHeader?: boolean;\n\n /** Called when view level select button is clicked */\n onViewChange?: (view: ScheduleViewLevel) => void;\n\n /** Props passed to previous month control */\n previousControlProps?: React.ComponentProps<'button'> & DataAttributes;\n\n /** Props passed to next month control */\n nextControlProps?: React.ComponentProps<'button'> & DataAttributes;\n\n /** Props passed to today control */\n todayControlProps?: React.ComponentProps<'button'> & DataAttributes;\n\n /** Props passed to view level select */\n viewSelectProps?: Partial<ViewSelectProps> & DataAttributes;\n\n /** Format for week label @default 'MMM DD' */\n weekLabelFormat?: DateLabelFormat;\n\n /** List of events to display in the week view */\n events?: ScheduleEventData[];\n\n /** Height of 1hr slot @default 64px */\n slotHeight?: React.CSSProperties['height'];\n\n /** Height of all-day slot @default 48px */\n allDaySlotHeight?: React.CSSProperties['height'];\n\n /** Labels override */\n labels?: ScheduleLabelsOverride;\n\n /** If set to true, highlights business hours with white background @default false */\n highlightBusinessHours?: boolean;\n\n /** Business hours range in `HH:mm:ss` format shared across all days, or a per-day record keyed by day of the week (`0` – Sunday, `6` – Saturday) for day-specific ranges. Set a day to `null` to mark it as fully outside business hours. @default ['09:00:00', '17:00:00'] */\n businessHours?: BusinessHoursValue;\n\n /** Function to customize event body, `event` object is passed as first argument */\n renderEventBody?: RenderEventBody;\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 /** If true, events can be dragged and dropped @default false */\n withEventsDragAndDrop?: boolean;\n\n /** Called when event is dropped at new time */\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 /** Called when time slot is clicked */\n onTimeSlotClick?: (data: {\n slotStart: DateTimeStringValue;\n slotEnd: DateTimeStringValue;\n nativeEvent: React.MouseEvent<HTMLButtonElement>;\n }) => void;\n\n /** Called when all-day slot is clicked */\n onAllDaySlotClick?: (day: DateStringValue, event: React.MouseEvent<HTMLButtonElement>) => void;\n\n /** Called when event is clicked */\n onEventClick?: (event: ScheduleEventData, e: React.MouseEvent<HTMLButtonElement>) => void;\n\n /** If set, enables drag-to-select time slot ranges @default false */\n withDragSlotSelect?: boolean;\n\n /** Called when a time slot range is selected by dragging */\n onSlotDragEnd?: (rangeStart: DateTimeStringValue, rangeEnd: DateTimeStringValue) => void;\n\n /** Interaction mode: 'default' allows all interactions, 'static' disables event interactions @default default */\n mode?: ScheduleMode;\n\n /** Time to scroll to on initial render, in `HH:mm:ss` format */\n startScrollTime?: string;\n\n /** Function to customize week label in the header */\n renderWeekLabel?: (params: {\n weekStart: DateStringValue;\n weekEnd: DateStringValue;\n }) => React.ReactNode;\n\n /** Called when an external item is dropped onto the schedule. Receives the `DataTransfer` object and the drop target datetime. */\n onExternalEventDrop?: (dataTransfer: DataTransfer, dropDateTime: DateTimeStringValue) => void;\n\n /** If true, events can be resized by dragging their edges @default false */\n withEventResize?: boolean;\n\n /** Called when event is resized */\n onEventResize?: (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 resized */\n canResizeEvent?: (event: ScheduleEventData) => boolean;\n\n /** Max number of generated recurring instances per recurring series @default 2000 */\n recurrenceExpansionLimit?: number;\n\n /** Function to get additional props for each time slot. Receives slot start and end datetime strings. Returned props are spread onto the slot element. Event handlers returned by this function are composed with internal handlers (e.g. onClick) rather than overriding them. */\n getTimeSlotProps?: (data: {\n start: DateTimeStringValue;\n end: DateTimeStringValue;\n }) => Record<string, any> | undefined;\n\n /** If set, displays an Agenda button in the header that opens an agenda list view @default false */\n withAgenda?: boolean;\n}\n\nexport type WeekViewFactory = Factory<{\n props: WeekViewProps;\n ref: HTMLDivElement;\n stylesNames: WeekViewStylesNames;\n vars: WeekViewCssVariables;\n}>;\n\nconst defaultProps = {\n __staticSelector: 'WeekView',\n withWeekendDays: true,\n withCurrentTimeIndicator: true,\n startTime: '00:00:00',\n endTime: '23:59:59',\n slotLabelFormat: 'HH:mm',\n intervalMinutes: 60,\n withSubHourGridLines: true,\n weekdayFormat: 'ddd',\n withWeekNumber: true,\n withCurrentTimeBubble: true,\n withAllDaySlots: true,\n withHeader: true,\n weekLabelFormat: 'MMM DD',\n highlightBusinessHours: false,\n businessHours: ['09:00:00', '17:00:00'],\n withEventsDragAndDrop: false,\n withDragSlotSelect: false,\n withEventResize: false,\n mode: 'default',\n} satisfies Partial<WeekViewProps>;\n\nconst varsResolver = createVarsResolver<WeekViewFactory>(\n (_theme, { radius, allDaySlotHeight, slotHeight }) => ({\n weekView: {\n '--week-view-radius': radius !== undefined ? getRadius(radius) : undefined,\n '--week-view-all-day-slots-height': rem(allDaySlotHeight),\n '--week-view-slot-height': rem(slotHeight),\n },\n })\n);\n\nexport const WeekView = factory<WeekViewFactory>((_props) => {\n const props = useProps('WeekView', defaultProps, _props);\n const {\n classNames,\n className,\n style,\n styles,\n unstyled,\n attributes,\n vars,\n startTime,\n endTime,\n date,\n onDateChange,\n intervalMinutes,\n withSubHourGridLines,\n slotLabelFormat,\n withWeekendDays,\n weekendDays,\n firstDayOfWeek,\n weekdayFormat,\n radius,\n highlightToday,\n withCurrentTimeIndicator,\n forceCurrentTimeIndicator,\n getCurrentTime,\n scrollAreaProps,\n locale,\n withWeekNumber,\n withCurrentTimeBubble,\n withAllDaySlots,\n __staticSelector,\n withHeader,\n onViewChange,\n previousControlProps,\n nextControlProps,\n todayControlProps,\n viewSelectProps,\n weekLabelFormat,\n events,\n allDaySlotHeight,\n slotHeight,\n labels,\n highlightBusinessHours,\n businessHours,\n renderEventBody,\n renderEvent,\n withEventsDragAndDrop,\n onEventDrop,\n canDragEvent,\n onEventDragStart,\n onEventDragEnd,\n onTimeSlotClick,\n onAllDaySlotClick,\n onEventClick,\n withDragSlotSelect,\n onSlotDragEnd,\n mode,\n startScrollTime,\n renderWeekLabel,\n onExternalEventDrop,\n withEventResize,\n onEventResize,\n canResizeEvent,\n recurrenceExpansionLimit,\n getTimeSlotProps,\n withAgenda,\n ...others\n } = props;\n\n const [agendaOpen, setAgendaOpen] = useState(false);\n\n const getStyles = useStyles<WeekViewFactory>({\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: 'weekView',\n });\n\n const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<WeekViewFactory>({\n classNames,\n styles,\n props,\n });\n\n const stylesApiProps = {\n classNames: resolvedClassNames,\n styles: resolvedStyles,\n attributes,\n __staticSelector,\n radius,\n };\n\n const theme = useMantineTheme();\n const [scrolled, setScrolled] = useState(false);\n const ctx = useDatesContext();\n const slots = getDayTimeIntervals({ startTime, endTime, intervalMinutes });\n const viewportRef = useRef<HTMLDivElement>(null);\n\n useAutoScrollOnDrag({\n viewportRef,\n enabled: (withEventsDragAndDrop || !!onExternalEventDrop) && mode !== 'static',\n });\n\n type DropTargetSlot = { day: string; slotIndex: number };\n\n const handleExternalDrop = useCallback(\n (e: React.DragEvent, target: DropTargetSlot) => {\n if (!onExternalEventDrop) {\n return;\n }\n const slotDate = dayjs(target.day).format('YYYY-MM-DD');\n onExternalEventDrop(e.dataTransfer, `${slotDate} ${slots[target.slotIndex].startTime}`);\n },\n [onExternalEventDrop, slots]\n );\n\n const handleExternalAllDayDrop = useCallback(\n (e: React.DragEvent, day: string) => {\n if (!onExternalEventDrop) {\n return;\n }\n onExternalEventDrop(e.dataTransfer, `${dayjs(day).format('YYYY-MM-DD')} 00:00:00`);\n },\n [onExternalEventDrop]\n );\n\n const dragDrop = useDragDropHandlers<DropTargetSlot>({\n enabled: withEventsDragAndDrop,\n mode,\n onEventDrop,\n canDragEvent,\n onEventDragStart,\n onEventDragEnd,\n calculateDropTarget: (target: DropTargetSlot, draggedEvent: ScheduleEventData) => {\n const slotTime = slots[target.slotIndex].startTime;\n return calculateDropTime({\n draggedEvent,\n targetDate: target.day,\n targetSlotTime: slotTime,\n intervalMinutes,\n });\n },\n onExternalDrop: onExternalEventDrop ? handleExternalDrop : undefined,\n });\n\n const allDayDragDrop = useDragDropHandlers<string>({\n enabled: withEventsDragAndDrop,\n mode,\n onEventDrop,\n canDragEvent,\n onEventDragStart,\n onEventDragEnd,\n calculateDropTarget: (targetDay: string, draggedEvent: ScheduleEventData) => {\n const eventDuration = dayjs(draggedEvent.end).diff(dayjs(draggedEvent.start), 'millisecond');\n const newStart = dayjs(targetDay).startOf('day');\n return { start: newStart.toDate(), end: newStart.add(eventDuration, 'millisecond').toDate() };\n },\n onExternalDrop: onExternalEventDrop ? handleExternalAllDayDrop : undefined,\n });\n\n const slotDragSelect = useSlotDragSelect({\n enabled: withDragSlotSelect && mode !== 'static',\n onDragEnd: (startIndex, endIndex, group) => {\n if (!onSlotDragEnd) {\n return;\n }\n const slotDate = dayjs(group).format('YYYY-MM-DD');\n onSlotDragEnd(\n `${slotDate} ${slots[startIndex].startTime}`,\n `${slotDate} ${slots[endIndex].endTime}`\n );\n },\n });\n\n const eventResize = useEventResize({\n enabled: withEventResize,\n mode,\n startTime,\n endTime,\n intervalMinutes,\n onEventResize,\n canResizeEvent,\n });\n\n const withDragHandlers = (withEventsDragAndDrop || !!onExternalEventDrop) && mode !== 'static';\n\n const handleTimeSlotClick = (\n day: string,\n slotTime: string,\n e: React.MouseEvent<HTMLButtonElement>\n ) => {\n if (!onTimeSlotClick) {\n return;\n }\n\n const slotDate = dayjs(day).format('YYYY-MM-DD');\n const slotIndex = slots.findIndex((s) => s.startTime === slotTime);\n if (slotIndex === -1) {\n return;\n }\n\n const slot = slots[slotIndex];\n onTimeSlotClick({\n slotStart: `${slotDate} ${slot.startTime}`,\n slotEnd: `${slotDate} ${slot.endTime}`,\n nativeEvent: e,\n });\n };\n\n const weekdays = getWeekDays({\n week: date,\n withWeekendDays,\n weekendDays: ctx.getWeekendDays(weekendDays),\n firstDayOfWeek: ctx.getFirstDayOfWeek(firstDayOfWeek),\n });\n\n const expandedEvents = expandRecurringEvents({\n events,\n rangeStart: dayjs(weekdays[0]).startOf('day').toDate(),\n rangeEnd: dayjs(weekdays[weekdays.length - 1])\n .endOf('day')\n .toDate(),\n expansionLimit: recurrenceExpansionLimit,\n });\n\n const weekEvents = getWeekViewEvents({\n date,\n events: expandedEvents,\n startTime,\n endTime,\n intervalMinutes,\n firstDayOfWeek: ctx.getFirstDayOfWeek(firstDayOfWeek),\n weekendDays: ctx.getWeekendDays(weekendDays),\n withWeekendDays,\n });\n\n const timeValues = slots.reduce<React.ReactNode[]>((acc, interval) => {\n if (!interval.isHourStart) {\n return acc;\n }\n\n const intervalTime = dayjs(`${dayjs(date).format('YYYY-MM-DD')} ${interval.startTime}`);\n const label = formatDate({\n date: intervalTime,\n locale: ctx.getLocale(locale),\n format: slotLabelFormat,\n });\n\n acc.push(\n <Box\n {...getStyles('weekViewSlotLabel')}\n key={interval.startTime}\n mod={{\n 'hour-start': interval.isHourStart,\n ...getBusinessHoursMod({\n time: interval.startTime,\n businessHours,\n highlightBusinessHours,\n }),\n }}\n >\n {label}\n </Box>\n );\n\n return acc;\n }, []);\n\n const slotsRef: WeekViewControlsRef = useRef<HTMLButtonElement[][]>([]);\n const allDaySlotsRef = useRef<HTMLButtonElement[]>([]);\n const weekdaysRef = useRef<HTMLButtonElement[]>([]);\n const daySlotsContainersRef = useRef<(HTMLDivElement | null)[]>([]);\n const mergedViewportRef = useMergedRef(viewportRef, scrollAreaProps?.viewportRef);\n\n const firstSlotIndex = { dayIndex: 0, slotIndex: 0 };\n\n useIsomorphicEffect(() => {\n if (!startScrollTime || !viewportRef.current) {\n return;\n }\n\n const firstDaySlots = slotsRef.current[0];\n if (!firstDaySlots || firstDaySlots.length === 0) {\n return;\n }\n\n const targetIndex = slots.findIndex((s) => s.startTime >= startScrollTime);\n if (targetIndex < 0) {\n return;\n }\n\n const targetSlot = firstDaySlots[targetIndex];\n if (!targetSlot) {\n return;\n }\n\n const slotRect = targetSlot.getBoundingClientRect();\n const viewportRect = viewportRef.current.getBoundingClientRect();\n viewportRef.current.scrollTo({ left: 0, top: slotRect.top - viewportRect.top });\n }, []);\n\n const getSlotIndexFromDragPoint = useCallback((event: React.DragEvent, dayIndex: number) => {\n const daySlots = slotsRef.current[dayIndex] ?? [];\n const slotIndex = daySlots.findIndex((slotNode) => {\n if (!slotNode) {\n return false;\n }\n\n const rect = slotNode.getBoundingClientRect();\n return event.clientY >= rect.top && event.clientY <= rect.bottom;\n });\n\n if (slotIndex >= 0) {\n return slotIndex;\n }\n\n const firstSlot = daySlots[0];\n const lastSlot = daySlots[daySlots.length - 1];\n\n if (!firstSlot || !lastSlot) {\n return null;\n }\n\n const firstRect = firstSlot.getBoundingClientRect();\n const lastRect = lastSlot.getBoundingClientRect();\n\n if (event.clientY < firstRect.top) {\n return 0;\n }\n\n if (event.clientY > lastRect.bottom) {\n return daySlots.length - 1;\n }\n\n return null;\n }, []);\n\n const handleSlotKeyDown = (\n event: React.KeyboardEvent<HTMLButtonElement>,\n dayIndex: number,\n slotIndex: number\n ) => {\n handleWeekViewKeyDown({\n controlsRef: slotsRef,\n dayIndex,\n slotIndex,\n event,\n });\n };\n\n const handleAllDaySlotKeyDown = (\n event: React.KeyboardEvent<HTMLButtonElement>,\n dayIndex: number\n ) => {\n const direction = event.key;\n if (direction === 'ArrowRight' && dayIndex < weekdays.length - 1) {\n event.preventDefault();\n allDaySlotsRef.current[dayIndex + 1]?.focus();\n } else if (direction === 'ArrowLeft' && dayIndex > 0) {\n event.preventDefault();\n allDaySlotsRef.current[dayIndex - 1]?.focus();\n } else if (direction === 'ArrowDown') {\n event.preventDefault();\n slotsRef.current?.[dayIndex]?.[0]?.focus();\n }\n };\n\n const handleWeekdayKeyDown = (\n event: React.KeyboardEvent<HTMLButtonElement>,\n dayIndex: number\n ) => {\n const direction = event.key;\n if (direction === 'ArrowRight' && dayIndex < weekdays.length - 1) {\n event.preventDefault();\n weekdaysRef.current[dayIndex + 1]?.focus();\n } else if (direction === 'ArrowLeft' && dayIndex > 0) {\n event.preventDefault();\n weekdaysRef.current[dayIndex - 1]?.focus();\n }\n };\n\n const resolveNow = () => (getCurrentTime ? dayjs(getCurrentTime()) : dayjs());\n const now = resolveNow();\n\n const currentWeekdayIndex = withCurrentTimeIndicator\n ? forceCurrentTimeIndicator\n ? weekdays.findIndex((day) => dayjs(day).day() === now.day())\n : weekdays.findIndex((day) => dayjs(day).isSame(now, 'date'))\n : -1;\n\n const weekdaysLabels = weekdays.map((day, dayIndex) => (\n <UnstyledButton\n {...getStyles('weekViewDayLabel')}\n key={day}\n ref={(node) => {\n weekdaysRef.current[dayIndex] = node!;\n }}\n aria-label={`${getLabel('weekday', labels)} ${dayjs(day).format('YYYY-MM-DD')}`}\n mod={{\n today: dayjs(day).isSame(now, 'day') && !!highlightToday,\n weekend: ctx.getWeekendDays(weekendDays).includes(dayjs(day).day() as DayOfWeek),\n static: mode === 'static',\n }}\n tabIndex={mode === 'static' ? -1 : dayIndex === 0 ? 0 : -1}\n onKeyDown={mode === 'static' ? undefined : (event) => handleWeekdayKeyDown(event, dayIndex)}\n onClick={\n mode === 'static'\n ? undefined\n : () => {\n onViewChange?.('day');\n onDateChange?.(toDateString(day));\n }\n }\n >\n <Box {...getStyles('weekViewDayWeekday')} key=\"weekday\">\n {formatDate({ locale: ctx.getLocale(locale), date: day, format: weekdayFormat })}\n </Box>\n <div {...getStyles('weekViewDayNumber')} key=\"date\">\n {dayjs(day).date()}\n </div>\n </UnstyledButton>\n ));\n\n const days = weekdays.map((day, dayIndex) => {\n const allBgEvents = weekEvents.backgroundEvents[day] || [];\n\n const backgroundEventNodes = allBgEvents\n .filter((event) => !event.position.allDay)\n .map((event) => {\n const colors = theme.variantColorResolver({\n color: event.color || theme.primaryColor,\n theme,\n variant: 'light',\n autoContrast: true,\n });\n\n const bgEventBody =\n typeof renderEventBody === 'function' ? renderEventBody(event) : event.title;\n\n const bgEventProps = {\n key: `bg-${event.id}`,\n ...getStyles('weekViewBackgroundEvent', {\n style: {\n top: `${event.position.top}%`,\n height: `${event.position.height}%`,\n width: '100%',\n },\n }),\n __vars: {\n '--bg-event-bg': colors.background,\n '--bg-event-color': colors.color,\n },\n children: bgEventBody,\n };\n\n if (typeof renderEvent === 'function') {\n return renderEvent(event, bgEventProps as any);\n }\n\n const { key: bgEventKey, ...restBgEventProps } = bgEventProps;\n return <Box key={bgEventKey} {...restBgEventProps} />;\n });\n\n const dayEvents = (weekEvents.regularEvents[day] || []).map((event) => {\n const eventIsAllDay = isAllDayEvent({ event, date: day });\n const isDraggable = !eventIsAllDay && dragDrop.isDraggableEvent(event);\n const isResizable = !eventIsAllDay && eventResize.isResizableEvent(event);\n const resizePosition = eventResize.getResizePosition(event.id);\n const eventTop = resizePosition ? resizePosition.top : event.position.top;\n const eventHeight = resizePosition ? resizePosition.height : event.position.height;\n\n return (\n <ScheduleEvent\n key={event.id}\n event={event}\n autoSize\n hanging={event.position.hanging}\n draggable={isDraggable}\n withResize={isResizable}\n isResizing={resizePosition !== null}\n onResizeStart={\n isResizable\n ? (edge, e) => {\n const container = daySlotsContainersRef.current[dayIndex];\n if (container) {\n eventResize.handleResizeStart({\n event,\n edge,\n container,\n originalTop: event.position.top,\n originalHeight: event.position.height,\n eventDate: dayjs(day).format('YYYY-MM-DD'),\n pointerEvent: e,\n });\n }\n }\n : undefined\n }\n renderEventBody={renderEventBody}\n renderEvent={renderEvent}\n radius={radius}\n mode={mode}\n onClick={\n onEventClick\n ? (e) => {\n if (!eventResize.wasResizing()) {\n onEventClick(event, e);\n }\n }\n : undefined\n }\n style={{\n position: 'absolute',\n ...getTimeAxisEventStyle({\n start: eventTop,\n span: eventHeight,\n axis: 'vertical',\n }),\n left: `${event.position.offset}%`,\n width: `${event.position.width}%`,\n }}\n />\n );\n });\n\n return (\n <WeekViewDay\n key={day}\n day={day}\n dayIndex={dayIndex}\n slots={slots}\n intervalMinutes={intervalMinutes}\n getStyles={getStyles}\n weekendDays={weekendDays}\n highlightBusinessHours={highlightBusinessHours}\n businessHours={businessHours}\n labels={labels}\n withEventsDragAndDrop={withDragHandlers}\n mode={mode}\n slotsRef={slotsRef}\n firstSlotIndex={firstSlotIndex}\n onSlotKeyDown={handleSlotKeyDown}\n onSlotClick={handleTimeSlotClick}\n onFirstSlotArrowUp={\n withAllDaySlots\n ? (dayIdx) => {\n allDaySlotsRef.current[dayIdx]?.focus();\n }\n : undefined\n }\n onDaySlotsDragOver={(event, dayStr, dayIdx) => {\n const slotIndex = getSlotIndexFromDragPoint(event, dayIdx);\n if (slotIndex !== null) {\n dragDrop.handleDragOver(event, { day: dayStr, slotIndex });\n }\n }}\n onDaySlotsDragLeave={dragDrop.handleDragLeave}\n onDaySlotsDrop={(event, dayStr, dayIdx) => {\n const slotIndex = getSlotIndexFromDragPoint(event, dayIdx);\n if (slotIndex !== null) {\n dragDrop.handleDrop(event, { day: dayStr, slotIndex });\n }\n }}\n dropTargetSlotIndex={\n dragDrop.dropTarget?.day === day ? dragDrop.dropTarget.slotIndex : undefined\n }\n withDragSlotSelect={withDragSlotSelect}\n onSlotPointerDown={slotDragSelect.handleSlotPointerDown}\n isSlotDragSelected={slotDragSelect.isSlotSelected}\n daySlotsContainerRef={(node) => {\n daySlotsContainersRef.current[dayIndex] = node;\n }}\n getTimeSlotProps={getTimeSlotProps}\n >\n {backgroundEventNodes}\n {dayEvents}\n </WeekViewDay>\n );\n });\n\n const allDaySlots = weekdays.map((day, dayIndex) => (\n <UnstyledButton\n aria-label={`${getLabel('allDay', labels)} ${dayjs(day).format('YYYY-MM-DD')}`}\n key={day}\n ref={(node) => {\n allDaySlotsRef.current[dayIndex] = node!;\n }}\n tabIndex={dayIndex === 0 ? 0 : -1}\n onKeyDown={(event) => handleAllDaySlotKeyDown(event, dayIndex)}\n onClick={\n mode === 'static' || !onAllDaySlotClick\n ? undefined\n : (e) => onAllDaySlotClick(dayjs(day).format('YYYY-MM-DD'), e)\n }\n onDragOver={withDragHandlers ? (e) => allDayDragDrop.handleDragOver(e, day) : undefined}\n onDragLeave={withDragHandlers ? allDayDragDrop.handleDragLeave : undefined}\n onDrop={withDragHandlers ? (e) => allDayDragDrop.handleDrop(e, day) : undefined}\n {...getStyles('weekViewDaySlot')}\n mod={{ 'drop-target': allDayDragDrop.isDropTarget(day) }}\n />\n ));\n\n const allDayEventIds = useMemo(\n () => new Set(weekEvents.allDayEvents.map((e) => e.id)),\n [weekEvents.allDayEvents]\n );\n\n const allDayEvents = weekEvents.allDayEvents.map((event) => (\n <ScheduleEvent\n key={event.id}\n event={event}\n autoSize\n nowrap\n hanging={event.position.hanging}\n draggable={allDayDragDrop.isDraggableEvent(event)}\n renderEvent={renderEvent}\n mode={mode}\n onClick={onEventClick ? (e) => onEventClick(event, e) : undefined}\n style={{\n position: 'absolute',\n zIndex: 2,\n top: `calc(${event.position.row * 50}% + 1px)`,\n left: `calc(${event.position.offset}% + 1px)`,\n width: `calc(${event.position.width}% - 1px)`,\n height: 'calc(50% - 2px)',\n maxHeight: 'calc(50% - 2px)',\n }}\n />\n ));\n\n const allDayBackgroundEventNodes = weekdays.flatMap((day, dayIndex) => {\n const allDayBgEvents = (weekEvents.backgroundEvents[day] || []).filter(\n (event) => event.position.allDay\n );\n const dayWidth = 100 / weekdays.length;\n const dayOffset = dayIndex * dayWidth;\n\n return allDayBgEvents.map((event) => {\n const colors = theme.variantColorResolver({\n color: event.color || theme.primaryColor,\n theme,\n variant: 'light',\n autoContrast: true,\n });\n\n const bgEventBody =\n typeof renderEventBody === 'function' ? renderEventBody(event) : event.title;\n\n const bgEventProps = {\n key: `bg-allday-${event.id}-${day}`,\n ...getStyles('weekViewBackgroundEvent', {\n style: {\n top: 0,\n height: '100%',\n left: `${dayOffset}%`,\n width: `${dayWidth}%`,\n },\n }),\n __vars: {\n '--bg-event-bg': colors.background,\n '--bg-event-color': colors.color,\n },\n children: bgEventBody,\n };\n\n if (typeof renderEvent === 'function') {\n return renderEvent(event, bgEventProps as any);\n }\n\n const { key: bgEventKey, ...restBgEventProps } = bgEventProps;\n return <Box key={bgEventKey} {...restBgEventProps} />;\n });\n });\n\n // Extra rows show on hover = total rows - 2 visible rows (starts from 0, so -1)\n const extraRows = Math.max(...weekEvents.allDayEvents.map((event) => event.position.row), 1) - 1;\n\n const content = (\n <Box\n {...getStyles('weekView')}\n mod={{ static: mode === 'static', 'slot-dragging': slotDragSelect.isDragging }}\n {...others}\n >\n {withHeader && (\n <ScheduleHeaderBase\n view=\"week\"\n navigationHandlers={{\n previous: () => previousWeek(date, ctx.getFirstDayOfWeek(firstDayOfWeek)),\n next: () => nextWeek(date, ctx.getFirstDayOfWeek(firstDayOfWeek)),\n today: () => toDateString(resolveNow()),\n }}\n control={{\n miw: 140,\n title: getWeekLabel({\n weekdays,\n locale: ctx.getLocale(locale),\n weekLabelFormat,\n renderWeekLabel,\n }),\n }}\n labels={labels}\n onDateChange={onDateChange}\n onViewChange={onViewChange}\n previousControlProps={previousControlProps}\n nextControlProps={nextControlProps}\n todayControlProps={todayControlProps}\n viewSelectProps={viewSelectProps}\n stylesApiProps={stylesApiProps}\n onAgendaClick={withAgenda ? () => setAgendaOpen((v) => !v) : undefined}\n agendaActive={agendaOpen}\n />\n )}\n\n {agendaOpen && (\n <AgendaView\n rangeStart={dayjs(weekdays[0]).format('YYYY-MM-DD')}\n rangeEnd={dayjs(weekdays[weekdays.length - 1]).format('YYYY-MM-DD')}\n events={events}\n locale={locale}\n labels={labels}\n mode={mode}\n onEventClick={onEventClick}\n recurrenceExpansionLimit={recurrenceExpansionLimit}\n {...stylesApiProps}\n />\n )}\n\n {!agendaOpen && (\n <Box\n {...getStyles('weekViewRoot')}\n __vars={{\n '--indicator-offset-index':\n currentWeekdayIndex === -1 ? undefined : `${currentWeekdayIndex + 1}`,\n '--number-of-days': withWeekendDays\n ? '7'\n : `${7 - ctx.getWeekendDays(weekendDays).length}`,\n }}\n mod={{\n 'with-weekends': withWeekendDays,\n 'hide-sub-hour-grid-lines': !withSubHourGridLines,\n 'event-interaction': eventResize.isResizing || dragDrop.dragContextValue.isDragging,\n }}\n >\n <ScrollArea.Autosize\n scrollbarSize={4}\n {...scrollAreaProps}\n {...getStyles('weekViewScrollArea', {\n className: scrollAreaProps?.className,\n style: scrollAreaProps?.style,\n })}\n onScrollPositionChange={(position) => {\n scrollAreaProps?.onScrollPositionChange?.(position);\n setScrolled(position.y !== 0);\n }}\n viewportRef={mergedViewportRef}\n >\n <Box {...getStyles('weekViewHeader')} mod={{ scrolled }}>\n <div {...getStyles('weekViewCorner')} key=\"corner\">\n {withWeekNumber && (\n <>\n <div {...getStyles('weekViewWeekLabel')}>{getLabel('week', labels)}</div>\n <div {...getStyles('weekViewWeekNumber')}>{getWeekNumber(date)}</div>\n </>\n )}\n </div>\n\n {weekdaysLabels}\n </Box>\n\n {withAllDaySlots && (\n <div {...getStyles('weekViewAllDaySlots')}>\n <div {...getStyles('weekViewAllDaySlotsLabel')}>{getLabel('allDay', labels)}</div>\n <div {...getStyles('weekViewAllDaySlotsList')}>\n {allDayBackgroundEventNodes}\n <Box\n {...getStyles('weekViewAllDaySlotsEvents')}\n __vars={{ '--extra-rows': `${extraRows}` }}\n >\n {allDayEvents}\n </Box>\n {allDaySlots}\n </div>\n </div>\n )}\n\n <div {...getStyles('weekViewInner')}>\n <div {...getStyles('weekViewSlotLabels')}>{timeValues}</div>\n\n {withCurrentTimeIndicator && currentWeekdayIndex !== -1 && (\n <CurrentTimeIndicator\n startOffset=\"calc(100% - (100% / var(--number-of-days)) * (var(--number-of-days) - var(--indicator-offset-index) + 1) + ((var(--number-of-days) - var(--indicator-offset-index) + 1) * var(--indicator-labels-offset)))\"\n endOffset=\"calc((100% / var(--number-of-days)) * (var(--number-of-days) - var(--indicator-offset-index)) - (var(--number-of-days) - var(--indicator-offset-index)) * var(--indicator-labels-offset))\"\n timeBubbleStartOffset=\"calc(var(--week-view-slots-label-width) - var(--time-bubble-width))\"\n currentTimeFormat={slotLabelFormat}\n withTimeBubble={withCurrentTimeBubble}\n withThumb={withCurrentTimeBubble ? currentWeekdayIndex !== 0 : true}\n locale={locale}\n startTime={startTime}\n endTime={endTime}\n intervalMinutes={intervalMinutes}\n getCurrentTime={getCurrentTime}\n {...stylesApiProps}\n />\n )}\n {days}\n </div>\n </ScrollArea.Autosize>\n </Box>\n )}\n </Box>\n );\n\n const mergedDragContextValue = useMemo<DragContextValue>(\n () => ({\n isDragging:\n dragDrop.dragContextValue.isDragging || allDayDragDrop.dragContextValue.isDragging,\n draggedEventId:\n dragDrop.dragContextValue.draggedEventId ?? allDayDragDrop.dragContextValue.draggedEventId,\n draggedEvent:\n dragDrop.dragContextValue.draggedEvent ?? allDayDragDrop.dragContextValue.draggedEvent,\n dropTarget:\n dragDrop.dragContextValue.dropTarget ?? allDayDragDrop.dragContextValue.dropTarget,\n onDragStart: (event: ScheduleEventData) => {\n if (allDayEventIds.has(event.id)) {\n allDayDragDrop.handleDragStart(event);\n } else {\n dragDrop.handleDragStart(event);\n }\n },\n onDragEnd: () => {\n dragDrop.handleDragEnd();\n allDayDragDrop.handleDragEnd();\n },\n setDropTarget: dragDrop.dragContextValue.setDropTarget,\n }),\n [dragDrop.dragContextValue, allDayDragDrop.dragContextValue, allDayEventIds]\n );\n\n if (withEventsDragAndDrop) {\n return <DragContext.Provider value={mergedDragContextValue}>{content}</DragContext.Provider>;\n }\n\n return content;\n});\n\nWeekView.displayName = '@mantine/schedule/WeekView';\nWeekView.classes = classes;\nWeekView.varsResolver = varsResolver;\n\nexport namespace WeekView {\n export type Props = WeekViewProps;\n export type Factory = WeekViewFactory;\n export type StylesNames = WeekViewStylesNames;\n export type CssVariables = WeekViewCssVariables;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6SA,MAAM,eAAe;CACnB,kBAAkB;CAClB,iBAAiB;CACjB,0BAA0B;CAC1B,WAAW;CACX,SAAS;CACT,iBAAiB;CACjB,iBAAiB;CACjB,sBAAsB;CACtB,eAAe;CACf,gBAAgB;CAChB,uBAAuB;CACvB,iBAAiB;CACjB,YAAY;CACZ,iBAAiB;CACjB,wBAAwB;CACxB,eAAe,CAAC,YAAY,UAAU;CACtC,uBAAuB;CACvB,oBAAoB;CACpB,iBAAiB;CACjB,MAAM;AACR;AAEA,MAAM,eAAe,oBAClB,QAAQ,EAAE,QAAQ,kBAAkB,kBAAkB,EACrD,UAAU;CACR,sBAAsB,WAAW,KAAA,IAAY,UAAU,MAAM,IAAI,KAAA;CACjE,oCAAoC,IAAI,gBAAgB;CACxD,2BAA2B,IAAI,UAAU;AAC3C,EACF,EACF;AAEA,MAAa,WAAW,SAA0B,WAAW;CAC3D,MAAM,QAAQ,SAAS,YAAY,cAAc,MAAM;CACvD,MAAM,EACJ,YACA,WACA,OACA,QACA,UACA,YACA,MACA,WACA,SACA,MACA,cACA,iBACA,sBACA,iBACA,iBACA,aACA,gBACA,eACA,QACA,gBACA,0BACA,2BACA,gBACA,iBACA,QACA,gBACA,uBACA,iBACA,kBACA,YACA,cACA,sBACA,kBACA,mBACA,iBACA,iBACA,QACA,kBACA,YACA,QACA,wBACA,eACA,iBACA,aACA,uBACA,aACA,cACA,kBACA,gBACA,iBACA,mBACA,cACA,oBACA,eACA,MACA,iBACA,iBACA,qBACA,iBACA,eACA,gBACA,0BACA,kBACA,YACA,GAAG,WACD;CAEJ,MAAM,CAAC,YAAY,iBAAiB,SAAS,KAAK;CAElD,MAAM,YAAY,UAA2B;EAC3C,MAAM;EACN,SAAA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,cAAc;CAChB,CAAC;CAED,MAAM,EAAE,oBAAoB,mBAAmB,qBAAsC;EACnF;EACA;EACA;CACF,CAAC;CAED,MAAM,iBAAiB;EACrB,YAAY;EACZ,QAAQ;EACR;EACA;EACA;CACF;CAE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"}
1
+ {"version":3,"file":"WeekView.mjs","names":["classes"],"sources":["../../../src/components/WeekView/WeekView.tsx"],"sourcesContent":["import dayjs from 'dayjs';\nimport { useCallback, useMemo, useRef, useState } from 'react';\nimport {\n Box,\n BoxProps,\n createVarsResolver,\n DataAttributes,\n ElementProps,\n factory,\n Factory,\n getRadius,\n MantineRadius,\n rem,\n ScrollArea,\n ScrollAreaAutosizeProps,\n StylesApiProps,\n UnstyledButton,\n useProps,\n useResolvedStylesApi,\n useStyles,\n} from '@mantine/core';\nimport { useDatesContext } from '@mantine/dates';\nimport { useIsomorphicEffect, useMergedRef } from '@mantine/hooks';\nimport { useAutoScrollOnDrag } from '../../hooks/use-auto-scroll-on-drag';\nimport { useDragDropHandlers } from '../../hooks/use-drag-drop-handlers';\nimport { useEventResize } from '../../hooks/use-event-resize';\nimport { useSlotDragSelect } from '../../hooks/use-slot-drag-select';\nimport { getLabel, ScheduleLabelsOverride } from '../../labels';\nimport {\n AnyDateValue,\n DateLabelFormat,\n DateStringValue,\n DateTimeStringValue,\n DayOfWeek,\n ScheduleEventData,\n ScheduleMode,\n ScheduleViewLevel,\n} from '../../types';\nimport {\n BusinessHoursValue,\n calculateDropTime,\n expandRecurringEvents,\n formatDate,\n getBusinessHoursMod,\n getDayPosition,\n getDayTimeIntervals,\n getTimeAxisEventStyle,\n getWeekDays,\n getWeekNumber,\n isAllDayEvent,\n nextWeek,\n previousWeek,\n toDateString,\n} from '../../utils';\nimport { AgendaView, AgendaViewStylesNames } from '../AgendaView/AgendaView';\nimport {\n CurrentTimeIndicator,\n CurrentTimeIndicatorStylesNames,\n} from '../CurrentTimeIndicator/CurrentTimeIndicator';\nimport { DragContext, DragContextValue } from '../DragContext/DragContext';\nimport { ScheduleBackgroundEvent } from '../ScheduleBackgroundEvent';\nimport { RenderEvent, RenderEventBody, ScheduleEvent } from '../ScheduleEvent/ScheduleEvent';\nimport { CombinedScheduleHeaderStylesNames } from '../ScheduleHeader/ScheduleHeader';\nimport { ScheduleHeaderBase } from '../ScheduleHeader/ScheduleHeaderBase';\nimport { ViewSelectProps } from '../ScheduleHeader/ViewSelect/ViewSelect';\nimport { getWeekLabel } from './get-week-label/get-week-label';\nimport { getWeekViewEvents } from './get-week-view-events/get-week-view-events';\nimport { handleWeekViewKeyDown, WeekViewControlsRef } from './handle-week-view-key-down';\nimport { WeekViewDay } from './WeekViewDay';\nimport classes from './WeekView.module.css';\n\nexport type WeekViewStylesNames =\n | 'weekView'\n | 'weekViewRoot'\n | 'weekViewHeader'\n | 'weekViewInner'\n | 'weekViewAllDaySlotsEvents'\n | 'weekViewAllDaySlots'\n | 'weekViewAllDaySlotsList'\n | 'weekViewAllDaySlot'\n | 'weekViewAllDaySlotsLabel'\n | 'weekViewScrollArea'\n | 'weekViewCorner'\n | 'weekViewSlotLabels'\n | 'weekViewSlotLabel'\n | 'weekViewDayLabel'\n | 'weekViewDayWeekday'\n | 'weekViewDay'\n | 'weekViewDayNumber'\n | 'weekViewDaySlot'\n | 'weekViewDaySlots'\n | 'weekViewWeekLabel'\n | 'weekViewWeekNumber'\n | 'weekViewBackgroundEvent'\n | 'weekViewDragPreview'\n | CurrentTimeIndicatorStylesNames\n | CombinedScheduleHeaderStylesNames\n | AgendaViewStylesNames;\n\nexport type WeekViewCssVariables = {\n weekView: '--week-view-radius' | '--week-view-slot-height' | '--week-view-all-day-slots-height';\n};\n\nexport interface WeekViewProps\n extends BoxProps, StylesApiProps<WeekViewFactory>, ElementProps<'div'> {\n __staticSelector?: string;\n\n /** Week to display, Date object or date string in `YYYY-MM-DD` format */\n date: Date | string;\n\n /** Called with the new date value when a date is selected */\n onDateChange?: (value: DateStringValue) => void;\n\n /** Start time for the day view, in `HH:mm:ss` format @default 00:00:00 */\n startTime?: string;\n\n /** End time for the day view, in `HH:mm:ss` format @default 23:59:59 */\n endTime?: string;\n\n /** Number of minutes for each interval in the day view. Must divide evenly into an hour (e.g. `15`, `30`) or be a whole number of hours (e.g. `120`, `240`) @default 60 */\n intervalMinutes?: number;\n\n /** If set, grid lines are displayed for intervals smaller than one hour, for example 15 and 30 minutes intervals @default true */\n withSubHourGridLines?: boolean;\n\n /** Dayjs format for slot labels or a callback function that returns formatted value @default HH:mm */\n slotLabelFormat?: DateLabelFormat;\n\n /** Number 0-6, where 0 – Sunday and 6 – Saturday. @default 1 – Monday */\n firstDayOfWeek?: DayOfWeek;\n\n /** `dayjs` format for weekdays names. @default 'ddd' */\n weekdayFormat?: DateLabelFormat;\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 /** If set to true, highlights today in the weekday row @default false */\n highlightToday?: boolean;\n\n /** Key of `theme.radius` or any valid CSS value to set `border-radius` @default theme.defaultRadius */\n radius?: MantineRadius;\n\n /** Props passed down to the `ScrollArea.Autosize` component */\n scrollAreaProps?: ScrollAreaAutosizeProps & DataAttributes;\n\n /** Locale passed down to dayjs, overrides value defined on `DatesProvider` */\n locale?: string;\n\n /** If set, the week number is displayed at the top left corner @default true */\n withWeekNumber?: boolean;\n\n /** If set, displays a line indicating the current time @default true */\n withCurrentTimeIndicator?: boolean;\n\n /** If set, the time indicator displays the current time in the bubble @default true */\n withCurrentTimeBubble?: boolean;\n\n /** If set, displays the current time indicator on the same day of week even when viewing a different week @default false */\n forceCurrentTimeIndicator?: boolean;\n\n /** A function to get the current time, called on every tick. Can be used to display the current time indicator in a different timezone. @default () => dayjs() */\n getCurrentTime?: () => AnyDateValue;\n\n /** If set, displays all-day slots at the top of the view @default true */\n withAllDaySlots?: boolean;\n\n /** If set, the header is displayed @default true */\n withHeader?: boolean;\n\n /** Called when view level select button is clicked */\n onViewChange?: (view: ScheduleViewLevel) => void;\n\n /** Props passed to previous month control */\n previousControlProps?: React.ComponentProps<'button'> & DataAttributes;\n\n /** Props passed to next month control */\n nextControlProps?: React.ComponentProps<'button'> & DataAttributes;\n\n /** Props passed to today control */\n todayControlProps?: React.ComponentProps<'button'> & DataAttributes;\n\n /** Props passed to view level select */\n viewSelectProps?: Partial<ViewSelectProps> & DataAttributes;\n\n /** Format for week label @default 'MMM DD' */\n weekLabelFormat?: DateLabelFormat;\n\n /** List of events to display in the week view */\n events?: ScheduleEventData[];\n\n /** Height of 1hr slot @default 64px */\n slotHeight?: React.CSSProperties['height'];\n\n /** Height of all-day slot @default 48px */\n allDaySlotHeight?: React.CSSProperties['height'];\n\n /** Labels override */\n labels?: ScheduleLabelsOverride;\n\n /** If set to true, highlights business hours with white background @default false */\n highlightBusinessHours?: boolean;\n\n /** Business hours range in `HH:mm:ss` format shared across all days, or a per-day record keyed by day of the week (`0` – Sunday, `6` – Saturday) for day-specific ranges. Set a day to `null` to mark it as fully outside business hours. @default ['09:00:00', '17:00:00'] */\n businessHours?: BusinessHoursValue;\n\n /** Function to customize event body, `event` object is passed as first argument */\n renderEventBody?: RenderEventBody;\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 /** If true, events can be dragged and dropped @default false */\n withEventsDragAndDrop?: boolean;\n\n /** Called when event is dropped at new time */\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 /** Snap step for moving events by drag and drop, in minutes. Must divide evenly into an hour (e.g. `15`, `30`) or be a whole number of hours. When not set, `intervalMinutes` is used. @default intervalMinutes */\n eventDragInterval?: number;\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 /** Called when time slot is clicked */\n onTimeSlotClick?: (data: {\n slotStart: DateTimeStringValue;\n slotEnd: DateTimeStringValue;\n nativeEvent: React.MouseEvent<HTMLButtonElement>;\n }) => void;\n\n /** Called when all-day slot is clicked */\n onAllDaySlotClick?: (day: DateStringValue, event: React.MouseEvent<HTMLButtonElement>) => void;\n\n /** Called when event is clicked */\n onEventClick?: (event: ScheduleEventData, e: React.MouseEvent<HTMLButtonElement>) => void;\n\n /** If set, background events (`display: 'background'`) can be clicked and trigger `onEventClick` @default false */\n withInteractiveBackgroundEvents?: boolean;\n\n /** If set, enables drag-to-select time slot ranges @default false */\n withDragSlotSelect?: boolean;\n\n /** Called when a time slot range is selected by dragging */\n onSlotDragEnd?: (rangeStart: DateTimeStringValue, rangeEnd: DateTimeStringValue) => void;\n\n /** Interaction mode: 'default' allows all interactions, 'static' disables event interactions @default default */\n mode?: ScheduleMode;\n\n /** Time to scroll to on initial render, in `HH:mm:ss` format */\n startScrollTime?: string;\n\n /** Function to customize week label in the header */\n renderWeekLabel?: (params: {\n weekStart: DateStringValue;\n weekEnd: DateStringValue;\n }) => React.ReactNode;\n\n /** Called when an external item is dropped onto the schedule. Receives the `DataTransfer` object and the drop target datetime. */\n onExternalEventDrop?: (dataTransfer: DataTransfer, dropDateTime: DateTimeStringValue) => void;\n\n /** If true, events can be resized by dragging their edges @default false */\n withEventResize?: boolean;\n\n /** Called when event is resized */\n onEventResize?: (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 resized */\n canResizeEvent?: (event: ScheduleEventData) => boolean;\n\n /** Snap step for resizing events, in minutes. Must divide evenly into an hour (e.g. `15`, `30`) or be a whole number of hours. When not set, `intervalMinutes` is used. @default intervalMinutes */\n eventResizeInterval?: number;\n\n /** Max number of generated recurring instances per recurring series @default 2000 */\n recurrenceExpansionLimit?: number;\n\n /** Function to get additional props for each time slot. Receives slot start and end datetime strings. Returned props are spread onto the slot element. Event handlers returned by this function are composed with internal handlers (e.g. onClick) rather than overriding them. */\n getTimeSlotProps?: (data: {\n start: DateTimeStringValue;\n end: DateTimeStringValue;\n }) => Record<string, any> | undefined;\n\n /** If set, displays an Agenda button in the header that opens an agenda list view @default false */\n withAgenda?: boolean;\n}\n\nexport type WeekViewFactory = Factory<{\n props: WeekViewProps;\n ref: HTMLDivElement;\n stylesNames: WeekViewStylesNames;\n vars: WeekViewCssVariables;\n}>;\n\nconst defaultProps = {\n __staticSelector: 'WeekView',\n withWeekendDays: true,\n withCurrentTimeIndicator: true,\n startTime: '00:00:00',\n endTime: '23:59:59',\n slotLabelFormat: 'HH:mm',\n intervalMinutes: 60,\n withSubHourGridLines: true,\n weekdayFormat: 'ddd',\n withWeekNumber: true,\n withCurrentTimeBubble: true,\n withAllDaySlots: true,\n withHeader: true,\n weekLabelFormat: 'MMM DD',\n highlightBusinessHours: false,\n businessHours: ['09:00:00', '17:00:00'],\n withEventsDragAndDrop: false,\n withDragSlotSelect: false,\n withEventResize: false,\n mode: 'default',\n withInteractiveBackgroundEvents: false,\n} satisfies Partial<WeekViewProps>;\n\nconst varsResolver = createVarsResolver<WeekViewFactory>(\n (_theme, { radius, allDaySlotHeight, slotHeight }) => ({\n weekView: {\n '--week-view-radius': radius !== undefined ? getRadius(radius) : undefined,\n '--week-view-all-day-slots-height': rem(allDaySlotHeight),\n '--week-view-slot-height': rem(slotHeight),\n },\n })\n);\n\nexport const WeekView = factory<WeekViewFactory>((_props) => {\n const props = useProps('WeekView', defaultProps, _props);\n const {\n classNames,\n className,\n style,\n styles,\n unstyled,\n attributes,\n vars,\n startTime,\n endTime,\n date,\n onDateChange,\n intervalMinutes,\n withSubHourGridLines,\n slotLabelFormat,\n withWeekendDays,\n weekendDays,\n firstDayOfWeek,\n weekdayFormat,\n radius,\n highlightToday,\n withCurrentTimeIndicator,\n forceCurrentTimeIndicator,\n getCurrentTime,\n scrollAreaProps,\n locale,\n withWeekNumber,\n withCurrentTimeBubble,\n withAllDaySlots,\n __staticSelector,\n withHeader,\n onViewChange,\n previousControlProps,\n nextControlProps,\n todayControlProps,\n viewSelectProps,\n weekLabelFormat,\n events,\n allDaySlotHeight,\n slotHeight,\n labels,\n highlightBusinessHours,\n businessHours,\n renderEventBody,\n renderEvent,\n withEventsDragAndDrop,\n onEventDrop,\n canDragEvent,\n eventDragInterval,\n onEventDragStart,\n onEventDragEnd,\n onTimeSlotClick,\n onAllDaySlotClick,\n onEventClick,\n withInteractiveBackgroundEvents,\n withDragSlotSelect,\n onSlotDragEnd,\n mode,\n startScrollTime,\n renderWeekLabel,\n onExternalEventDrop,\n withEventResize,\n onEventResize,\n canResizeEvent,\n eventResizeInterval,\n recurrenceExpansionLimit,\n getTimeSlotProps,\n withAgenda,\n ...others\n } = props;\n\n const [agendaOpen, setAgendaOpen] = useState(false);\n\n const getStyles = useStyles<WeekViewFactory>({\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: 'weekView',\n });\n\n const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<WeekViewFactory>({\n classNames,\n styles,\n props,\n });\n\n const stylesApiProps = {\n classNames: resolvedClassNames,\n styles: resolvedStyles,\n attributes,\n __staticSelector,\n radius,\n };\n\n const [scrolled, setScrolled] = useState(false);\n const ctx = useDatesContext();\n const slots = getDayTimeIntervals({ startTime, endTime, intervalMinutes });\n const viewportRef = useRef<HTMLDivElement>(null);\n\n useAutoScrollOnDrag({\n viewportRef,\n enabled: (withEventsDragAndDrop || !!onExternalEventDrop) && mode !== 'static',\n });\n\n type DropTargetSlot = { day: string; slotIndex: number };\n\n const dragOffsetRef = useRef<{ offset: number; size: number }>({ offset: 0, size: 0 });\n\n const getDropTimeForSlot = (target: DropTargetSlot, draggedEvent: ScheduleEventData) => {\n const slotTime = slots[target.slotIndex].startTime;\n return calculateDropTime({\n draggedEvent,\n targetDate: target.day,\n targetSlotTime: slotTime,\n intervalMinutes,\n dragIntervalMinutes: eventDragInterval,\n slotOffset: eventDragInterval == null ? undefined : dragOffsetRef.current.offset,\n slotSize: eventDragInterval == null ? undefined : dragOffsetRef.current.size,\n startTime,\n endTime,\n });\n };\n\n const handleExternalDrop = useCallback(\n (e: React.DragEvent, target: DropTargetSlot) => {\n if (!onExternalEventDrop) {\n return;\n }\n const slotDate = dayjs(target.day).format('YYYY-MM-DD');\n const slotTime = slots[target.slotIndex].startTime;\n\n if (eventDragInterval == null) {\n onExternalEventDrop(e.dataTransfer, `${slotDate} ${slotTime}`);\n return;\n }\n\n const slotStart = `${slotDate} ${slotTime}`;\n const { start } = calculateDropTime({\n draggedEvent: { start: slotStart, end: slotStart } as ScheduleEventData,\n targetDate: target.day,\n targetSlotTime: slotTime,\n intervalMinutes,\n dragIntervalMinutes: eventDragInterval,\n slotOffset: dragOffsetRef.current.offset,\n slotSize: dragOffsetRef.current.size,\n startTime,\n endTime,\n });\n onExternalEventDrop(e.dataTransfer, dayjs(start).format('YYYY-MM-DD HH:mm:ss'));\n },\n [onExternalEventDrop, slots, eventDragInterval, intervalMinutes, startTime, endTime]\n );\n\n const handleExternalAllDayDrop = useCallback(\n (e: React.DragEvent, day: string) => {\n if (!onExternalEventDrop) {\n return;\n }\n onExternalEventDrop(e.dataTransfer, `${dayjs(day).format('YYYY-MM-DD')} 00:00:00`);\n },\n [onExternalEventDrop]\n );\n\n const dragDrop = useDragDropHandlers<DropTargetSlot>({\n enabled: withEventsDragAndDrop,\n mode,\n onEventDrop,\n canDragEvent,\n onEventDragStart,\n onEventDragEnd,\n calculateDropTarget: getDropTimeForSlot,\n onExternalDrop: onExternalEventDrop ? handleExternalDrop : undefined,\n });\n\n const updateDragPreview = (target: DropTargetSlot) => {\n const draggedEvent = dragDrop.dragContextValue.draggedEvent;\n if (eventDragInterval == null || !draggedEvent) {\n return;\n }\n const { start, end } = getDropTimeForSlot(target, draggedEvent);\n const newStart = dayjs(start).format('YYYY-MM-DD HH:mm:ss');\n if (\n dragDrop.dragPreview?.start !== newStart ||\n dragDrop.dragPreview?.target.day !== target.day\n ) {\n dragDrop.setDragPreview({\n start: newStart,\n end: dayjs(end).format('YYYY-MM-DD HH:mm:ss'),\n target,\n });\n }\n };\n\n const suppressDropHighlight = eventDragInterval != null && dragDrop.dragContextValue.isDragging;\n\n const allDayDragDrop = useDragDropHandlers<string>({\n enabled: withEventsDragAndDrop,\n mode,\n onEventDrop,\n canDragEvent,\n onEventDragStart,\n onEventDragEnd,\n calculateDropTarget: (targetDay: string, draggedEvent: ScheduleEventData) => {\n const eventDuration = dayjs(draggedEvent.end).diff(dayjs(draggedEvent.start), 'millisecond');\n const newStart = dayjs(targetDay).startOf('day');\n return { start: newStart.toDate(), end: newStart.add(eventDuration, 'millisecond').toDate() };\n },\n onExternalDrop: onExternalEventDrop ? handleExternalAllDayDrop : undefined,\n });\n\n const slotDragSelect = useSlotDragSelect({\n enabled: withDragSlotSelect && mode !== 'static',\n onDragEnd: (startIndex, endIndex, group) => {\n if (!onSlotDragEnd) {\n return;\n }\n const slotDate = dayjs(group).format('YYYY-MM-DD');\n onSlotDragEnd(\n `${slotDate} ${slots[startIndex].startTime}`,\n `${slotDate} ${slots[endIndex].endTime}`\n );\n },\n });\n\n const eventResize = useEventResize({\n enabled: withEventResize,\n mode,\n startTime,\n endTime,\n intervalMinutes,\n resizeIntervalMinutes: eventResizeInterval,\n onEventResize,\n canResizeEvent,\n });\n\n const withDragHandlers = (withEventsDragAndDrop || !!onExternalEventDrop) && mode !== 'static';\n\n const handleTimeSlotClick = (\n day: string,\n slotTime: string,\n e: React.MouseEvent<HTMLButtonElement>\n ) => {\n if (!onTimeSlotClick) {\n return;\n }\n\n const slotDate = dayjs(day).format('YYYY-MM-DD');\n const slotIndex = slots.findIndex((s) => s.startTime === slotTime);\n if (slotIndex === -1) {\n return;\n }\n\n const slot = slots[slotIndex];\n onTimeSlotClick({\n slotStart: `${slotDate} ${slot.startTime}`,\n slotEnd: `${slotDate} ${slot.endTime}`,\n nativeEvent: e,\n });\n };\n\n const weekdays = getWeekDays({\n week: date,\n withWeekendDays,\n weekendDays: ctx.getWeekendDays(weekendDays),\n firstDayOfWeek: ctx.getFirstDayOfWeek(firstDayOfWeek),\n });\n\n const expandedEvents = expandRecurringEvents({\n events,\n rangeStart: dayjs(weekdays[0]).startOf('day').toDate(),\n rangeEnd: dayjs(weekdays[weekdays.length - 1])\n .endOf('day')\n .toDate(),\n expansionLimit: recurrenceExpansionLimit,\n });\n\n const weekEvents = getWeekViewEvents({\n date,\n events: expandedEvents,\n startTime,\n endTime,\n intervalMinutes,\n firstDayOfWeek: ctx.getFirstDayOfWeek(firstDayOfWeek),\n weekendDays: ctx.getWeekendDays(weekendDays),\n withWeekendDays,\n });\n\n const timeValues = slots.reduce<React.ReactNode[]>((acc, interval) => {\n if (!interval.isHourStart) {\n return acc;\n }\n\n const intervalTime = dayjs(`${dayjs(date).format('YYYY-MM-DD')} ${interval.startTime}`);\n const label = formatDate({\n date: intervalTime,\n locale: ctx.getLocale(locale),\n format: slotLabelFormat,\n });\n\n acc.push(\n <Box\n {...getStyles('weekViewSlotLabel')}\n key={interval.startTime}\n mod={{\n 'hour-start': interval.isHourStart,\n ...getBusinessHoursMod({\n time: interval.startTime,\n businessHours,\n highlightBusinessHours,\n }),\n }}\n >\n {label}\n </Box>\n );\n\n return acc;\n }, []);\n\n const slotsRef: WeekViewControlsRef = useRef<HTMLButtonElement[][]>([]);\n const allDaySlotsRef = useRef<HTMLButtonElement[]>([]);\n const weekdaysRef = useRef<HTMLButtonElement[]>([]);\n const daySlotsContainersRef = useRef<(HTMLDivElement | null)[]>([]);\n const mergedViewportRef = useMergedRef(viewportRef, scrollAreaProps?.viewportRef);\n\n const firstSlotIndex = { dayIndex: 0, slotIndex: 0 };\n\n useIsomorphicEffect(() => {\n if (!startScrollTime || !viewportRef.current) {\n return;\n }\n\n const firstDaySlots = slotsRef.current[0];\n if (!firstDaySlots || firstDaySlots.length === 0) {\n return;\n }\n\n const targetIndex = slots.findIndex((s) => s.startTime >= startScrollTime);\n if (targetIndex < 0) {\n return;\n }\n\n const targetSlot = firstDaySlots[targetIndex];\n if (!targetSlot) {\n return;\n }\n\n const slotRect = targetSlot.getBoundingClientRect();\n const viewportRect = viewportRef.current.getBoundingClientRect();\n viewportRef.current.scrollTo({ left: 0, top: slotRect.top - viewportRect.top });\n }, []);\n\n const getSlotIndexFromDragPoint = useCallback((event: React.DragEvent, dayIndex: number) => {\n const daySlots = slotsRef.current[dayIndex] ?? [];\n const slotIndex = daySlots.findIndex((slotNode) => {\n if (!slotNode) {\n return false;\n }\n\n const rect = slotNode.getBoundingClientRect();\n return event.clientY >= rect.top && event.clientY <= rect.bottom;\n });\n\n if (slotIndex >= 0) {\n const rect = daySlots[slotIndex]!.getBoundingClientRect();\n dragOffsetRef.current = { offset: event.clientY - rect.top, size: rect.height };\n return slotIndex;\n }\n\n const firstSlot = daySlots[0];\n const lastSlot = daySlots[daySlots.length - 1];\n\n if (!firstSlot || !lastSlot) {\n return null;\n }\n\n const firstRect = firstSlot.getBoundingClientRect();\n const lastRect = lastSlot.getBoundingClientRect();\n\n if (event.clientY < firstRect.top) {\n dragOffsetRef.current = { offset: 0, size: firstRect.height };\n return 0;\n }\n\n if (event.clientY > lastRect.bottom) {\n dragOffsetRef.current = { offset: lastRect.height, size: lastRect.height };\n return daySlots.length - 1;\n }\n\n return null;\n }, []);\n\n const handleSlotKeyDown = (\n event: React.KeyboardEvent<HTMLButtonElement>,\n dayIndex: number,\n slotIndex: number\n ) => {\n handleWeekViewKeyDown({\n controlsRef: slotsRef,\n dayIndex,\n slotIndex,\n event,\n });\n };\n\n const handleAllDaySlotKeyDown = (\n event: React.KeyboardEvent<HTMLButtonElement>,\n dayIndex: number\n ) => {\n const direction = event.key;\n if (direction === 'ArrowRight' && dayIndex < weekdays.length - 1) {\n event.preventDefault();\n allDaySlotsRef.current[dayIndex + 1]?.focus();\n } else if (direction === 'ArrowLeft' && dayIndex > 0) {\n event.preventDefault();\n allDaySlotsRef.current[dayIndex - 1]?.focus();\n } else if (direction === 'ArrowDown') {\n event.preventDefault();\n slotsRef.current?.[dayIndex]?.[0]?.focus();\n }\n };\n\n const handleWeekdayKeyDown = (\n event: React.KeyboardEvent<HTMLButtonElement>,\n dayIndex: number\n ) => {\n const direction = event.key;\n if (direction === 'ArrowRight' && dayIndex < weekdays.length - 1) {\n event.preventDefault();\n weekdaysRef.current[dayIndex + 1]?.focus();\n } else if (direction === 'ArrowLeft' && dayIndex > 0) {\n event.preventDefault();\n weekdaysRef.current[dayIndex - 1]?.focus();\n }\n };\n\n const resolveNow = () => (getCurrentTime ? dayjs(getCurrentTime()) : dayjs());\n const now = resolveNow();\n\n const currentWeekdayIndex = withCurrentTimeIndicator\n ? forceCurrentTimeIndicator\n ? weekdays.findIndex((day) => dayjs(day).day() === now.day())\n : weekdays.findIndex((day) => dayjs(day).isSame(now, 'date'))\n : -1;\n\n const weekdaysLabels = weekdays.map((day, dayIndex) => (\n <UnstyledButton\n {...getStyles('weekViewDayLabel')}\n key={day}\n ref={(node) => {\n weekdaysRef.current[dayIndex] = node!;\n }}\n aria-label={`${getLabel('weekday', labels)} ${dayjs(day).format('YYYY-MM-DD')}`}\n mod={{\n today: dayjs(day).isSame(now, 'day') && !!highlightToday,\n weekend: ctx.getWeekendDays(weekendDays).includes(dayjs(day).day() as DayOfWeek),\n static: mode === 'static',\n }}\n tabIndex={mode === 'static' ? -1 : dayIndex === 0 ? 0 : -1}\n onKeyDown={mode === 'static' ? undefined : (event) => handleWeekdayKeyDown(event, dayIndex)}\n onClick={\n mode === 'static'\n ? undefined\n : () => {\n onViewChange?.('day');\n onDateChange?.(toDateString(day));\n }\n }\n >\n <Box {...getStyles('weekViewDayWeekday')} key=\"weekday\">\n {formatDate({ locale: ctx.getLocale(locale), date: day, format: weekdayFormat })}\n </Box>\n <div {...getStyles('weekViewDayNumber')} key=\"date\">\n {dayjs(day).date()}\n </div>\n </UnstyledButton>\n ));\n\n const interactiveBackgroundEvents = withInteractiveBackgroundEvents && mode !== 'static';\n\n const days = weekdays.map((day, dayIndex) => {\n const allBgEvents = weekEvents.backgroundEvents[day] || [];\n\n const backgroundEventNodes = allBgEvents\n .filter((event) => !event.position.allDay)\n .map((event) => (\n <ScheduleBackgroundEvent\n key={`bg-${event.id}`}\n event={event}\n renderEvent={renderEvent}\n renderEventBody={renderEventBody}\n interactive={interactiveBackgroundEvents}\n onEventClick={onEventClick}\n {...getStyles('weekViewBackgroundEvent', {\n style: {\n top: `${event.position.top}%`,\n height: `${event.position.height}%`,\n width: '100%',\n },\n })}\n />\n ));\n\n const dayEvents = (weekEvents.regularEvents[day] || []).map((event) => {\n const eventIsAllDay = isAllDayEvent({ event, date: day });\n const isDraggable = !eventIsAllDay && dragDrop.isDraggableEvent(event);\n const isResizable = !eventIsAllDay && eventResize.isResizableEvent(event);\n const resizePosition = eventResize.getResizePosition(event.id);\n const eventTop = resizePosition ? resizePosition.top : event.position.top;\n const eventHeight = resizePosition ? resizePosition.height : event.position.height;\n\n return (\n <ScheduleEvent\n key={event.id}\n event={event}\n autoSize\n hanging={event.position.hanging}\n draggable={isDraggable}\n withResize={isResizable}\n isResizing={resizePosition !== null}\n onResizeStart={\n isResizable\n ? (edge, e) => {\n const container = daySlotsContainersRef.current[dayIndex];\n if (container) {\n eventResize.handleResizeStart({\n event,\n edge,\n container,\n originalTop: event.position.top,\n originalHeight: event.position.height,\n eventDate: dayjs(day).format('YYYY-MM-DD'),\n pointerEvent: e,\n });\n }\n }\n : undefined\n }\n renderEventBody={renderEventBody}\n renderEvent={renderEvent}\n radius={radius}\n mode={mode}\n onClick={\n onEventClick\n ? (e) => {\n if (!eventResize.wasResizing()) {\n onEventClick(event, e);\n }\n }\n : undefined\n }\n style={{\n position: 'absolute',\n ...getTimeAxisEventStyle({\n start: eventTop,\n span: eventHeight,\n axis: 'vertical',\n }),\n left: `${event.position.offset}%`,\n width: `${event.position.width}%`,\n }}\n />\n );\n });\n\n return (\n <WeekViewDay\n key={day}\n day={day}\n dayIndex={dayIndex}\n slots={slots}\n intervalMinutes={intervalMinutes}\n getStyles={getStyles}\n weekendDays={weekendDays}\n highlightBusinessHours={highlightBusinessHours}\n businessHours={businessHours}\n labels={labels}\n withEventsDragAndDrop={withDragHandlers}\n mode={mode}\n slotsRef={slotsRef}\n firstSlotIndex={firstSlotIndex}\n onSlotKeyDown={handleSlotKeyDown}\n onSlotClick={handleTimeSlotClick}\n onFirstSlotArrowUp={\n withAllDaySlots\n ? (dayIdx) => {\n allDaySlotsRef.current[dayIdx]?.focus();\n }\n : undefined\n }\n onDaySlotsDragOver={(event, dayStr, dayIdx) => {\n const slotIndex = getSlotIndexFromDragPoint(event, dayIdx);\n if (slotIndex !== null) {\n dragDrop.handleDragOver(event, { day: dayStr, slotIndex });\n updateDragPreview({ day: dayStr, slotIndex });\n }\n }}\n onDaySlotsDragLeave={dragDrop.handleDragLeave}\n onDaySlotsDrop={(event, dayStr, dayIdx) => {\n const slotIndex = getSlotIndexFromDragPoint(event, dayIdx);\n if (slotIndex !== null) {\n dragDrop.handleDrop(event, { day: dayStr, slotIndex });\n }\n }}\n dropTargetSlotIndex={\n !suppressDropHighlight && dragDrop.dropTarget?.day === day\n ? dragDrop.dropTarget.slotIndex\n : undefined\n }\n withDragSlotSelect={withDragSlotSelect}\n onSlotPointerDown={slotDragSelect.handleSlotPointerDown}\n isSlotDragSelected={slotDragSelect.isSlotSelected}\n daySlotsContainerRef={(node) => {\n daySlotsContainersRef.current[dayIndex] = node;\n }}\n getTimeSlotProps={getTimeSlotProps}\n >\n {backgroundEventNodes}\n {dayEvents}\n {dragDrop.dragPreview?.target.day === day && dragDrop.dragContextValue.draggedEvent && (\n <Box\n {...getStyles('weekViewDragPreview', {\n style: (() => {\n const { top, height } = getDayPosition({\n event: {\n ...dragDrop.dragContextValue.draggedEvent,\n start: dragDrop.dragPreview.start,\n end: dragDrop.dragPreview.end,\n },\n startTime,\n endTime,\n intervalMinutes,\n });\n return {\n position: 'absolute',\n insetInlineStart: 0,\n insetInlineEnd: 0,\n top: `${top}%`,\n height: `${height}%`,\n };\n })(),\n })}\n />\n )}\n </WeekViewDay>\n );\n });\n\n const allDaySlots = weekdays.map((day, dayIndex) => (\n <UnstyledButton\n aria-label={`${getLabel('allDay', labels)} ${dayjs(day).format('YYYY-MM-DD')}`}\n key={day}\n ref={(node) => {\n allDaySlotsRef.current[dayIndex] = node!;\n }}\n tabIndex={dayIndex === 0 ? 0 : -1}\n onKeyDown={(event) => handleAllDaySlotKeyDown(event, dayIndex)}\n onClick={\n mode === 'static' || !onAllDaySlotClick\n ? undefined\n : (e) => onAllDaySlotClick(dayjs(day).format('YYYY-MM-DD'), e)\n }\n onDragOver={withDragHandlers ? (e) => allDayDragDrop.handleDragOver(e, day) : undefined}\n onDragLeave={withDragHandlers ? allDayDragDrop.handleDragLeave : undefined}\n onDrop={withDragHandlers ? (e) => allDayDragDrop.handleDrop(e, day) : undefined}\n {...getStyles('weekViewDaySlot')}\n mod={{ 'drop-target': allDayDragDrop.isDropTarget(day) }}\n />\n ));\n\n const allDayEventIds = useMemo(\n () => new Set(weekEvents.allDayEvents.map((e) => e.id)),\n [weekEvents.allDayEvents]\n );\n\n const allDayEvents = weekEvents.allDayEvents.map((event) => (\n <ScheduleEvent\n key={event.id}\n event={event}\n autoSize\n nowrap\n hanging={event.position.hanging}\n draggable={allDayDragDrop.isDraggableEvent(event)}\n renderEvent={renderEvent}\n mode={mode}\n onClick={onEventClick ? (e) => onEventClick(event, e) : undefined}\n style={{\n position: 'absolute',\n zIndex: 2,\n top: `calc(${event.position.row * 50}% + 1px)`,\n left: `calc(${event.position.offset}% + 1px)`,\n width: `calc(${event.position.width}% - 1px)`,\n height: 'calc(50% - 2px)',\n maxHeight: 'calc(50% - 2px)',\n }}\n />\n ));\n\n const allDayBackgroundEventNodes = weekdays.flatMap((day, dayIndex) => {\n const allDayBgEvents = (weekEvents.backgroundEvents[day] || []).filter(\n (event) => event.position.allDay\n );\n const dayWidth = 100 / weekdays.length;\n const dayOffset = dayIndex * dayWidth;\n\n return allDayBgEvents.map((event) => (\n <ScheduleBackgroundEvent\n key={`bg-allday-${event.id}-${day}`}\n event={event}\n renderEvent={renderEvent}\n renderEventBody={renderEventBody}\n interactive={interactiveBackgroundEvents}\n onEventClick={onEventClick}\n {...getStyles('weekViewBackgroundEvent', {\n style: {\n top: 0,\n height: '100%',\n left: `${dayOffset}%`,\n width: `${dayWidth}%`,\n },\n })}\n />\n ));\n });\n\n // Extra rows show on hover = total rows - 2 visible rows (starts from 0, so -1)\n const extraRows = Math.max(...weekEvents.allDayEvents.map((event) => event.position.row), 1) - 1;\n\n const content = (\n <Box\n {...getStyles('weekView')}\n mod={{ static: mode === 'static', 'slot-dragging': slotDragSelect.isDragging }}\n {...others}\n >\n {withHeader && (\n <ScheduleHeaderBase\n view=\"week\"\n navigationHandlers={{\n previous: () => previousWeek(date, ctx.getFirstDayOfWeek(firstDayOfWeek)),\n next: () => nextWeek(date, ctx.getFirstDayOfWeek(firstDayOfWeek)),\n today: () => toDateString(resolveNow()),\n }}\n control={{\n miw: 140,\n title: getWeekLabel({\n weekdays,\n locale: ctx.getLocale(locale),\n weekLabelFormat,\n renderWeekLabel,\n }),\n }}\n labels={labels}\n onDateChange={onDateChange}\n onViewChange={onViewChange}\n previousControlProps={previousControlProps}\n nextControlProps={nextControlProps}\n todayControlProps={todayControlProps}\n viewSelectProps={viewSelectProps}\n stylesApiProps={stylesApiProps}\n onAgendaClick={withAgenda ? () => setAgendaOpen((v) => !v) : undefined}\n agendaActive={agendaOpen}\n />\n )}\n\n {agendaOpen && (\n <AgendaView\n rangeStart={dayjs(weekdays[0]).format('YYYY-MM-DD')}\n rangeEnd={dayjs(weekdays[weekdays.length - 1]).format('YYYY-MM-DD')}\n events={events}\n locale={locale}\n labels={labels}\n mode={mode}\n onEventClick={onEventClick}\n recurrenceExpansionLimit={recurrenceExpansionLimit}\n {...stylesApiProps}\n />\n )}\n\n {!agendaOpen && (\n <Box\n {...getStyles('weekViewRoot')}\n __vars={{\n '--indicator-offset-index':\n currentWeekdayIndex === -1 ? undefined : `${currentWeekdayIndex + 1}`,\n '--number-of-days': withWeekendDays\n ? '7'\n : `${7 - ctx.getWeekendDays(weekendDays).length}`,\n }}\n mod={{\n 'with-weekends': withWeekendDays,\n 'hide-sub-hour-grid-lines': !withSubHourGridLines,\n 'event-interaction': eventResize.isResizing || dragDrop.dragContextValue.isDragging,\n 'all-day-dragging': allDayDragDrop.dragContextValue.isDragging,\n }}\n >\n <ScrollArea.Autosize\n scrollbarSize={4}\n {...scrollAreaProps}\n {...getStyles('weekViewScrollArea', {\n className: scrollAreaProps?.className,\n style: scrollAreaProps?.style,\n })}\n onScrollPositionChange={(position) => {\n scrollAreaProps?.onScrollPositionChange?.(position);\n setScrolled(position.y !== 0);\n }}\n viewportRef={mergedViewportRef}\n >\n <Box {...getStyles('weekViewHeader')} mod={{ scrolled }}>\n <div {...getStyles('weekViewCorner')} key=\"corner\">\n {withWeekNumber && (\n <>\n <div {...getStyles('weekViewWeekLabel')}>{getLabel('week', labels)}</div>\n <div {...getStyles('weekViewWeekNumber')}>{getWeekNumber(date)}</div>\n </>\n )}\n </div>\n\n {weekdaysLabels}\n </Box>\n\n {withAllDaySlots && (\n <div {...getStyles('weekViewAllDaySlots')}>\n <div {...getStyles('weekViewAllDaySlotsLabel')}>{getLabel('allDay', labels)}</div>\n <div {...getStyles('weekViewAllDaySlotsList')}>\n {allDayBackgroundEventNodes}\n <Box\n {...getStyles('weekViewAllDaySlotsEvents')}\n __vars={{ '--extra-rows': `${extraRows}` }}\n >\n {allDayEvents}\n </Box>\n {allDaySlots}\n </div>\n </div>\n )}\n\n <div {...getStyles('weekViewInner')}>\n <div {...getStyles('weekViewSlotLabels')}>{timeValues}</div>\n\n {withCurrentTimeIndicator && currentWeekdayIndex !== -1 && (\n <CurrentTimeIndicator\n startOffset=\"calc(100% - (100% / var(--number-of-days)) * (var(--number-of-days) - var(--indicator-offset-index) + 1) + ((var(--number-of-days) - var(--indicator-offset-index) + 1) * var(--indicator-labels-offset)))\"\n endOffset=\"calc((100% / var(--number-of-days)) * (var(--number-of-days) - var(--indicator-offset-index)) - (var(--number-of-days) - var(--indicator-offset-index)) * var(--indicator-labels-offset))\"\n timeBubbleStartOffset=\"calc(var(--week-view-slots-label-width) - var(--time-bubble-width))\"\n currentTimeFormat={slotLabelFormat}\n withTimeBubble={withCurrentTimeBubble}\n withThumb={withCurrentTimeBubble ? currentWeekdayIndex !== 0 : true}\n locale={locale}\n startTime={startTime}\n endTime={endTime}\n intervalMinutes={intervalMinutes}\n getCurrentTime={getCurrentTime}\n {...stylesApiProps}\n />\n )}\n {days}\n </div>\n </ScrollArea.Autosize>\n </Box>\n )}\n </Box>\n );\n\n const mergedDragContextValue = useMemo<DragContextValue>(\n () => ({\n isDragging:\n dragDrop.dragContextValue.isDragging || allDayDragDrop.dragContextValue.isDragging,\n draggedEventId:\n dragDrop.dragContextValue.draggedEventId ?? allDayDragDrop.dragContextValue.draggedEventId,\n draggedEvent:\n dragDrop.dragContextValue.draggedEvent ?? allDayDragDrop.dragContextValue.draggedEvent,\n dropTarget:\n dragDrop.dragContextValue.dropTarget ?? allDayDragDrop.dragContextValue.dropTarget,\n onDragStart: (event: ScheduleEventData) => {\n if (allDayEventIds.has(event.id)) {\n allDayDragDrop.handleDragStart(event);\n } else {\n dragDrop.handleDragStart(event);\n }\n },\n onDragEnd: () => {\n dragDrop.handleDragEnd();\n allDayDragDrop.handleDragEnd();\n },\n setDropTarget: dragDrop.dragContextValue.setDropTarget,\n }),\n [dragDrop.dragContextValue, allDayDragDrop.dragContextValue, allDayEventIds]\n );\n\n if (withEventsDragAndDrop) {\n return <DragContext.Provider value={mergedDragContextValue}>{content}</DragContext.Provider>;\n }\n\n return content;\n});\n\nWeekView.displayName = '@mantine/schedule/WeekView';\nWeekView.classes = classes;\nWeekView.varsResolver = varsResolver;\n\nexport namespace WeekView {\n export type Props = WeekViewProps;\n export type Factory = WeekViewFactory;\n export type StylesNames = WeekViewStylesNames;\n export type CssVariables = WeekViewCssVariables;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwTA,MAAM,eAAe;CACnB,kBAAkB;CAClB,iBAAiB;CACjB,0BAA0B;CAC1B,WAAW;CACX,SAAS;CACT,iBAAiB;CACjB,iBAAiB;CACjB,sBAAsB;CACtB,eAAe;CACf,gBAAgB;CAChB,uBAAuB;CACvB,iBAAiB;CACjB,YAAY;CACZ,iBAAiB;CACjB,wBAAwB;CACxB,eAAe,CAAC,YAAY,UAAU;CACtC,uBAAuB;CACvB,oBAAoB;CACpB,iBAAiB;CACjB,MAAM;CACN,iCAAiC;AACnC;AAEA,MAAM,eAAe,oBAClB,QAAQ,EAAE,QAAQ,kBAAkB,kBAAkB,EACrD,UAAU;CACR,sBAAsB,WAAW,KAAA,IAAY,UAAU,MAAM,IAAI,KAAA;CACjE,oCAAoC,IAAI,gBAAgB;CACxD,2BAA2B,IAAI,UAAU;AAC3C,EACF,EACF;AAEA,MAAa,WAAW,SAA0B,WAAW;CAC3D,MAAM,QAAQ,SAAS,YAAY,cAAc,MAAM;CACvD,MAAM,EACJ,YACA,WACA,OACA,QACA,UACA,YACA,MACA,WACA,SACA,MACA,cACA,iBACA,sBACA,iBACA,iBACA,aACA,gBACA,eACA,QACA,gBACA,0BACA,2BACA,gBACA,iBACA,QACA,gBACA,uBACA,iBACA,kBACA,YACA,cACA,sBACA,kBACA,mBACA,iBACA,iBACA,QACA,kBACA,YACA,QACA,wBACA,eACA,iBACA,aACA,uBACA,aACA,cACA,mBACA,kBACA,gBACA,iBACA,mBACA,cACA,iCACA,oBACA,eACA,MACA,iBACA,iBACA,qBACA,iBACA,eACA,gBACA,qBACA,0BACA,kBACA,YACA,GAAG,WACD;CAEJ,MAAM,CAAC,YAAY,iBAAiB,SAAS,KAAK;CAElD,MAAM,YAAY,UAA2B;EAC3C,MAAM;EACN,SAAA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,cAAc;CAChB,CAAC;CAED,MAAM,EAAE,oBAAoB,mBAAmB,qBAAsC;EACnF;EACA;EACA;CACF,CAAC;CAED,MAAM,iBAAiB;EACrB,YAAY;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"}
@@ -21,7 +21,8 @@ var WeekView_module_default = {
21
21
  "weekViewAllDaySlots": "m_4f08474d",
22
22
  "weekViewAllDaySlotsLabel": "m_85cdcfa7",
23
23
  "weekViewAllDaySlotsEvents": "m_2923a6c6",
24
- "weekViewAllDaySlotsList": "m_77edfd8b"
24
+ "weekViewAllDaySlotsList": "m_77edfd8b",
25
+ "weekViewDragPreview": "m_e0da287"
25
26
  };
26
27
  //#endregion
27
28
  export { WeekView_module_default as default };
@@ -1 +1 @@
1
- {"version":3,"file":"WeekView.module.mjs","names":[],"sources":["../../../src/components/WeekView/WeekView.module.css"],"sourcesContent":[".weekView {\n --week-view-week-day-height: 58px;\n --week-view-all-day-slots-height: 48px;\n --week-view-radius: var(--schedule-radius, var(--mantine-radius-default));\n --week-view-slots-label-width: 80px;\n --week-view-min-slot-width: 80px;\n --week-view-slot-height: 64px;\n\n @mixin where-light {\n --week-view-border-color: var(--mantine-color-gray-3);\n --week-view-business-hours-bg: var(--mantine-color-white);\n --week-view-non-business-hours-bg: var(--mantine-color-gray-0);\n }\n\n @mixin where-dark {\n --week-view-border-color: var(--mantine-color-dark-4);\n --week-view-business-hours-bg: var(--mantine-color-dark-7);\n --week-view-non-business-hours-bg: var(--mantine-color-dark-6);\n }\n}\n\n.weekViewRoot {\n --indicator-labels-offset: calc(var(--week-view-slots-label-width) / var(--number-of-days));\n\n border: 1px solid var(--week-view-border-color);\n border-radius: var(--week-view-radius);\n overflow: hidden;\n}\n\n.weekViewInner {\n display: flex;\n position: relative;\n overflow: hidden;\n}\n\n.weekViewScrollArea {\n :where(:global(.mantine-ScrollArea-scrollbar)) {\n z-index: 4;\n }\n}\n\n.weekViewHeader {\n display: flex;\n position: sticky;\n top: 0;\n z-index: 4;\n background-color: var(--mantine-color-body);\n border-bottom: 1px solid var(--week-view-border-color);\n margin-bottom: -1px;\n transition: box-shadow 100ms ease;\n\n &:where([data-scrolled]) {\n box-shadow: var(--mantine-shadow-sm);\n }\n}\n\n.weekViewCorner {\n height: var(--week-view-week-day-height);\n flex: 0 0 var(--week-view-slots-label-width);\n min-width: var(--week-view-slots-label-width);\n line-height: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n}\n\n.weekViewSlotLabels {\n flex: 0 0 var(--week-view-slots-label-width);\n min-width: var(--week-view-slots-label-width);\n background-color: var(--mantine-color-body);\n}\n\n.weekViewSlotLabel {\n border-top: 1px solid var(--week-view-border-color);\n text-align: right;\n height: var(--week-view-slot-height);\n padding: 4px;\n padding-inline-end: 8px;\n font-size: var(--mantine-font-size-sm);\n user-select: none;\n cursor: default;\n font-variant-numeric: tabular-nums;\n text-transform: uppercase;\n\n &:where([data-business-hours]) {\n background-color: var(--week-view-business-hours-bg);\n }\n\n &:where([data-non-business-hours]) {\n background-color: var(--week-view-non-business-hours-bg);\n }\n}\n\n.weekViewDay {\n flex: 1;\n border-inline-start: 1px solid var(--week-view-border-color);\n}\n\n.weekViewDayLabel {\n height: var(--week-view-week-day-height);\n min-width: var(--week-view-min-slot-width);\n display: flex;\n align-items: center;\n justify-content: center;\n line-height: 1;\n font-weight: var(--mantine-font-weight-medium);\n user-select: none;\n cursor: pointer;\n flex: 1;\n border-inline-start: 1px solid var(--week-view-border-color);\n padding-inline-start: 5px;\n\n &:where([data-weekend]) {\n color: var(--mantine-color-error);\n }\n\n &:where([data-today]) {\n gap: 6px;\n }\n\n @mixin hover {\n @mixin where-light {\n background-color: var(--mantine-color-gray-0);\n }\n\n @mixin where-dark {\n background-color: var(--mantine-color-dark-6);\n }\n }\n\n &:where([data-static]) {\n cursor: default;\n pointer-events: none;\n }\n}\n\n.weekViewDayNumber {\n text-align: center;\n width: 26px;\n aspect-ratio: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 100%;\n font-size: var(--mantine-font-size-sm);\n\n :where(.weekViewDayLabel[data-today]) & {\n background-color: var(--mantine-primary-color-filled);\n color: var(--mantine-primary-color-contrast);\n }\n}\n\n.weekViewDayWeekday {\n text-align: center;\n font-size: var(--mantine-font-size-sm);\n text-transform: capitalize;\n}\n\n.weekViewBackgroundEvent {\n position: absolute;\n pointer-events: none;\n z-index: 2;\n border-radius: var(--week-view-radius);\n background-color: var(--bg-event-bg);\n overflow: hidden;\n font-size: 12px;\n font-weight: var(--mantine-font-weight-medium);\n padding: 3px 4px;\n color: var(--bg-event-color);\n}\n\n.weekViewDaySlots {\n position: relative;\n}\n\n.weekViewDaySlot {\n display: block;\n width: 100%;\n border-top: 1px solid var(--week-view-border-color);\n height: calc(var(--week-view-slot-height) * var(--slot-size, 1));\n min-width: var(--week-view-min-slot-width);\n padding: 4px;\n cursor: pointer;\n position: relative;\n\n &:where(:focus) {\n z-index: 1;\n }\n\n @mixin hover {\n @mixin where-light {\n background-color: var(--mantine-color-gray-1);\n }\n\n @mixin where-dark {\n background-color: var(--mantine-color-dark-5);\n }\n }\n\n &:where([data-business-hours]) {\n background-color: var(--week-view-business-hours-bg);\n }\n\n &:where([data-non-business-hours]) {\n background-color: var(--week-view-non-business-hours-bg);\n }\n\n &:where([data-drop-target]) {\n @mixin where-light {\n background-color: var(--mantine-color-blue-1);\n }\n\n @mixin where-dark {\n background-color: var(--mantine-color-dark-5);\n }\n\n &::before {\n content: '';\n position: absolute;\n inset: 0;\n pointer-events: none;\n z-index: 2;\n border: 1px solid;\n border-radius: 2px;\n\n @mixin where-light {\n border-color: var(--mantine-color-blue-4);\n }\n\n @mixin where-dark {\n border-color: var(--mantine-color-blue-6);\n }\n }\n }\n\n &:where([data-drag-selected]) {\n &,\n &:hover {\n background-color: var(--mantine-primary-color-light);\n }\n\n &::before {\n content: '';\n position: absolute;\n inset: -1px;\n pointer-events: none;\n z-index: 2;\n border: 1px solid;\n\n @mixin where-light {\n border-color: var(--mantine-primary-color-2);\n }\n\n @mixin where-dark {\n border-color: var(--mantine-primary-color-9);\n }\n }\n }\n\n &:where([data-drag-slot-index]) {\n touch-action: none;\n }\n\n &:where([data-static]) {\n cursor: default;\n pointer-events: none;\n }\n}\n\n.weekViewDaySlots .weekViewDaySlot {\n border-top-style: dotted;\n\n &:where([data-hour-start]) {\n border-top-style: solid;\n }\n}\n\n.weekViewRoot:where([data-hide-sub-hour-grid-lines])\n .weekViewDaySlots\n .weekViewDaySlot:not([data-hour-start]) {\n border-top-color: transparent;\n}\n\n.weekViewRoot:where([data-event-interaction]) .weekViewDaySlots .weekViewDaySlot {\n pointer-events: none;\n}\n\n.weekViewWeekLabel {\n text-align: center;\n margin-bottom: 4px;\n font-size: var(--mantine-font-size-sm);\n}\n\n.weekViewWeekNumber {\n font-weight: var(--mantine-font-weight-medium);\n text-align: center;\n font-size: var(--mantine-font-size-lg);\n}\n\n.weekViewAllDaySlots {\n display: flex;\n height: var(--week-view-all-day-slots-height);\n}\n\n.weekViewAllDaySlotsLabel {\n flex: 0 0 var(--week-view-slots-label-width);\n text-align: right;\n padding: 4px 8px;\n font-size: var(--mantine-font-size-sm);\n}\n\n.weekViewAllDaySlotsEvents {\n position: absolute;\n inset: 0;\n overflow: hidden;\n pointer-events: none;\n}\n\n.weekViewAllDaySlotsList {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n\n & > .weekViewDaySlot {\n flex: 1;\n border-inline-start: 1px solid var(--week-view-border-color);\n height: 100%;\n }\n\n &:hover,\n &:focus-within {\n .weekViewAllDaySlotsEvents {\n overflow: visible;\n\n &::before {\n content: '';\n position: absolute;\n top: 100%;\n height: calc(var(--week-view-all-day-slots-height) / 2 * var(--extra-rows));\n inset-inline: 0;\n z-index: 1;\n pointer-events: all;\n }\n }\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"WeekView.module.mjs","names":[],"sources":["../../../src/components/WeekView/WeekView.module.css"],"sourcesContent":[".weekView {\n --week-view-week-day-height: 58px;\n --week-view-all-day-slots-height: 48px;\n --week-view-radius: var(--schedule-radius, var(--mantine-radius-default));\n --week-view-slots-label-width: 80px;\n --week-view-min-slot-width: 80px;\n --week-view-slot-height: 64px;\n\n @mixin where-light {\n --week-view-border-color: var(--mantine-color-gray-3);\n --week-view-business-hours-bg: var(--mantine-color-white);\n --week-view-non-business-hours-bg: var(--mantine-color-gray-0);\n }\n\n @mixin where-dark {\n --week-view-border-color: var(--mantine-color-dark-4);\n --week-view-business-hours-bg: var(--mantine-color-dark-7);\n --week-view-non-business-hours-bg: var(--mantine-color-dark-6);\n }\n}\n\n.weekViewRoot {\n --indicator-labels-offset: calc(var(--week-view-slots-label-width) / var(--number-of-days));\n\n border: 1px solid var(--week-view-border-color);\n border-radius: var(--week-view-radius);\n overflow: hidden;\n}\n\n.weekViewInner {\n display: flex;\n position: relative;\n overflow: hidden;\n}\n\n.weekViewScrollArea {\n :where(:global(.mantine-ScrollArea-scrollbar)) {\n z-index: 4;\n }\n}\n\n.weekViewHeader {\n display: flex;\n position: sticky;\n top: 0;\n z-index: 4;\n background-color: var(--mantine-color-body);\n border-bottom: 1px solid var(--week-view-border-color);\n margin-bottom: -1px;\n transition: box-shadow 100ms ease;\n\n &:where([data-scrolled]) {\n box-shadow: var(--mantine-shadow-sm);\n }\n}\n\n.weekViewCorner {\n height: var(--week-view-week-day-height);\n flex: 0 0 var(--week-view-slots-label-width);\n min-width: var(--week-view-slots-label-width);\n line-height: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n}\n\n.weekViewSlotLabels {\n flex: 0 0 var(--week-view-slots-label-width);\n min-width: var(--week-view-slots-label-width);\n background-color: var(--mantine-color-body);\n}\n\n.weekViewSlotLabel {\n border-top: 1px solid var(--week-view-border-color);\n text-align: right;\n height: var(--week-view-slot-height);\n padding: 4px;\n padding-inline-end: 8px;\n font-size: var(--mantine-font-size-sm);\n user-select: none;\n cursor: default;\n font-variant-numeric: tabular-nums;\n text-transform: uppercase;\n\n &:where([data-business-hours]) {\n background-color: var(--week-view-business-hours-bg);\n }\n\n &:where([data-non-business-hours]) {\n background-color: var(--week-view-non-business-hours-bg);\n }\n}\n\n.weekViewDay {\n flex: 1;\n border-inline-start: 1px solid var(--week-view-border-color);\n}\n\n.weekViewDayLabel {\n height: var(--week-view-week-day-height);\n min-width: var(--week-view-min-slot-width);\n display: flex;\n align-items: center;\n justify-content: center;\n line-height: 1;\n font-weight: var(--mantine-font-weight-medium);\n user-select: none;\n cursor: pointer;\n flex: 1;\n border-inline-start: 1px solid var(--week-view-border-color);\n padding-inline-start: 5px;\n\n &:where([data-weekend]) {\n color: var(--mantine-color-error);\n }\n\n &:where([data-today]) {\n gap: 6px;\n }\n\n @mixin hover {\n @mixin where-light {\n background-color: var(--mantine-color-gray-0);\n }\n\n @mixin where-dark {\n background-color: var(--mantine-color-dark-6);\n }\n }\n\n &:where([data-static]) {\n cursor: default;\n pointer-events: none;\n }\n}\n\n.weekViewDayNumber {\n text-align: center;\n width: 26px;\n aspect-ratio: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 100%;\n font-size: var(--mantine-font-size-sm);\n\n :where(.weekViewDayLabel[data-today]) & {\n background-color: var(--mantine-primary-color-filled);\n color: var(--mantine-primary-color-contrast);\n }\n}\n\n.weekViewDayWeekday {\n text-align: center;\n font-size: var(--mantine-font-size-sm);\n text-transform: capitalize;\n}\n\n.weekViewBackgroundEvent {\n position: absolute;\n pointer-events: none;\n z-index: 2;\n border-radius: var(--week-view-radius);\n background-color: var(--bg-event-bg);\n overflow: hidden;\n font-size: 12px;\n font-weight: var(--mantine-font-weight-medium);\n padding: 3px 4px;\n color: var(--bg-event-color);\n\n &:where([data-interactive]) {\n pointer-events: auto;\n cursor: pointer;\n user-select: none;\n\n @mixin hover {\n background-color: var(--bg-event-hover);\n }\n }\n}\n\n.weekView:where([data-slot-dragging]) .weekViewBackgroundEvent,\n.weekViewRoot:where([data-event-interaction]) .weekViewBackgroundEvent,\n.weekViewRoot:where([data-all-day-dragging]) .weekViewBackgroundEvent {\n pointer-events: none;\n}\n\n.weekViewDaySlots {\n position: relative;\n}\n\n.weekViewDaySlot {\n display: block;\n width: 100%;\n border-top: 1px solid var(--week-view-border-color);\n height: calc(var(--week-view-slot-height) * var(--slot-size, 1));\n min-width: var(--week-view-min-slot-width);\n padding: 4px;\n cursor: pointer;\n position: relative;\n\n &:where(:focus) {\n z-index: 1;\n }\n\n @mixin hover {\n @mixin where-light {\n background-color: var(--mantine-color-gray-1);\n }\n\n @mixin where-dark {\n background-color: var(--mantine-color-dark-5);\n }\n }\n\n &:where([data-business-hours]) {\n background-color: var(--week-view-business-hours-bg);\n }\n\n &:where([data-non-business-hours]) {\n background-color: var(--week-view-non-business-hours-bg);\n }\n\n &:where([data-drop-target]) {\n @mixin where-light {\n background-color: var(--mantine-color-blue-1);\n }\n\n @mixin where-dark {\n background-color: var(--mantine-color-dark-5);\n }\n\n &::before {\n content: '';\n position: absolute;\n inset: 0;\n pointer-events: none;\n z-index: 2;\n border: 1px solid;\n border-radius: 2px;\n\n @mixin where-light {\n border-color: var(--mantine-color-blue-4);\n }\n\n @mixin where-dark {\n border-color: var(--mantine-color-blue-6);\n }\n }\n }\n\n &:where([data-drag-selected]) {\n &,\n &:hover {\n background-color: var(--mantine-primary-color-light);\n }\n\n &::before {\n content: '';\n position: absolute;\n inset: -1px;\n pointer-events: none;\n z-index: 2;\n border: 1px solid;\n\n @mixin where-light {\n border-color: var(--mantine-primary-color-2);\n }\n\n @mixin where-dark {\n border-color: var(--mantine-primary-color-9);\n }\n }\n }\n\n &:where([data-drag-slot-index]) {\n touch-action: none;\n }\n\n &:where([data-static]) {\n cursor: default;\n pointer-events: none;\n }\n}\n\n.weekViewDaySlots .weekViewDaySlot {\n border-top-style: dotted;\n\n &:where([data-hour-start]) {\n border-top-style: solid;\n }\n}\n\n.weekViewRoot:where([data-hide-sub-hour-grid-lines])\n .weekViewDaySlots\n .weekViewDaySlot:not([data-hour-start]) {\n border-top-color: transparent;\n}\n\n.weekViewRoot:where([data-event-interaction]) .weekViewDaySlots .weekViewDaySlot {\n pointer-events: none;\n}\n\n.weekViewWeekLabel {\n text-align: center;\n margin-bottom: 4px;\n font-size: var(--mantine-font-size-sm);\n}\n\n.weekViewWeekNumber {\n font-weight: var(--mantine-font-weight-medium);\n text-align: center;\n font-size: var(--mantine-font-size-lg);\n}\n\n.weekViewAllDaySlots {\n display: flex;\n height: var(--week-view-all-day-slots-height);\n}\n\n.weekViewAllDaySlotsLabel {\n flex: 0 0 var(--week-view-slots-label-width);\n text-align: right;\n padding: 4px 8px;\n font-size: var(--mantine-font-size-sm);\n}\n\n.weekViewAllDaySlotsEvents {\n position: absolute;\n inset: 0;\n overflow: hidden;\n pointer-events: none;\n}\n\n.weekViewAllDaySlotsList {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n\n & > .weekViewDaySlot {\n flex: 1;\n border-inline-start: 1px solid var(--week-view-border-color);\n height: 100%;\n }\n\n &:hover,\n &:focus-within {\n .weekViewAllDaySlotsEvents {\n overflow: visible;\n\n &::before {\n content: '';\n position: absolute;\n top: 100%;\n height: calc(var(--week-view-all-day-slots-height) / 2 * var(--extra-rows));\n inset-inline: 0;\n z-index: 1;\n pointer-events: all;\n }\n }\n }\n}\n\n.weekViewDragPreview {\n pointer-events: none;\n z-index: 3;\n border-radius: var(--week-view-radius);\n border: 1px dashed var(--mantine-color-blue-filled);\n background-color: var(--mantine-color-blue-light);\n opacity: 0.6;\n}\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"WeekViewDay.mjs","names":[],"sources":["../../../src/components/WeekView/WeekViewDay.tsx"],"sourcesContent":["import dayjs from 'dayjs';\nimport { Box, GetStylesApi, UnstyledButton } from '@mantine/core';\nimport { useDatesContext } from '@mantine/dates';\nimport { getLabel, ScheduleLabelsOverride } from '../../labels';\nimport { DateStringValue, DateTimeStringValue, DayOfWeek, ScheduleMode } from '../../types';\nimport {\n BusinessHoursValue,\n clampIntervalMinutes,\n DayTimeInterval,\n getBusinessHoursMod,\n} from '../../utils';\nimport type { WeekViewControlsRef } from './handle-week-view-key-down';\nimport type { WeekViewFactory } from './WeekView';\n\nexport interface WeekViewDayProps {\n /** Date to display */\n day: Date | DateStringValue;\n\n /** Index of this day in the week */\n dayIndex: number;\n\n /** Slots intervals */\n slots: DayTimeInterval[];\n\n /** Number of minutes for each interval, used to calculate slot height */\n intervalMinutes: number;\n\n /** `useStyles` return value of `WeekView` */\n getStyles: GetStylesApi<WeekViewFactory>;\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 /** Events list */\n children?: React.ReactNode;\n\n /** Labels override */\n labels?: ScheduleLabelsOverride;\n\n /** If set to true, highlights business hours with white background */\n highlightBusinessHours?: boolean;\n\n /** Business hours range in `HH:mm:ss` format, or per-day record keyed by day of the week */\n businessHours?: BusinessHoursValue;\n\n /** If true, slots are drop targets for drag and drop */\n withEventsDragAndDrop?: boolean;\n\n /** Called when dragging over day slots container */\n onDaySlotsDragOver?: (e: React.DragEvent<HTMLDivElement>, day: string, dayIndex: number) => void;\n\n /** Called when dragging leaves day slots container */\n onDaySlotsDragLeave?: () => void;\n\n /** Called when dropping on day slots container */\n onDaySlotsDrop?: (e: React.DragEvent<HTMLDivElement>, day: string, dayIndex: number) => void;\n\n /** Called when slot is clicked */\n onSlotClick?: (day: string, slotTime: string, event: React.MouseEvent<HTMLButtonElement>) => void;\n\n /** Index of the slot that is currently a drop target */\n dropTargetSlotIndex?: number;\n\n /** Interaction mode: 'default' allows all interactions, 'static' disables event interactions */\n mode?: ScheduleMode;\n\n /** Ref for keyboard navigation */\n slotsRef?: WeekViewControlsRef;\n\n /** Index of the first focusable slot */\n firstSlotIndex?: { dayIndex: number; slotIndex: number };\n\n /** Keyboard event handler for slots */\n onSlotKeyDown?: (\n event: React.KeyboardEvent<HTMLButtonElement>,\n dayIndex: number,\n slotIndex: number\n ) => void;\n\n /** Called when Arrow Up is pressed on the first slot, used to navigate to all-day slot */\n onFirstSlotArrowUp?: (dayIndex: number) => void;\n\n /** If set, enables drag-to-select time slot ranges */\n withDragSlotSelect?: boolean;\n\n /** Called when pointer down on a slot for drag selection */\n onSlotPointerDown?: (\n event: React.PointerEvent<HTMLButtonElement>,\n index: number,\n group: string\n ) => void;\n\n /** Function to check if a slot is drag-selected */\n isSlotDragSelected?: (index: number, group: string) => boolean;\n\n /** Ref callback for the day slots container */\n daySlotsContainerRef?: (node: HTMLDivElement | null) => void;\n\n /** Function to get additional props for each time slot */\n getTimeSlotProps?: (data: {\n start: DateTimeStringValue;\n end: DateTimeStringValue;\n }) => Record<string, any> | undefined;\n}\n\nexport function WeekViewDay({\n day,\n dayIndex,\n slots,\n intervalMinutes,\n getStyles,\n weekendDays,\n children,\n labels,\n highlightBusinessHours,\n businessHours,\n withEventsDragAndDrop,\n onDaySlotsDragOver,\n onDaySlotsDragLeave,\n onDaySlotsDrop,\n onSlotClick,\n dropTargetSlotIndex,\n mode,\n slotsRef,\n firstSlotIndex,\n onSlotKeyDown,\n onFirstSlotArrowUp,\n withDragSlotSelect,\n onSlotPointerDown,\n isSlotDragSelected,\n daySlotsContainerRef,\n getTimeSlotProps,\n}: WeekViewDayProps) {\n const ctx = useDatesContext();\n const dayOfWeek = dayjs(day).day() as DayOfWeek;\n const weekend = ctx.getWeekendDays(weekendDays).includes(dayOfWeek);\n const today = dayjs(day).isSame(dayjs(), 'day');\n\n const dayGroup = dayjs(day).format('YYYY-MM-DD');\n\n const items = slots.map((slot, slotIndex) => {\n const isDropTarget = dropTargetSlotIndex === slotIndex;\n const isFirstSlot =\n firstSlotIndex?.dayIndex === dayIndex && firstSlotIndex?.slotIndex === slotIndex;\n const isDragSelected = isSlotDragSelected?.(slotIndex, dayGroup) || false;\n const slotStart = `${dayGroup} ${slot.startTime}` as DateTimeStringValue;\n const slotEnd = `${dayGroup} ${slot.endTime}` as DateTimeStringValue;\n const { onClick: externalOnClick, ...externalSlotProps } =\n getTimeSlotProps?.({ start: slotStart, end: slotEnd }) || {};\n\n const handleClick =\n mode === 'static'\n ? undefined\n : (e: React.MouseEvent<HTMLButtonElement>) => {\n onSlotClick?.(String(day), slot.startTime, e);\n externalOnClick?.(e);\n };\n\n return (\n <UnstyledButton\n key={slot.startTime}\n ref={(node) => {\n if (node && slotsRef?.current) {\n if (!slotsRef.current[dayIndex]) {\n slotsRef.current[dayIndex] = [];\n }\n slotsRef.current[dayIndex][slotIndex] = node;\n }\n }}\n {...getStyles('weekViewDaySlot')}\n mod={{\n 'hour-start': slot.isHourStart,\n ...getBusinessHoursMod({\n time: slot.startTime,\n businessHours,\n highlightBusinessHours,\n dayOfWeek,\n }),\n 'drop-target': isDropTarget,\n 'drag-selected': isDragSelected,\n static: mode === 'static',\n }}\n __vars={{ '--slot-size': `${clampIntervalMinutes(intervalMinutes) / 60}` }}\n aria-label={`${getLabel('timeSlot', labels)} ${dayGroup} ${slot.startTime} - ${slot.endTime}`}\n tabIndex={mode === 'static' ? -1 : isFirstSlot ? 0 : -1}\n data-drag-slot-index={withDragSlotSelect && mode !== 'static' ? slotIndex : undefined}\n data-drag-slot-group={withDragSlotSelect && mode !== 'static' ? dayGroup : undefined}\n onKeyDown={(e) => {\n if (slotIndex === 0 && e.key === 'ArrowUp' && onFirstSlotArrowUp) {\n e.preventDefault();\n onFirstSlotArrowUp(dayIndex);\n } else if (onSlotKeyDown) {\n onSlotKeyDown(e, dayIndex, slotIndex);\n }\n }}\n onPointerDown={\n withDragSlotSelect && mode !== 'static'\n ? (e) => onSlotPointerDown?.(e, slotIndex, dayGroup)\n : undefined\n }\n onClick={handleClick}\n onDragOver={\n withEventsDragAndDrop && mode !== 'static' ? (e) => e.preventDefault() : undefined\n }\n {...externalSlotProps}\n />\n );\n });\n\n return (\n <Box {...getStyles('weekViewDay')} mod={{ today, weekend }}>\n <Box\n ref={daySlotsContainerRef}\n mod={{ today }}\n {...getStyles('weekViewDaySlots')}\n onDragOver={\n withEventsDragAndDrop && mode !== 'static'\n ? (e) => onDaySlotsDragOver?.(e, String(day), dayIndex)\n : undefined\n }\n onDragLeave={withEventsDragAndDrop && mode !== 'static' ? onDaySlotsDragLeave : undefined}\n onDrop={\n withEventsDragAndDrop && mode !== 'static'\n ? (e) => onDaySlotsDrop?.(e, String(day), dayIndex)\n : undefined\n }\n >\n {children}\n {items}\n </Box>\n </Box>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"WeekViewDay.mjs","names":[],"sources":["../../../src/components/WeekView/WeekViewDay.tsx"],"sourcesContent":["import dayjs from 'dayjs';\nimport { Box, GetStylesApi, UnstyledButton } from '@mantine/core';\nimport { useDatesContext } from '@mantine/dates';\nimport { getLabel, ScheduleLabelsOverride } from '../../labels';\nimport { DateStringValue, DateTimeStringValue, DayOfWeek, ScheduleMode } from '../../types';\nimport {\n BusinessHoursValue,\n clampIntervalMinutes,\n DayTimeInterval,\n getBusinessHoursMod,\n} from '../../utils';\nimport type { WeekViewControlsRef } from './handle-week-view-key-down';\nimport type { WeekViewFactory } from './WeekView';\n\nexport interface WeekViewDayProps {\n /** Date to display */\n day: Date | DateStringValue;\n\n /** Index of this day in the week */\n dayIndex: number;\n\n /** Slots intervals */\n slots: DayTimeInterval[];\n\n /** Number of minutes for each interval, used to calculate slot height */\n intervalMinutes: number;\n\n /** `useStyles` return value of `WeekView` */\n getStyles: GetStylesApi<WeekViewFactory>;\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 /** Events list */\n children?: React.ReactNode;\n\n /** Labels override */\n labels?: ScheduleLabelsOverride;\n\n /** If set to true, highlights business hours with white background */\n highlightBusinessHours?: boolean;\n\n /** Business hours range in `HH:mm:ss` format, or per-day record keyed by day of the week */\n businessHours?: BusinessHoursValue;\n\n /** If true, slots are drop targets for drag and drop */\n withEventsDragAndDrop?: boolean;\n\n /** Called when dragging over day slots container */\n onDaySlotsDragOver?: (e: React.DragEvent<HTMLDivElement>, day: string, dayIndex: number) => void;\n\n /** Called when dragging leaves day slots container */\n onDaySlotsDragLeave?: () => void;\n\n /** Called when dropping on day slots container */\n onDaySlotsDrop?: (e: React.DragEvent<HTMLDivElement>, day: string, dayIndex: number) => void;\n\n /** Called when slot is clicked */\n onSlotClick?: (day: string, slotTime: string, event: React.MouseEvent<HTMLButtonElement>) => void;\n\n /** Index of the slot that is currently a drop target */\n dropTargetSlotIndex?: number;\n\n /** Interaction mode: 'default' allows all interactions, 'static' disables event interactions */\n mode?: ScheduleMode;\n\n /** Ref for keyboard navigation */\n slotsRef?: WeekViewControlsRef;\n\n /** Index of the first focusable slot */\n firstSlotIndex?: { dayIndex: number; slotIndex: number };\n\n /** Keyboard event handler for slots */\n onSlotKeyDown?: (\n event: React.KeyboardEvent<HTMLButtonElement>,\n dayIndex: number,\n slotIndex: number\n ) => void;\n\n /** Called when Arrow Up is pressed on the first slot, used to navigate to all-day slot */\n onFirstSlotArrowUp?: (dayIndex: number) => void;\n\n /** If set, enables drag-to-select time slot ranges */\n withDragSlotSelect?: boolean;\n\n /** Called when pointer down on a slot for drag selection */\n onSlotPointerDown?: (\n event: React.PointerEvent<HTMLButtonElement>,\n index: number,\n group: string\n ) => void;\n\n /** Function to check if a slot is drag-selected */\n isSlotDragSelected?: (index: number, group: string) => boolean;\n\n /** Ref callback for the day slots container */\n daySlotsContainerRef?: (node: HTMLDivElement | null) => void;\n\n /** Function to get additional props for each time slot */\n getTimeSlotProps?: (data: {\n start: DateTimeStringValue;\n end: DateTimeStringValue;\n }) => Record<string, any> | undefined;\n}\n\nexport function WeekViewDay({\n day,\n dayIndex,\n slots,\n intervalMinutes,\n getStyles,\n weekendDays,\n children,\n labels,\n highlightBusinessHours,\n businessHours,\n withEventsDragAndDrop,\n onDaySlotsDragOver,\n onDaySlotsDragLeave,\n onDaySlotsDrop,\n onSlotClick,\n dropTargetSlotIndex,\n mode,\n slotsRef,\n firstSlotIndex,\n onSlotKeyDown,\n onFirstSlotArrowUp,\n withDragSlotSelect,\n onSlotPointerDown,\n isSlotDragSelected,\n daySlotsContainerRef,\n getTimeSlotProps,\n}: WeekViewDayProps) {\n const ctx = useDatesContext();\n const dayOfWeek = dayjs(day).day() as DayOfWeek;\n const weekend = ctx.getWeekendDays(weekendDays).includes(dayOfWeek);\n const today = dayjs(day).isSame(dayjs(), 'day');\n\n const dayGroup = dayjs(day).format('YYYY-MM-DD');\n\n const items = slots.map((slot, slotIndex) => {\n const isDropTarget = dropTargetSlotIndex === slotIndex;\n const isFirstSlot =\n firstSlotIndex?.dayIndex === dayIndex && firstSlotIndex?.slotIndex === slotIndex;\n const isDragSelected = isSlotDragSelected?.(slotIndex, dayGroup) || false;\n const slotStart = `${dayGroup} ${slot.startTime}` as DateTimeStringValue;\n const slotEnd = `${dayGroup} ${slot.endTime}` as DateTimeStringValue;\n const { onClick: externalOnClick, ...externalSlotProps } =\n getTimeSlotProps?.({ start: slotStart, end: slotEnd }) || {};\n\n const handleClick =\n mode === 'static'\n ? undefined\n : (e: React.MouseEvent<HTMLButtonElement>) => {\n onSlotClick?.(String(day), slot.startTime, e);\n externalOnClick?.(e);\n };\n\n return (\n <UnstyledButton\n key={slot.startTime}\n ref={(node) => {\n if (node && slotsRef?.current) {\n if (!slotsRef.current[dayIndex]) {\n slotsRef.current[dayIndex] = [];\n }\n slotsRef.current[dayIndex][slotIndex] = node;\n }\n }}\n {...getStyles('weekViewDaySlot')}\n mod={{\n 'hour-start': slot.isHourStart,\n ...getBusinessHoursMod({\n time: slot.startTime,\n businessHours,\n highlightBusinessHours,\n dayOfWeek,\n }),\n 'drop-target': isDropTarget,\n 'drag-selected': isDragSelected,\n static: mode === 'static',\n }}\n __vars={{ '--slot-size': `${clampIntervalMinutes(intervalMinutes) / 60}` }}\n aria-label={`${getLabel('timeSlot', labels)} ${dayGroup} ${slot.startTime} - ${slot.endTime}`}\n tabIndex={mode === 'static' ? -1 : isFirstSlot ? 0 : -1}\n data-drag-slot-index={withDragSlotSelect && mode !== 'static' ? slotIndex : undefined}\n data-drag-slot-group={withDragSlotSelect && mode !== 'static' ? dayGroup : undefined}\n onKeyDown={(e) => {\n if (slotIndex === 0 && e.key === 'ArrowUp' && onFirstSlotArrowUp) {\n e.preventDefault();\n onFirstSlotArrowUp(dayIndex);\n } else if (onSlotKeyDown) {\n onSlotKeyDown(e, dayIndex, slotIndex);\n }\n }}\n onPointerDown={\n withDragSlotSelect && mode !== 'static'\n ? (e) => onSlotPointerDown?.(e, slotIndex, dayGroup)\n : undefined\n }\n onClick={handleClick}\n onDragOver={\n withEventsDragAndDrop && mode !== 'static' ? (e) => e.preventDefault() : undefined\n }\n {...externalSlotProps}\n />\n );\n });\n\n return (\n <Box {...getStyles('weekViewDay')} mod={{ today, weekend }}>\n <Box\n ref={daySlotsContainerRef}\n mod={{ today }}\n {...getStyles('weekViewDaySlots')}\n onDragOver={\n withEventsDragAndDrop && mode !== 'static'\n ? (e) => onDaySlotsDragOver?.(e, String(day), dayIndex)\n : undefined\n }\n onDragLeave={withEventsDragAndDrop && mode !== 'static' ? onDaySlotsDragLeave : undefined}\n onDrop={\n withEventsDragAndDrop && mode !== 'static'\n ? (e) => onDaySlotsDrop?.(e, String(day), dayIndex)\n : undefined\n }\n >\n {children}\n {items}\n </Box>\n </Box>\n );\n}\n"],"mappings":"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"}
@@ -57,14 +57,15 @@ const YearView = factory((_props) => {
57
57
  __staticSelector,
58
58
  radius
59
59
  };
60
+ const expandedEvents = expandRecurringEvents({
61
+ events,
62
+ rangeStart: dayjs(date).startOf("year").toDate(),
63
+ rangeEnd: dayjs(date).endOf("year").toDate(),
64
+ expansionLimit: recurrenceExpansionLimit
65
+ });
60
66
  const groupedEvents = getYearViewEvents({
61
67
  date,
62
- events: expandRecurringEvents({
63
- events,
64
- rangeStart: dayjs(date).startOf("year").toDate(),
65
- rangeEnd: dayjs(date).endOf("year").toDate(),
66
- expansionLimit: recurrenceExpansionLimit
67
- })
68
+ events: expandedEvents
68
69
  });
69
70
  const daysRef = useRef([]);
70
71
  const resolvedFirstDayOfWeek = ctx.getFirstDayOfWeek(firstDayOfWeek);
@@ -1 +1 @@
1
- {"version":3,"file":"YearView.mjs","names":["classes"],"sources":["../../../src/components/YearView/YearView.tsx"],"sourcesContent":["import dayjs from 'dayjs';\nimport { useRef } from 'react';\nimport {\n Box,\n BoxProps,\n createVarsResolver,\n DataAttributes,\n ElementProps,\n factory,\n Factory,\n getRadius,\n MantineRadius,\n StylesApiProps,\n useProps,\n useResolvedStylesApi,\n useStyles,\n} from '@mantine/core';\nimport { useDatesContext } from '@mantine/dates';\nimport { DateStringValue, ScheduleEventData, ScheduleMode, ScheduleViewLevel } from '../../types';\nimport {\n expandRecurringEvents,\n getMonthDays,\n getMonthsByQuarter,\n isSameMonth,\n toDateString,\n} from '../../utils';\nimport { MonthYearSelectProps } from '../ScheduleHeader/MonthYearSelect/MonthYearSelect';\nimport { CombinedScheduleHeaderStylesNames } from '../ScheduleHeader/ScheduleHeader';\nimport { ScheduleHeaderBase } from '../ScheduleHeader/ScheduleHeaderBase';\nimport { ViewSelectProps } from '../ScheduleHeader/ViewSelect/ViewSelect';\nimport { getHiddenWeekendColumns, getVisibleWeekDays } from './get-visible-week-days';\nimport { getYearViewEvents } from './get-year-view-events/get-year-view-events';\nimport { handleYearViewKeyDown, YearViewControlsRef } from './handle-year-view-key-down';\nimport { YearViewMonth, YearViewMonthSettings } from './YearViewMonth';\nimport classes from './YearView.module.css';\n\nexport type YearViewStylesNames =\n | 'yearView'\n | 'yearViewMonths'\n | 'yearViewMonth'\n | 'yearViewWeekday'\n | 'yearViewDay'\n | 'yearViewWeek'\n | 'yearViewWeekNumber'\n | 'yearViewWeekdays'\n | 'yearViewWeekdaysCorner'\n | 'yearViewMonthCaption'\n | 'yearViewDayIndicators'\n | 'yearViewDayIndicator'\n | CombinedScheduleHeaderStylesNames;\n\nexport type YearViewCssVariables = {\n yearView: '--year-view-radius';\n};\n\nexport interface YearViewProps\n extends YearViewMonthSettings, BoxProps, StylesApiProps<YearViewFactory>, ElementProps<'div'> {\n __staticSelector?: string;\n\n /** Date to display, Date object or date string in `YYYY-MM-DD 00:00:00` format */\n date: Date | string;\n\n /** Called with the new date value when a date is selected */\n onDateChange?: (value: DateStringValue) => void;\n\n /** Events to display, must be a stable reference */\n events?: ScheduleEventData[];\n\n /** Key of `theme.radius` or any valid CSS value to set `border-radius` @default theme.defaultRadius */\n radius?: MantineRadius;\n\n /** If set, highlights the current day @default true */\n highlightToday?: boolean;\n\n /** If set, the header is displayed @default true */\n withHeader?: boolean;\n\n /** Props passed down to `MonthYearSelect` component in the header */\n monthYearSelectProps?: Partial<MonthYearSelectProps>;\n\n /** Called when view level select button is clicked */\n onViewChange?: (view: ScheduleViewLevel) => void;\n\n /** Props passed to previous month control */\n previousControlProps?: React.ComponentProps<'button'> & DataAttributes;\n\n /** Props passed to next month control */\n nextControlProps?: React.ComponentProps<'button'> & DataAttributes;\n\n /** Props passed to today control */\n todayControlProps?: React.ComponentProps<'button'> & DataAttributes;\n\n /** Props passed to view level select */\n viewSelectProps?: Partial<ViewSelectProps> & DataAttributes;\n\n /** Interaction mode: 'default' allows all interactions, 'static' disables event interactions @default default */\n mode?: ScheduleMode;\n\n /** Max number of generated recurring instances per recurring series @default 2000 */\n recurrenceExpansionLimit?: number;\n}\n\nexport type YearViewFactory = Factory<{\n props: YearViewProps;\n ref: HTMLDivElement;\n stylesNames: YearViewStylesNames;\n vars: YearViewCssVariables;\n}>;\n\nconst defaultProps = {\n __staticSelector: 'YearView',\n monthLabelFormat: 'MMMM',\n withWeekDays: true,\n withWeekendDays: true,\n highlightToday: true,\n withHeader: true,\n withOutsideDays: true,\n mode: 'default',\n} satisfies Partial<YearViewProps>;\n\nconst varsResolver = createVarsResolver<YearViewFactory>((_theme, { radius }) => ({\n yearView: { '--year-view-radius': radius !== undefined ? getRadius(radius) : undefined },\n}));\n\nexport const YearView = factory<YearViewFactory>((_props) => {\n const props = useProps('YearView', defaultProps, _props);\n const {\n // YearView props\n date,\n onDateChange,\n events,\n\n // YearViewMonth settings\n monthLabelFormat,\n withWeekNumbers,\n withWeekDays,\n locale,\n firstDayOfWeek,\n weekdayFormat,\n weekendDays,\n withWeekendDays,\n onMonthClick,\n onDayClick,\n onWeekNumberClick,\n getDayProps,\n getWeekNumberProps,\n highlightToday,\n labels,\n withOutsideDays,\n renderDay,\n\n // ScheduleHeader props\n withHeader,\n monthYearSelectProps,\n onViewChange,\n previousControlProps,\n nextControlProps,\n todayControlProps,\n viewSelectProps,\n\n // System props\n __staticSelector,\n classNames,\n className,\n style,\n styles,\n unstyled,\n vars,\n attributes,\n radius,\n mode,\n recurrenceExpansionLimit,\n ...others\n } = props;\n\n const ctx = useDatesContext();\n\n const getStyles = useStyles<YearViewFactory>({\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: 'yearView',\n });\n\n const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<YearViewFactory>({\n classNames,\n styles,\n props,\n });\n\n const stylesApiProps = {\n classNames: resolvedClassNames,\n styles: resolvedStyles,\n attributes,\n __staticSelector,\n radius,\n };\n\n const expandedEvents = expandRecurringEvents({\n events,\n rangeStart: dayjs(date).startOf('year').toDate(),\n rangeEnd: dayjs(date).endOf('year').toDate(),\n expansionLimit: recurrenceExpansionLimit,\n });\n\n const groupedEvents = getYearViewEvents({ date, events: expandedEvents });\n\n // [monthIndex][weekIndex][dayIndex]\n const daysRef = useRef<HTMLButtonElement[][][]>([]) as YearViewControlsRef;\n\n const resolvedFirstDayOfWeek = ctx.getFirstDayOfWeek(firstDayOfWeek);\n const resolvedWeekendDays = ctx.getWeekendDays(weekendDays);\n const hiddenColumns = getHiddenWeekendColumns({\n weekendDays: resolvedWeekendDays,\n firstDayOfWeek: resolvedFirstDayOfWeek,\n withWeekendDays,\n });\n const columnsCount = 7 - hiddenColumns.length;\n\n const getFirstDayIndex = (month: string): { weekIndex: number; dayIndex: number } | undefined => {\n const weeks = getMonthDays({\n month: dayjs(month).format('YYYY-MM-DD'),\n firstDayOfWeek: resolvedFirstDayOfWeek,\n consistentWeeks: true,\n });\n\n for (let weekIndex = 0; weekIndex < weeks.length; weekIndex++) {\n const week = getVisibleWeekDays({\n week: weeks[weekIndex],\n weekendDays: resolvedWeekendDays,\n withWeekendDays,\n });\n\n for (let dayIndex = 0; dayIndex < week.length; dayIndex++) {\n const dayDate = week[dayIndex];\n if (isSameMonth(dayDate, month)) {\n return { weekIndex, dayIndex };\n }\n }\n }\n\n return undefined;\n };\n\n let globalMonthIndex = 0;\n const months = getMonthsByQuarter(dayjs(date).format('YYYY-MM-DD'))\n .flat()\n .map((month) => {\n const currentMonthIndex = globalMonthIndex;\n globalMonthIndex++;\n\n return (\n <YearViewMonth\n key={month}\n month={month}\n getStyles={getStyles}\n monthLabelFormat={monthLabelFormat}\n withWeekNumbers={withWeekNumbers}\n withWeekDays={withWeekDays}\n locale={locale}\n firstDayOfWeek={firstDayOfWeek}\n weekdayFormat={\n weekdayFormat ||\n ((date) => dayjs(date).locale(ctx.getLocale(locale)).format('dd').slice(0, 1))\n }\n weekendDays={weekendDays}\n withWeekendDays={withWeekendDays}\n getDayProps={getDayProps}\n getWeekNumberProps={getWeekNumberProps}\n onMonthClick={onMonthClick}\n onDayClick={onDayClick}\n onWeekNumberClick={onWeekNumberClick}\n highlightToday={highlightToday}\n groupedEvents={groupedEvents}\n mode={mode}\n withOutsideDays={withOutsideDays}\n renderDay={renderDay}\n firstDayIndex={getFirstDayIndex(month)}\n __getDayRef={(weekIndex, dayIndex, node) => {\n if (!Array.isArray(daysRef.current[currentMonthIndex])) {\n daysRef.current[currentMonthIndex] = [];\n }\n if (!Array.isArray(daysRef.current[currentMonthIndex][weekIndex])) {\n daysRef.current[currentMonthIndex][weekIndex] = [];\n }\n daysRef.current[currentMonthIndex][weekIndex][dayIndex] = node;\n }}\n __onDayKeyDown={(event, payload) => {\n handleYearViewKeyDown({\n controlsRef: daysRef,\n monthIndex: currentMonthIndex,\n weekIndex: payload.weekIndex,\n dayIndex: payload.dayIndex,\n event,\n });\n }}\n />\n );\n });\n\n return (\n <Box\n {...getStyles('yearView')}\n mod={{ static: mode === 'static', 'without-weekend-days': hiddenColumns.length > 0 }}\n __vars={hiddenColumns.length > 0 ? { '--year-view-columns': `${columnsCount}` } : undefined}\n {...others}\n >\n {withHeader && (\n <ScheduleHeaderBase\n view=\"year\"\n navigationHandlers={{\n previous: () => toDateString(dayjs(date).subtract(1, 'year').startOf('year')),\n next: () => toDateString(dayjs(date).add(1, 'year').startOf('year')),\n today: () => toDateString(dayjs()),\n }}\n control={{\n monthYearSelect: {\n locale,\n withMonths: false,\n yearValue: dayjs(date).get('year'),\n monthValue: dayjs(date).get('month'),\n onYearChange: (year) =>\n onDateChange?.(toDateString(dayjs(date).set('year', year).startOf('year'))),\n ...monthYearSelectProps,\n },\n }}\n labels={labels}\n onDateChange={onDateChange}\n onViewChange={onViewChange}\n previousControlProps={previousControlProps}\n nextControlProps={nextControlProps}\n todayControlProps={todayControlProps}\n viewSelectProps={viewSelectProps}\n stylesApiProps={stylesApiProps}\n />\n )}\n\n <div {...getStyles('yearViewMonths')}>{months}</div>\n </Box>\n );\n});\n\nYearView.displayName = '@mantine/schedule/YearView';\nYearView.classes = classes;\nYearView.varsResolver = varsResolver;\n\nexport namespace YearView {\n export type Props = YearViewProps;\n export type Factory = YearViewFactory;\n export type StylesNames = YearViewStylesNames;\n export type CssVariables = YearViewCssVariables;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"YearView.mjs","names":["classes"],"sources":["../../../src/components/YearView/YearView.tsx"],"sourcesContent":["import dayjs from 'dayjs';\nimport { useRef } from 'react';\nimport {\n Box,\n BoxProps,\n createVarsResolver,\n DataAttributes,\n ElementProps,\n factory,\n Factory,\n getRadius,\n MantineRadius,\n StylesApiProps,\n useProps,\n useResolvedStylesApi,\n useStyles,\n} from '@mantine/core';\nimport { useDatesContext } from '@mantine/dates';\nimport { DateStringValue, ScheduleEventData, ScheduleMode, ScheduleViewLevel } from '../../types';\nimport {\n expandRecurringEvents,\n getMonthDays,\n getMonthsByQuarter,\n isSameMonth,\n toDateString,\n} from '../../utils';\nimport { MonthYearSelectProps } from '../ScheduleHeader/MonthYearSelect/MonthYearSelect';\nimport { CombinedScheduleHeaderStylesNames } from '../ScheduleHeader/ScheduleHeader';\nimport { ScheduleHeaderBase } from '../ScheduleHeader/ScheduleHeaderBase';\nimport { ViewSelectProps } from '../ScheduleHeader/ViewSelect/ViewSelect';\nimport { getHiddenWeekendColumns, getVisibleWeekDays } from './get-visible-week-days';\nimport { getYearViewEvents } from './get-year-view-events/get-year-view-events';\nimport { handleYearViewKeyDown, YearViewControlsRef } from './handle-year-view-key-down';\nimport { YearViewMonth, YearViewMonthSettings } from './YearViewMonth';\nimport classes from './YearView.module.css';\n\nexport type YearViewStylesNames =\n | 'yearView'\n | 'yearViewMonths'\n | 'yearViewMonth'\n | 'yearViewWeekday'\n | 'yearViewDay'\n | 'yearViewWeek'\n | 'yearViewWeekNumber'\n | 'yearViewWeekdays'\n | 'yearViewWeekdaysCorner'\n | 'yearViewMonthCaption'\n | 'yearViewDayIndicators'\n | 'yearViewDayIndicator'\n | CombinedScheduleHeaderStylesNames;\n\nexport type YearViewCssVariables = {\n yearView: '--year-view-radius';\n};\n\nexport interface YearViewProps\n extends YearViewMonthSettings, BoxProps, StylesApiProps<YearViewFactory>, ElementProps<'div'> {\n __staticSelector?: string;\n\n /** Date to display, Date object or date string in `YYYY-MM-DD 00:00:00` format */\n date: Date | string;\n\n /** Called with the new date value when a date is selected */\n onDateChange?: (value: DateStringValue) => void;\n\n /** Events to display, must be a stable reference */\n events?: ScheduleEventData[];\n\n /** Key of `theme.radius` or any valid CSS value to set `border-radius` @default theme.defaultRadius */\n radius?: MantineRadius;\n\n /** If set, highlights the current day @default true */\n highlightToday?: boolean;\n\n /** If set, the header is displayed @default true */\n withHeader?: boolean;\n\n /** Props passed down to `MonthYearSelect` component in the header */\n monthYearSelectProps?: Partial<MonthYearSelectProps>;\n\n /** Called when view level select button is clicked */\n onViewChange?: (view: ScheduleViewLevel) => void;\n\n /** Props passed to previous month control */\n previousControlProps?: React.ComponentProps<'button'> & DataAttributes;\n\n /** Props passed to next month control */\n nextControlProps?: React.ComponentProps<'button'> & DataAttributes;\n\n /** Props passed to today control */\n todayControlProps?: React.ComponentProps<'button'> & DataAttributes;\n\n /** Props passed to view level select */\n viewSelectProps?: Partial<ViewSelectProps> & DataAttributes;\n\n /** Interaction mode: 'default' allows all interactions, 'static' disables event interactions @default default */\n mode?: ScheduleMode;\n\n /** Max number of generated recurring instances per recurring series @default 2000 */\n recurrenceExpansionLimit?: number;\n}\n\nexport type YearViewFactory = Factory<{\n props: YearViewProps;\n ref: HTMLDivElement;\n stylesNames: YearViewStylesNames;\n vars: YearViewCssVariables;\n}>;\n\nconst defaultProps = {\n __staticSelector: 'YearView',\n monthLabelFormat: 'MMMM',\n withWeekDays: true,\n withWeekendDays: true,\n highlightToday: true,\n withHeader: true,\n withOutsideDays: true,\n mode: 'default',\n} satisfies Partial<YearViewProps>;\n\nconst varsResolver = createVarsResolver<YearViewFactory>((_theme, { radius }) => ({\n yearView: { '--year-view-radius': radius !== undefined ? getRadius(radius) : undefined },\n}));\n\nexport const YearView = factory<YearViewFactory>((_props) => {\n const props = useProps('YearView', defaultProps, _props);\n const {\n // YearView props\n date,\n onDateChange,\n events,\n\n // YearViewMonth settings\n monthLabelFormat,\n withWeekNumbers,\n withWeekDays,\n locale,\n firstDayOfWeek,\n weekdayFormat,\n weekendDays,\n withWeekendDays,\n onMonthClick,\n onDayClick,\n onWeekNumberClick,\n getDayProps,\n getWeekNumberProps,\n highlightToday,\n labels,\n withOutsideDays,\n renderDay,\n\n // ScheduleHeader props\n withHeader,\n monthYearSelectProps,\n onViewChange,\n previousControlProps,\n nextControlProps,\n todayControlProps,\n viewSelectProps,\n\n // System props\n __staticSelector,\n classNames,\n className,\n style,\n styles,\n unstyled,\n vars,\n attributes,\n radius,\n mode,\n recurrenceExpansionLimit,\n ...others\n } = props;\n\n const ctx = useDatesContext();\n\n const getStyles = useStyles<YearViewFactory>({\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: 'yearView',\n });\n\n const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<YearViewFactory>({\n classNames,\n styles,\n props,\n });\n\n const stylesApiProps = {\n classNames: resolvedClassNames,\n styles: resolvedStyles,\n attributes,\n __staticSelector,\n radius,\n };\n\n const expandedEvents = expandRecurringEvents({\n events,\n rangeStart: dayjs(date).startOf('year').toDate(),\n rangeEnd: dayjs(date).endOf('year').toDate(),\n expansionLimit: recurrenceExpansionLimit,\n });\n\n const groupedEvents = getYearViewEvents({ date, events: expandedEvents });\n\n // [monthIndex][weekIndex][dayIndex]\n const daysRef = useRef<HTMLButtonElement[][][]>([]) as YearViewControlsRef;\n\n const resolvedFirstDayOfWeek = ctx.getFirstDayOfWeek(firstDayOfWeek);\n const resolvedWeekendDays = ctx.getWeekendDays(weekendDays);\n const hiddenColumns = getHiddenWeekendColumns({\n weekendDays: resolvedWeekendDays,\n firstDayOfWeek: resolvedFirstDayOfWeek,\n withWeekendDays,\n });\n const columnsCount = 7 - hiddenColumns.length;\n\n const getFirstDayIndex = (month: string): { weekIndex: number; dayIndex: number } | undefined => {\n const weeks = getMonthDays({\n month: dayjs(month).format('YYYY-MM-DD'),\n firstDayOfWeek: resolvedFirstDayOfWeek,\n consistentWeeks: true,\n });\n\n for (let weekIndex = 0; weekIndex < weeks.length; weekIndex++) {\n const week = getVisibleWeekDays({\n week: weeks[weekIndex],\n weekendDays: resolvedWeekendDays,\n withWeekendDays,\n });\n\n for (let dayIndex = 0; dayIndex < week.length; dayIndex++) {\n const dayDate = week[dayIndex];\n if (isSameMonth(dayDate, month)) {\n return { weekIndex, dayIndex };\n }\n }\n }\n\n return undefined;\n };\n\n let globalMonthIndex = 0;\n const months = getMonthsByQuarter(dayjs(date).format('YYYY-MM-DD'))\n .flat()\n .map((month) => {\n const currentMonthIndex = globalMonthIndex;\n globalMonthIndex++;\n\n return (\n <YearViewMonth\n key={month}\n month={month}\n getStyles={getStyles}\n monthLabelFormat={monthLabelFormat}\n withWeekNumbers={withWeekNumbers}\n withWeekDays={withWeekDays}\n locale={locale}\n firstDayOfWeek={firstDayOfWeek}\n weekdayFormat={\n weekdayFormat ||\n ((date) => dayjs(date).locale(ctx.getLocale(locale)).format('dd').slice(0, 1))\n }\n weekendDays={weekendDays}\n withWeekendDays={withWeekendDays}\n getDayProps={getDayProps}\n getWeekNumberProps={getWeekNumberProps}\n onMonthClick={onMonthClick}\n onDayClick={onDayClick}\n onWeekNumberClick={onWeekNumberClick}\n highlightToday={highlightToday}\n groupedEvents={groupedEvents}\n mode={mode}\n withOutsideDays={withOutsideDays}\n renderDay={renderDay}\n firstDayIndex={getFirstDayIndex(month)}\n __getDayRef={(weekIndex, dayIndex, node) => {\n if (!Array.isArray(daysRef.current[currentMonthIndex])) {\n daysRef.current[currentMonthIndex] = [];\n }\n if (!Array.isArray(daysRef.current[currentMonthIndex][weekIndex])) {\n daysRef.current[currentMonthIndex][weekIndex] = [];\n }\n daysRef.current[currentMonthIndex][weekIndex][dayIndex] = node;\n }}\n __onDayKeyDown={(event, payload) => {\n handleYearViewKeyDown({\n controlsRef: daysRef,\n monthIndex: currentMonthIndex,\n weekIndex: payload.weekIndex,\n dayIndex: payload.dayIndex,\n event,\n });\n }}\n />\n );\n });\n\n return (\n <Box\n {...getStyles('yearView')}\n mod={{ static: mode === 'static', 'without-weekend-days': hiddenColumns.length > 0 }}\n __vars={hiddenColumns.length > 0 ? { '--year-view-columns': `${columnsCount}` } : undefined}\n {...others}\n >\n {withHeader && (\n <ScheduleHeaderBase\n view=\"year\"\n navigationHandlers={{\n previous: () => toDateString(dayjs(date).subtract(1, 'year').startOf('year')),\n next: () => toDateString(dayjs(date).add(1, 'year').startOf('year')),\n today: () => toDateString(dayjs()),\n }}\n control={{\n monthYearSelect: {\n locale,\n withMonths: false,\n yearValue: dayjs(date).get('year'),\n monthValue: dayjs(date).get('month'),\n onYearChange: (year) =>\n onDateChange?.(toDateString(dayjs(date).set('year', year).startOf('year'))),\n ...monthYearSelectProps,\n },\n }}\n labels={labels}\n onDateChange={onDateChange}\n onViewChange={onViewChange}\n previousControlProps={previousControlProps}\n nextControlProps={nextControlProps}\n todayControlProps={todayControlProps}\n viewSelectProps={viewSelectProps}\n stylesApiProps={stylesApiProps}\n />\n )}\n\n <div {...getStyles('yearViewMonths')}>{months}</div>\n </Box>\n );\n});\n\nYearView.displayName = '@mantine/schedule/YearView';\nYearView.classes = classes;\nYearView.varsResolver = varsResolver;\n\nexport namespace YearView {\n export type Props = YearViewProps;\n export type Factory = YearViewFactory;\n export type StylesNames = YearViewStylesNames;\n export type CssVariables = YearViewCssVariables;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"YearViewMonth.mjs","names":[],"sources":["../../../src/components/YearView/YearViewMonth.tsx"],"sourcesContent":["import dayjs from 'dayjs';\nimport { Box, GetStylesApi, getThemeColor, UnstyledButton, useMantineTheme } from '@mantine/core';\nimport { useDatesContext } from '@mantine/dates';\nimport { ScheduleLabelsOverride } from '../../labels';\nimport {\n DateLabelFormat,\n DateStringValue,\n DayOfWeek,\n ScheduleEventData,\n ScheduleMode,\n} from '../../types';\nimport {\n formatDate,\n getMonthDays,\n getWeekdaysNames,\n getWeekNumber,\n isSameMonth,\n} from '../../utils';\nimport { getHiddenWeekendColumns, getVisibleWeekDays } from './get-visible-week-days';\nimport { GroupedEvents } from './get-year-view-events/get-year-view-events';\nimport type { YearViewFactory } from './YearView';\n\nexport type YearViewRenderDay = (\n date: DateStringValue,\n events: ScheduleEventData[]\n) => React.ReactNode;\n\nexport interface YearViewDayKeydownPayload {\n weekIndex: number;\n dayIndex: number;\n date: string;\n}\n\nexport interface YearViewMonthSettings {\n /** `dayjs` format for month label @default 'MMMM' */\n monthLabelFormat?: DateLabelFormat;\n\n /** If set, show week numbers */\n withWeekNumbers?: boolean;\n\n /** If set, weekdays names are displayed in the first row @default true */\n withWeekDays?: boolean;\n\n /** Locale passed down to dayjs, overrides value defined on `DatesProvider` */\n locale?: string;\n\n /** Number 0-6, where 0 – Sunday and 6 – Saturday @default 0 */\n firstDayOfWeek?: DayOfWeek;\n\n /** `dayjs` format for weekdays names @default 'd' */\n weekdayFormat?: DateLabelFormat;\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, weekend days are displayed. When `false`, weekend columns are hidden and the month grid shrinks. @default true */\n withWeekendDays?: boolean;\n\n /** Props passed down to the week number button */\n getWeekNumberProps?: (weekStartDate: DateStringValue) => Record<string, any>;\n\n /** Props passed down to the day button */\n getDayProps?: (date: DateStringValue) => Record<string, any>;\n\n /** Called when day is clicked */\n onDayClick?: (date: DateStringValue, event: React.MouseEvent<HTMLButtonElement>) => void;\n\n /** Called with first day of the week when week number is clicked */\n onWeekNumberClick?: (date: DateStringValue, event: React.MouseEvent<HTMLButtonElement>) => void;\n\n /** Called with the first day of the month when month label is clicked */\n onMonthClick?: (date: DateStringValue, event: React.MouseEvent<HTMLButtonElement>) => void;\n\n /** If set, highlights the current day @default true */\n highlightToday?: boolean;\n\n /** Labels override for i18n */\n labels?: ScheduleLabelsOverride;\n\n /** Interaction mode: 'default' allows all interactions, 'static' disables event interactions */\n mode?: ScheduleMode;\n\n /** If true, days from adjacent months are displayed @default true */\n withOutsideDays?: boolean;\n\n /**\n * A function to replace the entire content of a day cell, called with the day date\n * and the events grouped on that day – the same list that is used to render the default\n * indicators. When set, default event indicators are not rendered.\n */\n renderDay?: YearViewRenderDay;\n}\n\nexport interface YearViewMonthProps extends YearViewMonthSettings {\n /** Month to display, Date object or date string in `YYYY-MM-DD` format */\n month: Date | string;\n\n /** `useStyles` return value of `YearView` */\n getStyles: GetStylesApi<YearViewFactory>;\n\n /** Events grouped by date */\n groupedEvents?: GroupedEvents;\n\n /** Assigns ref of every day based on its position in the month, used for keyboard navigation */\n __getDayRef?: (weekIndex: number, dayIndex: number, node: HTMLButtonElement) => void;\n\n /** Called when any keydown event is registered on day, used for keyboard navigation */\n __onDayKeyDown?: (\n event: React.KeyboardEvent<HTMLButtonElement>,\n payload: YearViewDayKeydownPayload\n ) => void;\n\n /** Index of the first day of the month in the grid (for determining which day should be in tab order) */\n firstDayIndex?: { weekIndex: number; dayIndex: number };\n}\n\nexport function YearViewMonth({\n month,\n getStyles,\n monthLabelFormat = 'MMMM',\n withWeekNumbers,\n withWeekDays,\n locale,\n firstDayOfWeek,\n weekdayFormat,\n weekendDays,\n withWeekendDays,\n getDayProps,\n onDayClick,\n onWeekNumberClick,\n onMonthClick,\n getWeekNumberProps,\n highlightToday,\n groupedEvents,\n mode,\n withOutsideDays,\n renderDay,\n __getDayRef,\n __onDayKeyDown,\n firstDayIndex,\n}: YearViewMonthProps) {\n const ctx = useDatesContext();\n const theme = useMantineTheme();\n const today = dayjs();\n\n const resolvedFirstDayOfWeek = ctx.getFirstDayOfWeek(firstDayOfWeek);\n const resolvedWeekendDays = ctx.getWeekendDays(weekendDays);\n const hiddenColumns = new Set(\n getHiddenWeekendColumns({\n weekendDays: resolvedWeekendDays,\n firstDayOfWeek: resolvedFirstDayOfWeek,\n withWeekendDays,\n })\n );\n\n const weekdays = withWeekDays\n ? getWeekdaysNames({\n locale: ctx.getLocale(locale),\n format: weekdayFormat,\n firstDayOfWeek: resolvedFirstDayOfWeek,\n })\n .filter((_, index) => !hiddenColumns.has(index))\n .map((day, index) => (\n <div {...getStyles('yearViewWeekday')} key={index}>\n {day}\n </div>\n ))\n : null;\n\n const weeks = getMonthDays({\n month: dayjs(month).format('YYYY-MM-DD'),\n firstDayOfWeek: resolvedFirstDayOfWeek,\n consistentWeeks: true,\n }).map((week, weekIndex) => {\n const visibleDays = getVisibleWeekDays({\n week,\n weekendDays: resolvedWeekendDays,\n withWeekendDays,\n });\n\n const days = visibleDays.map((date, dayIndex) => {\n const outside = !isSameMonth(date, month);\n\n if (outside && !withOutsideDays) {\n return <div {...getStyles('yearViewDay')} data-day-placeholder key={date} />;\n }\n\n const weekend = resolvedWeekendDays.includes(dayjs(date).day() as DayOfWeek);\n const ariaLabel = dayjs(date)\n .locale(locale || ctx.locale)\n .format('MMMM D, YYYY');\n\n const dayProps = getDayProps?.(dayjs(date).format('YYYY-MM-DD')) || {};\n const isToday = dayjs(date).isSame(today, 'day') && highlightToday;\n const dayEvents = groupedEvents?.[dayjs(date).format('YYYY-MM-DD')] || [];\n\n // Determine if this day should be in the tab order\n // Only the first day of the month (not outside) should be focusable via tab\n const isFirstDayOfMonth =\n firstDayIndex &&\n weekIndex === firstDayIndex.weekIndex &&\n dayIndex === firstDayIndex.dayIndex;\n const isInTabOrder = mode !== 'static' && !outside && isFirstDayOfMonth;\n\n const dayContent =\n typeof renderDay === 'function' ? (\n renderDay(dayjs(date).format('YYYY-MM-DD'), dayEvents)\n ) : (\n <>\n {dayjs(date).format('D')}\n\n <div {...getStyles('yearViewDayIndicators')}>\n {dayEvents.slice(0, 3).map((event) => (\n <div\n {...getStyles('yearViewDayIndicator', {\n style: { backgroundColor: getThemeColor(event.color, theme) },\n })}\n key={event.id}\n />\n ))}\n </div>\n </>\n );\n\n return (\n <UnstyledButton\n aria-label={ariaLabel}\n {...dayProps}\n {...getStyles('yearViewDay', { className: dayProps.className, style: dayProps.style })}\n key={date}\n mod={[{ outside, weekend, today: isToday, static: mode === 'static' }, dayProps.mod]}\n tabIndex={isInTabOrder ? 0 : -1}\n ref={(node) => {\n if (node) {\n __getDayRef?.(weekIndex, dayIndex, node);\n }\n }}\n onKeyDown={(event) => {\n dayProps.onKeyDown?.(event);\n __onDayKeyDown?.(event, { weekIndex, dayIndex, date });\n }}\n onClick={\n mode === 'static'\n ? undefined\n : (event) => {\n onDayClick?.(dayjs(date).format('YYYY-MM-DD'), event);\n dayProps.onClick?.(event);\n }\n }\n >\n {dayContent}\n </UnstyledButton>\n );\n });\n\n const weekNumberProps = getWeekNumberProps?.(dayjs(week[0]).format('YYYY-MM-DD')) || {};\n const weekNumber = getWeekNumber(week);\n\n return (\n <div {...getStyles('yearViewWeek')} key={weekIndex}>\n {withWeekNumbers && (\n <UnstyledButton\n key={weekNumber}\n aria-label={`Week ${weekNumber}`}\n title={`Week ${weekNumber}`}\n {...weekNumberProps}\n onClick={\n mode === 'static'\n ? undefined\n : (event) => {\n onWeekNumberClick?.(dayjs(week[0]).format('YYYY-MM-DD'), event);\n weekNumberProps.onClick?.(event);\n }\n }\n mod={{ static: mode === 'static' }}\n tabIndex={mode === 'static' ? -1 : 0}\n {...getStyles('yearViewWeekNumber', {\n className: weekNumberProps.className,\n style: weekNumberProps.style,\n })}\n >\n {weekNumber}\n </UnstyledButton>\n )}\n\n {days}\n </div>\n );\n });\n\n return (\n <Box\n mod={[\n {\n 'with-week-numbers': withWeekNumbers,\n 'with-weekdays': withWeekDays,\n static: mode === 'static',\n },\n ]}\n {...getStyles('yearViewMonth')}\n >\n <UnstyledButton\n onClick={\n mode === 'static'\n ? undefined\n : (event) => onMonthClick?.(dayjs(month).startOf('month').format('YYYY-MM-DD'), event)\n }\n mod={{ static: mode === 'static' }}\n tabIndex={mode === 'static' ? -1 : 0}\n {...getStyles('yearViewMonthCaption')}\n >\n {formatDate({ locale: ctx.getLocale(locale), date: month, format: monthLabelFormat })}\n </UnstyledButton>\n\n {weekdays && (\n <div {...getStyles('yearViewWeekdays')}>\n {withWeekNumbers && <div {...getStyles('yearViewWeekdaysCorner')} />}\n {weekdays}\n </div>\n )}\n\n {weeks}\n </Box>\n );\n}\n"],"mappings":";;;;;;;;;;;;;AAoHA,SAAgB,cAAc,EAC5B,OACA,WACA,mBAAmB,QACnB,iBACA,cACA,QACA,gBACA,eACA,aACA,iBACA,aACA,YACA,mBACA,cACA,oBACA,gBACA,eACA,MACA,iBACA,WACA,aACA,gBACA,iBACqB;CACrB,MAAM,MAAM,gBAAgB;CAC5B,MAAM,QAAQ,gBAAgB;CAC9B,MAAM,QAAQ,MAAM;CAEpB,MAAM,yBAAyB,IAAI,kBAAkB,cAAc;CACnE,MAAM,sBAAsB,IAAI,eAAe,WAAW;CAC1D,MAAM,gBAAgB,IAAI,IACxB,wBAAwB;EACtB,aAAa;EACb,gBAAgB;EAChB;CACF,CAAC,CACH;CAEA,MAAM,WAAW,eACb,iBAAiB;EACf,QAAQ,IAAI,UAAU,MAAM;EAC5B,QAAQ;EACR,gBAAgB;CAClB,CAAC,CAAC,CACC,QAAQ,GAAG,UAAU,CAAC,cAAc,IAAI,KAAK,CAAC,CAAC,CAC/C,KAAK,KAAK,UACT,8BAAC,OAAD;EAAK,GAAI,UAAU,iBAAiB;EAAG,KAAK;CAEvC,GADF,GACE,CACN,IACH;CAEJ,MAAM,QAAQ,aAAa;EACzB,OAAO,MAAM,KAAK,CAAC,CAAC,OAAO,YAAY;EACvC,gBAAgB;EAChB,iBAAiB;CACnB,CAAC,CAAC,CAAC,KAAK,MAAM,cAAc;EAO1B,MAAM,OANc,mBAAmB;GACrC;GACA,aAAa;GACb;EACF,CAEuB,CAAC,CAAC,KAAK,MAAM,aAAa;GAC/C,MAAM,UAAU,CAAC,YAAY,MAAM,KAAK;GAExC,IAAI,WAAW,CAAC,iBACd,OAAO,8BAAC,OAAD;IAAK,GAAI,UAAU,aAAa;IAAG,wBAAA;IAAqB,KAAK;GAAO,CAAA;GAG7E,MAAM,UAAU,oBAAoB,SAAS,MAAM,IAAI,CAAC,CAAC,IAAI,CAAc;GAC3E,MAAM,YAAY,MAAM,IAAI,CAAC,CAC1B,OAAO,UAAU,IAAI,MAAM,CAAC,CAC5B,OAAO,cAAc;GAExB,MAAM,WAAW,cAAc,MAAM,IAAI,CAAC,CAAC,OAAO,YAAY,CAAC,KAAK,CAAC;GACrE,MAAM,UAAU,MAAM,IAAI,CAAC,CAAC,OAAO,OAAO,KAAK,KAAK;GACpD,MAAM,YAAY,gBAAgB,MAAM,IAAI,CAAC,CAAC,OAAO,YAAY,MAAM,CAAC;GAIxE,MAAM,oBACJ,iBACA,cAAc,cAAc,aAC5B,aAAa,cAAc;GAC7B,MAAM,eAAe,SAAS,YAAY,CAAC,WAAW;GAEtD,MAAM,aACJ,OAAO,cAAc,aACnB,UAAU,MAAM,IAAI,CAAC,CAAC,OAAO,YAAY,GAAG,SAAS,IAErD,qBAAA,UAAA,EAAA,UAAA,CACG,MAAM,IAAI,CAAC,CAAC,OAAO,GAAG,GAEvB,oBAAC,OAAD;IAAK,GAAI,UAAU,uBAAuB;cACvC,UAAU,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,UAC1B,8BAAC,OAAD;KACE,GAAI,UAAU,wBAAwB,EACpC,OAAO,EAAE,iBAAiB,cAAc,MAAM,OAAO,KAAK,EAAE,EAC9D,CAAC;KACD,KAAK,MAAM;IACZ,CAAA,CACF;GACE,CAAA,CACL,EAAA,CAAA;GAGN,OACE,8BAAC,gBAAD;IACE,cAAY;IACZ,GAAI;IACJ,GAAI,UAAU,eAAe;KAAE,WAAW,SAAS;KAAW,OAAO,SAAS;IAAM,CAAC;IACrF,KAAK;IACL,KAAK,CAAC;KAAE;KAAS;KAAS,OAAO;KAAS,QAAQ,SAAS;IAAS,GAAG,SAAS,GAAG;IACnF,UAAU,eAAe,IAAI;IAC7B,MAAM,SAAS;KACb,IAAI,MACF,cAAc,WAAW,UAAU,IAAI;IAE3C;IACA,YAAY,UAAU;KACpB,SAAS,YAAY,KAAK;KAC1B,iBAAiB,OAAO;MAAE;MAAW;MAAU;KAAK,CAAC;IACvD;IACA,SACE,SAAS,WACL,KAAA,KACC,UAAU;KACT,aAAa,MAAM,IAAI,CAAC,CAAC,OAAO,YAAY,GAAG,KAAK;KACpD,SAAS,UAAU,KAAK;IAC1B;GAIQ,GADb,UACa;EAEpB,CAAC;EAED,MAAM,kBAAkB,qBAAqB,MAAM,KAAK,EAAE,CAAC,CAAC,OAAO,YAAY,CAAC,KAAK,CAAC;EACtF,MAAM,aAAa,cAAc,IAAI;EAErC,OACE,8BAAC,OAAD;GAAK,GAAI,UAAU,cAAc;GAAG,KAAK;EA2BpC,GA1BF,mBACC,oBAAC,gBAAD;GAEE,cAAY,QAAQ;GACpB,OAAO,QAAQ;GACf,GAAI;GACJ,SACE,SAAS,WACL,KAAA,KACC,UAAU;IACT,oBAAoB,MAAM,KAAK,EAAE,CAAC,CAAC,OAAO,YAAY,GAAG,KAAK;IAC9D,gBAAgB,UAAU,KAAK;GACjC;GAEN,KAAK,EAAE,QAAQ,SAAS,SAAS;GACjC,UAAU,SAAS,WAAW,KAAK;GACnC,GAAI,UAAU,sBAAsB;IAClC,WAAW,gBAAgB;IAC3B,OAAO,gBAAgB;GACzB,CAAC;aAEA;EACa,GApBT,UAoBS,GAGjB,IACE;CAET,CAAC;CAED,OACE,qBAAC,KAAD;EACE,KAAK,CACH;GACE,qBAAqB;GACrB,iBAAiB;GACjB,QAAQ,SAAS;EACnB,CACF;EACA,GAAI,UAAU,eAAe;YAR/B;GAUE,oBAAC,gBAAD;IACE,SACE,SAAS,WACL,KAAA,KACC,UAAU,eAAe,MAAM,KAAK,CAAC,CAAC,QAAQ,OAAO,CAAC,CAAC,OAAO,YAAY,GAAG,KAAK;IAEzF,KAAK,EAAE,QAAQ,SAAS,SAAS;IACjC,UAAU,SAAS,WAAW,KAAK;IACnC,GAAI,UAAU,sBAAsB;cAEnC,WAAW;KAAE,QAAQ,IAAI,UAAU,MAAM;KAAG,MAAM;KAAO,QAAQ;IAAiB,CAAC;GACtE,CAAA;GAEf,YACC,qBAAC,OAAD;IAAK,GAAI,UAAU,kBAAkB;cAArC,CACG,mBAAmB,oBAAC,OAAD,EAAK,GAAI,UAAU,wBAAwB,EAAI,CAAA,GAClE,QACE;;GAGN;EACE;;AAET"}
1
+ {"version":3,"file":"YearViewMonth.mjs","names":[],"sources":["../../../src/components/YearView/YearViewMonth.tsx"],"sourcesContent":["import dayjs from 'dayjs';\nimport { Box, GetStylesApi, getThemeColor, UnstyledButton, useMantineTheme } from '@mantine/core';\nimport { useDatesContext } from '@mantine/dates';\nimport { ScheduleLabelsOverride } from '../../labels';\nimport {\n DateLabelFormat,\n DateStringValue,\n DayOfWeek,\n ScheduleEventData,\n ScheduleMode,\n} from '../../types';\nimport {\n formatDate,\n getMonthDays,\n getWeekdaysNames,\n getWeekNumber,\n isSameMonth,\n} from '../../utils';\nimport { getHiddenWeekendColumns, getVisibleWeekDays } from './get-visible-week-days';\nimport { GroupedEvents } from './get-year-view-events/get-year-view-events';\nimport type { YearViewFactory } from './YearView';\n\nexport type YearViewRenderDay = (\n date: DateStringValue,\n events: ScheduleEventData[]\n) => React.ReactNode;\n\nexport interface YearViewDayKeydownPayload {\n weekIndex: number;\n dayIndex: number;\n date: string;\n}\n\nexport interface YearViewMonthSettings {\n /** `dayjs` format for month label @default 'MMMM' */\n monthLabelFormat?: DateLabelFormat;\n\n /** If set, show week numbers */\n withWeekNumbers?: boolean;\n\n /** If set, weekdays names are displayed in the first row @default true */\n withWeekDays?: boolean;\n\n /** Locale passed down to dayjs, overrides value defined on `DatesProvider` */\n locale?: string;\n\n /** Number 0-6, where 0 – Sunday and 6 – Saturday @default 0 */\n firstDayOfWeek?: DayOfWeek;\n\n /** `dayjs` format for weekdays names @default 'd' */\n weekdayFormat?: DateLabelFormat;\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, weekend days are displayed. When `false`, weekend columns are hidden and the month grid shrinks. @default true */\n withWeekendDays?: boolean;\n\n /** Props passed down to the week number button */\n getWeekNumberProps?: (weekStartDate: DateStringValue) => Record<string, any>;\n\n /** Props passed down to the day button */\n getDayProps?: (date: DateStringValue) => Record<string, any>;\n\n /** Called when day is clicked */\n onDayClick?: (date: DateStringValue, event: React.MouseEvent<HTMLButtonElement>) => void;\n\n /** Called with first day of the week when week number is clicked */\n onWeekNumberClick?: (date: DateStringValue, event: React.MouseEvent<HTMLButtonElement>) => void;\n\n /** Called with the first day of the month when month label is clicked */\n onMonthClick?: (date: DateStringValue, event: React.MouseEvent<HTMLButtonElement>) => void;\n\n /** If set, highlights the current day @default true */\n highlightToday?: boolean;\n\n /** Labels override for i18n */\n labels?: ScheduleLabelsOverride;\n\n /** Interaction mode: 'default' allows all interactions, 'static' disables event interactions */\n mode?: ScheduleMode;\n\n /** If true, days from adjacent months are displayed @default true */\n withOutsideDays?: boolean;\n\n /**\n * A function to replace the entire content of a day cell, called with the day date\n * and the events grouped on that day – the same list that is used to render the default\n * indicators. When set, default event indicators are not rendered.\n */\n renderDay?: YearViewRenderDay;\n}\n\nexport interface YearViewMonthProps extends YearViewMonthSettings {\n /** Month to display, Date object or date string in `YYYY-MM-DD` format */\n month: Date | string;\n\n /** `useStyles` return value of `YearView` */\n getStyles: GetStylesApi<YearViewFactory>;\n\n /** Events grouped by date */\n groupedEvents?: GroupedEvents;\n\n /** Assigns ref of every day based on its position in the month, used for keyboard navigation */\n __getDayRef?: (weekIndex: number, dayIndex: number, node: HTMLButtonElement) => void;\n\n /** Called when any keydown event is registered on day, used for keyboard navigation */\n __onDayKeyDown?: (\n event: React.KeyboardEvent<HTMLButtonElement>,\n payload: YearViewDayKeydownPayload\n ) => void;\n\n /** Index of the first day of the month in the grid (for determining which day should be in tab order) */\n firstDayIndex?: { weekIndex: number; dayIndex: number };\n}\n\nexport function YearViewMonth({\n month,\n getStyles,\n monthLabelFormat = 'MMMM',\n withWeekNumbers,\n withWeekDays,\n locale,\n firstDayOfWeek,\n weekdayFormat,\n weekendDays,\n withWeekendDays,\n getDayProps,\n onDayClick,\n onWeekNumberClick,\n onMonthClick,\n getWeekNumberProps,\n highlightToday,\n groupedEvents,\n mode,\n withOutsideDays,\n renderDay,\n __getDayRef,\n __onDayKeyDown,\n firstDayIndex,\n}: YearViewMonthProps) {\n const ctx = useDatesContext();\n const theme = useMantineTheme();\n const today = dayjs();\n\n const resolvedFirstDayOfWeek = ctx.getFirstDayOfWeek(firstDayOfWeek);\n const resolvedWeekendDays = ctx.getWeekendDays(weekendDays);\n const hiddenColumns = new Set(\n getHiddenWeekendColumns({\n weekendDays: resolvedWeekendDays,\n firstDayOfWeek: resolvedFirstDayOfWeek,\n withWeekendDays,\n })\n );\n\n const weekdays = withWeekDays\n ? getWeekdaysNames({\n locale: ctx.getLocale(locale),\n format: weekdayFormat,\n firstDayOfWeek: resolvedFirstDayOfWeek,\n })\n .filter((_, index) => !hiddenColumns.has(index))\n .map((day, index) => (\n <div {...getStyles('yearViewWeekday')} key={index}>\n {day}\n </div>\n ))\n : null;\n\n const weeks = getMonthDays({\n month: dayjs(month).format('YYYY-MM-DD'),\n firstDayOfWeek: resolvedFirstDayOfWeek,\n consistentWeeks: true,\n }).map((week, weekIndex) => {\n const visibleDays = getVisibleWeekDays({\n week,\n weekendDays: resolvedWeekendDays,\n withWeekendDays,\n });\n\n const days = visibleDays.map((date, dayIndex) => {\n const outside = !isSameMonth(date, month);\n\n if (outside && !withOutsideDays) {\n return <div {...getStyles('yearViewDay')} data-day-placeholder key={date} />;\n }\n\n const weekend = resolvedWeekendDays.includes(dayjs(date).day() as DayOfWeek);\n const ariaLabel = dayjs(date)\n .locale(locale || ctx.locale)\n .format('MMMM D, YYYY');\n\n const dayProps = getDayProps?.(dayjs(date).format('YYYY-MM-DD')) || {};\n const isToday = dayjs(date).isSame(today, 'day') && highlightToday;\n const dayEvents = groupedEvents?.[dayjs(date).format('YYYY-MM-DD')] || [];\n\n // Determine if this day should be in the tab order\n // Only the first day of the month (not outside) should be focusable via tab\n const isFirstDayOfMonth =\n firstDayIndex &&\n weekIndex === firstDayIndex.weekIndex &&\n dayIndex === firstDayIndex.dayIndex;\n const isInTabOrder = mode !== 'static' && !outside && isFirstDayOfMonth;\n\n const dayContent =\n typeof renderDay === 'function' ? (\n renderDay(dayjs(date).format('YYYY-MM-DD'), dayEvents)\n ) : (\n <>\n {dayjs(date).format('D')}\n\n <div {...getStyles('yearViewDayIndicators')}>\n {dayEvents.slice(0, 3).map((event) => (\n <div\n {...getStyles('yearViewDayIndicator', {\n style: { backgroundColor: getThemeColor(event.color, theme) },\n })}\n key={event.id}\n />\n ))}\n </div>\n </>\n );\n\n return (\n <UnstyledButton\n aria-label={ariaLabel}\n {...dayProps}\n {...getStyles('yearViewDay', { className: dayProps.className, style: dayProps.style })}\n key={date}\n mod={[{ outside, weekend, today: isToday, static: mode === 'static' }, dayProps.mod]}\n tabIndex={isInTabOrder ? 0 : -1}\n ref={(node) => {\n if (node) {\n __getDayRef?.(weekIndex, dayIndex, node);\n }\n }}\n onKeyDown={(event) => {\n dayProps.onKeyDown?.(event);\n __onDayKeyDown?.(event, { weekIndex, dayIndex, date });\n }}\n onClick={\n mode === 'static'\n ? undefined\n : (event) => {\n onDayClick?.(dayjs(date).format('YYYY-MM-DD'), event);\n dayProps.onClick?.(event);\n }\n }\n >\n {dayContent}\n </UnstyledButton>\n );\n });\n\n const weekNumberProps = getWeekNumberProps?.(dayjs(week[0]).format('YYYY-MM-DD')) || {};\n const weekNumber = getWeekNumber(week);\n\n return (\n <div {...getStyles('yearViewWeek')} key={weekIndex}>\n {withWeekNumbers && (\n <UnstyledButton\n key={weekNumber}\n aria-label={`Week ${weekNumber}`}\n title={`Week ${weekNumber}`}\n {...weekNumberProps}\n onClick={\n mode === 'static'\n ? undefined\n : (event) => {\n onWeekNumberClick?.(dayjs(week[0]).format('YYYY-MM-DD'), event);\n weekNumberProps.onClick?.(event);\n }\n }\n mod={{ static: mode === 'static' }}\n tabIndex={mode === 'static' ? -1 : 0}\n {...getStyles('yearViewWeekNumber', {\n className: weekNumberProps.className,\n style: weekNumberProps.style,\n })}\n >\n {weekNumber}\n </UnstyledButton>\n )}\n\n {days}\n </div>\n );\n });\n\n return (\n <Box\n mod={[\n {\n 'with-week-numbers': withWeekNumbers,\n 'with-weekdays': withWeekDays,\n static: mode === 'static',\n },\n ]}\n {...getStyles('yearViewMonth')}\n >\n <UnstyledButton\n onClick={\n mode === 'static'\n ? undefined\n : (event) => onMonthClick?.(dayjs(month).startOf('month').format('YYYY-MM-DD'), event)\n }\n mod={{ static: mode === 'static' }}\n tabIndex={mode === 'static' ? -1 : 0}\n {...getStyles('yearViewMonthCaption')}\n >\n {formatDate({ locale: ctx.getLocale(locale), date: month, format: monthLabelFormat })}\n </UnstyledButton>\n\n {weekdays && (\n <div {...getStyles('yearViewWeekdays')}>\n {withWeekNumbers && <div {...getStyles('yearViewWeekdaysCorner')} />}\n {weekdays}\n </div>\n )}\n\n {weeks}\n </Box>\n );\n}\n"],"mappings":"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"}
@@ -17,9 +17,11 @@ function useDragDropHandlers(options) {
17
17
  const stableOnExternalDrop = useEffectEvent(onExternalDrop || (() => {}));
18
18
  const dragState = useDragState();
19
19
  const [dropTarget, setDropTarget] = useState(null);
20
+ const [dragPreview, setDragPreview] = useState(null);
20
21
  const handleDragEnd = useCallback(() => {
21
22
  dragState.endDrag();
22
23
  setDropTarget(null);
24
+ setDragPreview(null);
23
25
  stableOnEventDragEnd();
24
26
  }, [dragState]);
25
27
  const handleDragStart = useCallback((event) => {
@@ -50,8 +52,13 @@ function useDragDropHandlers(options) {
50
52
  onExternalDrop,
51
53
  handleDragEnd
52
54
  ]);
53
- const handleDragLeave = useCallback(() => {
55
+ const handleDragLeave = useCallback((event) => {
56
+ if (event?.currentTarget) {
57
+ const rect = event.currentTarget.getBoundingClientRect();
58
+ if (event.clientX >= rect.left && event.clientX < rect.right && event.clientY >= rect.top && event.clientY < rect.bottom) return;
59
+ }
54
60
  setDropTarget(null);
61
+ setDragPreview(null);
55
62
  }, []);
56
63
  const handleDrop = useCallback((event, target) => {
57
64
  event.preventDefault();
@@ -71,9 +78,11 @@ function useDragDropHandlers(options) {
71
78
  if (dragState.state.isDragging) handleDragEnd();
72
79
  stableOnExternalDrop(event, target);
73
80
  setDropTarget(null);
81
+ setDragPreview(null);
74
82
  return;
75
83
  }
76
84
  setDropTarget(null);
85
+ setDragPreview(null);
77
86
  }, [
78
87
  enabled,
79
88
  dragState.state,
@@ -112,7 +121,9 @@ function useDragDropHandlers(options) {
112
121
  handleDragLeave,
113
122
  handleDrop,
114
123
  isDraggableEvent,
115
- isDropTarget
124
+ isDropTarget,
125
+ dragPreview,
126
+ setDragPreview
116
127
  };
117
128
  }
118
129
  //#endregion