@manzanohq/calendar-lite 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +191 -0
- package/cdn/calendar.component.d.ts +146 -0
- package/cdn/calendar.component.js +2 -0
- package/cdn/calendar.component.js.map +7 -0
- package/cdn/calendar.d.ts +9 -0
- package/cdn/calendar.js +2 -0
- package/cdn/calendar.js.map +7 -0
- package/cdn/calendar.styles.d.ts +3 -0
- package/cdn/calendar.styles.js +2 -0
- package/cdn/calendar.styles.js.map +7 -0
- package/cdn/calendar.types.d.ts +99 -0
- package/cdn/calendar.types.js +2 -0
- package/cdn/calendar.types.js.map +7 -0
- package/cdn/chunks/chunk.B6XGWUEF.js +1 -0
- package/cdn/chunks/chunk.B6XGWUEF.js.map +7 -0
- package/cdn/chunks/chunk.BYWXPW2P.js +2 -0
- package/cdn/chunks/chunk.BYWXPW2P.js.map +7 -0
- package/cdn/chunks/chunk.EOXXNYIW.js +2 -0
- package/cdn/chunks/chunk.EOXXNYIW.js.map +7 -0
- package/cdn/chunks/chunk.MGICPQBB.js +2 -0
- package/cdn/chunks/chunk.MGICPQBB.js.map +7 -0
- package/cdn/chunks/chunk.OEC274YS.js +915 -0
- package/cdn/chunks/chunk.OEC274YS.js.map +7 -0
- package/cdn/chunks/chunk.PJFNXC5P.js +307 -0
- package/cdn/chunks/chunk.PJFNXC5P.js.map +7 -0
- package/cdn/index.d.ts +3 -0
- package/cdn/index.js +2 -0
- package/cdn/index.js.map +7 -0
- package/cdn/internal/date-utils.d.ts +74 -0
- package/cdn/internal/date-utils.js +2 -0
- package/cdn/internal/date-utils.js.map +7 -0
- package/cdn/internal/event-layout.d.ts +67 -0
- package/cdn/internal/event-layout.js +2 -0
- package/cdn/internal/event-layout.js.map +7 -0
- package/dist/calendar.component.d.ts +146 -0
- package/dist/calendar.component.d.ts.map +1 -0
- package/dist/calendar.component.js +1218 -0
- package/dist/calendar.component.js.map +7 -0
- package/dist/calendar.d.ts +9 -0
- package/dist/calendar.d.ts.map +1 -0
- package/dist/calendar.js +5 -0
- package/dist/calendar.js.map +7 -0
- package/dist/calendar.styles.d.ts +3 -0
- package/dist/calendar.styles.d.ts.map +1 -0
- package/dist/calendar.styles.js +923 -0
- package/dist/calendar.styles.js.map +7 -0
- package/dist/calendar.types.d.ts +99 -0
- package/dist/calendar.types.d.ts.map +1 -0
- package/dist/calendar.types.js +1 -0
- package/dist/calendar.types.js.map +7 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +7 -0
- package/dist/internal/date-utils.d.ts +74 -0
- package/dist/internal/date-utils.d.ts.map +1 -0
- package/dist/internal/date-utils.js +133 -0
- package/dist/internal/date-utils.js.map +7 -0
- package/dist/internal/event-layout.d.ts +67 -0
- package/dist/internal/event-layout.d.ts.map +1 -0
- package/dist/internal/event-layout.js +224 -0
- package/dist/internal/event-layout.js.map +7 -0
- package/package.json +37 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/calendar.component.ts"],
|
|
4
|
+
"sourcesContent": ["import { html, nothing, type TemplateResult } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { ManzanoElement } from '@manzanohq/components/dist/internal/manzano-element.js';\nimport { watch } from '@manzanohq/components/dist/internal/watch.js';\nimport { drag } from '@manzanohq/components/dist/internal/drag.js';\nimport styles from './calendar.styles.js';\nimport type {\n CalendarEvent,\n CalendarResource,\n CalendarView,\n DateSelectDetail,\n DatesSetDetail,\n EventClickDetail,\n EventDropDetail,\n EventResizeDetail\n} from './calendar.types.js';\nimport {\n startOfDay,\n addDays,\n isSameDay,\n isToday,\n getWeekDays,\n getMonthGrid,\n getDayRange,\n formatTime,\n formatTimeShort,\n formatDayHeader,\n formatMonthYear,\n getWeekdayNames,\n parseTimeString,\n timeToMinutes,\n minutesToGridRow,\n type DayCell\n} from './internal/date-utils.js';\nimport {\n layoutTimeGridEvents,\n layoutAllDayEvents,\n layoutMonthEvents,\n type PositionedEvent\n} from './internal/event-layout.js';\n\n/**\n * @summary A full-featured calendar component with day, week, month, and resource views.\n *\n * @tag mz-calendar\n *\n * @event mz-calendar-event-click - Emitted when a calendar event is clicked.\n * @event mz-calendar-event-drop - Emitted when a calendar event is dragged to a new time/day.\n * @event mz-calendar-event-resize - Emitted when a calendar event is resized.\n * @event mz-calendar-select - Emitted when a date range is selected by dragging on the grid.\n * @event mz-calendar-dates-set - Emitted when the visible date range changes.\n *\n * @csspart calendar - The calendar wrapper.\n * @csspart toolbar - The toolbar container.\n * @csspart title - The title text.\n * @csspart header - The day/resource column headers row.\n * @csspart allday - The all-day event row.\n * @csspart grid - The time grid.\n * @csspart event - Individual event elements (available in all views).\n *\n * @cssproperty --mz-calendar-bg - Calendar background color.\n * @cssproperty --mz-calendar-border-color - Border color.\n * @cssproperty --mz-calendar-event-bg - Default event background color.\n * @cssproperty --mz-calendar-event-color - Default event text color.\n * @cssproperty --mz-calendar-slot-height - Height of each time slot.\n * @cssproperty --mz-calendar-today-bg - Today column highlight color.\n * @cssproperty --mz-calendar-now-indicator-color - Now indicator line color.\n * @cssproperty --mz-calendar-min-height - Minimum calendar height.\n * @cssproperty --mz-calendar-body-height - Max height of scrollable time grid body.\n */\nexport class MzCalendar extends ManzanoElement {\n static styles = styles;\n\n // ---- Public reactive properties ----\n\n /** The current view type. */\n @property({ reflect: true }) view: CalendarView = 'timeGridWeek';\n\n /** The initial date (ISO date string YYYY-MM-DD). */\n @property({ attribute: 'date' }) date: string = (() => {\n const d = new Date();\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;\n })();\n\n /** Array of calendar events to display. */\n @property({ type: Array }) events: CalendarEvent[] = [];\n\n /** Array of resources for resource views. */\n @property({ type: Array }) resources: CalendarResource[] = [];\n\n /** Duration of each time slot in minutes. */\n @property({ type: Number, attribute: 'slot-duration' }) slotDuration = 30;\n\n /** Earliest visible time in the time grid (HH:MM format). */\n @property({ attribute: 'slot-min-time' }) slotMinTime = '00:00';\n\n /** Latest visible time in the time grid (HH:MM format). */\n @property({ attribute: 'slot-max-time' }) slotMaxTime = '24:00';\n\n /** Whether to show the all-day event slot. */\n @property({ type: Boolean, attribute: 'all-day-slot' }) allDaySlot = true;\n\n /** Whether date range selection is enabled. */\n @property({ type: Boolean }) selectable = false;\n\n /** Whether events are editable (drag/resize). */\n @property({ type: Boolean }) editable = false;\n\n /** Whether to show the now indicator line. */\n @property({ type: Boolean, attribute: 'now-indicator' }) nowIndicator = true;\n\n /** First day of the week (0=Sunday, 1=Monday, etc.). */\n @property({ type: Number, attribute: 'first-day' }) firstDay = 0;\n\n /** Locale for date/time formatting (BCP 47 string). Defaults to browser locale. */\n @property() locale = '';\n\n /** Custom duration in days for the view (0 = use view default). */\n @property({ type: Number }) duration = 0;\n\n /** Maximum number of events to show per day cell in month view. */\n @property({ type: Number, attribute: 'day-max-events' }) dayMaxEvents = 4;\n\n /** Whether to display the time grid at full height without scrolling. */\n @property({ type: Boolean, attribute: 'no-scroll', reflect: true }) noScroll = false;\n\n /** Custom render function for event content. Receives the event and returns a TemplateResult or string. */\n @property({ attribute: false }) eventContent:\n | ((event: CalendarEvent) => TemplateResult | string)\n | null = null;\n\n // ---- Internal state ----\n\n @state() private currentDate = new Date();\n @state() private nowMinutes = 0;\n @state() private dragSelection: { startSlot: number; endSlot: number; dayIndex: number } | null = null;\n @state() private _containerWidth = 0;\n\n private nowTimer: ReturnType<typeof setInterval> | null = null;\n private dragCleanup: (() => void) | null = null;\n private resizeObserver: ResizeObserver | null = null;\n private liveText = '';\n\n // ---- Lifecycle ----\n\n connectedCallback(): void {\n super.connectedCallback();\n this.updateNowMinutes();\n if (this.nowIndicator) {\n this.nowTimer = setInterval(() => this.updateNowMinutes(), 60_000);\n }\n this.resizeObserver = new ResizeObserver(entries => {\n for (const entry of entries) {\n this._containerWidth = entry.contentRect.width;\n }\n });\n this.resizeObserver.observe(this);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n if (this.nowTimer) {\n clearInterval(this.nowTimer);\n this.nowTimer = null;\n }\n if (this.dragCleanup) {\n this.dragCleanup();\n this.dragCleanup = null;\n }\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n }\n }\n\n // ---- Watch decorators ----\n\n @watch('date')\n handleDateChange(_oldValue: string, newValue: string): void {\n if (newValue) {\n // Parse as local date to avoid timezone offset issues\n const parts = newValue.split('-').map(Number);\n if (parts.length === 3) {\n this.currentDate = new Date(parts[0], parts[1] - 1, parts[2]);\n }\n }\n }\n\n @watch('view')\n handleViewChange(): void {\n this.emitDatesSet();\n this.announceLive(`View changed to ${this.getViewLabel(this.view)}`);\n }\n\n @watch('nowIndicator')\n handleNowIndicatorChange(_old: boolean, enabled: boolean): void {\n if (enabled && !this.nowTimer) {\n this.nowTimer = setInterval(() => this.updateNowMinutes(), 60_000);\n } else if (!enabled && this.nowTimer) {\n clearInterval(this.nowTimer);\n this.nowTimer = null;\n }\n }\n\n // ---- Public API ----\n\n /** Navigate to the previous period. */\n prev(): void {\n this.currentDate = this.getOffsetDate(-1);\n this.emitDatesSet();\n this.announceLive(this.getTitle());\n }\n\n /** Navigate to the next period. */\n next(): void {\n this.currentDate = this.getOffsetDate(1);\n this.emitDatesSet();\n this.announceLive(this.getTitle());\n }\n\n /** Navigate to today. */\n today(): void {\n this.currentDate = startOfDay(new Date());\n this.emitDatesSet();\n this.announceLive('Today');\n }\n\n /** Navigate to a specific date. */\n gotoDate(date: Date | string): void {\n this.currentDate = startOfDay(date instanceof Date ? date : new Date(date));\n this.emitDatesSet();\n }\n\n /** Change the current view. */\n changeView(view: CalendarView): void {\n this.view = view;\n }\n\n /** Get the current date as a Date object. */\n getDate(): Date {\n return new Date(this.currentDate);\n }\n\n /** Add an event to the calendar. */\n addEvent(event: CalendarEvent): void {\n this.events = [...this.events, event];\n }\n\n /** Update an existing event by ID. */\n updateEvent(event: CalendarEvent): void {\n this.events = this.events.map(e => (e.id === event.id ? event : e));\n }\n\n /** Remove an event by ID. */\n removeEvent(id: string): void {\n this.events = this.events.filter(e => e.id !== id);\n }\n\n /** Trigger a re-render of all events. */\n refetchEvents(): void {\n this.events = [...this.events];\n }\n\n // ---- Internal helpers ----\n\n private updateNowMinutes(): void {\n const now = new Date();\n this.nowMinutes = timeToMinutes(now.getHours(), now.getMinutes());\n }\n\n private getResolvedLocale(): string | undefined {\n return this.locale || undefined;\n }\n\n /** Responsive day count \u2014 reduces visible days at narrow widths (like Google Calendar) */\n private get responsiveDayCount(): number {\n // If user set a custom duration, always respect it\n if (this.duration > 0) return this.duration;\n\n const view = this.view;\n if (view === 'timeGridWeek' || view === 'listWeek' || view === 'resourceTimeGridWeek') {\n if (this._containerWidth > 0 && this._containerWidth < 540) return 3;\n if (this._containerWidth >= 540 && this._containerWidth < 768) return 5;\n }\n\n return 0; // 0 = use default behavior\n }\n\n /** Get the days array for the current view */\n private getVisibleDays(): Date[] {\n const view = this.view;\n const d = this.currentDate;\n\n if (this.duration > 0) {\n const days: Date[] = [];\n for (let i = 0; i < this.duration; i++) {\n days.push(addDays(startOfDay(d), i));\n }\n return days;\n }\n\n const rdc = this.responsiveDayCount;\n\n switch (view) {\n case 'timeGridWeek':\n case 'resourceTimeGridWeek':\n case 'listWeek':\n if (rdc > 0 && rdc < 7) {\n // Show fewer days starting from currentDate\n const days: Date[] = [];\n for (let i = 0; i < rdc; i++) {\n days.push(addDays(startOfDay(d), i));\n }\n return days;\n }\n return getWeekDays(d, this.firstDay);\n case 'timeGridDay':\n case 'resourceTimeGridDay':\n return getDayRange(d);\n default:\n return getWeekDays(d, this.firstDay);\n }\n }\n\n /** Calculate offset date for prev/next navigation */\n private getOffsetDate(direction: number): Date {\n const d = this.currentDate;\n\n if (this.duration > 0) {\n return addDays(d, direction * this.duration);\n }\n\n const rdc = this.responsiveDayCount;\n\n switch (this.view) {\n case 'timeGridWeek':\n case 'resourceTimeGridWeek':\n case 'listWeek':\n // Navigate by responsiveDayCount when showing fewer days\n return addDays(d, direction * (rdc > 0 && rdc < 7 ? rdc : 7));\n case 'timeGridDay':\n case 'resourceTimeGridDay':\n return addDays(d, direction);\n case 'dayGridMonth': {\n const result = new Date(d);\n result.setMonth(result.getMonth() + direction);\n return result;\n }\n case 'resourceTimeline':\n return addDays(d, direction);\n default:\n return addDays(d, direction * 7);\n }\n }\n\n /** Get the visible date range for emitting events */\n private getVisibleRange(): { start: Date; end: Date } {\n if (this.view === 'dayGridMonth') {\n const start = new Date(this.currentDate.getFullYear(), this.currentDate.getMonth(), 1);\n const end = new Date(this.currentDate.getFullYear(), this.currentDate.getMonth() + 1, 0);\n return { start: startOfDay(start), end: startOfDay(addDays(end, 1)) };\n }\n\n const days = this.getVisibleDays();\n return {\n start: startOfDay(days[0]),\n end: startOfDay(addDays(days[days.length - 1], 1))\n };\n }\n\n private emitDatesSet(): void {\n const range = this.getVisibleRange();\n this.emit<DatesSetDetail>('mz-calendar-dates-set', {\n detail: { start: range.start, end: range.end, view: this.view }\n });\n }\n\n private announceLive(text: string): void {\n this.liveText = text;\n this.requestUpdate();\n }\n\n /** Get display title for the toolbar */\n private getTitle(): string {\n const loc = this.getResolvedLocale();\n const d = this.currentDate;\n\n if (this.view === 'dayGridMonth') {\n return formatMonthYear(d, loc);\n }\n\n if (this.view === 'timeGridDay' || this.view === 'resourceTimeGridDay') {\n return new Intl.DateTimeFormat(loc, {\n weekday: 'long',\n month: 'long',\n day: 'numeric',\n year: 'numeric'\n }).format(d);\n }\n\n const days = this.getVisibleDays();\n const first = days[0];\n const last = days[days.length - 1];\n\n // For responsive views showing fewer days, use a compact date range format\n const rdc = this.responsiveDayCount;\n if (rdc > 0 && rdc < 7) {\n if (first.getMonth() === last.getMonth()) {\n const month = new Intl.DateTimeFormat(loc, { month: 'short' }).format(first);\n return `${month} ${first.getDate()}\\u2013${last.getDate()}, ${first.getFullYear()}`;\n }\n const fStr = new Intl.DateTimeFormat(loc, { month: 'short', day: 'numeric' }).format(first);\n const lStr = new Intl.DateTimeFormat(loc, { month: 'short', day: 'numeric', year: 'numeric' }).format(last);\n return `${fStr} \\u2013 ${lStr}`;\n }\n\n if (first.getMonth() === last.getMonth()) {\n const month = new Intl.DateTimeFormat(loc, { month: 'short' }).format(first);\n return `${month} ${first.getDate()}\\u2013${last.getDate()}, ${first.getFullYear()}`;\n }\n\n if (first.getFullYear() === last.getFullYear()) {\n const fMonth = new Intl.DateTimeFormat(loc, { month: 'short' }).format(first);\n const lMonth = new Intl.DateTimeFormat(loc, { month: 'short' }).format(last);\n return `${fMonth} ${first.getDate()} \\u2013 ${lMonth} ${last.getDate()}, ${first.getFullYear()}`;\n }\n\n const fFull = new Intl.DateTimeFormat(loc, { month: 'short', day: 'numeric', year: 'numeric' }).format(first);\n const lFull = new Intl.DateTimeFormat(loc, { month: 'short', day: 'numeric', year: 'numeric' }).format(last);\n return `${fFull} \\u2013 ${lFull}`;\n }\n\n private getViewLabel(view: CalendarView): string {\n switch (view) {\n case 'dayGridMonth': return 'Month';\n case 'timeGridWeek': return 'Week';\n case 'timeGridDay': return 'Day';\n case 'resourceTimeGridDay': return 'Resource Day';\n case 'resourceTimeGridWeek': return 'Resource Week';\n case 'resourceTimeline': return 'Timeline';\n case 'listWeek': return 'List';\n default: return view;\n }\n }\n\n /** Total slot count for the time grid */\n private getSlotCount(): number {\n const { hours: minH, minutes: minM } = parseTimeString(this.slotMinTime);\n const { hours: maxH, minutes: maxM } = parseTimeString(this.slotMaxTime);\n const totalMinutes = timeToMinutes(maxH, maxM) - timeToMinutes(minH, minM);\n return Math.ceil(totalMinutes / this.slotDuration);\n }\n\n /** Generate hour label entries for the gutter */\n private getHourLabels(): { time: Date; isHour: boolean }[] {\n const { hours: minH, minutes: minM } = parseTimeString(this.slotMinTime);\n const { hours: maxH, minutes: maxM } = parseTimeString(this.slotMaxTime);\n const minMinutes = timeToMinutes(minH, minM);\n const maxMinutes = timeToMinutes(maxH, maxM);\n\n const labels: { time: Date; isHour: boolean }[] = [];\n for (let m = minMinutes; m < maxMinutes; m += this.slotDuration) {\n const d = new Date(2000, 0, 1, Math.floor(m / 60), m % 60);\n labels.push({ time: d, isHour: m % 60 === 0 });\n }\n return labels;\n }\n\n /** Get now indicator position as a percentage of the grid height */\n private getNowPosition(): number | null {\n if (!this.nowIndicator) return null;\n const { hours: minH, minutes: minM } = parseTimeString(this.slotMinTime);\n const { hours: maxH, minutes: maxM } = parseTimeString(this.slotMaxTime);\n const minMinutes = timeToMinutes(minH, minM);\n const maxMinutes = timeToMinutes(maxH, maxM);\n const totalRange = maxMinutes - minMinutes;\n\n if (this.nowMinutes < minMinutes || this.nowMinutes > maxMinutes) return null;\n return ((this.nowMinutes - minMinutes) / totalRange) * 100;\n }\n\n /** Get the day column index for \"now\" (for the now indicator) */\n private getNowDayIndex(days: Date[]): number {\n const today = new Date();\n for (let i = 0; i < days.length; i++) {\n if (isSameDay(today, days[i])) return i;\n }\n return -1;\n }\n\n // ---- Event handlers ----\n\n private handleEventClick(event: CalendarEvent, el: HTMLElement, jsEvent: MouseEvent): void {\n jsEvent.stopPropagation();\n this.emit<EventClickDetail>('mz-calendar-event-click', {\n detail: { event, el, jsEvent }\n });\n }\n\n private handleEventKeydown(event: CalendarEvent, el: HTMLElement, e: KeyboardEvent): void {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this.emit<EventClickDetail>('mz-calendar-event-click', {\n detail: { event, el, jsEvent: e as unknown as MouseEvent }\n });\n }\n }\n\n // ---- Drag logic setup ----\n\n protected override updated(): void {\n // Set up drag on the grid for drag-to-create\n if (this.selectable || this.editable) {\n this.setupGridDrag();\n }\n }\n\n private setupGridDrag(): void {\n // Clean up previous\n if (this.dragCleanup) {\n this.dragCleanup();\n this.dragCleanup = null;\n }\n\n const grid = this.shadowRoot?.querySelector<HTMLElement>('.calendar__grid');\n if (!grid || !this.selectable) return;\n\n const slotCount = this.getSlotCount();\n const days = this.getVisibleDays();\n const dayCount = days.length;\n\n const { hours: minH, minutes: minM } = parseTimeString(this.slotMinTime);\n const minMinutes = timeToMinutes(minH, minM);\n\n this.dragCleanup = drag({\n target: grid,\n onStart: (e) => {\n // Ignore if clicking on an event\n const target = e.target as HTMLElement;\n if (target.closest('.calendar__event')) return false;\n\n const rect = grid.getBoundingClientRect();\n const slotHeight = rect.height / slotCount;\n const colWidth = rect.width / dayCount;\n\n const relX = e.clientX - rect.left;\n const relY = e.clientY - rect.top;\n\n const dayIndex = Math.max(0, Math.min(dayCount - 1, Math.floor(relX / colWidth)));\n const slot = Math.max(0, Math.min(slotCount - 1, Math.floor(relY / slotHeight)));\n\n this.dragSelection = { startSlot: slot, endSlot: slot, dayIndex };\n },\n onMove: (e) => {\n if (!this.dragSelection) return;\n const rect = grid.getBoundingClientRect();\n const slotHeight = rect.height / slotCount;\n const relY = e.clientY - rect.top;\n const slot = Math.max(0, Math.min(slotCount - 1, Math.floor(relY / slotHeight)));\n this.dragSelection = { ...this.dragSelection, endSlot: slot };\n },\n onEnd: () => {\n if (!this.dragSelection) return;\n\n const { startSlot, endSlot, dayIndex } = this.dragSelection;\n const fromSlot = Math.min(startSlot, endSlot);\n const toSlot = Math.max(startSlot, endSlot) + 1;\n\n const day = days[dayIndex];\n const startMinutes = minMinutes + fromSlot * this.slotDuration;\n const endMinutes = minMinutes + toSlot * this.slotDuration;\n\n const start = new Date(day);\n start.setHours(Math.floor(startMinutes / 60), startMinutes % 60, 0, 0);\n const end = new Date(day);\n end.setHours(Math.floor(endMinutes / 60), endMinutes % 60, 0, 0);\n\n this.emit<DateSelectDetail>('mz-calendar-select', {\n detail: {\n start,\n end,\n startStr: start.toISOString(),\n endStr: end.toISOString(),\n allDay: false\n }\n });\n\n this.dragSelection = null;\n }\n });\n }\n\n /** Set up drag-to-move on an event element */\n private setupEventDrag(el: HTMLElement, event: CalendarEvent): void {\n if (!this.editable || event.editable === false) return;\n\n const days = this.getVisibleDays();\n const slotCount = this.getSlotCount();\n const { hours: minH, minutes: minM } = parseTimeString(this.slotMinTime);\n const minMinutes = timeToMinutes(minH, minM);\n const dayCount = days.length;\n\n let isResize = false;\n let originalEvent: CalendarEvent;\n let grid: HTMLElement | null = null;\n\n drag({\n target: el,\n onStart: (e) => {\n grid = this.shadowRoot?.querySelector<HTMLElement>('.calendar__grid') ?? null;\n if (!grid) return false;\n\n // Check if this is a resize (bottom 8px)\n const elRect = el.getBoundingClientRect();\n isResize = e.clientY > elRect.bottom - 8;\n\n originalEvent = { ...event };\n el.style.zIndex = '10';\n el.style.opacity = '0.8';\n },\n onMove: (e) => {\n if (!grid) return;\n\n const rect = grid.getBoundingClientRect();\n const slotHeight = rect.height / slotCount;\n const colWidth = rect.width / dayCount;\n const relY = e.clientY - rect.top;\n const relX = e.clientX - rect.left;\n\n if (isResize) {\n // Resize: change end time based on pointer Y\n const endSlot = Math.max(0, Math.min(slotCount, Math.ceil(relY / slotHeight)));\n const endMinutes = minMinutes + endSlot * this.slotDuration;\n const newEnd = new Date(toDate(event.start));\n // Keep the same day\n newEnd.setHours(Math.floor(endMinutes / 60), endMinutes % 60, 0, 0);\n\n // Ensure end > start\n if (newEnd.getTime() > toDate(event.start).getTime()) {\n const startRow = minutesToGridRow(\n dateToMinutes(toDate(event.start)) - minMinutes,\n this.slotDuration\n );\n const endRow = minutesToGridRow(endMinutes - minMinutes, this.slotDuration);\n el.style.top = `${((startRow - 1) / slotCount) * 100}%`;\n el.style.height = `${((endRow - startRow) / slotCount) * 100}%`;\n }\n } else {\n // Move: translate position\n const newDayIndex = Math.max(0, Math.min(dayCount - 1, Math.floor(relX / colWidth)));\n const newSlot = Math.max(0, Math.min(slotCount - 1, Math.floor(relY / slotHeight)));\n const eventDuration = toDate(event.end).getTime() - toDate(event.start).getTime();\n const durationSlots = Math.ceil((eventDuration / 60000) / this.slotDuration);\n // Visual feedback \u2014 update absolute position\n el.style.top = `${(newSlot / slotCount) * 100}%`;\n el.style.height = `${(durationSlots / slotCount) * 100}%`;\n const colWidthPct = 100 / dayCount;\n el.style.left = `${newDayIndex * colWidthPct}%`;\n el.style.width = `${colWidthPct}%`;\n }\n },\n onEnd: (e) => {\n el.style.zIndex = '';\n el.style.opacity = '';\n\n if (!grid) return;\n\n const rect = grid.getBoundingClientRect();\n const slotHeight = rect.height / slotCount;\n const colWidth = rect.width / dayCount;\n const relY = e.clientY - rect.top;\n const relX = e.clientX - rect.left;\n\n if (isResize) {\n const endSlot = Math.max(0, Math.min(slotCount, Math.ceil(relY / slotHeight)));\n const endMinutes = minMinutes + endSlot * this.slotDuration;\n const newEnd = new Date(toDate(event.start));\n newEnd.setHours(Math.floor(endMinutes / 60), endMinutes % 60, 0, 0);\n\n if (newEnd.getTime() <= toDate(event.start).getTime()) return;\n\n const oldEnd = toDate(originalEvent.end);\n const deltaMs = newEnd.getTime() - oldEnd.getTime();\n const deltaDays = Math.floor(deltaMs / 86400000);\n const deltaRemainder = deltaMs % 86400000;\n\n const updatedEvent: CalendarEvent = { ...event, end: newEnd.toISOString() };\n\n this.emit<EventResizeDetail>('mz-calendar-event-resize', {\n detail: {\n event: updatedEvent,\n oldEvent: originalEvent,\n endDelta: { days: deltaDays, milliseconds: deltaRemainder },\n revert: () => {\n this.updateEvent(originalEvent);\n }\n }\n });\n } else {\n const newDayIndex = Math.max(0, Math.min(dayCount - 1, Math.floor(relX / colWidth)));\n const newSlot = Math.max(0, Math.min(slotCount - 1, Math.floor(relY / slotHeight)));\n const newStartMinutes = minMinutes + newSlot * this.slotDuration;\n\n const newDay = days[newDayIndex];\n const newStart = new Date(newDay);\n newStart.setHours(Math.floor(newStartMinutes / 60), newStartMinutes % 60, 0, 0);\n\n const oldStart = toDate(originalEvent.start);\n const deltaMs = newStart.getTime() - oldStart.getTime();\n const deltaDays = Math.floor(deltaMs / 86400000);\n const deltaRemainder = deltaMs % 86400000;\n\n const eventDuration = toDate(event.end).getTime() - toDate(event.start).getTime();\n const newEnd = new Date(newStart.getTime() + eventDuration);\n\n const updatedEvent: CalendarEvent = {\n ...event,\n start: newStart.toISOString(),\n end: newEnd.toISOString()\n };\n\n this.emit<EventDropDetail>('mz-calendar-event-drop', {\n detail: {\n event: updatedEvent,\n oldEvent: originalEvent,\n delta: { days: deltaDays, milliseconds: deltaRemainder },\n revert: () => {\n this.updateEvent(originalEvent);\n }\n }\n });\n }\n }\n });\n }\n\n // ---- Render ----\n\n render(): TemplateResult {\n return html`\n <div part=\"calendar\" class=\"calendar\" role=\"application\" aria-label=\"Calendar\">\n ${this.renderToolbar()}\n <div class=\"calendar__live\" aria-live=\"polite\" role=\"status\">${this.liveText}</div>\n ${this.renderView()}\n </div>\n `;\n }\n\n private renderToolbar(): TemplateResult {\n return html`\n <div part=\"toolbar\" class=\"calendar__toolbar\" role=\"toolbar\" aria-label=\"Calendar controls\">\n <div class=\"calendar__toolbar-nav\" role=\"group\" aria-label=\"Navigation\">\n <button\n class=\"calendar__btn\"\n @click=${this.prev}\n aria-label=\"Previous period\"\n >‹</button>\n <button\n class=\"calendar__btn\"\n @click=${this.next}\n aria-label=\"Next period\"\n >›</button>\n <button\n class=\"calendar__btn\"\n @click=${this.today}\n >Today</button>\n </div>\n <span part=\"title\" class=\"calendar__toolbar-title\" aria-live=\"polite\" role=\"heading\" aria-level=\"2\">${this.getTitle()}</span>\n <div class=\"calendar__toolbar-views\" role=\"group\" aria-label=\"View options\">\n ${this.renderViewButton('dayGridMonth', 'Month')}\n ${this.renderViewButton('timeGridWeek', 'Week')}\n ${this.renderViewButton('timeGridDay', 'Day')}\n ${this.renderViewButton('listWeek', 'List')}\n </div>\n </div>\n `;\n }\n\n private renderViewButton(view: CalendarView, label: string): TemplateResult {\n return html`\n <button\n class=${classMap({\n calendar__btn: true,\n 'calendar__btn--active': this.view === view\n })}\n @click=${() => this.changeView(view)}\n aria-pressed=${this.view === view ? 'true' : 'false'}\n >${label}</button>\n `;\n }\n\n private renderView(): TemplateResult | typeof nothing {\n switch (this.view) {\n case 'dayGridMonth':\n return this.renderMonthGrid();\n case 'timeGridWeek':\n case 'timeGridDay':\n return this.renderTimeGrid(this.getVisibleDays());\n case 'resourceTimeGridDay':\n case 'resourceTimeGridWeek':\n return this.renderResourceTimeGrid(this.getVisibleDays());\n case 'resourceTimeline':\n return this.renderResourceTimeline();\n case 'listWeek':\n return this.renderListView();\n default:\n return this.renderTimeGrid(this.getVisibleDays());\n }\n }\n\n // ---- Time grid view ----\n\n private renderTimeGrid(days: Date[]): TemplateResult {\n const slotCount = this.getSlotCount();\n const hourLabels = this.getHourLabels();\n const loc = this.getResolvedLocale();\n const positioned = layoutTimeGridEvents(this.events, days, this.slotDuration, this.slotMinTime, this.slotMaxTime);\n const allDayPositioned = this.allDaySlot ? layoutAllDayEvents(this.events, days) : [];\n const nowPos = this.getNowPosition();\n const nowDayIndex = this.getNowDayIndex(days);\n const dayCount = days.length;\n\n return html`\n <div class=\"calendar__scroll-container\">\n <div class=\"calendar__sticky-header\">\n <!-- Day headers -->\n <div part=\"header\" class=\"calendar__header\" role=\"row\" style=\"--_day-count: ${dayCount}\">\n <div class=\"calendar__gutter-header\" role=\"presentation\"></div>\n ${days.map(\n d => html`\n <div\n class=${classMap({\n calendar__day_header: true,\n 'calendar__day-header': true,\n 'calendar__day-header--today': isToday(d)\n })}\n role=\"columnheader\"\n aria-label=${new Intl.DateTimeFormat(loc, { weekday: 'long', month: 'long', day: 'numeric' }).format(d)}\n >\n <span>${new Intl.DateTimeFormat(loc, { weekday: 'short' }).format(d)}</span>\n <span class=${classMap({\n calendar__day_number: true,\n 'calendar__day-number': true,\n 'calendar__day-number--today': isToday(d)\n })}>${d.getDate()}</span>\n </div>\n `\n )}\n </div>\n\n <!-- All-day row -->\n ${this.allDaySlot\n ? html`\n <div part=\"allday\" class=\"calendar__allday\" style=\"--_day-count: ${dayCount}\">\n <div class=\"calendar__allday-label\">all-day</div>\n ${days.map(\n (_d, i) => html`\n <div class=\"calendar__allday-cell\">\n ${allDayPositioned\n .filter(e => i >= e.startCol - 1 && i < e.endCol - 1)\n .filter(e => e.startCol - 1 === i) // Only render at the start column\n .map(\n e => html`\n <div\n class=\"calendar__allday-event\"\n part=\"event\"\n role=\"button\"\n tabindex=\"0\"\n data-event-id=${e.event.id}\n aria-label=\"${e.event.title}\"\n style=${styleMap({\n ...(e.event.backgroundColor ? { '--_event-bg': e.event.backgroundColor } : {}),\n ...(e.event.textColor ? { '--_event-color': e.event.textColor } : {})\n })}\n @click=${(ev: MouseEvent) => this.handleEventClick(e.event, ev.currentTarget as HTMLElement, ev)}\n @keydown=${(ev: KeyboardEvent) => this.handleEventKeydown(e.event, ev.currentTarget as HTMLElement, ev)}\n >${e.event.title}</div>\n `\n )}\n </div>\n `\n )}\n </div>\n `\n : nothing}\n </div>\n\n <!-- Time grid body -->\n <div class=\"calendar__body\">\n <!-- Gutter with hour labels -->\n <div class=\"calendar__gutter\">\n ${hourLabels.map(\n label =>\n label.isHour\n ? html`<div class=\"calendar__hour-label\"><span class=\"calendar__hour-full\">${formatTime(label.time, loc)}</span><span class=\"calendar__hour-short\">${formatTimeShort(label.time, loc)}</span></div>`\n : html`<div class=\"calendar__hour-label\"></div>`\n )}\n </div>\n\n <!-- Grid area -->\n <div\n part=\"grid\"\n class=\"calendar__grid\"\n role=\"grid\"\n style=\"--_slot-count: ${slotCount}; --_day-count: ${dayCount}\"\n >\n <!-- Slot lines -->\n ${hourLabels.map(\n (label, i) => html`\n <div\n class=${classMap({\n 'calendar__slot-line': true,\n 'calendar__slot-line--hour': label.isHour,\n 'calendar__slot-line--half': !label.isHour\n })}\n style=\"grid-row: ${i + 1}; grid-column: 1 / -1\"\n ></div>\n `\n )}\n\n <!-- Day dividers -->\n ${days.map(\n (_d, i) =>\n i > 0\n ? html`<div\n class=\"calendar__day-divider\"\n style=\"left: ${(i / dayCount) * 100}%\"\n ></div>`\n : nothing\n )}\n\n <!-- Today column highlight -->\n ${nowDayIndex >= 0\n ? html`<div\n class=\"calendar__today-col\"\n style=\"left: ${(nowDayIndex / dayCount) * 100}%; width: ${100 / dayCount}%\"\n ></div>`\n : nothing}\n\n <!-- Positioned events -->\n ${positioned.map(pos => this.renderTimeGridEvent(pos, dayCount))}\n\n <!-- Now indicator -->\n ${nowPos !== null && nowDayIndex >= 0\n ? html`<div\n class=\"calendar__now-indicator\"\n style=\"top: ${nowPos}%; left: ${(nowDayIndex / dayCount) * 100}%; width: ${100 / dayCount}%\"\n ></div>`\n : nothing}\n\n <!-- Drag selection -->\n ${this.dragSelection\n ? (() => {\n const fromSlot = Math.min(this.dragSelection.startSlot, this.dragSelection.endSlot);\n const toSlot = Math.max(this.dragSelection.startSlot, this.dragSelection.endSlot);\n const di = this.dragSelection.dayIndex;\n const sc = this.getSlotCount();\n const colW = 100 / dayCount;\n return html`<div\n class=\"calendar__drag-selection\"\n style=\"\n top: ${(fromSlot / sc) * 100}%;\n height: ${((toSlot - fromSlot + 1) / sc) * 100}%;\n left: ${di * colW}%;\n width: ${colW}%;\n \"\n ></div>`;\n })()\n : nothing}\n </div>\n </div>\n </div>\n `;\n }\n\n private renderTimeGridEvent(pos: PositionedEvent, dayCount: number): TemplateResult {\n const loc = this.getResolvedLocale();\n const start = toDate(pos.event.start);\n const end = toDate(pos.event.end);\n const timeText = `${formatTime(start, loc)} \\u2013 ${formatTime(end, loc)}`;\n\n // Calculate positioning \u2014 use colSpan to expand into empty neighbor columns\n const colWidthPct = 100 / dayCount;\n const singleColPct = colWidthPct / pos.totalColumns;\n const eventWidthPct = singleColPct * (pos.colSpan ?? 1);\n const leftPct = pos.dayIndex * colWidthPct + pos.column * singleColPct;\n\n // Small inset to prevent overlap visual issues\n const insetPx = pos.totalColumns > 1 ? 1 : 0;\n\n return html`\n <div\n class=\"calendar__event ${pos.event.classNames?.join(' ') ?? ''}\"\n part=\"event\"\n role=\"button\"\n tabindex=\"0\"\n data-event-id=${pos.event.id}\n aria-label=\"${pos.event.title}, ${timeText}\"\n style=${styleMap({\n position: 'absolute',\n top: `${((pos.startRow - 1) / this.getSlotCount()) * 100}%`,\n height: `${((pos.endRow - pos.startRow) / this.getSlotCount()) * 100}%`,\n left: `calc(${leftPct}% + ${insetPx}px)`,\n width: `calc(${eventWidthPct}% - ${insetPx * 2}px)`,\n ...(pos.event.backgroundColor ? { '--_event-bg': pos.event.backgroundColor } : {}),\n ...(pos.event.textColor ? { '--_event-color': pos.event.textColor } : {})\n })}\n @click=${(e: MouseEvent) => this.handleEventClick(pos.event, e.currentTarget as HTMLElement, e)}\n @keydown=${(e: KeyboardEvent) => this.handleEventKeydown(pos.event, e.currentTarget as HTMLElement, e)}\n ${this.editable ? this.refEventDrag(pos.event) : nothing}\n >\n ${this.eventContent\n ? this.eventContent(pos.event)\n : html`<div class=\"calendar__event-title\">${pos.event.title}</div>\n <div class=\"calendar__event-time\">${timeText}</div>`}\n ${this.editable && pos.event.editable !== false\n ? html`<div class=\"calendar__event-resize\" aria-hidden=\"true\"></div>`\n : nothing}\n </div>\n `;\n }\n\n /** Returns a ref callback that sets up drag on the event element */\n private refEventDrag(event: CalendarEvent): typeof nothing {\n // We use a microtask to set up drag after the element is in the DOM\n queueMicrotask(() => {\n const el = this.shadowRoot?.querySelector<HTMLElement>(\n `.calendar__event[data-event-id=\"${event.id}\"]`\n );\n if (el) {\n this.setupEventDrag(el, event);\n }\n });\n return nothing;\n }\n\n // ---- Month grid view ----\n\n private renderMonthGrid(): TemplateResult {\n const grid = getMonthGrid(\n this.currentDate.getFullYear(),\n this.currentDate.getMonth(),\n this.firstDay\n );\n const weekdayNames = getWeekdayNames(this.firstDay, this.getResolvedLocale());\n\n return html`\n <div class=\"calendar__month-grid\">\n ${weekdayNames.map(\n name => html`<div class=\"calendar__month-weekday\">${name}</div>`\n )}\n ${grid.map(week =>\n week.map(cell => this.renderMonthCell(cell))\n )}\n </div>\n `;\n }\n\n private renderMonthCell(cell: DayCell): TemplateResult {\n const { visible, overflow } = layoutMonthEvents(this.events, cell.date, this.dayMaxEvents);\n const loc = this.getResolvedLocale();\n\n return html`\n <div\n class=${classMap({\n 'calendar__month-cell': true,\n 'calendar__month-cell--outside': !cell.isCurrentMonth,\n 'calendar__month-cell--today': cell.isToday\n })}\n role=\"gridcell\"\n aria-label=${new Intl.DateTimeFormat(loc, { month: 'long', day: 'numeric', year: 'numeric' }).format(cell.date)}\n >\n <div class=${classMap({\n 'calendar__month-date': true,\n 'calendar__month-date--today': cell.isToday,\n 'calendar__month-date--outside': !cell.isCurrentMonth\n })}>${cell.date.getDate()}</div>\n ${visible.map(\n me => html`\n <div\n class=\"calendar__month-event\"\n part=\"event\"\n role=\"button\"\n tabindex=\"0\"\n data-event-id=${me.event.id}\n aria-label=\"${me.event.title}\"\n style=${styleMap({\n ...(me.event.backgroundColor ? { '--_event-bg': me.event.backgroundColor } : {}),\n ...(me.event.textColor ? { '--_event-color': me.event.textColor } : {})\n })}\n @click=${(e: MouseEvent) => this.handleEventClick(me.event, e.currentTarget as HTMLElement, e)}\n @keydown=${(e: KeyboardEvent) => this.handleEventKeydown(me.event, e.currentTarget as HTMLElement, e)}\n >${me.event.allDay ? me.event.title : `${formatTime(toDate(me.event.start), loc)} ${me.event.title}`}</div>\n `\n )}\n ${overflow > 0\n ? html`<div class=\"calendar__month-overflow\">+${overflow} more</div>`\n : nothing}\n </div>\n `;\n }\n\n // ---- Resource time grid view ----\n\n private renderResourceTimeGrid(days: Date[]): TemplateResult {\n const slotCount = this.getSlotCount();\n const hourLabels = this.getHourLabels();\n const loc = this.getResolvedLocale();\n const resources = this.resources;\n\n if (resources.length === 0) {\n return html`<div class=\"calendar__empty\">No resources defined</div>`;\n }\n\n return html`\n <div class=\"calendar__scroll-container\">\n <div class=\"calendar__sticky-header\">\n <!-- Resource headers -->\n <div class=\"calendar__header\" role=\"row\" style=\"--_day-count: ${resources.length * days.length}\">\n <div class=\"calendar__gutter-header\" role=\"presentation\"></div>\n ${resources.map(\n resource => html`\n ${days.map(\n d => html`\n <div class=\"calendar__resource-header\" role=\"columnheader\">\n <div>${resource.title}</div>\n ${days.length > 1\n ? html`<div style=\"font-size: var(--mz-font-size-2xs)\">${formatDayHeader(d, loc)}</div>`\n : nothing}\n </div>\n `\n )}\n `\n )}\n </div>\n </div>\n\n <div class=\"calendar__body\">\n <div class=\"calendar__gutter\">\n ${hourLabels.map(\n label =>\n label.isHour\n ? html`<div class=\"calendar__hour-label\"><span class=\"calendar__hour-full\">${formatTime(label.time, loc)}</span><span class=\"calendar__hour-short\">${formatTimeShort(label.time, loc)}</span></div>`\n : html`<div class=\"calendar__hour-label\"></div>`\n )}\n </div>\n <div\n class=\"calendar__grid\"\n role=\"grid\"\n style=\"--_slot-count: ${slotCount}; --_day-count: ${resources.length * days.length}\"\n >\n <!-- Slot lines -->\n ${hourLabels.map(\n (label, i) => html`\n <div\n class=${classMap({\n 'calendar__slot-line': true,\n 'calendar__slot-line--hour': label.isHour,\n 'calendar__slot-line--half': !label.isHour\n })}\n style=\"grid-row: ${i + 1}; grid-column: 1 / -1\"\n ></div>\n `\n )}\n\n <!-- Events per resource -->\n ${resources.flatMap((resource, ri) => {\n const resourceEvents = this.events.filter(e => e.resourceId === resource.id);\n const positioned = layoutTimeGridEvents(\n resourceEvents, days, this.slotDuration, this.slotMinTime, this.slotMaxTime\n );\n return positioned.map(pos => {\n const totalDayCols = resources.length * days.length;\n const colIndex = ri * days.length + pos.dayIndex;\n return this.renderResourceTimeGridEvent(pos, colIndex, totalDayCols);\n });\n })}\n </div>\n </div>\n </div>\n `;\n }\n\n private renderResourceTimeGridEvent(\n pos: PositionedEvent,\n colIndex: number,\n totalCols: number\n ): TemplateResult {\n const loc = this.getResolvedLocale();\n const start = toDate(pos.event.start);\n const end = toDate(pos.event.end);\n const timeText = `${formatTime(start, loc)} \\u2013 ${formatTime(end, loc)}`;\n\n const colWidthPct = 100 / totalCols;\n const leftPct = colIndex * colWidthPct;\n\n return html`\n <div\n class=\"calendar__event\"\n part=\"event\"\n role=\"button\"\n tabindex=\"0\"\n data-event-id=${pos.event.id}\n aria-label=\"${pos.event.title}, ${timeText}\"\n style=${styleMap({\n position: 'absolute',\n top: `calc(${((pos.startRow - 1) / this.getSlotCount()) * 100}%)`,\n height: `calc(${((pos.endRow - pos.startRow) / this.getSlotCount()) * 100}%)`,\n left: `${leftPct}%`,\n width: `${colWidthPct}%`,\n ...(pos.event.backgroundColor ? { '--_event-bg': pos.event.backgroundColor } : {}),\n ...(pos.event.textColor ? { '--_event-color': pos.event.textColor } : {})\n })}\n @click=${(e: MouseEvent) => this.handleEventClick(pos.event, e.currentTarget as HTMLElement, e)}\n @keydown=${(e: KeyboardEvent) => this.handleEventKeydown(pos.event, e.currentTarget as HTMLElement, e)}\n >\n ${this.eventContent\n ? this.eventContent(pos.event)\n : html`<div class=\"calendar__event-title\">${pos.event.title}</div>\n <div class=\"calendar__event-time\">${timeText}</div>`}\n </div>\n `;\n }\n\n // ---- Resource timeline view ----\n\n private renderResourceTimeline(): TemplateResult {\n const slotCount = this.getSlotCount();\n const hourLabels = this.getHourLabels();\n const loc = this.getResolvedLocale();\n const resources = this.resources;\n\n if (resources.length === 0) {\n return html`<div class=\"calendar__empty\">No resources defined</div>`;\n }\n\n return html`\n <!-- Time axis header -->\n <div class=\"calendar__header\" role=\"row\" style=\"--_day-count: ${slotCount}\">\n <div class=\"calendar__gutter-header\" role=\"presentation\" style=\"min-width: 8rem\"></div>\n ${hourLabels.map(\n label => html`\n <div class=\"calendar__day-header\" role=\"columnheader\" style=\"font-size: var(--mz-font-size-2xs)\">\n ${label.isHour ? formatTime(label.time, loc) : ''}\n </div>\n `\n )}\n </div>\n\n <!-- Resource rows -->\n ${resources.map(resource => {\n const resourceEvents = this.events.filter(\n e => e.resourceId === resource.id\n );\n return html`\n <div style=\"display: grid; grid-template-columns: 8rem 1fr\">\n <div class=\"calendar__timeline-resource-label\">${resource.title}</div>\n <div class=\"calendar__timeline-row\" style=\"--_slot-count: ${slotCount}\">\n ${hourLabels.map(\n (label, i) => html`\n <div\n class=${classMap({\n 'calendar__timeline-slot': true,\n 'calendar__timeline-slot--hour': label.isHour,\n 'calendar__timeline-slot--half': !label.isHour\n })}\n style=\"grid-column: ${i + 1}\"\n ></div>\n `\n )}\n ${resourceEvents.map(event => {\n if (event.allDay) return nothing;\n const start = toDate(event.start);\n const end = toDate(event.end);\n const { hours: minH, minutes: minM } = parseTimeString(this.slotMinTime);\n const minMinutes = timeToMinutes(minH, minM);\n const startMin = Math.max(dateToMinutes(start) - minMinutes, 0);\n const endMin = dateToMinutes(end) - minMinutes;\n const startCol = minutesToGridRow(startMin, this.slotDuration);\n const endCol = minutesToGridRow(endMin, this.slotDuration);\n\n return html`\n <div\n class=\"calendar__allday-event\"\n part=\"event\"\n role=\"button\"\n tabindex=\"0\"\n data-event-id=${event.id}\n aria-label=\"${event.title}\"\n style=${styleMap({\n position: 'absolute',\n left: `${((startCol - 1) / slotCount) * 100}%`,\n width: `${((endCol - startCol) / slotCount) * 100}%`,\n top: '2px',\n bottom: '2px',\n ...(event.backgroundColor ? { '--_event-bg': event.backgroundColor } : {}),\n ...(event.textColor ? { '--_event-color': event.textColor } : {})\n })}\n @click=${(e: MouseEvent) => this.handleEventClick(event, e.currentTarget as HTMLElement, e)}\n @keydown=${(e: KeyboardEvent) => this.handleEventKeydown(event, e.currentTarget as HTMLElement, e)}\n >${event.title}</div>\n `;\n })}\n </div>\n </div>\n `;\n })}\n `;\n }\n\n // ---- List view ----\n\n private renderListView(): TemplateResult {\n const days = this.getVisibleDays();\n const loc = this.getResolvedLocale();\n\n const daysWithEvents = days\n .map(day => {\n const dayStart = startOfDay(day);\n const dayEnd = startOfDay(addDays(day, 1));\n const dayEvents = this.events\n .filter(e => {\n const start = toDate(e.start);\n const end = toDate(e.end);\n return start < dayEnd && end > dayStart;\n })\n .sort((a, b) => {\n if (a.allDay && !b.allDay) return -1;\n if (!a.allDay && b.allDay) return 1;\n return toDate(a.start).getTime() - toDate(b.start).getTime();\n });\n return { day, events: dayEvents };\n })\n .filter(d => d.events.length > 0);\n\n if (daysWithEvents.length === 0) {\n return html`<div class=\"calendar__empty\">No events this week</div>`;\n }\n\n return html`\n <div class=\"calendar__list\">\n ${daysWithEvents.map(\n ({ day, events }) => html`\n <div class=\"calendar__list-day\">\n <div class=\"calendar__list-day-header\">\n <span>${new Intl.DateTimeFormat(loc, { weekday: 'long' }).format(day)}</span>\n <span>${new Intl.DateTimeFormat(loc, { month: 'short', day: 'numeric', year: 'numeric' }).format(day)}</span>\n </div>\n ${events.map(\n event => html`\n <div\n class=\"calendar__list-event\"\n part=\"event\"\n role=\"button\"\n tabindex=\"0\"\n data-event-id=${event.id}\n aria-label=\"${event.title}\"\n @click=${(e: MouseEvent) => this.handleEventClick(event, e.currentTarget as HTMLElement, e)}\n @keydown=${(e: KeyboardEvent) => this.handleEventKeydown(event, e.currentTarget as HTMLElement, e)}\n >\n <div\n class=\"calendar__list-event-dot\"\n style=${event.backgroundColor ? `--_event-bg: ${event.backgroundColor}` : ''}\n ></div>\n <div class=\"calendar__list-event-time\">\n ${event.allDay\n ? 'all-day'\n : `${formatTime(toDate(event.start), loc)} \\u2013 ${formatTime(toDate(event.end), loc)}`}\n </div>\n <div class=\"calendar__list-event-title\">${event.title}</div>\n </div>\n `\n )}\n </div>\n `\n )}\n </div>\n `;\n }\n}\n\n// ---- Module-level helpers (not exported) ----\n\nfunction toDate(value: string | Date): Date {\n return value instanceof Date ? value : new Date(value);\n}\n\nfunction dateToMinutes(date: Date): number {\n return timeToMinutes(date.getHours(), date.getMinutes());\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { MzCalendar } from './calendar.component.js';
|
|
2
|
+
export * from './calendar.component.js';
|
|
3
|
+
export * from './calendar.types.js';
|
|
4
|
+
declare global {
|
|
5
|
+
interface HTMLElementTagNameMap {
|
|
6
|
+
'mz-calendar': MzCalendar;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=calendar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../src/calendar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AAIpC,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,aAAa,EAAE,UAAU,CAAC;KAC3B;CACF"}
|
package/dist/calendar.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/calendar.ts"],
|
|
4
|
+
"sourcesContent": ["import { MzCalendar } from './calendar.component.js';\n\nexport * from './calendar.component.js';\nexport * from './calendar.types.js';\n\nMzCalendar.define('mz-calendar');\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'mz-calendar': MzCalendar;\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,kBAAkB;AAE3B,cAAc;AACd,cAAc;AAEd,WAAW,OAAO,aAAa;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calendar.styles.d.ts","sourceRoot":"","sources":["../src/calendar.styles.ts"],"names":[],"mappings":";AAGA,wBAo5BE"}
|