@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.cjs","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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"}