@mantine-vue/schedule 2.1.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 (104) hide show
  1. package/README.md +21 -0
  2. package/cjs/index.cjs +4198 -0
  3. package/cjs/index.cjs.map +1 -0
  4. package/esm/index.mjs +4106 -0
  5. package/esm/index.mjs.map +1 -0
  6. package/lib/component-props.d.ts +265 -0
  7. package/lib/components/CurrentTimeIndicator/CurrentTimeIndicator.d.ts +114 -0
  8. package/lib/components/CurrentTimeIndicator/index.d.ts +1 -0
  9. package/lib/components/DayView/DayView.d.ts +212 -0
  10. package/lib/components/DayView/get-day-view-events/get-day-positioned-events.d.ts +15 -0
  11. package/lib/components/DayView/get-day-view-events/get-day-view-events.d.ts +15 -0
  12. package/lib/components/DayView/index.d.ts +3 -0
  13. package/lib/components/DragContext/DragContext.d.ts +11 -0
  14. package/lib/components/DragContext/index.d.ts +1 -0
  15. package/lib/components/MobileMonthView/MobileMonthView.d.ts +171 -0
  16. package/lib/components/MobileMonthView/get-mobile-month-view-events.d.ts +8 -0
  17. package/lib/components/MobileMonthView/index.d.ts +1 -0
  18. package/lib/components/MonthView/MonthView.d.ts +174 -0
  19. package/lib/components/MonthView/get-month-view-events/add-event-to-day-groups.d.ts +14 -0
  20. package/lib/components/MonthView/get-month-view-events/calculate-event-position-in-week.d.ts +18 -0
  21. package/lib/components/MonthView/get-month-view-events/find-available-row.d.ts +10 -0
  22. package/lib/components/MonthView/get-month-view-events/get-month-positioned-events.d.ts +31 -0
  23. package/lib/components/MonthView/get-month-view-events/get-month-view-events.d.ts +16 -0
  24. package/lib/components/MonthView/get-month-view-events/get-weeks-in-range.d.ts +13 -0
  25. package/lib/components/MonthView/get-renderable-month-event-segments.d.ts +16 -0
  26. package/lib/components/MonthView/index.d.ts +4 -0
  27. package/lib/components/MoreEvents/MoreEvents.d.ts +65 -0
  28. package/lib/components/MoreEvents/index.d.ts +1 -0
  29. package/lib/components/Schedule/Schedule.d.ts +134 -0
  30. package/lib/components/Schedule/index.d.ts +1 -0
  31. package/lib/components/ScheduleEvent/ScheduleEvent.d.ts +88 -0
  32. package/lib/components/ScheduleEvent/index.d.ts +1 -0
  33. package/lib/components/ScheduleHeader/HeaderControl/index.d.ts +2 -0
  34. package/lib/components/ScheduleHeader/MonthYearSelect/index.d.ts +2 -0
  35. package/lib/components/ScheduleHeader/ScheduleHeader.d.ts +364 -0
  36. package/lib/components/ScheduleHeader/ScheduleHeaderBase.d.ts +72 -0
  37. package/lib/components/ScheduleHeader/ViewSelect/index.d.ts +2 -0
  38. package/lib/components/ScheduleHeader/index.d.ts +2 -0
  39. package/lib/components/WeekView/WeekView.d.ts +294 -0
  40. package/lib/components/WeekView/get-week-label/get-week-label.d.ts +13 -0
  41. package/lib/components/WeekView/get-week-view-events/assign-event-rows.d.ts +2 -0
  42. package/lib/components/WeekView/get-week-view-events/calculate-all-day-event-offset.d.ts +11 -0
  43. package/lib/components/WeekView/get-week-view-events/calculate-all-day-event-width.d.ts +12 -0
  44. package/lib/components/WeekView/get-week-view-events/calculate-event-days.d.ts +9 -0
  45. package/lib/components/WeekView/get-week-view-events/calculate-regular-event-overlaps.d.ts +2 -0
  46. package/lib/components/WeekView/get-week-view-events/filter-week-view-events.d.ts +14 -0
  47. package/lib/components/WeekView/get-week-view-events/find-available-column.d.ts +9 -0
  48. package/lib/components/WeekView/get-week-view-events/get-event-end-date.d.ts +3 -0
  49. package/lib/components/WeekView/get-week-view-events/get-hanging-status.d.ts +9 -0
  50. package/lib/components/WeekView/get-week-view-events/get-week-positioned-events.d.ts +26 -0
  51. package/lib/components/WeekView/get-week-view-events/get-week-view-events.d.ts +7 -0
  52. package/lib/components/WeekView/index.d.ts +4 -0
  53. package/lib/components/YearView/YearView.d.ts +151 -0
  54. package/lib/components/YearView/get-year-view-events/get-year-view-events.d.ts +8 -0
  55. package/lib/components/YearView/index.d.ts +1 -0
  56. package/lib/components/keyboard-navigation.d.ts +7 -0
  57. package/lib/components/shared.d.ts +161 -0
  58. package/lib/components/use-slot-drag-select.d.ts +28 -0
  59. package/lib/hooks/use-event-resize.d.ts +31 -0
  60. package/lib/index.d.mts +15 -0
  61. package/lib/index.d.ts +15 -0
  62. package/lib/labels.d.ts +25 -0
  63. package/lib/test-utils.d.ts +7 -0
  64. package/lib/types.d.ts +141 -0
  65. package/lib/utils/calculate-drop-time/calculate-drop-time.d.ts +22 -0
  66. package/lib/utils/calculate-month-drop-date/calculate-month-drop-date.d.ts +14 -0
  67. package/lib/utils/clamp-interval-minutes/clamp-interval-minutes.d.ts +2 -0
  68. package/lib/utils/expand-recurring-events/expand-recurring-events.d.ts +10 -0
  69. package/lib/utils/format-date/format-date.d.ts +8 -0
  70. package/lib/utils/get-business-hours-mod/get-business-hours-mod.d.ts +26 -0
  71. package/lib/utils/get-current-time-position/get-current-time-position.d.ts +10 -0
  72. package/lib/utils/get-day-position/get-day-position.d.ts +17 -0
  73. package/lib/utils/get-day-time-intervals/get-day-time-intervals.d.ts +19 -0
  74. package/lib/utils/get-end-of-week/get-end-of-week.d.ts +3 -0
  75. package/lib/utils/get-month-days/get-month-days.d.ts +8 -0
  76. package/lib/utils/get-month-range/get-month-range.d.ts +13 -0
  77. package/lib/utils/get-months-by-quarter/get-months-by-quarter.d.ts +2 -0
  78. package/lib/utils/get-months-list/get-months-list.d.ts +11 -0
  79. package/lib/utils/get-start-of-week/get-start-of-week.d.ts +7 -0
  80. package/lib/utils/get-visible-events/get-visible-events.d.ts +9 -0
  81. package/lib/utils/get-week-days/get-week-days.d.ts +13 -0
  82. package/lib/utils/get-week-number/get-week-number.d.ts +2 -0
  83. package/lib/utils/get-weekdays-names/get-weekdays-names.d.ts +9 -0
  84. package/lib/utils/get-years-list/get-years-list.d.ts +6 -0
  85. package/lib/utils/index.d.ts +41 -0
  86. package/lib/utils/is-after-min-date/is-after-min-date.d.ts +2 -0
  87. package/lib/utils/is-all-day-event/is-all-day-event.d.ts +7 -0
  88. package/lib/utils/is-before-max-date/is-before-max-date.d.ts +2 -0
  89. package/lib/utils/is-event-in-time-range/is-event-in-time-range.d.ts +8 -0
  90. package/lib/utils/is-events-overlap/is-events-overlap.d.ts +3 -0
  91. package/lib/utils/is-in-time-range/is-in-time-range.d.ts +9 -0
  92. package/lib/utils/is-multiday-event/is-multiday-event.d.ts +2 -0
  93. package/lib/utils/is-same-month/is-same-month.d.ts +2 -0
  94. package/lib/utils/is-within-week/is-within-week.d.ts +8 -0
  95. package/lib/utils/next-week/next-week.d.ts +2 -0
  96. package/lib/utils/parse-time-string/parse-time-string.d.ts +6 -0
  97. package/lib/utils/previous-week/previous-week.d.ts +2 -0
  98. package/lib/utils/sort-events/sort-events.d.ts +3 -0
  99. package/lib/utils/to-date-string/to-date-string.d.ts +2 -0
  100. package/lib/utils/to-time-string/to-time-string.d.ts +2 -0
  101. package/lib/utils/validate-event/validate-event.d.ts +2 -0
  102. package/package.json +53 -0
  103. package/styles.css +2087 -0
  104. package/styles.layer.css +2089 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/labels.ts","../src/utils/format-date/format-date.ts","../src/utils/get-weekdays-names/get-weekdays-names.ts","../src/utils/get-start-of-week/get-start-of-week.ts","../src/utils/get-end-of-week/get-end-of-week.ts","../src/utils/get-week-number/get-week-number.ts","../src/utils/get-month-days/get-month-days.ts","../src/utils/is-after-min-date/is-after-min-date.ts","../src/utils/is-before-max-date/is-before-max-date.ts","../src/utils/is-same-month/is-same-month.ts","../src/utils/get-months-by-quarter/get-months-by-quarter.ts","../src/utils/clamp-interval-minutes/clamp-interval-minutes.ts","../src/utils/parse-time-string/parse-time-string.ts","../src/utils/to-time-string/to-time-string.ts","../src/utils/get-day-time-intervals/get-day-time-intervals.ts","../src/utils/to-date-string/to-date-string.ts","../src/utils/get-week-days/get-week-days.ts","../src/utils/get-months-list/get-months-list.ts","../src/utils/get-years-list/get-years-list.ts","../src/utils/next-week/next-week.ts","../src/utils/previous-week/previous-week.ts","../src/utils/get-current-time-position/get-current-time-position.ts","../src/utils/is-in-time-range/is-in-time-range.ts","../src/utils/is-all-day-event/is-all-day-event.ts","../src/utils/validate-event/validate-event.ts","../src/utils/sort-events/sort-events.ts","../src/utils/is-events-overlap/is-events-overlap.ts","../src/utils/get-visible-events/get-visible-events.ts","../src/utils/is-multiday-event/is-multiday-event.ts","../src/utils/is-event-in-time-range/is-event-in-time-range.ts","../src/utils/is-within-week/is-within-week.ts","../src/utils/get-month-range/get-month-range.ts","../src/utils/get-day-position/get-day-position.ts","../src/utils/calculate-drop-time/calculate-drop-time.ts","../src/utils/calculate-month-drop-date/calculate-month-drop-date.ts","../src/utils/get-business-hours-mod/get-business-hours-mod.ts","../src/utils/expand-recurring-events/expand-recurring-events.ts","../src/hooks/use-event-resize.ts","../src/components/CurrentTimeIndicator/CurrentTimeIndicator.module.css","../src/components/CurrentTimeIndicator/CurrentTimeIndicator.ts","../src/components/ScheduleEvent/ScheduleEvent.module.css","../src/components/ScheduleEvent/ScheduleEvent.ts","../src/components/shared.ts","../src/components/MoreEvents/MoreEvents.module.css","../src/components/MoreEvents/MoreEvents.ts","../src/components/use-slot-drag-select.ts","../src/components/ScheduleHeader/ScheduleHeader.module.css","../src/components/ScheduleHeader/HeaderControl/HeaderControl.module.css","../src/components/ScheduleHeader/ViewSelect/ViewSelect.module.css","../src/components/ScheduleHeader/MonthYearSelect/MonthYearSelect.module.css","../src/components/ScheduleHeader/ScheduleHeader.ts","../src/components/ScheduleHeader/ScheduleHeaderBase.ts","../src/components/DayView/get-day-view-events/get-day-positioned-events.ts","../src/components/DayView/get-day-view-events/get-day-view-events.ts","../src/components/DayView/DayView.module.css","../src/components/DayView/DayView.ts","../src/components/MobileMonthView/get-mobile-month-view-events.ts","../src/components/MobileMonthView/MobileMonthView.module.css","../src/components/MobileMonthView/MobileMonthView.ts","../src/components/keyboard-navigation.ts","../src/components/MonthView/get-month-view-events/add-event-to-day-groups.ts","../src/components/MonthView/get-month-view-events/calculate-event-position-in-week.ts","../src/components/MonthView/get-month-view-events/find-available-row.ts","../src/components/MonthView/get-month-view-events/get-weeks-in-range.ts","../src/components/MonthView/get-month-view-events/get-month-positioned-events.ts","../src/components/MonthView/get-month-view-events/get-month-view-events.ts","../src/components/MonthView/get-renderable-month-event-segments.ts","../src/components/MonthView/MonthView.module.css","../src/components/MonthView/MonthView.ts","../src/components/WeekView/get-week-label/get-week-label.ts","../src/components/WeekView/get-week-view-events/filter-week-view-events.ts","../src/components/WeekView/get-week-view-events/assign-event-rows.ts","../src/components/WeekView/get-week-view-events/calculate-all-day-event-offset.ts","../src/components/WeekView/get-week-view-events/calculate-all-day-event-width.ts","../src/components/WeekView/get-week-view-events/calculate-event-days.ts","../src/components/WeekView/get-week-view-events/calculate-regular-event-overlaps.ts","../src/components/WeekView/get-week-view-events/find-available-column.ts","../src/components/WeekView/get-week-view-events/get-event-end-date.ts","../src/components/WeekView/get-week-view-events/get-hanging-status.ts","../src/components/WeekView/get-week-view-events/get-week-positioned-events.ts","../src/components/WeekView/get-week-view-events/get-week-view-events.ts","../src/components/WeekView/WeekView.module.css","../src/components/WeekView/WeekView.ts","../src/components/YearView/get-year-view-events/get-year-view-events.ts","../src/components/YearView/YearView.module.css","../src/components/YearView/YearView.ts","../src/components/Schedule/Schedule.module.css","../src/components/Schedule/Schedule.ts","../src/components/DragContext/DragContext.ts"],"sourcesContent":["export interface ScheduleLabels {\n day: string\n week: string\n month: string\n year: string\n allDay: string\n weekday: string\n timeSlot: string\n today: string\n next: string\n previous: string\n more: string\n selectMonth: string\n selectYear: string\n switchToDayView: string\n switchToWeekView: string\n switchToMonthView: string\n switchToYearView: string\n viewSelectLabel: string\n noEvents: string\n moreLabel: (hiddenEventsCount: number) => string\n}\n\nexport const DEFAULT_SCHEDULE_LABELS: ScheduleLabels = {\n today: 'Today',\n next: 'Next',\n previous: 'Previous',\n more: 'More',\n day: 'Day',\n week: 'Week',\n month: 'Month',\n year: 'Year',\n allDay: 'All day',\n weekday: 'Weekday',\n timeSlot: 'Time slot',\n selectMonth: 'Select month',\n selectYear: 'Select year',\n switchToDayView: 'Switch to day view',\n switchToWeekView: 'Switch to week view',\n switchToMonthView: 'Switch to month view',\n switchToYearView: 'Switch to year view',\n viewSelectLabel: 'Calendar view',\n noEvents: 'No events',\n moreLabel: (hiddenEventsCount: number) => `+${hiddenEventsCount} more`,\n}\n\nexport type ScheduleLabelsOverride = Partial<ScheduleLabels>\n\nexport function getLabel<K extends keyof ScheduleLabels>(\n key: K,\n override?: ScheduleLabelsOverride,\n): ScheduleLabels[K] {\n if (override) {\n return { ...DEFAULT_SCHEDULE_LABELS, ...override }[key]\n }\n\n return DEFAULT_SCHEDULE_LABELS[key]\n}\n","import dayjs from 'dayjs'\nimport { DateLabelFormat } from '../../types'\n\nexport interface FormatDateInput {\n locale: string\n date: string | Date | dayjs.Dayjs\n format: DateLabelFormat\n}\n\nexport function formatDate({ locale, date, format }: FormatDateInput) {\n if (typeof format === 'function') {\n return format(dayjs(date).format('YYYY-MM-DD HH:mm:ss'))\n }\n\n return dayjs(date).locale(locale).format(format)\n}\n","import dayjs from 'dayjs'\nimport type { VNodeChild } from 'vue'\nimport type { DateLabelFormat, DayOfWeek } from '../../types'\nimport { formatDate } from '../format-date/format-date'\n\ninterface GetWeekdaysNamesInput {\n locale: string\n format?: DateLabelFormat\n firstDayOfWeek?: DayOfWeek\n}\n\nexport function getWeekdaysNames({\n locale,\n format = 'dd',\n firstDayOfWeek = 1,\n}: GetWeekdaysNamesInput) {\n const baseDate = dayjs().day(firstDayOfWeek)\n const labels: VNodeChild[] = []\n\n for (let i = 0; i < 7; i += 1) {\n labels.push(formatDate({ locale, date: baseDate.add(i, 'days'), format }))\n }\n\n return labels\n}\n","import dayjs from 'dayjs'\nimport { AnyDateValue, DayOfWeek } from '../../types'\n\ninterface GetStartOfWeekInput {\n date: AnyDateValue\n firstDayOfWeek?: DayOfWeek\n}\n\nexport function getStartOfWeek({ date, firstDayOfWeek = 1 }: GetStartOfWeekInput) {\n let value = dayjs(date)\n\n while (value.day() !== firstDayOfWeek) {\n value = value.subtract(1, 'day')\n }\n\n return value.format('YYYY-MM-DD')\n}\n","import dayjs from 'dayjs'\nimport { AnyDateValue, DayOfWeek } from '../../types'\n\nexport function getEndOfWeek(date: AnyDateValue, firstDayOfWeek: DayOfWeek = 1) {\n let value = dayjs(date)\n\n if (!value.isValid()) {\n return value\n }\n\n const lastDayOfWeek = firstDayOfWeek === 0 ? 6 : firstDayOfWeek - 1\n while (value.day() !== lastDayOfWeek) {\n value = value.add(1, 'day')\n }\n\n return value.format('YYYY-MM-DD')\n}\n","import dayjs from 'dayjs'\nimport isoWeek from 'dayjs/plugin/isoWeek.js'\nimport { AnyDateValue } from '../../types'\n\ndayjs.extend(isoWeek)\n\nexport function getWeekNumber(week: AnyDateValue | AnyDateValue[]): number {\n if (Array.isArray(week)) {\n const monday = week.find((date) => dayjs(date).day() === 1)\n return dayjs(monday).isoWeek()\n }\n\n return dayjs(week).isoWeek()\n}\n","import dayjs from 'dayjs'\nimport { AnyDateValue, DateStringValue, DayOfWeek } from '../../types'\nimport { getEndOfWeek } from '../get-end-of-week/get-end-of-week'\nimport { getStartOfWeek } from '../get-start-of-week/get-start-of-week'\n\ninterface GetMonthDaysInput {\n month: AnyDateValue\n firstDayOfWeek: DayOfWeek | undefined\n consistentWeeks: boolean | undefined\n}\n\nexport function getMonthDays({\n month,\n firstDayOfWeek = 1,\n consistentWeeks,\n}: GetMonthDaysInput): DateStringValue[][] {\n const day = dayjs(month).subtract(dayjs(month).date() - 1, 'day')\n const start = dayjs(day.format('YYYY-MM-DD'))\n const startOfMonth = start.format('YYYY-MM-DD')\n const endOfMonth = start.add(+start.daysInMonth() - 1, 'day').format('YYYY-MM-DD')\n const endDate = getEndOfWeek(endOfMonth, firstDayOfWeek)\n const weeks: DateStringValue[][] = []\n\n let date = dayjs(getStartOfWeek({ date: startOfMonth, firstDayOfWeek }))\n\n while (dayjs(date).isBefore(endDate, 'day')) {\n const days: DateStringValue[] = []\n\n for (let i = 0; i < 7; i += 1) {\n days.push(date.format('YYYY-MM-DD 00:00:00'))\n date = date.add(1, 'day')\n }\n\n weeks.push(days)\n }\n\n if (consistentWeeks && weeks.length < 6) {\n const lastWeek = weeks[weeks.length - 1]\n const lastDay = lastWeek[lastWeek.length - 1]\n let nextDay = dayjs(lastDay).add(1, 'day')\n\n while (weeks.length < 6) {\n const days: DateStringValue[] = []\n\n for (let i = 0; i < 7; i += 1) {\n days.push(nextDay.format('YYYY-MM-DD 00:00:00'))\n nextDay = nextDay.add(1, 'day')\n }\n\n weeks.push(days)\n }\n }\n\n return weeks\n}\n","import dayjs from 'dayjs'\nimport { AnyDateValue } from '../../types'\n\nexport function isAfterMinDate(date: AnyDateValue, minDate: AnyDateValue | undefined) {\n return minDate ? dayjs(date).isAfter(dayjs(minDate).subtract(1, 'day'), 'day') : true\n}\n","import dayjs from 'dayjs'\nimport { AnyDateValue } from '../../types'\n\nexport function isBeforeMaxDate(date: AnyDateValue, maxDate: AnyDateValue | undefined) {\n return maxDate ? dayjs(date).isBefore(dayjs(maxDate).add(1, 'day'), 'day') : true\n}\n","import dayjs from 'dayjs'\nimport { AnyDateValue } from '../../types'\n\nexport function isSameMonth(date: AnyDateValue, comparison: AnyDateValue) {\n return dayjs(date).format('YYYY-MM') === dayjs(comparison).format('YYYY-MM')\n}\n","import dayjs from 'dayjs'\nimport { AnyDateValue, DateStringValue } from '../../types'\n\nexport function getMonthsByQuarter(year: AnyDateValue) {\n const startOfYear = dayjs(year).startOf('year').toDate()\n\n const results: DateStringValue[][] = [[], [], [], []]\n let currentMonthIndex = 0\n\n for (let i = 0; i < 4; i += 1) {\n for (let j = 0; j < 3; j += 1) {\n results[i].push(dayjs(startOfYear).add(currentMonthIndex, 'months').format('YYYY-MM-DD'))\n currentMonthIndex += 1\n }\n }\n\n return results\n}\n","/** Clamp interval minutes to valid values (1-60) and ensure it divides evenly into 60 */\nexport function clampIntervalMinutes(intervalMinutes: number): number {\n let clamped = Math.round(Math.max(1, Math.min(60, intervalMinutes)))\n clamped = 60 % clamped === 0 ? clamped : 60\n return clamped\n}\n","export interface ParsedTime {\n hours: number\n minutes: number\n seconds: number\n}\n\nexport function parseTimeString(time: string): ParsedTime {\n const [hours, minutes, seconds] = time.split(':').map(Number)\n return { hours, minutes, seconds: seconds || 0 }\n}\n","import { ParsedTime } from '../parse-time-string/parse-time-string'\n\nexport function toTimeString({ hours, minutes, seconds }: ParsedTime) {\n return `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`\n}\n","import { clampIntervalMinutes } from '../clamp-interval-minutes/clamp-interval-minutes'\nimport { parseTimeString } from '../parse-time-string/parse-time-string'\nimport { toTimeString } from '../to-time-string/to-time-string'\n\nexport interface DayTimeInterval {\n /** Start time of the interval in HH:mm:ss format */\n startTime: string\n\n /** End time of the interval in HH:mm:ss format */\n endTime: string\n\n /** Duration of the interval in seconds */\n duration: number\n\n /** Indicates if the interval starts at the beginning of an hour */\n isHourStart: boolean\n}\n\nexport interface GetDayTimeIntervalsInput {\n /** Start time in HH:mm:ss format */\n startTime: string\n\n /** End time in HH:mm:ss format, end of the day by default */\n endTime?: string\n\n /** Interval in minutes, 60 by default */\n intervalMinutes?: number\n}\n\nexport function getDayTimeIntervals({\n startTime,\n endTime,\n intervalMinutes: _intervalMinutes = 60,\n}: GetDayTimeIntervalsInput): DayTimeInterval[] {\n const intervalMinutes = clampIntervalMinutes(_intervalMinutes)\n\n const start = parseTimeString(startTime)\n const end = endTime ? parseTimeString(endTime) : { hours: 23, minutes: 59, seconds: 59 }\n\n const startSeconds = start.hours * 3600 + start.minutes * 60 + start.seconds\n const endSeconds = end.hours * 3600 + end.minutes * 60 + end.seconds\n const intervalSeconds = intervalMinutes * 60\n\n const intervals: DayTimeInterval[] = []\n let currentSeconds = startSeconds\n\n while (currentSeconds < endSeconds) {\n const intervalStartSeconds = currentSeconds\n let intervalEndSeconds = currentSeconds + intervalSeconds\n\n if (intervalEndSeconds > endSeconds) {\n intervalEndSeconds = endSeconds\n }\n\n const startHours = Math.floor(intervalStartSeconds / 3600)\n const startMinutes = Math.floor((intervalStartSeconds % 3600) / 60)\n const startSecs = intervalStartSeconds % 60\n\n const endHours = Math.floor(intervalEndSeconds / 3600)\n const endMinutes = Math.floor((intervalEndSeconds % 3600) / 60)\n const endSecs = intervalEndSeconds % 60\n\n const durationSeconds = intervalEndSeconds - intervalStartSeconds\n const isHourStart = startMinutes === 0 && startSecs === 0\n\n intervals.push({\n startTime: toTimeString({ hours: startHours, minutes: startMinutes, seconds: startSecs }),\n endTime: toTimeString({ hours: endHours, minutes: endMinutes, seconds: endSecs }),\n duration: durationSeconds,\n isHourStart,\n })\n\n currentSeconds = intervalEndSeconds\n }\n\n return intervals\n}\n","import dayjs from 'dayjs'\nimport { AnyDateValue, DateStringValue } from '../../types'\n\nexport function toDateString(date: AnyDateValue): DateStringValue {\n return dayjs(date).format('YYYY-MM-DD 00:00:00')\n}\n","import dayjs from 'dayjs'\nimport { AnyDateValue, DateStringValue, DayOfWeek } from '../../types'\nimport { getStartOfWeek } from '../get-start-of-week/get-start-of-week'\nimport { toDateString } from '../to-date-string/to-date-string'\n\nexport interface GetWeekDaysInput {\n /** Week to generate days for */\n week: AnyDateValue\n\n /** Indices of weekend days, 0-6, where 0 is Sunday and 6 is Saturday. The default value is defined by `DatesProvider`. */\n weekendDays?: DayOfWeek[]\n\n /** If set to false, weekend days are hidden @default true */\n withWeekendDays?: boolean\n\n /** Number 0-6, where 0 – Sunday and 6 – Saturday @default 1 */\n firstDayOfWeek?: DayOfWeek\n}\n\n/** Returns a list of days in a given week */\nexport function getWeekDays({\n week,\n weekendDays,\n withWeekendDays = true,\n firstDayOfWeek = 1,\n}: GetWeekDaysInput): DateStringValue[] {\n const days: DateStringValue[] = []\n\n let current = dayjs(getStartOfWeek({ date: week, firstDayOfWeek }))\n\n for (let i = 0; i < 7; i += 1) {\n const dayOfWeek = current.day()\n const isWeekend = weekendDays && weekendDays.includes(dayOfWeek as DayOfWeek)\n\n if (!isWeekend || withWeekendDays) {\n days.push(toDateString(current))\n }\n\n current = current.add(1, 'day')\n }\n\n return days\n}\n","import dayjs from 'dayjs'\nimport { DateLabelFormat } from '../../types'\nimport { formatDate } from '../format-date/format-date'\n\ninterface GetMonthsListInput {\n locale: string\n format: DateLabelFormat\n}\n\ninterface MonthData {\n month: number\n name: string\n}\n\nexport function getMonthsList({ locale, format }: GetMonthsListInput) {\n const months: MonthData[] = []\n const date = dayjs().locale(locale).startOf('year')\n\n for (let i = 0; i < 12; i++) {\n months.push({ month: i, name: formatDate({ date: date.add(i, 'month'), format, locale }) })\n }\n\n return months\n}\n","interface GetYearsListInput {\n startYear: number\n endYear: number\n}\n\nexport function getYearsList({ startYear, endYear }: GetYearsListInput) {\n const years: number[] = []\n\n for (let year = startYear; year <= endYear; year++) {\n years.push(year)\n }\n\n return years\n}\n","import dayjs from 'dayjs'\nimport { AnyDateValue, DateStringValue, DayOfWeek } from '../../types'\nimport { getStartOfWeek } from '../get-start-of-week/get-start-of-week'\nimport { toDateString } from '../to-date-string/to-date-string'\n\nexport function nextWeek(date: AnyDateValue, firstDayOfWeek: DayOfWeek): DateStringValue {\n const start = getStartOfWeek({ date, firstDayOfWeek })\n return toDateString(dayjs(start).set('date', dayjs(start).date() + 7))\n}\n","import dayjs from 'dayjs'\nimport { AnyDateValue, DateStringValue, DayOfWeek } from '../../types'\nimport { getStartOfWeek } from '../get-start-of-week/get-start-of-week'\nimport { toDateString } from '../to-date-string/to-date-string'\n\nexport function previousWeek(date: AnyDateValue, firstDayOfWeek: DayOfWeek): DateStringValue {\n const start = getStartOfWeek({ date, firstDayOfWeek })\n return toDateString(dayjs(start).set('date', dayjs(start).date() - 7))\n}\n","import dayjs from 'dayjs'\nimport { AnyDateValue } from '../../types'\nimport { clampIntervalMinutes } from '../clamp-interval-minutes/clamp-interval-minutes'\n\ninterface GetCurrentTimePositionInput {\n startTime?: string\n endTime?: string\n now?: AnyDateValue\n\n /** Number of minutes per time slot. Used to align the indicator to whole slots when `endTime` does not divide evenly. */\n intervalMinutes?: number\n}\n\nexport function getCurrentTimePosition(input?: GetCurrentTimePositionInput) {\n const now = dayjs(input?.now)\n\n if (!input?.startTime || !input?.endTime) {\n const startOf = now.startOf('date')\n const diffInMinutes = now.diff(startOf, 'minute')\n return (diffInMinutes / 1440) * 100\n }\n\n const [startHour, startMinute, startSecond = 0] = input.startTime.split(':').map(Number)\n const [endHour, endMinute, endSecond = 0] = input.endTime.split(':').map(Number)\n\n const startOfDay = now.startOf('date')\n const startDateTime = startOfDay.hour(startHour).minute(startMinute).second(startSecond)\n const endDateTime = startOfDay.hour(endHour).minute(endMinute).second(endSecond)\n\n const literalSeconds = endDateTime.diff(startDateTime, 'second')\n const intervalSeconds =\n input.intervalMinutes !== undefined\n ? clampIntervalMinutes(input.intervalMinutes) * 60\n : undefined\n const totalSeconds = intervalSeconds\n ? Math.ceil(literalSeconds / intervalSeconds) * intervalSeconds\n : literalSeconds\n const currentSeconds = now.diff(startDateTime, 'second')\n\n return (currentSeconds / totalSeconds) * 100\n}\n","import dayjs from 'dayjs'\nimport { AnyDateValue } from '../../types'\nimport { parseTimeString } from '../parse-time-string/parse-time-string'\n\ninterface IsInTimeRangeInput {\n date: AnyDateValue\n startTime?: string\n endTime?: string\n}\n\n/** Returns true if the given date's time is within the specified time range */\nexport function isInTimeRange({\n date,\n startTime = '00:00:00',\n endTime = '23:59:59',\n}: IsInTimeRangeInput) {\n const targetDate = dayjs(date)\n const parsedStartTime = parseTimeString(startTime)\n const parsedEndTime = parseTimeString(endTime)\n\n const startDateTime = targetDate\n .hour(parsedStartTime.hours)\n .minute(parsedStartTime.minutes)\n .second(parsedStartTime.seconds)\n\n const endDateTime = targetDate\n .hour(parsedEndTime.hours)\n .minute(parsedEndTime.minutes)\n .second(parsedEndTime.seconds)\n\n return targetDate.isAfter(startDateTime) && targetDate.isBefore(endDateTime)\n}\n","import dayjs from 'dayjs'\nimport { AnyDateValue, ScheduleEventData } from '../../types'\n\ninterface IsAllDayEventInput {\n event: ScheduleEventData\n date: AnyDateValue\n}\n\nexport function isAllDayEvent({ event, date }: IsAllDayEventInput) {\n const dayStart = dayjs(date).startOf('day')\n const nextDayStart = dayStart.add(1, 'day')\n const sameDayEnd = nextDayStart.subtract(1, 'second')\n const startTime = dayjs(event.start)\n const endTime = dayjs(event.end)\n\n return startTime.isSame(dayStart) && (endTime.isSame(nextDayStart) || endTime.isSame(sameDayEnd))\n}\n","import dayjs from 'dayjs'\nimport { ScheduleEventData } from '../../types'\n\nexport function validateEvent(eventData: ScheduleEventData) {\n if (!dayjs(eventData.start).isValid()) {\n throw new Error(`[@mantine/schedule] Invalid start date for event id: ${eventData.id}`)\n }\n\n if (!dayjs(eventData.end).isValid()) {\n throw new Error(`[@mantine/schedule] Invalid end date for event id: ${eventData.id}`)\n }\n\n if (dayjs(eventData.end).isBefore(dayjs(eventData.start))) {\n throw new Error(\n `[@mantine/schedule] Event end date is before start date for event id: ${eventData.id}`,\n )\n }\n\n return eventData\n}\n","import dayjs from 'dayjs'\nimport { ScheduleEventData } from '../../types'\n\n/** Sorts events by start time, then by duration (longer first) */\nexport function sortEvents<T extends ScheduleEventData>(events: T[]): T[] {\n return [...events].sort((a: T, b: T) => {\n const startDiff = dayjs(a.start).diff(dayjs(b.start))\n\n if (startDiff !== 0) {\n return startDiff\n }\n\n return dayjs(b.end).diff(dayjs(b.start)) - dayjs(a.end).diff(dayjs(a.start))\n })\n}\n","import dayjs from 'dayjs'\nimport { ScheduleEventData } from '../../types'\n\n/** Returns true if two events overlap in time */\nexport function isEventsOverlap(event1: ScheduleEventData, event2: ScheduleEventData) {\n const start1 = dayjs(event1.start).valueOf()\n const end1 = dayjs(event1.end).valueOf()\n const start2 = dayjs(event2.start).valueOf()\n const end2 = dayjs(event2.end).valueOf()\n return start1 < end2 && start2 < end1\n}\n","interface GetVisibleEventsInput {\n maxEvents: number\n totalEvents: number\n}\n\nexport function getVisibleEvents({ maxEvents, totalEvents }: GetVisibleEventsInput) {\n if (totalEvents <= maxEvents) {\n return {\n visibleEventsCount: totalEvents,\n hiddenEventsCount: 0,\n }\n }\n\n return {\n visibleEventsCount: maxEvents - 1,\n hiddenEventsCount: totalEvents - (maxEvents - 1),\n }\n}\n","import dayjs from 'dayjs'\nimport { ScheduleEventData } from '../../types'\n\nexport function isMultidayEvent(event: ScheduleEventData) {\n const startDate = dayjs(event.start).startOf('day')\n const rawEnd = dayjs(event.end)\n const endAtMidnight = rawEnd.hour() === 0 && rawEnd.minute() === 0 && rawEnd.second() === 0\n const endDate = endAtMidnight ? rawEnd.startOf('day').subtract(1, 'day') : rawEnd.startOf('day')\n return endDate.isAfter(startDate)\n}\n","import dayjs from 'dayjs'\nimport { ScheduleEventData } from '../../types'\nimport { isMultidayEvent } from '../is-multiday-event/is-multiday-event'\n\ninterface IsEventInTimeRangeInput {\n event: ScheduleEventData\n startTime?: string\n endTime?: string\n}\n\nfunction spansFullDay(event: ScheduleEventData) {\n const start = dayjs(event.start)\n const end = dayjs(event.end)\n if (!start.isSame(start.startOf('day'))) {\n return false\n }\n const nextDayStart = start.startOf('day').add(1, 'day')\n return end.isSame(nextDayStart) || end.isSame(nextDayStart.subtract(1, 'second'))\n}\n\nexport function isEventInTimeRange({ event, startTime, endTime }: IsEventInTimeRangeInput) {\n if (isMultidayEvent(event) || spansFullDay(event)) {\n return true\n }\n\n if (!startTime || !endTime) {\n return true\n }\n\n const [startHour, startMinute] = startTime.split(':').map(Number)\n const [endHour, endMinute] = endTime.split(':').map(Number)\n const timeWindowStartMinutes = startHour * 60 + startMinute\n const timeWindowEndMinutes = endHour * 60 + endMinute\n\n const eventStart = dayjs(event.start)\n const eventEnd = dayjs(event.end)\n const eventStartMinutes = eventStart.hour() * 60 + eventStart.minute()\n const eventEndMinutes = eventEnd.hour() * 60 + eventEnd.minute()\n\n return !(eventEndMinutes <= timeWindowStartMinutes || eventStartMinutes >= timeWindowEndMinutes)\n}\n","import dayjs from 'dayjs'\nimport { AnyDateValue, DayOfWeek, ScheduleEventData } from '../../types'\nimport { getStartOfWeek } from '../get-start-of-week/get-start-of-week'\n\ninterface IsWithinWeekInput {\n event: ScheduleEventData\n targetWeek: AnyDateValue\n firstDayOfWeek: DayOfWeek\n}\n\nexport function isWithinWeek({ event, targetWeek, firstDayOfWeek }: IsWithinWeekInput) {\n const startOfWeek = dayjs(getStartOfWeek({ date: targetWeek, firstDayOfWeek }))\n const endOfWeek = startOfWeek.add(7, 'day')\n return dayjs(event.start).isBefore(endOfWeek) && dayjs(event.end).isAfter(startOfWeek)\n}\n","import dayjs from 'dayjs'\nimport { AnyDateValue, DayOfWeek } from '../../types'\nimport { getMonthDays } from '../get-month-days/get-month-days'\nimport { toDateString } from '../to-date-string/to-date-string'\n\ninterface GetMonthRangeInput {\n month: AnyDateValue\n withOutsideDays: boolean | undefined\n consistentWeeks: boolean | undefined\n firstDayOfWeek: DayOfWeek\n}\n\n/** Returns start and end dates as displayed in MonthView */\nexport function getMonthRange({\n month,\n withOutsideDays,\n consistentWeeks,\n firstDayOfWeek,\n}: GetMonthRangeInput) {\n if (!withOutsideDays) {\n return {\n start: toDateString(dayjs(month).startOf('month')),\n end: toDateString(dayjs(month).endOf('month')),\n }\n }\n\n const days = getMonthDays({ month, firstDayOfWeek, consistentWeeks })\n\n return {\n start: days[0][0],\n end: days[days.length - 1][6],\n }\n}\n","import dayjs from 'dayjs'\nimport { ScheduleEventData } from '../../types'\nimport { clampIntervalMinutes } from '../clamp-interval-minutes/clamp-interval-minutes'\nimport { parseTimeString } from '../parse-time-string/parse-time-string'\n\ninterface GetDayPositionInput {\n /** Event data to calculate position for */\n event: ScheduleEventData\n\n /** Start time boundary for the day in HH:mm:ss format, `00:00:00` by default */\n startTime?: string\n\n /** End time boundary for the day in HH:mm:ss format, `23:59:59` by default */\n endTime?: string\n\n /** Number of minutes per time slot, `60` by default. Used to align the canvas to whole slots when `endTime` does not divide evenly. */\n intervalMinutes?: number\n}\n\n/** Calculates day position within given start and end time boundaries. Returns top and height in percentages. */\nexport function getDayPosition({\n event,\n startTime = '00:00:00',\n endTime = '23:59:59',\n intervalMinutes = 60,\n}: GetDayPositionInput) {\n const eventStart = dayjs(event.start)\n const eventEnd = dayjs(event.end)\n\n const parsedStartTime = parseTimeString(startTime)\n const parsedEndTime = parseTimeString(endTime)\n\n const startOfDay = eventStart.startOf('date')\n const boundaryStart = startOfDay\n .hour(parsedStartTime.hours)\n .minute(parsedStartTime.minutes)\n .second(parsedStartTime.seconds)\n const literalEnd = startOfDay\n .hour(parsedEndTime.hours)\n .minute(parsedEndTime.minutes)\n .second(parsedEndTime.seconds)\n\n const intervalSeconds = clampIntervalMinutes(intervalMinutes) * 60\n const literalRangeSeconds = literalEnd.diff(boundaryStart, 'second')\n const totalSeconds = Math.ceil(literalRangeSeconds / intervalSeconds) * intervalSeconds\n\n const clippedEventStart = eventStart.isBefore(boundaryStart) ? boundaryStart : eventStart\n const eventStartSeconds = clippedEventStart.diff(boundaryStart, 'second')\n\n const clippedEventEnd = eventEnd.isAfter(literalEnd) ? literalEnd : eventEnd\n const eventEndSeconds = clippedEventEnd.diff(boundaryStart, 'second')\n\n const startPercent = (eventStartSeconds / totalSeconds) * 100\n const endPercent = (eventEndSeconds / totalSeconds) * 100\n\n return {\n top: startPercent,\n height: endPercent - startPercent,\n }\n}\n","import dayjs from 'dayjs'\nimport { AnyDateValue, ScheduleEventData } from '../../types'\nimport { parseTimeString } from '../parse-time-string/parse-time-string'\n\nexport interface CalculateDropTimeInput {\n /** The event being dragged */\n draggedEvent: ScheduleEventData\n\n /** Target date where event will be dropped */\n targetDate: AnyDateValue\n\n /** Target time slot start time in HH:mm:ss format */\n targetSlotTime: string\n\n /** Mouse Y position relative to the slot */\n mouseYOffset?: number\n\n /** Height of one slot in pixels */\n slotHeight?: number\n\n /** Minutes per slot */\n intervalMinutes?: number\n}\n\nexport interface CalculateDropTimeResult {\n /** New start date/time for the event */\n start: Date\n\n /** New end date/time for the event */\n end: Date\n}\n\nexport function calculateDropTime({\n draggedEvent,\n targetDate,\n targetSlotTime,\n mouseYOffset = 0,\n slotHeight = 64,\n intervalMinutes = 15,\n}: CalculateDropTimeInput): CalculateDropTimeResult {\n const eventDuration = dayjs(draggedEvent.end).diff(dayjs(draggedEvent.start), 'millisecond')\n\n const parsedTime = parseTimeString(targetSlotTime)\n const targetDay = dayjs(targetDate).startOf('day')\n\n const baseTargetTime = targetDay.hour(parsedTime.hours).minute(parsedTime.minutes).second(0)\n\n let finalTargetTime = baseTargetTime\n\n if (mouseYOffset > 0 && slotHeight > 0) {\n const offsetRatio = mouseYOffset / slotHeight\n const offsetMinutes = Math.round(offsetRatio * intervalMinutes)\n finalTargetTime = baseTargetTime.add(offsetMinutes, 'minute')\n }\n\n const newStart = finalTargetTime.toDate()\n const newEnd = finalTargetTime.add(eventDuration, 'millisecond').toDate()\n\n return {\n start: newStart,\n end: newEnd,\n }\n}\n","import dayjs from 'dayjs'\nimport { DateStringValue, ScheduleEventData } from '../../types'\n\nexport interface CalculateMonthDropDateInput {\n /** The event being dragged */\n draggedEvent: ScheduleEventData\n\n /** The target day where the event is being dropped */\n targetDay: DateStringValue\n}\n\nexport interface CalculateMonthDropDateResult {\n /** New start date for the event */\n start: Date\n\n /** New end date for the event */\n end: Date\n}\n\nexport function calculateMonthDropDate({\n draggedEvent,\n targetDay,\n}: CalculateMonthDropDateInput): CalculateMonthDropDateResult {\n const eventDuration = dayjs(draggedEvent.end).diff(dayjs(draggedEvent.start), 'millisecond')\n\n const originalStartTime = dayjs(draggedEvent.start)\n const targetDayStart = dayjs(targetDay).startOf('day')\n\n const newStart = targetDayStart\n .hour(originalStartTime.hour())\n .minute(originalStartTime.minute())\n .second(originalStartTime.second())\n .millisecond(originalStartTime.millisecond())\n\n const newEnd = newStart.add(eventDuration, 'millisecond')\n\n return {\n start: newStart.toDate(),\n end: newEnd.toDate(),\n }\n}\n","import { DayOfWeek } from '../../types'\n\n/** Business hours range in `HH:mm:ss` format */\nexport type BusinessHoursRange = [string, string]\n\n/** Per-day business hours map keyed by day of the week (0 – Sunday, 6 – Saturday). `null` marks a day as fully outside business hours. */\nexport type BusinessHoursPerDay = Partial<Record<DayOfWeek, BusinessHoursRange | null>>\n\n/** Business hours value – tuple applies to every day, record configures business hours per day */\nexport type BusinessHoursValue = BusinessHoursRange | BusinessHoursPerDay\n\nexport interface GetBusinessHoursModInput {\n time: string\n businessHours?: BusinessHoursValue\n highlightBusinessHours?: boolean\n dayOfWeek?: DayOfWeek\n}\n\nexport interface BusinessHoursMod {\n 'business-hours': boolean\n 'non-business-hours': boolean\n}\n\nfunction isBusinessHoursRange(value: BusinessHoursValue): value is BusinessHoursRange {\n return (\n Array.isArray(value) &&\n value.length === 2 &&\n typeof value[0] === 'string' &&\n typeof value[1] === 'string'\n )\n}\n\n/**\n * Determines if a given time is within business hours and returns modifier object\n * @param time - Time string in HH:mm:ss format\n * @param businessHours - Tuple of [start, end] times in HH:mm:ss format, or per-day record keyed by day of the week\n * @param highlightBusinessHours - Whether to highlight business hours\n * @param dayOfWeek - Day of the week (0 – Sunday, 6 – Saturday), used to resolve per-day business hours\n * @returns Modifier object for styling business/non-business hours\n */\nexport function getBusinessHoursMod({\n time,\n businessHours,\n highlightBusinessHours,\n dayOfWeek,\n}: GetBusinessHoursModInput): BusinessHoursMod {\n if (!highlightBusinessHours || !businessHours) {\n return {\n 'business-hours': false,\n 'non-business-hours': false,\n }\n }\n\n let range: [string, string] | null\n if (isBusinessHoursRange(businessHours)) {\n range = businessHours\n } else {\n if (dayOfWeek === undefined) {\n return {\n 'business-hours': false,\n 'non-business-hours': false,\n }\n }\n range = businessHours[dayOfWeek] ?? null\n }\n\n if (!range) {\n return {\n 'business-hours': false,\n 'non-business-hours': true,\n }\n }\n\n const [start, end] = range\n const isInBusinessHours = time >= start && time < end\n\n return {\n 'business-hours': isInBusinessHours,\n 'non-business-hours': !isInBusinessHours,\n }\n}\n","import dayjs from 'dayjs'\nimport * as rruleAll from 'rrule'\n\nfunction resolveRRule(ns: Record<string, unknown>): typeof rruleAll.RRule {\n const interop = (ns.default ?? ns) as typeof rruleAll\n return interop.RRule\n}\nconst RRule = resolveRRule(rruleAll as unknown as Record<string, unknown>)\nimport { DateTimeStringValue, ScheduleEventData, ScheduleRecurrenceData } from '../../types'\nimport { validateEvent } from '../validate-event/validate-event'\n\ninterface ExpandRecurringEventsInput {\n events: ScheduleEventData[] | undefined\n rangeStart: Date | string\n rangeEnd: Date | string\n expansionLimit?: number\n}\n\nfunction getRecurrenceKey(recurringEventId: string | number, recurrenceId: DateTimeStringValue) {\n return `${recurringEventId}::${recurrenceId}`\n}\n\nfunction overlapsRange(\n eventStart: dayjs.Dayjs,\n eventEnd: dayjs.Dayjs,\n rangeStart: dayjs.Dayjs,\n rangeEnd: dayjs.Dayjs,\n) {\n return (\n (eventEnd.isAfter(rangeStart) || eventEnd.isSame(rangeStart)) &&\n (eventStart.isBefore(rangeEnd) || eventStart.isSame(rangeEnd))\n )\n}\n\nfunction getExdateSet(recurrence: ScheduleRecurrenceData | undefined) {\n if (!recurrence?.exdate) {\n return new Set<string>()\n }\n\n const values = recurrence.exdate\n .map((value) => dayjs(value))\n .filter((value) => value.isValid())\n .map((value) => value.format('YYYY-MM-DD HH:mm:ss'))\n\n return new Set(values)\n}\n\nfunction getRRuleString(rule: string) {\n const normalized = rule.trim()\n if (!normalized.includes('\\n')) {\n return normalized.startsWith('RRULE:') ? normalized.replace(/^RRULE:/, '') : normalized\n }\n\n const rruleLine = normalized\n .split('\\n')\n .map((line) => line.trim())\n .find((line) => line.startsWith('RRULE:'))\n\n return rruleLine ? rruleLine.replace(/^RRULE:/, '') : normalized\n}\n\nfunction getOccurrenceStartsInRange(\n event: ScheduleEventData,\n rangeStart: dayjs.Dayjs,\n rangeEnd: dayjs.Dayjs,\n expansionLimit: number,\n durationMs: number,\n) {\n const dtstart = dayjs(event.recurrence?.dtstart || event.start)\n if (!dtstart.isValid() || !event.recurrence) {\n return []\n }\n\n try {\n const options = RRule.parseString(getRRuleString(event.recurrence.rrule))\n options.dtstart = dtstart.toDate()\n const rule = new RRule(options)\n\n const searchStart = rangeStart.subtract(Math.max(0, durationMs), 'millisecond').toDate()\n const results = rule.between(searchStart, rangeEnd.toDate(), true)\n return results.slice(0, expansionLimit).map((value) => dayjs(value))\n } catch {\n return []\n }\n}\n\nfunction isEventInRange(event: ScheduleEventData, rangeStart: dayjs.Dayjs, rangeEnd: dayjs.Dayjs) {\n const start = dayjs(event.start)\n const end = dayjs(event.end)\n\n if (!start.isValid() || !end.isValid()) {\n return false\n }\n\n return overlapsRange(start, end, rangeStart, rangeEnd)\n}\n\nfunction createGeneratedInstance(\n event: ScheduleEventData,\n occurrenceStart: dayjs.Dayjs,\n durationMs: number,\n): ScheduleEventData {\n const occurrenceEnd = occurrenceStart.add(durationMs, 'millisecond')\n const recurrenceId = occurrenceStart.format('YYYY-MM-DD HH:mm:ss')\n const { recurrence: _recurrence, ...eventWithoutRecurrence } = event\n\n return {\n ...eventWithoutRecurrence,\n id: `${event.id}::${recurrenceId}`,\n start: occurrenceStart.format('YYYY-MM-DD HH:mm:ss'),\n end: occurrenceEnd.format('YYYY-MM-DD HH:mm:ss'),\n recurringEventId: event.id,\n recurrenceId,\n recurringInstance: {\n isRecurringInstance: true,\n recurringEventId: event.id,\n recurrenceId,\n originalStart: occurrenceStart.format('YYYY-MM-DD HH:mm:ss'),\n originalEnd: occurrenceEnd.format('YYYY-MM-DD HH:mm:ss'),\n },\n }\n}\n\nconst DEFAULT_EXPANSION_LIMIT = 2000\n\nexport function expandRecurringEvents({\n events,\n rangeStart,\n rangeEnd,\n expansionLimit = DEFAULT_EXPANSION_LIMIT,\n}: ExpandRecurringEventsInput): ScheduleEventData[] {\n if (!events || events.length === 0) {\n return []\n }\n\n const start = dayjs(rangeStart)\n const end = dayjs(rangeEnd)\n\n if (!start.isValid() || !end.isValid()) {\n return []\n }\n\n const regularEvents: ScheduleEventData[] = []\n const recurringEvents: ScheduleEventData[] = []\n const overrides = new Map<string, ScheduleEventData>()\n\n for (const event of events) {\n if (event.recurringEventId && event.recurrenceId) {\n overrides.set(getRecurrenceKey(event.recurringEventId, event.recurrenceId), event)\n continue\n }\n\n if (event.recurrence?.rrule) {\n recurringEvents.push(event)\n continue\n }\n\n regularEvents.push(event)\n }\n\n const output: ScheduleEventData[] = []\n const consumedOverrideIds = new Set<string | number>()\n\n for (const event of regularEvents) {\n if (isEventInRange(event, start, end)) {\n output.push(validateEvent(event))\n }\n }\n\n for (const event of recurringEvents) {\n const eventStart = dayjs(event.recurrence?.dtstart || event.start)\n const eventEnd = dayjs(event.end)\n\n if (!eventStart.isValid() || !eventEnd.isValid()) {\n continue\n }\n\n const durationMs = eventEnd.diff(dayjs(event.start), 'millisecond')\n if (durationMs < 0) {\n continue\n }\n\n const exdate = getExdateSet(event.recurrence)\n const starts = getOccurrenceStartsInRange(event, start, end, expansionLimit, durationMs)\n\n for (const occurrenceStart of starts) {\n const recurrenceId = occurrenceStart.format('YYYY-MM-DD HH:mm:ss')\n if (exdate.has(recurrenceId)) {\n continue\n }\n\n const overrideKey = getRecurrenceKey(event.id, recurrenceId)\n const override = overrides.get(overrideKey)\n if (override) {\n if (isEventInRange(override, start, end)) {\n output.push(validateEvent(override))\n consumedOverrideIds.add(override.id)\n }\n continue\n }\n\n const generated = createGeneratedInstance(event, occurrenceStart, durationMs)\n if (overlapsRange(dayjs(generated.start), dayjs(generated.end), start, end)) {\n output.push(validateEvent(generated))\n }\n }\n }\n\n for (const override of overrides.values()) {\n if (consumedOverrideIds.has(override.id)) {\n continue\n }\n if (isEventInRange(override, start, end)) {\n output.push(validateEvent(override))\n }\n }\n\n return output\n}\n\nexport { DEFAULT_EXPANSION_LIMIT }\n","import dayjs from 'dayjs'\nimport { onBeforeUnmount, ref } from 'vue'\nimport type { EventDropData } from '../component-props'\nimport type { DateTimeStringValue, ScheduleEventData, ScheduleMode } from '../types'\nimport { clampIntervalMinutes, parseTimeString } from '../utils'\n\ntype ResizeEdge = 'top' | 'bottom'\n\ninterface ResizeState {\n eventId: string | number\n event: ScheduleEventData\n edge: ResizeEdge\n container: HTMLElement\n originalTop: number\n originalHeight: number\n currentTop: number\n currentHeight: number\n eventDate: string\n originalStart: DateTimeStringValue\n originalEnd: DateTimeStringValue\n startMinutes: number\n literalRange: number\n totalMinutes: number\n intervalMinutes: number\n minHeightPercent: number\n}\n\ninterface HandleResizeStartInput {\n event: ScheduleEventData\n edge: ResizeEdge\n container: HTMLElement\n originalTop: number\n originalHeight: number\n eventDate: string\n pointerEvent: PointerEvent\n}\n\nexport interface UseEventResizeInput {\n enabled: () => boolean\n mode: () => ScheduleMode\n startTime: () => string\n endTime: () => string\n intervalMinutes: () => number\n onEventResize: () => ((data: EventDropData) => void) | undefined\n canResizeEvent: () => ((event: ScheduleEventData) => boolean) | undefined\n}\n\nexport function useEventResize(input: UseEventResizeInput) {\n const resizeState = ref<ResizeState | null>(null)\n let justResized = false\n let savedUserSelect: string | null = null\n\n const clampAndSnap = (minutes: number, state: ResizeState): number => {\n const snapped = Math.round(minutes / state.intervalMinutes) * state.intervalMinutes\n return Math.max(0, Math.min(state.literalRange, snapped))\n }\n\n const snapPercent = (percent: number, state: ResizeState): number => {\n const minutes = (percent / 100) * state.totalMinutes\n return (clampAndSnap(minutes, state) / state.totalMinutes) * 100\n }\n\n const percentToDateTime = (\n percent: number,\n eventDate: string,\n state: ResizeState,\n ): DateTimeStringValue => {\n const minutes = (percent / 100) * state.totalMinutes\n const totalMinutes = state.startMinutes + clampAndSnap(minutes, state)\n const hours = Math.floor(totalMinutes / 60)\n const mins = totalMinutes % 60\n return `${eventDate} ${String(hours).padStart(2, '0')}:${String(mins).padStart(2, '0')}:00`\n }\n\n const handlePointerMove = (event: PointerEvent) => {\n const state = resizeState.value\n if (!state) return\n\n const containerRect = state.container.getBoundingClientRect()\n if (containerRect.height === 0) return\n\n const relativeY = event.clientY - containerRect.top\n const rawPercent = Math.max(0, Math.min(100, (relativeY / containerRect.height) * 100))\n const snappedPercent = snapPercent(rawPercent, state)\n let currentTop = state.originalTop\n let currentHeight = state.originalHeight\n\n if (state.edge === 'bottom') {\n currentHeight = Math.max(state.minHeightPercent, snappedPercent - state.originalTop)\n } else {\n const originalBottom = state.originalTop + state.originalHeight\n currentTop = Math.min(snappedPercent, originalBottom - state.minHeightPercent)\n currentHeight = originalBottom - currentTop\n }\n\n resizeState.value = { ...state, currentTop, currentHeight }\n }\n\n const removeDocumentListeners = () => {\n document.removeEventListener('pointermove', handlePointerMove)\n document.removeEventListener('pointerup', handlePointerUp)\n if (savedUserSelect !== null) {\n document.body.style.userSelect = savedUserSelect\n savedUserSelect = null\n }\n }\n\n const handlePointerUp = () => {\n const state = resizeState.value\n if (\n state &&\n (state.currentTop !== state.originalTop || state.currentHeight !== state.originalHeight)\n ) {\n const newStart =\n state.edge === 'top'\n ? percentToDateTime(state.currentTop, state.eventDate, state)\n : state.originalStart\n const newEnd =\n state.edge === 'bottom'\n ? percentToDateTime(state.currentTop + state.currentHeight, state.eventDate, state)\n : state.originalEnd\n\n input.onEventResize()?.({ eventId: state.eventId, newStart, newEnd, event: state.event })\n }\n\n resizeState.value = null\n removeDocumentListeners()\n justResized = true\n requestAnimationFrame(() => {\n justResized = false\n })\n }\n\n const handleResizeStart = ({\n event,\n edge,\n container,\n originalTop,\n originalHeight,\n eventDate,\n pointerEvent,\n }: HandleResizeStartInput) => {\n if (!input.enabled() || input.mode() === 'static') return\n\n pointerEvent.preventDefault()\n pointerEvent.stopPropagation()\n\n const parsedStartTime = parseTimeString(input.startTime())\n const parsedEndTime = parseTimeString(input.endTime())\n const startMinutes = parsedStartTime.hours * 60 + parsedStartTime.minutes\n const endMinutes = parsedEndTime.hours * 60 + parsedEndTime.minutes\n const intervalMinutes = clampIntervalMinutes(input.intervalMinutes())\n const literalRange = endMinutes - startMinutes\n const totalMinutes = Math.ceil(literalRange / intervalMinutes) * intervalMinutes\n\n resizeState.value = {\n eventId: event.id,\n event,\n edge,\n container,\n originalTop,\n originalHeight,\n currentTop: originalTop,\n currentHeight: originalHeight,\n eventDate,\n originalStart: dayjs(event.start).format('YYYY-MM-DD HH:mm:ss'),\n originalEnd: dayjs(event.end).format('YYYY-MM-DD HH:mm:ss'),\n startMinutes,\n literalRange,\n totalMinutes,\n intervalMinutes,\n minHeightPercent: (intervalMinutes / totalMinutes) * 100,\n }\n\n savedUserSelect = document.body.style.userSelect\n document.body.style.userSelect = 'none'\n document.addEventListener('pointermove', handlePointerMove)\n document.addEventListener('pointerup', handlePointerUp)\n }\n\n const getResizePosition = (eventId: string | number) => {\n const state = resizeState.value\n return state?.eventId === eventId\n ? { top: state.currentTop, height: state.currentHeight }\n : null\n }\n\n const isResizableEvent = (event: ScheduleEventData): boolean =>\n input.enabled() &&\n input.mode() !== 'static' &&\n event.display !== 'background' &&\n (input.canResizeEvent()?.(event) ?? true)\n\n onBeforeUnmount(removeDocumentListeners)\n\n return {\n handleResizeStart,\n getResizePosition,\n isResizableEvent,\n wasResizing: () => justResized,\n }\n}\n",".currentTimeIndicator {\n --time-bubble-height: 18px;\n --thumb-size: 12px;\n --_indicator-color: var(--indicator-color, var(--mantine-color-red-7));\n\n position: absolute;\n pointer-events: none;\n left: 0;\n right: 0;\n top: var(--top-offset);\n height: 2px;\n z-index: 2;\n\n &::before {\n content: '';\n position: absolute;\n inset: 0;\n background-color: var(--_indicator-color);\n opacity: 0.2;\n }\n}\n\n.currentTimeIndicatorLine {\n height: 100%;\n position: absolute;\n top: 0;\n background-color: var(--_indicator-color);\n inset-inline-start: var(--start-offset);\n inset-inline-end: var(--end-offset);\n}\n\n.currentTimeIndicatorThumb {\n position: absolute;\n top: calc(-1 * (var(--thumb-size) / 2 - 1px));\n width: var(--thumb-size);\n height: var(--thumb-size);\n border-radius: 50%;\n border: 1px solid var(--mantine-color-body);\n background-color: var(--_indicator-color);\n inset-inline-start: calc(var(--start-offset) - (var(--thumb-size) / 2 - 1px));\n}\n\n.currentTimeIndicatorTimeBubble {\n position: absolute;\n height: var(--time-bubble-height);\n width: var(--time-bubble-width);\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 1000px;\n background-color: var(--_indicator-color);\n color: var(--mantine-color-white);\n font-size: var(--mantine-font-size-xs);\n font-weight: var(--mantine-font-weight-bold);\n box-shadow: var(--mantine-shadow-sm);\n white-space: nowrap;\n font-variant-numeric: tabular-nums;\n inset-inline-start: var(--time-bubble-start-offset);\n top: calc(-1 * (var(--time-bubble-height) / 2 - 1px));\n z-index: 2;\n text-transform: uppercase;\n}\n","import dayjs from 'dayjs'\nimport { defineComponent, h, onBeforeUnmount, onMounted, ref, type PropType } from 'vue'\nimport { Box, getThemeColor, useSafeMantineTheme } from '@mantine-vue/core'\nimport type { CurrentTimeIndicatorProps } from '../../component-props'\nimport type { AnyDateValue, DateLabelFormat } from '../../types'\nimport { formatDate, getCurrentTimePosition, isInTimeRange } from '../../utils'\nimport classes from './CurrentTimeIndicator.module.css'\n\nexport const CurrentTimeIndicator = defineComponent({\n name: 'CurrentTimeIndicator',\n inheritAttrs: false,\n props: {\n color: { type: String, default: 'red' },\n startOffset: { type: String, default: '0px' },\n endOffset: { type: String, default: '0px' },\n topOffset: { type: String, default: '0px' },\n timeBubbleStartOffset: { type: String, default: '0px' },\n withTimeBubble: { type: Boolean, default: true },\n withThumb: { type: Boolean, default: true },\n currentTimeFormat: { type: [String, Function] as PropType<DateLabelFormat>, default: 'HH:mm' },\n locale: String,\n startTime: { type: String, default: '00:00:00' },\n endTime: { type: String, default: '23:59:59' },\n intervalMinutes: { type: Number, default: 60 },\n getCurrentTime: Function as PropType<() => AnyDateValue>,\n },\n setup(props, { attrs }) {\n const theme = useSafeMantineTheme()\n const tick = ref(0)\n let timer: ReturnType<typeof setInterval> | undefined\n onMounted(() => {\n timer = setInterval(() => tick.value++, 30_000)\n })\n onBeforeUnmount(() => clearInterval(timer))\n return () => {\n void tick.value\n const now = props.getCurrentTime?.() || dayjs()\n if (!isInTimeRange({ date: now, startTime: props.startTime, endTime: props.endTime }))\n return null\n const top = getCurrentTimePosition({\n now,\n startTime: props.startTime,\n endTime: props.endTime,\n intervalMinutes: props.intervalMinutes,\n })\n const color = getThemeColor(props.color, theme.value)\n const formattedTime = props.withTimeBubble\n ? formatDate({\n date: now,\n locale: props.locale || 'en',\n format: props.currentTimeFormat,\n })\n : ''\n return h(\n Box,\n {\n ...attrs,\n class: [classes.currentTimeIndicator, attrs.class],\n style: [\n {\n '--indicator-color': color,\n '--start-offset': props.startOffset,\n '--end-offset': props.endOffset,\n '--top-offset': `calc(${top}% + ${props.topOffset})`,\n '--time-bubble-start-offset': props.timeBubbleStartOffset,\n '--time-bubble-width': formattedTime.toString().toLowerCase().includes('m')\n ? '64px'\n : '46px',\n },\n attrs.style,\n ],\n },\n () => [\n props.withTimeBubble\n ? h('div', { class: classes.currentTimeIndicatorTimeBubble }, formattedTime)\n : null,\n props.withThumb ? h('div', { class: classes.currentTimeIndicatorThumb }) : null,\n h('div', { class: classes.currentTimeIndicatorLine }),\n ],\n )\n }\n },\n})\n\nexport type { CurrentTimeIndicatorProps }\nexport type CurrentTimeIndicatorStylesNames =\n | 'currentTimeIndicator'\n | 'currentTimeIndicatorLine'\n | 'currentTimeIndicatorThumb'\n | 'currentTimeIndicatorTimeBubble'\n",".event {\n padding: 1px;\n pointer-events: none;\n display: flex;\n flex-direction: column;\n flex: 1 0 auto;\n position: relative;\n z-index: 3;\n\n &:where([data-auto-size]) {\n container-type: size;\n }\n\n &:where([data-draggable]) .eventInner {\n cursor: grab;\n\n &:active {\n cursor: grabbing;\n }\n }\n\n &:where([data-dragging]) {\n opacity: 0.2;\n\n .eventInner {\n cursor: grabbing;\n }\n }\n\n &:where([data-any-dragging]:not([data-dragging])) {\n pointer-events: none;\n\n .eventInner {\n pointer-events: none;\n }\n }\n\n &:where([data-static]) {\n pointer-events: none;\n cursor: default;\n }\n\n &:where([data-resizing]) {\n z-index: 10;\n\n .eventInner {\n @mixin hover {\n background-color: var(--event-bg);\n }\n }\n }\n\n &:where([data-hanging='start'], [data-hanging='both']) {\n &::before {\n content: '';\n position: absolute;\n inset-block: 2px;\n inset-inline-start: 2px;\n width: 2px;\n background-color: var(--event-color);\n border-radius: 10px;\n opacity: 0.3;\n }\n\n .eventInner {\n padding-inline-start: 6px;\n border-start-start-radius: 0;\n border-end-start-radius: 0;\n }\n }\n\n &:where([data-hanging='end'], [data-hanging='both']) {\n &::after {\n content: '';\n position: absolute;\n inset-block: 2px;\n inset-inline-end: 2px;\n width: 2px;\n background-color: var(--event-color);\n border-radius: 10px;\n opacity: 0.3;\n }\n\n .eventInner {\n padding-inline-end: 6px;\n border-start-end-radius: 0;\n border-end-end-radius: 0;\n }\n }\n\n &:where([data-clip-start]) {\n .eventInner {\n padding-inline-start: 12px;\n border-start-start-radius: 0;\n border-end-start-radius: 0;\n clip-path: polygon(10px 0, 100% 0, 100% 100%, 10px 100%, 0 50%);\n }\n }\n\n &:where([data-clip-end]) {\n .eventInner {\n padding-inline-end: 12px;\n border-start-end-radius: 0;\n border-end-end-radius: 0;\n clip-path: polygon(0 0, calc(100% - 10px) 0, 100% 50%, calc(100% - 10px) 100%, 0 100%);\n }\n }\n\n &:where([data-clip-start][data-clip-end]) {\n .eventInner {\n clip-path: polygon(\n 10px 0,\n calc(100% - 10px) 0,\n 100% 50%,\n calc(100% - 10px) 100%,\n 10px 100%,\n 0 50%\n );\n }\n }\n}\n\n.eventInner {\n background-color: var(--event-bg);\n color: var(--event-color);\n pointer-events: all;\n border-radius: var(--event-radius);\n font-weight: var(--mantine-font-weight-medium);\n font-size: 12px;\n line-height: 1;\n padding: 3px 4px;\n width: 100%;\n height: 100%;\n cursor: pointer;\n user-select: none;\n overflow: hidden;\n\n &:where([data-nowrap]) {\n white-space: nowrap;\n text-overflow: ellipsis;\n line-height: 1.25;\n }\n\n &:where([data-size='md']) {\n font-size: 14px;\n padding: 4px 6px;\n }\n\n @mixin hover {\n background-color: var(--event-hover);\n }\n\n &:where([data-auto-size]) {\n @container (max-height: 18px) {\n font-size: 9px;\n padding-block: 0px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n }\n }\n\n .event[data-static] & {\n cursor: default;\n pointer-events: none;\n\n @mixin hover {\n background-color: var(--event-bg);\n }\n }\n\n :where([data-slot-dragging]) & {\n pointer-events: none;\n }\n}\n\n.eventResizeHandle {\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n width: 40%;\n max-width: 40px;\n height: 4px;\n border-radius: 2px;\n cursor: ns-resize;\n pointer-events: all;\n z-index: 4;\n touch-action: none;\n background-color: var(--event-color);\n opacity: 0;\n transition: opacity 100ms ease;\n\n &::before {\n content: '';\n position: absolute;\n inset: -4px -6px;\n }\n\n &:where([data-edge='top']) {\n top: -2px;\n }\n\n &:where([data-edge='bottom']) {\n bottom: -2px;\n }\n\n .event:where(:hover, [data-resizing]) & {\n opacity: 0.5;\n }\n\n @mixin hover {\n opacity: 0.8;\n }\n}\n","import { defineComponent, h, ref, type PropType, type SlotsType, type VNodeChild } from 'vue'\nimport { Box, UnstyledButton, useSafeMantineTheme } from '@mantine-vue/core'\nimport type {\n ScheduleEventProps,\n ScheduleEventRenderProps,\n RenderEvent,\n RenderEventBody,\n} from '../../component-props'\nimport type { ScheduleEventData, ScheduleMode } from '../../types'\nimport classes from './ScheduleEvent.module.css'\n\nfunction resolveRadius(radius: string | number | undefined) {\n if (radius == null) return undefined\n if (typeof radius === 'number') return `${radius}px`\n return ['xs', 'sm', 'md', 'lg', 'xl'].includes(radius)\n ? `var(--mantine-radius-${radius})`\n : radius\n}\n\nexport interface ScheduleEventSlots {\n /** Fallback body content (used when `renderEventBody`/`eventBody` are not provided) */\n default?: () => VNodeChild\n /** Scoped alternative to the `renderEventBody` prop */\n eventBody?: (props: { event: ScheduleEventData }) => VNodeChild\n /** Scoped alternative to the `renderEvent` prop */\n event?: (props: ScheduleEventRenderProps & { event: ScheduleEventData }) => VNodeChild\n}\n\nexport const ScheduleEvent = defineComponent({\n name: 'ScheduleEvent',\n inheritAttrs: false,\n slots: Object as SlotsType<ScheduleEventSlots>,\n props: {\n event: { type: Object as PropType<ScheduleEventData>, required: true },\n radius: {\n type: [String, Number] as PropType<string | number>,\n default: 'sm',\n },\n nowrap: Boolean,\n autoSize: Boolean,\n size: { type: String, default: 'sm' },\n renderEventBody: Function as PropType<RenderEventBody>,\n renderEvent: Function as PropType<RenderEvent>,\n hanging: String as PropType<ScheduleEventProps['hanging']>,\n draggable: Boolean,\n onEventDragStart: Function as PropType<(event: ScheduleEventData) => void>,\n onEventDragEnd: Function as PropType<() => void>,\n isDragging: Boolean,\n mode: { type: String as PropType<ScheduleMode>, default: 'default' },\n withResize: Boolean,\n onResizeStart: Function as PropType<(edge: 'top' | 'bottom', event: PointerEvent) => void>,\n isResizing: Boolean,\n },\n setup(props, { attrs, slots }) {\n const theme = useSafeMantineTheme()\n const isNativeDragging = ref(false)\n return () => {\n const colors = theme.value.variantColorResolver({\n color: props.event.color || theme.value.primaryColor,\n theme: theme.value,\n variant: props.event.variant || 'light',\n autoContrast: true,\n })\n const body: VNodeChild =\n props.renderEventBody?.(props.event) ||\n slots.eventBody?.({ event: props.event }) ||\n slots.default?.() ||\n props.event.title\n const showResizeHandles = props.withResize && props.mode !== 'static'\n const rootProps = {\n ...attrs,\n class: [classes.event, attrs.class],\n style: [\n {\n '--event-color': colors.color,\n '--event-bg': colors.background,\n '--event-hover': colors.hover,\n '--event-radius': resolveRadius(props.radius),\n },\n attrs.style,\n ],\n 'data-event-id': props.event.id,\n title: props.event.title,\n size: props.size,\n mod: {\n autoSize: props.autoSize,\n hanging: props.hanging,\n draggable: props.draggable,\n dragging: props.isDragging || isNativeDragging.value,\n static: props.mode === 'static',\n resizing: props.isResizing,\n resizable: showResizeHandles,\n },\n draggable: props.draggable && props.mode !== 'static',\n tabindex: props.mode === 'static' ? -1 : 0,\n onDragstart: (event: DragEvent) => {\n if (!props.draggable || props.mode === 'static') {\n event.preventDefault()\n return\n }\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move'\n event.dataTransfer.setData(\n 'application/json',\n JSON.stringify({ eventId: props.event.id }),\n )\n }\n isNativeDragging.value = true\n props.onEventDragStart?.(props.event)\n },\n onDragend:\n props.mode === 'static'\n ? undefined\n : () => {\n isNativeDragging.value = false\n props.onEventDragEnd?.()\n },\n onClick:\n props.mode === 'static'\n ? undefined\n : (attrs.onClick as ScheduleEventRenderProps['onClick']),\n }\n const children = [\n showResizeHandles\n ? h(Box, {\n class: classes.eventResizeHandle,\n mod: { edge: 'top' },\n onPointerdown: (event: PointerEvent) => props.onResizeStart?.('top', event),\n })\n : null,\n h(\n Box,\n {\n class: classes.eventInner,\n mod: {\n nowrap: props.nowrap,\n size: props.size,\n autoSize: props.autoSize,\n hanging: props.hanging,\n },\n },\n () => body,\n ),\n showResizeHandles\n ? h(Box, {\n class: classes.eventResizeHandle,\n mod: { edge: 'bottom' },\n onPointerdown: (event: PointerEvent) => props.onResizeStart?.('bottom', event),\n })\n : null,\n ]\n const renderProps = { ...rootProps, children }\n return (\n props.renderEvent?.(props.event, renderProps) ||\n slots.event?.({ ...renderProps, event: props.event }) ||\n h(UnstyledButton, rootProps, () => children)\n )\n }\n },\n})\n\nexport type { RenderEvent, RenderEventBody, ScheduleEventProps }\nexport type ScheduleEventStylesNames = 'event' | 'eventInner' | 'eventResizeHandle'\n","import dayjs from 'dayjs'\nimport { h, type CSSProperties, type PropType, type VNodeChild } from 'vue'\nimport type {\n BaseViewProps,\n EventDropData,\n NativeButtonProps,\n RenderEvent,\n RenderEventBody,\n TimeSlotClickData,\n} from '../component-props'\nimport type {\n AnyDateValue,\n DateLabelFormat,\n DateStringValue,\n DateTimeStringValue,\n ScheduleEventData,\n ScheduleMode,\n ScheduleViewLevel,\n} from '../types'\nimport type { BusinessHoursValue } from '../utils'\nimport { expandRecurringEvents, formatDate, toDateString } from '../utils'\nimport { ScheduleEvent } from './ScheduleEvent/ScheduleEvent'\n\nexport const baseViewProps = {\n date: { type: [String, Date] as PropType<Date | DateStringValue>, required: true },\n onDateChange: Function as PropType<(date: DateStringValue) => void>,\n events: Array as PropType<ScheduleEventData[]>,\n locale: String,\n radius: [String, Number] as PropType<string | number>,\n labels: Object,\n mode: { type: String as PropType<ScheduleMode>, default: 'default' },\n withHeader: { type: Boolean, default: true },\n onViewChange: Function as PropType<(view: ScheduleViewLevel) => void>,\n previousControlProps: Object as PropType<NativeButtonProps>,\n nextControlProps: Object as PropType<NativeButtonProps>,\n todayControlProps: Object as PropType<NativeButtonProps>,\n viewSelectProps: Object,\n renderEventBody: Function as PropType<RenderEventBody>,\n renderEvent: Function as PropType<RenderEvent>,\n onEventClick: Function as PropType<(event: ScheduleEventData, nativeEvent: MouseEvent) => void>,\n recurrenceExpansionLimit: { type: Number, default: 2000 },\n}\n\nexport const timeViewProps = {\n ...baseViewProps,\n startTime: { type: String, default: '00:00:00' },\n endTime: { type: String, default: '23:59:59' },\n intervalMinutes: { type: Number, default: 60 },\n slotLabelFormat: { type: [String, Function] as PropType<DateLabelFormat>, default: 'HH:mm' },\n withCurrentTimeIndicator: { type: Boolean, default: undefined },\n withCurrentTimeBubble: { type: Boolean, default: true },\n getCurrentTime: Function as PropType<() => AnyDateValue>,\n slotHeight: { type: [String, Number] as PropType<CSSProperties['height']>, default: 64 },\n highlightBusinessHours: Boolean,\n businessHours: [Array, Object] as PropType<BusinessHoursValue>,\n withEventsDragAndDrop: Boolean,\n onEventDrop: Function as PropType<(data: EventDropData) => void>,\n canDragEvent: Function as PropType<(event: ScheduleEventData) => boolean>,\n onEventDragStart: Function as PropType<(event: ScheduleEventData) => void>,\n onEventDragEnd: Function as PropType<() => void>,\n onTimeSlotClick: Function as PropType<(data: TimeSlotClickData) => void>,\n onAllDaySlotClick: Function as PropType<(date: DateStringValue, nativeEvent: MouseEvent) => void>,\n withDragSlotSelect: Boolean,\n onSlotDragEnd: Function,\n startScrollTime: String,\n onExternalEventDrop: Function,\n withEventResize: Boolean,\n onEventResize: Function as PropType<(data: EventDropData) => void>,\n canResizeEvent: Function as PropType<(event: ScheduleEventData) => boolean>,\n}\n\nexport function resolveScheduleRadius(radius: string | number | undefined): string | undefined {\n if (radius === undefined) return undefined\n if (typeof radius === 'number') return `${radius}px`\n return ['xs', 'sm', 'md', 'lg', 'xl'].includes(radius)\n ? `var(--mantine-radius-${radius})`\n : radius\n}\n\nexport function getExpandedEvents(\n events: ScheduleEventData[] | undefined,\n rangeStart: Date | string,\n rangeEnd: Date | string,\n expansionLimit: number,\n) {\n return expandRecurringEvents({ events, rangeStart, rangeEnd, expansionLimit })\n}\n\nexport function formatLabel(\n date: Date | string,\n locale: string | undefined,\n format: DateLabelFormat,\n) {\n return formatDate({ date, locale: locale || 'en', format })\n}\n\n/** Scoped slots that mirror the `renderEvent` / `renderEventBody` props. */\nexport interface EventSlots {\n eventBody?: (props: { event: ScheduleEventData }) => VNodeChild\n event?: (props: Record<string, unknown> & { event: ScheduleEventData }) => VNodeChild\n}\n\n/**\n * Build the slots object forwarded to a child component, omitting undefined entries.\n * Returns a `Record<string, unknown>` (possibly empty) so it satisfies Vue's `RawSlots`\n * type when passed as the third argument to `h()`.\n */\nexport function forwardEventSlots(slots: EventSlots | undefined): Record<string, unknown> {\n const forwarded: Record<string, unknown> = {}\n if (slots?.eventBody) forwarded.eventBody = slots.eventBody\n if (slots?.event) forwarded.event = slots.event\n return forwarded\n}\n\nexport function eventNode(\n event: ScheduleEventData,\n props: Pick<BaseViewProps, 'mode' | 'renderEvent' | 'renderEventBody' | 'onEventClick'> & {\n withEventsDragAndDrop?: boolean\n canDragEvent?: (event: ScheduleEventData) => boolean\n onEventDragStart?: (event: ScheduleEventData) => void\n onEventDragEnd?: () => void\n },\n extra: Record<string, unknown> = {},\n slots?: EventSlots,\n): VNodeChild {\n const draggable =\n props.mode !== 'static' &&\n props.withEventsDragAndDrop === true &&\n (props.canDragEvent?.(event) ?? true)\n return h(\n ScheduleEvent,\n {\n event,\n mode: props.mode ?? 'default',\n renderEvent: props.renderEvent,\n renderEventBody: props.renderEventBody,\n draggable,\n onEventDragStart: props.onEventDragStart,\n onEventDragEnd: props.onEventDragEnd,\n onClick: (nativeEvent: MouseEvent) => props.onEventClick?.(event, nativeEvent),\n ...extra,\n },\n forwardEventSlots(slots),\n )\n}\n\nexport function getDropEvent(\n events: ScheduleEventData[] | undefined,\n transfer: DataTransfer | null,\n) {\n const raw = transfer?.getData('application/json')\n if (!raw) return undefined\n\n try {\n const data: unknown = JSON.parse(raw)\n if (typeof data !== 'object' || data === null || !('eventId' in data)) return undefined\n const eventId = (data as { eventId: unknown }).eventId\n if (typeof eventId !== 'string' && typeof eventId !== 'number') return undefined\n return events?.find((event) => String(event.id) === String(eventId))\n } catch {\n return undefined\n }\n}\n\nexport function getTimeSlotDropTarget({\n nativeEvent,\n container,\n intervals,\n date,\n}: {\n nativeEvent: DragEvent\n container: HTMLElement\n intervals: Array<{ startTime: string }>\n date: string\n}): { slotIndex: number; target: DateTimeStringValue } | undefined {\n const eventTarget = nativeEvent.target instanceof Element ? nativeEvent.target : null\n const targetSlot = eventTarget?.closest<HTMLElement>('[data-time-slot-index]')\n let slotIndex =\n targetSlot && container.contains(targetSlot)\n ? Number(targetSlot.dataset.timeSlotIndex)\n : Number.NaN\n\n if (!Number.isInteger(slotIndex)) {\n const slots = container.querySelectorAll<HTMLElement>('[data-time-slot-index]')\n slotIndex = Array.from(slots).findIndex((slot) => {\n const rect = slot.getBoundingClientRect()\n return nativeEvent.clientY >= rect.top && nativeEvent.clientY <= rect.bottom\n })\n }\n\n const interval = intervals[slotIndex]\n return interval\n ? {\n slotIndex,\n target: `${date} ${interval.startTime}` as DateTimeStringValue,\n }\n : undefined\n}\n\nexport function moveEventTo(event: ScheduleEventData, newStart: dayjs.ConfigType) {\n const start = dayjs(event.start)\n const duration = dayjs(event.end).diff(start, 'second')\n const nextStart = dayjs(newStart)\n return {\n eventId: event.id,\n newStart: nextStart.format('YYYY-MM-DD HH:mm:ss') as DateTimeStringValue,\n newEnd: nextStart.add(duration, 'second').format('YYYY-MM-DD HH:mm:ss') as DateTimeStringValue,\n event,\n }\n}\n\nexport function moveEventToAllDay(event: ScheduleEventData, date: dayjs.ConfigType) {\n const dayStart = dayjs(date).startOf('day')\n const spanDays = Math.max(\n 1,\n dayjs(event.end).startOf('day').diff(dayjs(event.start).startOf('day'), 'day'),\n )\n return {\n eventId: event.id,\n newStart: dayStart.format('YYYY-MM-DD HH:mm:ss') as DateTimeStringValue,\n newEnd: dayStart.add(spanDays, 'day').format('YYYY-MM-DD HH:mm:ss') as DateTimeStringValue,\n event,\n }\n}\n\nexport function todayString() {\n return toDateString(dayjs())\n}\n",".moreEventsButton {\n color: var(--mantine-color-dimmed);\n font-size: 13px;\n pointer-events: all;\n flex: 1;\n\n @mixin hover {\n color: var(--mantine-color-bright);\n text-decoration: underline;\n }\n\n &:where([data-static]) {\n cursor: default;\n\n @mixin hover {\n color: var(--mantine-color-dimmed);\n text-decoration: none;\n }\n }\n}\n\n.moreEventsDropdown {\n padding: 4px;\n}\n\n.moreEventsList {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n","import { defineComponent, h, ref, type PropType, type SlotsType } from 'vue'\nimport { Box, Modal, Popover, UnstyledButton } from '@mantine-vue/core'\nimport { getLabel, type ScheduleLabelsOverride } from '../../labels'\nimport type {\n MoreEventsDropdownType,\n MoreEventsProps,\n RenderEvent,\n RenderEventBody,\n} from '../../component-props'\nimport type { ScheduleEventData, ScheduleMode } from '../../types'\nimport { ScheduleEvent } from '../ScheduleEvent/ScheduleEvent'\nimport { forwardEventSlots, type EventSlots } from '../shared'\nimport classes from './MoreEvents.module.css'\n\nexport const MoreEvents = defineComponent({\n name: 'MoreEvents',\n inheritAttrs: false,\n slots: Object as SlotsType<EventSlots>,\n props: {\n events: { type: Array as PropType<ScheduleEventData[]>, required: true },\n moreEventsCount: { type: Number, required: true },\n radius: [String, Number] as PropType<string | number>,\n modalTitle: String,\n dropdownType: { type: String as PropType<MoreEventsDropdownType>, default: 'popover' },\n popoverProps: Object as PropType<Record<string, unknown>>,\n modalProps: Object as PropType<Record<string, unknown>>,\n onDropdownClose: Function as PropType<() => void>,\n renderEventBody: Function as PropType<RenderEventBody>,\n renderEvent: Function as PropType<RenderEvent>,\n labels: Object as PropType<ScheduleLabelsOverride>,\n mode: { type: String as PropType<ScheduleMode>, default: 'default' },\n onEventClick: Function as PropType<(event: ScheduleEventData, nativeEvent: MouseEvent) => void>,\n },\n setup(props, { attrs, slots }) {\n const opened = ref(false)\n const close = () => {\n opened.value = false\n props.onDropdownClose?.()\n }\n\n return () => {\n const eventsList = h(Box, { class: classes.moreEventsList }, () =>\n props.events.map((event) =>\n h(\n ScheduleEvent,\n {\n key: event.id,\n event,\n radius: props.radius ?? 'sm',\n size: 'md',\n mode: props.mode,\n renderEvent: props.renderEvent,\n renderEventBody: props.renderEventBody,\n onClick: (nativeEvent: MouseEvent) => props.onEventClick?.(event, nativeEvent),\n },\n forwardEventSlots(slots),\n ),\n ),\n )\n\n return [\n props.dropdownType === 'modal'\n ? h(\n Modal,\n {\n ...props.modalProps,\n opened: opened.value,\n onClose: close,\n radius: props.radius,\n title: props.modalTitle,\n },\n () => eventsList,\n )\n : null,\n h(\n Popover,\n {\n position: 'bottom-start',\n width: 260,\n opened: opened.value,\n trapFocus: true,\n returnFocus: false,\n disabled: props.dropdownType === 'modal',\n radius: props.radius,\n transitionProps: { transition: 'pop', duration: 120 },\n offset: -46,\n ...props.popoverProps,\n onChange: (value: boolean) => {\n if (!value) close()\n },\n },\n () => [\n h(Popover.Target, null, () =>\n h(\n UnstyledButton,\n {\n ...attrs,\n class: [classes.moreEventsButton, attrs.class],\n mod: { static: props.mode === 'static' },\n 'aria-expanded': opened.value,\n onClick: () => {\n opened.value = !opened.value\n },\n },\n () => getLabel('moreLabel', props.labels)(props.moreEventsCount),\n ),\n ),\n h(Popover.Dropdown, { class: classes.moreEventsDropdown }, () => eventsList),\n ],\n ),\n ]\n }\n },\n})\n\nexport type { MoreEventsDropdownType, MoreEventsProps }\nexport type MoreEventsStylesNames = 'moreEventsButton' | 'moreEventsDropdown' | 'moreEventsList'\n","import { onBeforeUnmount, ref, watch, type Ref } from 'vue'\n\ninterface SelectedRange {\n group: string\n start: number\n end: number\n}\n\ninterface DragState {\n group: string\n startIndex: number\n currentIndex: number\n}\n\nexport interface UseSlotDragSelectInput {\n /** Whether slot drag selection is enabled */\n enabled: () => boolean\n /** Called with the selected range once a multi-slot drag finishes */\n onDragEnd?: () => ((startIndex: number, endIndex: number, group: string) => void) | undefined\n}\n\nexport interface SlotDragSelect {\n /** Begin a slot selection at the given index/group */\n handleSlotPointerDown: (event: PointerEvent, index: number, group: string) => void\n /** Whether the slot at index within group is currently selected */\n isSlotSelected: (index: number, group: string) => boolean\n /** Whether a slot drag selection is currently in progress */\n isDragging: () => boolean\n}\n\n/**\n * Composable that provides unified slot drag-selection for Day, Week and Month views.\n * tracks a selected range as the pointer\n * moves across elements carrying `data-drag-slot-index` / `data-drag-slot-group`.\n */\nexport function useSlotDragSelect(input: UseSlotDragSelectInput): SlotDragSelect {\n const selectedRange = ref<SelectedRange | null>(null)\n let drag: DragState | null = null\n let savedUserSelect = ''\n\n const handlePointerMove = (event: PointerEvent) => {\n if (!drag) return\n const elements = document.elementsFromPoint(event.clientX, event.clientY)\n for (const el of elements) {\n const element = el as HTMLElement\n const indexAttr = element.getAttribute?.('data-drag-slot-index')\n const groupAttr = element.getAttribute?.('data-drag-slot-group')\n if (indexAttr != null && groupAttr != null) {\n if (groupAttr === drag.group) {\n const newIndex = Number(indexAttr)\n if (!Number.isNaN(newIndex) && newIndex !== drag.currentIndex) {\n drag.currentIndex = newIndex\n selectedRange.value = {\n group: groupAttr,\n start: Math.min(drag.startIndex, newIndex),\n end: Math.max(drag.startIndex, newIndex),\n }\n }\n }\n break\n }\n }\n }\n\n const handlePointerUp = () => {\n if (drag) {\n const { startIndex, currentIndex, group } = drag\n if (startIndex !== currentIndex) {\n input.onDragEnd?.()?.(\n Math.min(startIndex, currentIndex),\n Math.max(startIndex, currentIndex),\n group,\n )\n }\n }\n drag = null\n selectedRange.value = null\n }\n\n const removeListeners = () => {\n document.body.style.userSelect = savedUserSelect\n document.removeEventListener('pointermove', handlePointerMove)\n document.removeEventListener('pointerup', handlePointerUp)\n }\n\n watch(\n () => selectedRange.value !== null,\n (isDragging) => {\n if (isDragging) {\n savedUserSelect = document.body.style.userSelect\n document.body.style.userSelect = 'none'\n document.addEventListener('pointermove', handlePointerMove)\n document.addEventListener('pointerup', handlePointerUp)\n } else {\n removeListeners()\n }\n },\n )\n\n onBeforeUnmount(() => {\n if (selectedRange.value !== null) removeListeners()\n })\n\n const handleSlotPointerDown = (_event: PointerEvent, index: number, group: string) => {\n if (!input.enabled()) return\n drag = { group, startIndex: index, currentIndex: index }\n selectedRange.value = { group, start: index, end: index }\n }\n\n const isSlotSelected = (index: number, group: string) => {\n const range = selectedRange.value\n if (!range || range.group !== group) return false\n return index >= range.start && index <= range.end\n }\n\n const isDragging = () => selectedRange.value !== null\n\n return { handleSlotPointerDown, isSlotSelected, isDragging }\n}\n\nexport type SelectedRangeRef = Ref<SelectedRange | null>\n",".header {\n --schedule-header-gap: 8px;\n\n display: flex;\n flex-wrap: wrap;\n gap: var(--schedule-header-gap);\n margin-bottom: var(--schedule-header-gap);\n container-type: inline-size;\n}\n\n.navigationGroup {\n display: flex;\n gap: var(--schedule-header-gap);\n align-items: center;\n\n @container (width <= 600px) {\n flex: 1;\n\n & > :not([data-square]) {\n flex: 1;\n }\n }\n}\n\n.todayControl {\n @container (width <= 600px) {\n display: none;\n }\n}\n\n.viewSelect {\n @container (width <= 600px) {\n display: none;\n }\n}\n\n.compactViewSelect {\n display: none;\n font-weight: var(--mantine-font-weight-medium);\n\n @container (width <= 600px) {\n display: block;\n flex: 1 1 100%;\n }\n}\n",".headerControl {\n --control-size: 32px;\n\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: default;\n user-select: none;\n min-width: var(--control-size);\n height: var(--control-size);\n border-radius: var(--schedule-radius, var(--control-radius, var(--mantine-radius-default)));\n border: 1px solid var(--mantine-color-default-border);\n color: var(--mantine-color-default-color);\n background: var(--mantine-color-default);\n font-size: var(--mantine-font-size-sm);\n font-weight: var(--mantine-font-weight-medium);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n text-transform: capitalize;\n\n &:where([data-interactive]) {\n cursor: pointer;\n\n @mixin hover {\n background-color: var(--mantine-color-default-hover);\n }\n }\n\n &:where(:not([data-square])) {\n padding-inline: 12px;\n }\n\n &:where([data-active]) {\n background-color: var(--mantine-primary-color-filled);\n border-color: var(--mantine-primary-color-filled);\n color: var(--mantine-primary-color-contrast);\n\n @mixin hover {\n background-color: var(--mantine-primary-color-filled-hover);\n border-color: var(--mantine-primary-color-filled-hover);\n }\n }\n}\n",".viewSelect {\n display: flex;\n gap: 4px;\n}\n",".monthYearSelectTarget {\n text-transform: capitalize;\n min-width: 80px;\n\n &:where([data-with-months]) {\n min-width: 140px;\n }\n}\n\n.monthYearSelectList {\n flex: 1;\n}\n\n.monthYearSelectDropdown {\n display: flex;\n gap: var(--mantine-spacing-sm);\n padding: 8px 4px;\n\n &:where([data-with-months]) {\n padding: var(--mantine-spacing-sm);\n }\n}\n\n.monthYearSelectLabel {\n font-weight: var(--mantine-font-weight-medium);\n font-size: var(--mantine-font-size-sm);\n padding-inline: 8px;\n margin-bottom: 6px;\n}\n\n.monthYearSelectControl {\n display: block;\n width: 100%;\n padding: 6px 8px;\n font-size: var(--mantine-font-size-sm);\n line-height: 1;\n border-radius: var(--schedule-radius, var(--control-radius, var(--mantine-radius-default)));\n font-variant-numeric: tabular-nums;\n text-transform: capitalize;\n\n &:where([data-type='year']) {\n text-align: center;\n }\n\n @mixin hover {\n background-color: var(--mantine-color-default-hover);\n }\n\n &:where([data-active]) {\n background-color: var(--mantine-primary-color-filled);\n color: var(--mantine-primary-color-contrast);\n\n @mixin hover {\n background-color: var(--mantine-primary-color-filled-hover);\n }\n }\n}\n","import { defineComponent, h, inject, provide, ref, type InjectionKey, type PropType } from 'vue'\nimport {\n AccordionChevron,\n Box,\n createScopedKeydownHandler,\n Popover,\n UnstyledButton,\n useDirection,\n} from '@mantine-vue/core'\nimport { getLabel, type ScheduleLabelsOverride } from '../../labels'\nimport type { ScheduleViewLevel } from '../../types'\nimport type {\n HeaderControlProps,\n MonthYearSelectProps,\n ScheduleHeaderProps,\n ViewSelectProps,\n} from '../../component-props'\nimport { formatDate, getMonthsList, getYearsList } from '../../utils'\nimport classes from './ScheduleHeader.module.css'\nimport controlClasses from './HeaderControl/HeaderControl.module.css'\nimport viewClasses from './ViewSelect/ViewSelect.module.css'\nimport monthYearClasses from './MonthYearSelect/MonthYearSelect.module.css'\n\nconst labelsKey: InjectionKey<ScheduleLabelsOverride | undefined> = Symbol('schedule-header-labels')\n\nconst commonControlProps = {\n active: Boolean,\n square: Boolean,\n radius: [String, Number] as PropType<string | number>,\n interactive: { type: Boolean, default: true },\n labels: Object as PropType<ScheduleLabelsOverride>,\n}\n\nfunction resolveRadius(radius: string | number | undefined) {\n if (radius == null) return undefined\n if (typeof radius === 'number') return `${radius}px`\n return ['xs', 'sm', 'md', 'lg', 'xl'].includes(radius)\n ? `var(--mantine-radius-${radius})`\n : radius\n}\n\nexport const HeaderControl = defineComponent({\n name: 'HeaderControl',\n inheritAttrs: false,\n props: commonControlProps,\n setup(props, { attrs, slots }) {\n return () =>\n h(\n UnstyledButton,\n {\n ...attrs,\n class: [controlClasses.headerControl, attrs.class],\n style: [\n props.radius == null ? undefined : { '--control-radius': resolveRadius(props.radius) },\n attrs.style,\n ],\n tabindex: props.interactive ? (attrs as { tabindex?: number }).tabindex : -1,\n mod: {\n active: props.active,\n square: props.square,\n interactive: props.interactive,\n },\n },\n () => slots.default?.(),\n )\n },\n})\n\nfunction directionalControl(name: string, type: 'next' | 'previous') {\n return defineComponent({\n name,\n inheritAttrs: false,\n props: commonControlProps,\n setup(props, { attrs }) {\n const inherited = inject(labelsKey, undefined)\n const { dir } = useDirection()\n return () =>\n h(\n HeaderControl,\n {\n ...attrs,\n ...props,\n square: true,\n 'data-type': type,\n 'aria-label': getLabel(type, props.labels || inherited),\n },\n () =>\n h(AccordionChevron, {\n style: {\n transform: `rotate(${type === 'next' ? (dir.value === 'rtl' ? 90 : -90) : dir.value === 'rtl' ? -90 : 90}deg)`,\n },\n }),\n )\n },\n })\n}\n\nexport const ScheduleHeaderNext = directionalControl('ScheduleHeaderNext', 'next')\nexport const ScheduleHeaderPrevious = directionalControl('ScheduleHeaderPrevious', 'previous')\n\nexport const ScheduleHeaderToday = defineComponent({\n name: 'ScheduleHeaderToday',\n inheritAttrs: false,\n props: commonControlProps,\n setup(props, { attrs }) {\n const inherited = inject(labelsKey, undefined)\n return () =>\n h(\n HeaderControl,\n {\n ...attrs,\n ...props,\n 'data-type': 'today',\n 'aria-label': getLabel('today', props.labels || inherited),\n },\n () => getLabel('today', props.labels || inherited),\n )\n },\n})\n\nexport const ViewSelect = defineComponent({\n name: 'ViewSelect',\n inheritAttrs: false,\n props: {\n views: {\n type: Array as PropType<readonly ScheduleViewLevel[]>,\n default: () => ['day', 'week', 'month', 'year'],\n },\n value: String as PropType<ScheduleViewLevel>,\n onChange: Function as PropType<(view: ScheduleViewLevel) => void>,\n radius: [String, Number] as PropType<string | number>,\n labels: Object as PropType<ScheduleLabelsOverride>,\n },\n setup(props, { attrs }) {\n const inherited = inject(labelsKey, undefined)\n const switchLabels: Record<ScheduleViewLevel, keyof import('../../labels').ScheduleLabels> = {\n day: 'switchToDayView',\n week: 'switchToWeekView',\n month: 'switchToMonthView',\n year: 'switchToYearView',\n }\n const onKeydown = (event: KeyboardEvent, index: number) => {\n const controls = (\n event.currentTarget as HTMLElement\n ).parentElement?.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]')\n if (!controls?.length) return\n let next = index\n if (event.key === 'ArrowRight') next = (index + 1) % controls.length\n else if (event.key === 'ArrowLeft') next = (index - 1 + controls.length) % controls.length\n else if (event.key === 'Home') next = 0\n else if (event.key === 'End') next = controls.length - 1\n else return\n event.preventDefault()\n controls[next]?.focus()\n }\n return () => {\n const labels = props.labels || inherited\n return h(\n Box,\n {\n ...attrs,\n class: [viewClasses.viewSelect, attrs.class],\n role: 'tablist',\n 'aria-label': getLabel('viewSelectLabel', labels),\n },\n () =>\n props.views.map((view, index) =>\n h(\n HeaderControl,\n {\n active: view === props.value,\n radius: props.radius,\n role: 'tab',\n 'data-type': view,\n 'aria-selected': view === props.value,\n 'aria-label': getLabel(switchLabels[view], labels),\n tabindex: view === props.value ? 0 : -1,\n onClick: () => props.onChange?.(view),\n onKeydown: (event: KeyboardEvent) => onKeydown(event, index),\n },\n () => getLabel(view, labels),\n ),\n ),\n )\n }\n },\n})\n\nexport const MonthYearSelect = defineComponent({\n name: 'MonthYearSelect',\n inheritAttrs: false,\n props: {\n locale: String,\n startYear: Number,\n endYear: Number,\n yearValue: Number,\n monthValue: Number,\n onYearChange: Function as PropType<(year: number) => void>,\n onMonthChange: Function as PropType<(month: number) => void>,\n monthsListFormat: [String, Function] as PropType<MonthYearSelectProps['monthsListFormat']>,\n labelFormat: [String, Function] as PropType<MonthYearSelectProps['labelFormat']>,\n radius: [String, Number] as PropType<string | number>,\n getYearControlProps: Function as PropType<MonthYearSelectProps['getYearControlProps']>,\n getMonthControlProps: Function as PropType<MonthYearSelectProps['getMonthControlProps']>,\n withMonths: { type: Boolean, default: true },\n labels: Object as PropType<ScheduleLabelsOverride>,\n },\n setup(props, { attrs }) {\n const inherited = inject(labelsKey, undefined)\n const opened = ref(false)\n const today = new Date()\n return () => {\n const labels = props.labels || inherited\n const startYear = props.startYear ?? today.getFullYear() - 5\n const endYear = props.endYear ?? today.getFullYear() + 5\n const selected = new Date(\n props.yearValue ?? today.getFullYear(),\n props.monthValue ?? today.getMonth(),\n 1,\n )\n const hasActiveYear =\n props.yearValue !== undefined && props.yearValue >= startYear && props.yearValue <= endYear\n\n const months = props.withMonths\n ? getMonthsList({\n locale: props.locale || 'en',\n format: props.monthsListFormat || 'MMMM',\n }).map((month) => {\n const extra = props.getMonthControlProps?.(month.month) || {}\n return h(\n UnstyledButton,\n {\n ...extra,\n class: [monthYearClasses.monthYearSelectControl, extra.class],\n mod: { type: 'month', active: month.month === props.monthValue },\n tabindex: month.month === props.monthValue ? 0 : -1,\n 'aria-label': `${getLabel('selectMonth', labels)} ${month.name}`,\n onKeydown: createScopedKeydownHandler({\n siblingSelector: '[data-type=\"month\"]:not(:disabled)',\n parentSelector: '[data-list]',\n activateOnFocus: false,\n loop: true,\n orientation: 'vertical',\n onKeydown: extra.onKeydown,\n }),\n onClick: () => {\n props.onMonthChange?.(month.month)\n },\n },\n () => month.name,\n )\n })\n : []\n\n const years = getYearsList({ startYear, endYear }).map((year, index) => {\n const extra = props.getYearControlProps?.(year) || {}\n return h(\n UnstyledButton,\n {\n ...extra,\n class: [monthYearClasses.monthYearSelectControl, extra.class],\n mod: { type: 'year', active: year === props.yearValue },\n tabindex: hasActiveYear ? (year === props.yearValue ? 0 : -1) : index === 0 ? 0 : -1,\n 'aria-label': `${getLabel('selectYear', labels)} ${year}`,\n onKeydown: createScopedKeydownHandler({\n siblingSelector: '[data-type=\"year\"]:not(:disabled)',\n parentSelector: '[data-list]',\n activateOnFocus: false,\n loop: true,\n orientation: 'vertical',\n onKeydown: extra.onKeydown,\n }),\n onClick: () => {\n props.onYearChange?.(year)\n if (!props.withMonths) opened.value = false\n },\n },\n () => String(year),\n )\n })\n\n return h(\n Popover,\n {\n position: 'bottom-start',\n trapFocus: true,\n transitionProps: { transition: 'pop', duration: 120 },\n radius: props.radius || 'var(--schedule-radius, var(--mantine-radius-default))',\n shadow: 'md',\n offset: 3,\n width: props.withMonths ? undefined : 'target',\n opened: opened.value,\n onChange: (value: boolean) => {\n opened.value = value\n },\n },\n () => [\n h(Popover.Target, null, () =>\n h(\n HeaderControl,\n {\n ...attrs,\n class: [monthYearClasses.monthYearSelectTarget, attrs.class],\n radius: props.radius,\n 'data-with-months': props.withMonths || undefined,\n onClick: () => {\n opened.value = !opened.value\n },\n },\n () =>\n formatDate({\n date: selected,\n locale: props.locale || 'en',\n format: props.labelFormat || (props.withMonths ? 'MMMM YYYY' : 'YYYY'),\n }),\n ),\n ),\n h(\n Popover.Dropdown,\n {\n class: monthYearClasses.monthYearSelectDropdown,\n 'data-with-months': props.withMonths || undefined,\n },\n () => [\n props.withMonths\n ? h(Box, { class: monthYearClasses.monthYearSelectList, 'data-list': true }, () => [\n h(Box, { class: monthYearClasses.monthYearSelectLabel }, () =>\n getLabel('month', labels),\n ),\n ...months,\n ])\n : null,\n h(Box, { class: monthYearClasses.monthYearSelectList, 'data-list': true }, () => [\n props.withMonths\n ? h(Box, { class: monthYearClasses.monthYearSelectLabel }, () =>\n getLabel('year', labels),\n )\n : null,\n ...years,\n ]),\n ],\n ),\n ],\n )\n }\n },\n})\n\nconst ScheduleHeaderBaseComponent = defineComponent({\n name: 'ScheduleHeader',\n inheritAttrs: false,\n props: { labels: Object as PropType<ScheduleLabelsOverride> },\n setup(props, { attrs, slots }) {\n provide(labelsKey, props.labels)\n return () => h(Box, { ...attrs, class: [classes.header, attrs.class] }, () => slots.default?.())\n },\n})\n\nexport const ScheduleHeader = Object.assign(ScheduleHeaderBaseComponent, {\n Control: HeaderControl,\n Next: ScheduleHeaderNext,\n Previous: ScheduleHeaderPrevious,\n Today: ScheduleHeaderToday,\n ViewSelect,\n MonthYearSelect,\n})\n\nexport type { HeaderControlProps, MonthYearSelectProps, ScheduleHeaderProps, ViewSelectProps }\nexport type HeaderControlStylesNames = 'headerControl'\nexport type ViewSelectStylesNames = 'viewSelect'\nexport type MonthYearSelectStylesNames =\n | 'monthYearSelectTarget'\n | 'monthYearSelectDropdown'\n | 'monthYearSelectControl'\n | 'monthYearSelectList'\n | 'monthYearSelectLabel'\nexport type ScheduleHeaderStylesNames = 'header'\nexport type CombinedScheduleHeaderStylesNames =\n | ScheduleHeaderStylesNames\n | HeaderControlStylesNames\n | ViewSelectStylesNames\n | MonthYearSelectStylesNames\n\nvoid ({} as HeaderControlProps)\nvoid ({} as ViewSelectProps)\nvoid ({} as ScheduleHeaderProps)\n","import dayjs from 'dayjs'\nimport { defineComponent, h, type PropType, type VNodeChild } from 'vue'\nimport { Box, NativeSelect } from '@mantine-vue/core'\nimport { getLabel, type ScheduleLabelsOverride } from '../../labels'\nimport type { DateStringValue, ScheduleViewLevel } from '../../types'\nimport type {\n MonthYearSelectProps,\n NativeButtonProps,\n ViewSelectProps,\n} from '../../component-props'\nimport { toDateString } from '../../utils'\nimport { ScheduleHeader } from './ScheduleHeader'\nimport classes from './ScheduleHeader.module.css'\n\nexport interface ScheduleHeaderBaseProps {\n view: ScheduleViewLevel\n navigationHandlers: {\n previous: () => DateStringValue\n next: () => DateStringValue\n today: () => DateStringValue\n }\n control: { title?: VNodeChild; miw?: string | number; monthYearSelect?: MonthYearSelectProps }\n labels?: ScheduleLabelsOverride\n onDateChange?: (date: DateStringValue) => void\n onViewChange?: (view: ScheduleViewLevel) => void\n previousControlProps?: NativeButtonProps\n nextControlProps?: NativeButtonProps\n todayControlProps?: NativeButtonProps\n viewSelectProps?: Partial<ViewSelectProps>\n}\n\nexport const ScheduleHeaderBase = defineComponent({\n name: 'ScheduleHeaderBase',\n props: {\n view: { type: String as PropType<ScheduleViewLevel>, required: true },\n navigationHandlers: {\n type: Object as PropType<ScheduleHeaderBaseProps['navigationHandlers']>,\n required: true,\n },\n control: { type: Object as PropType<ScheduleHeaderBaseProps['control']>, required: true },\n labels: Object as PropType<ScheduleLabelsOverride>,\n onDateChange: Function as PropType<(date: DateStringValue) => void>,\n onViewChange: Function as PropType<(view: ScheduleViewLevel) => void>,\n previousControlProps: Object as PropType<NativeButtonProps>,\n nextControlProps: Object as PropType<NativeButtonProps>,\n todayControlProps: Object as PropType<NativeButtonProps>,\n viewSelectProps: Object as PropType<Partial<ViewSelectProps>>,\n },\n setup(props) {\n return () => {\n const views = props.viewSelectProps?.views || ['day', 'week', 'month', 'year']\n return h(ScheduleHeader, { labels: props.labels }, () => [\n h(Box, { class: classes.navigationGroup }, () => [\n h(ScheduleHeader.Previous, {\n ...props.previousControlProps,\n onClick: () => props.onDateChange?.(props.navigationHandlers.previous()),\n }),\n props.control.monthYearSelect\n ? h(ScheduleHeader.MonthYearSelect, {\n ...props.control.monthYearSelect,\n labels: props.labels,\n })\n : h(ScheduleHeader.Control, { interactive: false }, () => props.control.title),\n h(ScheduleHeader.Next, {\n ...props.nextControlProps,\n onClick: () => props.onDateChange?.(props.navigationHandlers.next()),\n }),\n ]),\n h(Box, { class: classes.todayControl }, () => [\n h(ScheduleHeader.Today, {\n ...props.todayControlProps,\n onClick: () => props.onDateChange?.(props.navigationHandlers.today()),\n }),\n ]),\n h(NativeSelect, {\n class: classes.compactViewSelect,\n value: props.view,\n size: 'sm',\n data: views.map((view) => ({ value: view, label: getLabel(view, props.labels) })),\n 'aria-label': getLabel('viewSelectLabel', props.labels),\n onChange: (event: Event) =>\n props.onViewChange?.(\n (event.currentTarget as HTMLSelectElement).value as ScheduleViewLevel,\n ),\n }),\n h(Box, { class: classes.viewSelect, style: { marginInlineStart: 'auto' } }, () => [\n h(ScheduleHeader.ViewSelect, {\n ...props.viewSelectProps,\n value: props.view,\n labels: props.labels,\n onChange: props.onViewChange,\n }),\n ]),\n ])\n }\n },\n})\n\nexport function createHeaderNavigation(\n date: Date | string,\n unit: 'day' | 'week' | 'month' | 'year',\n) {\n return {\n previous: () => toDateString(dayjs(date).subtract(1, unit)),\n next: () => toDateString(dayjs(date).add(1, unit)),\n today: () => toDateString(dayjs()),\n }\n}\n","import { AnyDateValue, DayPositionedEventData, ScheduleEventData } from '../../../types'\nimport { getDayPosition, isAllDayEvent, isEventsOverlap, sortEvents } from '../../../utils'\n\ninterface ColumnHasConflictOptions {\n columns: ScheduleEventData[][]\n columnIndex: number\n event: ScheduleEventData\n allDay: boolean\n date: AnyDateValue\n}\n\nfunction columnHasConflict({\n columns,\n columnIndex,\n event,\n allDay,\n date,\n}: ColumnHasConflictOptions): boolean {\n if (!columns[columnIndex]) {\n return false\n }\n\n return columns[columnIndex].some((e) => {\n const eAllDay = isAllDayEvent({ event: e, date })\n const hasTimeConflict = isEventsOverlap(e, event)\n\n // Don't count all-day events as overlaps\n if (allDay || eAllDay) {\n return false\n }\n\n return hasTimeConflict\n })\n}\n\ninterface GetDayPositionedEventsInput {\n /** Date at which events are positioned, used to check if events are all-day */\n date: AnyDateValue\n\n /** List of all events that belong to the given date, extra events must be filtered out before passing to the function */\n events: ScheduleEventData[]\n\n /** Start time of the day view, used to calculate event positions */\n startTime?: string\n\n /** End time of the day view, used to calculate event positions */\n endTime?: string\n\n /** Number of minutes per time slot, used to align the canvas to whole slots */\n intervalMinutes?: number\n}\n\nexport function getDayPositionedEvents({\n events,\n startTime,\n endTime,\n intervalMinutes,\n date,\n}: GetDayPositionedEventsInput) {\n const columns: ScheduleEventData[][] = []\n const positioned: DayPositionedEventData[] = []\n\n const sorted = sortEvents(events)\n\n for (const event of sorted) {\n const allDay = isAllDayEvent({ event, date })\n\n let column = 0\n\n while (columnHasConflict({ columns, columnIndex: column, event, allDay, date })) {\n column++\n }\n\n if (!columns[column]) {\n columns[column] = []\n }\n\n columns[column].push(event)\n\n const verticalPosition = allDay\n ? { top: 0, height: 100 }\n : getDayPosition({ event, startTime, endTime, intervalMinutes })\n\n positioned.push({\n ...event,\n position: {\n ...verticalPosition,\n allDay,\n column,\n\n // set later\n width: 0,\n offset: 0,\n overlaps: 0,\n },\n })\n }\n for (const positionedEvent of positioned) {\n const { allDay, column } = positionedEvent.position\n\n if (allDay) {\n positionedEvent.position.overlaps = 1\n positionedEvent.position.width = 100\n positionedEvent.position.offset = 0\n continue\n }\n\n // Find events that directly overlap with this event\n const directlyOverlapping: DayPositionedEventData[] = []\n\n for (const otherEvent of positioned) {\n if (otherEvent === positionedEvent || otherEvent.position.allDay) {\n continue\n }\n\n if (isEventsOverlap(otherEvent, positionedEvent)) {\n directlyOverlapping.push(otherEvent)\n }\n }\n\n // Find the max column by also checking overlaps of overlapping events\n // This ensures we account for the full column group\n let maxColumn = column\n\n for (const overlappingEvent of directlyOverlapping) {\n maxColumn = Math.max(maxColumn, overlappingEvent.position.column)\n\n // Check what overlaps with each overlapping event\n for (const otherEvent of positioned) {\n if (otherEvent === overlappingEvent || otherEvent.position.allDay) {\n continue\n }\n\n if (isEventsOverlap(otherEvent, overlappingEvent)) {\n maxColumn = Math.max(maxColumn, otherEvent.position.column)\n }\n }\n }\n\n const totalColumns = maxColumn + 1\n\n // Find the first occupied column to the right of this event\n // Events expand to fill empty columns but stop at the next occupied column\n let nextOccupiedColumn = totalColumns\n\n for (const other of directlyOverlapping) {\n if (other.position.column > column && other.position.column < nextOccupiedColumn) {\n nextOccupiedColumn = other.position.column\n }\n }\n\n const columnsSpanned = nextOccupiedColumn - column\n\n positionedEvent.position.overlaps = totalColumns\n positionedEvent.position.width = (columnsSpanned / totalColumns) * 100\n positionedEvent.position.offset = (column * 100) / totalColumns\n }\n\n return positioned\n}\n","import dayjs from 'dayjs'\nimport { AnyDateValue, DayPositionedEventData, ScheduleEventData } from '../../../types'\nimport { getDayPosition, isAllDayEvent, isEventInTimeRange, validateEvent } from '../../../utils'\nimport { getDayPositionedEvents } from './get-day-positioned-events'\n\ninterface GetDayViewEventsInput {\n events: ScheduleEventData[] | undefined\n date: AnyDateValue\n startTime?: string\n endTime?: string\n intervalMinutes?: number\n}\n\nexport function getDayViewEvents({\n events,\n date,\n startTime,\n endTime,\n intervalMinutes,\n}: GetDayViewEventsInput) {\n if (events === undefined) {\n return {\n allDayEvents: [],\n regularEvents: [],\n backgroundTimedEvents: [],\n backgroundAllDayEvents: [],\n }\n }\n\n const ids = new Set<string | number>()\n const filteredEvents: ScheduleEventData[] = []\n const backgroundFiltered: ScheduleEventData[] = []\n const dayStart = dayjs(date).startOf('day')\n const dayEnd = dayjs(date).endOf('day')\n\n for (const event of events) {\n const eventStart = dayjs(event.start)\n const eventEnd = dayjs(event.end)\n const isOnDay = eventStart.isSame(dayStart, 'day')\n const spansIntoDay =\n !isOnDay &&\n event.display === 'background' &&\n eventStart.isBefore(dayEnd) &&\n eventEnd.isAfter(dayStart)\n\n if (isOnDay || spansIntoDay) {\n if (isOnDay && !isEventInTimeRange({ event, startTime, endTime })) {\n continue\n }\n\n const validated = validateEvent(event)\n\n if (!ids.has(event.id)) {\n ids.add(event.id)\n } else {\n throw new Error(`[@mantine/schedule] DayView: Duplicated event ids found: ${event.id}`)\n }\n\n if (event.display === 'background') {\n backgroundFiltered.push(validated)\n } else {\n filteredEvents.push(validated)\n }\n }\n }\n\n const positionedEvents = getDayPositionedEvents({\n events: filteredEvents,\n startTime,\n endTime,\n intervalMinutes,\n date,\n })\n\n const allDayEvents: DayPositionedEventData[] = []\n const regularEvents: DayPositionedEventData[] = []\n\n for (const event of positionedEvents) {\n if (event.position.allDay) {\n allDayEvents.push(event)\n } else {\n regularEvents.push(event)\n }\n }\n\n const backgroundTimedEvents: DayPositionedEventData[] = []\n const backgroundAllDayEvents: DayPositionedEventData[] = []\n for (const event of backgroundFiltered) {\n const eventStart = dayjs(event.start)\n const eventEnd = dayjs(event.end)\n const clippedStart = eventStart.isBefore(dayStart) ? dayStart : eventStart\n const clippedEnd = eventEnd.isAfter(dayEnd) ? dayEnd : eventEnd\n\n const clippedEvent = {\n ...event,\n start: clippedStart.format('YYYY-MM-DD HH:mm:ss'),\n end: clippedEnd.format('YYYY-MM-DD HH:mm:ss'),\n }\n\n const allDay = isAllDayEvent({ event: clippedEvent, date })\n\n if (allDay) {\n backgroundAllDayEvents.push({\n ...event,\n position: {\n top: 0,\n height: 100,\n allDay: true,\n width: 100,\n offset: 0,\n column: 0,\n overlaps: 1,\n },\n })\n } else {\n const { top, height } = getDayPosition({\n event: clippedEvent,\n startTime,\n endTime,\n intervalMinutes,\n })\n if (height <= 0) {\n continue\n }\n backgroundTimedEvents.push({\n ...event,\n position: { top, height, allDay: false, width: 100, offset: 0, column: 0, overlaps: 1 },\n })\n }\n }\n\n return { allDayEvents, regularEvents, backgroundTimedEvents, backgroundAllDayEvents }\n}\n",".dayView {\n --slot-height: var(--day-view-slot-height, 64px); /* total height of 1 hour slot */\n --all-day-slot-height: var(--day-view-all-day-slot-height, 44px); /* height of all day slot */\n --day-view-slot-labels-width: 80px;\n --day-view-radius: var(--schedule-radius, var(--mantine-radius-default));\n border-radius: var(--day-view-radius);\n overflow: hidden;\n\n @mixin where-light {\n --day-view-border-color: var(--mantine-color-gray-3);\n --day-view-business-hours-bg: var(--mantine-color-white);\n --day-view-non-business-hours-bg: var(--mantine-color-gray-0);\n }\n\n @mixin where-dark {\n --day-view-border-color: var(--mantine-color-dark-4);\n --day-view-business-hours-bg: var(--mantine-color-dark-7);\n --day-view-non-business-hours-bg: var(--mantine-color-dark-6);\n }\n}\n\n.dayViewHeader {\n text-transform: capitalize;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: var(--mantine-font-size-sm);\n font-weight: var(--mantine-font-weight-medium);\n}\n\n.dayViewScrollArea {\n border: 1px solid var(--day-view-border-color);\n border-radius: var(--day-view-radius);\n overflow: hidden;\n\n :where(:global(.mantine-ScrollArea-scrollbar)) {\n z-index: 4;\n }\n}\n\n.dayViewInner {\n display: flex;\n}\n\n.dayViewTimeSlots {\n position: relative;\n\n &:where(:first-of-type) .dayViewSlot:where([data-first]) {\n border-top-color: transparent;\n }\n}\n\n.dayViewSlotLabels {\n width: var(--day-view-slot-labels-width);\n}\n\n.dayViewSlotLabel {\n height: var(--slot-height);\n border-top: 1px solid var(--day-view-border-color);\n font-size: var(--mantine-font-size-sm);\n text-align: right;\n padding: 4px 8px;\n font-variant-numeric: tabular-nums;\n\n &:where([data-all-day]) {\n height: var(--all-day-slot-height);\n border-top: 0;\n }\n\n &:where(:first-of-type) {\n border-top: 0;\n }\n\n &:where([data-business-hours]) {\n background-color: var(--day-view-business-hours-bg);\n }\n\n &:where([data-non-business-hours]) {\n background-color: var(--day-view-non-business-hours-bg);\n }\n}\n\n.dayViewSlots {\n flex: 1;\n}\n\n.dayViewSlot {\n display: block;\n width: 100%;\n border-top: 1px dotted var(--day-view-border-color);\n height: calc(var(--slot-height) * var(--slot-size));\n position: relative;\n\n &:where(:focus) {\n z-index: 1;\n }\n\n &:where([data-hour-start]) {\n border-top: 1px solid var(--day-view-border-color);\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-all-day]) {\n height: var(--all-day-slot-height);\n border-top: 0;\n }\n\n &:where([data-business-hours]) {\n background-color: var(--day-view-business-hours-bg);\n }\n\n &:where([data-non-business-hours]) {\n background-color: var(--day-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.dayViewBackgroundEvent {\n position: absolute;\n border-radius: 0;\n pointer-events: none;\n z-index: 2;\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.dayViewAllDay {\n position: relative;\n height: var(--all-day-slot-height);\n}\n\n.dayViewAllDayEvents {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n pointer-events: none;\n z-index: 3;\n}\n","import dayjs from 'dayjs'\nimport { defineComponent, h, ref, type CSSProperties, type PropType, type SlotsType } from 'vue'\nimport { Box, ScrollArea, UnstyledButton } from '@mantine-vue/core'\nimport type { DayViewProps, MoreEventsProps } from '../../component-props'\nimport { useEventResize } from '../../hooks/use-event-resize'\nimport type { DateLabelFormat, DateTimeStringValue } from '../../types'\nimport {\n formatDate,\n getBusinessHoursMod,\n getDayTimeIntervals,\n getVisibleEvents,\n toDateString,\n} from '../../utils'\nimport { CurrentTimeIndicator } from '../CurrentTimeIndicator/CurrentTimeIndicator'\nimport { MoreEvents } from '../MoreEvents/MoreEvents'\nimport { useSlotDragSelect } from '../use-slot-drag-select'\nimport { ScheduleHeaderBase, createHeaderNavigation } from '../ScheduleHeader/ScheduleHeaderBase'\nimport {\n eventNode,\n forwardEventSlots,\n getDropEvent,\n getExpandedEvents,\n getTimeSlotDropTarget,\n moveEventTo,\n moveEventToAllDay,\n resolveScheduleRadius,\n timeViewProps,\n type EventSlots,\n} from '../shared'\nimport { getDayViewEvents } from './get-day-view-events/get-day-view-events'\nimport classes from './DayView.module.css'\n\nexport const DayView = defineComponent({\n name: 'DayView',\n inheritAttrs: false,\n slots: Object as SlotsType<EventSlots>,\n props: {\n ...timeViewProps,\n intervalMinutes: { type: Number, default: 15 },\n headerFormat: {\n type: [String, Function] as PropType<DateLabelFormat>,\n default: 'MMMM D, YYYY',\n },\n withAllDaySlot: { type: Boolean, default: true },\n allDaySlotHeight: { type: [String, Number] as PropType<CSSProperties['height']>, default: 44 },\n maxAllDayEvents: { type: Number, default: 3 },\n moreEventsProps: Object as PropType<Partial<MoreEventsProps>>,\n },\n setup(props, { attrs, slots }) {\n const timeSlotsContainer = ref<HTMLElement | null>(null)\n const dropTargetSlotIndex = ref<number | null>(null)\n const eventResize = useEventResize({\n enabled: () => props.withEventResize,\n mode: () => props.mode,\n startTime: () => props.startTime,\n endTime: () => props.endTime,\n intervalMinutes: () => props.intervalMinutes,\n onEventResize: () => props.onEventResize,\n canResizeEvent: () => props.canResizeEvent,\n })\n const slotTimes = ref<{ startTime: string; endTime: string }[]>([])\n const dayGroupRef = ref('')\n const slotDragSelect = useSlotDragSelect({\n enabled: () => props.withDragSlotSelect && props.mode !== 'static',\n onDragEnd: () =>\n props.onSlotDragEnd\n ? (startIndex, endIndex) => {\n const startSlot = slotTimes.value[startIndex]\n const endSlot = slotTimes.value[endIndex]\n if (startSlot && endSlot) {\n props.onSlotDragEnd?.(\n `${dayGroupRef.value} ${startSlot.startTime}` as DateTimeStringValue,\n `${dayGroupRef.value} ${endSlot.endTime}` as DateTimeStringValue,\n )\n }\n }\n : undefined,\n })\n\n return () => {\n const date = toDateString(props.date!)\n const datePart = dayjs(date).format('YYYY-MM-DD')\n const now = dayjs(props.getCurrentTime?.() ?? dayjs())\n const showCurrentTimeIndicator =\n props.withCurrentTimeIndicator ?? dayjs(date).isSame(now, 'day')\n const expanded = getExpandedEvents(\n props.events,\n dayjs(date).startOf('day').format('YYYY-MM-DD HH:mm:ss'),\n dayjs(date).endOf('day').format('YYYY-MM-DD HH:mm:ss'),\n props.recurrenceExpansionLimit,\n )\n const { allDayEvents, regularEvents, backgroundTimedEvents, backgroundAllDayEvents } =\n getDayViewEvents({\n events: expanded,\n date,\n startTime: props.startTime,\n endTime: props.endTime,\n intervalMinutes: props.intervalMinutes,\n })\n const intervals = getDayTimeIntervals({\n startTime: props.startTime,\n endTime: props.endTime,\n intervalMinutes: props.intervalMinutes,\n })\n dayGroupRef.value = datePart\n slotTimes.value = intervals.map((slot) => ({\n startTime: slot.startTime,\n endTime: slot.endTime,\n }))\n const withSlotSelect = props.withDragSlotSelect && props.mode !== 'static'\n const withDragHandlers =\n props.mode !== 'static' &&\n (props.withEventsDragAndDrop || Boolean(props.onExternalEventDrop))\n const { visibleEventsCount, hiddenEventsCount } = getVisibleEvents({\n maxEvents: props.maxAllDayEvents,\n totalEvents: allDayEvents.length,\n })\n const emitDrop = (nativeEvent: DragEvent, target: string) => {\n nativeEvent.preventDefault()\n const event = getDropEvent(expanded, nativeEvent.dataTransfer)\n if (event) props.onEventDrop?.(moveEventTo(event, target))\n else if (nativeEvent.dataTransfer)\n props.onExternalEventDrop?.(nativeEvent.dataTransfer, target)\n }\n const emitAllDayDrop = (nativeEvent: DragEvent) => {\n nativeEvent.preventDefault()\n const event = getDropEvent(expanded, nativeEvent.dataTransfer)\n if (event) props.onEventDrop?.(moveEventToAllDay(event, datePart))\n else if (nativeEvent.dataTransfer)\n props.onExternalEventDrop?.(nativeEvent.dataTransfer, `${datePart} 00:00:00`)\n }\n const rootStyle = {\n '--day-view-radius': resolveScheduleRadius(props.radius),\n '--day-view-slot-height':\n typeof props.slotHeight === 'number' ? `${props.slotHeight}px` : props.slotHeight,\n '--day-view-all-day-slot-height':\n typeof props.allDaySlotHeight === 'number'\n ? `${props.allDaySlotHeight}px`\n : props.allDaySlotHeight,\n } as CSSProperties\n return h(\n Box,\n {\n ...attrs,\n class: [classes.dayView, attrs.class],\n style: [rootStyle, attrs.style],\n mod: { static: props.mode === 'static', 'slot-dragging': slotDragSelect.isDragging() },\n },\n () => [\n props.withHeader\n ? h(ScheduleHeaderBase, {\n view: 'day',\n labels: props.labels,\n onDateChange: props.onDateChange,\n onViewChange: props.onViewChange,\n navigationHandlers: createHeaderNavigation(date, 'day'),\n previousControlProps: props.previousControlProps,\n nextControlProps: props.nextControlProps,\n todayControlProps: props.todayControlProps,\n viewSelectProps: props.viewSelectProps,\n control: {\n title: formatDate({\n date,\n locale: props.locale || 'en',\n format: props.headerFormat,\n }),\n },\n })\n : null,\n h(ScrollArea.Autosize, { class: classes.dayViewScrollArea, scrollbarSize: 4 }, () => [\n h(Box, { class: classes.dayViewInner }, () => [\n h('div', { class: classes.dayViewSlotLabels }, [\n props.withAllDaySlot\n ? h(Box, { class: classes.dayViewSlotLabel, mod: { 'all-day': true } }, () =>\n getLabelSafe('allDay', props.labels),\n )\n : null,\n ...intervals\n .filter((slot) => slot.isHourStart)\n .map((slot) =>\n h(Box, { class: classes.dayViewSlotLabel }, () =>\n formatDate({\n date: `${datePart} ${slot.startTime}`,\n locale: props.locale || 'en',\n format: props.slotLabelFormat,\n }),\n ),\n ),\n ]),\n h('div', { class: classes.dayViewSlots }, [\n props.withAllDaySlot\n ? h('div', { class: classes.dayViewAllDay }, [\n ...backgroundAllDayEvents.map((event) =>\n h('div', { class: classes.dayViewBackgroundEvent, key: event.id }),\n ),\n h('div', { class: classes.dayViewAllDayEvents }, [\n ...allDayEvents\n .slice(0, visibleEventsCount)\n .map((event) =>\n eventNode(event, props, { key: event.id, nowrap: true }, slots),\n ),\n hiddenEventsCount > 0\n ? h(\n MoreEvents,\n {\n events: allDayEvents,\n moreEventsCount: hiddenEventsCount,\n labels: props.labels,\n mode: props.mode,\n renderEvent: props.renderEvent,\n renderEventBody: props.renderEventBody,\n onEventClick: props.onEventClick,\n ...props.moreEventsProps,\n },\n forwardEventSlots(slots),\n )\n : null,\n ]),\n h(UnstyledButton, {\n class: classes.dayViewSlot,\n mod: { 'all-day': true, static: props.mode === 'static' },\n tabindex: props.mode === 'static' ? -1 : 0,\n 'aria-label': `${getLabelSafe('timeSlot', props.labels)} ${getLabelSafe('allDay', props.labels)}`,\n onClick:\n props.mode === 'static'\n ? undefined\n : (event: MouseEvent) => props.onAllDaySlotClick?.(date, event),\n onDragover: (event: DragEvent) => event.preventDefault(),\n onDrop: (event: DragEvent) => emitAllDayDrop(event),\n }),\n ])\n : null,\n h(\n 'div',\n {\n ref: timeSlotsContainer,\n class: classes.dayViewTimeSlots,\n onDragover: withDragHandlers\n ? (event: DragEvent) => {\n event.preventDefault()\n if (!timeSlotsContainer.value) return\n const target = getTimeSlotDropTarget({\n nativeEvent: event,\n container: timeSlotsContainer.value,\n intervals,\n date: datePart,\n })\n dropTargetSlotIndex.value = target?.slotIndex ?? null\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = event.dataTransfer.types.includes(\n 'application/json',\n )\n ? 'move'\n : 'copy'\n }\n }\n : undefined,\n onDragleave: withDragHandlers\n ? (event: DragEvent) => {\n if (\n !(event.relatedTarget instanceof Node) ||\n !timeSlotsContainer.value?.contains(event.relatedTarget)\n ) {\n dropTargetSlotIndex.value = null\n }\n }\n : undefined,\n onDrop: withDragHandlers\n ? (event: DragEvent) => {\n if (!timeSlotsContainer.value) return\n const target = getTimeSlotDropTarget({\n nativeEvent: event,\n container: timeSlotsContainer.value,\n intervals,\n date: datePart,\n })\n dropTargetSlotIndex.value = null\n if (target) emitDrop(event, target.target)\n }\n : undefined,\n },\n [\n ...backgroundTimedEvents.map((event) =>\n h('div', {\n key: event.id,\n class: classes.dayViewBackgroundEvent,\n style: {\n top: `${event.position.top}%`,\n height: `${event.position.height}%`,\n },\n }),\n ),\n ...regularEvents.map((event) => {\n const resizePosition = eventResize.getResizePosition(event.id)\n const isResizable = eventResize.isResizableEvent(event)\n return eventNode(\n event,\n props,\n {\n key: event.id,\n autoSize: true,\n style: {\n position: 'absolute',\n top: `${resizePosition?.top ?? event.position.top}%`,\n height: `${resizePosition?.height ?? event.position.height}%`,\n width: `${event.position.width}%`,\n insetInlineStart: `${event.position.offset}%`,\n },\n withResize: isResizable,\n isResizing: resizePosition !== null,\n onClick: props.onEventClick\n ? (nativeEvent: MouseEvent) => {\n if (!eventResize.wasResizing()) {\n props.onEventClick?.(event, nativeEvent)\n }\n }\n : undefined,\n onResizeStart: (edge: 'top' | 'bottom', pointerEvent: PointerEvent) => {\n if (!timeSlotsContainer.value) return\n eventResize.handleResizeStart({\n event,\n edge,\n container: timeSlotsContainer.value,\n originalTop: event.position.top,\n originalHeight: event.position.height,\n eventDate: datePart,\n pointerEvent,\n })\n },\n },\n slots,\n )\n }),\n showCurrentTimeIndicator\n ? h(CurrentTimeIndicator, {\n startOffset: 'calc(var(--day-view-slot-labels-width) * -1)',\n endOffset: '0rem',\n topOffset: '0rem',\n timeBubbleStartOffset:\n 'calc(var(--day-view-slot-labels-width) * -1 + 30px)',\n currentTimeFormat: props.slotLabelFormat,\n startTime: props.startTime,\n endTime: props.endTime,\n intervalMinutes: props.intervalMinutes,\n withTimeBubble: props.withCurrentTimeBubble,\n withThumb: !props.withCurrentTimeBubble,\n getCurrentTime: props.getCurrentTime,\n locale: props.locale,\n })\n : null,\n ...intervals.map((slot, index) => {\n const start = dayjs(`${datePart} ${slot.startTime}`)\n const end = start.add(props.intervalMinutes, 'minute')\n const mod = props.highlightBusinessHours\n ? getBusinessHoursMod({\n time: start.format('HH:mm:ss'),\n businessHours: props.businessHours || ['09:00:00', '17:00:00'],\n highlightBusinessHours: true,\n dayOfWeek: start.day() as import('../../types').DayOfWeek,\n })\n : { 'business-hours': false, 'non-business-hours': false }\n return h(UnstyledButton, {\n class: classes.dayViewSlot,\n 'data-time-slot-index': index,\n 'data-drag-slot-index': withSlotSelect ? index : undefined,\n 'data-drag-slot-group': withSlotSelect ? datePart : undefined,\n style: { '--slot-size': String(props.intervalMinutes / 60) },\n mod: {\n first: index === 0,\n 'hour-start': slot.isHourStart,\n static: props.mode === 'static',\n 'drop-target': dropTargetSlotIndex.value === index,\n 'drag-selected': slotDragSelect.isSlotSelected(index, datePart),\n 'business-hours': mod['business-hours'],\n 'non-business-hours': mod['non-business-hours'],\n },\n tabindex: props.mode === 'static' ? -1 : index === 0 ? 0 : -1,\n onKeydown:\n props.mode === 'static'\n ? undefined\n : (event: KeyboardEvent) => {\n const nextIndex =\n event.key === 'ArrowDown'\n ? index + 1\n : event.key === 'ArrowUp'\n ? index - 1\n : -1\n if (nextIndex < 0 || nextIndex >= intervals.length) return\n event.preventDefault()\n timeSlotsContainer.value\n ?.querySelector<HTMLButtonElement>(\n `[data-time-slot-index=\"${nextIndex}\"]`,\n )\n ?.focus()\n },\n 'aria-label': `${getLabelSafe('timeSlot', props.labels)} ${slot.startTime} - ${slot.endTime}`,\n onClick: (nativeEvent: MouseEvent) =>\n props.onTimeSlotClick?.({\n slotStart: start.format('YYYY-MM-DD HH:mm:ss') as DateTimeStringValue,\n slotEnd: end.format('YYYY-MM-DD HH:mm:ss') as DateTimeStringValue,\n nativeEvent,\n }),\n onPointerdown: withSlotSelect\n ? (nativeEvent: PointerEvent) =>\n slotDragSelect.handleSlotPointerDown(nativeEvent, index, datePart)\n : undefined,\n onDragover: (event: DragEvent) => event.preventDefault(),\n })\n }),\n ],\n ),\n ]),\n ]),\n ]),\n ],\n )\n }\n },\n})\n\nfunction getLabelSafe(key: 'allDay' | 'timeSlot', labels: DayViewProps['labels']) {\n const defaults = { allDay: 'All day', timeSlot: 'Time slot' }\n return labels?.[key] || defaults[key]\n}\n\nexport type { DayViewProps }\nexport type DayViewStylesNames =\n | 'dayView'\n | 'dayViewInner'\n | 'dayViewScrollArea'\n | 'dayViewAllDay'\n | 'dayViewAllDayEvents'\n | 'dayViewSlot'\n | 'dayViewSlots'\n | 'dayViewTimeSlots'\n | 'dayViewSlotLabel'\n | 'dayViewSlotLabels'\n | 'dayViewBackgroundEvent'\n","import dayjs from 'dayjs'\nimport { AnyDateValue, DateStringValue, ScheduleEventData } from '../../types'\nimport { isMultidayEvent, validateEvent } from '../../utils'\n\nexport type GroupedEvents = Record<DateStringValue, ScheduleEventData[]>\n\nfunction groupEventByDate(event: ScheduleEventData, groupedEvents: GroupedEvents) {\n if (isMultidayEvent(event)) {\n const startDate = dayjs(event.start).startOf('day')\n const endDate = dayjs(event.end).startOf('day')\n\n for (\n let date = startDate;\n date.isBefore(endDate) || date.isSame(endDate);\n date = date.add(1, 'day')\n ) {\n const dateKey = date.format('YYYY-MM-DD')\n if (!groupedEvents[dateKey]) {\n groupedEvents[dateKey] = []\n }\n groupedEvents[dateKey].push(event)\n }\n\n return\n }\n\n const eventDate = dayjs(event.start).format('YYYY-MM-DD')\n if (!groupedEvents[eventDate]) {\n groupedEvents[eventDate] = []\n }\n groupedEvents[eventDate].push(event)\n}\n\ninterface GetMobileMonthViewEventsInput {\n date: AnyDateValue\n events: ScheduleEventData[] | undefined\n}\n\nexport function getMobileMonthViewEvents({ date, events }: GetMobileMonthViewEventsInput) {\n const groupedEvents: GroupedEvents = {}\n\n if (events === undefined) {\n return groupedEvents\n }\n\n const ids = new Set<string | number>()\n\n for (const event of events) {\n if (event.display === 'background') {\n continue\n }\n\n if (dayjs(event.start).isSame(dayjs(date), 'month')) {\n groupEventByDate(validateEvent(event), groupedEvents)\n\n if (!ids.has(event.id)) {\n ids.add(event.id)\n } else {\n throw new Error(\n `[@mantine/schedule] MobileMonthView: Duplicated event ids found: ${event.id}`,\n )\n }\n }\n }\n\n return groupedEvents\n}\n",".mobileMonthView {\n --mobile-month-view-radius: var(--schedule-radius, var(--mantine-radius-default));\n --week-numbers-offset: 0rem;\n --day-base-color: var(--mantine-color-text);\n --day-dimmed-color: alpha(var(--day-base-color), 0.5);\n\n display: flex;\n flex-direction: column;\n height: 100%;\n\n @mixin where-light {\n --mobile-month-view-border-color: var(--mantine-color-gray-3);\n }\n\n @mixin where-dark {\n --mobile-month-view-border-color: var(--mantine-color-dark-4);\n }\n\n &:where([data-with-week-numbers]) {\n --week-numbers-offset: 32px;\n }\n}\n\n.mobileMonthViewHeader {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--mantine-spacing-sm);\n border-bottom: 1px solid var(--mobile-month-view-border-color);\n}\n\n.mobileMonthViewHeaderBackButton {\n display: flex;\n align-items: center;\n gap: 4px;\n font-weight: var(--mantine-font-weight-medium);\n cursor: pointer;\n user-select: none;\n font-size: var(--mobile-month-view-font-size);\n\n &:where([data-static]) {\n cursor: default;\n pointer-events: none;\n }\n}\n\n.mobileMonthViewHeaderLabel {\n user-select: none;\n font-weight: var(--mantine-font-weight-semibold);\n text-transform: capitalize;\n}\n\n.mobileMonthViewCalendar {\n --mobile-month-view-font-size: clamp(6px, 3.5cqw, 22px);\n\n container-type: inline-size;\n padding: var(--mantine-spacing-sm);\n border-bottom: 1px solid var(--mobile-month-view-border-color);\n}\n\n.mobileMonthViewWeekdays {\n display: flex;\n margin-bottom: var(--mantine-spacing-xs);\n}\n\n.mobileMonthViewWeekdaysCorner {\n flex: 0 0 var(--week-numbers-offset);\n}\n\n.mobileMonthViewWeekday {\n flex: 0 0 calc(100% / 7 - var(--week-numbers-offset) / 7);\n font-size: var(--mobile-month-view-font-size);\n font-weight: var(--mantine-font-weight-medium);\n text-align: center;\n text-transform: capitalize;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: default;\n user-select: none;\n color: var(--day-dimmed-color);\n padding-block: 4px;\n}\n\n.mobileMonthViewWeek {\n display: flex;\n}\n\n.mobileMonthViewWeekNumber {\n flex: 0 0 calc(var(--week-numbers-offset) - rem(4px));\n margin-inline-end: rem(4px);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: var(--mantine-font-size-xs);\n border-radius: var(--mobile-month-view-radius);\n padding: 4px;\n font-weight: var(--mantine-font-weight-medium);\n cursor: pointer;\n user-select: none;\n color: var(--day-dimmed-color);\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.mobileMonthViewDay {\n flex: 0 0 calc(100% / 7 - var(--week-numbers-offset) / 7);\n height: 48px;\n padding: 4px;\n font-weight: var(--mantine-font-weight-medium);\n font-size: var(--mobile-month-view-font-size);\n color: var(--day-base-color);\n cursor: pointer;\n user-select: none;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n position: relative;\n z-index: 0;\n\n &::before {\n width: 32px;\n height: 32px;\n border-radius: 100%;\n content: '';\n position: absolute;\n top: 7px;\n left: calc(50% - 16px);\n z-index: -1;\n pointer-events: none;\n }\n\n &:focus {\n z-index: 1;\n }\n\n &:where([data-hidden]) {\n visibility: hidden;\n pointer-events: none;\n }\n\n &:where([data-weekend]) {\n color: var(--mantine-color-red-6);\n }\n\n &:where([data-outside]) {\n color: var(--day-dimmed-color);\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-today]:not([data-selected])) {\n @mixin where-light {\n &::before {\n background-color: var(--mantine-color-gray-2);\n }\n }\n\n @mixin where-dark {\n &::before {\n background-color: var(--mantine-color-dark-5);\n }\n }\n }\n\n &:where([data-selected]) {\n color: var(--mantine-primary-color-contrast);\n\n &::before {\n background-color: var(--mantine-primary-color-filled);\n }\n\n @mixin hover {\n &::before {\n background-color: var(--mantine-primary-color-filled-hover);\n }\n }\n }\n\n &:where([data-static]) {\n cursor: default;\n pointer-events: none;\n }\n}\n\n.mobileMonthViewDayIndicators {\n position: absolute;\n bottom: 2px;\n inset-inline: 0;\n display: flex;\n justify-content: center;\n padding-inline-start: 2px;\n}\n\n.mobileMonthViewDayIndicator {\n width: 5px;\n height: 5px;\n border-radius: 100%;\n margin-inline-start: -1px;\n}\n\n.mobileMonthViewEventsList {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n padding: var(--mantine-spacing-sm);\n}\n\n.mobileMonthViewEventsHeader {\n margin-bottom: var(--mantine-spacing-sm);\n font-weight: var(--mantine-font-weight-semibold);\n text-transform: capitalize;\n}\n\n.mobileMonthViewEvent {\n display: block;\n width: 100%;\n text-align: start;\n cursor: pointer;\n\n &:where(:not(:last-child)) {\n border-bottom: 1px solid var(--mobile-month-view-border-color);\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\n.mobileMonthViewEventBody {\n display: flex;\n gap: var(--mantine-spacing-sm);\n padding: var(--mantine-spacing-xs) 0;\n}\n\n.mobileMonthViewEventColor {\n width: 4px;\n border-radius: 2px;\n flex-shrink: 0;\n}\n\n.mobileMonthViewEventTime {\n margin-top: 2px;\n font-size: var(--mantine-font-size-xs);\n color: var(--mantine-color-dimmed);\n}\n\n.mobileMonthViewNoEvents {\n color: var(--mantine-color-dimmed);\n text-align: center;\n padding-block: var(--mantine-spacing-xl);\n}\n","import dayjs from 'dayjs'\nimport { defineComponent, h, ref, watch, type PropType, type SlotsType, type VNodeChild } from 'vue'\nimport {\n AccordionChevron,\n Box,\n getThemeColor,\n Text,\n UnstyledButton,\n useDirection,\n useSafeMantineTheme,\n} from '@mantine-vue/core'\nimport type { MobileMonthViewProps } from '../../component-props'\nimport type {\n DateLabelFormat,\n DateStringValue,\n DayOfWeek,\n ScheduleEventData,\n ScheduleMode,\n} from '../../types'\nimport { formatDate, getMonthDays, getWeekNumber, getWeekdaysNames } from '../../utils'\nimport { baseViewProps, getExpandedEvents, resolveScheduleRadius } from '../shared'\nimport { getMobileMonthViewEvents } from './get-mobile-month-view-events'\nimport classes from './MobileMonthView.module.css'\n\nexport interface MobileMonthViewSlots {\n /** Scoped alternative to the `renderEvent` prop */\n event?: (props: Record<string, unknown> & { event: ScheduleEventData }) => VNodeChild\n /** Scoped alternative to the `renderHeader` prop */\n header?: (props: {\n mode: ScheduleMode\n date: Date | DateStringValue\n defaultHeader: VNodeChild\n }) => VNodeChild\n}\n\nexport const MobileMonthView = defineComponent({\n name: 'MobileMonthView',\n inheritAttrs: false,\n slots: Object as SlotsType<MobileMonthViewSlots>,\n props: {\n ...baseViewProps,\n selectedDate: [String, Date, null] as PropType<Date | DateStringValue | null>,\n defaultSelectedDate: [String, Date, null] as PropType<Date | DateStringValue | null>,\n onSelectedDateChange: Function as PropType<MobileMonthViewProps['onSelectedDateChange']>,\n withWeekNumbers: Boolean,\n withWeekDays: { type: Boolean, default: true },\n firstDayOfWeek: { type: Number as PropType<DayOfWeek>, default: 1 },\n weekdayFormat: { type: [String, Function] as PropType<DateLabelFormat>, default: 'dd' },\n weekendDays: { type: Array as PropType<DayOfWeek[]>, default: () => [0, 6] },\n getWeekNumberProps: Function as PropType<MobileMonthViewProps['getWeekNumberProps']>,\n getDayProps: Function as PropType<MobileMonthViewProps['getDayProps']>,\n onDayClick: Function as PropType<MobileMonthViewProps['onDayClick']>,\n onWeekNumberClick: Function as PropType<MobileMonthViewProps['onWeekNumberClick']>,\n consistentWeeks: { type: Boolean, default: true },\n highlightToday: { type: Boolean, default: true },\n withOutsideDays: Boolean,\n eventsHeaderFormat: {\n type: [String, Function] as PropType<DateLabelFormat>,\n default: 'dddd, MMMM D',\n },\n onYearClick: Function as PropType<() => void>,\n renderHeader: Function as PropType<MobileMonthViewProps['renderHeader']>,\n },\n setup(props, { attrs, slots }) {\n const { dir } = useDirection()\n const theme = useSafeMantineTheme()\n const internalSelected = ref<DateStringValue | null>(\n props.selectedDate !== undefined\n ? props.selectedDate\n ? (dayjs(props.selectedDate).format('YYYY-MM-DD') as DateStringValue)\n : null\n : (dayjs(props.defaultSelectedDate ?? dayjs()).format('YYYY-MM-DD') as DateStringValue),\n )\n watch(\n () => props.selectedDate,\n (value) => {\n if (value !== undefined) {\n internalSelected.value = value\n ? (dayjs(value).format('YYYY-MM-DD') as DateStringValue)\n : null\n }\n },\n { immediate: true },\n )\n const select = (date: DateStringValue) => {\n internalSelected.value = date\n props.onSelectedDateChange?.(date)\n }\n return () => {\n const month = dayjs(props.date).startOf('month')\n const weeks = getMonthDays({\n month,\n firstDayOfWeek: props.firstDayOfWeek,\n consistentWeeks: props.consistentWeeks,\n })\n const expanded = getExpandedEvents(\n props.events,\n weeks[0][0],\n dayjs(weeks.at(-1)!.at(-1)!).endOf('day').format('YYYY-MM-DD HH:mm:ss'),\n props.recurrenceExpansionLimit,\n )\n const eventsByDay = getMobileMonthViewEvents({ date: month, events: expanded })\n const weekdays = getWeekdaysNames({\n locale: props.locale || 'en',\n format: props.weekdayFormat,\n firstDayOfWeek: props.firstDayOfWeek,\n })\n const selectedEvents = internalSelected.value ? eventsByDay[internalSelected.value] || [] : []\n const headerDefault: VNodeChild = [\n h(\n UnstyledButton,\n {\n class: classes.mobileMonthViewHeaderBackButton,\n mod: { static: props.mode === 'static' },\n tabindex: props.mode === 'static' ? -1 : 0,\n onClick: props.mode === 'static' ? undefined : props.onYearClick,\n },\n () => [\n h(AccordionChevron, {\n size: 20,\n style: { transform: `rotate(${dir.value === 'rtl' ? -90 : 90}deg)` },\n }),\n month.format('YYYY'),\n ],\n ),\n h(Text, { class: classes.mobileMonthViewHeaderLabel }, () =>\n formatDate({ date: month, locale: props.locale || 'en', format: 'MMMM YYYY' }),\n ),\n ]\n return h(\n Box,\n {\n ...attrs,\n class: [classes.mobileMonthView, attrs.class],\n style: [\n { '--mobile-month-view-radius': resolveScheduleRadius(props.radius) },\n attrs.style,\n ],\n mod: { 'with-week-numbers': props.withWeekNumbers },\n },\n () => [\n h('div', { class: classes.mobileMonthViewHeader }, [\n props.renderHeader?.({\n mode: props.mode,\n date: props.date!,\n defaultHeader: headerDefault,\n }) ||\n slots.header?.({\n mode: props.mode,\n date: props.date!,\n defaultHeader: headerDefault,\n }) ||\n headerDefault,\n ]),\n h(\n Box,\n {\n class: classes.mobileMonthViewCalendar,\n mod: { 'with-weekdays': props.withWeekDays },\n },\n () => [\n props.withWeekDays\n ? h('div', { class: classes.mobileMonthViewWeekdays }, [\n props.withWeekNumbers\n ? h('span', { class: classes.mobileMonthViewWeekdaysCorner })\n : null,\n ...weekdays.map((weekday) =>\n h('span', { class: classes.mobileMonthViewWeekday }, [weekday]),\n ),\n ])\n : null,\n ...weeks.map((week) =>\n h('div', { class: classes.mobileMonthViewWeek }, [\n props.withWeekNumbers\n ? h(\n UnstyledButton,\n {\n class: classes.mobileMonthViewWeekNumber,\n mod: { static: props.mode === 'static' },\n tabindex: props.mode === 'static' ? -1 : 0,\n ...props.getWeekNumberProps?.(\n dayjs(week[0]).format('YYYY-MM-DD') as DateStringValue,\n ),\n onClick: (event: MouseEvent) =>\n props.onWeekNumberClick?.(\n dayjs(week[0]).format('YYYY-MM-DD') as DateStringValue,\n event,\n ),\n },\n () => String(getWeekNumber(week)),\n )\n : null,\n ...week.map((date) => {\n const value = dayjs(date).format('YYYY-MM-DD') as DateStringValue\n const outside = !dayjs(date).isSame(month, 'month')\n const events = eventsByDay[value] || []\n const extra = props.getDayProps?.(value) || {}\n const shouldRender = !outside || props.withOutsideDays\n return h(\n UnstyledButton,\n {\n ...extra,\n class: [classes.mobileMonthViewDay, extra.class],\n mod: {\n outside,\n weekend: props.weekendDays.includes(dayjs(date).day() as DayOfWeek),\n today: props.highlightToday && dayjs(date).isSame(dayjs(), 'day'),\n selected: internalSelected.value === value,\n static: props.mode === 'static',\n hidden: !shouldRender,\n },\n tabindex: props.mode === 'static' || !shouldRender ? -1 : 0,\n 'aria-label': formatDate({\n date,\n locale: props.locale || 'en',\n format: 'MMMM D, YYYY',\n }),\n 'aria-selected': internalSelected.value === value || undefined,\n onClick:\n props.mode === 'static' || !shouldRender\n ? undefined\n : (event: MouseEvent) => {\n select(value)\n props.onDayClick?.(value, event)\n },\n },\n () => [\n shouldRender ? String(dayjs(date).date()) : null,\n shouldRender && events.length\n ? h(\n 'span',\n { class: classes.mobileMonthViewDayIndicators },\n events.slice(0, 3).map((event: ScheduleEventData) =>\n h('span', {\n class: classes.mobileMonthViewDayIndicator,\n style: {\n background: `var(--mantine-color-${event.color}-6, ${event.color})`,\n },\n }),\n ),\n )\n : null,\n ],\n )\n }),\n ]),\n ),\n ],\n ),\n h(Box, { class: classes.mobileMonthViewEventsList }, () => [\n h(Text, { class: classes.mobileMonthViewEventsHeader }, () =>\n internalSelected.value\n ? formatDate({\n date: internalSelected.value,\n locale: props.locale || 'en',\n format: props.eventsHeaderFormat,\n })\n : '',\n ),\n selectedEvents.length\n ? selectedEvents.map((event: ScheduleEventData) => {\n const startTime = dayjs(event.start).format('HH:mm')\n const endTime = dayjs(event.end).format('HH:mm')\n const isAllDay = startTime === '00:00' && endTime === '00:00'\n const eventChildren = h(Box, { class: classes.mobileMonthViewEventBody }, () => [\n h('div', {\n class: classes.mobileMonthViewEventColor,\n style: { backgroundColor: getThemeColor(event.color, theme.value) },\n }),\n h('div', [\n h(Text, { class: classes.mobileMonthViewEventTitle }, () => event.title),\n h(Text, { class: classes.mobileMonthViewEventTime }, () =>\n isAllDay ? 'All day' : `${startTime} – ${endTime}`,\n ),\n ]),\n ])\n const rootProps = {\n type: 'button' as const,\n class: classes.mobileMonthViewEvent,\n tabindex: props.mode === 'static' ? -1 : 0,\n onClick:\n props.mode === 'static'\n ? undefined\n : (nativeEvent: MouseEvent) => props.onEventClick?.(event, nativeEvent),\n }\n\n return (\n props.renderEvent?.(event, { ...rootProps, children: eventChildren }) ||\n slots.event?.({ ...rootProps, children: eventChildren, event }) ||\n h(UnstyledButton, { ...rootProps, key: event.id }, () => eventChildren)\n )\n })\n : h(\n Text,\n { class: classes.mobileMonthViewNoEvents },\n () => props.labels?.noEvents || 'No events',\n ),\n ]),\n ],\n )\n }\n },\n})\n\nexport type { MobileMonthViewProps }\nexport type MobileMonthViewStylesNames =\n | 'mobileMonthView'\n | 'mobileMonthViewHeader'\n | 'mobileMonthViewHeaderBackButton'\n | 'mobileMonthViewHeaderLabel'\n | 'mobileMonthViewCalendar'\n | 'mobileMonthViewWeekdays'\n | 'mobileMonthViewWeekdaysCorner'\n | 'mobileMonthViewWeekday'\n | 'mobileMonthViewWeek'\n | 'mobileMonthViewWeekNumber'\n | 'mobileMonthViewDay'\n | 'mobileMonthViewDayIndicators'\n | 'mobileMonthViewDayIndicator'\n | 'mobileMonthViewEventsList'\n | 'mobileMonthViewEventsHeader'\n | 'mobileMonthViewEvent'\n | 'mobileMonthViewEventBody'\n | 'mobileMonthViewEventColor'\n | 'mobileMonthViewEventTitle'\n | 'mobileMonthViewEventTime'\n | 'mobileMonthViewNoEvents'\n","export function handleGridKeydown({\n event,\n index,\n columns,\n total,\n getControl,\n}: {\n event: KeyboardEvent\n index: number\n columns: number\n total: number\n getControl: (index: number) => HTMLButtonElement | null\n}): void {\n const step =\n event.key === 'ArrowRight'\n ? 1\n : event.key === 'ArrowLeft'\n ? -1\n : event.key === 'ArrowDown'\n ? columns\n : event.key === 'ArrowUp'\n ? -columns\n : 0\n\n if (step === 0) return\n event.preventDefault()\n\n for (let next = index + step; next >= 0 && next < total; next += step) {\n const control = getControl(next)\n if (control && !control.disabled && !control.hasAttribute('data-hidden')) {\n control.focus()\n return\n }\n }\n}\n","import dayjs from 'dayjs'\nimport { MonthPositionedEventData } from '../../../types'\n\ninterface AddEventToDayGroupsInput {\n positionedEvent: MonthPositionedEventData\n eventStart: dayjs.Dayjs\n eventEnd: dayjs.Dayjs\n groupedByDay: { [date: string]: MonthPositionedEventData[] }\n eventsAddedToDay: Set<string>\n weekIdx: number\n}\n\nexport function addEventToDayGroups({\n positionedEvent,\n eventStart,\n eventEnd,\n groupedByDay,\n eventsAddedToDay,\n weekIdx,\n}: AddEventToDayGroupsInput): void {\n if (weekIdx === 0 || !eventsAddedToDay.has(positionedEvent.id.toString())) {\n let dayDate = eventStart\n while (dayDate.isBefore(eventEnd) || dayDate.isSame(eventEnd, 'day')) {\n const dayDateStr = dayDate.format('YYYY-MM-DD 00:00:00')\n if (groupedByDay[dayDateStr]) {\n groupedByDay[dayDateStr].push(positionedEvent)\n }\n dayDate = dayDate.add(1, 'day')\n }\n eventsAddedToDay.add(positionedEvent.id.toString())\n }\n}\n","import dayjs from 'dayjs'\n\nexport type HangingStatus = 'none' | 'start' | 'end' | 'both'\n\ninterface CalculateEventPositionInput {\n eventStart: dayjs.Dayjs\n eventEnd: dayjs.Dayjs\n weekStart: dayjs.Dayjs\n weekEnd: dayjs.Dayjs\n isMultiday: boolean\n}\n\ninterface EventPositionInWeek {\n startDayIndex: number\n daysSpanned: number\n startOffset: number\n width: number\n hanging: HangingStatus\n}\n\nexport function calculateEventPositionInWeek({\n eventStart,\n eventEnd,\n weekStart,\n weekEnd,\n isMultiday,\n}: CalculateEventPositionInput): EventPositionInWeek {\n let displayStart = eventStart\n let displayEnd = eventEnd\n\n const hangingStart = eventStart.isBefore(weekStart)\n const hangingEnd = eventEnd.isAfter(weekEnd)\n const hanging: HangingStatus =\n hangingStart && hangingEnd ? 'both' : hangingStart ? 'start' : hangingEnd ? 'end' : 'none'\n\n if (displayStart.isBefore(weekStart)) {\n displayStart = weekStart\n }\n if (displayEnd.isAfter(weekEnd)) {\n displayEnd = weekEnd\n }\n\n const startDayIndex = displayStart.diff(weekStart, 'day')\n const endDayIndex = displayEnd.diff(weekStart, 'day')\n const daysSpanned = Math.max(1, endDayIndex - startDayIndex + (isMultiday ? 1 : 0))\n\n const startOffset = (startDayIndex / 7) * 100\n const width = (daysSpanned / 7) * 100\n\n return {\n startDayIndex,\n daysSpanned,\n startOffset,\n width,\n hanging,\n }\n}\n","import dayjs from 'dayjs'\nimport { MonthPositionedEventData } from '../../../types'\n\ninterface FindAvailableRowInput {\n existingEvents: MonthPositionedEventData[]\n startDayIndex: number\n daysSpanned: number\n weekStart: dayjs.Dayjs\n}\n\nexport function findAvailableRow({\n existingEvents,\n startDayIndex,\n daysSpanned,\n weekStart,\n}: FindAvailableRowInput): number {\n let row = 0\n\n for (const existing of existingEvents) {\n const existingStart = dayjs(existing.start).startOf('day')\n const existingDisplayStart =\n existingStart.isBefore(weekStart) || existingStart.isSame(weekStart, 'day')\n ? weekStart\n : existingStart\n const existingDayIndex = existingDisplayStart.diff(weekStart, 'day')\n const existingWidth = existing.position?.width || 0\n const existingDaysSpanned = (existingWidth / 100) * 7\n\n if (\n existingDayIndex + existingDaysSpanned > startDayIndex &&\n existingDayIndex < startDayIndex + daysSpanned\n ) {\n row = Math.max(row, (existing.position?.row || 0) + 1)\n }\n }\n\n return row\n}\n","import dayjs from 'dayjs'\nimport { DateStringValue, DayOfWeek, MonthPositionedEventData } from '../../../types'\nimport { getStartOfWeek } from '../../../utils'\n\ninterface GetWeeksInRangeInput {\n rangeStart: dayjs.Dayjs\n rangeEnd: dayjs.Dayjs\n firstDayOfWeek: DayOfWeek\n}\n\ninterface GetWeeksInRangeOutput {\n weeks: DateStringValue[][]\n groupedByDay: Record<string, MonthPositionedEventData[]>\n}\n\nexport function getWeeksInRange({\n rangeStart,\n rangeEnd,\n firstDayOfWeek,\n}: GetWeeksInRangeInput): GetWeeksInRangeOutput {\n const weeks: DateStringValue[][] = []\n const groupedByDay: Record<string, MonthPositionedEventData[]> = {}\n\n const startOfFirstWeekStr = getStartOfWeek({\n date: rangeStart.format('YYYY-MM-DD'),\n firstDayOfWeek,\n })\n\n let currentDate = dayjs(startOfFirstWeekStr)\n\n while (currentDate.isBefore(rangeEnd) || currentDate.isSame(rangeEnd, 'day')) {\n const week: DateStringValue[] = []\n for (let i = 0; i < 7; i++) {\n const dateStr = currentDate.format('YYYY-MM-DD 00:00:00')\n week.push(dateStr)\n if (!groupedByDay[dateStr]) {\n groupedByDay[dateStr] = []\n }\n currentDate = currentDate.add(1, 'day')\n }\n weeks.push(week)\n }\n\n return { weeks, groupedByDay }\n}\n","import dayjs from 'dayjs'\nimport {\n AnyDateValue,\n DateStringValue,\n DayOfWeek,\n MonthPositionedEventData,\n ScheduleEventData,\n} from '../../../types'\nimport { addEventToDayGroups } from './add-event-to-day-groups'\nimport { calculateEventPositionInWeek } from './calculate-event-position-in-week'\nimport { findAvailableRow } from './find-available-row'\nimport { getWeeksInRange } from './get-weeks-in-range'\n\ninterface GetMonthPositionedEventsInput {\n /** Date (month start) at which events are positioned */\n date: AnyDateValue\n\n /** List of all events that belong to the given month, extra events must be filtered out before passing to the function */\n events: ScheduleEventData[]\n\n /** First day of the week, 0 - Sunday, 1 - Monday, etc., used to calculate events positions */\n firstDayOfWeek?: DayOfWeek\n\n /** Range of dates for which events should be displayed (includes outside days if withOutsideDays is true) */\n range?: {\n start: DateStringValue\n end: DateStringValue\n }\n}\n\n/** Events grouped by week index and by day */\nexport interface GroupedMonthEvents {\n /** Events grouped by week index (index within month) */\n groupedByWeek: {\n [weekIndex: string]: MonthPositionedEventData[]\n }\n\n /** Events grouped by day (YYYY-MM-DD format) */\n groupedByDay: {\n [date: string]: MonthPositionedEventData[]\n }\n\n /** Background events grouped by week index */\n backgroundByWeek: {\n [weekIndex: string]: MonthPositionedEventData[]\n }\n}\n\nexport function getMonthPositionedEvents({\n date,\n events,\n firstDayOfWeek = 1,\n range,\n}: GetMonthPositionedEventsInput): GroupedMonthEvents {\n const groupedByWeek: GroupedMonthEvents['groupedByWeek'] = {}\n const backgroundByWeek: GroupedMonthEvents['backgroundByWeek'] = {}\n const eventsAddedToDay = new Set<string>()\n\n const rangeStart = range ? dayjs(range.start) : dayjs(date).startOf('month')\n const rangeEnd = range ? dayjs(range.end) : dayjs(date).startOf('month').endOf('month')\n\n const { weeks, groupedByDay } = getWeeksInRange({\n rangeStart,\n rangeEnd,\n firstDayOfWeek,\n })\n\n for (let i = 0; i < weeks.length; i++) {\n groupedByWeek[i.toString()] = []\n backgroundByWeek[i.toString()] = []\n }\n\n for (const event of events) {\n const eventStart = dayjs(event.start).startOf('day')\n const rawEnd = dayjs(event.end)\n const endAtMidnight = rawEnd.hour() === 0 && rawEnd.minute() === 0 && rawEnd.second() === 0\n const eventEnd = endAtMidnight\n ? rawEnd.startOf('day').subtract(1, 'day')\n : rawEnd.startOf('day')\n const isMultiday = eventEnd.isAfter(eventStart)\n\n for (let weekIdx = 0; weekIdx < weeks.length; weekIdx++) {\n const week = weeks[weekIdx]\n const weekStart = dayjs(week[0]).startOf('day')\n const weekEnd = dayjs(week[6]).endOf('day')\n\n if (\n (eventStart.isBefore(weekEnd) || eventStart.isSame(weekEnd, 'day')) &&\n (eventEnd.isAfter(weekStart) || eventEnd.isSame(weekStart, 'day'))\n ) {\n const { startDayIndex, daysSpanned, startOffset, width, hanging } =\n calculateEventPositionInWeek({\n eventStart,\n eventEnd,\n weekStart,\n weekEnd,\n isMultiday,\n })\n\n if (event.display === 'background') {\n backgroundByWeek[weekIdx.toString()].push({\n ...event,\n position: {\n startOffset,\n width,\n weekIndex: weekIdx,\n row: 0,\n hanging,\n },\n })\n continue\n }\n\n const row = findAvailableRow({\n existingEvents: groupedByWeek[weekIdx.toString()],\n startDayIndex,\n daysSpanned,\n weekStart,\n })\n\n const positionedEvent: MonthPositionedEventData = {\n ...event,\n position: {\n startOffset,\n width,\n weekIndex: weekIdx,\n row,\n hanging,\n },\n }\n\n groupedByWeek[weekIdx.toString()].push(positionedEvent)\n\n addEventToDayGroups({\n positionedEvent,\n eventStart,\n eventEnd,\n groupedByDay,\n eventsAddedToDay,\n weekIdx,\n })\n }\n }\n }\n\n return {\n groupedByWeek,\n groupedByDay,\n backgroundByWeek,\n }\n}\n","import dayjs from 'dayjs'\nimport { AnyDateValue, DayOfWeek, ScheduleEventData } from '../../../types'\nimport { getMonthRange, validateEvent } from '../../../utils'\nimport { getMonthPositionedEvents, GroupedMonthEvents } from './get-month-positioned-events'\n\ninterface UseMonthViewEventsInput {\n /** Date (month start) at which events are positioned */\n date: AnyDateValue\n\n /** List of all events that belong to the given month, extra events must be filtered out before passing to the function */\n events: ScheduleEventData[] | undefined\n\n /** First day of the week, 0 - Sunday, 1 - Monday, etc., used to calculate events positions */\n firstDayOfWeek?: DayOfWeek\n\n /** If true, events for outside days are included */\n withOutsideDays?: boolean\n\n /** If true, month will show events for consistent number of weeks (6) */\n consistentWeeks?: boolean\n}\n\nexport function getMonthViewEvents({\n date,\n events,\n firstDayOfWeek = 1,\n withOutsideDays,\n consistentWeeks,\n}: UseMonthViewEventsInput): GroupedMonthEvents {\n if (events === undefined) {\n return { groupedByDay: {}, groupedByWeek: {}, backgroundByWeek: {} }\n }\n\n const ids = new Set<string | number>()\n const filteredEvents: ScheduleEventData[] = []\n\n const range = getMonthRange({ month: date, withOutsideDays, consistentWeeks, firstDayOfWeek })\n\n for (const event of events) {\n if (\n dayjs(event.end).isAfter(range.start, 'day') ||\n dayjs(event.start).isBefore(range.end, 'day')\n ) {\n filteredEvents.push(validateEvent(event))\n\n if (!ids.has(event.id)) {\n ids.add(event.id)\n } else {\n throw new Error(`[@mantine/schedule] MonthView: Duplicated event ids found: ${event.id}`)\n }\n }\n }\n\n return getMonthPositionedEvents({\n date,\n events: filteredEvents,\n firstDayOfWeek,\n range,\n })\n}\n","import { DateStringValue, MonthEventPositionData, MonthPositionedEventData } from '../../types'\n\nconst DAYS_IN_WEEK = 7\nconst DAY_WIDTH = 100 / DAYS_IN_WEEK\n\ninterface GetRenderableMonthEventSegmentsInput {\n events: MonthPositionedEventData[]\n groupedByDay: Record<string, MonthPositionedEventData[]>\n maxEventsPerDay: number\n week: DateStringValue[]\n}\n\ninterface EventDayRange {\n startDayIndex: number\n endDayIndex: number\n}\n\ninterface SegmentRange extends EventDayRange {\n row: number\n}\n\nexport interface RenderableMonthEventSegment {\n event: MonthPositionedEventData\n position: MonthEventPositionData\n clipStart: boolean\n clipEnd: boolean\n key: string\n}\n\nfunction getEventDayRange(event: MonthPositionedEventData): EventDayRange {\n const startDayIndex = Math.max(0, Math.round(event.position.startOffset / DAY_WIDTH))\n const daysSpanned = Math.max(1, Math.round(event.position.width / DAY_WIDTH))\n\n return {\n startDayIndex,\n endDayIndex: Math.min(DAYS_IN_WEEK - 1, startDayIndex + daysSpanned - 1),\n }\n}\n\nfunction getFirstAvailableRow(usedRows: Set<number>, maxEventsPerDay: number): number | null {\n for (let row = 0; row < maxEventsPerDay; row += 1) {\n if (!usedRows.has(row)) {\n return row\n }\n }\n\n return null\n}\n\nfunction getSegmentHanging(\n originalHanging: MonthEventPositionData['hanging'],\n touchesStart: boolean,\n touchesEnd: boolean,\n): MonthEventPositionData['hanging'] {\n const hangsFromStart = touchesStart && (originalHanging === 'start' || originalHanging === 'both')\n const hangsFromEnd = touchesEnd && (originalHanging === 'end' || originalHanging === 'both')\n\n if (hangsFromStart && hangsFromEnd) {\n return 'both'\n }\n\n if (hangsFromStart) {\n return 'start'\n }\n\n if (hangsFromEnd) {\n return 'end'\n }\n\n return 'none'\n}\n\nfunction getSegmentPosition(\n event: MonthPositionedEventData,\n segment: SegmentRange,\n eventRange: EventDayRange,\n): MonthEventPositionData {\n const touchesStart = segment.startDayIndex === eventRange.startDayIndex\n const touchesEnd = segment.endDayIndex === eventRange.endDayIndex\n\n return {\n ...event.position,\n startOffset: (segment.startDayIndex / DAYS_IN_WEEK) * 100,\n width: ((segment.endDayIndex - segment.startDayIndex + 1) / DAYS_IN_WEEK) * 100,\n row: segment.row,\n hanging: getSegmentHanging(event.position.hanging, touchesStart, touchesEnd),\n }\n}\n\nfunction getEventKey(event: MonthPositionedEventData): string | number {\n return event.id\n}\n\nexport function getRenderableMonthEventSegments({\n events,\n groupedByDay,\n maxEventsPerDay,\n week,\n}: GetRenderableMonthEventSegmentsInput): RenderableMonthEventSegment[] {\n const eventIndexes = new Map<MonthPositionedEventData, number>()\n const eventRanges = new Map<MonthPositionedEventData, EventDayRange>()\n const renderRows = new Map<MonthPositionedEventData, Map<number, number>>()\n\n events.forEach((event, index) => {\n eventIndexes.set(event, index)\n eventRanges.set(event, getEventDayRange(event))\n })\n\n const setRenderRow = (event: MonthPositionedEventData, dayIndex: number, row: number) => {\n if (!renderRows.has(event)) {\n renderRows.set(event, new Map())\n }\n\n renderRows.get(event)!.set(dayIndex, row)\n }\n\n for (let dayIndex = 0; dayIndex < week.length; dayIndex += 1) {\n const dayEvents = groupedByDay[week[dayIndex]] || []\n const dayEventIds = new Set(dayEvents.map((event) => getEventKey(event)))\n const dayWeekEvents = events.filter((event) => {\n const range = eventRanges.get(event)!\n return (\n dayEventIds.has(getEventKey(event)) &&\n dayIndex >= range.startDayIndex &&\n dayIndex <= range.endDayIndex\n )\n })\n\n if (dayEvents.length > maxEventsPerDay) {\n dayWeekEvents.forEach((event) => {\n if (event.position.row < maxEventsPerDay) {\n setRenderRow(event, dayIndex, event.position.row)\n }\n })\n\n continue\n }\n\n const usedRows = new Set<number>()\n const sortedDayEvents = [...dayWeekEvents].sort((a, b) => {\n const rowDiff = a.position.row - b.position.row\n\n if (rowDiff !== 0) {\n return rowDiff\n }\n\n return eventIndexes.get(a)! - eventIndexes.get(b)!\n })\n\n sortedDayEvents.forEach((event) => {\n let row = event.position.row\n\n if (row >= maxEventsPerDay || usedRows.has(row)) {\n const availableRow = getFirstAvailableRow(usedRows, maxEventsPerDay)\n\n if (availableRow === null) {\n return\n }\n\n row = availableRow\n }\n\n usedRows.add(row)\n setRenderRow(event, dayIndex, row)\n })\n }\n\n return events.flatMap((event) => {\n const eventRange = eventRanges.get(event)!\n const eventRenderRows = renderRows.get(event)\n const segments: RenderableMonthEventSegment[] = []\n let currentSegment: SegmentRange | null = null\n\n const addSegment = (segment: SegmentRange) => {\n const position = getSegmentPosition(event, segment, eventRange)\n\n segments.push({\n event,\n position,\n clipStart: segment.startDayIndex > eventRange.startDayIndex,\n clipEnd: segment.endDayIndex < eventRange.endDayIndex,\n key: `${event.id}-${event.position.weekIndex}-${segment.startDayIndex}-${segment.endDayIndex}-${segment.row}`,\n })\n }\n\n for (\n let dayIndex = eventRange.startDayIndex;\n dayIndex <= eventRange.endDayIndex;\n dayIndex += 1\n ) {\n const row = eventRenderRows?.get(dayIndex)\n\n if (row === undefined) {\n if (currentSegment) {\n addSegment(currentSegment)\n currentSegment = null\n }\n\n continue\n }\n\n if (currentSegment && currentSegment.row === row) {\n currentSegment.endDayIndex = dayIndex\n } else {\n if (currentSegment) {\n addSegment(currentSegment)\n }\n\n currentSegment = {\n startDayIndex: dayIndex,\n endDayIndex: dayIndex,\n row,\n }\n }\n }\n\n if (currentSegment) {\n addSegment(currentSegment)\n }\n\n return segments\n })\n}\n",".monthView {\n --week-numbers-offset: 0rem;\n --month-view-border: 1px solid var(--month-view-border-color);\n --month-view-radius: var(--schedule-radius, var(--mantine-radius-default));\n --day-base-color: var(--mantine-color-text);\n --min-day-width: 84px;\n\n &:where([data-with-week-numbers]) {\n --week-numbers-offset: 42px;\n }\n\n @mixin where-light {\n --month-view-border-color: var(--mantine-color-gray-3);\n }\n\n @mixin where-dark {\n --month-view-border-color: var(--mantine-color-dark-4);\n }\n}\n\n.monthViewWeekdays {\n display: flex;\n}\n\n.monthViewWeek {\n display: flex;\n position: relative;\n min-width: calc(var(--min-day-width) * 7 + var(--week-numbers-offset));\n}\n\n.monthViewWeekNumber {\n flex: 0 0 var(--week-numbers-offset);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: var(--mantine-font-size-sm);\n padding: 4px;\n border-block-start: var(--month-view-border);\n border-block-end: none;\n border-inline-start: var(--month-view-border);\n border-inline-end: none;\n font-weight: var(--mantine-font-weight-medium);\n cursor: pointer;\n user-select: none;\n\n :where(.monthViewWeek:first-child) & {\n border-start-start-radius: var(--month-view-radius);\n\n :where([data-with-weekdays] .monthView) & {\n border-start-start-radius: 0;\n }\n }\n\n :where(.monthViewWeek:last-child) & {\n border-block-end: var(--month-view-border);\n border-end-start-radius: var(--month-view-radius);\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.monthViewWeekday {\n flex: 0 0 calc(100% / 7 - var(--week-numbers-offset) / 7);\n min-width: var(--min-day-width);\n height: 36px;\n font-size: var(--mantine-font-size-sm);\n border-block-start: var(--month-view-border);\n border-block-end: none;\n border-inline-start: var(--month-view-border);\n border-inline-end: none;\n font-weight: var(--mantine-font-weight-medium);\n text-align: center;\n text-transform: capitalize;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: default;\n user-select: none;\n\n &:where(:first-child) {\n border-start-start-radius: var(--month-view-radius);\n\n :where([data-with-week-numbers] .monthView) & {\n border-start-start-radius: 0;\n }\n }\n\n &:where(:last-child) {\n border-inline-end: var(--month-view-border);\n border-start-end-radius: var(--month-view-radius);\n }\n}\n\n.monthViewWeekdaysCorner {\n flex: 0 0 var(--week-numbers-offset);\n border-block-start: var(--month-view-border);\n border-inline-start: var(--month-view-border);\n border-start-start-radius: var(--month-view-radius);\n}\n\n.monthViewDay {\n min-width: var(--min-day-width);\n flex: 0 0 calc(100% / 7 - var(--week-numbers-offset) / 7);\n height: calc(52px + var(--month-view-max-events, 2) * 24px);\n padding: 4px;\n font-weight: var(--mantine-font-weight-medium);\n border-block-start: var(--month-view-border);\n border-block-end: none;\n border-inline-start: var(--month-view-border);\n border-inline-end: none;\n color: var(--day-base-color);\n cursor: pointer;\n display: flex;\n align-items: flex-start;\n position: relative;\n\n &:where(:last-child) {\n border-inline-end: var(--month-view-border);\n\n :where(.monthViewWeek:last-child) & {\n border-block-end: var(--month-view-border);\n border-end-end-radius: var(--month-view-radius);\n }\n\n :where(.monthViewWeek:first-child) & {\n border-start-end-radius: var(--month-view-radius);\n\n :where(:not([data-with-weekdays])) .monthView & {\n border-start-end-radius: var(--month-view-radius);\n }\n }\n }\n\n &:where(:first-of-type) {\n :where(.monthViewWeek:first-child) & {\n border-start-start-radius: var(--month-view-radius);\n\n :where([data-with-week-numbers]) .monthView & {\n border-start-start-radius: 0;\n }\n\n :where([data-with-weekdays]) .monthView & {\n border-start-start-radius: 0;\n }\n }\n\n :where(.monthViewWeek:last-child) & {\n border-end-start-radius: var(--month-view-radius);\n }\n\n :where([data-with-week-numbers]) .monthViewWeek:last-child & {\n border-end-start-radius: 0;\n }\n }\n\n :where(.monthViewWeek:last-child) & {\n border-block-end: var(--month-view-border);\n }\n\n &:where([data-weekend]) {\n color: var(--mantine-color-red-6);\n }\n\n &:where([data-outside]) {\n color: alpha(var(--day-base-color), 0.4);\n }\n\n &:where([data-static]) {\n cursor: default;\n pointer-events: none;\n }\n\n @mixin hover {\n &:where(:not([data-static])) {\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\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: 0px;\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\n.monthViewDayLabel {\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 user-select: none;\n\n &:where([data-today]) {\n background-color: var(--mantine-primary-color-filled);\n color: var(--mantine-primary-color-contrast);\n }\n}\n\n.monthViewBackgroundEvent {\n position: absolute;\n pointer-events: none;\n z-index: 2;\n border-radius: var(--month-view-radius);\n background-color: var(--bg-event-bg);\n top: 0;\n bottom: -21px;\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.monthViewEvents {\n position: absolute;\n inset-inline: 0;\n inset-inline-start: var(--week-numbers-offset);\n top: 30px;\n bottom: 22px;\n pointer-events: none;\n z-index: 3;\n}\n","import dayjs from 'dayjs'\nimport { defineComponent, h, ref, type PropType, type SlotsType } from 'vue'\nimport { Box, ScrollArea, UnstyledButton } from '@mantine-vue/core'\nimport type { DateLabelFormat, DayOfWeek } from '../../types'\nimport type { MonthViewProps } from '../../component-props'\nimport {\n calculateMonthDropDate,\n formatDate,\n getMonthDays,\n getWeekNumber,\n getWeekdaysNames,\n toDateString,\n} from '../../utils'\nimport { MoreEvents } from '../MoreEvents/MoreEvents'\nimport { useSlotDragSelect } from '../use-slot-drag-select'\nimport { handleGridKeydown } from '../keyboard-navigation'\nimport { ScheduleHeaderBase, createHeaderNavigation } from '../ScheduleHeader/ScheduleHeaderBase'\nimport {\n baseViewProps,\n eventNode,\n forwardEventSlots,\n getDropEvent,\n getExpandedEvents,\n moveEventTo,\n resolveScheduleRadius,\n type EventSlots,\n} from '../shared'\nimport { getMonthViewEvents } from './get-month-view-events/get-month-view-events'\nimport { getRenderableMonthEventSegments } from './get-renderable-month-event-segments'\nimport classes from './MonthView.module.css'\n\nexport const MonthView = defineComponent({\n name: 'MonthView',\n inheritAttrs: false,\n slots: Object as SlotsType<EventSlots>,\n props: {\n ...baseViewProps,\n firstDayOfWeek: { type: Number as PropType<DayOfWeek>, default: 1 },\n weekdayFormat: { type: [String, Function] as PropType<DateLabelFormat>, default: 'ddd' },\n weekendDays: { type: Array as PropType<DayOfWeek[]>, default: () => [0, 6] },\n withWeekNumbers: Boolean,\n withWeekDays: { type: Boolean, default: true },\n consistentWeeks: { type: Boolean, default: true },\n highlightToday: { type: Boolean, default: true },\n withOutsideDays: { type: Boolean, default: true },\n maxEventsPerDay: { type: Number, default: 2 },\n getDayProps: Function as PropType<MonthViewProps['getDayProps']>,\n getWeekNumberProps: Function as PropType<MonthViewProps['getWeekNumberProps']>,\n onDayClick: Function as PropType<MonthViewProps['onDayClick']>,\n onWeekNumberClick: Function as PropType<MonthViewProps['onWeekNumberClick']>,\n withEventsDragAndDrop: Boolean,\n onEventDrop: Function as PropType<MonthViewProps['onEventDrop']>,\n canDragEvent: Function as PropType<MonthViewProps['canDragEvent']>,\n onEventDragStart: Function as PropType<MonthViewProps['onEventDragStart']>,\n onEventDragEnd: Function as PropType<MonthViewProps['onEventDragEnd']>,\n onExternalEventDrop: Function as PropType<MonthViewProps['onExternalEventDrop']>,\n withDragSlotSelect: Boolean,\n onSlotDragEnd: Function as PropType<MonthViewProps['onSlotDragEnd']>,\n },\n setup(props, { attrs, slots }) {\n const monthGrid = ref<HTMLElement | null>(null)\n const dropTarget = ref<string | null>(null)\n const monthGroup = 'month'\n const flatDays = ref<string[]>([])\n const slotDragSelect = useSlotDragSelect({\n enabled: () => props.withDragSlotSelect && props.mode !== 'static',\n onDragEnd: () =>\n props.onSlotDragEnd\n ? (startIndex, endIndex) => {\n const startDay = flatDays.value[startIndex]\n const endDay = flatDays.value[endIndex]\n if (startDay && endDay) {\n props.onSlotDragEnd?.(\n dayjs(startDay).startOf('day').format('YYYY-MM-DD HH:mm:ss'),\n dayjs(endDay).endOf('day').format('YYYY-MM-DD HH:mm:ss'),\n )\n }\n }\n : undefined,\n })\n return () => {\n const month = dayjs(props.date).startOf('month')\n const maxEventsPerDay = Math.min(10, Math.max(1, props.maxEventsPerDay))\n const weeks = getMonthDays({\n month,\n firstDayOfWeek: props.firstDayOfWeek,\n consistentWeeks: props.consistentWeeks,\n })\n flatDays.value = weeks.flat().map((date) => toDateString(date))\n const firstFocusableDayIndex = weeks\n .flat()\n .findIndex((date) => props.withOutsideDays || dayjs(date).isSame(month, 'month'))\n const withSlotSelect = props.withDragSlotSelect && props.mode !== 'static'\n const rangeStart = weeks[0][0]\n const rangeEnd = weeks.at(-1)!.at(-1)!\n const expanded = getExpandedEvents(\n props.events,\n rangeStart,\n dayjs(rangeEnd).endOf('day').format('YYYY-MM-DD HH:mm:ss'),\n props.recurrenceExpansionLimit,\n )\n const grouped = getMonthViewEvents({\n date: month,\n events: expanded,\n firstDayOfWeek: props.firstDayOfWeek,\n withOutsideDays: props.withOutsideDays,\n consistentWeeks: props.consistentWeeks,\n })\n const weekdays = getWeekdaysNames({\n locale: props.locale || 'en',\n format: props.weekdayFormat,\n firstDayOfWeek: props.firstDayOfWeek,\n })\n const withDragHandlers =\n props.mode !== 'static' &&\n (props.withEventsDragAndDrop || Boolean(props.onExternalEventDrop))\n const dragOver = (nativeEvent: DragEvent, date: string) => {\n nativeEvent.preventDefault()\n dropTarget.value = toDateString(date)\n if (nativeEvent.dataTransfer) {\n nativeEvent.dataTransfer.dropEffect = nativeEvent.dataTransfer.types.includes(\n 'application/json',\n )\n ? 'move'\n : 'copy'\n }\n }\n const dragLeave = (nativeEvent: DragEvent) => {\n if (\n !(nativeEvent.relatedTarget instanceof Node) ||\n !monthGrid.value?.contains(nativeEvent.relatedTarget)\n ) {\n dropTarget.value = null\n }\n }\n const drop = (nativeEvent: DragEvent, date: string) => {\n nativeEvent.preventDefault()\n dropTarget.value = null\n const event = getDropEvent(expanded, nativeEvent.dataTransfer)\n if (event) {\n const { start } = calculateMonthDropDate({\n draggedEvent: event,\n targetDay: toDateString(date),\n })\n props.onEventDrop?.(moveEventTo(event, start))\n } else if (nativeEvent.dataTransfer)\n props.onExternalEventDrop?.(nativeEvent.dataTransfer, toDateString(date))\n }\n return h(\n Box,\n {\n ...attrs,\n class: [classes.monthView, attrs.class],\n style: [\n {\n '--month-view-radius': resolveScheduleRadius(props.radius),\n '--month-view-max-events': String(maxEventsPerDay),\n },\n attrs.style,\n ],\n mod: {\n 'with-week-numbers': props.withWeekNumbers,\n 'with-weekdays': props.withWeekDays,\n static: props.mode === 'static',\n 'slot-dragging': slotDragSelect.isDragging(),\n },\n },\n () => [\n props.withHeader\n ? h(ScheduleHeaderBase, {\n view: 'month',\n labels: props.labels,\n onDateChange: props.onDateChange,\n onViewChange: props.onViewChange,\n navigationHandlers: createHeaderNavigation(props.date!, 'month'),\n previousControlProps: props.previousControlProps,\n nextControlProps: props.nextControlProps,\n todayControlProps: props.todayControlProps,\n viewSelectProps: props.viewSelectProps,\n control: {\n monthYearSelect: {\n locale: props.locale,\n monthValue: month.month(),\n yearValue: month.year(),\n onMonthChange: (value: number) =>\n props.onDateChange?.(toDateString(month.month(value))),\n onYearChange: (value: number) =>\n props.onDateChange?.(toDateString(month.year(value))),\n },\n },\n })\n : null,\n h(ScrollArea, { class: classes.monthViewScrollArea, scrollbarSize: 4 }, () =>\n h('div', { ref: monthGrid, class: classes.monthViewInner }, [\n props.withWeekDays\n ? h('div', { class: classes.monthViewWeekdays }, [\n props.withWeekNumbers\n ? h('div', { class: classes.monthViewWeekdaysCorner })\n : null,\n ...weekdays.map((weekday) =>\n h('div', { class: classes.monthViewWeekday }, [weekday]),\n ),\n ])\n : null,\n ...weeks.map((week, weekIndex) => {\n const segments = getRenderableMonthEventSegments({\n events: grouped.groupedByWeek[String(weekIndex)] || [],\n groupedByDay: grouped.groupedByDay,\n maxEventsPerDay,\n week,\n })\n return h('div', { class: classes.monthViewWeek }, [\n props.withWeekNumbers\n ? h(\n UnstyledButton,\n {\n type: 'button',\n class: classes.monthViewWeekNumber,\n ...props.getWeekNumberProps?.(toDateString(week[0])),\n onClick: (event: MouseEvent) =>\n props.onWeekNumberClick?.(toDateString(week[0]), event),\n },\n () => String(getWeekNumber(week)),\n )\n : null,\n ...week.map((date, dayIndex) => {\n const dateKey = dayjs(date).format('YYYY-MM-DD 00:00:00')\n const dayProps = props.getDayProps?.(toDateString(date)) || {}\n const events = grouped.groupedByDay[dateKey] || []\n const hiddenCount = Math.max(0, events.length - maxEventsPerDay)\n const outside = !dayjs(date).isSame(month, 'month')\n const gridIndex = weekIndex * 7 + dayIndex\n return h(\n 'div',\n {\n class: classes.monthViewDay,\n 'data-outside': outside || undefined,\n 'data-weekend':\n props.weekendDays.includes(dayjs(date).day() as DayOfWeek) || undefined,\n 'data-static': props.mode === 'static' || undefined,\n 'data-drop-target': dropTarget.value === toDateString(date) || undefined,\n 'data-drag-selected':\n slotDragSelect.isSlotSelected(gridIndex, monthGroup) || undefined,\n 'data-drag-slot-index': withSlotSelect ? gridIndex : undefined,\n 'data-drag-slot-group': withSlotSelect ? monthGroup : undefined,\n onPointerdown: withSlotSelect\n ? (event: PointerEvent) =>\n slotDragSelect.handleSlotPointerDown(event, gridIndex, monthGroup)\n : undefined,\n onDragover: withDragHandlers\n ? (event: DragEvent) => dragOver(event, date)\n : (event: DragEvent) => event.preventDefault(),\n onDragleave: withDragHandlers ? dragLeave : undefined,\n onDrop: (event: DragEvent) => drop(event, date),\n },\n [\n h(\n UnstyledButton,\n {\n type: 'button',\n ...dayProps,\n class: [classes.monthViewDayLabel, dayProps.class],\n disabled: props.mode === 'static',\n 'data-grid-index': gridIndex,\n 'data-outside': outside || undefined,\n 'data-hidden': (outside && !props.withOutsideDays) || undefined,\n 'aria-label': formatDate({\n date,\n locale: props.locale || 'en',\n format: 'MMMM D, YYYY',\n }),\n 'data-today':\n (props.highlightToday && dayjs(date).isSame(dayjs(), 'day')) ||\n undefined,\n onClick: (event: MouseEvent) =>\n props.onDayClick?.(toDateString(date), event),\n tabindex:\n props.mode === 'static'\n ? -1\n : gridIndex === firstFocusableDayIndex\n ? 0\n : -1,\n onKeydown:\n props.mode === 'static'\n ? undefined\n : (event: KeyboardEvent) => {\n handleGridKeydown({\n event,\n index: gridIndex,\n columns: 7,\n total: weeks.length * 7,\n getControl: (index) =>\n monthGrid.value?.querySelector<HTMLButtonElement>(\n `[data-grid-index=\"${index}\"]:not([data-hidden])`,\n ) ?? null,\n })\n dayProps.onKeydown?.(event)\n },\n },\n () =>\n outside && !props.withOutsideDays ? '' : String(dayjs(date).date()),\n ),\n hiddenCount > 0\n ? h(\n MoreEvents,\n {\n events,\n moreEventsCount: hiddenCount,\n labels: props.labels,\n renderEvent: props.renderEvent,\n renderEventBody: props.renderEventBody,\n onEventClick: props.onEventClick,\n mode: props.mode,\n },\n forwardEventSlots(slots),\n )\n : null,\n ],\n )\n }),\n h(\n 'div',\n { class: classes.monthViewEvents },\n segments.map((segment) =>\n eventNode(\n segment.event,\n props,\n {\n key: segment.key,\n nowrap: true,\n hanging: segment.position.hanging,\n 'data-clip-start': segment.clipStart || undefined,\n 'data-clip-end': segment.clipEnd || undefined,\n style: {\n position: 'absolute',\n insetInlineStart: `${segment.position.startOffset}%`,\n width: `${segment.position.width}%`,\n top: `${28 + segment.position.row * 22}px`,\n },\n },\n slots,\n ),\n ),\n ),\n ])\n }),\n ]),\n ),\n ],\n )\n }\n },\n})\n\nexport type { MonthViewProps }\nexport type MonthViewStylesNames =\n | 'monthView'\n | 'monthViewWeekdays'\n | 'monthViewWeek'\n | 'monthViewWeekNumber'\n | 'monthViewWeekday'\n | 'monthViewWeekdaysCorner'\n | 'monthViewDay'\n | 'monthViewDayLabel'\n | 'monthViewBackgroundEvent'\n | 'monthViewEvents'\n","import dayjs from 'dayjs'\nimport type { VNodeChild } from 'vue'\nimport { DateLabelFormat, DateStringValue } from '../../../types'\nimport { formatDate } from '../../../utils'\n\ninterface GetWeekLabelInput {\n weekdays: Date[] | string[]\n locale: string\n weekLabelFormat: DateLabelFormat\n renderWeekLabel?: (params: { weekStart: DateStringValue; weekEnd: DateStringValue }) => VNodeChild\n}\n\nexport function getWeekLabel({\n weekdays,\n locale,\n weekLabelFormat,\n renderWeekLabel,\n}: GetWeekLabelInput) {\n if (renderWeekLabel) {\n return renderWeekLabel({\n weekStart: dayjs(weekdays[0]).format('YYYY-MM-DD'),\n weekEnd: dayjs(weekdays[weekdays.length - 1]).format('YYYY-MM-DD'),\n })\n }\n\n return `${formatDate({\n locale,\n date: weekdays[0],\n format: weekLabelFormat,\n })} – ${formatDate({\n locale,\n date: weekdays[weekdays.length - 1],\n format: weekLabelFormat,\n })}, ${formatDate({ locale, date: weekdays[0], format: 'YYYY' })}`\n}\n","import { AnyDateValue, DayOfWeek, ScheduleEventData } from '../../../types'\nimport { isEventInTimeRange, isWithinWeek, validateEvent } from '../../../utils'\n\nexport interface FilterWeekViewEventsInput {\n /** Date (week start) at which events are positioned, used to check if events are all-day */\n date: AnyDateValue\n\n /** List of all events that belong to the given week, extra events must be filtered out before passing to the function */\n events: ScheduleEventData[] | undefined\n\n /** Start time of the week view, used to calculate event positions */\n startTime?: string\n\n /** End time of the week view, used to calculate event positions */\n endTime?: string\n\n /** First day of the week, 0 - Sunday, 1 - Monday, etc., used to calculate events positions */\n firstDayOfWeek?: DayOfWeek\n}\n\nexport function filterWeekViewEvents({\n date,\n events,\n startTime,\n endTime,\n firstDayOfWeek = 1,\n}: FilterWeekViewEventsInput): ScheduleEventData[] {\n if (events === undefined) {\n return []\n }\n\n const ids = new Set<string | number>()\n const filteredEvents: ScheduleEventData[] = []\n\n for (const event of events) {\n if (\n isWithinWeek({ event, targetWeek: date, firstDayOfWeek }) &&\n isEventInTimeRange({ event, startTime, endTime })\n ) {\n filteredEvents.push(validateEvent(event))\n\n if (!ids.has(event.id)) {\n ids.add(event.id)\n } else {\n throw new Error(`[@mantine/schedule] WeekView: Duplicated event ids found: ${event.id}`)\n }\n }\n }\n\n return filteredEvents\n}\n","import { ScheduleEventData, WeekPositionedEventData } from '../../../types'\nimport { isEventsOverlap } from '../../../utils'\n\nexport function assignEventRows(events: WeekPositionedEventData[]): Map<ScheduleEventData, number> {\n const eventRows = new Map<ScheduleEventData, number>()\n\n for (const event of events) {\n let row = 0\n\n while (true) {\n let hasConflict = false\n\n for (const [otherEvent, otherRow] of eventRows.entries()) {\n if (otherRow === row && isEventsOverlap(event, otherEvent)) {\n hasConflict = true\n break\n }\n }\n\n if (!hasConflict) {\n break\n }\n\n row++\n }\n\n eventRows.set(event, row)\n }\n\n return eventRows\n}\n","import dayjs, { Dayjs } from 'dayjs'\nimport { DateStringValue } from '../../../types'\n\ninterface CalculateAllDayEventOffsetInput {\n eventStartDate: Dayjs\n weekStartDate: Dayjs\n weekDays: DateStringValue[]\n visibleDaysCount: number\n hangingStart: boolean\n}\n\nexport function calculateAllDayEventOffset({\n eventStartDate,\n weekStartDate,\n weekDays,\n visibleDaysCount,\n hangingStart,\n}: CalculateAllDayEventOffsetInput): number {\n let displayStartDate = eventStartDate\n\n if (hangingStart) {\n displayStartDate = weekStartDate\n }\n\n if (!weekDays.some((day) => dayjs(day).isSame(displayStartDate, 'day'))) {\n displayStartDate = dayjs(weekDays[0])\n }\n\n const visibleDaysBeforeEvent =\n weekDays.filter(\n (day) => dayjs(day).isBefore(displayStartDate) || dayjs(day).isSame(displayStartDate, 'day'),\n ).length - 1\n\n return (visibleDaysBeforeEvent / visibleDaysCount) * 100\n}\n","import dayjs, { Dayjs } from 'dayjs'\nimport { DateStringValue } from '../../../types'\n\ninterface CalculateAllDayEventWidthInput {\n eventStartDate: Dayjs\n actualEndDate: Dayjs\n weekStartDate: Dayjs\n weekEndDate: Dayjs\n weekDays: DateStringValue[]\n visibleDaysCount: number\n}\n\nexport function calculateAllDayEventWidth({\n eventStartDate,\n actualEndDate,\n weekStartDate,\n weekEndDate,\n weekDays,\n visibleDaysCount,\n}: CalculateAllDayEventWidthInput): number {\n let displayStartDate = eventStartDate\n if (eventStartDate.isBefore(weekStartDate)) {\n displayStartDate = weekStartDate\n }\n\n let displayEndDate = actualEndDate\n if (actualEndDate.isAfter(weekEndDate)) {\n displayEndDate = weekEndDate\n }\n\n const visibleDaysSpanned = weekDays.filter(\n (day) =>\n (dayjs(day).isAfter(displayStartDate) || dayjs(day).isSame(displayStartDate, 'day')) &&\n (dayjs(day).isBefore(displayEndDate) || dayjs(day).isSame(displayEndDate, 'day')),\n ).length\n\n return (visibleDaysSpanned / visibleDaysCount) * 100\n}\n","import dayjs, { Dayjs } from 'dayjs'\nimport { DateStringValue, ScheduleEventData } from '../../../types'\n\ninterface CalculateEventDaysInput {\n event: ScheduleEventData\n weekDays: DateStringValue[]\n actualEndDate: Dayjs\n}\n\nexport function calculateEventDays({ event, weekDays, actualEndDate }: CalculateEventDaysInput) {\n const eventStartDate = dayjs(event.start).startOf('day')\n\n return weekDays.filter((day) => {\n const dayDate = dayjs(day).startOf('day')\n return (\n (dayDate.isAfter(eventStartDate) || dayDate.isSame(eventStartDate)) &&\n (dayDate.isBefore(actualEndDate) || dayDate.isSame(actualEndDate))\n )\n })\n}\n","import { WeekPositionedEventData } from '../../../types'\nimport { isEventsOverlap } from '../../../utils'\n\nexport function calculateRegularEventOverlaps(events: WeekPositionedEventData[]): void {\n for (const event of events) {\n let maxOverlappingColumn = event.position.column\n\n for (const otherEvent of events) {\n if (isEventsOverlap(event, otherEvent)) {\n maxOverlappingColumn = Math.max(maxOverlappingColumn, otherEvent.position.column)\n }\n }\n\n const overlaps = maxOverlappingColumn + 1\n event.position.overlaps = overlaps\n event.position.width = 100 / overlaps\n event.position.offset = (event.position.column * 100) / overlaps\n }\n}\n","import { DateStringValue, ScheduleEventData } from '../../../types'\nimport { isAllDayEvent, isEventsOverlap } from '../../../utils'\n\ninterface FindAvailableColumnInput {\n columns: Map<string, ScheduleEventData[]>\n event: ScheduleEventData\n allDay: boolean\n allWeekDays: DateStringValue[]\n}\n\nfunction columnHasConflict({\n columns,\n columnIndex,\n event,\n allDay,\n allWeekDays,\n}: FindAvailableColumnInput & { columnIndex: number }): boolean {\n const columnKey = `col-${columnIndex}`\n if (!columns.has(columnKey)) {\n return false\n }\n\n const columnEvents = columns.get(columnKey)!\n\n return columnEvents.some((e) => {\n const eAllDay = allWeekDays.some((day) => isAllDayEvent({ event: e, date: day }))\n const hasTimeConflict = isEventsOverlap(e, event)\n\n if (allDay && eAllDay) {\n return hasTimeConflict\n }\n\n if (allDay || eAllDay) {\n return false\n }\n\n return hasTimeConflict\n })\n}\n\nexport function findAvailableColumn(input: FindAvailableColumnInput): number {\n let column = 0\n\n while (columnHasConflict({ ...input, columnIndex: column })) {\n column++\n }\n\n return column\n}\n","import dayjs from 'dayjs'\nimport { ScheduleEventData } from '../../../types'\n\nexport function getEventEndDate(event: ScheduleEventData) {\n const eventEndDate = dayjs(event.end).startOf('day')\n\n if (dayjs(event.end).hour() === 0 && dayjs(event.end).minute() === 0) {\n return eventEndDate.subtract(1, 'day')\n }\n\n return eventEndDate\n}\n","import dayjs, { Dayjs } from 'dayjs'\nimport { DateStringValue } from '../../../types'\n\ninterface GetHangingStatusInput {\n eventStartDate: Dayjs\n actualEndDate: Dayjs\n weekDays: DateStringValue[]\n}\n\nexport function getHangingStatus({\n eventStartDate,\n actualEndDate,\n weekDays,\n}: GetHangingStatusInput): 'start' | 'end' | 'both' | 'none' {\n const weekStartDate = dayjs(weekDays[0])\n const weekEndDate = dayjs(weekDays[weekDays.length - 1])\n\n const hangingStart = eventStartDate.isBefore(weekStartDate)\n const hangingEnd = actualEndDate.isAfter(weekEndDate)\n\n if (hangingStart && hangingEnd) {\n return 'both'\n }\n\n if (hangingStart) {\n return 'start'\n }\n\n if (hangingEnd) {\n return 'end'\n }\n\n return 'none'\n}\n","import dayjs from 'dayjs'\nimport {\n AnyDateValue,\n DateStringValue,\n DayOfWeek,\n ScheduleEventData,\n WeekPositionedEventData,\n} from '../../../types'\nimport { getDayPosition, getWeekDays, isAllDayEvent, sortEvents } from '../../../utils'\nimport { assignEventRows } from './assign-event-rows'\nimport { calculateAllDayEventOffset } from './calculate-all-day-event-offset'\nimport { calculateAllDayEventWidth } from './calculate-all-day-event-width'\nimport { calculateEventDays } from './calculate-event-days'\nimport { calculateRegularEventOverlaps } from './calculate-regular-event-overlaps'\nimport { findAvailableColumn } from './find-available-column'\nimport { getEventEndDate } from './get-event-end-date'\nimport { getHangingStatus } from './get-hanging-status'\n\nexport interface GetWeekPositionedEventsInput {\n /** Date (week start) at which events are positioned, used to check if events are all-day */\n date: AnyDateValue\n\n /** List of all events that belong to the given week, extra events must be filtered out before passing to the function */\n events: ScheduleEventData[]\n\n /** Start time of the week view, used to calculate event positions */\n startTime?: string\n\n /** End time of the week view, used to calculate event positions */\n endTime?: string\n\n /** Number of minutes per time slot, used to align the canvas to whole slots */\n intervalMinutes?: number\n\n /** First day of the week, 0 - Sunday, 1 - Monday, etc., used to calculate events positions */\n firstDayOfWeek?: DayOfWeek\n\n /** Indices of weekend days, 0-6, where 0 is Sunday and 6 is Saturday */\n weekendDays?: DayOfWeek[]\n\n /** If set to false, weekend days are hidden @default true */\n withWeekendDays?: boolean\n}\n\n/** Events grouped by week day date (YYYY-MM-DD 00:00:00) and by columns */\nexport interface GroupedWeekEvents {\n allDayEvents: WeekPositionedEventData[]\n regularEvents: Record<DateStringValue, WeekPositionedEventData[]>\n backgroundEvents: Record<DateStringValue, WeekPositionedEventData[]>\n}\n\nexport function getWeekPositionedEvents({\n date,\n events,\n startTime,\n endTime,\n intervalMinutes,\n firstDayOfWeek = 1,\n weekendDays = [0, 6],\n withWeekendDays = true,\n}: GetWeekPositionedEventsInput): GroupedWeekEvents {\n const weekDays = getWeekDays({ week: date, firstDayOfWeek, withWeekendDays, weekendDays })\n const visibleDaysCount = weekDays.length\n const weekStartDate = dayjs(weekDays[0])\n const weekEndDate = dayjs(weekDays[weekDays.length - 1])\n\n const grouped: GroupedWeekEvents = {\n allDayEvents: [],\n regularEvents: Object.fromEntries(weekDays.map((day) => [day, []])),\n backgroundEvents: Object.fromEntries(weekDays.map((day) => [day, []])),\n }\n\n const columns = new Map<string, ScheduleEventData[]>()\n const allDayColumns = new Map<string, ScheduleEventData[]>()\n const sorted = sortEvents(events)\n\n for (const event of sorted) {\n if (event.display === 'background') {\n const eventStartDate = dayjs(event.start).startOf('day')\n const actualEndDate = getEventEndDate(event)\n const eventWeekDays = calculateEventDays({ event, weekDays, actualEndDate })\n const hanging = getHangingStatus({ eventStartDate, actualEndDate, weekDays })\n\n for (const day of eventWeekDays) {\n const visibleDayIndex = weekDays.indexOf(day)\n if (visibleDayIndex === -1) {\n continue\n }\n\n const dayStart = dayjs(day)\n const dayEnd = dayStart.endOf('day')\n const eventStart = dayjs(event.start)\n const eventEnd = dayjs(event.end)\n\n const clippedStart = eventStart.isBefore(dayStart) ? dayStart : eventStart\n const clippedEnd = eventEnd.isAfter(dayEnd) ? dayEnd : eventEnd\n\n const clippedEvent = {\n ...event,\n start: clippedStart.format('YYYY-MM-DD HH:mm:ss'),\n end: clippedEnd.format('YYYY-MM-DD HH:mm:ss'),\n }\n\n const isAllDay = isAllDayEvent({ event: clippedEvent, date: day })\n const verticalPosition = isAllDay\n ? { top: 0, height: 100 }\n : getDayPosition({ event: clippedEvent, startTime, endTime, intervalMinutes })\n\n if (!isAllDay && verticalPosition.height <= 0) {\n continue\n }\n\n const dayWeekOffset = (visibleDayIndex / visibleDaysCount) * 100\n\n grouped.backgroundEvents[day].push({\n ...event,\n position: {\n ...verticalPosition,\n allDay: isAllDay,\n column: 0,\n width: 100,\n offset: 0,\n overlaps: 1,\n weekOffset: dayWeekOffset,\n row: 0,\n hanging,\n },\n })\n }\n\n continue\n }\n const eventStartDate = dayjs(event.start).startOf('day')\n const actualEndDate = getEventEndDate(event)\n const eventWeekDays = calculateEventDays({ event, weekDays, actualEndDate })\n\n if (eventWeekDays.length === 0) {\n continue\n }\n\n const isMultiday = actualEndDate.isAfter(eventStartDate)\n const hanging = getHangingStatus({ eventStartDate, actualEndDate, weekDays })\n const isActuallyAllDay = eventWeekDays.some((day) => isAllDayEvent({ event, date: day }))\n const allDay = isMultiday || isActuallyAllDay\n\n const columnMap = allDay ? allDayColumns : columns\n const column = findAvailableColumn({\n columns: columnMap,\n event,\n allDay,\n allWeekDays: weekDays,\n })\n\n const columnKey = `col-${column}`\n if (!columnMap.has(columnKey)) {\n columnMap.set(columnKey, [])\n }\n columnMap.get(columnKey)!.push(event)\n\n const verticalPosition = allDay\n ? { top: 0, height: 100 }\n : getDayPosition({ event, startTime, endTime, intervalMinutes })\n\n if (allDay) {\n const offset = calculateAllDayEventOffset({\n eventStartDate,\n weekStartDate,\n weekDays,\n visibleDaysCount,\n hangingStart: hanging === 'start' || hanging === 'both',\n })\n\n grouped.allDayEvents.push({\n ...event,\n position: {\n ...verticalPosition,\n allDay,\n column,\n width: 0,\n offset,\n overlaps: 0,\n row: 0,\n hanging,\n },\n })\n } else {\n for (const day of eventWeekDays) {\n const visibleDayIndex = weekDays.indexOf(day)\n\n if (visibleDayIndex === -1) {\n continue\n }\n\n const dayWeekOffset = (visibleDayIndex / visibleDaysCount) * 100\n\n grouped.regularEvents[day].push({\n ...event,\n position: {\n ...verticalPosition,\n allDay,\n column,\n width: 0,\n offset: 0,\n overlaps: 0,\n weekOffset: dayWeekOffset,\n row: 0,\n hanging,\n },\n })\n }\n }\n }\n\n for (const day of weekDays) {\n calculateRegularEventOverlaps(grouped.regularEvents[day])\n }\n\n if (grouped.allDayEvents.length > 0) {\n const eventRows = assignEventRows(grouped.allDayEvents)\n const assignedRows = new Set<number>()\n\n for (const event of grouped.allDayEvents) {\n const row = eventRows.get(event)!\n event.position.row = row\n assignedRows.add(row)\n }\n\n const rowCount = Math.max(...assignedRows) + 1\n\n for (const event of grouped.allDayEvents) {\n const eventStartDate = dayjs(event.start).startOf('day')\n const actualEndDate = getEventEndDate(event)\n\n event.position.width = calculateAllDayEventWidth({\n eventStartDate,\n actualEndDate,\n weekStartDate,\n weekEndDate,\n weekDays,\n visibleDaysCount,\n })\n\n event.position.overlaps = rowCount\n }\n }\n\n return grouped\n}\n","import { ScheduleEventData } from '../../../types'\nimport { filterWeekViewEvents } from './filter-week-view-events'\nimport {\n getWeekPositionedEvents,\n GetWeekPositionedEventsInput,\n GroupedWeekEvents,\n} from './get-week-positioned-events'\n\ninterface GetWeekViewEventsInput extends Omit<GetWeekPositionedEventsInput, 'events'> {\n events: ScheduleEventData[] | undefined\n}\n\nexport function getWeekViewEvents(input: GetWeekViewEventsInput): GroupedWeekEvents {\n return getWeekPositionedEvents({ ...input, events: filterWeekViewEvents(input) })\n}\n",".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: var(--week-view-slot-height);\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.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","import dayjs from 'dayjs'\nimport {\n defineComponent,\n h,\n ref,\n type ComponentPublicInstance,\n type CSSProperties,\n type PropType,\n type SlotsType,\n type VNodeChild,\n} from 'vue'\nimport { Box, ScrollArea, UnstyledButton } from '@mantine-vue/core'\nimport type { WeekViewProps } from '../../component-props'\nimport { useEventResize } from '../../hooks/use-event-resize'\nimport { getLabel } from '../../labels'\nimport type { DateLabelFormat, DateStringValue, DateTimeStringValue, DayOfWeek } from '../../types'\nimport {\n formatDate,\n getBusinessHoursMod,\n getDayTimeIntervals,\n getWeekDays,\n getWeekNumber,\n} from '../../utils'\nimport { CurrentTimeIndicator } from '../CurrentTimeIndicator/CurrentTimeIndicator'\nimport { useSlotDragSelect } from '../use-slot-drag-select'\nimport { ScheduleHeaderBase, createHeaderNavigation } from '../ScheduleHeader/ScheduleHeaderBase'\nimport {\n eventNode,\n getDropEvent,\n getExpandedEvents,\n getTimeSlotDropTarget,\n moveEventTo,\n moveEventToAllDay,\n resolveScheduleRadius,\n timeViewProps,\n type EventSlots,\n} from '../shared'\nimport { getWeekLabel } from './get-week-label/get-week-label'\nimport { getWeekViewEvents } from './get-week-view-events/get-week-view-events'\nimport classes from './WeekView.module.css'\n\nexport interface WeekViewSlots extends EventSlots {\n /** Scoped alternative to the `renderWeekLabel` prop */\n weekLabel?: (props: { weekStart: DateStringValue; weekEnd: DateStringValue }) => VNodeChild\n}\n\nexport const WeekView = defineComponent({\n name: 'WeekView',\n inheritAttrs: false,\n slots: Object as SlotsType<WeekViewSlots>,\n props: {\n ...timeViewProps,\n withCurrentTimeIndicator: { type: Boolean, default: true },\n forceCurrentTimeIndicator: Boolean,\n firstDayOfWeek: { type: Number as PropType<DayOfWeek>, default: 1 },\n weekdayFormat: { type: [String, Function] as PropType<DateLabelFormat>, default: 'ddd' },\n dayFormat: { type: [String, Function] as PropType<DateLabelFormat>, default: 'D' },\n withWeekNumber: { type: Boolean, default: true },\n withAllDaySlots: { type: Boolean, default: true },\n withWeekNumbers: { type: Boolean, default: undefined },\n withAllDaySlot: { type: Boolean, default: undefined },\n allDaySlotsHeight: { type: [String, Number] as PropType<CSSProperties['height']>, default: 44 },\n maxAllDayEvents: { type: Number, default: 3 },\n weekendDays: { type: Array as PropType<DayOfWeek[]>, default: () => [0, 6] },\n withWeekendDays: { type: Boolean, default: true },\n weekLabelFormat: { type: [String, Function] as PropType<DateLabelFormat>, default: 'MMM D' },\n renderWeekLabel: Function as PropType<WeekViewProps['renderWeekLabel']>,\n },\n setup(props, { attrs, slots }) {\n const daySlotsContainers = new Map<string, HTMLElement>()\n const dropTarget = ref<{ date: string; slotIndex: number } | null>(null)\n const eventResize = useEventResize({\n enabled: () => props.withEventResize,\n mode: () => props.mode,\n startTime: () => props.startTime,\n endTime: () => props.endTime,\n intervalMinutes: () => props.intervalMinutes,\n onEventResize: () => props.onEventResize,\n canResizeEvent: () => props.canResizeEvent,\n })\n const slotTimes = ref<{ startTime: string; endTime: string }[]>([])\n const slotDragSelect = useSlotDragSelect({\n enabled: () => props.withDragSlotSelect && props.mode !== 'static',\n onDragEnd: () =>\n props.onSlotDragEnd\n ? (startIndex, endIndex, group) => {\n const slotDate = dayjs(group).format('YYYY-MM-DD')\n const startSlot = slotTimes.value[startIndex]\n const endSlot = slotTimes.value[endIndex]\n if (startSlot && endSlot) {\n props.onSlotDragEnd?.(\n `${slotDate} ${startSlot.startTime}` as DateTimeStringValue,\n `${slotDate} ${endSlot.endTime}` as DateTimeStringValue,\n )\n }\n }\n : undefined,\n })\n return () => {\n const withWeekNumber = props.withWeekNumbers ?? props.withWeekNumber\n const withAllDaySlots = props.withAllDaySlot ?? props.withAllDaySlots\n const days = getWeekDays({\n week: props.date!,\n firstDayOfWeek: props.firstDayOfWeek,\n withWeekendDays: props.withWeekendDays,\n weekendDays: props.weekendDays,\n })\n const now = dayjs(props.getCurrentTime?.() ?? dayjs())\n const currentWeekdayIndex = props.withCurrentTimeIndicator\n ? props.forceCurrentTimeIndicator\n ? days.findIndex((date) => dayjs(date).day() === now.day())\n : days.findIndex((date) => dayjs(date).isSame(now, 'day'))\n : -1\n const expanded = getExpandedEvents(\n props.events,\n dayjs(days[0]).startOf('day').format('YYYY-MM-DD HH:mm:ss'),\n dayjs(days.at(-1)).endOf('day').format('YYYY-MM-DD HH:mm:ss'),\n props.recurrenceExpansionLimit,\n )\n const grouped = getWeekViewEvents({\n date: props.date!,\n events: expanded,\n startTime: props.startTime,\n endTime: props.endTime,\n intervalMinutes: props.intervalMinutes,\n firstDayOfWeek: props.firstDayOfWeek,\n weekendDays: props.weekendDays,\n withWeekendDays: props.withWeekendDays,\n })\n const intervals = getDayTimeIntervals({\n startTime: props.startTime,\n endTime: props.endTime,\n intervalMinutes: props.intervalMinutes,\n })\n slotTimes.value = intervals.map((slot) => ({\n startTime: slot.startTime,\n endTime: slot.endTime,\n }))\n const withSlotSelect = props.withDragSlotSelect && props.mode !== 'static'\n const getWeekRoot = (event: KeyboardEvent) =>\n (event.currentTarget as HTMLElement).closest<HTMLElement>(`.${classes.weekViewRoot}`)\n const focusWeekControl = (event: KeyboardEvent, selector: string) => {\n const control = getWeekRoot(event)?.querySelector<HTMLButtonElement>(selector)\n if (!control || control.disabled) return\n event.preventDefault()\n control.focus()\n }\n const withDragHandlers =\n props.mode !== 'static' &&\n (props.withEventsDragAndDrop || Boolean(props.onExternalEventDrop))\n const emitDrop = (nativeEvent: DragEvent, target: string) => {\n nativeEvent.preventDefault()\n const event = getDropEvent(expanded, nativeEvent.dataTransfer)\n if (event) props.onEventDrop?.(moveEventTo(event, target))\n else if (nativeEvent.dataTransfer)\n props.onExternalEventDrop?.(nativeEvent.dataTransfer, target)\n }\n const emitAllDayDrop = (nativeEvent: DragEvent, date: string) => {\n nativeEvent.preventDefault()\n const dayKey = dayjs(date).format('YYYY-MM-DD')\n const event = getDropEvent(expanded, nativeEvent.dataTransfer)\n if (event) props.onEventDrop?.(moveEventToAllDay(event, dayKey))\n else if (nativeEvent.dataTransfer)\n props.onExternalEventDrop?.(nativeEvent.dataTransfer, `${dayKey} 00:00:00`)\n }\n const rootStyle = {\n '--week-view-radius': resolveScheduleRadius(props.radius),\n '--week-view-slot-height':\n typeof props.slotHeight === 'number' ? `${props.slotHeight}px` : props.slotHeight,\n '--week-view-all-day-slots-height':\n typeof props.allDaySlotsHeight === 'number'\n ? `${props.allDaySlotsHeight}px`\n : props.allDaySlotsHeight,\n } as CSSProperties\n return h(\n Box,\n {\n ...attrs,\n class: [classes.weekView, attrs.class],\n style: [rootStyle, attrs.style],\n mod: { static: props.mode === 'static', 'slot-dragging': slotDragSelect.isDragging() },\n },\n () => [\n props.withHeader\n ? h(ScheduleHeaderBase, {\n view: 'week',\n labels: props.labels,\n onDateChange: props.onDateChange,\n onViewChange: props.onViewChange,\n navigationHandlers: createHeaderNavigation(props.date!, 'week'),\n previousControlProps: props.previousControlProps,\n nextControlProps: props.nextControlProps,\n todayControlProps: props.todayControlProps,\n viewSelectProps: props.viewSelectProps,\n control: {\n title: getWeekLabel({\n weekdays: days,\n locale: props.locale || 'en',\n weekLabelFormat: props.weekLabelFormat,\n renderWeekLabel:\n props.renderWeekLabel ??\n (slots.weekLabel ? (params) => slots.weekLabel!(params) : undefined),\n }),\n },\n })\n : null,\n h(\n Box,\n {\n class: classes.weekViewRoot,\n style: {\n '--number-of-days': String(days.length),\n '--indicator-offset-index':\n currentWeekdayIndex === -1 ? undefined : String(currentWeekdayIndex + 1),\n },\n mod: { 'with-weekends': props.withWeekendDays },\n },\n () => [\n h(\n ScrollArea.Autosize,\n { class: classes.weekViewScrollArea, scrollbarSize: 4 },\n () => [\n h('div', { class: classes.weekViewHeader }, [\n h('div', { class: classes.weekViewCorner }, [\n withWeekNumber\n ? h(\n 'div',\n { class: classes.weekViewWeekLabel },\n props.labels?.week || 'Week',\n )\n : null,\n withWeekNumber\n ? h(\n 'div',\n { class: classes.weekViewWeekNumber },\n String(getWeekNumber(days)),\n )\n : null,\n ]),\n ...days.map((date, dayIndex) =>\n h(\n UnstyledButton,\n {\n type: 'button',\n class: classes.weekViewDayLabel,\n 'data-weekday-index': dayIndex,\n 'data-weekend':\n props.weekendDays.includes(dayjs(date).day() as DayOfWeek) || undefined,\n 'aria-label': `${getLabel('weekday', props.labels)} ${dayjs(date).format('YYYY-MM-DD')}`,\n tabindex: props.mode === 'static' ? -1 : dayIndex === 0 ? 0 : -1,\n onKeydown:\n props.mode === 'static'\n ? undefined\n : (event: KeyboardEvent) => {\n const next =\n event.key === 'ArrowRight'\n ? dayIndex + 1\n : event.key === 'ArrowLeft'\n ? dayIndex - 1\n : -1\n if (next >= 0 && next < days.length) {\n focusWeekControl(event, `[data-weekday-index=\"${next}\"]`)\n }\n },\n onClick:\n props.mode === 'static'\n ? undefined\n : () => {\n props.onViewChange?.('day')\n props.onDateChange?.(date)\n },\n },\n () => [\n h(\n 'span',\n { class: classes.weekViewDayWeekday },\n formatDate({\n date,\n locale: props.locale || 'en',\n format: props.weekdayFormat,\n }),\n ),\n h(\n 'span',\n {\n class: classes.weekViewDayNumber,\n 'data-today': dayjs(date).isSame(now, 'day') || undefined,\n },\n formatDate({\n date,\n locale: props.locale || 'en',\n format: props.dayFormat,\n }),\n ),\n ],\n ),\n ),\n ]),\n withAllDaySlots\n ? h('div', { class: classes.weekViewAllDaySlots }, [\n h(\n 'div',\n { class: classes.weekViewAllDaySlotsLabel },\n props.labels?.allDay || 'All day',\n ),\n h('div', { class: classes.weekViewAllDaySlotsList }, [\n h(\n 'div',\n { class: classes.weekViewAllDaySlotsEvents },\n grouped.allDayEvents.map((event) =>\n eventNode(\n event,\n props,\n {\n key: event.id,\n nowrap: true,\n hanging: event.position.hanging,\n style: {\n position: 'absolute',\n insetInlineStart: `${event.position.offset}%`,\n width: `${event.position.width}%`,\n top: `${event.position.row * 22}px`,\n },\n },\n slots,\n ),\n ),\n ),\n ...days.map((date, dayIndex) =>\n h(UnstyledButton, {\n type: 'button',\n class: classes.weekViewDaySlot,\n disabled: props.mode === 'static',\n 'data-all-day-index': dayIndex,\n 'aria-label': `${getLabel('allDay', props.labels)} ${dayjs(date).format('YYYY-MM-DD')}`,\n tabindex: props.mode === 'static' ? -1 : dayIndex === 0 ? 0 : -1,\n onKeydown:\n props.mode === 'static'\n ? undefined\n : (event: KeyboardEvent) => {\n if (event.key === 'ArrowDown') {\n focusWeekControl(\n event,\n `[data-week-day-index=\"${dayIndex}\"][data-time-slot-index=\"0\"]`,\n )\n return\n }\n const next =\n event.key === 'ArrowRight'\n ? dayIndex + 1\n : event.key === 'ArrowLeft'\n ? dayIndex - 1\n : -1\n if (next >= 0 && next < days.length) {\n focusWeekControl(event, `[data-all-day-index=\"${next}\"]`)\n }\n },\n onClick: (event: MouseEvent) =>\n props.onAllDaySlotClick?.(date, event),\n onDragover: (event: DragEvent) => event.preventDefault(),\n onDrop: (event: DragEvent) => emitAllDayDrop(event, date),\n }),\n ),\n ]),\n ])\n : null,\n h(Box, { class: classes.weekViewInner }, () => [\n h(\n 'div',\n { class: classes.weekViewSlotLabels },\n intervals.map((slot) =>\n h(\n 'div',\n { class: classes.weekViewSlotLabel },\n formatDate({\n date: `${dayjs(days[0]).format('YYYY-MM-DD')} ${slot.startTime}`,\n locale: props.locale || 'en',\n format: props.slotLabelFormat,\n }),\n ),\n ),\n ),\n props.withCurrentTimeIndicator && currentWeekdayIndex !== -1\n ? h(CurrentTimeIndicator, {\n startOffset:\n '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:\n '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:\n 'calc(var(--week-view-slots-label-width) - var(--time-bubble-width))',\n currentTimeFormat: props.slotLabelFormat,\n withTimeBubble: props.withCurrentTimeBubble,\n withThumb: props.withCurrentTimeBubble ? currentWeekdayIndex !== 0 : true,\n locale: props.locale,\n startTime: props.startTime,\n endTime: props.endTime,\n intervalMinutes: props.intervalMinutes,\n getCurrentTime: props.getCurrentTime,\n })\n : null,\n ...days.map((date, dayIndex) =>\n h('div', { class: classes.weekViewDay }, [\n h(\n 'div',\n {\n class: classes.weekViewDaySlots,\n ref: (element: Element | ComponentPublicInstance | null) => {\n if (element instanceof HTMLElement) {\n daySlotsContainers.set(date, element)\n } else {\n daySlotsContainers.delete(date)\n }\n },\n onDragover: withDragHandlers\n ? (event: DragEvent) => {\n event.preventDefault()\n const container = daySlotsContainers.get(date)\n if (!container) return\n const target = getTimeSlotDropTarget({\n nativeEvent: event,\n container,\n intervals,\n date: dayjs(date).format('YYYY-MM-DD'),\n })\n dropTarget.value = target\n ? { date, slotIndex: target.slotIndex }\n : null\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect =\n event.dataTransfer.types.includes('application/json')\n ? 'move'\n : 'copy'\n }\n }\n : undefined,\n onDragleave: withDragHandlers\n ? (event: DragEvent) => {\n const container = daySlotsContainers.get(date)\n if (\n !(event.relatedTarget instanceof Node) ||\n !container?.contains(event.relatedTarget)\n ) {\n dropTarget.value = null\n }\n }\n : undefined,\n onDrop: withDragHandlers\n ? (event: DragEvent) => {\n const container = daySlotsContainers.get(date)\n if (!container) return\n const target = getTimeSlotDropTarget({\n nativeEvent: event,\n container,\n intervals,\n date: dayjs(date).format('YYYY-MM-DD'),\n })\n dropTarget.value = null\n if (target) emitDrop(event, target.target)\n }\n : undefined,\n },\n [\n ...intervals.map((slot, slotIndex) => {\n const datePart = dayjs(date).format('YYYY-MM-DD')\n const start = dayjs(`${datePart} ${slot.startTime}`)\n const end = dayjs(`${datePart} ${slot.endTime}`)\n const mod = getBusinessHoursMod({\n time: slot.startTime,\n businessHours: props.businessHours || ['09:00:00', '17:00:00'],\n highlightBusinessHours: props.highlightBusinessHours,\n dayOfWeek: start.day() as DayOfWeek,\n })\n return h(UnstyledButton, {\n type: 'button',\n class: classes.weekViewDaySlot,\n 'data-week-day-index': dayIndex,\n 'data-time-slot-index': slotIndex,\n 'data-drag-slot-index': withSlotSelect ? slotIndex : undefined,\n 'data-drag-slot-group': withSlotSelect ? datePart : undefined,\n 'data-drop-target':\n (dropTarget.value?.date === date &&\n dropTarget.value.slotIndex === slotIndex) ||\n undefined,\n 'data-drag-selected':\n slotDragSelect.isSlotSelected(slotIndex, datePart) || undefined,\n disabled: props.mode === 'static',\n 'aria-label': `${getLabel('timeSlot', props.labels)} ${datePart} ${slot.startTime} - ${slot.endTime}`,\n tabindex:\n props.mode === 'static'\n ? -1\n : dayIndex === 0 && slotIndex === 0\n ? 0\n : -1,\n onKeydown:\n props.mode === 'static'\n ? undefined\n : (event: KeyboardEvent) => {\n if (\n event.key === 'ArrowUp' &&\n slotIndex === 0 &&\n withAllDaySlots\n ) {\n focusWeekControl(\n event,\n `[data-all-day-index=\"${dayIndex}\"]`,\n )\n return\n }\n const nextDay =\n event.key === 'ArrowRight'\n ? dayIndex + 1\n : event.key === 'ArrowLeft'\n ? dayIndex - 1\n : dayIndex\n const nextSlot =\n event.key === 'ArrowDown'\n ? slotIndex + 1\n : event.key === 'ArrowUp'\n ? slotIndex - 1\n : slotIndex\n if (\n nextDay >= 0 &&\n nextDay < days.length &&\n nextSlot >= 0 &&\n nextSlot < intervals.length &&\n (nextDay !== dayIndex || nextSlot !== slotIndex)\n ) {\n focusWeekControl(\n event,\n `[data-week-day-index=\"${nextDay}\"][data-time-slot-index=\"${nextSlot}\"]`,\n )\n }\n },\n 'data-business-hours': mod['business-hours'] || undefined,\n 'data-non-business-hours': mod['non-business-hours'] || undefined,\n onClick: (nativeEvent: MouseEvent) =>\n props.onTimeSlotClick?.({\n slotStart: start.format(\n 'YYYY-MM-DD HH:mm:ss',\n ) as DateTimeStringValue,\n slotEnd: end.format(\n 'YYYY-MM-DD HH:mm:ss',\n ) as DateTimeStringValue,\n nativeEvent,\n }),\n onPointerdown: withSlotSelect\n ? (nativeEvent: PointerEvent) =>\n slotDragSelect.handleSlotPointerDown(\n nativeEvent,\n slotIndex,\n datePart,\n )\n : undefined,\n onDragover: (event: DragEvent) => event.preventDefault(),\n })\n }),\n ...(grouped.backgroundEvents[date] || []).map((event) =>\n h('div', {\n class: classes.weekViewBackgroundEvent,\n style: {\n top: `${event.position.top}%`,\n height: `${event.position.height}%`,\n width: '100%',\n },\n }),\n ),\n ...(grouped.regularEvents[date] || []).map((event) => {\n const resizePosition = eventResize.getResizePosition(event.id)\n const isResizable = eventResize.isResizableEvent(event)\n return eventNode(\n event,\n props,\n {\n key: `${event.id}-${date}`,\n autoSize: true,\n style: {\n position: 'absolute',\n top: `${resizePosition?.top ?? event.position.top}%`,\n height: `${resizePosition?.height ?? event.position.height}%`,\n width: `${event.position.width}%`,\n insetInlineStart: `${event.position.offset}%`,\n },\n withResize: isResizable,\n isResizing: resizePosition !== null,\n onClick: props.onEventClick\n ? (nativeEvent: MouseEvent) => {\n if (!eventResize.wasResizing()) {\n props.onEventClick?.(event, nativeEvent)\n }\n }\n : undefined,\n onResizeStart: (\n edge: 'top' | 'bottom',\n pointerEvent: PointerEvent,\n ) => {\n const container = daySlotsContainers.get(date)\n if (!container) return\n eventResize.handleResizeStart({\n event,\n edge,\n container,\n originalTop: event.position.top,\n originalHeight: event.position.height,\n eventDate: dayjs(date).format('YYYY-MM-DD'),\n pointerEvent,\n })\n },\n },\n slots,\n )\n }),\n ],\n ),\n ]),\n ),\n ]),\n ],\n ),\n ],\n ),\n ],\n )\n }\n },\n})\n\nexport type { WeekViewProps }\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","import dayjs from 'dayjs'\nimport { AnyDateValue, DateStringValue, ScheduleEventData } from '../../../types'\nimport { isMultidayEvent, validateEvent } from '../../../utils'\n\nexport type GroupedEvents = Record<DateStringValue, ScheduleEventData[]>\n\nfunction groupEventByDate(event: ScheduleEventData, groupedEvents: GroupedEvents) {\n if (isMultidayEvent(event)) {\n const startDate = dayjs(event.start).startOf('day')\n const endDate = dayjs(event.end).startOf('day')\n\n for (\n let date = startDate;\n date.isBefore(endDate) || date.isSame(endDate);\n date = date.add(1, 'day')\n ) {\n const dateKey = date.format('YYYY-MM-DD')\n if (!groupedEvents[dateKey]) {\n groupedEvents[dateKey] = []\n }\n groupedEvents[dateKey].push(event)\n }\n\n return\n }\n\n const eventDate = dayjs(event.start).format('YYYY-MM-DD')\n if (!groupedEvents[eventDate]) {\n groupedEvents[eventDate] = []\n }\n groupedEvents[eventDate].push(event)\n}\n\ninterface GetYearViewEventsInput {\n date: AnyDateValue\n events: ScheduleEventData[] | undefined\n}\n\nexport function getYearViewEvents({ date, events }: GetYearViewEventsInput) {\n const groupedEvents: GroupedEvents = {}\n\n if (events === undefined) {\n return groupedEvents\n }\n\n const ids = new Set<string | number>()\n\n for (const event of events) {\n if (dayjs(event.start).isSame(dayjs(date), 'year')) {\n groupEventByDate(validateEvent(event), groupedEvents)\n\n if (!ids.has(event.id)) {\n ids.add(event.id)\n } else {\n throw new Error(`[@mantine/schedule] YearView: Duplicated event ids found: ${event.id}`)\n }\n }\n }\n\n return groupedEvents\n}\n",".yearView {\n --year-view-radius: var(--schedule-radius, var(--mantine-radius-default));\n --year-view-font-size: var(--mantine-font-size-sm);\n container-type: inline-size;\n\n @mixin where-light {\n --year-view-border-color: var(--mantine-color-gray-3);\n }\n\n @mixin where-dark {\n --year-view-border-color: var(--mantine-color-dark-4);\n }\n}\n\n.yearViewMonths {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n\n @container (width <= 850px) {\n --year-view-font-size: calc(var(--mantine-font-size-sm) - 2px);\n }\n\n @container (width <= 750px) {\n grid-template-columns: repeat(2, 1fr);\n --year-view-font-size: var(--mantine-font-size-xs);\n }\n\n @container (width <= 520px) {\n --year-view-font-size: calc(var(--mantine-font-size-xs) - 2px);\n }\n\n @container (width <= 420px) {\n grid-template-columns: 1fr;\n --year-view-font-size: var(--mantine-font-size-xs);\n }\n}\n\n.yearViewMonth {\n --week-numbers-offset: 0rem;\n --day-base-color: var(--mantine-color-text);\n --day-dimmed-color: alpha(var(--day-base-color), 0.35);\n\n &:where([data-with-week-numbers]) {\n --week-numbers-offset: 28px;\n }\n\n min-width: 0;\n border: 1px solid var(--year-view-border-color);\n padding: var(--mantine-spacing-md);\n margin-top: -1px;\n margin-inline-start: -1px;\n\n &:where(:nth-child(3n + 1)) {\n margin-inline-start: 0;\n }\n\n &:where(:nth-child(-n + 3)) {\n margin-top: 0;\n }\n\n &:where(:nth-child(1)) {\n border-start-start-radius: var(--year-view-radius);\n }\n\n &:where(:nth-child(3)) {\n border-start-end-radius: var(--year-view-radius);\n }\n\n &:where(:nth-last-child(3)) {\n border-end-start-radius: var(--year-view-radius);\n }\n\n &:where(:nth-last-child(1)) {\n border-end-end-radius: var(--year-view-radius);\n }\n\n @container (width <= 750px) {\n border: 0;\n padding: 8px;\n margin: 0;\n\n &:where([data-with-week-numbers]) {\n --week-numbers-offset: 14px;\n }\n }\n\n @container (width <= 420px) {\n padding: 6px;\n }\n}\n\n.yearViewWeekdays {\n display: flex;\n}\n\n.yearViewWeek {\n display: flex;\n}\n\n.yearViewWeekNumber {\n flex: 0 0 calc(var(--week-numbers-offset) - rem(4px));\n margin-inline-end: rem(4px);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: var(--year-view-font-size);\n border-radius: var(--year-view-radius);\n padding: 4px;\n font-weight: var(--mantine-font-weight-medium);\n cursor: pointer;\n user-select: none;\n color: var(--day-dimmed-color);\n\n @container (width <= 750px) {\n padding: 0;\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.yearViewWeekday {\n flex: 0 0 calc(100% / 7 - var(--week-numbers-offset) / 7);\n height: 36px;\n font-size: var(--year-view-font-size);\n font-weight: var(--mantine-font-weight-medium);\n text-align: center;\n text-transform: capitalize;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: default;\n user-select: none;\n color: var(--day-dimmed-color);\n\n @container (width <= 750px) {\n height: auto;\n padding-block: 2px;\n }\n}\n\n.yearViewWeekdaysCorner {\n flex: 0 0 var(--week-numbers-offset);\n}\n\n.yearViewDay {\n flex: 0 0 calc(100% / 7 - var(--week-numbers-offset) / 7);\n padding: 4px;\n font-size: var(--year-view-font-size);\n color: var(--day-base-color);\n cursor: pointer;\n user-select: none;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 100%;\n aspect-ratio: 1;\n position: relative;\n\n @container (width <= 750px) {\n padding: 0;\n }\n\n &:where([data-day-placeholder]) {\n background-color: transparent;\n cursor: default;\n pointer-events: none;\n }\n\n &:where([data-weekend]) {\n color: var(--mantine-color-red-6);\n }\n\n &:where([data-outside]) {\n color: var(--day-dimmed-color);\n }\n\n @mixin hover {\n &:where(:not([data-today], [data-day-placeholder])) {\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\n &:where([data-today]:not([data-outside])) {\n background-color: var(--mantine-primary-color-filled);\n color: var(--mantine-primary-color-contrast);\n\n @mixin hover {\n background-color: var(--mantine-primary-color-filled-hover);\n }\n }\n\n &:where([data-static]) {\n cursor: default;\n pointer-events: none;\n }\n}\n\n.yearViewMonthCaption {\n padding-inline: var(--mantine-spacing-sm);\n width: 100%;\n padding-block: 4px;\n margin-bottom: 4px;\n font-size: var(--year-view-font-size);\n font-weight: var(--mantine-font-weight-medium);\n text-transform: capitalize;\n border-radius: var(--year-view-radius);\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.yearViewDayIndicators {\n position: absolute;\n bottom: 0;\n inset-inline: 0;\n display: flex;\n justify-content: center;\n padding-inline-start: 2px;\n}\n\n.yearViewDayIndicator {\n width: 8px;\n height: 8px;\n border-radius: 100%;\n margin-inline-start: -2px;\n border: 1px solid var(--mantine-color-body);\n}\n","import dayjs from 'dayjs'\nimport { defineComponent, h, ref, type PropType } from 'vue'\nimport { Box, UnstyledButton } from '@mantine-vue/core'\nimport type { YearViewProps } from '../../component-props'\nimport type { DateLabelFormat, DayOfWeek, ScheduleEventData } from '../../types'\nimport {\n formatDate,\n getMonthDays,\n getWeekNumber,\n getWeekdaysNames,\n toDateString,\n} from '../../utils'\nimport { ScheduleHeaderBase, createHeaderNavigation } from '../ScheduleHeader/ScheduleHeaderBase'\nimport { handleGridKeydown } from '../keyboard-navigation'\nimport { baseViewProps, getExpandedEvents, resolveScheduleRadius } from '../shared'\nimport { getYearViewEvents } from './get-year-view-events/get-year-view-events'\nimport classes from './YearView.module.css'\n\nexport const YearView = defineComponent({\n name: 'YearView',\n inheritAttrs: false,\n props: {\n ...baseViewProps,\n firstDayOfWeek: { type: Number as PropType<DayOfWeek>, default: 1 },\n weekdayFormat: { type: [String, Function] as PropType<DateLabelFormat>, default: 'dd' },\n weekendDays: { type: Array as PropType<DayOfWeek[]>, default: () => [0, 6] },\n withWeekNumbers: Boolean,\n withWeekDays: { type: Boolean, default: true },\n consistentWeeks: Boolean,\n highlightToday: { type: Boolean, default: true },\n withOutsideDays: { type: Boolean, default: true },\n monthsListFormat: { type: [String, Function] as PropType<DateLabelFormat>, default: 'MMMM' },\n getDayProps: Function as PropType<YearViewProps['getDayProps']>,\n getWeekNumberProps: Function as PropType<YearViewProps['getWeekNumberProps']>,\n onDayClick: Function as PropType<YearViewProps['onDayClick']>,\n onMonthClick: Function as PropType<YearViewProps['onMonthClick']>,\n onWeekNumberClick: Function as PropType<YearViewProps['onWeekNumberClick']>,\n },\n setup(props, { attrs }) {\n const yearGrid = ref<HTMLElement | null>(null)\n return () => {\n const year = dayjs(props.date).startOf('year')\n const expanded = getExpandedEvents(\n props.events,\n year.startOf('year').format('YYYY-MM-DD HH:mm:ss'),\n year.endOf('year').format('YYYY-MM-DD HH:mm:ss'),\n props.recurrenceExpansionLimit,\n )\n const eventsByDay = getYearViewEvents({ date: year, events: expanded })\n const weekdays = getWeekdaysNames({\n locale: props.locale || 'en',\n format: props.weekdayFormat,\n firstDayOfWeek: props.firstDayOfWeek,\n })\n let totalYearGridCells = 0\n const months = Array.from({ length: 12 }, (_, monthIndex) => {\n const month = year.month(monthIndex)\n const weeks = getMonthDays({\n month,\n firstDayOfWeek: props.firstDayOfWeek,\n consistentWeeks: props.consistentWeeks,\n })\n const offset = totalYearGridCells\n totalYearGridCells += weeks.length * 7\n return { month, monthIndex, weeks, offset }\n })\n return h(\n Box,\n {\n ...attrs,\n class: [classes.yearView, attrs.class],\n style: [{ '--year-view-radius': resolveScheduleRadius(props.radius) }, attrs.style],\n },\n () => [\n props.withHeader\n ? h(ScheduleHeaderBase, {\n view: 'year',\n labels: props.labels,\n onDateChange: props.onDateChange,\n onViewChange: props.onViewChange,\n navigationHandlers: createHeaderNavigation(props.date!, 'year'),\n previousControlProps: props.previousControlProps,\n nextControlProps: props.nextControlProps,\n todayControlProps: props.todayControlProps,\n viewSelectProps: props.viewSelectProps,\n control: {\n monthYearSelect: {\n locale: props.locale,\n yearValue: year.year(),\n withMonths: false,\n labelFormat: 'YYYY',\n onYearChange: (value: number) =>\n props.onDateChange?.(toDateString(year.year(value))),\n },\n },\n })\n : null,\n h(\n 'div',\n { ref: yearGrid, class: classes.yearViewMonths },\n months.map(({ month, weeks, offset }) => {\n return h(\n 'section',\n {\n class: classes.yearViewMonth,\n 'data-with-week-numbers': props.withWeekNumbers || undefined,\n },\n [\n h(\n UnstyledButton,\n {\n type: 'button',\n class: classes.yearViewMonthCaption,\n onClick: () => props.onMonthClick?.(toDateString(month)),\n },\n () =>\n formatDate({\n date: month,\n locale: props.locale || 'en',\n format: props.monthsListFormat,\n }),\n ),\n props.withWeekDays\n ? h('div', { class: classes.yearViewWeekdays }, [\n props.withWeekNumbers\n ? h('span', { class: classes.yearViewWeekdaysCorner })\n : null,\n ...weekdays.map((weekday) =>\n h('span', { class: classes.yearViewWeekday }, [weekday]),\n ),\n ])\n : null,\n ...weeks.map((week, weekIndex) =>\n h('div', { class: classes.yearViewWeek }, [\n props.withWeekNumbers\n ? h(\n UnstyledButton,\n {\n type: 'button',\n class: classes.yearViewWeekNumber,\n ...props.getWeekNumberProps?.(toDateString(week[0])),\n onClick: (event: MouseEvent) =>\n props.onWeekNumberClick?.(toDateString(week[0]), event),\n },\n () => String(getWeekNumber(week)),\n )\n : null,\n ...week.map((date, dayIndex) => {\n const key = dayjs(date).format('YYYY-MM-DD')\n const events = eventsByDay[key] || []\n const outside = !dayjs(date).isSame(month, 'month')\n const gridIndex = offset + weekIndex * 7 + dayIndex\n const extra = props.getDayProps?.(toDateString(date)) || {}\n if (outside && !props.withOutsideDays) {\n return h('div', {\n class: classes.yearViewDay,\n 'data-day-placeholder': true,\n key: toDateString(date),\n })\n }\n return h(\n UnstyledButton,\n {\n type: 'button',\n ...extra,\n class: [classes.yearViewDay, extra.class],\n disabled: props.mode === 'static',\n 'data-year-grid-index': gridIndex,\n 'data-outside': outside || undefined,\n 'data-weekend':\n props.weekendDays.includes(dayjs(date).day() as DayOfWeek) ||\n undefined,\n 'data-today':\n (props.highlightToday && dayjs(date).isSame(dayjs(), 'day')) ||\n undefined,\n 'aria-label': formatDate({\n date,\n locale: props.locale || 'en',\n format: 'MMMM D, YYYY',\n }),\n tabindex:\n props.mode === 'static' || outside\n ? -1\n : dayjs(date).date() === 1\n ? 0\n : -1,\n onKeydown:\n props.mode === 'static'\n ? undefined\n : (event: KeyboardEvent) => {\n handleGridKeydown({\n event,\n index: gridIndex,\n columns: 7,\n total: totalYearGridCells,\n getControl: (index) => {\n const control =\n yearGrid.value?.querySelector<HTMLButtonElement>(\n `[data-year-grid-index=\"${index}\"]`,\n ) ?? null\n return control?.hasAttribute('data-outside')\n ? null\n : control\n },\n })\n extra.onKeydown?.(event)\n },\n onClick: (event: MouseEvent) =>\n props.onDayClick?.(toDateString(date), event),\n },\n () => [\n String(dayjs(date).date()),\n events.length\n ? h(\n 'span',\n { class: classes.yearViewDayIndicators },\n events.slice(0, 3).map((event: ScheduleEventData) =>\n h('span', {\n class: classes.yearViewDayIndicator,\n style: {\n background: `var(--mantine-color-${event.color}-6, ${event.color})`,\n },\n }),\n ),\n )\n : null,\n ],\n )\n }),\n ]),\n ),\n ],\n )\n }),\n ),\n ],\n )\n }\n },\n})\n\nexport type { YearViewProps }\nexport type YearViewStylesNames =\n | 'yearView'\n | 'yearViewMonths'\n | 'yearViewMonth'\n | 'yearViewWeekdays'\n | 'yearViewWeek'\n | 'yearViewWeekNumber'\n | 'yearViewWeekday'\n | 'yearViewWeekdaysCorner'\n | 'yearViewDay'\n | 'yearViewMonthCaption'\n | 'yearViewDayIndicators'\n | 'yearViewDayIndicator'\n",".root {\n &:where([data-layout='responsive']) {\n container-type: inline-size;\n }\n}\n\n.desktopView {\n display: block;\n height: 100%;\n\n @container (width <= 600px) {\n display: none;\n }\n}\n\n.mobileView {\n display: none;\n height: 100%;\n\n @container (width <= 600px) {\n display: block;\n }\n}\n","import dayjs from 'dayjs'\nimport { defineComponent, h, ref, watch, type PropType, type SlotsType, type VNodeChild } from 'vue'\nimport { Box } from '@mantine-vue/core'\nimport type {\n DayViewProps,\n MobileMonthViewProps,\n MonthViewProps,\n RenderEventBody,\n ScheduleProps,\n WeekViewProps,\n YearViewProps,\n} from '../../component-props'\nimport type {\n DateStringValue,\n ScheduleEventData,\n ScheduleMode,\n ScheduleViewLevel,\n} from '../../types'\nimport { toDateString } from '../../utils'\nimport { DayView } from '../DayView/DayView'\nimport { MobileMonthView } from '../MobileMonthView/MobileMonthView'\nimport { MonthView } from '../MonthView/MonthView'\nimport { WeekView } from '../WeekView/WeekView'\nimport { YearView } from '../YearView/YearView'\nimport classes from './Schedule.module.css'\n\nexport interface ScheduleSlots {\n /** Scoped alternative to the `renderEventBody` prop */\n eventBody?: (props: { event: ScheduleEventData }) => VNodeChild\n /** Scoped alternative to the `renderEvent` prop */\n event?: (props: Record<string, unknown> & { event: ScheduleEventData }) => VNodeChild\n /** Scoped alternative to WeekView's `renderWeekLabel` prop */\n weekLabel?: (props: { weekStart: DateStringValue; weekEnd: DateStringValue }) => VNodeChild\n /** Scoped alternative to MobileMonthView's `renderHeader` prop */\n header?: (props: {\n mode: ScheduleMode\n date: Date | DateStringValue\n defaultHeader: VNodeChild\n }) => VNodeChild\n}\n\nexport const Schedule = defineComponent({\n name: 'Schedule',\n inheritAttrs: false,\n slots: Object as SlotsType<ScheduleSlots>,\n props: {\n date: [String, Date] as PropType<Date | DateStringValue>,\n defaultDate: [String, Date] as PropType<Date | DateStringValue>,\n onDateChange: Function as PropType<(date: DateStringValue) => void>,\n view: String as PropType<ScheduleViewLevel>,\n defaultView: { type: String as PropType<ScheduleViewLevel>, default: 'week' },\n onViewChange: Function as PropType<(view: ScheduleViewLevel) => void>,\n events: Array as PropType<ScheduleEventData[]>,\n locale: String,\n radius: [String, Number] as PropType<string | number>,\n labels: Object,\n renderEventBody: Function as PropType<RenderEventBody>,\n withEventsDragAndDrop: Boolean,\n onEventDrop: Function as PropType<ScheduleProps['onEventDrop']>,\n canDragEvent: Function as PropType<ScheduleProps['canDragEvent']>,\n onEventDragStart: Function as PropType<ScheduleProps['onEventDragStart']>,\n onEventDragEnd: Function as PropType<ScheduleProps['onEventDragEnd']>,\n onTimeSlotClick: Function as PropType<ScheduleProps['onTimeSlotClick']>,\n onAllDaySlotClick: Function as PropType<ScheduleProps['onAllDaySlotClick']>,\n onEventClick: Function as PropType<ScheduleProps['onEventClick']>,\n onDayClick: Function as PropType<ScheduleProps['onDayClick']>,\n onMonthClick: Function as PropType<ScheduleProps['onMonthClick']>,\n withDragSlotSelect: Boolean,\n onSlotDragEnd: Function as PropType<ScheduleProps['onSlotDragEnd']>,\n mode: { type: String as PropType<ScheduleMode>, default: 'default' },\n onExternalEventDrop: Function as PropType<ScheduleProps['onExternalEventDrop']>,\n withEventResize: Boolean,\n onEventResize: Function as PropType<ScheduleProps['onEventResize']>,\n canResizeEvent: Function as PropType<ScheduleProps['canResizeEvent']>,\n recurrenceExpansionLimit: { type: Number, default: 2000 },\n layout: { type: String as PropType<'default' | 'responsive'>, default: 'default' },\n dayViewProps: Object as PropType<Partial<DayViewProps>>,\n weekViewProps: Object as PropType<Partial<WeekViewProps>>,\n monthViewProps: Object as PropType<Partial<MonthViewProps>>,\n yearViewProps: Object as PropType<Partial<YearViewProps>>,\n mobileMonthViewProps: Object as PropType<Partial<MobileMonthViewProps>>,\n },\n setup(props, { attrs, slots }) {\n const currentDate = ref(toDateString(props.date || props.defaultDate || dayjs()))\n const currentView = ref<ScheduleViewLevel>(props.view || props.defaultView)\n watch(\n () => props.date,\n (value) => {\n if (value !== undefined) currentDate.value = toDateString(value)\n },\n )\n watch(\n () => props.view,\n (value) => {\n if (value !== undefined) currentView.value = value\n },\n )\n const changeDate = (date: DateStringValue) => {\n if (props.date === undefined) currentDate.value = date\n props.onDateChange?.(date)\n }\n const changeView = (view: ScheduleViewLevel) => {\n if (props.view === undefined) currentView.value = view\n props.onViewChange?.(view)\n }\n return () => {\n const shared = {\n date: currentDate.value,\n onDateChange: changeDate,\n onViewChange: changeView,\n events: props.events,\n locale: props.locale,\n radius: props.radius,\n labels: props.labels,\n renderEventBody: props.renderEventBody,\n withEventsDragAndDrop: props.withEventsDragAndDrop,\n onEventDrop: props.onEventDrop,\n canDragEvent: props.canDragEvent,\n onEventDragStart: props.onEventDragStart,\n onEventDragEnd: props.onEventDragEnd,\n onTimeSlotClick: props.onTimeSlotClick,\n onAllDaySlotClick: props.onAllDaySlotClick,\n onEventClick: props.onEventClick,\n onDayClick: props.onDayClick,\n onMonthClick: props.onMonthClick,\n withDragSlotSelect: props.withDragSlotSelect,\n onSlotDragEnd: props.onSlotDragEnd,\n mode: props.mode,\n onExternalEventDrop: props.onExternalEventDrop,\n withEventResize: props.withEventResize,\n onEventResize: props.onEventResize,\n canResizeEvent: props.canResizeEvent,\n recurrenceExpansionLimit: props.recurrenceExpansionLimit,\n }\n const components = {\n day: [DayView, props.dayViewProps],\n week: [WeekView, props.weekViewProps],\n month: [MonthView, props.monthViewProps],\n year: [YearView, props.yearViewProps],\n } as const\n const viewSlots: Record<string, unknown> = {}\n if (slots.eventBody) viewSlots.eventBody = slots.eventBody\n if (slots.event) viewSlots.event = slots.event\n if (slots.weekLabel) viewSlots.weekLabel = slots.weekLabel\n if (slots.header) viewSlots.header = slots.header\n const forwardedSlots = Object.keys(viewSlots).length ? viewSlots : undefined\n\n const [component, viewProps] = components[currentView.value]\n const desktop = h(component, { ...shared, ...viewProps }, forwardedSlots)\n\n if (props.layout !== 'responsive') {\n return h(Box, { ...attrs, class: [classes.root, attrs.class], style: attrs.style }, () => [\n desktop,\n ])\n }\n\n const mobile =\n currentView.value === 'year'\n ? h(YearView, { ...shared, ...props.yearViewProps }, forwardedSlots)\n : h(\n MobileMonthView,\n {\n ...shared,\n ...props.mobileMonthViewProps,\n onYearClick: () => changeView('year'),\n onDayClick: (date: DateStringValue, event: MouseEvent) => {\n props.onDayClick?.(date, event)\n props.mobileMonthViewProps?.onDayClick?.(date, event)\n },\n },\n forwardedSlots,\n )\n\n return h(\n Box,\n {\n ...attrs,\n mod: { layout: props.layout },\n class: [classes.root, attrs.class],\n style: attrs.style,\n },\n () => [\n h(Box, { class: classes.desktopView }, () => [desktop]),\n h(Box, { class: classes.mobileView }, () => [mobile]),\n ],\n )\n }\n },\n})\n\nexport type { ScheduleProps }\nexport type ScheduleLayout = 'default' | 'responsive'\nexport type ScheduleStylesNames =\n | 'root'\n | 'desktopView'\n | 'mobileView'\n | import('../DayView/DayView').DayViewStylesNames\n | import('../WeekView/WeekView').WeekViewStylesNames\n | import('../MonthView/MonthView').MonthViewStylesNames\n | import('../YearView/YearView').YearViewStylesNames\n | import('../MobileMonthView/MobileMonthView').MobileMonthViewStylesNames\n","import { inject, provide, type InjectionKey } from 'vue'\nimport type { DropTarget, ScheduleEventData } from '../../types'\n\nexport interface DragContextValue {\n draggedEvent: ScheduleEventData | null\n dragOverTarget: DropTarget | null\n isDragging: boolean\n isSlotDragging: boolean\n}\n\nexport const DragContext: InjectionKey<DragContextValue> = Symbol('mantine-schedule-drag-context')\n\nexport function provideDragContext(value: DragContextValue) {\n provide(DragContext, value)\n}\n\nexport function useDragContext() {\n return inject(DragContext, {\n draggedEvent: null,\n dragOverTarget: null,\n isDragging: false,\n isSlotDragging: false,\n })\n}\n"],"mappings":"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"}